diff --git a/DEPS b/DEPS index 292807f..71b5bee 100644 --- a/DEPS +++ b/DEPS
@@ -220,7 +220,7 @@ # luci-go CIPD package version. # Make sure the revision is uploaded by infra-packagers builder. # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console - 'luci_go': 'git_revision:93b14d0f421647ad3bebf0ab4261c38f78bd1a8d', + 'luci_go': 'git_revision:29b908616bc920e58bf384d1e47b91b6cf9188b8', # This can be overridden, e.g. with custom_vars, to build clang from HEAD # instead of downloading the prebuilt pinned revision. @@ -269,23 +269,23 @@ # 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': '69fecd6c2d852abeaebf8e6b479b45d2eaf47c46', + 'skia_revision': '3c34161973a2396203ab832872ea0cd97177f332', # 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': '1a8f4cab47232e7861928945eeee1c40fe7f7c08', + 'v8_revision': '18ae8ecba33cb0900d3961802d6392829eaef916', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': 'e56f227d676e3e7b51a971a1dc35d02c16c4db44', + 'angle_revision': '48b1f07b0fcb14d78deb4e5fb98bc905a4df0aa3', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': 'f1c2c0b0728152d7ca24472e696e07e957e6d09a', + 'swiftshader_revision': '4011ab35f3d875173cc842ea098a3ba2118b6d3a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'a607dd50d24e54eef404195cf49db0d56985a680', + 'pdfium_revision': 'ec0e07b8418353116a05d95938e4391fbd10da92', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. @@ -296,7 +296,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:8.20220513.1.1', + 'fuchsia_version': 'version:8.20220515.3.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -328,7 +328,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling HarfBuzz # and whatever else without interference from each other. - 'harfbuzz_revision': '6454cec085ba51cefcd12b1f8027bc4a647347d5', + 'harfbuzz_revision': 'acdab17ed3507bc9524cb57bef703a983e1031cf', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Emoji Segmenter # and whatever else without interference from each other. @@ -340,7 +340,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '925e601986fb75043a6351e9da4d9aecfa77be42', + 'catapult_revision': '25ac622b73ad24460cb360b1d6793965572139a0', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -348,7 +348,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': '977cc58cb5654a2b68142ef8ac1b3f9ac2822694', + 'devtools_frontend_revision': '325f21804f21c3826aee2dec0bfe2e9f4f26f270', # 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. @@ -384,7 +384,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': 'e221ddd30e782d7ce4ab8774516bf42f5778c1e0', + 'dawn_revision': 'e831fb61046b648895a5d429a6dbca76b7843c3f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -428,11 +428,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libcxxabi_revision': 'f8b9fcc8e27d2ebb27e74378613bd7109737f15a', + 'libcxxabi_revision': 'e112e5ec5b5a036c85e4a375290ca15620243853', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libunwind_revision': 'cd5b90c8ef0bd5ec1b9574596db253f83a3cf49e', + 'libunwind_revision': 'cf88e03ee09984289ca22d8e14a796f7870fe762', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -745,7 +745,7 @@ }, 'src/ios/third_party/earl_grey2/src': { - 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + 'd28ba1132c96e3267db78ceef59c07486fad3d30', + 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '8eba108ba2d03c659f5e7003620def76bf784dc5', 'condition': 'checkout_ios', }, @@ -765,7 +765,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '505c27cd9f6b33acbe54b5c40f291866e53a47f1', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '71f0458ca600039429ce6309ffa10c02e04b7ea8', 'condition': 'checkout_ios', }, @@ -835,7 +835,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'KZbOWyGl41EX1PlJ5EkkQ7uXgfbDU5_jgwuBfzWAU-EC', + 'version': 'Dc4RjEwwwbHzwZvVdiZSLMjtTkiPMJuJoCHvI80i1FgC', }, ], 'dep_type': 'cipd', @@ -846,7 +846,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'VeBGWNvPjjvuUBd78PYxm9BBVGYOLdVeAAdaBscZAdAC', + 'version': '0SVWfoSqHXOXyErbTHPIqQtEfaoKEVtRBZoWRxYb4wsC', }, ], 'dep_type': 'cipd', @@ -857,7 +857,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': 'K6xgV4tqvjNfCU66sz6WMgX80oGWTUZwRkp9OH5j_UIC', + 'version': 'UcnmLSHkQCLJJGPGTleOoJgQ0z5FDqFyWzYnr1A24lgC', }, ], 'dep_type': 'cipd', @@ -914,7 +914,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'mt-ZF-6_HFdvpVXuaVQwcn_VAafyKXPqDwTExLwF_iwC', + 'version': 'GFFcbQiZc4RpAtuTiDatE9n-TscfDIeynLmz84iC0yUC', }, ], 'condition': 'checkout_android', @@ -1128,12 +1128,12 @@ # For Linux and Chromium OS. 'src/third_party/cros_system_api': { - 'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '5ea193b9a3e6c3e9898f46527d49eb6c148551c6', + 'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + 'd79486f913c4d301047e2f6e8051538c94066ec9', 'condition': 'checkout_linux', }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'aa7d7e45cd980d13d026c518fafcb4ce7ebd83a1', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'f8300fba9d01dffcd69a5425746455b82a5af56b', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1530,7 +1530,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'd09ebb9e2ba6d6d26640dfb9d19fdf9412d233c2', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '378c48e919baf08561d11f8261629bf007779131', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1666,7 +1666,7 @@ 'condition': 'checkout_android', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@c6a60f3cc711e0758ebb58d8d1db9f97b5973ccc', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@131de3fd9ec7dca8b5fca3aed5b8fe198560c578', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907', @@ -1702,10 +1702,10 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'cf04aebdf9b53bb2853f22a81465688daf879ec6', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '524b5e7b2c40cce9b8a38ca41fead8495436770a', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '9f4227be09ee268c508e9d5841c4f76772036264', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '81d65fcf7dbb750af13efb2ef8addb2322a337cb', + Var('webrtc_git') + '/src.git' + '@' + '0e2221eb2f02ed950f4fd9c7fea40b382ea0a0c8', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1735,7 +1735,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/linux-amd64', - 'version': 'iqtz2prn9CUv6A8KCcxJzadmPEDLY1FPP-b2YqIFQ1cC', + 'version': '0uXUbBwbtBy2u3GgA06bUzfb9y2dcexN9_F8ENIq1Q4C', }, ], 'dep_type': 'cipd', @@ -1745,7 +1745,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/windows-amd64', - 'version': 'EbVQXa1u0hbZ8pxb0Il6Rbc1ErHpIN_-kMVOzBXMQyoC', + 'version': 'l935F-47LSCA4iAc7FesGig8bpxMc5CaYheeyOc8LB4C', }, ], 'dep_type': 'cipd', @@ -1756,7 +1756,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/mac-amd64', - 'version': 'Y4l14LBqCsT9EhffPIOtso9VSpwqQE9WccjZdDBZmLoC', + 'version': '81jsmJoHpyxpJgyeTsCH_yasXac9eXXRvGS_YABKrsUC', }, ], 'dep_type': 'cipd', @@ -1767,7 +1767,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/mac-arm64', - 'version': 'INEqc8JI_mtww_X0ShOlDkF3S8OG4tjF4Nkei0K7ci8C', + 'version': 'VQHtaeoSlRCKe0xGCvdGxu6zvLoFkDyBtqZoTKoygDcC', }, ], 'dep_type': 'cipd', @@ -1778,7 +1778,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@f3e58c2b14b74fd627dd23f2b2c3ec6a6a383c59', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@4d07805fd87182078aeac66dc0d834029c8e09e8', 'condition': 'checkout_src_internal', }, @@ -1808,7 +1808,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'cjBBsVUr_AOxm_CDI3o3gZyjz1XBop-6p50yyVScBr4C', + 'version': '5sjFTaHL1L8pY84jHJfwVghpS8HvJc3sgzgm-9RH4D8C', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1819,7 +1819,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'RGIcLrebzU-C8bZd8lqHsASvZE5SOZ0ziavz4c0LBosC', + 'version': 'WteMeuSUMJqpnMC5LMl5BWJGfjosmnhFQbIqa7QKKhkC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1830,7 +1830,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': '56EVGJb8JCXOWpx1QlTt7wBy2d01Q0pWrFNxALDTg2QC', + 'version': 'hWLAzTFAAy8kaLwWWJsdkmHe6Uf7AF_QT32BJSD6T_IC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/OWNERS b/OWNERS index 3c1e8a2..3510d60 100644 --- a/OWNERS +++ b/OWNERS
@@ -26,7 +26,7 @@ per-file PRESUBMIT*.py=agrieve@chromium.org # For .pydeps changes per-file PRESUBMIT*.py=brucedawson@chromium.org per-file PRESUBMIT*.py=dcheng@chromium.org -per-file PRESUBMIT*.py=jochen@chromium.org +per-file PRESUBMIT*.py=battre@chromium.org per-file PRESUBMIT*.py=wnwen@chromium.org # For .pydeps changes per-file README.md=* per-file WATCHLISTS=*
diff --git a/PRESUBMIT.py b/PRESUBMIT.py index b82eef6..f0e4622a 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py
@@ -4,7 +4,7 @@ """Top-level presubmit script for Chromium. -See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts +See https://www.chromium.org/developers/how-tos/depottools/presubmit-scripts/ for more details about the presubmit API built into depot_tools. """ @@ -2768,6 +2768,12 @@ Note: if the presubmit is running for commit rather than for upload, this only returns True if a security reviewer has also approved the CL. """ + # Owners-Override should bypass all additional OWNERS enforcement checks. + # A CR+1 vote will still be required to land this change. + if (input_api.change.issue and input_api.gerrit.IsOwnersOverrideApproved( + input_api.change.issue)): + return True + owner_email, reviewers = ( input_api.canned_checks.GetCodereviewOwnerAndReviewers( input_api, @@ -2843,7 +2849,7 @@ def AddPatternToCheck(file, pattern): owners_file = input_api.os_path.join( - input_api.os_path.dirname(file.AbsoluteLocalPath()), 'OWNERS') + input_api.os_path.dirname(file.LocalPath()), 'OWNERS') if owners_file not in to_check: to_check[owners_file] = {} if pattern not in to_check[owners_file]: @@ -2952,9 +2958,8 @@ 'third_party/blink/renderer/platform/bindings/*', 'third_party/protobuf/benchmarks/python/*', 'third_party/win_build_output/*', - # Enums used for web metrics, so no security review needed. - 'third_party/blink/public/mojom/use_counter/css_property_id.mojom', - 'third_party/blink/public/mojom/web_feature/web_feature.mojom', + # Enum-only mojoms used for web metrics, so no security review needed. + 'third_party/blink/public/mojom/use_counter/metrics/*', # These files are just used to communicate between class loaders running # in the same process. 'weblayer/browser/java/org/chromium/weblayer_private/interfaces/*', @@ -3024,9 +3029,13 @@ missing_reviewer_errors.extend(fuchsia_results.missing_reviewer_errors) if missing_reviewer_errors: - # Missing reviewers are only a warning at upload time; otherwise, it'd - # be impossible to upload a change. - if input_api.is_committing: + # Missing reviewers are an error unless there's no issue number + # associated with this branch; in that case, the presubmit is being run + # with --all or --files. + # + # Note that upload should never be an error; otherwise, it would be + # impossible to upload changes at all. + if input_api.is_committing and input_api.change.issue: make_presubmit_message = output_api.PresubmitError else: make_presubmit_message = output_api.PresubmitPromptWarning
diff --git a/PRESUBMIT_test.py b/PRESUBMIT_test.py index ca9f2750..9cbd92f 100755 --- a/PRESUBMIT_test.py +++ b/PRESUBMIT_test.py
@@ -2292,6 +2292,14 @@ class _SecurityOwnersTestCase(unittest.TestCase): + def _setupFakeChange(self, input_api): + class FakeGerrit(object): + def IsOwnersOverrideApproved(self, issue): + return False + + input_api.change.issue = 123 + input_api.gerrit = FakeGerrit() + def _injectFakeOwnersClient(self, input_api, owners): class FakeOwnersClient(object): def ListOwners(self, f): @@ -2328,6 +2336,7 @@ mock_input_api.files = [ MockAffectedFile(f'services/goat/public/goat.mojom', ['// Scary contents.'])] + self._setupFakeChange(mock_input_api) self._injectFakeOwnersClient( mock_input_api, ['apple@chromium.org', 'orange@chromium.org']) @@ -2350,6 +2359,7 @@ mock_input_api.files = [ MockAffectedFile(f'services/goat/public/goat.mojom', ['// Scary contents.'])] + self._setupFakeChange(mock_input_api) self._injectFakeOwnersClient( mock_input_api, ['apple@chromium.org', 'orange@chromium.org']) @@ -2372,6 +2382,7 @@ mock_input_api.files = [ MockAffectedFile(f'services/goat/public/goat.mojom', ['// Scary contents.'])] + self._setupFakeChange(mock_input_api) self._injectFakeOwnersClient( mock_input_api, ['apple@chromium.org', 'orange@chromium.org']) @@ -2396,6 +2407,7 @@ mock_input_api.files = [ MockAffectedFile(f'services/goat/public/{filename}', ['// Scary contents.'])] + self._setupFakeChange(mock_input_api) self._injectFakeOwnersClient( mock_input_api, ['apple@chromium.org', 'orange@chromium.org']) @@ -2421,6 +2433,7 @@ mock_input_api.files = [ MockAffectedFile(f'services/goat/public/{filename}', ['// Scary contents.'])] + self._setupFakeChange(mock_input_api) self._injectFakeOwnersClient( mock_input_api, ['apple@chromium.org', 'orange@chromium.org']) @@ -2455,6 +2468,7 @@ '#include "services/goat/public/cpp/manifest.h"', 'const service_manager::Manifest& GetManifest() {}', ])] + self._setupFakeChange(mock_input_api) self._injectFakeOwnersClient(mock_input_api, ['apple@chromium.org', 'orange@chromium.org']) self._injectFakeChangeOwnerAndReviewers( @@ -2497,6 +2511,7 @@ [ 'library test.fidl' ])] + self._setupFakeChange(mock_input_api) self._injectFakeOwnersClient(mock_input_api, ['apple@chromium.org', 'orange@chromium.org']) self._injectFakeChangeOwnerAndReviewers( @@ -2519,6 +2534,7 @@ [ '{ "that is no": "manifest!" }' ])] + self._setupFakeChange(mock_input_api) self._injectFakeOwnersClient(mock_input_api, ['apple@chromium.org', 'orange@chromium.org']) self._injectFakeChangeOwnerAndReviewers( @@ -2541,11 +2557,12 @@ [ '{ "that is no": "manifest!" }' ])] - mock_output_api = MockOutputApi() + self._setupFakeChange(mock_input_api) self._injectFakeOwnersClient(mock_input_api, ['apple@chromium.org', 'orange@chromium.org']) self._injectFakeChangeOwnerAndReviewers( mock_input_api, 'owner@chromium.org', ['banana@chromium.org']) + mock_output_api = MockOutputApi() errors = PRESUBMIT.CheckSecurityOwners( mock_input_api, mock_output_api) self.assertEqual(2, len(errors)) @@ -2639,6 +2656,7 @@ def testChangeOwnersMissing(self): mock_input_api = MockInputApi() + self._setupFakeChange(mock_input_api) self._injectFakeOwnersClient(mock_input_api, ['apple@chromium.org', 'orange@chromium.org']) self._injectFakeChangeOwnerAndReviewers( @@ -2659,6 +2677,7 @@ def testChangeOwnersMissingAtCommit(self): mock_input_api = MockInputApi() + self._setupFakeChange(mock_input_api) self._injectFakeOwnersClient(mock_input_api, ['apple@chromium.org', 'orange@chromium.org']) self._injectFakeChangeOwnerAndReviewers( @@ -2694,6 +2713,7 @@ def testChangeOwnerIsSecurityOwner(self): mock_input_api = MockInputApi() + self._setupFakeChange(mock_input_api) self._injectFakeOwnersClient(mock_input_api, ['apple@chromium.org', 'orange@chromium.org']) self._injectFakeChangeOwnerAndReviewers(
diff --git a/WATCHLISTS b/WATCHLISTS index 4a782a7f..d081d8b 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -169,7 +169,7 @@ '|ash/public/cpp/wallpaper/'\ '|ash/wallpaper/'\ '|ash/webui/personalization_app/'\ - '|chromeos/assistant/'\ + '|chromeos/ash/components/assistant/'\ '|chromeos/services/assistant/'\ '|chromeos/services/libassistant/'\ '|chrome/browser/ash/wallpaper_handlers/'\
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 78f5f7f..5c00114b 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -6,7 +6,7 @@ import("//build/config/chromeos/ui_mode.gni") import("//build/config/features.gni") import("//build/config/ui.gni") -import("//chromeos/assistant/ambient.gni") +import("//chromeos/ash/components/assistant/ambient.gni") import("//chromeos/components/sensors/buildflags.gni") import("//mojo/public/tools/bindings/mojom.gni") import("//testing/test.gni") @@ -2210,6 +2210,7 @@ "//cc", "//cc/debug", "//cc/paint:paint", + "//chromeos/ash/components/assistant:buildflags", "//chromeos/ash/components/dbus/hammerd", "//chromeos/ash/components/dbus/rgbkbd", "//chromeos/ash/components/dbus/rmad", @@ -2217,9 +2218,8 @@ "//chromeos/ash/components/dbus/services", "//chromeos/ash/components/dbus/system_clock", "//chromeos/ash/components/dbus/usb", - "//chromeos/assistant:buildflags", + "//chromeos/ash/components/human_presence", "//chromeos/components/feature_usage", - "//chromeos/components/human_presence", "//chromeos/components/quick_answers/public/cpp:prefs", "//chromeos/components/sensors:buildflags", "//chromeos/components/sensors:sensors", @@ -2994,12 +2994,12 @@ "//build:branding_buildflags", "//cc:test_support", "//chromeos:test_support", + "//chromeos/ash/components/assistant:buildflags", "//chromeos/ash/components/dbus/hammerd", "//chromeos/ash/components/dbus/rgbkbd", "//chromeos/ash/components/dbus/services:test_support", - "//chromeos/assistant:buildflags", + "//chromeos/ash/components/human_presence:human_presence", "//chromeos/components/feature_usage", - "//chromeos/components/human_presence:human_presence", "//chromeos/components/sensors:sensors", "//chromeos/components/sensors:test_support", "//chromeos/components/sensors/mojom",
diff --git a/ash/DEPS b/ash/DEPS index dda52f7..647e680 100644 --- a/ash/DEPS +++ b/ash/DEPS
@@ -58,8 +58,8 @@ # code out of //chromeos into //ash. "-chromeos", # //ash can use chromeos components that sit below it in the dependency tree. + "+chromeos/ash/components/human_presence", "+chromeos/components/feature_usage", - "+chromeos/components/human_presence", "+chromeos/components/quick_answers", "+chromeos/components/sensors", "+chromeos/components/webauthn",
diff --git a/ash/ambient/DEPS b/ash/ambient/DEPS index 7aa6cfe..c6c5694 100644 --- a/ash/ambient/DEPS +++ b/ash/ambient/DEPS
@@ -8,7 +8,7 @@ "+chromeos/assistant/internal/proto/backdrop", ], "ambient_controller.*": [ - "+chromeos/assistant/buildflags.h", + "+chromeos/ash/components/assistant/buildflags.h", ], ".*test.cc": [ "+cc/test",
diff --git a/ash/ambient/OWNERS b/ash/ambient/OWNERS index dd0c97af..574ed11 100644 --- a/ash/ambient/OWNERS +++ b/ash/ambient/OWNERS
@@ -1 +1 @@ -file://chromeos/assistant/OWNERS +file://chromeos/ash/components/assistant/OWNERS
diff --git a/ash/ambient/ambient_controller.cc b/ash/ambient/ambient_controller.cc index 6691d04..97cdfb9b 100644 --- a/ash/ambient/ambient_controller.cc +++ b/ash/ambient/ambient_controller.cc
@@ -43,7 +43,7 @@ #include "base/timer/timer.h" #include "build/buildflag.h" #include "cc/paint/skottie_wrapper.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/dbus/power/power_manager_client.h" #include "chromeos/dbus/power_manager/backlight.pb.h" #include "chromeos/dbus/power_manager/idle.pb.h"
diff --git a/ash/ambient/ambient_controller_unittest.cc b/ash/ambient/ambient_controller_unittest.cc index f2b7265..baca984 100644 --- a/ash/ambient/ambient_controller_unittest.cc +++ b/ash/ambient/ambient_controller_unittest.cc
@@ -26,7 +26,7 @@ #include "base/test/scoped_feature_list.h" #include "base/time/time.h" #include "build/buildflag.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/dbus/power/fake_power_manager_client.h" #include "chromeos/dbus/power/power_manager_client.h" #include "chromeos/dbus/power_manager/power_supply_properties.pb.h"
diff --git a/ash/app_list/views/assistant/DIR_METADATA b/ash/app_list/views/assistant/DIR_METADATA index cfb0c371..5ba0efa 100644 --- a/ash/app_list/views/assistant/DIR_METADATA +++ b/ash/app_list/views/assistant/DIR_METADATA
@@ -1 +1 @@ -mixins: "//chromeos/assistant/COMMON_METADATA" +mixins: "//chromeos/ash/components/assistant/COMMON_METADATA"
diff --git a/ash/app_list/views/assistant/OWNERS b/ash/app_list/views/assistant/OWNERS index dd0c97af..574ed11 100644 --- a/ash/app_list/views/assistant/OWNERS +++ b/ash/app_list/views/assistant/OWNERS
@@ -1 +1 @@ -file://chromeos/assistant/OWNERS +file://chromeos/ash/components/assistant/OWNERS
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index 799c961b..e62d129 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -1844,8 +1844,11 @@ <message name="IDS_ASH_DESKS_TEMPLATES_MAX_SAVED_DESKS_TOOLTIP" desc="The disabled Save Desk for later button tooltip text when maximum number of saved desks has been reached."> Only 6 saved desks allowed. Remove a desk to save a new one. </message> - <message name="IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON" desc="The text of the desks templates button in the overview desks bar."> - Templates + <message name="IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON_LIBRARY" desc="The text of the desks templates button in the overview desks bar when Desk Templates is enabled."> + Library + </message> + <message name="IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON_SAVED_FOR_LATER" desc="The text of the desks templates button in the overview desks bar when Desk Templates is disabled."> + Saved for later </message> <message name="IDS_ASH_DESKS_TEMPLATES_SAVE_DESK_AS_TEMPLATE_BUTTON" desc="The text of the button to save the active desk as a template."> Save desk as a template
diff --git a/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON.png.sha1 b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON.png.sha1 deleted file mode 100644 index 7e4eb06..0000000 --- a/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -feca4c15053b65554d653dba5d1f17fc45129bdd \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON_LIBRARY.png.sha1 b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON_LIBRARY.png.sha1 new file mode 100644 index 0000000..54be99a --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON_LIBRARY.png.sha1
@@ -0,0 +1 @@ +a670acd2c94df92914932a6eea4bf65a7206d0cd \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON_SAVED_FOR_LATER.png.sha1 b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON_SAVED_FOR_LATER.png.sha1 new file mode 100644 index 0000000..a599eb13 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON_SAVED_FOR_LATER.png.sha1
@@ -0,0 +1 @@ +b8b6962fca8a99eb6e1f4ddb4d169e4ad633ef97 \ No newline at end of file
diff --git a/ash/assistant/DIR_METADATA b/ash/assistant/DIR_METADATA index cfb0c371..5ba0efa 100644 --- a/ash/assistant/DIR_METADATA +++ b/ash/assistant/DIR_METADATA
@@ -1 +1 @@ -mixins: "//chromeos/assistant/COMMON_METADATA" +mixins: "//chromeos/ash/components/assistant/COMMON_METADATA"
diff --git a/ash/assistant/OWNERS b/ash/assistant/OWNERS index dd0c97af..574ed11 100644 --- a/ash/assistant/OWNERS +++ b/ash/assistant/OWNERS
@@ -1 +1 @@ -file://chromeos/assistant/OWNERS +file://chromeos/ash/components/assistant/OWNERS
diff --git a/ash/assistant/ui/BUILD.gn b/ash/assistant/ui/BUILD.gn index 39fc65b..bec87982 100644 --- a/ash/assistant/ui/BUILD.gn +++ b/ash/assistant/ui/BUILD.gn
@@ -3,7 +3,7 @@ # found in the LICENSE file. import("//build/config/chromeos/ui_mode.gni") -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") assert(is_chromeos_ash) @@ -94,7 +94,7 @@ "//ash/resources/vector_icons", "//ash/strings", "//base", - "//chromeos/assistant:buildflags", + "//chromeos/ash/components/assistant:buildflags", "//chromeos/services/assistant/public/cpp", "//chromeos/services/assistant/public/mojom", "//chromeos/services/libassistant/public/cpp:structs",
diff --git a/ash/assistant/ui/DEPS b/ash/assistant/ui/DEPS index 15d906f..0af496a 100644 --- a/ash/assistant/ui/DEPS +++ b/ash/assistant/ui/DEPS
@@ -14,7 +14,7 @@ "+build/buildflag.h", "+cc/base", "+cc/paint", - "+chromeos/assistant", + "+chromeos/ash/components/assistant", "+chromeos/constants", "+chromeos/services/assistant/public", "+chromeos/services/libassistant/public/cpp",
diff --git a/ash/assistant/ui/logo_view/DEPS b/ash/assistant/ui/logo_view/DEPS index 0c37a72f..253468d 100644 --- a/ash/assistant/ui/logo_view/DEPS +++ b/ash/assistant/ui/logo_view/DEPS
@@ -1,3 +1,4 @@ include_rules = [ - "+chromeos/assistant", + "+chromeos/ash/components/assistant", + "+chromeos/assistant/internal", ]
diff --git a/ash/assistant/ui/logo_view/logo_view.cc b/ash/assistant/ui/logo_view/logo_view.cc index 1ca8255..01b63ecf 100644 --- a/ash/assistant/ui/logo_view/logo_view.cc +++ b/ash/assistant/ui/logo_view/logo_view.cc
@@ -5,7 +5,7 @@ #include "ash/assistant/ui/logo_view/logo_view.h" #include "build/buildflag.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #include "ash/assistant/ui/logo_view/logo_view_impl.h"
diff --git a/ash/components/arc/mojom/accessibility_helper.mojom b/ash/components/arc/mojom/accessibility_helper.mojom index 6940f183..aa13075 100644 --- a/ash/components/arc/mojom/accessibility_helper.mojom +++ b/ash/components/arc/mojom/accessibility_helper.mojom
@@ -500,6 +500,10 @@ WINDOW_NOT_FOUND, TALKBACK_NOT_INSTALLED, FAILURE, + + // Need to notify users that TalkBack is installed but + // it no longer support ARC++ customization. + NEED_DEPRECATION_CONFIRMATION, }; // Interface for communicating to Android.
diff --git a/ash/components/device_activity/device_activity_client.cc b/ash/components/device_activity/device_activity_client.cc index f797a8c..764cb5b 100644 --- a/ash/components/device_activity/device_activity_client.cc +++ b/ash/components/device_activity/device_activity_client.cc
@@ -391,13 +391,12 @@ std::queue<DeviceActiveUseCase*> pending_use_cases; std::swap(pending_use_cases_, pending_use_cases); - // Calling std::queue.front() on empty queue results in undefined behaviour. - // Safety check queue is not empty before |TransitionToIdle|. - if (pending_use_cases.empty()) { - return; + for (auto* use_case : GetUseCases()) { + // Setting the window identifier resets the object to a fresh state. + use_case->SetWindowIdentifier(absl::nullopt); } - TransitionToIdle(pending_use_cases.front()); + TransitionToIdle(nullptr); } void DeviceActivityClient::TransitionOutOfIdle(
diff --git a/ash/components/device_activity/device_activity_client_unittest.cc b/ash/components/device_activity/device_activity_client_unittest.cc index 2ca1f8b..5eb992f 100644 --- a/ash/components/device_activity/device_activity_client_unittest.cc +++ b/ash/components/device_activity/device_activity_client_unittest.cc
@@ -971,6 +971,130 @@ DeviceActivityClient::State::kIdle); } +TEST_F(DeviceActivityClientTest, + ReportGracefullyAfterNetworkDisconnectsDuringPreviousRun) { + // Device active reporting starts check membership on network connect. + SetWifiNetworkState(shill::kStateOnline); + + DeviceActiveUseCase* first_use_case = + device_activity_client_->GetUseCases().front(); + EXPECT_EQ(device_activity_client_->GetState(), + DeviceActivityClient::State::kCheckingMembershipOprf); + + EXPECT_NE(first_use_case->GetWindowIdentifier(), absl::nullopt); + EXPECT_NE(first_use_case->GetPsmIdentifier(), absl::nullopt); + EXPECT_NE(first_use_case->GetPsmRlweClient(), nullptr); + + // While waiting for OPRF request, simulate network disconnection. + SetWifiNetworkState(shill::kStateOffline); + + // Network offline should cancel all pending use cases, and clear the saved + // state of the attempted pings. + for (auto* use_case : device_activity_client_->GetUseCases()) { + SCOPED_TRACE(testing::Message() + << "PSM use case: " + << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); + + // Currently the use cases stores window id, psm id, and psm rlwe client + // pointer in state. + EXPECT_EQ(use_case->GetWindowIdentifier(), absl::nullopt); + EXPECT_EQ(use_case->GetPsmIdentifier(), absl::nullopt); + EXPECT_EQ(use_case->GetPsmRlweClient(), nullptr); + } + + // Return back to |kIdle| state after a successful check-in. + EXPECT_EQ(device_activity_client_->GetState(), + DeviceActivityClient::State::kIdle); + + // Attempt to report actives gracefully. + // Device active reporting starts check membership on network connect. + SetWifiNetworkState(shill::kStateOnline); + + // |nonmember_test_case| is used to return psm response bodies for + // the OPRF, and Query requests. The query request returns nonmember status. + const psm_rlwe::PrivateMembershipRlweClientRegressionTestData::TestCase& + nonmember_test_case = psm_test_data_->nonmember_test_case; + + for (auto* use_case : device_activity_client_->GetUseCases()) { + SCOPED_TRACE(testing::Message() + << "PSM use case: " + << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); + + EXPECT_EQ(device_activity_client_->GetState(), + DeviceActivityClient::State::kCheckingMembershipOprf); + + SimulateOprfResponse(GetFresnelOprfResponse(nonmember_test_case), + net::HTTP_OK); + SimulateQueryResponse(GetFresnelQueryResponse(nonmember_test_case), + net::HTTP_OK); + SimulateImportResponse(std::string(), net::HTTP_OK); + task_environment_.RunUntilIdle(); + } + + // Return back to |kIdle| state after a successful check-in. + EXPECT_EQ(device_activity_client_->GetState(), + DeviceActivityClient::State::kIdle); + + // Verify that |OnCheckInDone| is called for each use case. + histogram_tester_.ExpectBucketCount( + "Ash.DeviceActivity.MethodCalled", + DeviceActivityClient::DeviceActivityMethod:: + kDeviceActivityClientOnCheckInDone, + 2); + + // Verify the last known ping timestamp is set for each use case. + for (auto* use_case : device_activity_client_->GetUseCases()) { + SCOPED_TRACE(testing::Message() + << "PSM use case: " + << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); + + EXPECT_TRUE(use_case->IsLastKnownPingTimestampSet()); + } + + // Returned back to |kIdle| state after a successful check-in. + EXPECT_EQ(device_activity_client_->GetState(), + DeviceActivityClient::State::kIdle); +} + +TEST_F(DeviceActivityClientTest, NetworkDisconnectionClearsUseCaseState) { + // Device active reporting starts check membership on network connect. + SetWifiNetworkState(shill::kStateOnline); + + // After the network comes online, the client triggers device active reporting + // for the front use case first. It will block on waiting for a response from + // the OPRF network request. At this point the window id, psm id, and psm rlwe + // client should be set by the client for just the front use case. + DeviceActiveUseCase* first_use_case = + device_activity_client_->GetUseCases().front(); + EXPECT_EQ(device_activity_client_->GetState(), + DeviceActivityClient::State::kCheckingMembershipOprf); + + EXPECT_NE(first_use_case->GetWindowIdentifier(), absl::nullopt); + EXPECT_NE(first_use_case->GetPsmIdentifier(), absl::nullopt); + EXPECT_NE(first_use_case->GetPsmRlweClient(), nullptr); + + // While waiting for OPRF response, simulate network disconnection. + SetWifiNetworkState(shill::kStateOffline); + + // Network offline should cancel all pending use cases, and clear the saved + // state of the attempted pings. + for (auto* use_case : device_activity_client_->GetUseCases()) { + SCOPED_TRACE(testing::Message() + << "PSM use case: " + << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); + + // Currently the use cases stores window id, psm id, and psm rlwe client + // pointer in state. + EXPECT_EQ(use_case->GetWindowIdentifier(), absl::nullopt); + EXPECT_EQ(use_case->GetPsmIdentifier(), absl::nullopt); + EXPECT_EQ(use_case->GetPsmRlweClient(), nullptr); + } + + // Return back to |kIdle| state after the network goes offline. + EXPECT_EQ(device_activity_client_->GetState(), + DeviceActivityClient::State::kIdle); +} + TEST_F(DeviceActivityClientTest, CheckInAfterNextUtcMidnight) { // Device active reporting starts check membership on network connect. SetWifiNetworkState(shill::kStateOnline);
diff --git a/ash/components/login/auth/BUILD.gn b/ash/components/login/auth/BUILD.gn index 05d8e2b..3e5ac1cb 100644 --- a/ash/components/login/auth/BUILD.gn +++ b/ash/components/login/auth/BUILD.gn
@@ -28,6 +28,7 @@ "//chromeos/metrics", "//components/account_id", "//components/device_event_log", + "//components/metrics", "//components/password_manager/core/browser:password_hash_data", "//components/prefs", "//components/user_manager",
diff --git a/ash/components/login/auth/DEPS b/ash/components/login/auth/DEPS index bb4f5c5..a14e5f7 100644 --- a/ash/components/login/auth/DEPS +++ b/ash/components/login/auth/DEPS
@@ -14,6 +14,7 @@ "+chromeos/login/login_state", "+components/account_id", "+components/device_event_log", + "+components/metrics", "+components/password_manager", "+components/prefs", "+components/user_manager",
diff --git a/ash/components/login/auth/auth_factors_data.cc b/ash/components/login/auth/auth_factors_data.cc index eb5d3b80..0596bf8 100644 --- a/ash/components/login/auth/auth_factors_data.cc +++ b/ash/components/login/auth/auth_factors_data.cc
@@ -6,6 +6,7 @@ #include "ash/components/cryptohome/cryptohome_parameters.h" #include "ash/components/login/auth/cryptohome_key_constants.h" +#include "base/check_op.h" namespace ash { @@ -41,4 +42,26 @@ return nullptr; } +bool AuthFactorsData::HasPasswordKey(const std::string& label) const { + DCHECK_NE(label, kCryptohomePinLabel); + + for (const cryptohome::KeyDefinition& key_def : keys_) { + if (key_def.type == cryptohome::KeyDefinition::TYPE_PASSWORD && + key_def.label == label) + return true; + } + return false; +} + +const cryptohome::KeyDefinition* AuthFactorsData::FindPinKey() const { + for (const cryptohome::KeyDefinition& key_def : keys_) { + if (key_def.type == cryptohome::KeyDefinition::TYPE_PASSWORD && + key_def.policy.low_entropy_credential) { + DCHECK_EQ(key_def.label, kCryptohomePinLabel); + return &key_def; + } + } + return nullptr; +} + } // namespace ash
diff --git a/ash/components/login/auth/auth_factors_data.h b/ash/components/login/auth/auth_factors_data.h index 42840afc..660ecbb 100644 --- a/ash/components/login/auth/auth_factors_data.h +++ b/ash/components/login/auth/auth_factors_data.h
@@ -37,6 +37,13 @@ // further operations. const cryptohome::KeyDefinition* FindKioskKey() const; + // Checks if password key with given label exists. + bool HasPasswordKey(const std::string& label) const; + + // Returns metadata for the PIN key, so that it can be identified for + // further operations. + const cryptohome::KeyDefinition* FindPinKey() const; + private: std::vector<cryptohome::KeyDefinition> keys_; };
diff --git a/ash/components/login/auth/auth_performer.cc b/ash/components/login/auth/auth_performer.cc index a8d35e7f..222006d9 100644 --- a/ash/components/login/auth/auth_performer.cc +++ b/ash/components/login/auth/auth_performer.cc
@@ -7,6 +7,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/cryptohome_key_constants.h" #include "ash/components/login/auth/cryptohome_parameter_utils.h" #include "ash/components/login/auth/user_context.h" #include "base/bind.h" @@ -107,6 +108,68 @@ AuthenticateUsingKey(std::move(context), std::move(callback)); } +void AuthPerformer::AuthenticateWithPassword( + const std::string& key_label, + const std::string& password, + std::unique_ptr<UserContext> context, + AuthOperationCallback callback) { + DCHECK(!password.empty()) << "Caller should check for empty password"; + DCHECK(!key_label.empty()) << "Caller should provide correct label"; + DCHECK(!context->GetAuthSessionId().empty()) << "Auth session should exist"; + const AuthFactorsData& auth_factors = context->GetAuthFactorsData(); + if (!auth_factors.HasPasswordKey(key_label)) { + LOGIN_LOG(ERROR) << "User does not have password factor labeled " + << key_label; + std::move(callback).Run( + std::move(context), + CryptohomeError{user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND}); + return; + } + + SystemSaltGetter::Get()->GetSystemSalt(base::BindOnce( + &AuthPerformer::HashPasswordAndAuthenticate, weak_factory_.GetWeakPtr(), + password, key_label, std::move(context), std::move(callback))); +} + +void AuthPerformer::HashPasswordAndAuthenticate( + const std::string& key_label, + const std::string& password, + std::unique_ptr<UserContext> context, + AuthOperationCallback callback, + const std::string& system_salt) { + // Use Key until proper migration to AuthFactors API. + chromeos::Key password_key(password); + password_key.SetLabel(key_label); + password_key.Transform(Key::KEY_TYPE_SALTED_SHA256_TOP_HALF, system_salt); + context->SetKey(password_key); + AuthenticateUsingKey(std::move(context), std::move(callback)); +} + +void AuthPerformer::AuthenticateWithPin(const std::string& pin, + const std::string& pin_salt, + std::unique_ptr<UserContext> context, + AuthOperationCallback callback) { + DCHECK(!pin.empty()) << "Caller should check for empty PIN"; + DCHECK(!pin_salt.empty()) << "Client code should provide correct salt"; + DCHECK(!context->GetAuthSessionId().empty()) << "Auth session should exist"; + const AuthFactorsData& auth_factors = context->GetAuthFactorsData(); + const cryptohome::KeyDefinition* key_def = auth_factors.FindPinKey(); + if (!key_def) { + LOGIN_LOG(ERROR) << "User does not have PIN as factor"; + std::move(callback).Run( + std::move(context), + CryptohomeError{user_data_auth::CRYPTOHOME_ERROR_KEY_NOT_FOUND}); + return; + } + // Use Key until proper migration to AuthFactors API. + Key key(pin); + DCHECK_EQ(key_def->label, kCryptohomePinLabel); + key.SetLabel(key_def->label); + + key.Transform(Key::KEY_TYPE_SALTED_PBKDF2_AES256_1234, pin_salt); + AuthenticateUsingKey(std::move(context), std::move(callback)); +} + void AuthPerformer::AuthenticateAsKiosk(std::unique_ptr<UserContext> context, AuthOperationCallback callback) { LOGIN_LOG(EVENT) << "Authenticating as Kiosk";
diff --git a/ash/components/login/auth/auth_performer.h b/ash/components/login/auth/auth_performer.h index 405b4ab..760447c2 100644 --- a/ash/components/login/auth/auth_performer.h +++ b/ash/components/login/auth/auth_performer.h
@@ -61,6 +61,23 @@ void AuthenticateUsingKey(std::unique_ptr<UserContext> context, AuthOperationCallback callback); + // Attempts to authenticate session using plain text password. + // Does not fill any password-related fields in `context`. + // Session will become authenticated upon success. + void AuthenticateWithPassword(const std::string& key_label, + const std::string& password, + std::unique_ptr<UserContext> context, + AuthOperationCallback callback); + + // Attempts to authenticate session using PIN as a factor. + // PINs use custom salt stored in LocalState, this salt should be provided + // by the calling side. + // Session will become authenticated upon success. + void AuthenticateWithPin(const std::string& pin, + const std::string& pin_salt, + std::unique_ptr<UserContext> context, + AuthOperationCallback callback); + // Attempts to authenticate Kiosk session using specific key based on // identity. // Session will become authenticated upon success. @@ -81,6 +98,12 @@ AuthOperationCallback callback, const std::string& system_salt); + void HashPasswordAndAuthenticate(const std::string& key_label, + const std::string& password, + std::unique_ptr<UserContext> context, + AuthOperationCallback callback, + const std::string& system_salt); + void OnAuthenticateAuthSession( std::unique_ptr<UserContext> context, AuthOperationCallback callback,
diff --git a/ash/components/login/auth/login_performer.cc b/ash/components/login/auth/login_performer.cc index 4e81b1c..084490a 100644 --- a/ash/components/login/auth/login_performer.cc +++ b/ash/components/login/auth/login_performer.cc
@@ -15,6 +15,7 @@ #include "chromeos/metrics/login_event_recorder.h" #include "components/account_id/account_id.h" #include "components/prefs/pref_service.h" +#include "components/user_manager/user_manager.h" #include "components/user_manager/user_names.h" #include "google_apis/gaia/gaia_auth_util.h" @@ -57,6 +58,13 @@ // Do not distinguish between offline and online success. metrics_recorder_->OnLoginSuccess(OFFLINE_AND_ONLINE); + const bool is_known_user = user_manager::UserManager::Get()->IsKnownUser( + user_context.GetAccountId()); + metrics_recorder_->OnIsUserNew(is_known_user); + bool is_login_offline = + user_context.GetAuthFlow() == UserContext::AUTH_FLOW_OFFLINE || + user_context.GetAuthFlow() == UserContext::AUTH_FLOW_EASY_UNLOCK; + metrics_recorder_->OnIsLoginOffline(is_login_offline); VLOG(1) << "LoginSuccess hash: " << user_context.GetUserIDHash(); base::SequencedTaskRunnerHandle::Get()->PostTask(
diff --git a/ash/components/login/auth/metrics_recorder.cc b/ash/components/login/auth/metrics_recorder.cc index a66a3ac..48ef1e49 100644 --- a/ash/components/login/auth/metrics_recorder.cc +++ b/ash/components/login/auth/metrics_recorder.cc
@@ -5,9 +5,12 @@ #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 "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics_action.h" +#include "base/strings/strcat.h" namespace ash { namespace { @@ -18,9 +21,40 @@ // Histogram for tracking the reason of login success constexpr char kSuccessReasonHistogramName[] = "Login.SuccessReason"; +// Histogram prefix for tracking login flow +constexpr char kLoginFlowHistogramPrefix[] = "Login.Flow."; + +// Limit definition of "many users" +constexpr int kManyUserLimit = 5; + +// Suffix for grouping total user numbers. Should match suffixes of the +// Login.Flow.{HideUsers, ShowUsers}.* metrics in metadata/ash/histograms.xml +std::string ShowUserPrefix(bool show_users_on_signin) { + return show_users_on_signin ? "ShowUsers." : "HideUsers."; +} + +// Suffix for grouping user counts. Should match suffixes of the +// Login.Flow.{HideUsers, ShowUsers}.* metrics in metadata/ash/histograms.xml +std::string UserCountSuffix(int user_count) { + DCHECK_GE(user_count, 0); + if (user_count <= 0) + return "0"; + + if (user_count == 1) + return "1"; + + if (user_count == 2) + return "2"; + + if (user_count < kManyUserLimit) + return "Few"; + + return "Many"; +} + } // namespace -MetricsRecorder::MetricsRecorder() {} +MetricsRecorder::MetricsRecorder() = default; MetricsRecorder::~MetricsRecorder() = default; @@ -40,4 +74,62 @@ base::RecordAction(base::UserMetricsAction("Login_GuestLoginSuccess")); } +void MetricsRecorder::OnUserCount(bool user_count) { + user_count_ = user_count; + MaybeReportFlowMetrics(); +} + +void MetricsRecorder::OnShowUsersOnSignin(bool show_users_on_signin) { + show_users_on_signin_ = show_users_on_signin; + MaybeReportFlowMetrics(); +} + +void MetricsRecorder::OnEnableEphemeralUsers(bool enable_ephemeral_users) { + enable_ephemeral_users_ = enable_ephemeral_users; + MaybeUpdateUserLoginType(); +} + +void MetricsRecorder::OnIsUserNew(bool is_new_user) { + is_new_user_ = is_new_user; + MaybeUpdateUserLoginType(); +} + +void MetricsRecorder::OnIsLoginOffline(bool is_login_offline) { + is_login_offline_ = is_login_offline; + MaybeUpdateUserLoginType(); +} + +void MetricsRecorder::MaybeUpdateUserLoginType() { + if (!is_login_offline_.has_value() || !is_new_user_.has_value() || + !enable_ephemeral_users_.has_value()) + return; + + if (is_login_offline_.value()) { + user_login_type_ = MetricsRecorder::kOffline; + } else if (!is_new_user_.value()) { + // The rest 3 online login types are with either existing user and new users + user_login_type_ = MetricsRecorder::kOnlineExisting; + } else if (enable_ephemeral_users_.value()) { + // The rest 2 new user login types are either ephemeral or new online users + user_login_type_ = MetricsRecorder::kEphemeral; + } else { + user_login_type_ = MetricsRecorder::kOnlineNew; + } + + MaybeReportFlowMetrics(); +} + +void MetricsRecorder::MaybeReportFlowMetrics() { + if (!show_users_on_signin_.has_value() || !user_count_.has_value() || + !user_login_type_.has_value()) + return; + + std::string prefix = + base::StrCat({kLoginFlowHistogramPrefix, + ShowUserPrefix(show_users_on_signin_.value())}); + std::string suffix = UserCountSuffix(user_count_.value()); + base::UmaHistogramEnumeration(base::StrCat({prefix, suffix}), + user_login_type_.value()); +} + } // namespace ash
diff --git a/ash/components/login/auth/metrics_recorder.h b/ash/components/login/auth/metrics_recorder.h index a13a780..4a87843 100644 --- a/ash/components/login/auth/metrics_recorder.h +++ b/ash/components/login/auth/metrics_recorder.h
@@ -6,6 +6,7 @@ #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" namespace ash { @@ -14,6 +15,16 @@ // centralize the tracking and reporting. class COMPONENT_EXPORT(ASH_LOGIN_AUTH) MetricsRecorder { public: + // Enum used for UMA. Do NOT reorder or remove entry. Don't forget to + // update LoginFlowUserLoginType enum in enums.xml when adding new entries. + enum UserLoginType { + kOnlineNew = 0, + kOnlineExisting = 1, + kOffline = 2, + kEphemeral = 3, + kMaxValue + }; + // Reports various metrics during the login flow. MetricsRecorder(); MetricsRecorder(const MetricsRecorder&) = delete; @@ -30,6 +41,38 @@ // Logs the guest login success action. void OnGuestLoignSuccess(); + + // Set the total number of regular users on the lock screen. + void OnUserCount(bool user_count); + + // Set the policy setting whether to show users on sign in or not. + void OnShowUsersOnSignin(bool show_users_on_signin); + + // Set the policy setting if ephemeral login are enforced. + void OnEnableEphemeralUsers(bool enable_ephemeral_users); + + // Set whether the last successful login is a new user or not. + void OnIsUserNew(bool is_new_user); + + // Set whether the last successful login is offline or not. + void OnIsLoginOffline(bool is_login_offline); + + private: + // Determine the user login type if 3 information are available: + // is_login_offline_, is_new_user_, enable_ephemeral_users_. + void MaybeUpdateUserLoginType(); + + // Report the user login type in association with policy and total user count + // if 3 information are available: user_count_, show_users_on_signin_, + // user_login_type_. + void MaybeReportFlowMetrics(); + + absl::optional<int> user_count_; + absl::optional<bool> show_users_on_signin_; + absl::optional<bool> enable_ephemeral_users_; + absl::optional<bool> is_new_user_; + absl::optional<bool> is_login_offline_; + absl::optional<UserLoginType> user_login_type_; }; } // namespace ash
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index a47d9049..74c7a57 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -997,7 +997,7 @@ // Whether PDF files are opened by default in the ChromeOS media app. const base::Feature kMediaAppHandlesPdf{"MediaAppHandlesPdf", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Feature to continuously log PSI memory pressure data to UMA. const base::Feature kMemoryPressureMetricsDetail{ @@ -1158,6 +1158,10 @@ const base::Feature kPreferConstantFrameRate{"PreferConstantFrameRate", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enables to allocate more video capture buffers. +const base::Feature kMoreVideoCaptureBuffers{"MoreVideoCaptureBuffers", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables a bubble-based launcher in clamshell mode. Changes the suggestions // that appear in the launcher in both clamshell and tablet modes. Removes pages // from the apps grid. This feature was previously named "AppListBubble". @@ -1364,7 +1368,7 @@ // Enables or disables using the system input engine for physical typing in // Chinese. const base::Feature kSystemChinesePhysicalTyping{ - "SystemChinesePhysicalTyping", base::FEATURE_DISABLED_BY_DEFAULT}; + "SystemChinesePhysicalTyping", base::FEATURE_ENABLED_BY_DEFAULT}; // Enables or disables the System Extensions platform. const base::Feature kSystemExtensions{"SystemExtensions",
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index 8a4a99a..c9cfc52d 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -409,6 +409,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kMultilingualTyping; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kNearbyKeepAliveFix; COMPONENT_EXPORT(ASH_CONSTANTS) +extern const base::Feature kMoreVideoCaptureBuffers; +COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kNewLockScreenReauthLayout; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kNightLight; COMPONENT_EXPORT(ASH_CONSTANTS)
diff --git a/ash/public/cpp/ambient/OWNERS b/ash/public/cpp/ambient/OWNERS index dd0c97af..574ed11 100644 --- a/ash/public/cpp/ambient/OWNERS +++ b/ash/public/cpp/ambient/OWNERS
@@ -1 +1 @@ -file://chromeos/assistant/OWNERS +file://chromeos/ash/components/assistant/OWNERS
diff --git a/ash/public/cpp/assistant/DIR_METADATA b/ash/public/cpp/assistant/DIR_METADATA index cfb0c371..5ba0efa 100644 --- a/ash/public/cpp/assistant/DIR_METADATA +++ b/ash/public/cpp/assistant/DIR_METADATA
@@ -1 +1 @@ -mixins: "//chromeos/assistant/COMMON_METADATA" +mixins: "//chromeos/ash/components/assistant/COMMON_METADATA"
diff --git a/ash/public/cpp/assistant/OWNERS b/ash/public/cpp/assistant/OWNERS index dd0c97af..574ed11 100644 --- a/ash/public/cpp/assistant/OWNERS +++ b/ash/public/cpp/assistant/OWNERS
@@ -1 +1 @@ -file://chromeos/assistant/OWNERS +file://chromeos/ash/components/assistant/OWNERS
diff --git a/ash/quick_pair/common/device.cc b/ash/quick_pair/common/device.cc index 3b3d325c..6a73816 100644 --- a/ash/quick_pair/common/device.cc +++ b/ash/quick_pair/common/device.cc
@@ -57,6 +57,9 @@ const std::vector<uint8_t>& data) { auto result = additional_data_.emplace(type, data); + if (type == AdditionalDataType::kFastPairVersion && data[0] == 1) + set_classic_address(ble_address); + if (!result.second) { result.first->second = data; }
diff --git a/ash/quick_pair/common/device_unittest.cc b/ash/quick_pair/common/device_unittest.cc index f3bceba..302c959 100644 --- a/ash/quick_pair/common/device_unittest.cc +++ b/ash/quick_pair/common/device_unittest.cc
@@ -44,5 +44,12 @@ EXPECT_EQ(additional_data.value(), more_data); } +TEST_F(DeviceTest, SetClassicAddressForV1Devices) { + // Test that overriding works. + std::vector<uint8_t> more_data = {1}; + device_->SetAdditionalData(AdditionalDataType::kFastPairVersion, more_data); + + EXPECT_EQ(device_->classic_address(), device_->ble_address); +} } // namespace quick_pair } // namespace ash
diff --git a/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc b/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc index f0419f2d..871308ba9 100644 --- a/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc +++ b/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc
@@ -50,9 +50,9 @@ "Bluetooth.ChromeOS.FastPair.EngagementFunnel.Steps." "SubsequentPairingProtocol"; const char kTotalUxPairTimeInitialMetric[] = - "Bluetooth.ChromeOS.FastPair.TotalUxPairTime.InitialPairingProtocol"; + "Bluetooth.ChromeOS.FastPair.TotalUxPairTime.InitialPairingProtocol2"; const char kTotalUxPairTimeSubsequentMetric[] = - "Bluetooth.ChromeOS.FastPair.TotalUxPairTime.SubsequentPairingProtocol"; + "Bluetooth.ChromeOS.FastPair.TotalUxPairTime.SubsequentPairingProtocol2"; const char kRetroactiveEngagementFlowMetric[] = "Bluetooth.ChromeOS.FastPair.RetroactiveEngagementFunnel.Steps"; const char kPairingMethodMetric[] = "Bluetooth.ChromeOS.FastPair.PairingMethod"; @@ -211,13 +211,16 @@ base::TimeDelta total_pair_time) { switch (device.protocol) { case Protocol::kFastPairInitial: - base::UmaHistogramTimes(kTotalUxPairTimeInitialMetric, total_pair_time); + base::UmaHistogramCustomTimes(kTotalUxPairTimeInitialMetric, + total_pair_time, base::Milliseconds(1), + base::Seconds(25), 50); break; case Protocol::kFastPairRetroactive: break; case Protocol::kFastPairSubsequent: - base::UmaHistogramTimes(kTotalUxPairTimeSubsequentMetric, - total_pair_time); + base::UmaHistogramCustomTimes(kTotalUxPairTimeSubsequentMetric, + total_pair_time, base::Milliseconds(1), + base::Seconds(25), 50); break; } }
diff --git a/ash/quick_pair/keyed_service/quick_pair_metrics_logger_unittest.cc b/ash/quick_pair/keyed_service/quick_pair_metrics_logger_unittest.cc index ff9c414..531bf8b 100644 --- a/ash/quick_pair/keyed_service/quick_pair_metrics_logger_unittest.cc +++ b/ash/quick_pair/keyed_service/quick_pair_metrics_logger_unittest.cc
@@ -49,9 +49,9 @@ const char kFastPairRetroactiveEngagementFlowMetric[] = "Bluetooth.ChromeOS.FastPair.RetroactiveEngagementFunnel.Steps"; constexpr char kFastPairPairTimeMetricInitial[] = - "Bluetooth.ChromeOS.FastPair.TotalUxPairTime.InitialPairingProtocol"; + "Bluetooth.ChromeOS.FastPair.TotalUxPairTime.InitialPairingProtocol2"; constexpr char kFastPairPairTimeMetricSubsequent[] = - "Bluetooth.ChromeOS.FastPair.TotalUxPairTime.SubsequentPairingProtocol"; + "Bluetooth.ChromeOS.FastPair.TotalUxPairTime.SubsequentPairingProtocol2"; const char kPairingMethodMetric[] = "Bluetooth.ChromeOS.FastPair.PairingMethod"; const char kRetroactivePairingResultMetric[] = "Bluetooth.ChromeOS.FastPair.RetroactivePairing.Result";
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index fe0750e..3d33761 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">Installeer programme, uitbreidings en temas</translation> <translation id="2977598380246111477">Volgende syfer</translation> <translation id="2981684127883932071">Wys tans voorstelle</translation> +<translation id="2985148236010982088">Sien alle programme</translation> <translation id="2992327365391326550">Toestel se mikrofoonknoppie is afgeskakel.</translation> <translation id="2995447421581609334">Wys uitsaaitoestelle.</translation> <translation id="2996462380875591307">Gedokte vergrootglas is geaktiveer. Druk weer Ctrl+Search+D om dit af te skakel.</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> en nog <ph name="UNAVAILABLE_APPS_COUNT" /> is nie op hierdie toestel nie.</translation> <translation id="3735740477244556633">Rangskik volgens</translation> <translation id="3742055079367172538">Skermkiekie geneem</translation> +<translation id="3761848338953536304">Jou administrateur versoek tans dat jy die SIM-slotinstelling afskakel</translation> <translation id="3765841986579723851">Vandag gewysig</translation> <translation id="3771549900096082774">Hoëkontrasmodus</translation> <translation id="3773700760453577392">'n Administrateur laat nie veelvuldige aanmeldings deur <ph name="USER_EMAIL" /> toe nie. @@ -829,6 +831,7 @@ <translation id="598407983968395253">Gebruik templaat</translation> <translation id="598882571027504733">Herbegin jou Chromebook met die sleutelbord aangeheg om die opdatering te kry.</translation> <translation id="5992218262414051481">Hoëkontras-modus is geaktiveer. Druk weer Ctrl+Search+H om dit af te skakel.</translation> +<translation id="6009656393242168182">Deaktiveer jou SIM-slotinstelling</translation> <translation id="6012623610530968780">Bladsy <ph name="SELECTED_PAGE" /> van <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Verlaat tans spieëlmodus</translation> <translation id="602001110135236999">Rollees links</translation> @@ -863,6 +866,7 @@ <translation id="6165508094623778733">Kom meer te wete</translation> <translation id="6166852626429024716">Deursoek jou toestel, programme, instellings en die web …</translation> <translation id="6179832488876878285">Jy kan jou belangrike lêers hier vasspeld. Maak Lêers-program oop om te begin.</translation> +<translation id="6182592640011875895">Maak lessenaar oop</translation> <translation id="619279033188484792">Bekyk jou foon se onlangse foto's, media en kennisgewings op jou <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Laai nou ten volle</translation> <translation id="6220928844947387476">Jy kan jouself en jou skerm nou op dieselfde tyd opneem</translation> @@ -1169,6 +1173,7 @@ <translation id="8052898407431791827">Gekopieer na knipbord</translation> <translation id="8054466585765276473">Bereken tans batterytyd.</translation> <translation id="8061464966246066292">Hoë kontras</translation> +<translation id="8083540854303889870">Gestoor vir later</translation> <translation id="8098591350844501178">Hou op om skerm na <ph name="RECEIVER_NAME" /> toe uit te saai</translation> <translation id="8113423164597455979">Aan; alle prog.</translation> <translation id="8120151603115102514">Jou foon het nie 'n sluitskerm nie. Voer wagwoord in om jou Chromebook te ontsluit.</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index df09580..553409a 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -323,6 +323,7 @@ <translation id="2970920913501714344">መተግበሪያዎችን፣ ቅጥያዎችን እና ገጽታዎችን ይጫኑ</translation> <translation id="2977598380246111477">ቀጣይ ቁጥር</translation> <translation id="2981684127883932071">ጥቆማ ሐሳቦችን በማሳየት ላይ</translation> +<translation id="2985148236010982088">ሁሉንም መተግበሪያዎች ይመልከቱ</translation> <translation id="2992327365391326550">የመሣሪያው ማይክሮፎን አዝራር ጠፍቷል።</translation> <translation id="2995447421581609334">የCast መሣሪያዎችን አሳይ።</translation> <translation id="2996462380875591307">የተተከለ ማጉያ ነቅቷል። እንደገና እንዲጠፋ አድርጎ ለመቀያየር Ctrl+ፍለጋ+D ይጫኑ።</translation> @@ -461,6 +462,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />፣ <ph name="UNAVAILABLE_APPS_TWO" /> እና <ph name="UNAVAILABLE_APPS_COUNT" /> ሌሎች በዚህ መሳሪያ ላይ የሉም።</translation> <translation id="3735740477244556633">ደርድር በ</translation> <translation id="3742055079367172538">ቅጽበታዊ ገጽ እይታ ተነስቷል</translation> +<translation id="3761848338953536304">የእርስዎ አስተዳዳሪ የሲም ቁልፍ ቅንብሩን እንዲያጠፉ እየጠየቀ ነው</translation> <translation id="3765841986579723851">ዛሬ አርትዖት ተደርጎበታል</translation> <translation id="3771549900096082774">ባለከፍተኛ ንፅፅር ሁነታ</translation> <translation id="3773700760453577392">አንድ አስተዳዳሪ ለ<ph name="USER_EMAIL" /> በበርካታ መለያ መግባቶችን ከልክሏል። ለመቀጠል ሁሉም ተጠቃሚዎች ዘግተው መውጣት አለባቸው።</translation> @@ -825,6 +827,7 @@ <translation id="598407983968395253">ቅንብር ደንብን ተጠቀም</translation> <translation id="598882571027504733">ዝማኔውን ለማግኘት፣ ከተያያዘው የቁልፍ ሰሌዳ ጋር የእርስዎን Chromebook ዳግም ያስጀምሩ።</translation> <translation id="5992218262414051481">ባለከፍተኛ ንፅፅር ሁነታ ነቅቷል። እሱን ለማጥፋት እንደገና Ctrl+Search+H ይጫኑ።</translation> +<translation id="6009656393242168182">የእርስዎን የሲም ቁልፍ ቅንብር ያሰናክሉ።</translation> <translation id="6012623610530968780">ገጽ <ph name="SELECTED_PAGE" /> ከ<ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">ከመስታወት ሁነታ በመውጣት ላይ</translation> <translation id="602001110135236999">ወደ ግራ ይሸብልሉ</translation> @@ -859,6 +862,7 @@ <translation id="6165508094623778733">የበለጠ ለመረዳት</translation> <translation id="6166852626429024716">የእርስዎን መሣሪያ፣ መተግበሪያዎች፣ ቅንብሮች፣ ድር ይፈልጉ...</translation> <translation id="6179832488876878285">እዚህ አስፈላጊ ፋይሎችዎን መሰካት ይችላሉ። ለመጀመር የፋይሎች መተግበሪያን ይክፈቱ።</translation> +<translation id="6182592640011875895">ዴስክ ክፈት</translation> <translation id="619279033188484792">የስልክዎን የቅርብ ጊዜ ፎቶዎች፣ ሚዲያ እና ማሳወቂያዎች በእርስዎ <ph name="DEVICE_TYPE" /> ላይ ይመልከቱ</translation> <translation id="619335566042889110">አሁን ሙሉ ኃይል ይሙሉ</translation> <translation id="6220928844947387476">አሁን እራስዎን እና ማያ ገጽዎን በተመሳሳይ ጊዜ መቅረጽ ይችላሉ</translation> @@ -1165,6 +1169,7 @@ <translation id="8052898407431791827">ወደ ቅንጥብ ሰሌዳ ተቀድቷል</translation> <translation id="8054466585765276473">የባትሪ ጊዜን በማስላት ላይ።</translation> <translation id="8061464966246066292">ከፍተኛ ንፅፅር</translation> +<translation id="8083540854303889870">ለበኋላ የተቀመጠ</translation> <translation id="8098591350844501178">ማያ ገጹን ወደ <ph name="RECEIVER_NAME" /> Cast ማድረግ አስቁም</translation> <translation id="8113423164597455979">በርቷል፣ ሁሉም መተግበሪያዎች</translation> <translation id="8120151603115102514">የእርስዎ ስልክ የማያ ገጽ መቆለፊያ የለውም። የእርስዎን Chromebook ለመክፈት የይለፍ ቃል ያስገቡ።</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index 303c2cd..07b0746 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -638,6 +638,7 @@ <translation id="4734965478015604180">أفقي</translation> <translation id="4735498845456076464">تم تغيير اختصارات لوحة المفاتيح "<ph name="LAUNCHER_KEY_NAME" /> + رقم". لاستخدام مفاتيح الوظائف، اضغط على المفتاح <ph name="LAUNCHER_KEY_NAME" /> مع الضغط على مفتاح في الصف العلوي.</translation> <translation id="473775607612524610">تحديث</translation> +<translation id="4752784485658729358">لا يمكن حفظ أكثر من 6 أسطح مكتب. يُرجى إزالة أحدها لحفظ سطح مكتب جديد.</translation> <translation id="4759238208242260848">الملفات التي تم تنزيلها</translation> <translation id="4774338217796918551">يمكنك العودة غدًا في <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">كلمة مرور <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index 73d97dd..bab4290b 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">Tətbiq, artırma və temaları quraşdırın</translation> <translation id="2977598380246111477">Növbəti nömrə</translation> <translation id="2981684127883932071">Təkliflərin göstərilməsi</translation> +<translation id="2985148236010982088">Bütün tətbiqlərə baxın</translation> <translation id="2992327365391326550">Cihazın mikrofon düyməsi deaktivdir.</translation> <translation id="2995447421581609334">Yayım cihazlarını göstərin.</translation> <translation id="2996462380875591307">Yüksək Kontrast Rejimi aktiv edildi. Rejimi deaktiv etmək üçün Ctrl+Search+D düymələrini basın.</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> və daha <ph name="UNAVAILABLE_APPS_COUNT" /> tətbiq bu cihazda yoxdur.</translation> <translation id="3735740477244556633">Çeşidləyin</translation> <translation id="3742055079367172538">Skrinşot çəkildi</translation> +<translation id="3761848338953536304">Admininiz sizdən SIM-i kilidləmə ayarını deaktiv etməyinizi tələb edir</translation> <translation id="3765841986579723851">Bugün redaktə edilib</translation> <translation id="3771549900096082774">Yüksək Kontrast Rejimi</translation> <translation id="3773700760453577392">Administrator <ph name="USER_EMAIL" /> üçün çoxsaylı girişə icazə verməyib. Bütün istifadəçilər davam etmək üçün çıxış etməlidir.</translation> @@ -828,6 +830,7 @@ <translation id="598407983968395253">Şablon istifadə edin</translation> <translation id="598882571027504733">Güncəlləməni əldə etmək üçün əlavə edilən klavatura ilə Chromebook'u yenidən başladın.</translation> <translation id="5992218262414051481">Yüksək Kontrast Rejimi aktiv edildi. Rejimi deaktiv etmək üçün Ctrl+Search+H düymələrini basın.</translation> +<translation id="6009656393242168182">SIM Kilidi ayarınızı deaktiv edin</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" /> səhifədən <ph name="SELECTED_PAGE" /> səhifə</translation> <translation id="6018164090099858612">Güzgü rejimindən çıxır</translation> <translation id="602001110135236999">Sola sürüşdürün</translation> @@ -862,6 +865,7 @@ <translation id="6165508094623778733">Ətraflı öyrənin</translation> <translation id="6166852626429024716">Cihaz, tətbiqlər, ayarlar, vebdə və s. axtarın</translation> <translation id="6179832488876878285">Vacib fayllarınızı buraya bərkidə bilərsiniz. Başlamaq üçün Fayllar tətbiqini açın.</translation> +<translation id="6182592640011875895">Masanı açın</translation> <translation id="619279033188484792"><ph name="DEVICE_TYPE" /> cihazında telefonunuzun son fotolarına, media və bildirişlərinə baxın</translation> <translation id="619335566042889110">İndi tam şarj edin</translation> <translation id="6220928844947387476">İndi özünüzü və ekranınızı eyni vaxtda çəkə bilərsiniz</translation> @@ -1168,6 +1172,7 @@ <translation id="8052898407431791827">Mübadilə buferinə kopyalandı</translation> <translation id="8054466585765276473">Enerji vaxtı hesablanır.</translation> <translation id="8061464966246066292">Yüksək kontrast</translation> +<translation id="8083540854303889870">Sonra üçün yadda saxlanıldı</translation> <translation id="8098591350844501178">Ekranın <ph name="RECEIVER_NAME" /> üzrə yayımlanmasını dayandırın</translation> <translation id="8113423164597455979">Bütün tətbiqlərdə aktivdir</translation> <translation id="8120151603115102514">Telefonunuzun kilid ekranı yoxdur. Chromebook'u kiliddən çıxarmaq üçün parolu daxil edin.</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index f1eff907..9280ed6 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Гарызантальна</translation> <translation id="4735498845456076464">Змянілася прызначэнне спалучэння клавіш <ph name="LAUNCHER_KEY_NAME" /> + лічба. Каб выканаць дзеянне функцыянальнай клавішы, націсніце <ph name="LAUNCHER_KEY_NAME" /> + адну з клавіш верхняга рада.</translation> <translation id="473775607612524610">Абнавіць</translation> +<translation id="4752784485658729358">Можна захоўваць не больш за 6 працоўных сталоў. Каб можна было захаваць новы працоўны стол, выдаліце адзін са старых.</translation> <translation id="4759238208242260848">Спампоўкі</translation> <translation id="4774338217796918551">Можна будзе прадоўжыць заўтра ў <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Пароль карыстальніка <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index 2c02971..b1f8962 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Хоризонтално</translation> <translation id="4735498845456076464">Клавишната комбинация клавиш „<ph name="LAUNCHER_KEY_NAME" />“ + цифра се промени. За да използвате функционалните клавиши, натиснете „<ph name="LAUNCHER_KEY_NAME" />“ + клавиш от най-горния ред.</translation> <translation id="473775607612524610">Актуализиране</translation> +<translation id="4752784485658729358">Може да имате само 6 запазени работни къта. Премахнете един от текущите, за да запазите нов.</translation> <translation id="4759238208242260848">Изтегляния</translation> <translation id="4774338217796918551">Заповядайте отново утре в <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Парола за <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 6a410f40..82ba174 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">অ্যাপ, এক্সটেনশন এবং থিম ইনস্টল করুন</translation> <translation id="2977598380246111477">পরবর্তী নম্বর</translation> <translation id="2981684127883932071">সাজেশন দেখানো হচ্ছে</translation> +<translation id="2985148236010982088">সব অ্যাপ দেখুন</translation> <translation id="2992327365391326550">ডিভাইসের মাইক্রোফোন বোতাম বন্ধ আছে।</translation> <translation id="2995447421581609334">কাস্ট ডিভাইসগুলি দেখান।</translation> <translation id="2996462380875591307">ডক করা ম্যাগনিফায়ার চালু আছে। আবার Ctrl+Search+D প্রেস করে সেটিকে বন্ধ করুন।</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> এবং আরও <ph name="UNAVAILABLE_APPS_COUNT" />টি অ্যাপ এই ডিভাইসে উপলভ্য নেই।</translation> <translation id="3735740477244556633">এই অনুসারে সাজান</translation> <translation id="3742055079367172538">স্ক্রিনশট নেওয়া হয়েছে</translation> +<translation id="3761848338953536304">'লক সিম' সেটিং বন্ধ করার জন্য আপনাকে অ্যাডমিনিস্ট্রেটর অনুরোধ করেছেন</translation> <translation id="3765841986579723851">আজ এডিট করা হয়েছে</translation> <translation id="3771549900096082774">উচ্চ কনট্রাস্ট মোড</translation> <translation id="3773700760453577392">একজন অ্যাডমিনিস্ট্রেটর <ph name="USER_EMAIL" />-র জন্য একাধিক সাইন-ইন বাতিল করেছেন। চালিয়ে যাওয়ার জন্য, সব ব্যবহারকারীকে অবশ্যই সাইন-আউট করতে হবে।</translation> @@ -637,6 +639,7 @@ <translation id="4734965478015604180">অনুভূমিক</translation> <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Number কীবোর্ড শর্ককার্ট পরিবর্তন করা হয়েছে। ফাংশান কী ব্যবহার করতে, <ph name="LAUNCHER_KEY_NAME" /> কী + কীবোর্ডের উপরের সারির যেকোনও একটি কী প্রেস করুন।</translation> <translation id="473775607612524610">আপডেট করুন</translation> +<translation id="4752784485658729358">সেভ করা শুধুমাত্র ৬টি ডেস্কের অনুমতি আছে। নতুন একটি সেভের জন্য ডেস্ক সরান।</translation> <translation id="4759238208242260848">ডাউনলোড</translation> <translation id="4774338217796918551">আগামীকাল <ph name="COME_BACK_TIME" />-এ আবার ব্যবহার করতে পারবেন।</translation> <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" />-এর জন্য পাসওয়ার্ড</translation> @@ -827,6 +830,7 @@ <translation id="598407983968395253">টেমপ্লেট ব্যবহার করুন</translation> <translation id="598882571027504733">আপডেট পেতে, অ্যাটাচ করা কীবোর্ডের মাধ্যমে আপনার Chromebook রিস্টার্ট করুন।</translation> <translation id="5992218262414051481">উচ্চ কনট্রাস্ট মোড চালু করা হয়েছে। টগল করে বন্ধ করার জন্য Ctrl+Search+H টিপুন।</translation> +<translation id="6009656393242168182">আপনার 'সিম লক' সেটিং বন্ধ করুন</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" />টি পৃষ্ঠার মধ্যে <ph name="SELECTED_PAGE" />টি পৃষ্ঠা</translation> <translation id="6018164090099858612">মিরর মোড থেকে প্রস্থান করছে</translation> <translation id="602001110135236999">বাঁ দিকে স্ক্রল করুন</translation> @@ -861,6 +865,7 @@ <translation id="6165508094623778733">আরও জানুন</translation> <translation id="6166852626429024716">আপনার ডিভাইস, অ্যাপ, সেটিংস, ওয়েবে সার্চ করুন...</translation> <translation id="6179832488876878285">গুরুত্বপূর্ণ ফাইলগুলি আপনি এখানে পিন করে রাখতে পারবেন। শুরু করার জন্য, Files অ্যাপ খুলুন।</translation> +<translation id="6182592640011875895">ডেস্ক খুলুন</translation> <translation id="619279033188484792">আপনার <ph name="DEVICE_TYPE" />-এ আপনার ফোনের সাম্প্রতিক ফটো, মিডিয়া এবং বিজ্ঞপ্তি দেখুন</translation> <translation id="619335566042889110">এখন সম্পূর্ণ চার্জ করুন</translation> <translation id="6220928844947387476">আপনি এখন একই সময়ে নিজে এবং আপনার স্ক্রিন রেকর্ড করতে পারবেন</translation> @@ -1167,6 +1172,7 @@ <translation id="8052898407431791827">ক্লিপবোর্ডে কপি করা হয়েছে</translation> <translation id="8054466585765276473">ব্যাটারি সময় গণনা করা হচ্ছে।</translation> <translation id="8061464966246066292">উচ্চ বৈসাদৃশ্য</translation> +<translation id="8083540854303889870">পরবর্তী সময়ের জন্য সেভ করুন</translation> <translation id="8098591350844501178"><ph name="RECEIVER_NAME" /> এ স্ক্রিন কাস্ট করা বন্ধ করুন</translation> <translation id="8113423164597455979">সমস্ত অ্যাপে</translation> <translation id="8120151603115102514">আপনার ফোনে লক স্ক্রিন নেই। Chromebook আনলক করতে, পাসওয়ার্ড লিখুন।</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index bf5e385..09f6e37 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Horizontalno</translation> <translation id="4735498845456076464">Prečica na tastaturi <ph name="LAUNCHER_KEY_NAME" /> + broj je promijenjena. Da koristite funkcijske tipke, pritisnite tipku <ph name="LAUNCHER_KEY_NAME" /> + tipku u gornjem redu.</translation> <translation id="473775607612524610">Ažuriraj</translation> +<translation id="4752784485658729358">Dozvoljeno je samo 6 radnih površina. Uklonite jednu radnu površinu da sačuvate novu.</translation> <translation id="4759238208242260848">Preuzimanja</translation> <translation id="4774338217796918551">Vratite se sutra u <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Lozinka za račun <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index 865c96e27..2721d31 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Na šířku</translation> <translation id="4735498845456076464">Klávesová zkratka <ph name="LAUNCHER_KEY_NAME" /> + číslo se změnila. Pokud chcete použít funkční klávesy, stiskněte <ph name="LAUNCHER_KEY_NAME" /> + klávesu na horním řádku.</translation> <translation id="473775607612524610">Aktualizovat</translation> +<translation id="4752784485658729358">Je povoleno pouze 6 uložených ploch. Pokud chcete uložit novou, některou odstraňte.</translation> <translation id="4759238208242260848">Stažené soubory</translation> <translation id="4774338217796918551">Vrať se v <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Heslo pro účet <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_cy.xtb b/ash/strings/ash_strings_cy.xtb index 78297fe..de0d0c0d 100644 --- a/ash/strings/ash_strings_cy.xtb +++ b/ash/strings/ash_strings_cy.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Llorweddol</translation> <translation id="4735498845456076464">Mae'r llwybr byr bysellfwrdd <ph name="LAUNCHER_KEY_NAME" /> + Number wedi newid. I ddefnyddio bysellau swyddogaeth, pwyswch y fysell <ph name="LAUNCHER_KEY_NAME" /> + bysell ar y rhes uchaf.</translation> <translation id="473775607612524610">Diweddaru</translation> +<translation id="4752784485658729358">Dim ond 6 desg sydd wedi'u cadw a ganiateir. Tynnwch ddesg i gadw un newydd.</translation> <translation id="4759238208242260848">Lawrlwythiadau</translation> <translation id="4774338217796918551">Dewch yn ôl yfory am <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Cyfrinair ar gyfer <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 11900896..3f242ae 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">Installer apps, udvidelser og temaer</translation> <translation id="2977598380246111477">Næste tal</translation> <translation id="2981684127883932071">Viser forslag</translation> +<translation id="2985148236010982088">Se alle apps</translation> <translation id="2992327365391326550">Enhedens mikrofonknap er slået fra.</translation> <translation id="2995447421581609334">Vis Cast-enheder.</translation> <translation id="2996462380875591307">Fastgjort lupvindue er aktiveret. Tryk på Ctrl+Søg+D igen for at deaktivere tilstanden.</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> og <ph name="UNAVAILABLE_APPS_COUNT" /> mere er ikke på denne enhed.</translation> <translation id="3735740477244556633">Sortér efter</translation> <translation id="3742055079367172538">Screenshottet blev gemt</translation> +<translation id="3761848338953536304">Din administrator anmoder om, at du deaktiverer indstillingen for SIM-lås</translation> <translation id="3765841986579723851">Redigeret i dag</translation> <translation id="3771549900096082774">Tilstanden Høj kontrast</translation> <translation id="3773700760453577392">En administrator har afvist samlet login fra flere konti for <ph name="USER_EMAIL" />. Alle brugere skal logge ud for at fortsætte.</translation> @@ -637,6 +639,7 @@ <translation id="4734965478015604180">Vandret</translation> <translation id="4735498845456076464">Tastaturgenvejen <ph name="LAUNCHER_KEY_NAME" />+numerisk tast er blevet ændret. Hvis du vil bruge funktionstaster, skal du trykke på tasten <ph name="LAUNCHER_KEY_NAME" />+en tast i øverste række.</translation> <translation id="473775607612524610">Opdater</translation> +<translation id="4752784485658729358">Der er en grænse på maks. 6 gemte skriveborde. Fjern et skrivebord for at gemme et nyt.</translation> <translation id="4759238208242260848">Downloads</translation> <translation id="4774338217796918551">Kom tilbage i morgen kl. <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Adgangskode for <ph name="USER_EMAIL_ADDRESS" /></translation> @@ -827,6 +830,7 @@ <translation id="598407983968395253">Brug skabelon</translation> <translation id="598882571027504733">Genstart din Chromebook med det tilsluttede tastatur for at hente opdateringen.</translation> <translation id="5992218262414051481">Tilstanden Høj kontrast er aktiveret. Tryk på Ctrl+Søg+H igen for at deaktivere tilstanden.</translation> +<translation id="6009656393242168182">Deaktiver din indstilling for SIM-lås</translation> <translation id="6012623610530968780">Side <ph name="SELECTED_PAGE" /> ud af <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Lukker spejltilstand</translation> <translation id="602001110135236999">Rul til venstre</translation> @@ -861,6 +865,7 @@ <translation id="6165508094623778733">Flere oplysninger</translation> <translation id="6166852626429024716">Søg på din enhed, i dine apps, i indstillingerne, på nettet...</translation> <translation id="6179832488876878285">Du kan fastgøre dine vigtige filer her. Åbn appen Filer for at komme i gang.</translation> +<translation id="6182592640011875895">Åbn skrivebord</translation> <translation id="619279033188484792">Se de seneste billeder, mediefiler og notifikationer fra din telefon på din <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Oplad helt nu</translation> <translation id="6220928844947387476">Du kan nu optage dig selv og din skærm på samme tid</translation> @@ -1167,6 +1172,7 @@ <translation id="8052898407431791827">Kopieret til udklipsholder</translation> <translation id="8054466585765276473">Beregner batteritid.</translation> <translation id="8061464966246066292">Høj kontrast</translation> +<translation id="8083540854303889870">Gemt til senere</translation> <translation id="8098591350844501178">Stop skærmcast til <ph name="RECEIVER_NAME" /></translation> <translation id="8113423164597455979">Til, alle apps</translation> <translation id="8120151603115102514">Du har ikke aktiveret en låseskærm på din telefon. Angiv din adgangskode for at låse din Chromebook op.</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index ac04b14..2b7b94a8 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -634,6 +634,7 @@ <translation id="4734965478015604180">Horizontal</translation> <translation id="4735498845456076464">Die Tastenkombination <ph name="LAUNCHER_KEY_NAME" /> + Ziffer hat sich geändert. Wenn du eine Funktionstaste benötigst, drücke die <ph name="LAUNCHER_KEY_NAME" />-Taste + eine Taste in der oberen Reihe.</translation> <translation id="473775607612524610">Aktualisieren</translation> +<translation id="4752784485658729358">Es sind maximal 6 gespeicherte Desktops zulässig. Entferne einen Desktop, um einen neuen zu speichern.</translation> <translation id="4759238208242260848">Downloads</translation> <translation id="4774338217796918551">Du darfst das Gerät um <ph name="COME_BACK_TIME" /> wieder verwenden.</translation> <translation id="4776917500594043016">Passwort für <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index 4df32aea..d2971d3 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Οριζόντια περιστροφή</translation> <translation id="4735498845456076464">Η συντόμευση πληκτρολογίου <ph name="LAUNCHER_KEY_NAME" /> + Αριθμός άλλαξε. Για να χρησιμοποιήσετε τα πλήκτρα λειτουργιών, πατήστε το πλήκτρο <ph name="LAUNCHER_KEY_NAME" /> + ένα πλήκτρο στην επάνω σειρά.</translation> <translation id="473775607612524610">Ενημέρωση</translation> +<translation id="4752784485658729358">Επιτρέπονται μόνο 6 αποθηκευμένα γραφεία. Αφαιρέστε ένα γραφείο για να αποθηκεύσετε ένα νέο.</translation> <translation id="4759238208242260848">Λήψεις</translation> <translation id="4774338217796918551">Επιστρέψτε ξανά αύριο στις <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Κωδικός πρόσβασης για <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 7e9929c..6064a5e 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -135,6 +135,7 @@ <translation id="1715293566947629045">Disabling profile. Wait a few minutes.</translation> <translation id="1719094688023114093">Live Caption is on.</translation> <translation id="1720011244392820496">Turn on Wi-Fi Sync</translation> +<translation id="1733996486177697563">Switch between Dark and Light theme. Touch and hold on the desktop, then select Wallpaper and style.</translation> <translation id="1736898441010944794">'<ph name="NAME" />' visible to Bluetooth devices.</translation> <translation id="174102739345480129">Marker is off.</translation> <translation id="1743570585616704562">Not recognised</translation> @@ -264,6 +265,7 @@ <translation id="2573588302192866788">Couldn't connect <ph name="NAME" /></translation> <translation id="2575685495496069081">Multiple sign-in has been disabled</translation> <translation id="2582112259361606227">Restart to update</translation> +<translation id="2586561057878260610">Press Ctrl + W to combine with <ph name="DESK_NAME" />. Press Ctrl + Shift + W to close desk and windows.</translation> <translation id="2595239820337756193">5 K in miles</translation> <translation id="2596078834055697711">Take window screenshot</translation> <translation id="2607678425161541573">Online sign-in required</translation> @@ -669,6 +671,7 @@ <translation id="4917385247580444890">Strong</translation> <translation id="4918086044614829423">Accept</translation> <translation id="4925542575807923399">The administrator for this account requires this account to be the first signed-in account in a multiple sign-in session.</translation> +<translation id="4938176435186993759">Hide all suggestions</translation> <translation id="4945196315133970626">Turn off notifications</translation> <translation id="4946376291507881335">Capture</translation> <translation id="495046168593986294">Scroll up</translation> @@ -735,6 +738,7 @@ <translation id="5331975486040154427">USB-C device (left side back port)</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (right)</translation> <translation id="5352250171825660495">Dark theme is on</translation> +<translation id="5356963482258194581">Switch between Dark and Light theme. Right-click on the desktop and select Wallpaper and style.</translation> <translation id="5379115545237091094">Too many attempts</translation> <translation id="5393156353051693207">Touch & hold anywhere to reorder your apps</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> on top of <ph name="IN_PLACE_APP" />, release to create folder.</translation> @@ -756,6 +760,7 @@ <translation id="5520229639206813572">Your administrator has removed all eSIM profiles. Contact your administrator for more info.</translation> <translation id="5523434445161341166"><ph name="FEATURE_NAME" /> is connecting.</translation> <translation id="5532994612895037630">Tap anywhere to record full screen</translation> +<translation id="5536723544185013515">Recent apps; navigate with left or right arrow keys to access all recent apps</translation> <translation id="553675580533261935">Exiting session</translation> <translation id="5537725057119320332">Cast</translation> <translation id="554893713779400387">Toggle dictation</translation> @@ -783,6 +788,7 @@ <translation id="5682642926269496722">The Google Assistant is not available for current user account.</translation> <translation id="5689633613396158040">Night Light makes it easier to look at your screen or read in dim light. Tap to change what time Night Light turns on, or turn it off completely.</translation> <translation id="5691772641933328258">Fingerprint not recognised</translation> +<translation id="570390244361237317">All apps; navigate with arrow keys to access all apps</translation> <translation id="5707775774148071965">Your device supports a higher data rate than your cable. Device performance may be limited.</translation> <translation id="5710450975648804523">Do Not Disturb is on</translation> <translation id="571295407079589142">Mobile data is turned off</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index 758ad21..6447626 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -638,6 +638,7 @@ <translation id="4734965478015604180">Horizontal</translation> <translation id="4735498845456076464">Se modificó la combinación de teclas <ph name="LAUNCHER_KEY_NAME" /> + un número. Para usar las teclas de función, presiona la tecla <ph name="LAUNCHER_KEY_NAME" /> + una tecla de la fila superior.</translation> <translation id="473775607612524610">Actualizar</translation> +<translation id="4752784485658729358">Se permiten únicamente 6 escritorios guardados. Para guardar un escritorio nuevo, deberás quitar uno.</translation> <translation id="4759238208242260848">Descargas</translation> <translation id="4774338217796918551">Regresa mañana a las <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Contraseña para <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index b37e725..dbf557a 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -458,7 +458,7 @@ <translation id="3702809606464356667">Se muestran las ventanas del escritorio actual. Pulsa la tecla de la flecha hacia arriba para ver las ventanas de todos los escritorios.</translation> <translation id="3702846122927433391">Población de Nigeria</translation> <translation id="3705722231355495246">-</translation> -<translation id="3708186454126126312">Conectado anteriormente</translation> +<translation id="3708186454126126312">Conectados anteriormente</translation> <translation id="371370241367527062">Micrófono delantero</translation> <translation id="3713734891607377840">Abrir al terminar</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> y <ph name="UNAVAILABLE_APPS_COUNT" /> más no están en este dispositivo.</translation> @@ -638,6 +638,7 @@ <translation id="4734965478015604180">Horizontal</translation> <translation id="4735498845456076464">La combinación de teclas <ph name="LAUNCHER_KEY_NAME" /> + número ha cambiado. Para usar las teclas de funciones, pulsa la tecla <ph name="LAUNCHER_KEY_NAME" /> + una tecla de la fila superior.</translation> <translation id="473775607612524610">Actualizar</translation> +<translation id="4752784485658729358">Solo se pueden guardar 6 escritorios. Quita un escritorio para guardar uno nuevo.</translation> <translation id="4759238208242260848">Descargas</translation> <translation id="4774338217796918551">Vuelve mañana a las <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Contraseña de <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index 11ecc3b..f95fae77 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -638,6 +638,7 @@ <translation id="4734965478015604180">Horisontaalne</translation> <translation id="4735498845456076464">Klaviatuuri otseteed <ph name="LAUNCHER_KEY_NAME" /> + numbriklahv on muudetud. Funktsiooniklahvide kasutamiseks vajutage klahvi <ph name="LAUNCHER_KEY_NAME" /> + ülemise rea klahvi.</translation> <translation id="473775607612524610">Värskenda</translation> +<translation id="4752784485658729358">Lubatud on ainult kuni 6 salvestatud töölauda. Uue töölaua salvestamiseks peate mõne eemaldama.</translation> <translation id="4759238208242260848">Allalaadimised</translation> <translation id="4774338217796918551">Tulge tagasi homme kell <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Kasutaja <ph name="USER_EMAIL_ADDRESS" /> parool</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index 15fe4f9..ca61c57 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">Instalatu aplikazioak, luzapenak eta gaiak</translation> <translation id="2977598380246111477">Hurrengo zenbakia</translation> <translation id="2981684127883932071">Iradokizunak daude ikusgai</translation> +<translation id="2985148236010982088">Ikusi aplikazio guztiak</translation> <translation id="2992327365391326550">Gailuaren mikrofonoaren botoia desaktibatuta dago.</translation> <translation id="2995447421581609334">Erakutsi igorpen-gailuak.</translation> <translation id="2996462380875591307">Gaituta dago lupa ainguratua. Desaktibatzeko, sakatu berriro Ktrl + Bilatu + D.</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> eta beste <ph name="UNAVAILABLE_APPS_COUNT" /> ez daude gailuan.</translation> <translation id="3735740477244556633">Ordenatzeko irizpidea</translation> <translation id="3742055079367172538">Pantaila-argazkia hartu da</translation> +<translation id="3761848338953536304">SIMa blokeatzeko ezarpena desaktibatzeko eskatzen ari zaizu administratzailea</translation> <translation id="3765841986579723851">Gaur editatu da</translation> <translation id="3771549900096082774">Kontraste handiko modua</translation> <translation id="3773700760453577392">Administratzaile batek <ph name="USER_EMAIL" /> erabiltzaileari saio-hasiera anitza desgaitu dio. @@ -638,6 +640,7 @@ <translation id="4734965478015604180">Horizontala</translation> <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + zenbakia lasterbidea aldatu egin da. Funtzio-teklak erabiltzeko, sakatu <ph name="LAUNCHER_KEY_NAME" /> tekla + goiko errenkadako tekla bat.</translation> <translation id="473775607612524610">Eguneratu</translation> +<translation id="4752784485658729358">Gordetako sei lan-eremu soilik eduki daitezke. Beste bat gordetzeko, kendu lehendik dagoen bat.</translation> <translation id="4759238208242260848">Deskargak</translation> <translation id="4774338217796918551">Itzuli bihar ordu honetan: <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> erabiltzaile-kontuko pasahitza</translation> @@ -828,6 +831,7 @@ <translation id="598407983968395253">Erabili txantiloia</translation> <translation id="598882571027504733">Eguneratzea eskuratzeko, berrabiarazi Chromebook-a teklatua konektatuta daukala.</translation> <translation id="5992218262414051481">Gaituta dago kontraste handiko modua. Desaktibatzeko, sakatu berriro Ktrl + Bilatu + H.</translation> +<translation id="6009656393242168182">Desgaitu SIMa blokeatzeko ezarpena</translation> <translation id="6012623610530968780"><ph name="SELECTED_PAGE" />/<ph name="TOTAL_PAGE_NUM" /> orria</translation> <translation id="6018164090099858612">Ispilu modutik irteten</translation> <translation id="602001110135236999">Egin ezkerrera</translation> @@ -862,6 +866,7 @@ <translation id="6165508094623778733">Lortu informazio gehiago</translation> <translation id="6166852626429024716">Bilatu gailuan, aplikazioetan, ezarpenetan, sarean…</translation> <translation id="6179832488876878285">Hemen aingura ditzakezu fitxategi garrantzitsuak. Hasteko, erabili Fitxategiak aplikazioa.</translation> +<translation id="6182592640011875895">Ireki lan-eremua</translation> <translation id="619279033188484792">Ikusi telefonoko azken argazkiak, multimedia-elementuak eta jakinarazpenak <ph name="DEVICE_TYPE" /> bidez</translation> <translation id="619335566042889110">Kargatu guztiz</translation> <translation id="6220928844947387476">Zeure burua eta pantaila aldi berean graba ditzakezu orain</translation> @@ -1168,6 +1173,7 @@ <translation id="8052898407431791827">Kopiatu da arbelean</translation> <translation id="8054466585765276473">Bateria-denbora kalkulatzen.</translation> <translation id="8061464966246066292">Kontraste handia</translation> +<translation id="8083540854303889870">Gerorako gordetakoak</translation> <translation id="8098591350844501178">Utzi pantaila <ph name="RECEIVER_NAME" /> izeneko gailura igortzeari</translation> <translation id="8113423164597455979">Guzt. aktibat.</translation> <translation id="8120151603115102514">Telefonoak ez dauka pantaila blokeaturik. Chromebook-a desblokeatzeko, idatzi pasahitza.</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 3245ac4..89e8c1b 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">نصب برنامهها، افزونهها و طرحهای زمینه</translation> <translation id="2977598380246111477">عدد بعدی</translation> <translation id="2981684127883932071">نمایش پیشنهادها</translation> +<translation id="2985148236010982088">دیدن همه برنامهها</translation> <translation id="2992327365391326550">دکمه میکروفون دستگاه خاموش است.</translation> <translation id="2995447421581609334">نمایش دستگاههای ارسال محتوا.</translation> <translation id="2996462380875591307">«ذرهبین متصل» فعال شد. برای خاموش کردن آن، Ctrl+Search+D را دوباره فشار دهید.</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />، <ph name="UNAVAILABLE_APPS_TWO" />، و <ph name="UNAVAILABLE_APPS_COUNT" /> برنامه دیگر در این دستگاه وجود ندارند.</translation> <translation id="3735740477244556633">مرتب کردن براساس</translation> <translation id="3742055079367172538">نماگرفت گرفته شد</translation> +<translation id="3761848338953536304">سرپرستتان از شما میخواهد تنظیم «قفل سیمکارت» را خاموش کنید</translation> <translation id="3765841986579723851">امروز ویرایش شده است</translation> <translation id="3771549900096082774">حالت تضاد بالا</translation> <translation id="3773700760453577392">یکی از سرپرستان ورود چندگانه به سیستم را برای <ph name="USER_EMAIL" /> غیرمجاز کرده است. برای ادامه دادن، همه کاربران باید از سیستم خارج شوند.</translation> @@ -828,6 +830,7 @@ <translation id="598407983968395253">استفاده از الگو</translation> <translation id="598882571027504733">برای دریافت بهروزرسانی، Chromebook را با صفحهکلید متصل بازراهاندازی کنید.</translation> <translation id="5992218262414051481">«حالت تضاد بالا» فعال شد. برای خاموش کردن آن، Ctrl+Search+H را دوباره فشار دهید.</translation> +<translation id="6009656393242168182">غیرفعال کردن تنظیم «قفل سیمکارت»</translation> <translation id="6012623610530968780">صفحه <ph name="SELECTED_PAGE" /> از <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">خروج از حالت آینه</translation> <translation id="602001110135236999">پیمایش به چپ</translation> @@ -862,6 +865,7 @@ <translation id="6165508094623778733">بیشتر بدانید</translation> <translation id="6166852626429024716">جستجوی دستگاه، برنامهها، تنظیمات، وب، و غیره</translation> <translation id="6179832488876878285">میتوانید فایلهای مهم را اینجا پین کنید. برای شروع کار، برنامه Files را باز کنید.</translation> +<translation id="6182592640011875895">باز کردن میزکار</translation> <translation id="619279033188484792">اعلانها، رسانه، و عکسهای جدید تلفنتان را در <ph name="DEVICE_TYPE" /> مشاهده کنید</translation> <translation id="619335566042889110">اکنون کامل شارژ شود</translation> <translation id="6220928844947387476">اکنون میتوانید همزمان هم از خودتان و هم از صفحهنمایش فیلمبرداری کنید</translation> @@ -1168,6 +1172,7 @@ <translation id="8052898407431791827">در بریدهدان کپی شد</translation> <translation id="8054466585765276473">درحال محاسبه زمان شارژ باتری.</translation> <translation id="8061464966246066292">کنتراست بالا</translation> +<translation id="8083540854303889870">برای بعد ذخیره شده است</translation> <translation id="8098591350844501178">توقف ارسال محتوای صفحه به <ph name="RECEIVER_NAME" /></translation> <translation id="8113423164597455979">روشن، همه برنامهها</translation> <translation id="8120151603115102514">تلفنتان صفحه قفل ندارد. برای باز کردن قفل Chromebook، گذرواژه را وارد کنید.</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index 8240e6e4..2cc21f0 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -636,6 +636,7 @@ <translation id="4734965478015604180">Vaakasuora</translation> <translation id="4735498845456076464">Pikanäppäinyhdistelmä <ph name="LAUNCHER_KEY_NAME" /> + numeronäppäin on muuttunut. Jos haluat käyttää toimintonäppäimiä, paina <ph name="LAUNCHER_KEY_NAME" /> + ylärivin näppäin.</translation> <translation id="473775607612524610">Päivitä</translation> +<translation id="4752784485658729358">Vain kuusi tallennettua työpöytää sallitaan. Poista jokin työpöytä tallentaaksesi uuden.</translation> <translation id="4759238208242260848">Lataukset</translation> <translation id="4774338217796918551">Palaa huomenna kello <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Osoitteen <ph name="USER_EMAIL_ADDRESS" /> salasana</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index 9124fed..1fce813 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">Mag-install ng mga app, extension, at tema</translation> <translation id="2977598380246111477">Susunod na numero</translation> <translation id="2981684127883932071">Ipinapakita ang mga suhestyon</translation> +<translation id="2985148236010982088">Tingnan ang lahat ng app</translation> <translation id="2992327365391326550">Naka-off ang button ng mikropono ng device.</translation> <translation id="2995447421581609334">Ipakita ang mga cast device.</translation> <translation id="2996462380875591307">Na-enable ang Naka-dock na Magnifier. Pinduting muli ang Ctrl+Search+D para i-off ito.</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917">Wala ang <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, at <ph name="UNAVAILABLE_APPS_COUNT" /> pa sa device na ito.</translation> <translation id="3735740477244556633">Pagbukud-bukurin ayon sa</translation> <translation id="3742055079367172538">Nakakuha na ng screenshot</translation> +<translation id="3761848338953536304">Hinihiling ng iyong administrator na i-off mo ang setting ng Lock SIM</translation> <translation id="3765841986579723851">Na-edit ngayon</translation> <translation id="3771549900096082774">High Contrast Mode</translation> <translation id="3773700760453577392">Hindi pinayagan ng isang administrator ang maraming pag-sign in para sa <ph name="USER_EMAIL" />. Dapat mag-sign out ang lahat ng user para makapagpatuloy.</translation> @@ -828,6 +830,7 @@ <translation id="598407983968395253">Gamitin ang template</translation> <translation id="598882571027504733">Para makuha ang update, i-restart ang iyong Chromebook nang nakakabit ang keyboard.</translation> <translation id="5992218262414051481">Na-enable ang High Contrast Mode. Pinduting muli ang Ctrl+Search+H upang i-off ito.</translation> +<translation id="6009656393242168182">I-disable ang iyong setting ng SIM Lock</translation> <translation id="6012623610530968780">Page <ph name="SELECTED_PAGE" /> ng <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Lumalabas sa mirror mode</translation> <translation id="602001110135236999">Mag-scroll pakaliwa</translation> @@ -862,6 +865,7 @@ <translation id="6165508094623778733">Matuto pa</translation> <translation id="6166852626429024716">Maghanap sa iyong device, mga app, mga setting, web...</translation> <translation id="6179832488876878285">Puwede mong i-pin ang iyong mahahalagang file dito. Buksan ang app na Mga File para magsimula.</translation> +<translation id="6182592640011875895">Buksan ang desk</translation> <translation id="619279033188484792">Tingnan ang mga kamakailang larawan, media, at notification ng iyong telepono sa <ph name="DEVICE_TYPE" /> mo</translation> <translation id="619335566042889110">Ganap na i-charge ngayon</translation> <translation id="6220928844947387476">Puwede mo na ngayong sabay na i-record ang iyong sarili at ang screen mo</translation> @@ -1168,6 +1172,7 @@ <translation id="8052898407431791827">Kinopya sa clipboard</translation> <translation id="8054466585765276473">Kinakalkula ang oras ng baterya.</translation> <translation id="8061464966246066292">Mataas na contrast</translation> +<translation id="8083540854303889870">Naka-save para sa ibang pagkakataon</translation> <translation id="8098591350844501178">Ihinto ang pag-cast ng screen sa <ph name="RECEIVER_NAME" /></translation> <translation id="8113423164597455979">Naka-on lahat</translation> <translation id="8120151603115102514">Walang lock screen ang iyong telepono. Para i-unlock ang iyong Chromebook, ilagay ang password.</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index 9366895..1323507 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Horizontal</translation> <translation id="4735498845456076464">Le raccourci-clavier <ph name="LAUNCHER_KEY_NAME" />+Chiffre a été modifié. Pour utiliser les touches de fonction, appuyez sur la touche <ph name="LAUNCHER_KEY_NAME" /> ainsi que sur une touche de la rangée du haut.</translation> <translation id="473775607612524610">Mise à jour</translation> +<translation id="4752784485658729358">Vous pouvez utiliser jusqu'à six bureaux. Retirez un bureau pour en enregistrer un nouveau.</translation> <translation id="4759238208242260848">Téléchargements</translation> <translation id="4774338217796918551">Reviens demain à <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Mot de passe pour <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index ac3a7aa5..8f2bd1d 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Horizontal</translation> <translation id="4735498845456076464">Le raccourci clavier <ph name="LAUNCHER_KEY_NAME" />+Chiffre a été modifié. Pour utiliser les touches de fonction, appuyez sur la touche <ph name="LAUNCHER_KEY_NAME" /> et sur une touche de la rangée supérieure.</translation> <translation id="473775607612524610">Mettre à jour</translation> +<translation id="4752784485658729358">Seuls six bureaux enregistrés sont autorisés. Supprimez un bureau pour en enregistrer un nouveau.</translation> <translation id="4759238208242260848">Téléchargements</translation> <translation id="4774338217796918551">Revenez demain à <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Mot de passe de <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index 24c4dbf..cc3f258f 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -638,6 +638,7 @@ <translation id="4734965478015604180">Horizontal</translation> <translation id="4735498845456076464">O atallo de teclado <ph name="LAUNCHER_KEY_NAME" /> + número cambiou. Para usar as teclas de función, preme <ph name="LAUNCHER_KEY_NAME" /> + unha das teclas da fila superior.</translation> <translation id="473775607612524610">Actualizar</translation> +<translation id="4752784485658729358">Só se poden gardar 6 escritorios. Para gardar un novo, antes tes que quitar un.</translation> <translation id="4759238208242260848">Descargas</translation> <translation id="4774338217796918551">Volve mañá á seguinte hora: <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Contrasinal de <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 62ecf5c..5f9f037 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">ઍપ, એક્સ્ટેન્શન અને થીમ ઇન્સ્ટૉલ કરો</translation> <translation id="2977598380246111477">આગલો નંબર</translation> <translation id="2981684127883932071">સૂચનો બતાવી રહ્યાં છીએ</translation> +<translation id="2985148236010982088">બધી ઍપ જુઓ</translation> <translation id="2992327365391326550">ડિવાઇસનું માઇક્રોફોન બટન બંધ છે.</translation> <translation id="2995447421581609334">કાસ્ટ ઉપકરણો બતાવો.</translation> <translation id="2996462380875591307">ડૉક કરેલું મૅગ્નિફાયર ચાલુ કર્યું. ટૉગલ કરવાનું બંધ કરવા માટે ફરીથી Ctrl+Search+D દબાવો.</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917">આ ડિવાઇસ પર <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> અને વધુ <ph name="UNAVAILABLE_APPS_COUNT" /> ઍપ ઉપલબ્ધ નથી.</translation> <translation id="3735740477244556633">આ પ્રમાણે સૉર્ટ કરો</translation> <translation id="3742055079367172538">સ્ક્રીનશૉટ લેવાયો</translation> +<translation id="3761848338953536304">તમે 'સિમ કાર્ડ લૉક કરો' સેટિંગ બંધ કરો એવી વિનંતી તમારા ઍડમિનિસ્ટ્રેટર કરી રહ્યાં છે</translation> <translation id="3765841986579723851">આજે ફેરફાર કરવામાં આવ્યો હતો</translation> <translation id="3771549900096082774">ઉચ્ચ કોન્ટ્રાસ્ટ મોડ</translation> <translation id="3773700760453577392">એડમિને <ph name="USER_EMAIL" /> માટે એકથી વધુ સાઇન ઇનને નામંજૂર કર્યું છે. ચાલુ રાખવા માટે બધા વપરાશકર્તાઓએ સાઇન આઉટ કરવું જરૂરી છે.</translation> @@ -828,6 +830,7 @@ <translation id="598407983968395253">નમૂનાનો ઉપયોગ કરો</translation> <translation id="598882571027504733">અપડેટ મેળવવા માટે, તમારી Chromebookને જોડાયેલ કીબોર્ડ સાથે ફરીથી શરૂ કરો.</translation> <translation id="5992218262414051481">હાઇ કોન્ટ્રાસ્ટ મોડ ચાલુ કર્યો. ટૉગલ બંધ કરવા માટે ફરીથી Ctrl+Search+H ફરીથી દબાવો.</translation> +<translation id="6009656393242168182">તમારું 'સિમ કાર્ડ લૉક કરો' સેટિંગ બંધ કરો</translation> <translation id="6012623610530968780"><ph name="SELECTED_PAGE" /> પેજમાંનું <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">મીરર મોડથી બહાર નીકળે છે</translation> <translation id="602001110135236999">ડાબે સ્ક્રોલ કરો</translation> @@ -862,6 +865,7 @@ <translation id="6165508094623778733">વધુ જાણો</translation> <translation id="6166852626429024716">તમારા ડિવાઇસ, ઍપ, સેટિંગ અને વેબ પર શોધો...</translation> <translation id="6179832488876878285">તમે તમારી મહત્ત્વની ફાઇલો અહીં પિન કરી શકો છો. શરૂ કરવા માટે Files ઍપ ખોલો.</translation> +<translation id="6182592640011875895">ડેસ્ક ખોલો</translation> <translation id="619279033188484792">તમારા <ph name="DEVICE_TYPE" /> પર તમારા ફોનના તાજેતરના ફોટા, મીડિયા અને નોટિફિકેશન જુઓ</translation> <translation id="619335566042889110">હવે પૂર્ણ ચાર્જ કરો</translation> <translation id="6220928844947387476">હવે તમે તમારું અને તમારી સ્ક્રીનનું રેકોર્ડિંગ એક સાથે કરી શકો છો</translation> @@ -1168,6 +1172,7 @@ <translation id="8052898407431791827">ક્લિપબોર્ડ પર કૉપિ કર્યો</translation> <translation id="8054466585765276473">બેટરી સમયની ગણના કરે છે.</translation> <translation id="8061464966246066292">ઉચ્ચ કોન્ટ્રાસ્ટ</translation> +<translation id="8083540854303889870">પછીના માટે સાચવેલી</translation> <translation id="8098591350844501178"><ph name="RECEIVER_NAME" /> પર સ્ક્રીન કાસ્ટ કરવાનું રોકો</translation> <translation id="8113423164597455979">ચાલુ, બધી ઍપ</translation> <translation id="8120151603115102514">તમારા ફોનમાં લૉક સ્ક્રીનની સુવિધા ચાલુ નથી. તમારી Chromebook અનલૉક કરવા માટે પાસવર્ડ દાખલ કરો.</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index 0cb55641..788e4d2 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Vodoravno</translation> <translation id="4735498845456076464">Promijenjen je tipkovni prečac <ph name="LAUNCHER_KEY_NAME" /> + broj. Da biste upotrijebili tipke funkcija, pritisnite tipku <ph name="LAUNCHER_KEY_NAME" /> + tipku u gornjem redu.</translation> <translation id="473775607612524610">Ažuriraj</translation> +<translation id="4752784485658729358">Dopušteno je samo 6 spremljenih radnih površina. Uklonite jednu radnu površinu da biste spremili novu.</translation> <translation id="4759238208242260848">Preuzimanje</translation> <translation id="4774338217796918551">Vrati se sutra u <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Zaporka za adresu <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index e20b10e7..97256bda 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">Տեղադրել հավելվածներ, ընդլայնումներ և թեմաներ</translation> <translation id="2977598380246111477">Հաջորդ համարը</translation> <translation id="2981684127883932071">Ցուցադրվում են առաջարկները</translation> +<translation id="2985148236010982088">Դիտել բոլոր հավելվածները</translation> <translation id="2992327365391326550">Սարքի խոսափողի կոճակն անջատված է։</translation> <translation id="2995447421581609334">Ցուցադրել հեռարձակման սարքերը</translation> <translation id="2996462380875591307">Ամրացված խոշորացույցը միացավ: Այն անջատելու համար նորից սեղմեք Ctrl+Search+D:</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" /> և <ph name="UNAVAILABLE_APPS_TWO" /> հավելվածներն ու ևս <ph name="UNAVAILABLE_APPS_COUNT" /> հավելված տեղադրված չեն այս սարքում։</translation> <translation id="3735740477244556633">Դասավորել ըստ</translation> <translation id="3742055079367172538">Սքրինշոթը ստեղծված է</translation> +<translation id="3761848338953536304">Ձեր ադմինիստրատորը պահանջում է, որ անջատեք SIM քարտի կողպման կարգավորումը</translation> <translation id="3765841986579723851">Այսօր փոփոխել եք</translation> <translation id="3771549900096082774">Բարձր կոնտրաստով ռեժիմ</translation> <translation id="3773700760453577392">Ադմինիստրատորն արգելել է բազմակի մուտքը <ph name="USER_EMAIL" />-ի հաշվի համար: Շարունակելու համար բոլոր օգտատերերը պետք է դուրս գրվեն:</translation> @@ -637,6 +639,7 @@ <translation id="4734965478015604180">Հորիզոնական</translation> <translation id="4735498845456076464">«<ph name="LAUNCHER_KEY_NAME" /> + թիվ» ստեղնային դյուրանցումը փոփոխվել է։ Գործառույթային ստեղների գործողություններն օգտագործելու համար սեղմեք «<ph name="LAUNCHER_KEY_NAME" /> + ստեղն» դյուրանցումը վերևի շարքում։</translation> <translation id="473775607612524610">Թարմացնել</translation> +<translation id="4752784485658729358">Թույլատրվում է առավելագույնը 6 պահված աշխատասեղան։ Նոր աշխատասեղան պահելու համար հեռացրեք մեկ ուրիշը։</translation> <translation id="4759238208242260848">Ներբեռնումներ</translation> <translation id="4774338217796918551">Սարքը հասանելի կլինի վաղը, <ph name="COME_BACK_TIME" />։</translation> <translation id="4776917500594043016">Գաղտնաբառ <ph name="USER_EMAIL_ADDRESS" />-ի համար</translation> @@ -827,6 +830,7 @@ <translation id="598407983968395253">Օգտագործել ձևանմուշը</translation> <translation id="598882571027504733">Թարմացումը տեղադրելու համար վերագործարկեք Chromebook-ը՝ առանց ստեղնաշարն անջատելու։</translation> <translation id="5992218262414051481">Բարձր կոնտրաստի ռեժիմը միացավ: Այն անջատելու համար նորից սեղմեք Ctrl+Search+H:</translation> +<translation id="6009656393242168182">Անջատեք ձեր SIM քարտի կողպման կարգավորումը</translation> <translation id="6012623610530968780">Էջ <ph name="SELECTED_PAGE" />/<ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Ելք հայելային ռեժիմից</translation> <translation id="602001110135236999">Ոլորել ձախ</translation> @@ -861,6 +865,7 @@ <translation id="6165508094623778733">Իմանալ ավելին</translation> <translation id="6166852626429024716">Որոնեք սարքում, հավելվածներում, կարգավորումներում, համացանցում…</translation> <translation id="6179832488876878285">Դուք կարող եք այստեղ ամրացնել ձեր կարևոր ֆայլերը։ Սկսելու համար բացեք «Ֆայլեր» հավելվածը։</translation> +<translation id="6182592640011875895">Բացել աշխատասեղանը</translation> <translation id="619279033188484792">Թույլ է տալիս հեռախոսում վերջերս ավելացված լուսանկարները, մեդիա ֆայլերը և ծանուցումները դիտել <ph name="DEVICE_TYPE" /> սարքում։</translation> <translation id="619335566042889110">Լիցքավորել ամբողջությամբ հիմա</translation> <translation id="6220928844947387476">Այժմ դուք կարող եք միաժամանակ տեսագրել ձեզ և ձեր էկրանը</translation> @@ -1167,6 +1172,7 @@ <translation id="8052898407431791827">Պատճենվեց սեղմատախտակին</translation> <translation id="8054466585765276473">Մարտկոցի ժամանակի հաշվարկում:</translation> <translation id="8061464966246066292">Բարձր կոնտրաստ</translation> +<translation id="8083540854303889870">Պահված է հետագայի համար</translation> <translation id="8098591350844501178">Դադարեցնել էկրանի հեռարձակումը <ph name="RECEIVER_NAME" />-ին</translation> <translation id="8113423164597455979">Բոլորը միացված են</translation> <translation id="8120151603115102514">Հեռախոսում կարգավորված չէ կողպէկրան։ Ձեր Chromebook-ն ապակողպելու համար մուտքագրեք գաղտնաբառը։</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index f34a86a5..7f66d41 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">Instal aplikasi, ekstensi, dan tema</translation> <translation id="2977598380246111477">Nomor berikutnya</translation> <translation id="2981684127883932071">Menampilkan saran</translation> +<translation id="2985148236010982088">Lihat semua aplikasi</translation> <translation id="2992327365391326550">Tombol mikrofon perangkat dinonaktifkan.</translation> <translation id="2995447421581609334">Tampilkan perangkat transmisi.</translation> <translation id="2996462380875591307">Kaca Pembesar Tersemat diaktifkan. Tekan Ctrl+Search+D lagi untuk menonaktifkannya.</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, dan <ph name="UNAVAILABLE_APPS_COUNT" /> lainnya tidak ada di perangkat ini.</translation> <translation id="3735740477244556633">Urutkan menurut</translation> <translation id="3742055079367172538">Screenshot telah diambil</translation> +<translation id="3761848338953536304">Administrator meminta Anda untuk menonaktifkan setelan Kunci SIM</translation> <translation id="3765841986579723851">Diedit hari ini</translation> <translation id="3771549900096082774">Mode Kontras Tinggi</translation> <translation id="3773700760453577392">Administrator telah melarang fitur login multipel untuk <ph name="USER_EMAIL" />. Semua pengguna harus logout untuk melanjutkan.</translation> @@ -637,6 +639,7 @@ <translation id="4734965478015604180">Horizontal</translation> <translation id="4735498845456076464">Pintasan keyboard <ph name="LAUNCHER_KEY_NAME" /> + Angka telah diubah. Untuk menggunakan tombol fungsi, tekan tombol <ph name="LAUNCHER_KEY_NAME" /> + tombol di baris atas.</translation> <translation id="473775607612524610">Perbarui</translation> +<translation id="4752784485658729358">Hanya diizinkan menyimpan 6 desktop. Hapus satu desktop untuk menambahkan yang baru.</translation> <translation id="4759238208242260848">Download</translation> <translation id="4774338217796918551">Gunakan lagi besok pukul <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Sandi untuk <ph name="USER_EMAIL_ADDRESS" /></translation> @@ -827,6 +830,7 @@ <translation id="598407983968395253">Gunakan template</translation> <translation id="598882571027504733">Untuk mendapatkan update, nyalakan ulang Chromebook dengan keyboard dalam keadaan terhubung.</translation> <translation id="5992218262414051481">Mode Kontras Tinggi diaktifkan. Tekan Ctrl+Search+H lagi untuk menonaktifkannya.</translation> +<translation id="6009656393242168182">Nonaktifkan setelan Kunci SIM Anda</translation> <translation id="6012623610530968780">Halaman <ph name="SELECTED_PAGE" /> dari <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Keluar dari mode transmisi</translation> <translation id="602001110135236999">Scroll ke kiri</translation> @@ -861,6 +865,7 @@ <translation id="6165508094623778733">Pelajari selengkapnya</translation> <translation id="6166852626429024716">Telusuri perangkat, aplikasi, setelan, web ...</translation> <translation id="6179832488876878285">Anda dapat menyematkan file penting di sini. Buka aplikasi File untuk memulai.</translation> +<translation id="6182592640011875895">Buka desktop</translation> <translation id="619279033188484792">Lihat foto terbaru, media, dan notifikasi dari ponsel Anda di <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Diisi penuh sekarang</translation> <translation id="6220928844947387476">Anda kini dapat merekam diri Anda dan layar secara bersamaan</translation> @@ -1167,6 +1172,7 @@ <translation id="8052898407431791827">Disalin ke papan klip</translation> <translation id="8054466585765276473">Menghitung masa pakai baterai.</translation> <translation id="8061464966246066292">Kontras tinggi</translation> +<translation id="8083540854303889870">Disimpan untuk nanti</translation> <translation id="8098591350844501178">Hentikan casting layar ke <ph name="RECEIVER_NAME" /></translation> <translation id="8113423164597455979">Aktif, semua</translation> <translation id="8120151603115102514">Ponsel Anda tidak memiliki layar kunci. Untuk membuka kunci Chromebook, masukkan sandi.</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index cae594a4..70a9858 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Lárétt</translation> <translation id="4735498845456076464">Flýtilyklinum „<ph name="LAUNCHER_KEY_NAME" /> + tölustafur“ hefur verið breytt. Ýttu á <ph name="LAUNCHER_KEY_NAME" />-lykilinn + lykil í efstu röð til að nota aðgerðalyklana.</translation> <translation id="473775607612524610">Uppfæra</translation> +<translation id="4752784485658729358">Aðeins 6 vistuð skrifborð leyfð. Fjarlægðu skrifborð til að vista nýtt.</translation> <translation id="4759238208242260848">Niðurhal</translation> <translation id="4774338217796918551">Komdu aftur á morgun klukkan <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Aðgangsorð fyrir <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index 30d75ff..c70d83c1 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">אופקי</translation> <translation id="4735498845456076464">מקשי הקיצור <ph name="LAUNCHER_KEY_NAME" /> + ספרה הוחלפו. כדי לדמות את הפעולה של מקשי הפונקציה, יש להקיש על המקש <ph name="LAUNCHER_KEY_NAME" /> + מקש כלשהו בשורה העליונה של המקלדת.</translation> <translation id="473775607612524610">עדכון</translation> +<translation id="4752784485658729358">ניתן לשמור רק 6 שולחנות עבודה וירטואליים. צריך להסיר שולחן עבודה וירטואלי כדי לשמור אחד חדש.</translation> <translation id="4759238208242260848">הורדות</translation> <translation id="4774338217796918551">אפשר לחזור מחר בשעה <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">סיסמה עבור <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index 0848cd9..ab85e4e3 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">ჰორიზონტალური</translation> <translation id="4735498845456076464">კლავიატურის მალსახმობი „<ph name="LAUNCHER_KEY_NAME" /> + ციფრი“ შეიცვალა. ფუნქციების კლავიშებით სარგებლობისთვის დააჭირეთ კლავიშს <ph name="LAUNCHER_KEY_NAME" /> + კლავიშს ზედა მწკრივში.</translation> <translation id="473775607612524610">განახლება</translation> +<translation id="4752784485658729358">დაშვებულია მხოლოდ 6 შენახული სამუშაო მაგიდა. ახლის შესანახად წაშალეთ ერთ-ერთი არსებული.</translation> <translation id="4759238208242260848">ჩამოტვირთვები</translation> <translation id="4774338217796918551">დაბრუნდით ხვალ, <ph name="COME_BACK_TIME" />-ზე.</translation> <translation id="4776917500594043016">პაროლი <ph name="USER_EMAIL_ADDRESS" />-თვის</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index e202c4d..f445afc4 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Көлденең</translation> <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + сан пернелер тіркесімінің функциясы өзгерді. Функциялық пернелерді пайдалану үшін <ph name="LAUNCHER_KEY_NAME" /> пернесі + жоғарғы қатар пернесі тіркесімін басыңыз.</translation> <translation id="473775607612524610">Жаңарту</translation> +<translation id="4752784485658729358">Тек сақталған 6 жұмыс үстеліне рұқсат етіледі. Жаңа жұмыс үстелін сақтау үшін олардың бірін өшіріңіз.</translation> <translation id="4759238208242260848">Жүктеп алынғандар</translation> <translation id="4774338217796918551">Ертең сағат <ph name="COME_BACK_TIME" /> шамасында қайта қолдануыңызға болады.</translation> <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> құпия сөзі</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index 07d4468d..50be6519 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">ಅಡ್ಡ</translation> <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + ಸಂಖ್ಯೆ ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಬದಲಿಸಲಾಗಿದೆ. ಫಂಕ್ಷನ್-ಕೀಗಳನ್ನು ಬಳಸಲು, <ph name="LAUNCHER_KEY_NAME" /> ಕೀ + ಮೇಲಿನ ಸಾಲಿನಲ್ಲಿರುವ ಒಂದು ಕೀ ಅನ್ನು ಒತ್ತಿ.</translation> <translation id="473775607612524610">ಅಪ್ಡೇಟ್</translation> +<translation id="4752784485658729358">6 ಉಳಿಸಿದ ಡೆಸ್ಕ್ಗಳನ್ನು ಮಾತ್ರ ಅನುಮತಿಸಲಾಗಿದೆ. ಹೊಸದನ್ನು ಉಳಿಸಲು ಡೆಸ್ಕ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ.</translation> <translation id="4759238208242260848">ಡೌನ್ಲೋಡ್ಗಳು</translation> <translation id="4774338217796918551">ನಾಳೆ <ph name="COME_BACK_TIME" /> ಸಮಯಕ್ಕೆ ಹಿಂತಿರುಗಿ.</translation> <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> ಗಾಗಿ ಪಾಸ್ವರ್ಡ್</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index e7280abc..99158db1 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -866,7 +866,7 @@ <translation id="6166852626429024716">Түзмөктөн, колдонмолордон, жөндөөлөрдөн жана Интернеттен издеңиз...</translation> <translation id="6179832488876878285">Маанилүү файлдарыңызды бул жерге кадап койсоңуз болот. Баштоо үчүн Файлдар колдонмосун ачыңыз.</translation> <translation id="6182592640011875895">Иш тактаны ачуу</translation> -<translation id="619279033188484792">Телефонуңуздагы соңку сүрөттөрдү, медианы жана билдирмелерди <ph name="DEVICE_TYPE" /> түзмөгүңүздөн көрөсүз</translation> +<translation id="619279033188484792">Телефонуңуздагы соңку сүрөттөрдү, медиа файлдарды жана билдирмелерди <ph name="DEVICE_TYPE" /> түзмөгүңүздөн көрөсүз</translation> <translation id="619335566042889110">Азыр толук кубаттоо</translation> <translation id="6220928844947387476">Эми бир эле убакта өзүңүздү жана экранды жаздыра аласыз</translation> <translation id="622484624075952240">Төмөн</translation> @@ -978,7 +978,7 @@ <translation id="6884665277231944629">Бүгүнкү күнгө кайтуу</translation> <translation id="6886172995547742638"><ph name="DEVICE_TYPE" /> түзмөгүңүз начар иштеши мүмкүн. Тастыкталган <ph name="PREFERRED_MINIMUM_POWER" /> Вт же андан жогору USB-C кубаттагыч адаптерин колдонуңуз.</translation> <translation id="688631446150864480">Терезелерди которуштуруу үчүн Ылдый жебени басыңыз</translation> -<translation id="6891721121089053234">Телефонуңуздагы соңку сүрөттөрдү, медианы жана колдонмолорду <ph name="DEVICE_TYPE" /> түзмөгүндө көрүңүз</translation> +<translation id="6891721121089053234">Телефонуңуздагы соңку сүрөттөрдү, медиа файлдарды жана колдонмолорду <ph name="DEVICE_TYPE" /> түзмөгүндө көрүңүз</translation> <translation id="6896758677409633944">Көчүрүү</translation> <translation id="6901883536534621389">Өтүү үчүн жаңсап көрүңүз</translation> <translation id="6919251195245069855">Акылдуу картаңыз таанылган жок. Кайталап көрүңүз.</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index ccc60488..2a6bb86 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">ລວງນອນ</translation> <translation id="4735498845456076464">ມີການປ່ຽນຄີລັດ <ph name="LAUNCHER_KEY_NAME" /> + ຕົວເລກ. ເພື່ອໃຊ້ປຸ່ມຟັງຊັນ, ໃຫ້ກົດປຸ່ມ <ph name="LAUNCHER_KEY_NAME" /> + ປຸ່ມໃດໜຶ່ງຢູ່ແຖວເທິງສຸດ.</translation> <translation id="473775607612524610">ອັບເດດ</translation> +<translation id="4752784485658729358">ອະນຸຍາດໂຕະທີ່ບັນທຶກໄວ້ 6 ໂຕະເທົ່ານັ້ນ. ກະລຸນາລຶບໂຕະໃດໜຶ່ງອອກເພື່ອບັນທຶກໂຕະໃໝ່.</translation> <translation id="4759238208242260848">ດາວໂຫຼດ</translation> <translation id="4774338217796918551">ກັບຄືນມາມື້ອື່ນໃນເວລາ <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">ລະຫັດຜ່ານສໍາລັບ <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index 7de129f..53308a6 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Horizontaliai</translation> <translation id="4735498845456076464">Pakeistas spartusis klavišas <ph name="LAUNCHER_KEY_NAME" /> + skaičiaus klavišas. Jei norite naudoti funkcijų klavišus, paspauskite <ph name="LAUNCHER_KEY_NAME" /> klavišą + klavišą viršutinėje eilutėje.</translation> <translation id="473775607612524610">Atnaujinti</translation> +<translation id="4752784485658729358">Leidžiami tik šeši išsaugoti darbalaukiai. Pašalinkite darbalaukį, kad išsaugotumėte naują.</translation> <translation id="4759238208242260848">Atsisiuntimai</translation> <translation id="4774338217796918551">Grįžkite rytoj <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> slaptažodis</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index 2fb41a3..25b0d29 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -176,6 +176,7 @@ <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation> <translation id="1972950159383891558">ഹായ്, <ph name="USERNAME" /></translation> <translation id="1978498689038657292">ടെക്സ്റ്റ് ഇൻപുട്ട്</translation> +<translation id="1982717156487272186">മുമ്പത്തെ ആഴ്ച കാണിക്കുക</translation> <translation id="1989113344093894667">ഉള്ളടക്കം ക്യാപ്ചർ ചെയ്യാനാകില്ല</translation> <translation id="1990046457226896323">സംഭാഷണ ഫയലുകൾ ഡൗൺലോഡ് ചെയ്തു</translation> <translation id="1993072747612765854">ഏറ്റവും പുതിയ <ph name="SYSTEM_APP_NAME" /> അപ്ഡേറ്റിനെ കുറിച്ച് കൂടുതലറിയുക</translation> @@ -620,6 +621,7 @@ <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, <ph name="RATING_SCORE" /> നക്ഷത്ര റേറ്റിംഗ്</translation> <translation id="4633185660152240791">{0,plural, =1{ഒരു ദിവസത്തിനുള്ളിൽ മുമ്പത്തെ പതിപ്പിലേക്ക് ഉപകരണം മാറ്റുക}other{# ദിവസത്തിനുള്ളിൽ മുമ്പത്തെ പതിപ്പിലേക്ക് ഉപകരണം മാറ്റുക}}</translation> <translation id="4642092649622328492">ഭാഗിക സ്ക്രീൻഷോട്ട് എടുക്കുക</translation> +<translation id="4644727592819780893">മേഖല ക്യാമറയ്ക്ക് യോജിക്കുന്നതിലും വളരെ ചെറുതാണ്</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, ആപ്പ് നിർദ്ദേശം</translation> <translation id="4657775630156561295">ഇനിപ്പറയുന്ന നിർദ്ദേശം നിങ്ങളുടെ അക്കൗണ്ടിന്റെ നിർദ്ദേശ ചരിത്രത്തിൽ നിന്ന് ശാശ്വതമായി നീക്കം ചെയ്യും: @@ -774,6 +776,7 @@ <translation id="5673434351075758678">നിങ്ങളുടെ ക്രമീകരണം സമന്വയിപ്പിച്ചതിന് ശേഷം, "<ph name="FROM_LOCALE" />" എന്നതിൽ നിന്ന്"<ph name="TO_LOCALE" />" എന്നതിലേക്ക്.</translation> <translation id="5675363643668471212">ഷെൽഫ് ഇനം</translation> <translation id="5677928146339483299">തടഞ്ഞു</translation> +<translation id="5678564054339031017">അടുത്ത ആഴ്ചത്തെ കാണിക്കുക</translation> <translation id="5679050765726761783">കുറഞ്ഞ പവറുള്ള അഡാപ്റ്റർ കണക്റ്റ് ചെയ്തു</translation> <translation id="5682642926269496722">നിലവിലെ ഉപയോക്തൃ അക്കൗണ്ടിന് Google അസിസ്റ്റന്റ് ലഭ്യമല്ല.</translation> <translation id="5689633613396158040">മങ്ങിയ വെളിച്ചത്തിൽ സ്ക്രീനിൽ നോക്കുന്നതോ വായിക്കുന്നതോ നൈറ്റ് ലൈറ്റ് എളുപ്പമാക്കുന്നു. നൈറ്റ് ലൈറ്റ് പൂർണ്ണമായി ഓഫാകുകയോ ഓണാകുകയോ ചെയ്യേണ്ട സമയം മാറ്റാൻ ടാപ്പ് ചെയ്യുക.</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index bb7fbf4..976fd17 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -176,6 +176,7 @@ <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation> <translation id="1972950159383891558">Сайн уу, <ph name="USERNAME" /></translation> <translation id="1978498689038657292">Текстээр оруулах</translation> +<translation id="1982717156487272186">Өмнөх долоо хоногийг харуулах</translation> <translation id="1989113344093894667">Контентын зургийг авах боломжгүй</translation> <translation id="1990046457226896323">Ярианы файлуудыг татсан</translation> <translation id="1993072747612765854">Хамгийн сүүлийн <ph name="SYSTEM_APP_NAME" /> шинэчлэлтийн талаар дэлгэрэнгүй үзэх</translation> @@ -326,6 +327,7 @@ <translation id="2970920913501714344">Аппууд, өргөтгөлүүд болон загваруудыг суулгах</translation> <translation id="2977598380246111477">Дараагийн тоо</translation> <translation id="2981684127883932071">Зөвлөмжийг үзүүлж байна</translation> +<translation id="2985148236010982088">Бүх аппыг харах</translation> <translation id="2992327365391326550">Төхөөрөмжийн микрофоны товчлуур унтраалттай байна.</translation> <translation id="2995447421581609334">Дамжуулагч төхөөрөмжийг харуулна уу.</translation> <translation id="2996462380875591307">Суурилуулсан томруулагчийг идэвхжүүлсэн. Үүнийг асаах/унтраахын тулд Ctrl+Search+D-г дахин дарна уу.</translation> @@ -464,6 +466,7 @@ <translation id="3726171378575546917">Энэ төхөөрөмж дээр <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> болон өөр <ph name="UNAVAILABLE_APPS_COUNT" /> апп байхгүй байна.</translation> <translation id="3735740477244556633">Дараахаар эрэмбэлэх</translation> <translation id="3742055079367172538">Дэлгэцний зургийг авсан болно (Screenshot)</translation> +<translation id="3761848338953536304">Танай администратор таныг SIM түгжих тохиргоог унтраахыг хүсэж байна</translation> <translation id="3765841986579723851">Өнөөдөр зассан</translation> <translation id="3771549900096082774">Өндөр ялгаралтай горим</translation> <translation id="3773700760453577392">Админ <ph name="USER_EMAIL" />-д олон зэрэг нэвтрэхийг зөвшөөрөөгүй байна. @@ -621,6 +624,7 @@ <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, <ph name="RATING_SCORE" /> одтой үнэлгээ</translation> <translation id="4633185660152240791">{0,plural, =1{Төхөөрөмжийг 1 хоногийн дотор өмнөх хувилбар луу нь өөрчилнө үү}other{Төхөөрөмжийг # хоногийн дотор өмнөх хувилбар луу нь өөрчилнө үү}}</translation> <translation id="4642092649622328492">Дэлгэцийн зургийг хэсэгчлэн дарах</translation> +<translation id="4644727592819780893">Бүс нь камерыг багтаахад хэт жижиг байна</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, аппын зөвлөмж</translation> <translation id="4657775630156561295">Дараах зөвлөмжийг таны бүртгэлийн зөвлөмжийн түүхээс бүрмөсөн хасна: @@ -775,6 +779,7 @@ <translation id="5673434351075758678">Тохиргоогоо синк хийсний дараа "<ph name="FROM_LOCALE" />"-с "<ph name="TO_LOCALE" />" руу шилжүүлнэ.</translation> <translation id="5675363643668471212">Shelf зүйл</translation> <translation id="5677928146339483299">Хаагдсан</translation> +<translation id="5678564054339031017">Дараагийн долоо хоногийг харуулах</translation> <translation id="5679050765726761783">Бага тэжээлийн адаптерыг холбосон</translation> <translation id="5682642926269496722">Одоогийн хэрэглэгчийн бүртгэл дээр Google Туслах боломжгүй байна.</translation> <translation id="5689633613396158040">Шөнийн гэрэл нь бүдэг гэрэлтэй үед дэлгэцээ харах эсвэл уншихад илүү хялбар болгодог. Аль цагт Шөнийн гэрлийг бүрмөсөн асааж эсвэл унтраахыг өөрчлөхийн тулд товшино уу.</translation> @@ -829,6 +834,7 @@ <translation id="598407983968395253">Загварыг ашиглах</translation> <translation id="598882571027504733">Шинэчлэлт авахын тулд Chromebook-ээ хавсаргасан гараар шинэчилнэ үү.</translation> <translation id="5992218262414051481">Өндөр ялгаралтай горимыг идэвхжүүлсэн. Үүнийг унтраахын тулд Ctrl+Search+H-г дахин дарна уу.</translation> +<translation id="6009656393242168182">SIM-н түгжээний тохиргоогоо идэвхгүй болгох</translation> <translation id="6012623610530968780">Хуудас <ph name="TOTAL_PAGE_NUM" />-н <ph name="SELECTED_PAGE" /></translation> <translation id="6018164090099858612">Толь горимоос гарч байна</translation> <translation id="602001110135236999">Зүүн тийш гүйлгэх</translation> @@ -863,6 +869,7 @@ <translation id="6165508094623778733">Нэмэлт мэдээлэл авах</translation> <translation id="6166852626429024716">Төхөөрөмж, апп, тохиргоо, вебээс хайх...</translation> <translation id="6179832488876878285">Та чухал файлуудаа энд бэхлэх боломжтой. Эхлүүлэхийн тулд Файлс аппыг нээнэ үү.</translation> +<translation id="6182592640011875895">Дэлгэцийг нээх</translation> <translation id="619279033188484792"><ph name="DEVICE_TYPE" /> дээрээ утасныхаа саяхны зургууд, медиа болон мэдэгдлүүдийг харна уу</translation> <translation id="619335566042889110">Одоо бүрэн цэнэглээрэй</translation> <translation id="6220928844947387476">Та одоо өөрийгөө болон дэлгэцээ зэрэг бичих боломжтой</translation> @@ -1169,6 +1176,7 @@ <translation id="8052898407431791827">Түр санах ойд хуулсан</translation> <translation id="8054466585765276473">Цэнэгний хугацааг тооцож байна.</translation> <translation id="8061464966246066292">Өндөр ялгарал</translation> +<translation id="8083540854303889870">Дараа ашиглахаар хадгалсан</translation> <translation id="8098591350844501178">Дэлгэцийг <ph name="RECEIVER_NAME" />-д дамжуулахыг зогсоох</translation> <translation id="8113423164597455979">Бүх аппд и.тэй</translation> <translation id="8120151603115102514">Таны утсанд түгжигдсэн дэлгэц байхгүй байна. Chromebook-нхээ түгжээг тайлахын тулд нууц үг оруулна уу.</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index 611611b3..1ff7e507 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">ॲप्स, एक्स्टेंशन आणि थीम इंस्टॉल करा</translation> <translation id="2977598380246111477">पुढील नंबर</translation> <translation id="2981684127883932071">सूचना दाखवत आहे</translation> +<translation id="2985148236010982088">सर्व अॅप्स पहा</translation> <translation id="2992327365391326550">डिव्हाइसच्या मायक्रोफोनचे बटण बंद केले आहे.</translation> <translation id="2995447421581609334">कास्ट डिव्हाइस दाखवा.</translation> <translation id="2996462380875591307">डॉक केलेले मॅग्निफायर सुरू केले. ते टॉगल करून बंद करण्यासाठी पुन्हा Ctrl+Search+D दाबा.</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> आणि<ph name="UNAVAILABLE_APPS_COUNT" /> ही ॲप्स या डिव्हाइसवर उपलब्ध नाहीत.</translation> <translation id="3735740477244556633">यानुसार क्रमाने लावा</translation> <translation id="3742055079367172538">स्क्रीनशॉट घेतला</translation> +<translation id="3761848338953536304">तुमच्या अॅडमिनिस्ट्रेटरने तुम्हाला लॉक सिम सेटिंग बंद करण्याची विनंती केली आहे</translation> <translation id="3765841986579723851">आज संपादित केलेली</translation> <translation id="3771549900096082774">उच्च कॉन्ट्रास्ट मोड</translation> <translation id="3773700760453577392">ॲडमिनिस्ट्रेटरने <ph name="USER_EMAIL" /> साठी एकाहून अधिक साइन-इन बंद केले आहे. सुरू ठेवण्यासाठी सर्व वापरकर्त्यांनी साइन आउट करणे आवश्यक आहे.</translation> @@ -828,6 +830,7 @@ <translation id="598407983968395253">टेंप्लेट वापरा</translation> <translation id="598882571027504733">अपडेट करण्यासाठी, संलग्न केलेल्या कीबोर्डसह तुमचे Chromebook रीस्टार्ट करा.</translation> <translation id="5992218262414051481">उच्च तीव्रता मोड सुरू केला आहे. तो बंदवर टॉगल करण्यासाठी Ctrl+Search+H दाबा.</translation> +<translation id="6009656393242168182">तुमची सिम लॉक सेटिंग बंद करा</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" /> पैकी <ph name="SELECTED_PAGE" /> पेज</translation> <translation id="6018164090099858612">मिरर मोडमधून बाहेर पडत आहे</translation> <translation id="602001110135236999">डावीकडे स्क्रोल करा</translation> @@ -862,6 +865,7 @@ <translation id="6165508094623778733">अधिक जाणून घ्या</translation> <translation id="6166852626429024716">तुमच्या डिव्हाइस, अॅप्स, सेटिंग्ज, वेबवर शोधा...</translation> <translation id="6179832488876878285">तुम्ही तुमच्या महत्त्वाच्या फाइल येथे पिन करू शकता. सुरुवात करण्यासाठी Files अॅप उघडा.</translation> +<translation id="6182592640011875895">डेस्क उघडा</translation> <translation id="619279033188484792">तुमच्या <ph name="DEVICE_TYPE" /> वर तुमच्या फोनमधील अलीकडील फोटो, मीडिया आणि सूचना पहा</translation> <translation id="619335566042889110">आता पूर्णपणे चार्ज करा</translation> <translation id="6220928844947387476">तुम्ही आता एकाच वेळी स्वतःला आणि तुमची स्क्रीन रेकॉर्ड करू शकता</translation> @@ -1168,6 +1172,7 @@ <translation id="8052898407431791827">क्लिपबोर्डवर कॉपी केले</translation> <translation id="8054466585765276473">बॅटरी वेळ गणना करत आहे.</translation> <translation id="8061464966246066292">उच्च रंगभेद</translation> +<translation id="8083540854303889870">नंतरसाठी सेव्ह केले</translation> <translation id="8098591350844501178"><ph name="RECEIVER_NAME" /> वर स्क्रीन कास्ट करणे थांबवा</translation> <translation id="8113423164597455979">सुरू, सर्व ॲप</translation> <translation id="8120151603115102514">तुमच्या फोनला लॉक स्क्रीन नाही. तुमचे Chromebook अनलॉक करण्यासाठी, पासवर्ड एंटर करा.</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index a380cf3..4aab26b 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -638,6 +638,7 @@ <translation id="4734965478015604180">Mendatar</translation> <translation id="4735498845456076464">Pintasan papan kekunci <ph name="LAUNCHER_KEY_NAME" /> + Nombor telah berubah. Untuk menggunakan kekunci fungsi, tekan kekunci <ph name="LAUNCHER_KEY_NAME" /> + salah satu kekunci di baris atas.</translation> <translation id="473775607612524610">Kemas kini</translation> +<translation id="4752784485658729358">6 meja sahaja dibenarkan. Alih keluar satu meja untuk menyimpan meja baharu.</translation> <translation id="4759238208242260848">Muat turun</translation> <translation id="4774338217796918551">Datang semula esok pada <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Kata laluan untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 67518241..c8c1959 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">အက်ပ်၊ နောက်ဆက်တွဲနှင့် အပြင်အဆင်များ ထည့်သွင်းနိုင်သည်</translation> <translation id="2977598380246111477">နောက်ထပ် ဂဏန်း</translation> <translation id="2981684127883932071">အကြံပြုချက်များကို ဖော်ပြနေသည်</translation> +<translation id="2985148236010982088">အက်ပ်အားလုံး ကြည့်ရန်</translation> <translation id="2992327365391326550">စက်၏မိုက်ခရိုဖုန်းခလုတ် ပိတ်ထားသည်။</translation> <translation id="2995447421581609334">ကာ့စ်စက်ပစ္စည်းများကို ပြရန်။</translation> <translation id="2996462380875591307">နေရာချထားသည့် မှန်ဘီလူးကို ဖွင့်ထားပါသည်။ ၎င်းကို ပိတ်ရန် Ctrl+Search+D ကို ထပ်မံနှိပ်ပါ။</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917">ဤစက်တွင် <ph name="UNAVAILABLE_APPS_ONE" />၊<ph name="UNAVAILABLE_APPS_TWO" /> နှင့် အခြားအက်ပ်<ph name="UNAVAILABLE_APPS_COUNT" /> ခု မရှိပါ။</translation> <translation id="3735740477244556633">အောက်ပါအတိုင်းစီရန်</translation> <translation id="3742055079367172538">မျက်နှာပြင်ပုံရိပ် ရယူပြီး</translation> +<translation id="3761848338953536304">သင့်စီမံခန့်ခွဲသူက ‘ဆင်းမ်လော့ခ်’ ဆက်တင်ကို ပိတ်ရန် တောင်းဆိုနေသည်</translation> <translation id="3765841986579723851">ယနေ့ ပြင်ဆင်ထားသည်</translation> <translation id="3771549900096082774">အဖြူအမဲခြားနားချက် မြင့်သောမုဒ်</translation> <translation id="3773700760453577392">စီမံခန့်ခွဲသူသည် <ph name="USER_EMAIL" /> အတွက် အကောင့်များစွာ လက်မှတ်ထိုးဝင်ခွင့်ကို ပိတ်ထားသည်။ ရှေ့ဆက်နိုင်ရန်အတွက် အသုံးပြုသူများအားလုံး ထွက်ရပါမည်။</translation> @@ -828,6 +830,7 @@ <translation id="598407983968395253">နမူနာပုံစံ သုံးရန်</translation> <translation id="598882571027504733">အပ်ဒိတ်ရယူနိုင်ရန်အတွက် ကီးဘုတ်ကို ချိတ်ဆက်ထားပြီး Chromebook ကို ပြန်လည်စတင်ပါ။</translation> <translation id="5992218262414051481">ခြားနားမှုမြင့်သည့်မုဒ်ကို ဖွင့်ထားပါသည်။ ၎င်းကို ပိတ်ရန် Ctrl+Search+H ကို ထပ်မံနှိပ်ပါ။</translation> +<translation id="6009656393242168182">သင့် ‘ဆင်းမ်လော့ခ်’ ဆက်တင်ကို ပိတ်ခြင်း</translation> <translation id="6012623610530968780">စာမျက်နှာ <ph name="TOTAL_PAGE_NUM" /> အနက် <ph name="SELECTED_PAGE" /></translation> <translation id="6018164090099858612">ကြေးမုံရိပ်မုဒ်မှ ထွက်နေသည်</translation> <translation id="602001110135236999">ဘယ်သို့ လှိမ့်ရန်</translation> @@ -862,6 +865,7 @@ <translation id="6165508094623778733">ပိုမိုလေ့လာရန်</translation> <translation id="6166852626429024716">သင့်စက်၊ အက်ပ်၊ ဆက်တင်၊ ဝဘ်တို့ကို ရှာပါ...</translation> <translation id="6179832488876878285">သင့်အရေးကြီးဖိုင်များကို ဤနေရာတွင် ပင်ထိုးနိုင်သည်။ စတင်ရန် Files အက်ပ်ကို ဖွင့်ပါ။</translation> +<translation id="6182592640011875895">မျက်နှာပြင်ကို ဖွင့်ရန်</translation> <translation id="619279033188484792">သင့်ဖုန်း၏ မကြာသေးမီက ဓာတ်ပုံ၊ မီဒီယာနှင့် အကြောင်းကြားချက်များကို သင့် <ph name="DEVICE_TYPE" /> တွင် ကြည့်နိုင်သည်</translation> <translation id="619335566042889110">ယခုအားအပြည့်သွင်းရန်</translation> <translation id="6220928844947387476">သင့်စခရင်နှင့် သင့်ကို တစ်ချိန်တည်း ယခု မှတ်တမ်းတင်နိုင်ပါပြီ</translation> @@ -1168,6 +1172,7 @@ <translation id="8052898407431791827">ကလစ်ဘုတ်သို့ မိတ္တူကူးပြီးပြီ</translation> <translation id="8054466585765276473">ဘက်ထရီ အချိန်တွက်နေ</translation> <translation id="8061464966246066292">ခြားနားမှုမြင့်သော</translation> +<translation id="8083540854303889870">နောင်အတွက် သိမ်းထားသည်</translation> <translation id="8098591350844501178"><ph name="RECEIVER_NAME" /> သို့ မျက်နှာပြင်အား ကာစ်လုပ်နေခြင်းကို ရပ်ပါ</translation> <translation id="8113423164597455979">ဖွင့်- အားလုံး</translation> <translation id="8120151603115102514">သင့်ဖုန်းတွင် လော့ခ်မျက်နှာပြင် မရှိပါ။ သင့် Chromebook ကိုလော့ခ်ဖွင့်ရန် စကားဝှက်ထည့်ပါ။</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index 9a07044..81b5d5c 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">एप, विस्तार र विषयवस्तुहरू स्थापना गर्नुहोस्</translation> <translation id="2977598380246111477">अर्को नम्बर</translation> <translation id="2981684127883932071">सुझावहरू देखाउँदै</translation> +<translation id="2985148236010982088">सबै एपहरू हेर्नुहोस्</translation> <translation id="2992327365391326550">डिभाइसको माइक्रोफोन बटन अफ गरिएको छ।</translation> <translation id="2995447421581609334">cast यन्त्रहरू देखाउनुहोस्।</translation> <translation id="2996462380875591307">डक गरिएको म्याग्निफायर सक्षम पारियो। यसलाई निष्क्रिय पार्न फेरि Ctrl+खोज+D कुञ्जी थिच्नुहोस्।</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917">यो डिभाइसमा <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> र <ph name="UNAVAILABLE_APPS_COUNT" /> उपलब्ध छैनन्।</translation> <translation id="3735740477244556633">यसअनुसार क्रमबद्ध गर्नुहोस्</translation> <translation id="3742055079367172538">स्क्रिनसट लिइयो</translation> +<translation id="3761848338953536304">तपाईंका एड्मिन तपाईंलाई SIM लकसम्बन्धी सेटिङ अफ गर्न अनुरोध गरिरहनुभएको छ</translation> <translation id="3765841986579723851">आज सम्पादन गरिएको</translation> <translation id="3771549900096082774">उच्च कन्ट्रास्ट मोड</translation> <translation id="3773700760453577392">कुनै प्रशासकले <ph name="USER_EMAIL" /> बाट एकभन्दा बढी साइन इन गर्ने अनुमति दिनुभएको छैन। जारी राख्न सबै प्रयोगकर्ताहरूले अनिवार्य रूपमा साइन आउट गर्नु पर्छ।</translation> @@ -828,6 +830,7 @@ <translation id="598407983968395253">टेम्प्लेट प्रयोग गर्नुहोस्</translation> <translation id="598882571027504733">अद्यावधिक प्राप्त गर्न, उक्त किबोर्ड जोडिएकै अवस्थामा आफ्नो Chromebook पुनः सुरु गर्नुहोस्।</translation> <translation id="5992218262414051481">उच्च कन्ट्रास्ट मोड सक्षम गरिएको छ। यसलाई टगल गर्दै निष्क्रिय पार्न फेरि Ctrl+Search+H थिच्नुहोस्।</translation> +<translation id="6009656393242168182">आफ्नो SIM लकसम्बन्धी सेटिङ अफ गर्नुहोस्</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" /> मध्ये <ph name="SELECTED_PAGE" /> पृष्ठ</translation> <translation id="6018164090099858612">मिरर मोडबाट बाहिर निस्कँदै</translation> <translation id="602001110135236999">बायाँतिर स्क्रोल गर्नुहोस्</translation> @@ -862,6 +865,7 @@ <translation id="6165508094623778733">थप जान्नुहोस्</translation> <translation id="6166852626429024716">आफ्नो यन्त्र, एप, सेटिङ, वेबमा खोज्नुहोस्...</translation> <translation id="6179832488876878285">तपाईं यहाँ आफ्ना महत्त्वपूर्ण फाइलहरू पिन गर्न सक्नुहुन्छ। पिन गर्न थाल्न फाइलहरू नामक एप खोल्नुहोस्।</translation> +<translation id="6182592640011875895">डेस्क खोल्नुहोस्</translation> <translation id="619279033188484792"><ph name="DEVICE_TYPE" /> मा आफ्नो फोनका हालसालैका फोटो, मिडिया र सूचनाहरू हेर्नुहोस्</translation> <translation id="619335566042889110">अहिले नै फुल चार्ज गर्नुहोस्</translation> <translation id="6220928844947387476">तपाईं अब एकै पटक आफूसँगै आफ्नो स्क्रिन रेकर्ड गर्न सक्नुहुन्छ</translation> @@ -1168,6 +1172,7 @@ <translation id="8052898407431791827">कपी गरेर क्लिपबोर्डमा पेस्ट गरियो</translation> <translation id="8054466585765276473">ब्याटरि समय हिसाब गर्दै।</translation> <translation id="8061464966246066292">उच्च कन्ट्रास्ट</translation> +<translation id="8083540854303889870">पछि खरिद गर्नका लागि सेभ गरिएका वस्तु</translation> <translation id="8098591350844501178"><ph name="RECEIVER_NAME" /> मा स्क्रिन casting गर्ने काम रोक्नुहोस्</translation> <translation id="8113423164597455979">सबै डिभाइसमा अन</translation> <translation id="8120151603115102514">तपाईंको फोनमा लक स्क्रिन छैन। Chromebook अनलक गर्न पासवर्ड हाल्नुहोस्।</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 8cede671..75b2d7e 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">installere apper, utvidelser og temaer</translation> <translation id="2977598380246111477">Neste nummer</translation> <translation id="2981684127883932071">Viser forslag</translation> +<translation id="2985148236010982088">Se alle appene</translation> <translation id="2992327365391326550">Enhetens mikrofonknapp er slått av.</translation> <translation id="2995447421581609334">Vis Cast-enheter.</translation> <translation id="2996462380875591307">Dokket lupe er slått på. Trykk på Ctrl + Søk + D igjen for å slå det av.</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> og <ph name="UNAVAILABLE_APPS_COUNT" /> til er ikke på denne enheten.</translation> <translation id="3735740477244556633">Sortér etter</translation> <translation id="3742055079367172538">Skjermdump tatt</translation> +<translation id="3761848338953536304">Administratoren ber deg slå av innstillingen for SIM-kortlås</translation> <translation id="3765841986579723851">Redigert i dag</translation> <translation id="3771549900096082774">Høykontrastmodus</translation> <translation id="3773700760453577392">En administrator har slått av multipålogging for <ph name="USER_EMAIL" />. Alle brukere må logge av for å fortsette.</translation> @@ -828,6 +830,7 @@ <translation id="598407983968395253">Bruk mal</translation> <translation id="598882571027504733">For å laste ned oppdateringen, start Chromebooken på nytt med tastaturet tilkoblet.</translation> <translation id="5992218262414051481">Høykontrastmodus er slått på. Trykk på Ctrl + Søk + H på nytt for å slå den av.</translation> +<translation id="6009656393242168182">Slå av innstillingen for SIM-kortlås</translation> <translation id="6012623610530968780">Side <ph name="SELECTED_PAGE" /> av <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Avslutter speilingsmodus</translation> <translation id="602001110135236999">Rull til venstre</translation> @@ -862,6 +865,7 @@ <translation id="6165508094623778733">Finn ut mer</translation> <translation id="6166852626429024716">Søk på enheten, i apper, i innstillinger og på nettet.</translation> <translation id="6179832488876878285">Du kan feste viktige filer her. Åpne Filer-appen for å komme i gang.</translation> +<translation id="6182592640011875895">Åpne skrivebordet</translation> <translation id="619279033188484792">Se nylige bilder, medier og varsler fra telefonen din på <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Lad helt nå</translation> <translation id="6220928844947387476">Nå kan du ta opp deg selv og skjermen din samtidig</translation> @@ -1168,6 +1172,7 @@ <translation id="8052898407431791827">Kopiert til utklippstavlen</translation> <translation id="8054466585765276473">Beregner batteritid.</translation> <translation id="8061464966246066292">Høy kontrast</translation> +<translation id="8083540854303889870">Lagret for senere bruk</translation> <translation id="8098591350844501178">Slutt å caste skjermen til <ph name="RECEIVER_NAME" /></translation> <translation id="8113423164597455979">På, alle apper</translation> <translation id="8120151603115102514">Telefonen har ingen låseskjerm. For å låse opp Chromebooken, skriv inn passordet.</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index 88fde80..59bf6d8 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">ਐਪਾਂ, ਐਕਸਟੈਂਸ਼ਨਾਂ ਅਤੇ ਥੀਮਾਂ ਨੂੰ ਸਥਾਪਤ ਕਰੋ</translation> <translation id="2977598380246111477">ਅਗਲਾ ਨੰਬਰ</translation> <translation id="2981684127883932071">ਸੁਝਾਵਾਂ ਨੂੰ ਦਿਖਾਇਆ ਜਾ ਰਿਹਾ ਹੈ</translation> +<translation id="2985148236010982088">ਸਭ ਐਪਾਂ ਦੇਖੋ</translation> <translation id="2992327365391326550">ਡੀਵਾਈਸ ਦਾ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਬਟਨ ਬੰਦ ਹੈ।</translation> <translation id="2995447421581609334">ਕਾਸਟ ਡੀਵਾਈਸਾਂ ਦਿਖਾਓ।</translation> <translation id="2996462380875591307">'ਡੌਕ ਕੀਤਾ ਵਿਸਤਾਰਕ' ਚਾਲੂ ਕੀਤਾ ਗਿਆ। ਇਸਨੂੰ ਬੰਦ 'ਤੇ ਟੌਗਲ ਕਰਨ ਲਈ ਦੁਬਾਰਾ Ctrl+Search+D ਦਬਾਓ।</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ਅਤੇ <ph name="UNAVAILABLE_APPS_COUNT" /> ਹੋਰ ਐਪਾਂ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਉਪਲਬਧ ਨਹੀਂ ਹਨ।</translation> <translation id="3735740477244556633">ਇਸ ਮੁਤਾਬਕ ਕ੍ਰਮ-ਬੱਧ ਕਰੋ</translation> <translation id="3742055079367172538">ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਿਆ ਗਿਆ</translation> +<translation id="3761848338953536304">ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਨੂੰ ਲਾਕ ਸਿਮ ਸੈਟਿੰਗ ਨੂੰ ਬੰਦ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕਰ ਰਿਹਾ ਹੈ</translation> <translation id="3765841986579723851">ਅੱਜ ਸੰਪਾਦਨ ਕੀਤਾ ਗਿਆ</translation> <translation id="3771549900096082774">ਉੱਚ ਵਖਰੇਵਾਂ ਮੋਡ</translation> <translation id="3773700760453577392">ਕਿਸੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ <ph name="USER_EMAIL" /> ਲਈ ਬਹੁ-ਗਿਣਤੀ ਸਾਈਨ-ਇਨ ਨੂੰ ਅਸਵੀਕਾਰ ਕੀਤਾ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦਾ ਸਾਈਨ-ਆਊਟ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ।</translation> @@ -637,6 +639,7 @@ <translation id="4734965478015604180">ਲੇਟਵਾਂ</translation> <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + ਨੰਬਰ ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਬਦਲ ਗਿਆ ਹੈ। ਫੰਕਸ਼ਨ ਕੁੰਜੀਆਂ ਵਰਤਣ ਲਈ, <ph name="LAUNCHER_KEY_NAME" /> ਕੁੰਜੀ + ਉੱਪਰਲੀ ਕਤਾਰ 'ਤੇ ਦਿੱਤੀ ਕੋਈ ਵੀ ਕੁੰਜੀ ਦਬਾਓ।</translation> <translation id="473775607612524610">ਅੱਪਡੇਟ ਕਰੋ</translation> +<translation id="4752784485658729358">ਰੱਖਿਅਤ ਕੀਤੇ ਗਏ ਸਿਰਫ਼ 6 ਡੈਸਕਾਂ ਦੀ ਆਗਿਆ ਹੈ। ਨਵਾਂ ਡੈਸਕ ਰੱਖਿਅਤ ਕਰਨ ਲਈ ਪਹਿਲਾਂ ਤੋਂ ਮੌਜੂਦ ਡੈਸਕ ਹਟਾਓ।</translation> <translation id="4759238208242260848">ਡਾਊਨਲੋਡਸ</translation> <translation id="4774338217796918551">ਕੱਲ੍ਹ <ph name="COME_BACK_TIME" /> ਡੀਵਾਈਸ ਦੁਬਾਰਾ ਵਰਤੋ।</translation> <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> ਲਈ ਪਾਸਵਰਡ</translation> @@ -828,6 +831,7 @@ <translation id="598407983968395253">ਟੈਮਪਲੇਟ ਵਰਤੋ</translation> <translation id="598882571027504733">ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, Chromebook ਨੂੰ ਨਾਲ ਅਟੈਚ ਕੀਤੇ ਕੀ-ਬੋਰਡ ਰਾਹੀਂ ਮੁੜ-ਚਾਲੂ ਕਰੋ।</translation> <translation id="5992218262414051481">ਉੱਚ ਵਖਰੇਵਾਂ ਮੋਡ ਚਾਲੂ ਕੀਤਾ ਗਿਆ ਹੈ। ਇਸਨੂੰ ਬੰਦ 'ਤੇ ਟੌਗਲ ਕਰਨ ਲਈ ਦੁਬਾਰਾ Ctrl+Search+H ਦਬਾਓ।</translation> +<translation id="6009656393242168182">ਆਪਣੀ ਸਿਮ ਲਾਕ ਸੈਟਿੰਗ ਨੂੰ ਬੰਦ ਕਰੋ</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" /> ਵਿੱਚੋਂ <ph name="SELECTED_PAGE" /> ਪੰਨਾ</translation> <translation id="6018164090099858612">"ਮਿਰਰ ਮੋਡ" ਤੋਂ ਬਾਹਰ ਨਿਕਲਿਆ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="602001110135236999">ਖੱਬੇ ਪਾਸੇ ਸਕ੍ਰੋਲ ਕਰੋ</translation> @@ -862,6 +866,7 @@ <translation id="6165508094623778733">ਹੋਰ ਜਾਣੋ</translation> <translation id="6166852626429024716">ਆਪਣਾ ਡੀਵਾਈਸ, ਐਪਾਂ, ਸੈਟਿੰਗਾਂ, ਵੈੱਬ ਖੋਜੋ...</translation> <translation id="6179832488876878285">ਇੱਥੇ ਤੁਸੀਂ ਆਪਣੀਆਂ ਮਹੱਤਵਪੂਰਨ ਫ਼ਾਈਲਾਂ ਨੂੰ ਪਿੰਨ ਕਰ ਸਕਦੇ ਹੋ। ਸ਼ੁਰੂਆਤ ਕਰਨ ਲਈ Files ਐਪ ਨੂੰ ਖੋਲ੍ਹੋ।</translation> +<translation id="6182592640011875895">ਡੈਸਕ ਖੋਲ੍ਹੋ</translation> <translation id="619279033188484792">ਆਪਣੇ <ph name="DEVICE_TYPE" /> 'ਤੇ ਆਪਣੇ ਫ਼ੋਨ ਦੀਆਂ ਹਾਲੀਆ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ ਅਤੇ ਸੂਚਨਾਵਾਂ ਦੇਖੋ</translation> <translation id="619335566042889110">ਹੁਣ ਪੂਰੀ ਤਰ੍ਹਾਂ ਚਾਰਜ ਕਰੋ</translation> <translation id="6220928844947387476">ਤੁਸੀਂ ਹੁਣ ਖੁਦ ਨੂੰ ਅਤੇ ਆਪਣੀ ਸਕ੍ਰੀਨ ਨੂੰ ਇੱਕੋ ਸਮੇਂ ਰਿਕਾਰਡ ਕਰ ਸਕਦੇ ਹੋ</translation> @@ -1168,6 +1173,7 @@ <translation id="8052898407431791827">ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕੀਤਾ ਗਿਆ</translation> <translation id="8054466585765276473">ਬੈਟਰੀ ਸਮੇਂ ਦਾ ਅਨੁਮਾਨ ਲਗਾ ਰਿਹਾ ਹੈ।</translation> <translation id="8061464966246066292">ਉੱਚ ਕੰਟ੍ਰਾਸਟ</translation> +<translation id="8083540854303889870">ਬਾਅਦ ਲਈ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ</translation> <translation id="8098591350844501178"><ph name="RECEIVER_NAME" /> 'ਤੇ ਸਕ੍ਰੀਨ ਕਾਸਟ ਕਰਨੀ ਬੰਦ ਕਰੋ</translation> <translation id="8113423164597455979">ਚਾਲੂ, ਸਭ ਐਪਾਂ</translation> <translation id="8120151603115102514">ਤੁਹਾਡੇ ਫ਼ੋਨ ਵਿੱਚ ਲਾਕ ਸਕ੍ਰੀਨ ਨਹੀਂ ਹੈ। ਆਪਣੀ Chromebook ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ।</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 27a5014..4a21e383 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -639,6 +639,7 @@ <translation id="4734965478015604180">Horizontal</translation> <translation id="4735498845456076464">O atalho de teclado <ph name="LAUNCHER_KEY_NAME" /> + tecla numérica mudou. Para usar as teclas de função, pressione <ph name="LAUNCHER_KEY_NAME" /> + uma tecla na linha superior.</translation> <translation id="473775607612524610">Atualizar</translation> +<translation id="4752784485658729358">São permitidos apenas seis espaços de trabalho. Remova um deles para salvar outro.</translation> <translation id="4759238208242260848">Downloads</translation> <translation id="4774338217796918551">Volte amanhã, neste horário: <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Senha para <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index b1f2ca1..d891444e 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Horizontal</translation> <translation id="4735498845456076464">O atalho de teclado <ph name="LAUNCHER_KEY_NAME" /> + número foi alterado. Para utilizar teclas de função, prima a tecla <ph name="LAUNCHER_KEY_NAME" /> + uma tecla na linha superior.</translation> <translation id="473775607612524610">Atualizar</translation> +<translation id="4752784485658729358">Só é permitido guardar 6 espaços de trabalho. Remova um espaço de trabalho para guardar um novo.</translation> <translation id="4759238208242260848">Transferências</translation> <translation id="4774338217796918551">Volte amanhã à(s) <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Palavra-passe para <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index 7c25e75..8cec160 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Горизонтально</translation> <translation id="4735498845456076464">Функция сочетания клавиш "<ph name="LAUNCHER_KEY_NAME" /> + цифра" изменилась. Чтобы выполнить действие функциональной клавиши, нажмите <ph name="LAUNCHER_KEY_NAME" /> + клавиша верхнего ряда.</translation> <translation id="473775607612524610">Обновить</translation> +<translation id="4752784485658729358">Максимальное количество сохраненных рабочих столов – 6. Удалите один из них, чтобы сохранить новый.</translation> <translation id="4759238208242260848">Скачанные файлы</translation> <translation id="4774338217796918551">Возвращайтесь завтра в <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Пароль для адреса электронной почты <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index 676f5bb..c12e55f 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">තිරස්</translation> <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + අංකය යතුරු පුවරු කෙටි මග වෙනස් වී ඇත. කාර්ය යතුරු භාවිත කිරීමට, <ph name="LAUNCHER_KEY_NAME" /> යතුර + ඉහළම පේළියේ ඇති යතුරක් ඔබන්න.</translation> <translation id="473775607612524610">යාවත්කාලීනය</translation> +<translation id="4752784485658729358">සුරැකි මේස 6කට පමණක් ඉඩ දේ. අලුත් එකක් සුරැකීමට මේසයක් ඉවත් කරන්න.</translation> <translation id="4759238208242260848">බාගැනීම්</translation> <translation id="4774338217796918551">හෙට <ph name="COME_BACK_TIME" />ට ආපසු එන්න.</translation> <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> සඳහා රහස්වචනය</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index 8753afba..9bc0218 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Vodoravno</translation> <translation id="4735498845456076464">Bližnjica na tipkovnici <ph name="LAUNCHER_KEY_NAME" /> + številka je spremenjena. Če želite uporabljati funkcijske tipke, pritisnite tipko za <ph name="LAUNCHER_KEY_NAME" /> in tipko v vrhnji vrstici.</translation> <translation id="473775607612524610">Posodobi</translation> +<translation id="4752784485658729358">Dovoljenih je samo 6 shranjenih namizij. Če želite shraniti novo, odstranite eno.</translation> <translation id="4759238208242260848">Prenosi</translation> <translation id="4774338217796918551">Vrni se jutri ob <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Geslo za <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb index 93b0780..d503f9b 100644 --- a/ash/strings/ash_strings_sq.xtb +++ b/ash/strings/ash_strings_sq.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Horizontal</translation> <translation id="4735498845456076464">Shkurtorja e tastierës për <ph name="LAUNCHER_KEY_NAME" /> + Numri është ndryshuar. Për të përdorur tastet e funksioneve, shtyp tastin <ph name="LAUNCHER_KEY_NAME" /> + një tast në rreshtin e sipërm.</translation> <translation id="473775607612524610">Përditësoje</translation> +<translation id="4752784485658729358">Lejohen vetëm 6 tavolina të ruajtura pune. Hiq një tavolinë pune për të ruajtur një të re.</translation> <translation id="4759238208242260848">Shkarkimet</translation> <translation id="4774338217796918551">Kthehu përsëri nesër në <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Fjalëkalimi për <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index 9a3d184..f20da3b 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Horizontalno</translation> <translation id="4735498845456076464">Tasterska prečica <ph name="LAUNCHER_KEY_NAME" /> + broj je promenjena. Da biste koristili funkcijske tastere, pritisnite taster <ph name="LAUNCHER_KEY_NAME" /> + taster u gornjem redu.</translation> <translation id="473775607612524610">Ažuriraj</translation> +<translation id="4752784485658729358">Dozvoljeno je samo 6 sačuvanih radnih površina. Uklonite neku radnu površinu da biste sačuvali novu.</translation> <translation id="4759238208242260848">Preuzimanja</translation> <translation id="4774338217796918551">Vratite se sutra u <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Lozinka za <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 8f761b8..9a4f49e 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Хоризонтално</translation> <translation id="4735498845456076464">Тастерска пречица <ph name="LAUNCHER_KEY_NAME" /> + број је промењена. Да бисте користили функцијске тастере, притисните тастер <ph name="LAUNCHER_KEY_NAME" /> + тастер у горњем реду.</translation> <translation id="473775607612524610">Ажурирај</translation> +<translation id="4752784485658729358">Дозвољено је само 6 сачуваних радних површина. Уклоните неку радну површину да бисте сачували нову.</translation> <translation id="4759238208242260848">Преузимања</translation> <translation id="4774338217796918551">Вратите се сутра у <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Лозинка за <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index 841d566..bfd7983 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Horisontell</translation> <translation id="4735498845456076464">Kortkommandot <ph name="LAUNCHER_KEY_NAME" /> + siffra har ändrats. Nu används <ph name="LAUNCHER_KEY_NAME" />-tangenten + en tangent i översta raden som funktionstangenter.</translation> <translation id="473775607612524610">Uppdatera</translation> +<translation id="4752784485658729358">Högst sex sparade skrivbord tillåts. Du måste ta bort ett skrivbord innan du kan spara ett nytt.</translation> <translation id="4759238208242260848">Nedladdningar</translation> <translation id="4774338217796918551">Prova igen i morgon klockan <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Lösenord för <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index 49fd4c4..0630a08 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Kimlalo</translation> <translation id="4735498845456076464">Mikato ya kibodi ya <ph name="LAUNCHER_KEY_NAME" /> + Nambari imebadilika. Ili utumie vitufe vya kukokotoa, bonyeza kitufe cha <ph name="LAUNCHER_KEY_NAME" /> pamoja na kitufe kwenye safu mlalo ya juu.</translation> <translation id="473775607612524610">Sasisha</translation> +<translation id="4752784485658729358">Maeneokazi 6 tu yanaweza kuhifadhiwa Ondoa eneokazi la zamani ili uhifadhi jipya.</translation> <translation id="4759238208242260848">Vipakuliwa</translation> <translation id="4774338217796918551">Rejea kesho saa <ph name="COME_BACK_TIME" />.</translation> <translation id="4776917500594043016">Nenosiri la <ph name="USER_EMAIL_ADDRESS" /></translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index cf254a6d..57cb43b 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">యాప్లు, ఎక్స్టెన్షన్లు, థీమ్లను ఇన్స్టాల్ చేయండి</translation> <translation id="2977598380246111477">తర్వాతి నంబర్</translation> <translation id="2981684127883932071">సూచనలను ప్రదర్శిస్తోంది</translation> +<translation id="2985148236010982088">అన్ని యాప్లను చూడండి</translation> <translation id="2992327365391326550">పరికర మైక్రోఫోన్ బటన్ ఆఫ్ చేయబడింది.</translation> <translation id="2995447421581609334">ప్రసార పరికరాలను చూపుతుంది.</translation> <translation id="2996462380875591307">డాక్ చేయబడిన మాగ్నిఫైయర్ ప్రారంభించబడింది. దాన్ని టోగుల్ ఆఫ్ చేయడానికి మళ్లీ Ctrl+Search+Dని నొక్కండి.</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, మరో<ph name="UNAVAILABLE_APPS_COUNT" /> యాప్లు ఈ పరికరంలో అందుబాటులో లేవు.</translation> <translation id="3735740477244556633">దీని ద్వారా క్రమీకరించు</translation> <translation id="3742055079367172538">స్క్రీన్షాట్ తీసినప్పుడు</translation> +<translation id="3761848338953536304">మీరు లాక్ SIM సెట్టింగ్ను ఆఫ్ చేయవలసిందిగా మీ అడ్మినిస్ట్రేటర్ రిక్వెస్ట్ చేస్తున్నారు</translation> <translation id="3765841986579723851">ఈ రోజు ఎడిట్ చేశారు</translation> <translation id="3771549900096082774">అధిక కాంట్రాస్ట్ మోడ్</translation> <translation id="3773700760453577392"><ph name="USER_EMAIL" /> కోసం బహుళ సైన్-ఇన్ అనుమతిని నిర్వాహకుడు తిరస్కరించారు. @@ -829,6 +831,7 @@ <translation id="598407983968395253">టెంప్లేట్ను ఉపయోగించండి</translation> <translation id="598882571027504733">అప్డేట్ను పొందడానికి, కీబోర్డ్ను అలానే జోడించి ఉంచి మీ Chromebookను పునఃప్రారంభించండి.</translation> <translation id="5992218262414051481">అధిక క్రాంటాస్ట్ మోడ్ ఆరంభించబడింది. దానిని ఆఫ్కు టోగుల్ చేయడం కోసం మళ్లీ Ctrl+Search+Hను నొక్కండి.</translation> +<translation id="6009656393242168182">మీ SIM లాక్ సెట్టింగ్ను డిజేబుల్ చేయండి</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" />లో <ph name="SELECTED_PAGE" />వ పేజీ</translation> <translation id="6018164090099858612">ప్రతిబింబ మోడ్ నుండి నిష్క్రమిస్తోంది</translation> <translation id="602001110135236999">ఎడమకు స్క్రోల్ చేయి</translation> @@ -863,6 +866,7 @@ <translation id="6165508094623778733">మరింత తెలుసుకోండి</translation> <translation id="6166852626429024716">మీ పరికరం, యాప్లు, సెట్టింగ్లు, వెబ్ను వెతకండి...</translation> <translation id="6179832488876878285">మీ ముఖ్యమైన ఫైళ్లను మీరు ఇక్కడ పిన్ చేయవచ్చు. ప్రారంభించడానికి Files యాప్ను తెరవండి.</translation> +<translation id="6182592640011875895">డెస్క్ను తెరవండి</translation> <translation id="619279033188484792">మీ ఫోన్లోని తాజా ఫోటోలు, మీడియా, మీ <ph name="DEVICE_TYPE" />లోని నోటిఫికేషన్లను చూడండి</translation> <translation id="619335566042889110">ఇప్పుడు పూర్తిగా ఛార్జ్ అయింది</translation> <translation id="6220928844947387476">ఇప్పుడు మీరు మిమ్మల్ని, మీ స్క్రీన్ను ఒకే సమయంలో రికార్డ్ చేయవచ్చు</translation> @@ -1169,6 +1173,7 @@ <translation id="8052898407431791827">క్లిప్బోర్డ్కు కాపీ చేయబడింది</translation> <translation id="8054466585765276473">బ్యాటరీ సమయాన్ని లెక్కిస్తోంది.</translation> <translation id="8061464966246066292">అధిక కాంట్రాస్ట్</translation> +<translation id="8083540854303889870">తర్వాత ఉపయోగించడానికి సేవ్ చేయబడింది</translation> <translation id="8098591350844501178"><ph name="RECEIVER_NAME" />కి స్క్రీన్ను ప్రసారం చేయడాన్ని ఆపివేయి</translation> <translation id="8113423164597455979">యాప్లన్నీ ఆన్</translation> <translation id="8120151603115102514">మీ ఫోన్కు లాక్ స్క్రీన్ ఎనేబుల్ చేసి లేదు. మీ Chromebookను అన్లాక్ చేయడానికి, పాస్వర్డ్ను ఎంటర్ చేయండి.</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 23c5b411..d9399860 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -173,6 +173,7 @@ <translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation> <translation id="1972950159383891558">สวัสดี คุณ <ph name="USERNAME" /></translation> <translation id="1978498689038657292">การป้อนข้อความ</translation> +<translation id="1982717156487272186">แสดงสัปดาห์ก่อนหน้า</translation> <translation id="1989113344093894667">จับภาพเนื้อหาไม่ได้</translation> <translation id="1990046457226896323">ดาวน์โหลดไฟล์คำพูดแล้ว</translation> <translation id="1993072747612765854">ดูข้อมูลเพิ่มเติมเกี่ยวกับอัปเดตล่าสุดของ <ph name="SYSTEM_APP_NAME" /></translation> @@ -617,6 +618,7 @@ <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, การให้ดาว <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{เปลี่ยนอุปกรณ์เป็นเวอร์ชันก่อนหน้าภายใน 1 วัน}other{เปลี่ยนอุปกรณ์เป็นเวอร์ชันก่อนหน้าภายใน # วัน}}</translation> <translation id="4642092649622328492">ถ่ายภาพหน้าจอบางส่วน</translation> +<translation id="4644727592819780893">พื้นที่เล็กเกินกว่าที่จะแสดงตัวอย่างกล้อง</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, แอปแนะนำ</translation> <translation id="4657775630156561295">ระบบจะนำคำแนะนำต่อไปนี้ออกอย่างถาวรจากประวัติคำแนะนำของบัญชี @@ -771,6 +773,7 @@ <translation id="5673434351075758678">เปลี่ยนจาก "<ph name="FROM_LOCALE" />" เป็น "<ph name="TO_LOCALE" />" หลังการซิงก์การตั้งค่า</translation> <translation id="5675363643668471212">รายการชั้นวาง</translation> <translation id="5677928146339483299">ถูกบล็อก</translation> +<translation id="5678564054339031017">แสดงสัปดาห์ถัดไป</translation> <translation id="5679050765726761783">เชื่อมต่ออะแดปเตอร์พลังงานต่ำแล้ว</translation> <translation id="5682642926269496722">Google Assistant ไม่พร้อมใช้งานกับบัญชีผู้ใช้ปัจจุบัน</translation> <translation id="5689633613396158040">แสงตอนกลางคืนช่วยให้มองหรืออ่านหน้าจอในแสงสลัวได้ง่ายขึ้น แตะเพื่อเปลี่ยนเวลาเปิดแสงตอนกลางคืนหรือจะปิดไปเลยก็ได้</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index 7e909a51..ca81ffe 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Yatay</translation> <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Sayı klavye kısayolu değişti. İşlev tuşlarını kullanmak için <ph name="LAUNCHER_KEY_NAME" /> tuşu + üst sıradaki tuşlardan birine basın.</translation> <translation id="473775607612524610">Güncelle</translation> +<translation id="4752784485658729358">Kayıtlı masa sayısı 6 ile sınırlıdır. Yeni masa kaydetmek için mevcut bir masayı kaldırın.</translation> <translation id="4759238208242260848">İndirilenler</translation> <translation id="4774338217796918551">Saat <ph name="COME_BACK_TIME" /> olduğunda geri gelin.</translation> <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> için şifre</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index 62f8ae5..94522ff 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">ایپس، ایکسٹینشنز اور تھیمز انسٹال کریں</translation> <translation id="2977598380246111477">اگلا نمبر</translation> <translation id="2981684127883932071">تجاویز پیش کی جا رہی ہیں</translation> +<translation id="2985148236010982088">سبھی ایپس دیکھیں</translation> <translation id="2992327365391326550">آلے کا مائیکروفون بٹن آف ہے۔</translation> <translation id="2995447421581609334">کاسٹ آلات دکھائیں۔</translation> <translation id="2996462380875591307">ڈاک کردہ میگنیفائر فعال ہے۔ اسے ٹوگل کر کے بند کرنے کیلئے Ctrl+Search+D کو دوبارہ دبائیں۔</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />، <ph name="UNAVAILABLE_APPS_TWO" />، اور <ph name="UNAVAILABLE_APPS_COUNT" /> مزید اس آلہ پر موجود نہیں ہے۔</translation> <translation id="3735740477244556633">ترتیب دیں بلحاظ</translation> <translation id="3742055079367172538">اسکرین شاٹ لی گئی</translation> +<translation id="3761848338953536304">آپ کا منتظم درخواست کر رہا ہے کہ آپ لاک SIM کی ترتیب کو بند کر دیں</translation> <translation id="3765841986579723851">آج ترمیم کیا گیا</translation> <translation id="3771549900096082774">اعلی تناسب امتزاج وضع</translation> <translation id="3773700760453577392">منتظم نے <ph name="USER_EMAIL" /> کیلئے متعدد سائن ان کی اجازت نہیں دی ہے۔ جاری رکھنے کیلئے تمام صارفین کا سائن آؤٹ کرنا لازمی ہے۔</translation> @@ -828,6 +830,7 @@ <translation id="598407983968395253">تمثیل استعمال کریں</translation> <translation id="598882571027504733">اپ ڈیٹ حاصل کرنے کیلئے، منسلک شدہ کی بورڈ سے اپنا Chromebook دوبارہ شروع کریں۔</translation> <translation id="5992218262414051481">اعلی تناسب امتزاج کی وضع فعال ہے۔ اسے آف ٹوگل کرنے کیلئے Ctrl+Search+H کو دوبارہ دبائیں۔</translation> +<translation id="6009656393242168182">اپنے SIM لاک کی ترتیب کو غیر فعال کریں</translation> <translation id="6012623610530968780">صفحہ <ph name="TOTAL_PAGE_NUM" /> کا <ph name="SELECTED_PAGE" /></translation> <translation id="6018164090099858612">مرر وضع سے باہر نکل رہے ہیں</translation> <translation id="602001110135236999">بائیں اسکرول کریں</translation> @@ -862,6 +865,7 @@ <translation id="6165508094623778733">مزید جانیں</translation> <translation id="6166852626429024716">اپنا آلہ، ایپس، ترتیبات ویب تلاش کریں...</translation> <translation id="6179832488876878285">آپ اپنی اہم فائلز کو یہاں پن کر سکتے ہیں۔ شروع کرنے کیلئے فائلز ایپ کھولیں۔</translation> +<translation id="6182592640011875895">ڈیسک کھولیں</translation> <translation id="619279033188484792">اپنے <ph name="DEVICE_TYPE" /> پر اپنے فون کی حالیہ تصاویر، میڈیا اور اطلاعات دیکھیں</translation> <translation id="619335566042889110">اب پوری طرح چارج کریں</translation> <translation id="6220928844947387476">اب آپ اپنے آپ کو اور اپنی اسکرین کو ایک ہی وقت میں ریکارڈ کر سکتے ہیں</translation> @@ -1167,6 +1171,7 @@ <translation id="8052898407431791827">کلپ بورڈ پر کاپی ہو گیا</translation> <translation id="8054466585765276473">بیٹری کے وقت کا حساب لگایا جا رہا ہے۔</translation> <translation id="8061464966246066292">اعلی تناسب امتزاج</translation> +<translation id="8083540854303889870">بعد کیلئے محفوظ کردہ</translation> <translation id="8098591350844501178">اسکرین کو <ph name="RECEIVER_NAME" /> پر کاسٹ کرنا بند کریں</translation> <translation id="8113423164597455979">آن، سبھی ایپس</translation> <translation id="8120151603115102514">آپ کے فون میں لاک اسکرین نہیں ہے۔ اپنے Chromebook کو غیر مقفل کرنے کے لیے، پاس ورڈ درج کریں۔</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index f6d6eabe..8cafb34b 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -637,6 +637,7 @@ <translation id="4734965478015604180">Gorizontal</translation> <translation id="4735498845456076464"><ph name="LAUNCHER_KEY_NAME" /> + Raqam tezkor tugmasi oʻzgardi. Funksiya tugmalaridan foydalanish uchun <ph name="LAUNCHER_KEY_NAME" /> tugmasi + yuqori qatordagi kalitni bosing.</translation> <translation id="473775607612524610">Yangilash</translation> +<translation id="4752784485658729358">Faqat 6 tagacha ish stolini saqlash mumkin. Yangisini saqlash uchun eskilarini oʻchiring.</translation> <translation id="4759238208242260848">Yuklanmalar</translation> <translation id="4774338217796918551">Ertaga soat <ph name="COME_BACK_TIME" /> da qayting.</translation> <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> e-pochtasi paroli</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 4f1ddeba..740e06b 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">Cài đặt ứng dụng, tiện ích và chủ đề</translation> <translation id="2977598380246111477">Số tiếp theo</translation> <translation id="2981684127883932071">Đang hiển thị mục đề xuất</translation> +<translation id="2985148236010982088">Xem tất cả ứng dụng</translation> <translation id="2992327365391326550">Nút micrô trên thiết bị đang tắt.</translation> <translation id="2995447421581609334">Hiển thị các thiết bị truyền.</translation> <translation id="2996462380875591307">Đã bật tính năng Phóng to ở vị trí cố định. Hãy nhấn lại tổ hợp phím Ctrl+Search+D để tắt tính năng này.</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, và <ph name="UNAVAILABLE_APPS_COUNT" /> ứng dụng khác không có trên thiết bị này.</translation> <translation id="3735740477244556633">Sắp xếp theo</translation> <translation id="3742055079367172538">Ảnh màn hình đã chụp</translation> +<translation id="3761848338953536304">Quản trị viên của bạn đang yêu cầu bạn tắt chế độ Khoá SIM</translation> <translation id="3765841986579723851">Chỉnh sửa hôm nay</translation> <translation id="3771549900096082774">Chế độ tương phản cao</translation> <translation id="3773700760453577392">Quản trị viên không cho phép <ph name="USER_EMAIL" /> thực hiện đăng nhập nhiều tài khoản. Tất cả người dùng phải đăng xuất để tiếp tục.</translation> @@ -637,6 +639,7 @@ <translation id="4734965478015604180">Ngang</translation> <translation id="4735498845456076464">Phím tắt <ph name="LAUNCHER_KEY_NAME" /> + Số đã thay đổi. Để sử dụng các phím chức năng, hãy nhấn tổ hợp phím <ph name="LAUNCHER_KEY_NAME" /> + một phím ở hàng trên cùng.</translation> <translation id="473775607612524610">Cập nhật</translation> +<translation id="4752784485658729358">Chỉ được lưu tối đa 6 không gian làm việc. Hãy xoá một không gian làm việc nếu muốn lưu một không gian làm việc mới.</translation> <translation id="4759238208242260848">Tệp đã tải xuống</translation> <translation id="4774338217796918551">Hãy quay lại lúc <ph name="COME_BACK_TIME" /> ngày mai.</translation> <translation id="4776917500594043016">Mật khẩu cho <ph name="USER_EMAIL_ADDRESS" /></translation> @@ -827,6 +830,7 @@ <translation id="598407983968395253">Sử dụng mẫu</translation> <translation id="598882571027504733">Để cập nhật, hãy khởi động lại Chromebook bằng bàn phím đã kết nối.</translation> <translation id="5992218262414051481">Đã bật Chế độ tương phản cao. Nhấn lại Ctrl+Search+H để tắt.</translation> +<translation id="6009656393242168182">Tắt chế độ Khoá SIM</translation> <translation id="6012623610530968780">Trang <ph name="SELECTED_PAGE" />/<ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Đang thoát chế độ phản chiếu</translation> <translation id="602001110135236999">Cuộn sang trái</translation> @@ -861,6 +865,7 @@ <translation id="6165508094623778733">Tìm hiểu thêm</translation> <translation id="6166852626429024716">Tìm kiếm trong thiết bị, ứng dụng, tùy chọn cài đặt, trên web...</translation> <translation id="6179832488876878285">Bạn có thể ghim các tệp quan trọng của mình ở đây. Hãy mở ứng dụng Files để bắt đầu.</translation> +<translation id="6182592640011875895">Mở không gian làm việc</translation> <translation id="619279033188484792">Xem thông báo, nội dung phương tiện và ảnh mới đây của điện thoại trên <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Sạc đầy ngay</translation> <translation id="6220928844947387476">Giờ đây bạn có thể ghi hình đồng thời cả chính mình và màn hình</translation> @@ -1167,6 +1172,7 @@ <translation id="8052898407431791827">Đã sao chép vào bảng nhớ tạm</translation> <translation id="8054466585765276473">Đang tính toán thời lượng pin.</translation> <translation id="8061464966246066292">Độ tương phản cao</translation> +<translation id="8083540854303889870">Lưu để dùng sau</translation> <translation id="8098591350844501178">Dừng truyền màn hình tới <ph name="RECEIVER_NAME" /></translation> <translation id="8113423164597455979">Bật, tất cả</translation> <translation id="8120151603115102514">Điện thoại của bạn không có màn hình khoá. Hãy nhập mật khẩu để mở khoá chiếc Chromebook của bạn.</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index 519e2b8..97993b0 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -634,6 +634,7 @@ <translation id="4734965478015604180">横向</translation> <translation id="4735498845456076464">键盘快捷键“<ph name="LAUNCHER_KEY_NAME" /> + 数字键”已更改。若要使用功能键,请按<ph name="LAUNCHER_KEY_NAME" />键 + 顶排的某个键。</translation> <translation id="473775607612524610">更新</translation> +<translation id="4752784485658729358">最多只能保存 6 个桌面。若要保存一个新桌面,请先移除一个已存桌面。</translation> <translation id="4759238208242260848">下载内容</translation> <translation id="4774338217796918551">您需要等到明天<ph name="COME_BACK_TIME" /> 才能再次使用此设备。</translation> <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> 的密码</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 7833bdff..b38799e9 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -634,6 +634,7 @@ <translation id="4734965478015604180">橫向</translation> <translation id="4735498845456076464">「<ph name="LAUNCHER_KEY_NAME" /> 鍵 + 數字鍵」的鍵盤快速鍵已變更。如要使用功能鍵,請按下<ph name="LAUNCHER_KEY_NAME" /> 鍵 + 最上排的任一按鍵。</translation> <translation id="473775607612524610">更新</translation> +<translation id="4752784485658729358">最多只能保存 6 個桌面。如要儲存新桌面,請先移除一個桌面。</translation> <translation id="4759238208242260848">下載</translation> <translation id="4774338217796918551"><ph name="COME_BACK_TIME" /> 裝置就會解除鎖定。</translation> <translation id="4776917500594043016"><ph name="USER_EMAIL_ADDRESS" /> 的密碼</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index 83841d0..ed44e8b 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -326,6 +326,7 @@ <translation id="2970920913501714344">Faka izinhlelo zokusebenza, izandiso, namatimu</translation> <translation id="2977598380246111477">Inombolo elandelayo</translation> <translation id="2981684127883932071">Ukubonisa iziphakamiso</translation> +<translation id="2985148236010982088">Bona wonke ama-app</translation> <translation id="2992327365391326550">Inkinobho yemakrofoni yedivayisi ivaliwe.</translation> <translation id="2995447421581609334">Bonisa amadivayisi okusakaza.</translation> <translation id="2996462380875591307">Isikhulisi esidokhiwe sivunyelwe. Cindezela u-Ctrl+Search+D futhi ukuze uyivale.</translation> @@ -464,6 +465,7 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, nangu-<ph name="UNAVAILABLE_APPS_COUNT" /> ngaphezulu awekho kule divayisi.</translation> <translation id="3735740477244556633">Hlunga nge-</translation> <translation id="3742055079367172538">Kuthathwe isithombe-skrini</translation> +<translation id="3761848338953536304">Umlawuli wakho ucela ukuthi uvale isethingi Lokukhiya i-SIM</translation> <translation id="3765841986579723851">Kuhlelwe namuhla</translation> <translation id="3771549900096082774">Imodi yokugqama okuphezulu</translation> <translation id="3773700760453577392">Umlawuli akazange avumele ukungena ngemvume okuningi kwe-<ph name="USER_EMAIL" />. Bonke abasebenzisi kumele baphume ngemvume ukuze baqhubeke.</translation> @@ -828,6 +830,7 @@ <translation id="598407983968395253">Sebenzisa isifanekiso</translation> <translation id="598882571027504733">Ukuze uthole izibuyekezo, qalisa kabusha i-Chromebook ngekhibhodi enamathiselwe.</translation> <translation id="5992218262414051481">Imodi yokugqama okuphezulu inikwe amandla. Cindezela u-Ctrl+Usesho+H futhi ukuze uyiguqule uyivale.</translation> +<translation id="6009656393242168182">Khubaza isethingi Lokukhiya i-SIM yakho</translation> <translation id="6012623610530968780">Ikhasi elingu-<ph name="SELECTED_PAGE" /> kwangu-<ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Ukuphuma kumodi ye-mirror</translation> <translation id="602001110135236999">Skrolela ngakwesokunxele</translation> @@ -862,6 +865,7 @@ <translation id="6165508094623778733">Funda kabanzi</translation> <translation id="6166852626429024716">Sesha idivayisi yakho, izinhlelo zokusebenza, amasethingi, iwebhu...</translation> <translation id="6179832488876878285">Ungaphina amafayela wakho abalulekile lapha. Vula uhlelo lokusebenza lwamafayela ukuze uqalise.</translation> +<translation id="6182592640011875895">Vula itafula</translation> <translation id="619279033188484792">Buka izithombe zakamuva zefoni yakho, imidiya, kanye nezaziso ku-<ph name="DEVICE_TYPE" /> yakho</translation> <translation id="619335566042889110">Shaja ngokugcwele manje</translation> <translation id="6220928844947387476">Manje usungakwazi ukuzirekhoda wena nesikrini sakho ngesikhathi esifanayo</translation> @@ -1168,6 +1172,7 @@ <translation id="8052898407431791827">Kukopishelwe kuklibhodi</translation> <translation id="8054466585765276473">Ibala isikhathi sebhethri</translation> <translation id="8061464966246066292">Ukugqama okuphezulu</translation> +<translation id="8083540854303889870">Kulondolozelwe kamuva</translation> <translation id="8098591350844501178">Misa ukusakaza isikrini ku-<ph name="RECEIVER_NAME" /></translation> <translation id="8113423164597455979">Uvule ama-app</translation> <translation id="8120151603115102514">Ifoni yakho ayinaso isikrini sokukhiya. Ukuze uvule i-Chromebook yakho, faka iphasiwedi.</translation>
diff --git a/ash/system/accessibility/autoclick_menu_view.cc b/ash/system/accessibility/autoclick_menu_view.cc index 52a4c4e..0a5c94e8 100644 --- a/ash/system/accessibility/autoclick_menu_view.cc +++ b/ash/system/accessibility/autoclick_menu_view.cc
@@ -12,6 +12,7 @@ #include "ash/system/accessibility/floating_menu_button.h" #include "ash/system/tray/tray_constants.h" #include "base/bind.h" +#include "base/i18n/rtl.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" #include "ui/base/l10n/l10n_util.h" @@ -38,8 +39,8 @@ AutoclickMenuView::AutoclickMenuView(AutoclickEventType type, FloatingMenuPosition position) { - int total_height = kUnifiedTopShortcutSpacing * 2 + kTrayItemSize; - int separator_spacing = (total_height - kSeparatorHeight) / 2; + const int total_height = kUnifiedTopShortcutSpacing * 2 + kTrayItemSize; + const int separator_spacing = (total_height - kSeparatorHeight) / 2; views::Builder<AutoclickMenuView>(this) .SetCrossAxisAlignment(views::BoxLayout::CrossAxisAlignment::kEnd) .AddChildren( @@ -107,8 +108,7 @@ base::Unretained(this), base::Unretained(pause_button_)))), views::Builder<views::Separator>() - .SetColor(AshColorProvider::Get()->GetContentLayerColor( - AshColorProvider::ContentLayerType::kSeparatorColor)) + .CopyAddressTo(&separator_) .SetPreferredHeight(kSeparatorHeight) .SetBorder(views::CreateEmptyBorder(gfx::Insets::TLBR( separator_spacing - kUnifiedTopShortcutSpacing, 0, @@ -170,6 +170,12 @@ } } +void AutoclickMenuView::OnThemeChanged() { + views::BoxLayoutView::OnThemeChanged(); + separator_->SetColor(AshColorProvider::Get()->GetContentLayerColor( + AshColorProvider::ContentLayerType::kSeparatorColor)); +} + void AutoclickMenuView::OnAutoclickButtonPressed(views::Button* sender) { AutoclickEventType type; if (sender == left_click_button_) {
diff --git a/ash/system/accessibility/autoclick_menu_view.h b/ash/system/accessibility/autoclick_menu_view.h index 723959f..d86f8511 100644 --- a/ash/system/accessibility/autoclick_menu_view.h +++ b/ash/system/accessibility/autoclick_menu_view.h
@@ -6,11 +6,15 @@ #define ASH_SYSTEM_ACCESSIBILITY_AUTOCLICK_MENU_VIEW_H_ #include "ash/public/cpp/accessibility_controller_enums.h" -#include "ash/system/tray/tray_bubble_view.h" #include "ui/base/metadata/metadata_header_macros.h" #include "ui/views/layout/box_layout_view.h" #include "ui/views/metadata/view_factory.h" +namespace views { +class Button; +class Separator; +} // namespace views + namespace ash { class FloatingMenuButton; @@ -40,6 +44,9 @@ void UpdateEventType(AutoclickEventType type); void UpdatePosition(FloatingMenuPosition position); + // views::BoxLayoutView: + void OnThemeChanged() override; + private: void OnAutoclickButtonPressed(views::Button* sender); void OnPositionButtonPressed(); @@ -52,6 +59,7 @@ FloatingMenuButton* scroll_button_ = nullptr; FloatingMenuButton* pause_button_ = nullptr; FloatingMenuButton* position_button_ = nullptr; + views::Separator* separator_ = nullptr; // The most recently selected event_type_ excluding kNoAction. This is used // when the pause button is selected in order to unpause and reset to the
diff --git a/ash/system/diagnostics/diagnostics_log_controller.cc b/ash/system/diagnostics/diagnostics_log_controller.cc index 9688eabd..735c7bb 100644 --- a/ash/system/diagnostics/diagnostics_log_controller.cc +++ b/ash/system/diagnostics/diagnostics_log_controller.cc
@@ -114,8 +114,8 @@ } // Fetch system routines from RoutineLog. - const std::string system_routines = - routine_log_->GetContentsForCategory("system"); + const std::string system_routines = routine_log_->GetContentsForCategory( + RoutineLog::RoutineCategory::kSystem); // Add the routine section for the system category. log_pieces.push_back(GetRoutineResultsString(system_routines)); @@ -127,8 +127,8 @@ log_pieces.push_back(networking_log_->GetNetworkInfo()); // Add the routine section for the network category. - const std::string network_routines = - routine_log_->GetContentsForCategory("network"); + const std::string network_routines = routine_log_->GetContentsForCategory( + RoutineLog::RoutineCategory::kNetwork); log_pieces.push_back(GetRoutineResultsString(network_routines)); // Add the network events section.
diff --git a/ash/system/diagnostics/diagnostics_log_controller_unittest.cc b/ash/system/diagnostics/diagnostics_log_controller_unittest.cc index 02aa1ee7..785b8283 100644 --- a/ash/system/diagnostics/diagnostics_log_controller_unittest.cc +++ b/ash/system/diagnostics/diagnostics_log_controller_unittest.cc
@@ -310,8 +310,12 @@ // Wait for Append tasks which create the logs to complete. task_environment()->RunUntilIdle(); - EXPECT_FALSE(routine_log->GetContentsForCategory("network").empty()); - EXPECT_FALSE(routine_log->GetContentsForCategory("system").empty()); + EXPECT_FALSE( + routine_log->GetContentsForCategory(RoutineLog::RoutineCategory::kNetwork) + .empty()); + EXPECT_FALSE( + routine_log->GetContentsForCategory(RoutineLog::RoutineCategory::kSystem) + .empty()); EXPECT_TRUE(base::PathExists( expected_diagnostics_log_path.Append("network_events.log"))); EXPECT_TRUE(base::PathExists(expected_diagnostics_log_path.Append(
diff --git a/ash/system/diagnostics/routine_log.cc b/ash/system/diagnostics/routine_log.cc index ab93807c..3456925 100644 --- a/ash/system/diagnostics/routine_log.cc +++ b/ash/system/diagnostics/routine_log.cc
@@ -26,6 +26,15 @@ return base::UTF16ToUTF8(base::TimeFormatShortDateAndTime(base::Time::Now())); } +std::string GetRoutineLogCategoryString(RoutineLog::RoutineCategory category) { + switch (category) { + case RoutineLog::RoutineCategory::kNetwork: + return "network"; + case RoutineLog::RoutineCategory::kSystem: + return "system"; + } +} + std::string getRoutineResultString(mojom::StandardRoutineResult result) { switch (result) { case mojom::StandardRoutineResult::kTestPassed: @@ -51,7 +60,7 @@ } // Get the category for the routine `type`. -std::string GetRoutineCategory(mojom::RoutineType type) { +RoutineLog::RoutineCategory GetRoutineCategory(mojom::RoutineType type) { switch (type) { case mojom::RoutineType::kBatteryCharge: case mojom::RoutineType::kBatteryDischarge: @@ -60,7 +69,7 @@ case mojom::RoutineType::kCpuFloatingPoint: case mojom::RoutineType::kCpuPrime: case mojom::RoutineType::kMemory: - return "system"; + return RoutineLog::RoutineCategory::kSystem; case mojom::RoutineType::kLanConnectivity: case mojom::RoutineType::kSignalStrength: case mojom::RoutineType::kGatewayCanBePinged: @@ -75,7 +84,7 @@ case mojom::RoutineType::kArcHttp: case mojom::RoutineType::kArcPing: case mojom::RoutineType::kArcDnsResolution: - return "network"; + return RoutineLog::RoutineCategory::kNetwork; }; } @@ -111,7 +120,7 @@ } std::string RoutineLog::GetContentsForCategory( - const std::string& category) const { + const RoutineCategory category) const { const auto iter = logs_.find(category); if (iter == logs_.end()) { return ""; @@ -121,7 +130,7 @@ } void RoutineLog::Append(mojom::RoutineType type, const std::string& text) { - std::string category = GetRoutineCategory(type); + RoutineCategory category = GetRoutineCategory(type); // Insert a new log if it doesn't exist then append to it. base::FilePath log_path = GetCategoryLogFilePath(category); @@ -133,8 +142,10 @@ iter->second->Append(text); } -base::FilePath RoutineLog::GetCategoryLogFilePath(const std::string& category) { - std::string name = "diagnostics_routines_" + category + ".log"; +base::FilePath RoutineLog::GetCategoryLogFilePath( + const RoutineCategory category) { + std::string name = + "diagnostics_routines_" + GetRoutineLogCategoryString(category) + ".log"; return log_base_path_.Append(name); }
diff --git a/ash/system/diagnostics/routine_log.h b/ash/system/diagnostics/routine_log.h index 9890e9d..d09c497e 100644 --- a/ash/system/diagnostics/routine_log.h +++ b/ash/system/diagnostics/routine_log.h
@@ -24,6 +24,11 @@ // "diagnostics_routines_{category_name}.log". class ASH_EXPORT RoutineLog { public: + enum class RoutineCategory { + kNetwork = 0, + kSystem = 1, + }; + explicit RoutineLog(const base::FilePath& log_base_path); ~RoutineLog(); @@ -39,20 +44,20 @@ void LogRoutineCancelled(mojom::RoutineType type); // Returns the current RoutineLog as a string. - std::string GetContentsForCategory(const std::string& category) const; + std::string GetContentsForCategory(const RoutineCategory category) const; private: // Append `text` to the category corresponding to `type`. void Append(mojom::RoutineType type, const std::string& text); // Get the path to the log file for `category`. - base::FilePath GetCategoryLogFilePath(const std::string& category); + base::FilePath GetCategoryLogFilePath(const RoutineCategory category); // The base directory for storing logs. const base::FilePath log_base_path_; // A map of log files where the key is the category. - base::flat_map<std::string, std::unique_ptr<AsyncLog>> logs_; + base::flat_map<RoutineCategory, std::unique_ptr<AsyncLog>> logs_; }; } // namespace diagnostics
diff --git a/ash/system/diagnostics/routine_log_unittest.cc b/ash/system/diagnostics/routine_log_unittest.cc index d2e3eb3e..cdf8534a 100644 --- a/ash/system/diagnostics/routine_log_unittest.cc +++ b/ash/system/diagnostics/routine_log_unittest.cc
@@ -49,7 +49,8 @@ task_environment_.RunUntilIdle(); EXPECT_FALSE(base::PathExists(log_path_)); - EXPECT_TRUE(log.GetContentsForCategory("all").empty()); + EXPECT_TRUE( + log.GetContentsForCategory(RoutineLog::RoutineCategory::kSystem).empty()); } TEST_F(RoutineLogTest, Basic) { @@ -62,7 +63,8 @@ EXPECT_TRUE(base::PathExists(log_path_)); - const std::string contents = log.GetContentsForCategory("system"); + const std::string contents = + log.GetContentsForCategory(RoutineLog::RoutineCategory::kSystem); const std::string first_line = GetLogLines(contents)[0]; const std::vector<std::string> first_line_contents = GetLogLineContents(first_line); @@ -84,7 +86,8 @@ EXPECT_TRUE(base::PathExists(log_path_)); - const std::string contents = log.GetContentsForCategory("system"); + const std::string contents = + log.GetContentsForCategory(RoutineLog::RoutineCategory::kSystem); const std::vector<std::string> log_lines = GetLogLines(contents); const std::string first_line = log_lines[0]; const std::vector<std::string> first_line_contents = @@ -114,7 +117,8 @@ EXPECT_TRUE(base::PathExists(log_path_)); - const std::string contents = log.GetContentsForCategory("system"); + const std::string contents = + log.GetContentsForCategory(RoutineLog::RoutineCategory::kSystem); LOG(ERROR) << contents; const std::vector<std::string> log_lines = GetLogLines(contents);
diff --git a/ash/system/human_presence/lock_on_leave_controller.cc b/ash/system/human_presence/lock_on_leave_controller.cc index 5fb82d2..abe90d6 100644 --- a/ash/system/human_presence/lock_on_leave_controller.cc +++ b/ash/system/human_presence/lock_on_leave_controller.cc
@@ -6,7 +6,7 @@ #include "ash/shell.h" #include "base/bind.h" -#include "chromeos/components/human_presence/human_presence_configuration.h" +#include "chromeos/ash/components/human_presence/human_presence_configuration.h" #include "chromeos/dbus/human_presence/human_presence_dbus_client.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -65,9 +65,9 @@ ReconfigViaDbus(); } -void LockOnLeaveController::OnHpsSenseChanged(hps::HpsResult state) {} +void LockOnLeaveController::OnHpsSenseChanged(const hps::HpsResultProto&) {} -void LockOnLeaveController::OnHpsNotifyChanged(hps::HpsResult state) {} +void LockOnLeaveController::OnHpsNotifyChanged(const hps::HpsResultProto&) {} void LockOnLeaveController::OnRestart() { service_available_ = true;
diff --git a/ash/system/human_presence/lock_on_leave_controller.h b/ash/system/human_presence/lock_on_leave_controller.h index 1f504354..9515679d 100644 --- a/ash/system/human_presence/lock_on_leave_controller.h +++ b/ash/system/human_presence/lock_on_leave_controller.h
@@ -48,8 +48,8 @@ void OnOrientationChanged(bool suitable_for_human_presence) override; // chromeos::HumanPresenceDBusClient::Observer: - void OnHpsSenseChanged(hps::HpsResult state) override; - void OnHpsNotifyChanged(hps::HpsResult state) override; + void OnHpsSenseChanged(const hps::HpsResultProto&) override; + void OnHpsNotifyChanged(const hps::HpsResultProto&) override; // Re-enables LockOnLeave on human presence service restart if it was enabled // before. void OnRestart() override;
diff --git a/ash/system/human_presence/snooping_protection_controller.cc b/ash/system/human_presence/snooping_protection_controller.cc index 0905cff..0cf9645 100644 --- a/ash/system/human_presence/snooping_protection_controller.cc +++ b/ash/system/human_presence/snooping_protection_controller.cc
@@ -17,7 +17,7 @@ #include "base/metrics/histogram_functions.h" #include "base/time/time.h" #include "base/timer/timer.h" -#include "chromeos/components/human_presence/human_presence_configuration.h" +#include "chromeos/ash/components/human_presence/human_presence_configuration.h" #include "chromeos/dbus/hps/hps_service.pb.h" #include "components/account_id/account_id.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -133,11 +133,12 @@ UpdateSnooperStatus(new_state); } -void SnoopingProtectionController::OnHpsSenseChanged(hps::HpsResult) {} +void SnoopingProtectionController::OnHpsSenseChanged( + const hps::HpsResultProto&) {} void SnoopingProtectionController::OnHpsNotifyChanged( - hps::HpsResult detection_state) { - const bool present = detection_state == hps::HpsResult::POSITIVE; + const hps::HpsResultProto& result) { + const bool present = result.value() == hps::HpsResult::POSITIVE; State new_state = state_; new_state.present = present; @@ -280,12 +281,12 @@ } void SnoopingProtectionController::UpdateServiceState( - absl::optional<hps::HpsResult> response) { + absl::optional<hps::HpsResultProto> response) { LOG_IF(WARNING, !response.has_value()) << "Polling the presence daemon failed"; const bool present = - response.value_or(hps::HpsResult::NEGATIVE) == hps::HpsResult::POSITIVE; + response.has_value() && response->value() == hps::HpsResult::POSITIVE; State new_state = state_; new_state.present = present;
diff --git a/ash/system/human_presence/snooping_protection_controller.h b/ash/system/human_presence/snooping_protection_controller.h index 20598cf..8944aac 100644 --- a/ash/system/human_presence/snooping_protection_controller.h +++ b/ash/system/human_presence/snooping_protection_controller.h
@@ -63,8 +63,8 @@ void OnOrientationChanged(bool suitable_for_human_presence) override; // chromeos::HumanPresenceDBusClient::Observer: - void OnHpsSenseChanged(hps::HpsResult state) override; - void OnHpsNotifyChanged(hps::HpsResult state) override; + void OnHpsSenseChanged(const hps::HpsResultProto&) override; + void OnHpsNotifyChanged(const hps::HpsResultProto&) override; void OnRestart() override; void OnShutdown() override; @@ -115,7 +115,7 @@ void StartServiceObservation(bool service_is_available); // Performs the state update from the daemon response. - void UpdateServiceState(absl::optional<hps::HpsResult> result); + void UpdateServiceState(absl::optional<hps::HpsResultProto> result); // A callback to update visibility when the user enables or disables the // feature.
diff --git a/ash/system/human_presence/snooping_protection_controller_unittest.cc b/ash/system/human_presence/snooping_protection_controller_unittest.cc index 35f00ef..5d870cb6 100644 --- a/ash/system/human_presence/snooping_protection_controller_unittest.cc +++ b/ash/system/human_presence/snooping_protection_controller_unittest.cc
@@ -64,8 +64,10 @@ chromeos::HumanPresenceDBusClient::InitializeFake(); dbus_client_ = chromeos::FakeHumanPresenceDBusClient::Get(); dbus_client_->set_hps_service_is_available(service_available_); - dbus_client_->set_hps_notify_result( - service_state_ ? hps::HpsResult::POSITIVE : hps::HpsResult::NEGATIVE); + hps::HpsResultProto state; + state.set_value(service_state_ ? hps::HpsResult::POSITIVE + : hps::HpsResult::NEGATIVE); + dbus_client_->set_hps_notify_result(state); AshTestBase::SetUp(); @@ -144,12 +146,15 @@ EXPECT_FALSE(controller_->SnooperPresent()); - controller_->OnHpsNotifyChanged(hps::HpsResult::POSITIVE); + hps::HpsResultProto state; + state.set_value(hps::HpsResult::POSITIVE); + controller_->OnHpsNotifyChanged(state); task_environment()->FastForwardBy(kLongTime); EXPECT_TRUE(controller_->SnooperPresent()); - controller_->OnHpsNotifyChanged(hps::HpsResult::NEGATIVE); + state.set_value(hps::HpsResult::NEGATIVE); + controller_->OnHpsNotifyChanged(state); task_environment()->FastForwardBy(kLongTime); EXPECT_FALSE(controller_->SnooperPresent()); @@ -395,7 +400,9 @@ EXPECT_EQ(dbus_client_->hps_notify_count(), 1); EXPECT_TRUE(controller_->SnooperPresent()); - controller_->OnHpsNotifyChanged(hps::HpsResult::NEGATIVE); + hps::HpsResultProto state; + state.set_value(hps::HpsResult::NEGATIVE); + controller_->OnHpsNotifyChanged(state); // The snooping status shouldn't immediately change, since we have a minimum // length that it should remain positive. @@ -407,7 +414,8 @@ EXPECT_FALSE(controller_->SnooperPresent()); // Snooping status should always immediately become true and stay true. - controller_->OnHpsNotifyChanged(hps::HpsResult::POSITIVE); + state.set_value(hps::HpsResult::POSITIVE); + controller_->OnHpsNotifyChanged(state); EXPECT_TRUE(controller_->SnooperPresent()); task_environment()->FastForwardBy(kLongTime); EXPECT_TRUE(controller_->SnooperPresent());
diff --git a/ash/system/human_presence/snooping_protection_notification_blocker_unittest.cc b/ash/system/human_presence/snooping_protection_notification_blocker_unittest.cc index 3a4663f..fb984dd 100644 --- a/ash/system/human_presence/snooping_protection_notification_blocker_unittest.cc +++ b/ash/system/human_presence/snooping_protection_notification_blocker_unittest.cc
@@ -199,7 +199,9 @@ chromeos::HumanPresenceDBusClient::InitializeFake(); auto* dbus_client = chromeos::FakeHumanPresenceDBusClient::Get(); dbus_client->set_hps_service_is_available(true); - dbus_client->set_hps_notify_result(hps::HpsResult::NEGATIVE); + hps::HpsResultProto state; + state.set_value(hps::HpsResult::NEGATIVE); + dbus_client->set_hps_notify_result(state); AshTestBase::SetUp(); @@ -256,7 +258,9 @@ EXPECT_EQ(VisibleNotificationCount(), 1u); // Simulate snooper presence. - controller_->OnHpsNotifyChanged(/*state=*/hps::HpsResult::POSITIVE); + hps::HpsResultProto state; + state.set_value(hps::HpsResult::POSITIVE); + controller_->OnHpsNotifyChanged(state); // When snooping is detected, the popup notification should be hidden but // remain in the notification queue. Note that, since the popup has been @@ -272,7 +276,8 @@ // Simulate snooper absence. We wait for a moment to bypass the controller's // hysteresis logic. - controller_->OnHpsNotifyChanged(/*state=*/hps::HpsResult::NEGATIVE); + state.set_value(hps::HpsResult::NEGATIVE); + controller_->OnHpsNotifyChanged(state); task_environment()->FastForwardBy(base::Seconds(10)); // The unshown popups should appear since snooper has left. @@ -291,7 +296,9 @@ EXPECT_EQ(VisibleNotificationCount(), 1u); // Simulate snooper presence. - controller_->OnHpsNotifyChanged(/*snooper=*/hps::HpsResult::POSITIVE); + hps::HpsResultProto state; + state.set_value(hps::HpsResult::POSITIVE); + controller_->OnHpsNotifyChanged(state); // Notifications should be visible up until the user enables the feature. EXPECT_EQ(VisiblePopupCount(), 1u); @@ -339,7 +346,9 @@ EXPECT_EQ(VisibleNotificationCount(), 3u); // Simulate snooper presence. - controller_->OnHpsNotifyChanged(/*snooper=*/hps::HpsResult::POSITIVE); + hps::HpsResultProto state; + state.set_value(hps::HpsResult::POSITIVE); + controller_->OnHpsNotifyChanged(state); // The safe notification shouldn't be suppressed, but the sensitive // notification should be. @@ -357,7 +366,9 @@ SetBlockerPref(true); // Simulate snooper presence. - controller_->OnHpsNotifyChanged(/*snooper=*/hps::HpsResult::POSITIVE); + hps::HpsResultProto state; + state.set_value(hps::HpsResult::POSITIVE); + controller_->OnHpsNotifyChanged(state); // Two notifications we're blocking. AddNotification("notification-1", u"notifier-1"); @@ -386,7 +397,9 @@ SetBlockerPref(true); // Simulate snooper presence. - controller_->OnHpsNotifyChanged(/*snooper=*/hps::HpsResult::POSITIVE); + hps::HpsResultProto state; + state.set_value(hps::HpsResult::POSITIVE); + controller_->OnHpsNotifyChanged(state); // One notification only we are blocking, and one notification that is also // blocked by another blocker. @@ -416,7 +429,9 @@ SetBlockerPref(true); // Simulate snooper presence. - controller_->OnHpsNotifyChanged(/*snooper=*/hps::HpsResult::POSITIVE); + hps::HpsResultProto state; + state.set_value(hps::HpsResult::POSITIVE); + controller_->OnHpsNotifyChanged(state); // Newer notifiers should come before older ones. AddNotification("notification-1", u"notifier-1"); @@ -462,7 +477,9 @@ SetBlockerPref(true); // Simulate snooper presence. - controller_->OnHpsNotifyChanged(/*snooper=*/hps::HpsResult::POSITIVE); + hps::HpsResultProto state; + state.set_value(hps::HpsResult::POSITIVE); + controller_->OnHpsNotifyChanged(state); AddNotification("notification-1", u"notifier-1"); AddNotification("notification-2", u"notifier-2"); @@ -479,7 +496,9 @@ SetBlockerPref(true); // Simulate snooper presence. - controller_->OnHpsNotifyChanged(/*snooper=*/hps::HpsResult::POSITIVE); + hps::HpsResultProto state; + state.set_value(hps::HpsResult::POSITIVE); + controller_->OnHpsNotifyChanged(state); AddNotification("notification-1", u"notifier-1"); AddNotification("notification-2", u"notifier-2");
diff --git a/ash/system/power/power_prefs.cc b/ash/system/power/power_prefs.cc index c316812..802b30b 100644 --- a/ash/system/power/power_prefs.cc +++ b/ash/system/power/power_prefs.cc
@@ -16,7 +16,7 @@ #include "base/callback.h" #include "base/metrics/histogram_functions.h" #include "base/time/default_tick_clock.h" -#include "chromeos/components/human_presence/human_presence_configuration.h" +#include "chromeos/ash/components/human_presence/human_presence_configuration.h" #include "chromeos/dbus/power/power_policy_controller.h" #include "chromeos/dbus/power_manager/idle.pb.h" #include "chromeos/dbus/power_manager/policy.pb.h"
diff --git a/ash/system/power/power_prefs_unittest.cc b/ash/system/power/power_prefs_unittest.cc index 799fb88..0d4f73b 100644 --- a/ash/system/power/power_prefs_unittest.cc +++ b/ash/system/power/power_prefs_unittest.cc
@@ -23,7 +23,7 @@ #include "base/test/scoped_command_line.h" #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_tick_clock.h" -#include "chromeos/components/human_presence/human_presence_configuration.h" +#include "chromeos/ash/components/human_presence/human_presence_configuration.h" #include "chromeos/dbus/human_presence/fake_human_presence_dbus_client.h" #include "chromeos/dbus/power/fake_power_manager_client.h" #include "chromeos/dbus/power/power_policy_controller.h"
diff --git a/ash/webui/camera_app_ui/BUILD.gn b/ash/webui/camera_app_ui/BUILD.gn index c1fda90..905352e7 100644 --- a/ash/webui/camera_app_ui/BUILD.gn +++ b/ash/webui/camera_app_ui/BUILD.gn
@@ -73,12 +73,18 @@ source_set("document_scanning") { sources = [ + "document_scanner_installer.cc", + "document_scanner_installer.h", "document_scanner_service_client.cc", "document_scanner_service_client.h", ] + public_deps = [ "//dbus" ] + deps = [ "//base", + "//chromeos/dbus/dlcservice", + "//chromeos/dbus/dlcservice:dlcservice_proto", "//chromeos/services/machine_learning/public/cpp", "//chromeos/services/machine_learning/public/mojom", "//components/device_event_log",
diff --git a/ash/webui/camera_app_ui/document_scanner_installer.cc b/ash/webui/camera_app_ui/document_scanner_installer.cc new file mode 100644 index 0000000..1cc7d61 --- /dev/null +++ b/ash/webui/camera_app_ui/document_scanner_installer.cc
@@ -0,0 +1,65 @@ +// 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/webui/camera_app_ui/document_scanner_installer.h" + +#include "base/callback_helpers.h" +#include "base/logging.h" +#include "base/threading/thread_task_runner_handle.h" + +namespace ash { + +namespace { + +constexpr char kDocumentScannerDlcId[] = "cros-camera-document-scanner-dlc"; + +} // namespace + +// static +DocumentScannerInstaller* DocumentScannerInstaller::GetInstance() { + return base::Singleton<DocumentScannerInstaller>::get(); +} + +DocumentScannerInstaller::~DocumentScannerInstaller() = default; + +void DocumentScannerInstaller::GetLibraryPath( + OnGetLibraryPathCallback callback) { + base::AutoLock auto_lock(library_path_lock_); + if (library_path_.empty()) { + get_library_path_callbacks_.push_back(std::move(callback)); + return; + } + std::move(callback).Run(library_path_); +} + +void DocumentScannerInstaller::TriggerInstall() { + DCHECK(ui_task_runner_->RunsTasksInCurrentSequence()); + + dlcservice::InstallRequest install_request; + install_request.set_id(kDocumentScannerDlcId); + chromeos::DlcserviceClient::Get()->Install( + install_request, + base::BindOnce(&DocumentScannerInstaller::OnInstalled, + base::Unretained(this)), + base::DoNothing()); +} + +DocumentScannerInstaller::DocumentScannerInstaller() + : ui_task_runner_(base::ThreadTaskRunnerHandle::Get()) {} + +void DocumentScannerInstaller::OnInstalled( + const chromeos::DlcserviceClient::InstallResult& install_result) { + base::AutoLock auto_lock(library_path_lock_); + if (install_result.error == dlcservice::kErrorNone) { + library_path_ = install_result.root_path; + for (auto& callback : get_library_path_callbacks_) { + std::move(callback).Run(library_path_); + } + get_library_path_callbacks_.clear(); + } else { + LOG(ERROR) << "Failed to install document scanner DLC"; + } +} + +} // namespace ash
diff --git a/ash/webui/camera_app_ui/document_scanner_installer.h b/ash/webui/camera_app_ui/document_scanner_installer.h new file mode 100644 index 0000000..c6e974e --- /dev/null +++ b/ash/webui/camera_app_ui/document_scanner_installer.h
@@ -0,0 +1,63 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_WEBUI_CAMERA_APP_UI_DOCUMENT_SCANNER_INSTALLER_H_ +#define ASH_WEBUI_CAMERA_APP_UI_DOCUMENT_SCANNER_INSTALLER_H_ + +#include <memory> +#include <string> +#include <vector> + +#include "base/callback.h" +#include "base/memory/singleton.h" +#include "base/memory/weak_ptr.h" +#include "base/synchronization/lock.h" +#include "base/task/single_thread_task_runner.h" +#include "base/time/time.h" +#include "chromeos/dbus/dlcservice/dlcservice_client.h" + +namespace ash { + +// Singleton installer for document scanner library via DLC service. +class DocumentScannerInstaller { + public: + using OnGetLibraryPathCallback = + base::OnceCallback<void(const std::string& library_path)>; + + static DocumentScannerInstaller* GetInstance(); + + DocumentScannerInstaller(const DocumentScannerInstaller&) = delete; + DocumentScannerInstaller& operator=(const DocumentScannerInstaller&) = delete; + ~DocumentScannerInstaller(); + + void GetLibraryPath(OnGetLibraryPathCallback callback); + + // It should only be called on the UI thread. + void TriggerInstall(); + + private: + friend struct base::DefaultSingletonTraits<DocumentScannerInstaller>; + + DocumentScannerInstaller(); + + void OnInstalled( + const chromeos::DlcserviceClient::InstallResult& install_result); + + std::string library_path_ GUARDED_BY(library_path_lock_); + + std::vector<OnGetLibraryPathCallback> get_library_path_callbacks_ + GUARDED_BY(library_path_lock_); + + scoped_refptr<base::SingleThreadTaskRunner> original_task_runner_ = nullptr; + + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_ = nullptr; + + base::Lock library_path_lock_; + + base::WeakPtrFactory<DocumentScannerInstaller> weak_ptr_factory_{this}; +}; + +} // namespace ash + +#endif // ASH_WEBUI_CAMERA_APP_UI_DOCUMENT_SCANNER_INSTALLER_H_
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb index 18ceae5..c6e22f2 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_af.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">Hou op om foto te neem</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapieksel</translation> <translation id="4570032796877367747">Voorste kamera</translation> +<translation id="4620818268515773682">Wissel mikrofoondempknoppie. Demp is af</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">Kan nie die lêer stoor nie</translation> <translation id="4695379108709712600">Beweeg tans na bo</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">Kantel af</translation> <translation id="8428213095426709021">Instellings</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" /> p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">Wissel mikrofoondempknoppie. Demp is aan</translation> <translation id="8712637175834984815">Het dit</translation> <translation id="8730621377337864115">Gedoen</translation> <translation id="8732462232047530626">Voorbeskou metadata</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb index 39bf6b8..90b21c3 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_am.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">ፎቶን ማንሳት አቁም</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> ሜጋ ፒክሴል</translation> <translation id="4570032796877367747">የፊት ካሜራ</translation> +<translation id="4620818268515773682">የማይክሮፎን ድምጸ-ከል መቀያየሪያ ድምጽ-ከል ጠፍቷል</translation> <translation id="4628948037717959914">ፎቶ</translation> <translation id="4649291346448517080">ፋይሉን ማስቀመጥ አልተሳካም</translation> <translation id="4695379108709712600">ወደ ላይ አቅጣጫ በመንቀሳቀስ ላይ</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">ወደ ታች አጋድል</translation> <translation id="8428213095426709021">ቅንብሮች</translation> <translation id="8687491812650032292">ኤችዲ <ph name="HEIGHT" />ፒ (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">የማይክሮፎን ድምጸ-ከል መቀያየሪያ ድምጸ-ከል በርቷል</translation> <translation id="8712637175834984815">ገባኝ</translation> <translation id="8730621377337864115">ተከናውኗል</translation> <translation id="8732462232047530626">የቅድመ እይታ ዲበ ውሂብ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb index 8b84478..4679fd2b 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb
@@ -80,6 +80,7 @@ <translation id="4445542136948522167">Foto çəkməyi dayandırın</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> meqa piksel</translation> <translation id="4570032796877367747">Ön kamera</translation> +<translation id="4620818268515773682">Mikrofonu səssisə keçirin. Susdurma düyməsi deaktivdir</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">Faylı yadda saxlamaq mümkün deyil</translation> <translation id="4695379108709712600">Yuxarı tərəfə daşınır</translation> @@ -156,6 +157,7 @@ <translation id="8425673304802773841">Aşağı əyin</translation> <translation id="8428213095426709021">Ayarlar</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">Mikrofonu səssisə keçirin. Susdurma düyməsi aktivdir</translation> <translation id="8712637175834984815">Anladım</translation> <translation id="8730621377337864115">Tamamdır</translation> <translation id="8732462232047530626">Metadatanı önizləyin</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb index 39eef156..46ae319 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">ফটো তোলা বন্ধ করুন</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> মেগা পিক্সেল</translation> <translation id="4570032796877367747">সামনের ক্যামেরা</translation> +<translation id="4620818268515773682">মাইক্রোফোন মিউট করার স্ট্যাটাস টগল করুন। মিউট মোড এখন বন্ধ আছে</translation> <translation id="4628948037717959914">ফটো</translation> <translation id="4649291346448517080">ফাইল সেভ করা যাচ্ছে না</translation> <translation id="4695379108709712600">উপরের দিকে সরানো হচ্ছে</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">নীচের দিকে টিল্ট করুন</translation> <translation id="8428213095426709021">সেটিংস</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">মাইক্রোফোন মিউট করার স্ট্যাটাস টগল করুন। মিউট মোড এখন চালু আছে</translation> <translation id="8712637175834984815">বুঝেছি</translation> <translation id="8730621377337864115">হয়ে গেছে</translation> <translation id="8732462232047530626">মেটাডেটা প্রিভিউ করুন</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb index 745f4ca..e70fdcf 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">Stop med at tage billedet</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapixels</translation> <translation id="4570032796877367747">Frontkamera</translation> +<translation id="4620818268515773682">Slå mikrofonen til eller fra. Lyden er slået til</translation> <translation id="4628948037717959914">Billede</translation> <translation id="4649291346448517080">Filen kan ikke gemmes</translation> <translation id="4695379108709712600">Flyttes opad</translation> @@ -159,6 +160,7 @@ <translation id="8425673304802773841">Drej nedad</translation> <translation id="8428213095426709021">Indstillinger</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">Slå mikrofonen til eller fra. Lyden er slået fra</translation> <translation id="8712637175834984815">Forstået</translation> <translation id="8730621377337864115">Udfør</translation> <translation id="8732462232047530626">Se forhåndsvisning af metadata</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb index 02c3adc..851e622 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb
@@ -146,6 +146,7 @@ <translation id="7658239707568436148">Cancel</translation> <translation id="7670511624014457267">60 FPS</translation> <translation id="7671804233658741790">Document bottom-right corner</translation> +<translation id="7692090236657809299">Enable pan tilt zoom</translation> <translation id="7726641833034062494">Record normal video</translation> <translation id="7748344063862150053">Document top-right corner</translation> <translation id="7933675232020478311">Moving in bottom-right direction</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb index fa3e443..1b366e0 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">Utzi argazkia ateratzeari</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapixel</translation> <translation id="4570032796877367747">Aurreko kamera</translation> +<translation id="4620818268515773682">Aktibatu edo desaktibatu mikrofonoa. Mikrofonoa aktibatuta dago.</translation> <translation id="4628948037717959914">Argazkia</translation> <translation id="4649291346448517080">Ezin da gorde fitxategia</translation> <translation id="4695379108709712600">Gora mugitzen ari da</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">Okertu beherantz</translation> <translation id="8428213095426709021">Ezarpenak</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">Aktibatu edo desaktibatu mikrofonoa. Mikrofonoa desaktibatuta dago.</translation> <translation id="8712637175834984815">Ados</translation> <translation id="8730621377337864115">Eginda</translation> <translation id="8732462232047530626">Aurreikusi metadatuak</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb index fe5a16f..74cfa1e 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">توقف عکسبرداری</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> مگاپیکسل</translation> <translation id="4570032796877367747">دوربین جلو</translation> +<translation id="4620818268515773682">وضعیت بیصدا بودن میکروفون را تغییر دهید. میکروفون صدادار است</translation> <translation id="4628948037717959914">عکس</translation> <translation id="4649291346448517080">فایل ذخیره نشد</translation> <translation id="4695379108709712600">درحال انتقال بهسمت بالا</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">پایین کشیدن</translation> <translation id="8428213095426709021">تنظیمات</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">وضعیت بیصدا بودن میکروفون را تغییر دهید. میکروفون بیصدا است</translation> <translation id="8712637175834984815">متوجه شدم</translation> <translation id="8730621377337864115">تمام</translation> <translation id="8732462232047530626">پیشنمایش فراداده</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb index ca85507..3ec49df 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fil.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">Ihinto ang pagkuha ng larawan</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> mega pixel</translation> <translation id="4570032796877367747">Camera sa harap</translation> +<translation id="4620818268515773682">I-toggle ang pagkaka-mute ng mikropono. Naka-off ang mute</translation> <translation id="4628948037717959914">Larawan</translation> <translation id="4649291346448517080">Hindi ma-save ang file</translation> <translation id="4695379108709712600">Gumagalaw pataas</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">I-tilt pababa</translation> <translation id="8428213095426709021">Mga Setting</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">I-toggle ang pagkaka-mute ng mikropono. Naka-on ang mute</translation> <translation id="8712637175834984815">Nakuha ko</translation> <translation id="8730621377337864115">Tapos na</translation> <translation id="8732462232047530626">I-preview ang metadata</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb index 71ed2129..395d242 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">ફોટા લેવાનું બંધ કરો</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> મેગાપિક્સેલ</translation> <translation id="4570032796877367747">આગળનો કૅમેરા</translation> +<translation id="4620818268515773682">માઇક્રોફોનને મ્યૂટ કરવાનું બટન ટૉગલ કરો. મ્યૂટ બટન બંધ છે</translation> <translation id="4628948037717959914">ફોટો</translation> <translation id="4649291346448517080">ફાઇલ સાચવવામાં નિષ્ફળ રહ્યાં</translation> <translation id="4695379108709712600">સૌથી ઉપરની દિશામાં ખસેડી રહ્યાં છીએ</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">નીચે ટિલ્ટ કરો</translation> <translation id="8428213095426709021">સેટિંગ</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">માઇક્રોફોનને મ્યૂટ કરવાનું બટન ટૉગલ કરો. મ્યૂટ બટન ચાલુ છે</translation> <translation id="8712637175834984815">સમજાઈ ગયું</translation> <translation id="8730621377337864115">થઈ ગયું</translation> <translation id="8732462232047530626">મેટાડેટાનું પ્રીવ્યૂ કરો</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb index 8c04bff..3008c63 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hy.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">Դադարեցնել լուսանկարումը</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> մեգապիքսել</translation> <translation id="4570032796877367747">Առջևի տեսախցիկ</translation> +<translation id="4620818268515773682">Միացնել/անջատել խոսափողը։ Խոսափողը միացված է։</translation> <translation id="4628948037717959914">Լուսանկար</translation> <translation id="4649291346448517080">Չհաջողվեց պահել ֆայլը</translation> <translation id="4695379108709712600">Տեղափոխվում է վերև</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">Թեքել ներքև</translation> <translation id="8428213095426709021">Կարգավորումներ</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">Միացնել/անջատել խոսափողը։ Խոսափողն անջատված է։</translation> <translation id="8712637175834984815">Պատրաստ է</translation> <translation id="8730621377337864115">Պատրաստ է</translation> <translation id="8732462232047530626">Դիտել մետատվյալները</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb index 6ee6c342..b4eaf67 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">Berhenti mengambil foto</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapiksel</translation> <translation id="4570032796877367747">Kamera depan</translation> +<translation id="4620818268515773682">Aktifkan/nonaktifkan tombol bisukan mikrofon. Bisukan nonaktif</translation> <translation id="4628948037717959914">Foto</translation> <translation id="4649291346448517080">Tidak dapat menyimpan file</translation> <translation id="4695379108709712600">Berpindah ke arah atas</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">Miringkan ke bawah</translation> <translation id="8428213095426709021">Setelan</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">Aktifkan/nonaktifkan tombol bisukan mikrofon. Bisukan aktif</translation> <translation id="8712637175834984815">Mengerti</translation> <translation id="8730621377337864115">Selesai</translation> <translation id="8732462232047530626">Lihat pratinjau metadata</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb index 2c4facb..71622c5 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">Зураг авахыг зогсоох</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> мега пиксел</translation> <translation id="4570032796877367747">Урд камер</translation> +<translation id="4620818268515773682">Микрофоны дууг хаах тохиргоог асаана уу/унтраана уу. Дууг хаах тохиргоо унтраалттай байна</translation> <translation id="4628948037717959914">Зураг</translation> <translation id="4649291346448517080">Файлыг хадгалах боломжгүй байна</translation> <translation id="4695379108709712600">Дээш зөөж байна</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">Доош хазайлгах</translation> <translation id="8428213095426709021">Тохиргоо</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />пиксел (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">Микрофоны дууг хаах тохиргоог асаана уу/унтраана уу. Дууг хаах тохиргоо асаалттай байна</translation> <translation id="8712637175834984815">Ойлголоо</translation> <translation id="8730621377337864115">хийсэн</translation> <translation id="8732462232047530626">Мета өгөгдлийг урьдчилан үзэх</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mr.xtb index 6609148..01cae06 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mr.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">फोटो घेणे थांबवा</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> मेगा पिक्सेल</translation> <translation id="4570032796877367747">पुढील कॅमेरा</translation> +<translation id="4620818268515773682">मायक्रोफोन म्यूट टॉगल करा. म्यूट बंद आहे</translation> <translation id="4628948037717959914">फोटो</translation> <translation id="4649291346448517080">फाइल सेव्ह करता आली नाही</translation> <translation id="4695379108709712600">सर्वात वरच्या दिशेने हलत आहे</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">खाली टिल्ट करा</translation> <translation id="8428213095426709021">सेटिंग्ज</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">मायक्रोफोन म्यूट टॉगल करा. म्यूट सुरू आहे</translation> <translation id="8712637175834984815">समजले</translation> <translation id="8730621377337864115">पूर्ण झाले</translation> <translation id="8732462232047530626">मेटाडेटाचे पूर्वावलोकन करा</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb index 1f58ae07..71b492f 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">ဓာတ်ပုံရိုက်ခြင်း ရပ်တန့်ရန်</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> မီဂါပစ်ဆယ်</translation> <translation id="4570032796877367747">အရှေ့ကင်မရာ</translation> +<translation id="4620818268515773682">မိုက်ခရိုဖုန်း အသံပိတ် ခလုတ်။ အသံတိတ်ခြင်း ပိတ်</translation> <translation id="4628948037717959914">ဓာတ်ပုံ</translation> <translation id="4649291346448517080">ဖိုင်ကို သိမ်း၍မရပါ</translation> <translation id="4695379108709712600">အပေါ် ဦးတည်ချက်အတိုင်း ရွေ့နေသည်</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">အောက်သို့ စောင်းရန်</translation> <translation id="8428213095426709021">ဆက်တင်များ</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">မိုက်ခရိုဖုန်း အသံပိတ် ခလုတ်။ အသံတိတ်ခြင်း ဖွင့်</translation> <translation id="8712637175834984815">ရပါပြီ!</translation> <translation id="8730621377337864115">ပြီးပါပြီ</translation> <translation id="8732462232047530626">မက်တာဒေတာကို အစမ်းကြည့်ရှုရန်</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb index 6b027d84..b7a2f83 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">तस्बिर खिच्न छाड्नुहोस्</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> मेगा पिक्सेल</translation> <translation id="4570032796877367747">अगाडिको क्यामेरा</translation> +<translation id="4620818268515773682">माइक्रोफोनका हकमा म्युट गर्ने सुविधासम्बन्धी सेटिङ टगल गर्नुहोस्। म्युट गर्ने सुविधा अफ छ</translation> <translation id="4628948037717959914">तस्बिर</translation> <translation id="4649291346448517080">फाइल सुरक्षित गर्न सकिएन</translation> <translation id="4695379108709712600">सिरानतिर सारिँदै छ</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">तलतिर ढल्काइयोस्</translation> <translation id="8428213095426709021">सेटिङहरू</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" /> पिक्सेल (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">माइक्रोफोनका हकमा म्युट गर्ने सुविधासम्बन्धी सेटिङ टगल गर्नुहोस्। म्युट गर्ने सुविधा अन छ</translation> <translation id="8712637175834984815">भयो</translation> <translation id="8730621377337864115">गरियो</translation> <translation id="8732462232047530626">मेटाडेटाको पूर्वावलोकन</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb index 6108bbc..fabbfb6a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">Slutt å ta bilde</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapiksel</translation> <translation id="4570032796877367747">Fremre kamera</translation> +<translation id="4620818268515773682">Slå av/på mikrofonlyden. Lyden er på</translation> <translation id="4628948037717959914">Bilde</translation> <translation id="4649291346448517080">Kan ikke lagre filen</translation> <translation id="4695379108709712600">Beveger seg oppover</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">Vipp ned</translation> <translation id="8428213095426709021">Innstillinger</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">Slå av/på mikrofonlyden. Lyden er kuttet</translation> <translation id="8712637175834984815">Skjønner</translation> <translation id="8730621377337864115">Ferdig</translation> <translation id="8732462232047530626">Forhåndsvis metadata</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb index 0d9bafe..61c984b 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">ਫ਼ੋਟੋ ਖਿੱਚਣਾ ਬੰਦ ਕਰੋ</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> ਮੈਗਾ ਪਿਕਸਲ</translation> <translation id="4570032796877367747">ਅਗਲਾ ਕੈਮਰਾ</translation> +<translation id="4620818268515773682">ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਨੂੰ ਮਿਊਟ 'ਤੇ ਟੌਗਲ ਕਰੋ। ਮਿਊਟ ਬੰਦ ਹੈ</translation> <translation id="4628948037717959914">ਫ਼ੋਟੋ</translation> <translation id="4649291346448517080">ਫ਼ਾਈਲ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ</translation> <translation id="4695379108709712600">ਇਹ ਉੱਪਰਲੇ ਪਾਸੇ ਵੱਲ ਜਾ ਰਿਹਾ ਹੈ</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">ਹੇਠਾਂ ਵੱਲ ਝੁਕਾਓ</translation> <translation id="8428213095426709021">ਸੈਟਿੰਗਾਂ</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਨੂੰ ਮਿਊਟ 'ਤੇ ਟੌਗਲ ਕਰੋ। ਮਿਊਟ ਚਾਲੂ ਹੈ</translation> <translation id="8712637175834984815">ਸਮਝ ਲਿਆ</translation> <translation id="8730621377337864115">ਹੋ ਗਿਆ</translation> <translation id="8732462232047530626">ਮੈਟਾਡਾਟੇ ਦੀ ਪੂਰਵ-ਝਲਕ ਦੇਖੋ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb index c1b846da..f5e47f3 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">ఫోటోను తీయడం ఆపివేయి</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> మెగా పిక్సెల్</translation> <translation id="4570032796877367747">ముందువైపు కెమెరా</translation> +<translation id="4620818268515773682">మైక్రోఫోన్ను మ్యూట్కు టోగుల్ చేయండి. మ్యూట్ ఆఫ్లో ఉంది</translation> <translation id="4628948037717959914">ఫోటో</translation> <translation id="4649291346448517080">ఫైల్ను సేవ్ చేయడం సాధ్యం కాలేదు</translation> <translation id="4695379108709712600">ఎగువ వైపునకు కదులుతోంది</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">కిందికి టిల్ట్ చేయి</translation> <translation id="8428213095426709021">సెట్టింగ్లు</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">మైక్రోఫోన్ను మ్యూట్కు టోగుల్ చేయండి. మ్యూట్ ఆన్లో ఉంది</translation> <translation id="8712637175834984815">అర్థమైంది</translation> <translation id="8730621377337864115">పూర్తయింది</translation> <translation id="8732462232047530626">మెటాడేటాను ప్రివ్యూ చేయి</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb index 2a84235..e3746446 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ur.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">تصویر لینا بند کریں</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> میگا پکسل</translation> <translation id="4570032796877367747">سامنے کا کیمرہ</translation> +<translation id="4620818268515773682">مائیکروفون خاموش بٹن کو ٹوگل کریں خاموش کریں بٹن آف ہے</translation> <translation id="4628948037717959914">تصویر</translation> <translation id="4649291346448517080">فائل کو محفوظ کرنے سے قاصر</translation> <translation id="4695379108709712600">اوپر کی سمت میں جا رہا ہے</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">نیچے کی طرف جھکائیں</translation> <translation id="8428213095426709021">ترتیبات</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">مائیکروفون خاموش بٹن کو ٹوگل کریں خاموش کریں بٹن آن ہے</translation> <translation id="8712637175834984815">سمجھ آ گئی</translation> <translation id="8730621377337864115">ہوگیا</translation> <translation id="8732462232047530626">میٹا ڈیٹا کا پیش منظر</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb index 1c7f570..e3be8bb 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">Dừng chụp ảnh</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> megapixel</translation> <translation id="4570032796877367747">Máy ảnh mặt trước</translation> +<translation id="4620818268515773682">Bật/tắt micrô. Chế độ tắt tiếng đang tắt</translation> <translation id="4628948037717959914">Ảnh</translation> <translation id="4649291346448517080">Không thể lưu tệp</translation> <translation id="4695379108709712600">Đang di chuyển theo hướng lên trên</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">Xoay xuống</translation> <translation id="8428213095426709021">Cài đặt</translation> <translation id="8687491812650032292">HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">Bật/tắt micrô. Chế độ tắt tiếng đang bật</translation> <translation id="8712637175834984815">Bỏ qua</translation> <translation id="8730621377337864115">Xong</translation> <translation id="8732462232047530626">Xem trước siêu dữ liệu</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zu.xtb index 6c2233a0..30324fff 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zu.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zu.xtb
@@ -82,6 +82,7 @@ <translation id="4445542136948522167">Yeka ukuthatha isithombe</translation> <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> i-mega pixel</translation> <translation id="4570032796877367747">Ikhamera ephambili</translation> +<translation id="4620818268515773682">Guqula ukuthulisa imakrofoni. Ukuthulisa kuvaliwe</translation> <translation id="4628948037717959914">Isithombe</translation> <translation id="4649291346448517080">Ayikwazi ukulondoloza ifayela</translation> <translation id="4695379108709712600">Ihambela ngasohlangothini oluphezulu</translation> @@ -158,6 +159,7 @@ <translation id="8425673304802773841">Yisa phansi</translation> <translation id="8428213095426709021">Izilungiselelo</translation> <translation id="8687491812650032292">I-HD <ph name="HEIGHT" />p (<ph name="WIDTH" />:<ph name="HEIGHT" />)</translation> +<translation id="8711011893539266636">Guqula ukuthulisa imakrofoni. Ukuthulisa kuviliwe</translation> <translation id="8712637175834984815">Ngiyitholile</translation> <translation id="8730621377337864115">Kwenziwe</translation> <translation id="8732462232047530626">Hlola kuqala i-metadata</translation>
diff --git a/ash/webui/diagnostics_ui/backend/session_log_handler.cc b/ash/webui/diagnostics_ui/backend/session_log_handler.cc index 851c187..8a2d1a3 100644 --- a/ash/webui/diagnostics_ui/backend/session_log_handler.cc +++ b/ash/webui/diagnostics_ui/backend/session_log_handler.cc
@@ -161,10 +161,10 @@ bool SessionLogHandler::CreateSessionLog(const base::FilePath& file_path) { // Fetch Routine logs - const std::string system_routines = - routine_log_->GetContentsForCategory("system"); - const std::string network_routines = - routine_log_->GetContentsForCategory("network"); + const std::string system_routines = routine_log_->GetContentsForCategory( + RoutineLog::RoutineCategory::kSystem); + const std::string network_routines = routine_log_->GetContentsForCategory( + RoutineLog::RoutineCategory::kNetwork); // Fetch system data from TelemetryLog. const std::string system_log_contents = telemetry_log_->GetContents();
diff --git a/ash/webui/diagnostics_ui/backend/system_routine_controller_unittest.cc b/ash/webui/diagnostics_ui/backend/system_routine_controller_unittest.cc index 06320691..cae4858 100644 --- a/ash/webui/diagnostics_ui/backend/system_routine_controller_unittest.cc +++ b/ash/webui/diagnostics_ui/backend/system_routine_controller_unittest.cc
@@ -734,8 +734,8 @@ EXPECT_TRUE(routine_runner.result.is_null()); // Verify that the Running status appears in the log. - std::vector<std::string> log_lines = - GetLogLines(log.GetContentsForCategory("system")); + std::vector<std::string> log_lines = GetLogLines( + log.GetContentsForCategory(RoutineLog::RoutineCategory::kSystem)); EXPECT_EQ(1u, log_lines.size()); std::vector<std::string> log_line_contents = GetLogLineContents(log_lines[0]); @@ -755,7 +755,8 @@ mojom::StandardRoutineResult::kTestPassed); // Verify that the Passed status appears in the log. - log_lines = GetLogLines(log.GetContentsForCategory("system")); + log_lines = GetLogLines( + log.GetContentsForCategory(RoutineLog::RoutineCategory::kSystem)); EXPECT_EQ(2u, log_lines.size()); log_line_contents = GetLogLineContents(log_lines[1]); @@ -779,7 +780,8 @@ routine_runner_2.reset(); task_environment_.RunUntilIdle(); - log_lines = GetLogLines(log.GetContentsForCategory("system")); + log_lines = GetLogLines( + log.GetContentsForCategory(RoutineLog::RoutineCategory::kSystem)); EXPECT_EQ(4u, log_lines.size()); log_line_contents = GetLogLineContents(log_lines[3]);
diff --git a/ash/webui/personalization_app/OWNERS b/ash/webui/personalization_app/OWNERS index 7fdb03f..33d7001 100644 --- a/ash/webui/personalization_app/OWNERS +++ b/ash/webui/personalization_app/OWNERS
@@ -1,3 +1,3 @@ cowmoo@chromium.org -file://chromeos/assistant/OWNERS +file://chromeos/ash/components/assistant/OWNERS
diff --git a/ash/webui/personalization_app/mojom/OWNERS b/ash/webui/personalization_app/mojom/OWNERS index d9e04cb..88f4fe44 100644 --- a/ash/webui/personalization_app/mojom/OWNERS +++ b/ash/webui/personalization_app/mojom/OWNERS
@@ -1,4 +1,4 @@ -file://chromeos/assistant/OWNERS +file://chromeos/ash/components/assistant/OWNERS per-file *.mojom=set noparent per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/ash/webui/shimless_rma/resources/onboarding_landing_page.html b/ash/webui/shimless_rma/resources/onboarding_landing_page.html index 4d7b6d81..3713921 100644 --- a/ash/webui/shimless_rma/resources/onboarding_landing_page.html +++ b/ash/webui/shimless_rma/resources/onboarding_landing_page.html
@@ -66,7 +66,7 @@ on-click="onLandingCancelButtonClicked_" disabled="[[allButtonsDisabled]]"> <span id="cancelButtonLabel"> - [[i18n('cancelButtonLabel')]] + [[i18n('exitButtonLabel')]] </span> <paper-spinner-lite class="button-spinner" hidden$="[[!landingCancelButtonClicked]]" active>
diff --git a/ash/webui/shimless_rma/resources/shimless_rma.js b/ash/webui/shimless_rma/resources/shimless_rma.js index 992a60a8..c6e572f 100644 --- a/ash/webui/shimless_rma/resources/shimless_rma.js +++ b/ash/webui/shimless_rma/resources/shimless_rma.js
@@ -740,7 +740,7 @@ return this.i18n( this.currentPage_.buttonCancelLabelKey ? this.currentPage_.buttonCancelLabelKey : - 'cancelButtonLabel'); + 'exitButtonLabel'); } }
diff --git a/ash/webui/shimless_rma/shimless_rma.cc b/ash/webui/shimless_rma/shimless_rma.cc index 322c4d2..07e79fde 100644 --- a/ash/webui/shimless_rma/shimless_rma.cc +++ b/ash/webui/shimless_rma/shimless_rma.cc
@@ -73,11 +73,12 @@ {"shimlessSplashRemembering", IDS_SHIMLESS_RMA_SPLASH_REMEMBERING}, {"shimlessSplashLoading", IDS_SHIMLESS_RMA_SPLASH_LOADING}, // Common buttons - {"cancelButtonLabel", IDS_SHIMLESS_RMA_CANCEL_BUTTON}, + {"exitButtonLabel", IDS_SHIMLESS_RMA_EXIT_BUTTON}, {"backButtonLabel", IDS_SHIMLESS_RMA_BACK_BUTTON}, {"nextButtonLabel", IDS_SHIMLESS_RMA_NEXT_BUTTON}, {"skipButtonLabel", IDS_SHIMLESS_RMA_SKIP_BUTTON}, {"okButtonLabel", IDS_SHIMLESS_RMA_OK_BUTTON}, + {"cancelButtonLabel", IDS_SHIMLESS_RMA_CANCEL_BUTTON}, {"retryButtonLabel", IDS_SHIMLESS_RMA_RETRY_BUTTON}, // Landing page {"beginRmaWarningText", IDS_SHIMLESS_RMA_AUTHORIZED_TECH_ONLY_WARNING},
diff --git a/ash/wm/base_state.cc b/ash/wm/base_state.cc index 6523f51..acebe3c 100644 --- a/ash/wm/base_state.cc +++ b/ash/wm/base_state.cc
@@ -66,8 +66,6 @@ const WMEvent* event) { switch (event->type()) { case WM_EVENT_NORMAL: - if (window_state->window()->GetProperty(aura::client::kIsRestoringKey)) - return window_state->GetRestoreWindowState(); return WindowStateType::kNormal; case WM_EVENT_MAXIMIZE: return WindowStateType::kMaximized; @@ -180,23 +178,6 @@ WindowStateType previous_state_type) { aura::Window* window = window_state->window(); if (window_state->IsMinimized()) { - // Save the previous show state when it is not minimized so that we can - // correctly restore it after exiting the minimized mode. - if (!IsMinimizedWindowStateType(previous_state_type)) { - // We must not save PIP to |kPreMinimizedShowStateKey|. - if (previous_state_type != WindowStateType::kPip) { - window->SetProperty(aura::client::kPreMinimizedShowStateKey, - ToWindowShowState(previous_state_type)); - - } else { - // We must not save MINIMIZED to |kPreMinimizedShowStateKey|. We can - // get the applicable window state to restore back to before entering - // Pip from WindowState::GetRestoreWindowState(). - window->SetProperty( - aura::client::kPreMinimizedShowStateKey, - ToWindowShowState(window_state->GetRestoreWindowState())); - } - } // Count minimizing a PIP window as dismissing it. Android apps in PIP mode // don't exit when they are dismissed, they just go back to being a regular // app, but minimized.
diff --git a/ash/wm/client_controlled_state.cc b/ash/wm/client_controlled_state.cc index 64566a6a..7e2b3cd 100644 --- a/ash/wm/client_controlled_state.cc +++ b/ash/wm/client_controlled_state.cc
@@ -331,8 +331,11 @@ gfx::Rect bounds = GetSnappedWindowBoundsInParent(window, next_state_type); // We don't want Unminimize() to restore the pre-snapped state during the - // transition. - window->ClearProperty(aura::client::kPreMinimizedShowStateKey); + // transition. See crbug.com/1031313 for why we need this. + // kRestoreShowStateKey property will be updated properly after the window + // is snapped correctly. + if (window_state->IsMinimized()) + window->ClearProperty(aura::client::kRestoreShowStateKey); window_state->UpdateWindowPropertiesFromStateType(); VLOG(1) << "Processing State Transtion: event=" << event_type
diff --git a/ash/wm/client_controlled_state_unittest.cc b/ash/wm/client_controlled_state_unittest.cc index ec89ac5..6d2fb8d 100644 --- a/ash/wm/client_controlled_state_unittest.cc +++ b/ash/wm/client_controlled_state_unittest.cc
@@ -225,9 +225,8 @@ ::wm::Unminimize(widget()->GetNativeWindow()); EXPECT_TRUE(widget()->IsMinimized()); - EXPECT_EQ(ui::SHOW_STATE_NORMAL, - widget()->GetNativeWindow()->GetProperty( - aura::client::kPreMinimizedShowStateKey)); + EXPECT_EQ(ui::SHOW_STATE_NORMAL, widget()->GetNativeWindow()->GetProperty( + aura::client::kRestoreShowStateKey)); EXPECT_EQ(kInitialBounds, widget()->GetWindowBoundsInScreen()); EXPECT_EQ(WindowStateType::kMinimized, delegate()->old_state()); EXPECT_EQ(WindowStateType::kNormal, delegate()->new_state());
diff --git a/ash/wm/default_state.cc b/ash/wm/default_state.cc index 36a82c0..158ce96 100644 --- a/ash/wm/default_state.cc +++ b/ash/wm/default_state.cc
@@ -106,7 +106,7 @@ aura::Window* window = window_state->window(); window->SetProperty( aura::client::kShowStateKey, - window->GetProperty(aura::client::kPreMinimizedShowStateKey)); + window->GetProperty(aura::client::kRestoreShowStateKey)); } ReenterToCurrentState(window_state, state_in_previous_mode);
diff --git a/ash/wm/desks/desks_bar_view.cc b/ash/wm/desks/desks_bar_view.cc index 864a37f..223d4ca 100644 --- a/ash/wm/desks/desks_bar_view.cc +++ b/ash/wm/desks/desks_bar_view.cc
@@ -386,20 +386,22 @@ base::Unretained(this), DesksCreationRemovalSource::kButton))); if (saved_desk_util::IsSavedDesksEnabled()) { + int button_text_id = IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON_LIBRARY; + if (!saved_desk_util::AreDesksTemplatesEnabled()) + button_text_id = IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON_SAVED_FOR_LATER; + expanded_state_desks_templates_button_ = scroll_view_contents_->AddChildView( std::make_unique<ExpandedDesksBarButton>( this, &kDesksTemplatesIcon, - l10n_util::GetStringUTF16( - IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON), + l10n_util::GetStringUTF16(button_text_id), /*initially_enabled=*/true, base::BindRepeating( &DesksBarView::OnDesksTemplatesButtonPressed, base::Unretained(this)))); zero_state_desks_templates_button_ = scroll_view_contents_->AddChildView( std::make_unique<ZeroStateIconButton>( - &kDesksTemplatesIcon, - l10n_util::GetStringUTF16(IDS_ASH_DESKS_TEMPLATES_DESKS_BAR_BUTTON), + &kDesksTemplatesIcon, l10n_util::GetStringUTF16(button_text_id), base::BindRepeating(&DesksBarView::OnDesksTemplatesButtonPressed, base::Unretained(this)))); }
diff --git a/ash/wm/desks/templates/save_desk_template_button.cc b/ash/wm/desks/templates/save_desk_template_button.cc index c6862bb..b865704 100644 --- a/ash/wm/desks/templates/save_desk_template_button.cc +++ b/ash/wm/desks/templates/save_desk_template_button.cc
@@ -4,10 +4,13 @@ #include "ash/wm/desks/templates/save_desk_template_button.h" +#include "ash/constants/ash_features.h" #include "ash/style/ash_color_provider.h" #include "ash/wm/wm_highlight_item_border.h" #include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/gfx/geometry/rounded_corners_f.h" #include "ui/gfx/vector_icon_types.h" +#include "ui/views/highlight_border.h" namespace ash { @@ -52,6 +55,15 @@ UpdateBorderState(); } +void SaveDeskTemplateButton::OnPaintBorder(gfx::Canvas* canvas) { + if (features::IsDarkLightModeEnabled()) { + views::HighlightBorder::PaintBorderToCanvas( + canvas, *this, GetLocalBounds(), gfx::RoundedCornersF(kCornerRadius), + views::HighlightBorder::Type::kHighlightBorder2, + /*use_light_colors=*/false); + } +} + void SaveDeskTemplateButton::UpdateBorderState() { auto* border = static_cast<WmHighlightItemBorder*>(GetBorder()); border->SetFocused(IsViewHighlighted());
diff --git a/ash/wm/desks/templates/save_desk_template_button.h b/ash/wm/desks/templates/save_desk_template_button.h index 49d1504..71caf33 100644 --- a/ash/wm/desks/templates/save_desk_template_button.h +++ b/ash/wm/desks/templates/save_desk_template_button.h
@@ -47,6 +47,7 @@ // PillButton: void OnThemeChanged() override; + void OnPaintBorder(gfx::Canvas* canvas) override; void UpdateBorderState();
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc index 4ba7de4..d1973ae 100644 --- a/ash/wm/overview/overview_session_unittest.cc +++ b/ash/wm/overview/overview_session_unittest.cc
@@ -779,7 +779,8 @@ } // Tests entering overview mode with two windows and selecting one. -TEST_P(OverviewSessionTest, FullscreenWindow) { +// TODO(crbug.com/1323145): Flaky. +TEST_P(OverviewSessionTest, DISABLED_FullscreenWindow) { ui::ScopedAnimationDurationScaleMode anmatin_scale( ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc index de57214..31ae604b 100644 --- a/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc +++ b/ash/wm/tablet_mode/tablet_mode_window_manager_unittest.cc
@@ -897,17 +897,17 @@ window_state->Maximize(); window_state->Minimize(); EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED, - window->GetProperty(aura::client::kPreMinimizedShowStateKey)); + window->GetProperty(aura::client::kRestoreShowStateKey)); Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); window_state->Unminimize(); // Check that pre-minimized window show state is not cleared due to // unminimizing in tablet mode. EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED, - window->GetProperty(aura::client::kPreMinimizedShowStateKey)); + window->GetProperty(aura::client::kRestoreShowStateKey)); window_state->Minimize(); EXPECT_EQ(ui::SHOW_STATE_MAXIMIZED, - window->GetProperty(aura::client::kPreMinimizedShowStateKey)); + window->GetProperty(aura::client::kRestoreShowStateKey)); Shell::Get()->tablet_mode_controller()->SetEnabledForTest(false); window_state->Unminimize();
diff --git a/ash/wm/window_restore/window_restore_controller.cc b/ash/wm/window_restore/window_restore_controller.cc index 30eae6c..844c31b 100644 --- a/ash/wm/window_restore/window_restore_controller.cc +++ b/ash/wm/window_restore/window_restore_controller.cc
@@ -434,9 +434,9 @@ } else { to_be_shown_windows_.insert(window); - // Clear the pre minimized show state key in case for any reason the window + // Clear the restore show state key in case for any reason the window // did not restore its minimized state. - window->ClearProperty(aura::client::kPreMinimizedShowStateKey); + window->ClearProperty(aura::client::kRestoreShowStateKey); } StackWindow(window);
diff --git a/ash/wm/window_restore/window_restore_util.cc b/ash/wm/window_restore/window_restore_util.cc index ff95632..5d163b3 100644 --- a/ash/wm/window_restore/window_restore_util.cc +++ b/ash/wm/window_restore/window_restore_util.cc
@@ -91,14 +91,15 @@ window_info->window_state_type = window_state->IsFullscreen() ? chromeos::ToWindowStateType( - window->GetProperty(aura::client::kPreFullscreenShowStateKey)) + window->GetProperty(aura::client::kRestoreShowStateKey)) : window_state->GetStateType(); } - // Populate the pre minimized show state field if the window is minimized. + // Populate the restore show state field that the minimize should restore back + // to if the window is minimized. if (window_state->IsMinimized()) { window_info->pre_minimized_show_state_type = - window->GetProperty(aura::client::kPreMinimizedShowStateKey); + window->GetProperty(aura::client::kRestoreShowStateKey); } if (window_state->IsSnapped()) {
diff --git a/ash/wm/window_state.cc b/ash/wm/window_state.cc index d2aa09c..13f10200 100644 --- a/ash/wm/window_state.cc +++ b/ash/wm/window_state.cc
@@ -809,12 +809,6 @@ void WindowState::UpdateWindowPropertiesFromStateType() { ui::WindowShowState new_window_state = ToWindowShowState(current_state_->GetType()); - // Clear |kPreMinimizedShowStateKey| property only when the window is actually - // Unminimized and not in tablet mode. - if (new_window_state != ui::SHOW_STATE_MINIMIZED && IsMinimized() && - !IsTabletModeEnabled()) { - window()->ClearProperty(aura::client::kPreMinimizedShowStateKey); - } if (new_window_state != GetShowState()) { base::AutoReset<bool> resetter(&ignore_property_change_, true); window_->SetProperty(aura::client::kShowStateKey, new_window_state); @@ -1040,6 +1034,7 @@ kWindowStateRestoreHistoryLayerMap.end(); if (!is_state_type_supported) { window_state_restore_history_.clear(); + window_->ClearProperty(aura::client::kRestoreShowStateKey); return; } @@ -1064,6 +1059,16 @@ kWindowStateRestoreHistoryLayerMap.at(previous_state_type))) { window_state_restore_history_.push_back(previous_state_type); } + + // TODO(xdai): For now we don't save the restore history in tablet mode in the + // window property, so that when exiting tablet mode, the window can still + // restore back to its old window state (see the test case + // TabletModeWindowManagerTest.UnminimizeInTabletMode). We should revisit this + // logic. + if (!IsTabletModeEnabled()) { + window_->SetProperty(aura::client::kRestoreShowStateKey, + chromeos::ToWindowShowState(GetRestoreWindowState())); + } } chromeos::WindowStateType WindowState::GetMaximizedOrCenteredWindowType()
diff --git a/base/BUILD.gn b/base/BUILD.gn index 1f8d9317..8ecc744 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -3158,6 +3158,7 @@ "profiler/metadata_recorder_unittest.cc", "profiler/module_cache_unittest.cc", "profiler/sample_metadata_unittest.cc", + "profiler/stack_buffer_unittest.cc", "profiler/stack_copier_suspend_unittest.cc", "profiler/stack_copier_unittest.cc", "profiler/stack_sampler_impl_unittest.cc", @@ -3672,6 +3673,8 @@ "allocator/partition_allocator/partition_alloc_base/files/file_path_pa_unittest.cc", "allocator/partition_allocator/partition_alloc_base/native_library_pa_unittest.cc", ] + } else if (is_fuchsia) { + sources += [ "allocator/partition_allocator/partition_alloc_base/fuchsia/fuchsia_logging_pa_unittest.cc" ] } deps += [ "allocator/partition_allocator:test_support" ] }
diff --git a/base/allocator/partition_allocator/BUILD.gn b/base/allocator/partition_allocator/BUILD.gn index e4cbafc0..8120eb3 100644 --- a/base/allocator/partition_allocator/BUILD.gn +++ b/base/allocator/partition_allocator/BUILD.gn
@@ -195,6 +195,8 @@ } else if (is_fuchsia) { sources += [ "page_allocator_internals_fuchsia.h", + "partition_alloc_base/fuchsia/fuchsia_logging.cc", + "partition_alloc_base/fuchsia/fuchsia_logging.h", "partition_alloc_base/posix/safe_strerror.cc", "partition_alloc_base/posix/safe_strerror.h", "partition_alloc_base/rand_util_fuchsia.cc",
diff --git a/base/allocator/partition_allocator/DEPS b/base/allocator/partition_allocator/DEPS index f753bff..fa4a6b17 100644 --- a/base/allocator/partition_allocator/DEPS +++ b/base/allocator/partition_allocator/DEPS
@@ -10,9 +10,8 @@ "+base/check_op.h", "+base/compiler_specific.h", "+base/dcheck_is_on.h", - "+base/fuchsia/fuchsia_logging.h", + "+base/debug/proc_maps_linux.h", "+base/immediate_crash.h", - "+base/lazy_instance.h", "+base/logging_buildflags.h", "+base/mac/foundation_util.h", "+base/mac/mac_util.h",
diff --git a/base/allocator/partition_allocator/address_pool_manager.cc b/base/allocator/partition_allocator/address_pool_manager.cc index ef28997..b6e05d946 100644 --- a/base/allocator/partition_allocator/address_pool_manager.cc +++ b/base/allocator/partition_allocator/address_pool_manager.cc
@@ -17,7 +17,6 @@ #include "base/allocator/partition_allocator/partition_alloc_constants.h" #include "base/allocator/partition_allocator/partition_alloc_notreached.h" #include "base/allocator/partition_allocator/reservation_offset_table.h" -#include "base/lazy_instance.h" #include "build/build_config.h" #if BUILDFLAG(IS_APPLE) @@ -26,16 +25,11 @@ namespace partition_alloc::internal { -namespace { - -base::LazyInstance<AddressPoolManager>::Leaky g_address_pool_manager = - LAZY_INSTANCE_INITIALIZER; - -} // namespace +AddressPoolManager AddressPoolManager::singleton_; // static -AddressPoolManager* AddressPoolManager::GetInstance() { - return g_address_pool_manager.Pointer(); +AddressPoolManager& AddressPoolManager::GetInstance() { + return singleton_; } #if defined(PA_HAS_64_BITS_POINTERS) @@ -283,9 +277,6 @@ stats->largest_available_reservation = largest_run; } -AddressPoolManager::Pool::Pool() = default; -AddressPoolManager::Pool::~Pool() = default; - void AddressPoolManager::GetPoolStats(const pool_handle handle, PoolStats* stats) { Pool* pool = GetPool(handle); @@ -546,7 +537,4 @@ } } -AddressPoolManager::AddressPoolManager() = default; -AddressPoolManager::~AddressPoolManager() = default; - } // namespace partition_alloc::internal
diff --git a/base/allocator/partition_allocator/address_pool_manager.h b/base/allocator/partition_allocator/address_pool_manager.h index 1a3aed2..77c82ab4 100644 --- a/base/allocator/partition_allocator/address_pool_manager.h +++ b/base/allocator/partition_allocator/address_pool_manager.h
@@ -54,7 +54,7 @@ // All PartitionAlloc allocations must be in either of the pools. class BASE_EXPORT AddressPoolManager { public: - static AddressPoolManager* GetInstance(); + static AddressPoolManager& GetInstance(); AddressPoolManager(const AddressPoolManager&) = delete; AddressPoolManager& operator=(const AddressPoolManager&) = delete; @@ -100,8 +100,8 @@ private: friend class AddressPoolManagerForTesting; - AddressPoolManager(); - ~AddressPoolManager(); + constexpr AddressPoolManager() = default; + ~AddressPoolManager() = default; // Populates `stats` if applicable. // Returns whether `stats` was populated. (They might not be, e.g. @@ -111,8 +111,11 @@ #if defined(PA_HAS_64_BITS_POINTERS) class Pool { public: - Pool(); - ~Pool(); + constexpr Pool() = default; + ~Pool() = default; + + Pool(const Pool&) = delete; + Pool& operator=(const Pool&) = delete; void Initialize(uintptr_t ptr, size_t length); bool IsInitialized(); @@ -139,7 +142,7 @@ // 1s. This is a best-effort hint in the sense that there still may be lots // of 1s after this index, but at least we know there is no point in // starting the search before it. - size_t bit_hint_ GUARDED_BY(lock_); + size_t bit_hint_ GUARDED_BY(lock_) = 0; size_t total_bits_ = 0; uintptr_t address_begin_ = 0; @@ -161,6 +164,8 @@ #endif // defined(PA_HAS_64_BITS_POINTERS) + static AddressPoolManager singleton_; + friend struct base::LazyInstanceTraitsBase<AddressPoolManager>; };
diff --git a/base/allocator/partition_allocator/address_pool_manager_unittest.cc b/base/allocator/partition_allocator/address_pool_manager_unittest.cc index 081365d..bc28643 100644 --- a/base/allocator/partition_allocator/address_pool_manager_unittest.cc +++ b/base/allocator/partition_allocator/address_pool_manager_unittest.cc
@@ -274,13 +274,13 @@ static const size_t kNumPages[kAllocCount] = {1, 4, 7, 8, 13, 16, 31, 60}; uintptr_t addrs[kAllocCount]; for (size_t i = 0; i < kAllocCount; ++i) { - addrs[i] = AddressPoolManager::GetInstance()->Reserve( + addrs[i] = AddressPoolManager::GetInstance().Reserve( GetRegularPool(), 0, AddressPoolManagerBitmap::kBytesPer1BitOfRegularPoolBitmap * kNumPages[i]); EXPECT_TRUE(addrs[i]); EXPECT_TRUE(!(addrs[i] & kSuperPageOffsetMask)); - AddressPoolManager::GetInstance()->MarkUsed( + AddressPoolManager::GetInstance().MarkUsed( GetRegularPool(), addrs[i], AddressPoolManagerBitmap::kBytesPer1BitOfRegularPoolBitmap * kNumPages[i]); @@ -304,11 +304,11 @@ } } for (size_t i = 0; i < kAllocCount; ++i) { - AddressPoolManager::GetInstance()->MarkUnused( + AddressPoolManager::GetInstance().MarkUnused( GetRegularPool(), addrs[i], AddressPoolManagerBitmap::kBytesPer1BitOfRegularPoolBitmap * kNumPages[i]); - AddressPoolManager::GetInstance()->UnreserveAndDecommit( + AddressPoolManager::GetInstance().UnreserveAndDecommit( GetRegularPool(), addrs[i], AddressPoolManagerBitmap::kBytesPer1BitOfRegularPoolBitmap * kNumPages[i]); @@ -324,12 +324,12 @@ static const size_t kNumPages[kAllocCount] = {1, 3, 7, 11}; uintptr_t addrs[kAllocCount]; for (size_t i = 0; i < kAllocCount; ++i) { - addrs[i] = AddressPoolManager::GetInstance()->Reserve( + addrs[i] = AddressPoolManager::GetInstance().Reserve( GetBRPPool(), 0, kSuperPageSize * kNumPages[i]); EXPECT_TRUE(addrs[i]); EXPECT_TRUE(!(addrs[i] & kSuperPageOffsetMask)); - AddressPoolManager::GetInstance()->MarkUsed(GetBRPPool(), addrs[i], - kSuperPageSize * kNumPages[i]); + AddressPoolManager::GetInstance().MarkUsed(GetBRPPool(), addrs[i], + kSuperPageSize * kNumPages[i]); } constexpr size_t first_guard_size = @@ -357,9 +357,9 @@ } } for (size_t i = 0; i < kAllocCount; ++i) { - AddressPoolManager::GetInstance()->MarkUnused( - GetBRPPool(), addrs[i], kSuperPageSize * kNumPages[i]); - AddressPoolManager::GetInstance()->UnreserveAndDecommit( + AddressPoolManager::GetInstance().MarkUnused(GetBRPPool(), addrs[i], + kSuperPageSize * kNumPages[i]); + AddressPoolManager::GetInstance().UnreserveAndDecommit( GetBRPPool(), addrs[i], kSuperPageSize * kNumPages[i]); EXPECT_FALSE(AddressPoolManager::IsManagedByRegularPool(addrs[i])); EXPECT_FALSE(AddressPoolManager::IsManagedByBRPPool(addrs[i])); @@ -369,24 +369,24 @@ TEST(PartitionAllocAddressPoolManagerTest, RegularPoolUsageChanges) { AddressSpaceStatsDumperForTesting dumper{}; - AddressPoolManager::GetInstance()->DumpStats(&dumper); + AddressPoolManager::GetInstance().DumpStats(&dumper); const size_t usage_before = dumper.regular_pool_usage_; - const uintptr_t address = AddressPoolManager::GetInstance()->Reserve( + const uintptr_t address = AddressPoolManager::GetInstance().Reserve( GetRegularPool(), 0, kSuperPageSize); ASSERT_TRUE(address); - AddressPoolManager::GetInstance()->MarkUsed(GetRegularPool(), address, - kSuperPageSize); + AddressPoolManager::GetInstance().MarkUsed(GetRegularPool(), address, + kSuperPageSize); - AddressPoolManager::GetInstance()->DumpStats(&dumper); + AddressPoolManager::GetInstance().DumpStats(&dumper); EXPECT_GT(dumper.regular_pool_usage_, usage_before); - AddressPoolManager::GetInstance()->MarkUnused(GetRegularPool(), address, - kSuperPageSize); - AddressPoolManager::GetInstance()->UnreserveAndDecommit( + AddressPoolManager::GetInstance().MarkUnused(GetRegularPool(), address, + kSuperPageSize); + AddressPoolManager::GetInstance().UnreserveAndDecommit( GetRegularPool(), address, kSuperPageSize); - AddressPoolManager::GetInstance()->DumpStats(&dumper); + AddressPoolManager::GetInstance().DumpStats(&dumper); EXPECT_EQ(dumper.regular_pool_usage_, usage_before); }
diff --git a/base/allocator/partition_allocator/page_allocator_internals_fuchsia.h b/base/allocator/partition_allocator/page_allocator_internals_fuchsia.h index a0fca92f6..945abd01 100644 --- a/base/allocator/partition_allocator/page_allocator_internals_fuchsia.h +++ b/base/allocator/partition_allocator/page_allocator_internals_fuchsia.h
@@ -18,9 +18,9 @@ #include <cstdint> #include "base/allocator/partition_allocator/page_allocator.h" +#include "base/allocator/partition_allocator/partition_alloc_base/fuchsia/fuchsia_logging.h" #include "base/allocator/partition_allocator/partition_alloc_check.h" #include "base/allocator/partition_allocator/partition_alloc_notreached.h" -#include "base/fuchsia/fuchsia_logging.h" namespace partition_alloc::internal { @@ -79,7 +79,7 @@ zx::vmo vmo; zx_status_t status = zx::vmo::create(length, 0, &vmo); if (status != ZX_OK) { - ZX_DLOG(INFO, status) << "zx_vmo_create"; + PA_ZX_DLOG(INFO, status) << "zx_vmo_create"; return 0; } @@ -88,14 +88,14 @@ // VMO names are used only for debugging, so failure to set a name is not // fatal. - ZX_DCHECK(status == ZX_OK, status); + PA_ZX_DCHECK(status == ZX_OK, status); if (page_tag == PageTag::kV8) { // V8 uses JIT. Call zx_vmo_replace_as_executable() to allow code execution // in the new VMO. status = vmo.replace_as_executable(zx::resource(), &vmo); if (status != ZX_OK) { - ZX_DLOG(INFO, status) << "zx_vmo_replace_as_executable"; + PA_ZX_DLOG(INFO, status) << "zx_vmo_replace_as_executable"; return 0; } } @@ -115,7 +115,7 @@ if (status != ZX_OK) { // map() is expected to fail if |hint| is set to an already-in-use location. if (!hint) { - ZX_DLOG(ERROR, status) << "zx_vmar_map"; + PA_ZX_DLOG(ERROR, status) << "zx_vmar_map"; } return 0; } @@ -134,14 +134,14 @@ // Unmap head if necessary. if (pre_slack) { zx_status_t status = zx::vmar::root_self()->unmap(base_address, pre_slack); - ZX_CHECK(status == ZX_OK, status); + PA_ZX_CHECK(status == ZX_OK, status); } // Unmap tail if necessary. if (post_slack) { zx_status_t status = zx::vmar::root_self()->unmap( base_address + pre_slack + trim_length, post_slack); - ZX_CHECK(status == ZX_OK, status); + PA_ZX_CHECK(status == ZX_OK, status); } return base_address + pre_slack; @@ -162,12 +162,12 @@ PageAccessibilityConfiguration accessibility) { zx_status_t status = zx::vmar::root_self()->protect( PageAccessibilityToZxVmOptions(accessibility), address, length); - ZX_CHECK(status == ZX_OK, status); + PA_ZX_CHECK(status == ZX_OK, status); } void FreePagesInternal(uint64_t address, size_t length) { zx_status_t status = zx::vmar::root_self()->unmap(address, length); - ZX_CHECK(status == ZX_OK, status); + PA_ZX_CHECK(status == ZX_OK, status); } void DiscardSystemPagesInternal(uint64_t address, size_t length) { @@ -175,7 +175,7 @@ // forcibly de-committing them immediately, when Fuchsia supports it. zx_status_t status = zx::vmar::root_self()->op_range( ZX_VMO_OP_DECOMMIT, address, length, nullptr, 0); - ZX_CHECK(status == ZX_OK, status); + PA_ZX_CHECK(status == ZX_OK, status); } void DecommitSystemPagesInternal(
diff --git a/base/allocator/partition_allocator/partition_address_space.cc b/base/allocator/partition_allocator/partition_address_space.cc index c1b8f9e..f4b7965 100644 --- a/base/allocator/partition_allocator/partition_address_space.cc +++ b/base/allocator/partition_allocator/partition_address_space.cc
@@ -91,7 +91,7 @@ setup_.regular_pool_base_mask_ = ~(RegularPoolSize() - 1) & kMemTagUnmask; #endif PA_DCHECK(!(setup_.regular_pool_base_address_ & (RegularPoolSize() - 1))); - setup_.regular_pool_ = AddressPoolManager::GetInstance()->Add( + setup_.regular_pool_ = AddressPoolManager::GetInstance().Add( setup_.regular_pool_base_address_, RegularPoolSize()); PA_CHECK(setup_.regular_pool_ == kRegularPoolHandle); PA_DCHECK(!IsInRegularPool(setup_.regular_pool_base_address_ - 1)); @@ -117,7 +117,7 @@ setup_.brp_pool_base_mask_ = ~(BRPPoolSize() - 1) & kMemTagUnmask; #endif PA_DCHECK(!(setup_.brp_pool_base_address_ & (BRPPoolSize() - 1))); - setup_.brp_pool_ = AddressPoolManager::GetInstance()->Add( + setup_.brp_pool_ = AddressPoolManager::GetInstance().Add( setup_.brp_pool_base_address_, BRPPoolSize()); PA_CHECK(setup_.brp_pool_ == kBRPPoolHandle); PA_DCHECK(!IsInBRPPool(setup_.brp_pool_base_address_ - 1)); @@ -128,7 +128,7 @@ #if PA_STARSCAN_USE_CARD_TABLE // Reserve memory for PCScan quarantine card table. uintptr_t requested_address = setup_.regular_pool_base_address_; - uintptr_t actual_address = AddressPoolManager::GetInstance()->Reserve( + uintptr_t actual_address = AddressPoolManager::GetInstance().Reserve( setup_.regular_pool_, requested_address, kSuperPageSize); PA_CHECK(requested_address == actual_address) << "QuarantineCardTable is required to be allocated at the beginning of " @@ -153,7 +153,7 @@ setup_.configurable_pool_base_address_ = pool_base; setup_.configurable_pool_base_mask_ = ~(size - 1); - setup_.configurable_pool_ = AddressPoolManager::GetInstance()->Add( + setup_.configurable_pool_ = AddressPoolManager::GetInstance().Add( setup_.configurable_pool_base_address_, size); PA_CHECK(setup_.configurable_pool_ == kConfigurablePoolHandle); } @@ -174,11 +174,11 @@ setup_.regular_pool_ = 0; setup_.brp_pool_ = 0; setup_.configurable_pool_ = 0; - AddressPoolManager::GetInstance()->ResetForTesting(); + AddressPoolManager::GetInstance().ResetForTesting(); } void PartitionAddressSpace::UninitConfigurablePoolForTesting() { - AddressPoolManager::GetInstance()->Remove(setup_.configurable_pool_); + AddressPoolManager::GetInstance().Remove(setup_.configurable_pool_); setup_.configurable_pool_base_address_ = kUninitializedPoolBaseAddress; setup_.configurable_pool_base_mask_ = 0; setup_.configurable_pool_ = 0;
diff --git a/base/allocator/partition_allocator/partition_alloc.cc b/base/allocator/partition_allocator/partition_alloc.cc index 62e27d9..63acc0df 100644 --- a/base/allocator/partition_allocator/partition_alloc.cc +++ b/base/allocator/partition_allocator/partition_alloc.cc
@@ -80,7 +80,7 @@ #if defined(PA_HAS_64_BITS_POINTERS) internal::PartitionAddressSpace::UninitForTesting(); #else - internal::AddressPoolManager::GetInstance()->ResetForTesting(); + internal::AddressPoolManager::GetInstance().ResetForTesting(); #endif // defined(PA_HAS_64_BITS_POINTERS) #endif // !BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) internal::g_oom_handling_function = nullptr;
diff --git a/base/allocator/partition_allocator/partition_alloc_base/fuchsia/fuchsia_logging.cc b/base/allocator/partition_allocator/partition_alloc_base/fuchsia/fuchsia_logging.cc new file mode 100644 index 0000000..55e179b --- /dev/null +++ b/base/allocator/partition_allocator/partition_alloc_base/fuchsia/fuchsia_logging.cc
@@ -0,0 +1,26 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/allocator/partition_allocator/partition_alloc_base/fuchsia/fuchsia_logging.h" + +#include <zircon/status.h> + +#include <iomanip> + +namespace partition_alloc::internal::logging { + +ZxLogMessage::ZxLogMessage(const char* file_path, + int line, + LogSeverity severity, + zx_status_t zx_err) + : LogMessage(file_path, line, severity), zx_err_(zx_err) {} + +ZxLogMessage::~ZxLogMessage() { + // zx_status_t error values are negative, so log the numeric version as + // decimal rather than hex. This is also useful to match zircon/errors.h for + // grepping. + stream() << ": " << zx_status_get_string(zx_err_) << " (" << zx_err_ << ")"; +} + +} // namespace partition_alloc::internal::logging
diff --git a/base/allocator/partition_allocator/partition_alloc_base/fuchsia/fuchsia_logging.h b/base/allocator/partition_allocator/partition_alloc_base/fuchsia/fuchsia_logging.h new file mode 100644 index 0000000..b8a3e31 --- /dev/null +++ b/base/allocator/partition_allocator/partition_alloc_base/fuchsia/fuchsia_logging.h
@@ -0,0 +1,68 @@ +// Copyright 2017 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 BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_FUCHSIA_FUCHSIA_LOGGING_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_FUCHSIA_FUCHSIA_LOGGING_H_ + +#include <lib/fit/function.h> +#include <zircon/types.h> + +#include "base/allocator/partition_allocator/partition_alloc_base/logging.h" +#include "base/base_export.h" +#include "build/build_config.h" + +// Use the PA_ZX_LOG family of macros along with a zx_status_t containing a +// Zircon error. The error value will be decoded so that logged messages explain +// the error. + +namespace partition_alloc::internal::logging { + +class BASE_EXPORT ZxLogMessage : public logging::LogMessage { + public: + ZxLogMessage(const char* file_path, + int line, + LogSeverity severity, + zx_status_t zx_err); + + ZxLogMessage(const ZxLogMessage&) = delete; + ZxLogMessage& operator=(const ZxLogMessage&) = delete; + + ~ZxLogMessage() override; + + private: + zx_status_t zx_err_; +}; + +} // namespace partition_alloc::internal::logging + +#define PA_ZX_LOG_STREAM(severity, zx_err) \ + PA_COMPACT_GOOGLE_LOG_EX_##severity(ZxLogMessage, zx_err).stream() + +#define PA_ZX_LOG(severity, zx_err) \ + PA_LAZY_STREAM(PA_ZX_LOG_STREAM(severity, zx_err), PA_LOG_IS_ON(severity)) +#define PA_ZX_LOG_IF(severity, condition, zx_err) \ + PA_LAZY_STREAM(PA_ZX_LOG_STREAM(severity, zx_err), \ + PA_LOG_IS_ON(severity) && (condition)) + +#define PA_ZX_CHECK(condition, zx_err) \ + PA_LAZY_STREAM(PA_ZX_LOG_STREAM(FATAL, zx_err), !(condition)) \ + << "Check failed: " #condition << ". " + +#define PA_ZX_DLOG(severity, zx_err) \ + PA_LAZY_STREAM(PA_ZX_LOG_STREAM(severity, zx_err), PA_DLOG_IS_ON(severity)) + +#if DCHECK_IS_ON() +#define PA_ZX_DLOG_IF(severity, condition, zx_err) \ + PA_LAZY_STREAM(PA_ZX_LOG_STREAM(severity, zx_err), \ + PA_DLOG_IS_ON(severity) && (condition)) +#else // DCHECK_IS_ON() +#define PA_ZX_DLOG_IF(severity, condition, zx_err) PA_EAT_STREAM_PARAMETERS +#endif // DCHECK_IS_ON() + +#define PA_ZX_DCHECK(condition, zx_err) \ + PA_LAZY_STREAM(PA_ZX_LOG_STREAM(DCHECK, zx_err), \ + DCHECK_IS_ON() && !(condition)) \ + << "Check failed: " #condition << ". " + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_FUCHSIA_FUCHSIA_LOGGING_H_
diff --git a/base/allocator/partition_allocator/partition_alloc_base/fuchsia/fuchsia_logging_pa_unittest.cc b/base/allocator/partition_allocator/partition_alloc_base/fuchsia/fuchsia_logging_pa_unittest.cc new file mode 100644 index 0000000..188fe44 --- /dev/null +++ b/base/allocator/partition_allocator/partition_alloc_base/fuchsia/fuchsia_logging_pa_unittest.cc
@@ -0,0 +1,45 @@ +// 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. + +#include "base/allocator/partition_allocator/partition_alloc_base/fuchsia/fuchsia_logging.h" + +#include <fuchsia/logger/cpp/fidl.h> +#include <lib/fidl/cpp/binding.h> +#include <lib/sys/cpp/component_context.h> + +#include "base/allocator/partition_allocator/partition_alloc_base/logging.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace partition_alloc::internal::base { + +namespace { + +class MockLogSource { + public: + MOCK_METHOD0(Log, const char*()); +}; + +} // namespace + +// Verifies the Fuchsia-specific PA_ZX_*() logging macros. +TEST(FuchsiaLoggingTest, FuchsiaLogging) { + MockLogSource mock_log_source; + EXPECT_CALL(mock_log_source, Log()) + .Times(DCHECK_IS_ON() ? 2 : 1) + .WillRepeatedly(testing::Return("log message")); + + logging::SetMinLogLevel(logging::LOGGING_INFO); + + EXPECT_TRUE(PA_LOG_IS_ON(INFO)); + EXPECT_EQ(DCHECK_IS_ON(), PA_DLOG_IS_ON(INFO)); + + PA_ZX_LOG(INFO, ZX_ERR_INTERNAL) << mock_log_source.Log(); + PA_ZX_DLOG(INFO, ZX_ERR_INTERNAL) << mock_log_source.Log(); + + PA_ZX_CHECK(true, ZX_ERR_INTERNAL); + PA_ZX_DCHECK(true, ZX_ERR_INTERNAL); +} + +} // namespace partition_alloc::internal::base
diff --git a/base/allocator/partition_allocator/partition_bucket.cc b/base/allocator/partition_allocator/partition_bucket.cc index e75265b..32724ed 100644 --- a/base/allocator/partition_allocator/partition_bucket.cc +++ b/base/allocator/partition_allocator/partition_bucket.cc
@@ -94,7 +94,7 @@ size_t requested_size) { PA_DCHECK(!(requested_address % kSuperPageSize)); - uintptr_t reserved_address = AddressPoolManager::GetInstance()->Reserve( + uintptr_t reserved_address = AddressPoolManager::GetInstance().Reserve( pool, requested_address, requested_size); // In 32-bit mode, when allocating from BRP pool, verify that the requested @@ -107,12 +107,12 @@ AreAllowedSuperPagesForBRPPool(reserved_address, reserved_address + requested_size)) break; - AddressPoolManager::GetInstance()->UnreserveAndDecommit( + AddressPoolManager::GetInstance().UnreserveAndDecommit( pool, reserved_address, requested_size); // No longer try to honor |requested_address|, because it didn't work for // us last time. reserved_address = - AddressPoolManager::GetInstance()->Reserve(pool, 0, requested_size); + AddressPoolManager::GetInstance().Reserve(pool, 0, requested_size); } // If the allocation attempt succeeds, we will break out of the following @@ -129,10 +129,10 @@ AreAllowedSuperPagesForBRPPool(reserved_address, reserved_address + requested_size)) break; - AddressPoolManager::GetInstance()->UnreserveAndDecommit( + AddressPoolManager::GetInstance().UnreserveAndDecommit( pool, reserved_address, requested_size); // Reserve() can return a different pointer than attempted. - reserved_address = AddressPoolManager::GetInstance()->Reserve( + reserved_address = AddressPoolManager::GetInstance().Reserve( pool, address_to_try, requested_size); } @@ -141,7 +141,7 @@ if (reserved_address && !AreAllowedSuperPagesForBRPPool(reserved_address, reserved_address + requested_size)) { - AddressPoolManager::GetInstance()->UnreserveAndDecommit( + AddressPoolManager::GetInstance().UnreserveAndDecommit( pool, reserved_address, requested_size); reserved_address = 0; } @@ -155,8 +155,8 @@ // If `MarkUsed` was called earlier, the other thread could incorrectly // determine that the allocation had come form PartitionAlloc. if (reserved_address) - AddressPoolManager::GetInstance()->MarkUsed(pool, reserved_address, - requested_size); + AddressPoolManager::GetInstance().MarkUsed(pool, reserved_address, + requested_size); #endif PA_DCHECK(!(reserved_address % kSuperPageSize)); @@ -383,10 +383,10 @@ { ScopedSyscallTimer timer{root}; #if !defined(PA_HAS_64_BITS_POINTERS) - AddressPoolManager::GetInstance()->MarkUnused(pool, reservation_start, - reservation_size); + AddressPoolManager::GetInstance().MarkUnused(pool, reservation_start, + reservation_size); #endif - AddressPoolManager::GetInstance()->UnreserveAndDecommit( + AddressPoolManager::GetInstance().UnreserveAndDecommit( pool, reservation_start, reservation_size); }
diff --git a/base/allocator/partition_allocator/partition_page.cc b/base/allocator/partition_allocator/partition_page.cc index 881612f..e71c45e 100644 --- a/base/allocator/partition_allocator/partition_page.cc +++ b/base/allocator/partition_allocator/partition_page.cc
@@ -350,12 +350,12 @@ } #if !defined(PA_HAS_64_BITS_POINTERS) - AddressPoolManager::GetInstance()->MarkUnused(pool, reservation_start, - reservation_size); + AddressPoolManager::GetInstance().MarkUnused(pool, reservation_start, + reservation_size); #endif // After resetting the table entries, unreserve and decommit the memory. - AddressPoolManager::GetInstance()->UnreserveAndDecommit( + AddressPoolManager::GetInstance().UnreserveAndDecommit( pool, reservation_start, reservation_size); }
diff --git a/base/allocator/partition_allocator/partition_root.cc b/base/allocator/partition_allocator/partition_root.cc index c15402c..e06136d 100644 --- a/base/allocator/partition_allocator/partition_root.cc +++ b/base/allocator/partition_allocator/partition_root.cc
@@ -636,7 +636,7 @@ auto* curr = first_extent; while (curr != nullptr) { auto* next = curr->next; - internal::AddressPoolManager::GetInstance()->UnreserveAndDecommit( + internal::AddressPoolManager::GetInstance().UnreserveAndDecommit( pool_handle, reinterpret_cast<uintptr_t>(curr), internal::kSuperPageSize * curr->number_of_consecutive_super_pages); curr = next;
diff --git a/base/allocator/partition_allocator/reservation_offset_table.h b/base/allocator/partition_allocator/reservation_offset_table.h index 98f0b3f7..a26bd830 100644 --- a/base/allocator/partition_allocator/reservation_offset_table.h +++ b/base/allocator/partition_allocator/reservation_offset_table.h
@@ -204,7 +204,7 @@ ALWAYS_INLINE uintptr_t GetDirectMapReservationStart(uintptr_t address, pool_handle pool, uintptr_t offset_in_pool) { - PA_DCHECK(AddressPoolManager::GetInstance()->GetPoolBaseAddress(pool) + + PA_DCHECK(AddressPoolManager::GetInstance().GetPoolBaseAddress(pool) + offset_in_pool == address); uint16_t* offset_ptr = ReservationOffsetPointer(pool, offset_in_pool);
diff --git a/base/containers/enum_set_unittest.cc b/base/containers/enum_set_unittest.cc index 489e1f4..6bd1444 100644 --- a/base/containers/enum_set_unittest.cc +++ b/base/containers/enum_set_unittest.cc
@@ -235,8 +235,8 @@ TEST_F(EnumSetTest, Iterators) { const TestEnumSet enums1(TestEnum::TEST_4, TestEnum::TEST_5); TestEnumSet enums2; - for (TestEnumSet::Iterator it = enums1.begin(); it != enums1.end(); it++) { - enums2.Put(*it); + for (TestEnum e : enums1) { + enums2.Put(e); } EXPECT_EQ(enums2, enums1); }
diff --git a/base/guid.cc b/base/guid.cc index 7b5723c..9c16d3a 100644 --- a/base/guid.cc +++ b/base/guid.cc
@@ -141,6 +141,10 @@ GUID& GUID::operator=(const GUID& other) = default; +GUID::GUID(GUID&& other) = default; + +GUID& GUID::operator=(GUID&& other) = default; + const std::string& GUID::AsLowercaseString() const { return lowercase_; }
diff --git a/base/guid.h b/base/guid.h index 13620cf4..6a52bfc 100644 --- a/base/guid.h +++ b/base/guid.h
@@ -56,6 +56,8 @@ GUID(const GUID& other); GUID& operator=(const GUID& other); + GUID(GUID&& other); + GUID& operator=(GUID&& other); bool is_valid() const { return !lowercase_.empty(); }
diff --git a/base/profiler/stack_buffer.cc b/base/profiler/stack_buffer.cc index c8527147..9798aa3 100644 --- a/base/profiler/stack_buffer.cc +++ b/base/profiler/stack_buffer.cc
@@ -4,13 +4,18 @@ #include "base/profiler/stack_buffer.h" +#include "base/bits.h" + namespace base { constexpr size_t StackBuffer::kPlatformStackAlignment; StackBuffer::StackBuffer(size_t buffer_size) - : buffer_(new uint8_t[buffer_size + kPlatformStackAlignment - 1]), - size_(buffer_size) {} + : size_(buffer_size), + buffer_(static_cast<uintptr_t*>( + AlignedAlloc(size_, kPlatformStackAlignment))) { + static_assert(bits::IsPowerOfTwo(kPlatformStackAlignment)); +} StackBuffer::~StackBuffer() = default;
diff --git a/base/profiler/stack_buffer.h b/base/profiler/stack_buffer.h index ddcc1703..324b8be 100644 --- a/base/profiler/stack_buffer.h +++ b/base/profiler/stack_buffer.h
@@ -10,6 +10,7 @@ #include <memory> #include "base/base_export.h" +#include "base/memory/aligned_memory.h" namespace base { @@ -25,7 +26,7 @@ // encounter this exceptional case for leaf frames. static constexpr size_t kPlatformStackAlignment = 2 * sizeof(uintptr_t); - StackBuffer(size_t buffer_size); + explicit StackBuffer(size_t buffer_size); StackBuffer(const StackBuffer&) = delete; StackBuffer& operator=(const StackBuffer&) = delete; @@ -34,25 +35,19 @@ // Returns a kPlatformStackAlignment-aligned pointer to the stack buffer. uintptr_t* buffer() const { - // Return the first address in the buffer aligned to - // kPlatformStackAlignment. The buffer is guaranteed to have enough space - // for size() bytes beyond this value. - return reinterpret_cast<uintptr_t*>( - (reinterpret_cast<uintptr_t>(buffer_.get()) + kPlatformStackAlignment - - 1) & - ~(kPlatformStackAlignment - 1)); + // Aligned during allocation. + return buffer_.get(); } // Size in bytes. size_t size() const { return size_; } private: - // The buffer to store the stack. - const std::unique_ptr<uint8_t[]> buffer_; - - // The size in bytes of the requested buffer allocation. The actual allocation - // is larger to accommodate alignment requirements. + // The size in bytes of the requested buffer allocation. const size_t size_; + + // The buffer to store the stack. Already aligned. + const std::unique_ptr<uintptr_t, AlignedFreeDeleter> buffer_; }; } // namespace base
diff --git a/base/profiler/stack_buffer_unittest.cc b/base/profiler/stack_buffer_unittest.cc new file mode 100644 index 0000000..6e533dc --- /dev/null +++ b/base/profiler/stack_buffer_unittest.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 "base/profiler/stack_buffer.h" + +#include "base/memory/aligned_memory.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace base { + +TEST(StackBufferTest, BufferAllocated) { + const unsigned int kBufferSize = 32 * 1024; + StackBuffer stack_buffer(kBufferSize); + EXPECT_EQ(stack_buffer.size(), kBufferSize); + // Without volatile, the compiler could simply optimize away the entire for + // loop below. + volatile uintptr_t* buffer = stack_buffer.buffer(); + ASSERT_NE(nullptr, buffer); + EXPECT_TRUE(IsAligned(const_cast<uintptr_t*>(buffer), + StackBuffer::kPlatformStackAlignment)); + + // Memory pointed to by buffer should be writable. + for (unsigned int i = 0; i < (kBufferSize / sizeof(buffer[0])); i++) { + buffer[i] = i; + EXPECT_EQ(buffer[i], i); + } +} + +} // namespace base
diff --git a/base/trace_event/address_space_dump_provider.cc b/base/trace_event/address_space_dump_provider.cc index 51fce13..0a51c96ff 100644 --- a/base/trace_event/address_space_dump_provider.cc +++ b/base/trace_event/address_space_dump_provider.cc
@@ -98,7 +98,7 @@ bool AddressSpaceDumpProvider::OnMemoryDump(const MemoryDumpArgs& args, ProcessMemoryDump* pmd) { AddressSpaceStatsDumperImpl stats_dumper(pmd); - partition_alloc::internal::AddressPoolManager::GetInstance()->DumpStats( + partition_alloc::internal::AddressPoolManager::GetInstance().DumpStats( &stats_dumper); return true; }
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index 510e0db..97a2fd0 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -8.20220513.1.1 +8.20220516.1.1
diff --git a/cc/BUILD.gn b/cc/BUILD.gn index e52844d4..2aa98b54 100644 --- a/cc/BUILD.gn +++ b/cc/BUILD.gn
@@ -184,8 +184,6 @@ "metrics/dropped_frame_counter.h", "metrics/event_latency_tracing_recorder.cc", "metrics/event_latency_tracing_recorder.h", - "metrics/event_latency_tracker.cc", - "metrics/event_latency_tracker.h", "metrics/event_metrics.cc", "metrics/event_metrics.h", "metrics/events_metrics_manager.cc",
diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc index 878da27..0b041ad5 100644 --- a/cc/metrics/compositor_frame_reporter.cc +++ b/cc/metrics/compositor_frame_reporter.cc
@@ -21,7 +21,6 @@ #include "cc/base/rolling_time_delta_history.h" #include "cc/metrics/dropped_frame_counter.h" #include "cc/metrics/event_latency_tracing_recorder.h" -#include "cc/metrics/event_latency_tracker.h" #include "cc/metrics/frame_sequence_tracker.h" #include "cc/metrics/latency_ukm_reporter.h" #include "services/tracing/public/cpp/perfetto/macros.h" @@ -655,8 +654,7 @@ // Only report compositor latency metrics if the frame was produced. if (report_types_.any() && - (should_report_histograms_ || global_trackers_.latency_ukm_reporter || - global_trackers_.event_latency_tracker)) { + (should_report_histograms_ || global_trackers_.latency_ukm_reporter)) { DCHECK(stage_history_.size()); DCHECK_EQ(SumOfStageHistory(), stage_history_.back().end_time - stage_history_.front().start_time); @@ -665,7 +663,6 @@ stage_history_.back().end_time); ReportCompositorLatencyMetrics(); - // Only report event latency metrics if the frame was presented. if (TestReportType(FrameReportType::kNonDroppedFrame)) ReportEventLatencyMetrics(); @@ -903,70 +900,55 @@ *processed_viz_breakdown_); } - std::vector<EventLatencyTracker::LatencyData> latencies; + if (!should_report_histograms_) + return; + + const std::string total_latency_stage_name = + GetStageName(StageType::kTotalLatency); + const std::string total_latency_histogram_name = + "EventLatency." + total_latency_stage_name; for (const auto& event_metrics : events_metrics_) { DCHECK(event_metrics); + const std::string histogram_base_name = + GetEventLatencyHistogramBaseName(*event_metrics); + const int event_type_index = static_cast<int>(event_metrics->type()); auto* scroll_metrics = event_metrics->AsScroll(); auto* pinch_metrics = event_metrics->AsPinch(); + const int gesture_type_index = + scroll_metrics + ? static_cast<int>(scroll_metrics->scroll_type()) + : pinch_metrics ? static_cast<int>(pinch_metrics->pinch_type()) : 0; + const int event_histogram_index = + event_type_index * kEventLatencyGestureTypeCount + gesture_type_index; const base::TimeTicks generated_timestamp = event_metrics->GetDispatchStageTimestamp( EventMetrics::DispatchStage::kGenerated); DCHECK_LT(generated_timestamp, total_latency_stage.end_time); + + // Report total latency up to presentation for the event. const base::TimeDelta total_latency = total_latency_stage.end_time - generated_timestamp; + const std::string event_total_latency_histogram_name = + base::StrCat({histogram_base_name, ".", total_latency_stage_name}); + // Note: There's a 1:1 mapping between `event_histogram_index` and + // `event_total_latency_histogram_name` which allows the use of + // `STATIC_HISTOGRAM_POINTER_GROUP()` to cache histogram objects. + STATIC_HISTOGRAM_POINTER_GROUP( + event_total_latency_histogram_name, event_histogram_index, + kMaxEventLatencyHistogramIndex, + AddTimeMicrosecondsGranularity(total_latency), + base::Histogram::FactoryMicrosecondsTimeGet( + event_total_latency_histogram_name, kEventLatencyHistogramMin, + kEventLatencyHistogramMax, kEventLatencyHistogramBucketCount, + base::HistogramBase::kUmaTargetedHistogramFlag)); - if (should_report_histograms_) { - const std::string histogram_base_name = - GetEventLatencyHistogramBaseName(*event_metrics); - const int event_type_index = static_cast<int>(event_metrics->type()); - const int gesture_type_index = - scroll_metrics ? static_cast<int>(scroll_metrics->scroll_type()) - : pinch_metrics ? static_cast<int>(pinch_metrics->pinch_type()) - : 0; - const int event_histogram_index = - event_type_index * kEventLatencyGestureTypeCount + gesture_type_index; - - const std::string total_latency_stage_name = - GetStageName(StageType::kTotalLatency); - const std::string event_total_latency_histogram_name = - base::StrCat({histogram_base_name, ".", total_latency_stage_name}); - // Note: There's a 1:1 mapping between `event_histogram_index` and - // `event_total_latency_histogram_name` which allows the use of - // `STATIC_HISTOGRAM_POINTER_GROUP()` to cache histogram objects. - STATIC_HISTOGRAM_POINTER_GROUP( - event_total_latency_histogram_name, event_histogram_index, - kMaxEventLatencyHistogramIndex, - AddTimeMicrosecondsGranularity(total_latency), - base::Histogram::FactoryMicrosecondsTimeGet( - event_total_latency_histogram_name, kEventLatencyHistogramMin, - kEventLatencyHistogramMax, kEventLatencyHistogramBucketCount, - base::HistogramBase::kUmaTargetedHistogramFlag)); - - // Also, report total latency up to presentation for all event types in an - // aggregate histogram. - UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES( - "EventLatency." + total_latency_stage_name, total_latency, - kEventLatencyHistogramMin, kEventLatencyHistogramMax, - kEventLatencyHistogramBucketCount); - } - - if (global_trackers_.event_latency_tracker) { - EventLatencyTracker::LatencyData& latency_data = - latencies.emplace_back(event_metrics->type(), total_latency); - - if (scroll_metrics) - latency_data.input_type = scroll_metrics->scroll_type(); - else if (pinch_metrics) - latency_data.input_type = pinch_metrics->pinch_type(); - } - } - - if (!latencies.empty()) { - DCHECK(global_trackers_.event_latency_tracker); - global_trackers_.event_latency_tracker->ReportEventLatency( - std::move(latencies)); + // Also, report total latency up to presentation for all event types in an + // aggregate histogram. + UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES( + total_latency_histogram_name, total_latency, kEventLatencyHistogramMin, + kEventLatencyHistogramMax, kEventLatencyHistogramBucketCount); } }
diff --git a/cc/metrics/compositor_frame_reporter.h b/cc/metrics/compositor_frame_reporter.h index 9b41d47..730dc890 100644 --- a/cc/metrics/compositor_frame_reporter.h +++ b/cc/metrics/compositor_frame_reporter.h
@@ -31,16 +31,14 @@ } namespace cc { -class DroppedFrameCounter; -class EventLatencyTracker; class FrameSequenceTrackerCollection; +class DroppedFrameCounter; class LatencyUkmReporter; struct GlobalMetricsTrackers { raw_ptr<DroppedFrameCounter> dropped_frame_counter = nullptr; raw_ptr<LatencyUkmReporter> latency_ukm_reporter = nullptr; raw_ptr<FrameSequenceTrackerCollection> frame_sequence_trackers = nullptr; - raw_ptr<EventLatencyTracker> event_latency_tracker = nullptr; }; // This is used for tracing and reporting the duration of pipeline stages within
diff --git a/cc/metrics/compositor_frame_reporting_controller.h b/cc/metrics/compositor_frame_reporting_controller.h index 3d1640c..680cbe8 100644 --- a/cc/metrics/compositor_frame_reporting_controller.h +++ b/cc/metrics/compositor_frame_reporting_controller.h
@@ -24,7 +24,6 @@ namespace cc { class DroppedFrameCounter; -class EventLatencyTracker; class UkmManager; struct BeginMainFrameMetrics; struct FrameInfo; @@ -110,10 +109,6 @@ global_trackers_.frame_sequence_trackers = frame_sequence_trackers; } - void set_event_latency_tracker(EventLatencyTracker* event_latency_tracker) { - global_trackers_.event_latency_tracker = event_latency_tracker; - } - void BeginMainFrameStarted(base::TimeTicks begin_main_frame_start_time) { begin_main_frame_start_time_ = begin_main_frame_start_time; }
diff --git a/cc/metrics/event_latency_tracker.cc b/cc/metrics/event_latency_tracker.cc deleted file mode 100644 index 17e4cf4cb..0000000 --- a/cc/metrics/event_latency_tracker.cc +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "cc/metrics/event_latency_tracker.h" - -namespace cc { - -EventLatencyTracker::LatencyData::LatencyData( - EventMetrics::EventType event_type, - base::TimeDelta total_latency) - : event_type(event_type), total_latency(total_latency) {} - -EventLatencyTracker::LatencyData::~LatencyData() = default; - -EventLatencyTracker::LatencyData::LatencyData(LatencyData&&) = default; -EventLatencyTracker::LatencyData& EventLatencyTracker::LatencyData::operator=( - LatencyData&&) = default; - -EventLatencyTracker::EventLatencyTracker() = default; -EventLatencyTracker::~EventLatencyTracker() = default; - -} // namespace cc
diff --git a/cc/metrics/event_latency_tracker.h b/cc/metrics/event_latency_tracker.h deleted file mode 100644 index 1d42588..0000000 --- a/cc/metrics/event_latency_tracker.h +++ /dev/null
@@ -1,54 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CC_METRICS_EVENT_LATENCY_TRACKER_H_ -#define CC_METRICS_EVENT_LATENCY_TRACKER_H_ - -#include <vector> - -#include "base/time/time.h" -#include "cc/cc_export.h" -#include "cc/metrics/event_metrics.h" -#include "third_party/abseil-cpp/absl/types/variant.h" - -namespace cc { - -// Used by `CompositorFrameReporter` to report event latency information back to -// `LayerTreeHostImpl` and eventually to UI compositor. -class CC_EXPORT EventLatencyTracker { - public: - struct CC_EXPORT LatencyData { - LatencyData(EventMetrics::EventType event_type, - base::TimeDelta total_latency); - ~LatencyData(); - - LatencyData(const LatencyData&) = delete; - LatencyData& operator=(const LatencyData&) = delete; - - LatencyData(LatencyData&&); - LatencyData& operator=(LatencyData&&); - - EventMetrics::EventType event_type; - base::TimeDelta total_latency; - - // Type of the input device if the event is a scroll or a pinch event. - absl::variant<absl::monostate, - ScrollEventMetrics::ScrollType, - PinchEventMetrics::PinchType> - input_type; - }; - - EventLatencyTracker(); - virtual ~EventLatencyTracker(); - - EventLatencyTracker(const EventLatencyTracker&) = delete; - EventLatencyTracker& operator=(const EventLatencyTracker&) = delete; - - // Called every time a frame has latency metrics to report for events. - virtual void ReportEventLatency(std::vector<LatencyData> latencies) = 0; -}; - -} // namespace cc - -#endif // CC_METRICS_EVENT_LATENCY_TRACKER_H_
diff --git a/cc/paint/discardable_image_map_unittest.cc b/cc/paint/discardable_image_map_unittest.cc index f26af0f..1276724 100644 --- a/cc/paint/discardable_image_map_unittest.cc +++ b/cc/paint/discardable_image_map_unittest.cc
@@ -917,7 +917,7 @@ scoped_refptr<DisplayItemList> display_list = new DisplayItemList(); display_list->StartPaint(); display_list->push<SaveLayerOp>(nullptr, &flags); - display_list->push<DrawColorOp>(SK_ColorBLUE, SkBlendMode::kSrc); + display_list->push<DrawColorOp>(SkColors::kBlue, SkBlendMode::kSrc); display_list->EndPaintOfUnpaired(visible_rect); display_list->Finalize();
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc index ef935c0b..471991f1 100644 --- a/cc/paint/oop_pixeltest.cc +++ b/cc/paint/oop_pixeltest.cc
@@ -384,7 +384,7 @@ gfx::Rect rect(10, 10); auto display_item_list = base::MakeRefCounted<DisplayItemList>(); display_item_list->StartPaint(); - display_item_list->push<DrawColorOp>(SK_ColorBLUE, SkBlendMode::kSrc); + display_item_list->push<DrawColorOp>(SkColors::kBlue, SkBlendMode::kSrc); display_item_list->EndPaintOfUnpaired(rect); display_item_list->Finalize(); @@ -398,7 +398,7 @@ gfx::Rect rect(10, 10); auto display_item_list = base::MakeRefCounted<DisplayItemList>(); display_item_list->StartPaint(); - display_item_list->push<DrawColorOp>(SK_ColorBLUE, SkBlendMode::kSrc); + display_item_list->push<DrawColorOp>(SkColors::kBlue, SkBlendMode::kSrc); display_item_list->EndPaintOfUnpaired(rect); display_item_list->Finalize(); @@ -482,7 +482,7 @@ auto display_item_list = base::MakeRefCounted<DisplayItemList>(); display_item_list->StartPaint(); - display_item_list->push<DrawColorOp>(SK_ColorWHITE, SkBlendMode::kSrc); + display_item_list->push<DrawColorOp>(SkColors::kWhite, SkBlendMode::kSrc); display_item_list->push<SaveLayerOp>(nullptr, &record_flags); display_item_list->push<RestoreOp>(); display_item_list->EndPaintOfUnpaired(gfx::Rect(output_size)); @@ -633,7 +633,7 @@ auto display_item_list = base::MakeRefCounted<DisplayItemList>(); display_item_list->StartPaint(); - display_item_list->push<DrawColorOp>(SK_ColorWHITE, SkBlendMode::kSrc); + display_item_list->push<DrawColorOp>(SkColors::kWhite, SkBlendMode::kSrc); display_item_list->push<ScaleOp>(2.f, 2.f); PaintFlags raster_flags; raster_flags.setShader(paint_record_shader); @@ -2384,7 +2384,7 @@ auto display_item_list = base::MakeRefCounted<DisplayItemList>(); display_item_list->StartPaint(); - display_item_list->push<DrawColorOp>(SK_ColorWHITE, SkBlendMode::kSrc); + display_item_list->push<DrawColorOp>(SkColors::kWhite, SkBlendMode::kSrc); PaintFlags flags; flags.setStyle(PaintFlags::kFill_Style); flags.setColor(SK_ColorGREEN); @@ -2420,7 +2420,7 @@ const SkRect rect = SkRect::MakeWH(max_texture_size + 10, 10); auto shader_record = sk_make_sp<PaintRecord>(); - shader_record->push<DrawColorOp>(SK_ColorWHITE, SkBlendMode::kSrc); + shader_record->push<DrawColorOp>(SkColors::kWhite, SkBlendMode::kSrc); PaintFlags flags; flags.setStyle(PaintFlags::kFill_Style); flags.setColor(SK_ColorGREEN); @@ -2437,7 +2437,7 @@ auto display_item_list = base::MakeRefCounted<DisplayItemList>(); display_item_list->StartPaint(); - display_item_list->push<DrawColorOp>(SK_ColorWHITE, SkBlendMode::kSrc); + display_item_list->push<DrawColorOp>(SkColors::kWhite, SkBlendMode::kSrc); flags.setShader(shader); display_item_list->push<DrawRectOp>(rect, flags); display_item_list->EndPaintOfUnpaired(options.full_raster_rect);
diff --git a/cc/paint/paint_op_buffer.cc b/cc/paint/paint_op_buffer.cc index 577424a..1081d23 100644 --- a/cc/paint/paint_op_buffer.cc +++ b/cc/paint/paint_op_buffer.cc
@@ -3011,7 +3011,7 @@ const PaintOpBuffer* buffer, const std::vector<size_t>* offsets) : iter_(buffer, offsets), - folded_draw_color_(SK_ColorTRANSPARENT, SkBlendMode::kSrcOver) { + folded_draw_color_(SkColors::kTransparent, SkBlendMode::kSrcOver) { DCHECK(!buffer->are_ops_destroyed()); FindNextOp(); } @@ -3058,10 +3058,9 @@ static_cast<const DrawColorOp*>(draw_op)->mode == SkBlendMode::kSrcOver) { auto* draw_color_op = static_cast<const DrawColorOp*>(draw_op); - SkColor color = draw_color_op->color; - folded_draw_color_.color = SkColorSetARGB( - SkMulDiv255Round(save_op->alpha, SkColorGetA(color)), - SkColorGetR(color), SkColorGetG(color), SkColorGetB(color)); + SkColor4f color = draw_color_op->color; + folded_draw_color_.color = {color.fR, color.fG, color.fB, + save_op->alpha / 255 * color.fA}; current_op_ = &folded_draw_color_; break; }
diff --git a/cc/paint/paint_op_buffer.h b/cc/paint/paint_op_buffer.h index 7cc33c3..37f9aaa 100644 --- a/cc/paint/paint_op_buffer.h +++ b/cc/paint/paint_op_buffer.h
@@ -520,7 +520,7 @@ public: static constexpr PaintOpType kType = PaintOpType::DrawColor; static constexpr bool kIsDrawOp = true; - DrawColorOp(SkColor color, SkBlendMode mode) + DrawColorOp(SkColor4f color, SkBlendMode mode) : PaintOp(kType), color(color), mode(mode) {} static void Raster(const DrawColorOp* op, SkCanvas* canvas, @@ -529,7 +529,7 @@ static bool AreEqual(const PaintOp* left, const PaintOp* right); HAS_SERIALIZATION_FUNCTIONS(); - SkColor color; + SkColor4f color; SkBlendMode mode; private:
diff --git a/cc/paint/paint_op_buffer_serializer.cc b/cc/paint/paint_op_buffer_serializer.cc index 7364828..b57a730 100644 --- a/cc/paint/paint_op_buffer_serializer.cc +++ b/cc/paint/paint_op_buffer_serializer.cc
@@ -142,7 +142,8 @@ SkClipOp::kDifference, false); SerializeOp(canvas, &inner_clip_op, nullptr, params); } - DrawColorOp clear_op(preamble.background_color, SkBlendMode::kSrc); + DrawColorOp clear_op(SkColor4f::FromColor(preamble.background_color), + SkBlendMode::kSrc); SerializeOp(canvas, &clear_op, nullptr, params); RestoreToCount(canvas, 1, params); } @@ -165,7 +166,7 @@ // There's not enough information at this point to know if this texture is // being reused from another tile, so the external texels could have been // cleared to some wrong value. - DrawColorOp clear(SK_ColorTRANSPARENT, SkBlendMode::kSrc); + DrawColorOp clear(SkColors::kTransparent, SkBlendMode::kSrc); SerializeOp(canvas, &clear, nullptr, params); } @@ -196,7 +197,7 @@ // section that is being rastered. If this is opaque, trust the raster // to write all the pixels inside of the full_raster_rect. if (preamble.requires_clear && is_partial_raster) { - DrawColorOp clear_op(SK_ColorTRANSPARENT, SkBlendMode::kSrc); + DrawColorOp clear_op(SkColors::kTransparent, SkBlendMode::kSrc); SerializeOp(canvas, &clear_op, nullptr, params); } }
diff --git a/cc/paint/paint_op_buffer_unittest.cc b/cc/paint/paint_op_buffer_unittest.cc index b80958f7..802675a4 100644 --- a/cc/paint/paint_op_buffer_unittest.cc +++ b/cc/paint/paint_op_buffer_unittest.cc
@@ -158,7 +158,7 @@ private: SkRect rect_; PaintFlags flags_; - SkColor draw_color_ = SK_ColorRED; + SkColor4f draw_color_ = SkColors::kRed; SkBlendMode blend_ = SkBlendMode::kSrc; }; @@ -433,7 +433,8 @@ SkColor original = SkColorSetA(50, SK_ColorRED); buffer.push<SaveLayerAlphaOp>(nullptr, alpha); - buffer.push<DrawColorOp>(original, SkBlendMode::kSrcOver); + buffer.push<DrawColorOp>(SkColor4f::FromColor(original), + SkBlendMode::kSrcOver); buffer.push<RestoreOp>(); SaveCountingCanvas canvas; @@ -732,11 +733,11 @@ TEST_F(PaintOpBufferOffsetsTest, ContiguousIndices) { testing::StrictMock<MockCanvas> canvas; - push_op<DrawColorOp>(0u, SkBlendMode::kClear); - push_op<DrawColorOp>(1u, SkBlendMode::kClear); - push_op<DrawColorOp>(2u, SkBlendMode::kClear); - push_op<DrawColorOp>(3u, SkBlendMode::kClear); - push_op<DrawColorOp>(4u, SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(0u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(1u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(2u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(3u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(4u), SkBlendMode::kClear); // Plays all items. testing::Sequence s; @@ -751,11 +752,11 @@ TEST_F(PaintOpBufferOffsetsTest, NonContiguousIndices) { testing::StrictMock<MockCanvas> canvas; - push_op<DrawColorOp>(0u, SkBlendMode::kClear); - push_op<DrawColorOp>(1u, SkBlendMode::kClear); - push_op<DrawColorOp>(2u, SkBlendMode::kClear); - push_op<DrawColorOp>(3u, SkBlendMode::kClear); - push_op<DrawColorOp>(4u, SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(0u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(1u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(2u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(3u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(4u), SkBlendMode::kClear); // Plays 0, 1, 3, 4 indices. testing::Sequence s; @@ -769,11 +770,11 @@ TEST_F(PaintOpBufferOffsetsTest, FirstTwoIndices) { testing::StrictMock<MockCanvas> canvas; - push_op<DrawColorOp>(0u, SkBlendMode::kClear); - push_op<DrawColorOp>(1u, SkBlendMode::kClear); - push_op<DrawColorOp>(2u, SkBlendMode::kClear); - push_op<DrawColorOp>(3u, SkBlendMode::kClear); - push_op<DrawColorOp>(4u, SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(0u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(1u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(2u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(3u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(4u), SkBlendMode::kClear); // Plays first two indices. testing::Sequence s; @@ -785,11 +786,11 @@ TEST_F(PaintOpBufferOffsetsTest, MiddleIndex) { testing::StrictMock<MockCanvas> canvas; - push_op<DrawColorOp>(0u, SkBlendMode::kClear); - push_op<DrawColorOp>(1u, SkBlendMode::kClear); - push_op<DrawColorOp>(2u, SkBlendMode::kClear); - push_op<DrawColorOp>(3u, SkBlendMode::kClear); - push_op<DrawColorOp>(4u, SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(0u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(1u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(2u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(3u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(4u), SkBlendMode::kClear); // Plays index 2. testing::Sequence s; @@ -800,11 +801,11 @@ TEST_F(PaintOpBufferOffsetsTest, LastTwoElements) { testing::StrictMock<MockCanvas> canvas; - push_op<DrawColorOp>(0u, SkBlendMode::kClear); - push_op<DrawColorOp>(1u, SkBlendMode::kClear); - push_op<DrawColorOp>(2u, SkBlendMode::kClear); - push_op<DrawColorOp>(3u, SkBlendMode::kClear); - push_op<DrawColorOp>(4u, SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(0u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(1u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(2u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(3u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(4u), SkBlendMode::kClear); // Plays last two elements. testing::Sequence s; @@ -816,14 +817,14 @@ TEST_F(PaintOpBufferOffsetsTest, ContiguousIndicesWithSaveLayerAlphaRestore) { testing::StrictMock<MockCanvas> canvas; - push_op<DrawColorOp>(0u, SkBlendMode::kClear); - push_op<DrawColorOp>(1u, SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(0u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(1u), SkBlendMode::kClear); uint8_t alpha = 100; push_op<SaveLayerAlphaOp>(nullptr, alpha); push_op<RestoreOp>(); - push_op<DrawColorOp>(2u, SkBlendMode::kClear); - push_op<DrawColorOp>(3u, SkBlendMode::kClear); - push_op<DrawColorOp>(4u, SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(2u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(3u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(4u), SkBlendMode::kClear); // Items are {0, 1, save, restore, 2, 3, 4}. @@ -842,14 +843,14 @@ NonContiguousIndicesWithSaveLayerAlphaRestore) { testing::StrictMock<MockCanvas> canvas; - push_op<DrawColorOp>(0u, SkBlendMode::kClear); - push_op<DrawColorOp>(1u, SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(0u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(1u), SkBlendMode::kClear); uint8_t alpha = 100; push_op<SaveLayerAlphaOp>(nullptr, alpha); - push_op<DrawColorOp>(2u, SkBlendMode::kClear); - push_op<DrawColorOp>(3u, SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(2u), SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(3u), SkBlendMode::kClear); push_op<RestoreOp>(); - push_op<DrawColorOp>(4u, SkBlendMode::kClear); + push_op<DrawColorOp>(SkColor4f::FromColor(4u), SkBlendMode::kClear); // Items are {0, 1, save, 2, 3, restore, 4}. @@ -1205,10 +1206,9 @@ PaintFlags(), }; -std::vector<SkColor> test_colors = { - SkColorSetARGB(0, 0, 0, 0), SkColorSetARGB(255, 255, 255, 255), - SkColorSetARGB(0, 255, 10, 255), SkColorSetARGB(255, 0, 20, 255), - SkColorSetARGB(30, 255, 0, 255), SkColorSetARGB(255, 40, 0, 0), +std::vector<SkColor4f> test_colors = { + {0, 0, 0, 0}, {1, 1, 1, 1}, {1, 0.04, 1, 0}, + {0, 0.08, 1, 1}, {1, 0, 1, 0.12}, {0.16, 0, 0, 1}, }; std::vector<std::string> test_strings = { @@ -2229,7 +2229,7 @@ preamble.requires_clear = true; PaintOpBuffer buffer; - buffer.push<DrawColorOp>(SK_ColorBLUE, SkBlendMode::kSrc); + buffer.push<DrawColorOp>(SkColors::kBlue, SkBlendMode::kSrc); std::unique_ptr<char, base::AlignedFreeDeleter> memory( static_cast<char*>(base::AlignedAlloc(PaintOpBuffer::kInitialBufferSize, @@ -2304,7 +2304,7 @@ ASSERT_EQ(op->GetType(), PaintOpType::DrawColor) << PaintOpTypeToString(op->GetType()); const auto* draw_color_op = static_cast<const DrawColorOp*>(op); - EXPECT_EQ(draw_color_op->color, SK_ColorTRANSPARENT); + EXPECT_EQ(draw_color_op->color, SkColors::kTransparent); EXPECT_EQ(draw_color_op->mode, SkBlendMode::kSrc); continue; } @@ -2514,7 +2514,7 @@ static_cast<char*>(base::AlignedAlloc(kSize, kAlign))); PaintOpBuffer buffer; - buffer.push<DrawColorOp>(SK_ColorMAGENTA, SkBlendMode::kSrc); + buffer.push<DrawColorOp>(SkColors::kMagenta, SkBlendMode::kSrc); PaintOpBuffer::Iterator iter(&buffer); PaintOp* op = *iter; @@ -2630,7 +2630,7 @@ PaintOpBuffer buffer; // Successful first two ops. - buffer.push<DrawColorOp>(SK_ColorMAGENTA, SkBlendMode::kDstIn); + buffer.push<DrawColorOp>(SkColors::kMagenta, SkBlendMode::kDstIn); PaintFlags good_flags = test_flags[0]; good_flags.setBlendMode(SkBlendMode::kColorBurn); buffer.push<DrawRectOp>(test_rects[0], good_flags); @@ -2663,7 +2663,7 @@ }; for (size_t i = 0; i < std::size(bad_modes_for_draw_color); ++i) { - buffer.push<DrawColorOp>(SK_ColorMAGENTA, bad_modes_for_draw_color[i]); + buffer.push<DrawColorOp>(SkColors::kMagenta, bad_modes_for_draw_color[i]); } for (size_t i = 0; i < std::size(bad_modes_for_flags); ++i) { @@ -2982,7 +2982,7 @@ image_flags.setShader(PaintShader::MakeImage(paint_image, SkTileMode::kRepeat, SkTileMode::kRepeat, nullptr)); buffer.push<DrawRectOp>(SkRect::MakeXYWH(110, 110, 100, 100), image_flags); - buffer.push<DrawColorOp>(SK_ColorRED, SkBlendMode::kSrcOver); + buffer.push<DrawColorOp>(SkColors::kRed, SkBlendMode::kSrcOver); testing::StrictMock<MockCanvas> canvas; testing::Sequence s;
diff --git a/cc/paint/paint_op_helper_unittest.cc b/cc/paint/paint_op_helper_unittest.cc index e7f7fc93..8a4aa431 100644 --- a/cc/paint/paint_op_helper_unittest.cc +++ b/cc/paint/paint_op_helper_unittest.cc
@@ -56,9 +56,11 @@ } TEST(PaintOpHelper, DrawColorToString) { - DrawColorOp op(SkColorSetARGB(11, 22, 33, 44), SkBlendMode::kSrc); + DrawColorOp op({0.1, 0.2, 0.3, 0.4}, SkBlendMode::kSrc); std::string str = PaintOpHelper::ToString(&op); - EXPECT_EQ(str, "DrawColorOp(color=rgba(22, 33, 44, 11), mode=kSrc)"); + EXPECT_EQ(str, + "DrawColorOp(color=rgba(0.100000, 0.200000, 0.300000, 0.400000), " + "mode=kSrc)"); } TEST(PaintOpHelper, DrawDRRectToString) {
diff --git a/cc/paint/paint_op_reader.cc b/cc/paint/paint_op_reader.cc index ef242d1..9635858b5 100644 --- a/cc/paint/paint_op_reader.cc +++ b/cc/paint/paint_op_reader.cc
@@ -201,6 +201,10 @@ ReadSimple(rect); } +void PaintOpReader::Read(SkColor4f* color) { + ReadSimple(color); +} + void PaintOpReader::Read(SkPath* path) { uint32_t path_id; ReadSimple(&path_id);
diff --git a/cc/paint/paint_op_reader.h b/cc/paint/paint_op_reader.h index b325b5f..d54667d6 100644 --- a/cc/paint/paint_op_reader.h +++ b/cc/paint/paint_op_reader.h
@@ -68,6 +68,7 @@ void Read(SkRect* rect); void Read(SkIRect* rect); void Read(SkRRect* rect); + void Read(SkColor4f* color); void Read(SkPath* path); void Read(PaintFlags* flags);
diff --git a/cc/paint/paint_op_writer.cc b/cc/paint/paint_op_writer.cc index 9e654a3..f899b75 100644 --- a/cc/paint/paint_op_writer.cc +++ b/cc/paint/paint_op_writer.cc
@@ -184,6 +184,10 @@ WriteSimple(rect); } +void PaintOpWriter::Write(const SkColor4f& color) { + WriteSimple(color); +} + void PaintOpWriter::Write(const SkPath& path, UsePaintCache use_paint_cache) { auto id = path.getGenerationID(); if (!options_.for_identifiability_study)
diff --git a/cc/paint/paint_op_writer.h b/cc/paint/paint_op_writer.h index 570e3b2b..defb8ce 100644 --- a/cc/paint/paint_op_writer.h +++ b/cc/paint/paint_op_writer.h
@@ -60,6 +60,7 @@ void Write(const SkRect& rect); void Write(const SkIRect& rect); void Write(const SkRRect& rect); + void Write(const SkColor4f& color); void Write(const SkPath& path, UsePaintCache); void Write(const sk_sp<SkData>& data); void Write(const SkColorSpace* data);
diff --git a/cc/paint/record_paint_canvas.cc b/cc/paint/record_paint_canvas.cc index 4938ba5..0f917af 100644 --- a/cc/paint/record_paint_canvas.cc +++ b/cc/paint/record_paint_canvas.cc
@@ -228,11 +228,11 @@ } void RecordPaintCanvas::drawColor(SkColor color, SkBlendMode mode) { - push<DrawColorOp>(color, mode); + push<DrawColorOp>(SkColor4f::FromColor(color), mode); } void RecordPaintCanvas::clear(SkColor color) { - push<DrawColorOp>(color, SkBlendMode::kSrc); + push<DrawColorOp>(SkColor4f::FromColor(color), SkBlendMode::kSrc); } void RecordPaintCanvas::drawLine(SkScalar x0,
diff --git a/cc/paint/solid_color_analyzer.cc b/cc/paint/solid_color_analyzer.cc index a1d4a92..73f38fc 100644 --- a/cc/paint/solid_color_analyzer.cc +++ b/cc/paint/solid_color_analyzer.cc
@@ -324,8 +324,8 @@ if (++num_draw_ops > max_ops_to_analyze) return absl::nullopt; const DrawColorOp* color_op = static_cast<const DrawColorOp*>(op); - CheckIfSolidColor(canvas, SkColor4f::FromColor(color_op->color), - color_op->mode, &is_solid, &is_transparent, &color); + CheckIfSolidColor(canvas, color_op->color, color_op->mode, &is_solid, + &is_transparent, &color); break; } case PaintOpType::ClipRect: {
diff --git a/cc/test/fake_layer_tree_host_impl_client.h b/cc/test/fake_layer_tree_host_impl_client.h index e669425..751b239 100644 --- a/cc/test/fake_layer_tree_host_impl_client.h +++ b/cc/test/fake_layer_tree_host_impl_client.h
@@ -5,8 +5,6 @@ #ifndef CC_TEST_FAKE_LAYER_TREE_HOST_IMPL_CLIENT_H_ #define CC_TEST_FAKE_LAYER_TREE_HOST_IMPL_CLIENT_H_ -#include <vector> - #include "cc/trees/layer_tree_host_impl.h" #include "components/viz/common/frame_sinks/begin_frame_args.h" @@ -61,8 +59,6 @@ const base::flat_set<viz::FrameSinkId>& ids) override {} void ClearHistory() override {} size_t CommitDurationSampleCountForTesting() const override; - void ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) override {} void reset_did_request_impl_side_invalidation() { did_request_impl_side_invalidation_ = false;
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc index bf56cbd..813a39d 100644 --- a/cc/test/layer_tree_test.cc +++ b/cc/test/layer_tree_test.cc
@@ -487,9 +487,6 @@ uint32_t frame_token, const gfx::PresentationFeedback& feedback) override {} - void ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) override {} - private: explicit LayerTreeHostClientForTesting(TestHooks* test_hooks) : test_hooks_(test_hooks) {}
diff --git a/cc/test/paint_op_helper.h b/cc/test/paint_op_helper.h index ac06fc29..a417cf59 100644 --- a/cc/test/paint_op_helper.h +++ b/cc/test/paint_op_helper.h
@@ -272,6 +272,11 @@ SkColorGetA(color)); } + static std::string SkiaTypeToString(const SkColor4f& color) { + return base::StringPrintf("rgba(%f, %f, %f, %f)", color.fR, color.fG, + color.fB, color.fA); + } + static std::string SkiaTypeToString(const SkBlendMode& mode) { switch (mode) { default:
diff --git a/cc/test/solid_color_content_layer_client.cc b/cc/test/solid_color_content_layer_client.cc index aa68ed22..2976ef7 100644 --- a/cc/test/solid_color_content_layer_client.cc +++ b/cc/test/solid_color_content_layer_client.cc
@@ -26,7 +26,7 @@ SkRect clip = gfx::RectToSkRect(PaintableRegion()); display_list->push<ClipRectOp>(clip, SkClipOp::kIntersect, false); - SkColor color = SK_ColorTRANSPARENT; + SkColor4f color = SkColors::kTransparent; display_list->push<DrawColorOp>(color, SkBlendMode::kSrc); if (border_size_ != 0) {
diff --git a/cc/test/stub_layer_tree_host_client.h b/cc/test/stub_layer_tree_host_client.h index a5df8c35..aa696aa0 100644 --- a/cc/test/stub_layer_tree_host_client.h +++ b/cc/test/stub_layer_tree_host_client.h
@@ -6,7 +6,6 @@ #define CC_TEST_STUB_LAYER_TREE_HOST_CLIENT_H_ #include <memory> -#include <vector> #include "cc/paint/element_id.h" #include "cc/trees/layer_tree_host_client.h" @@ -54,8 +53,6 @@ void DidPresentCompositorFrame( uint32_t frame_token, const gfx::PresentationFeedback& feedback) override {} - void ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) override {} }; } // namespace cc
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index 8369d307..17c9271 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -1104,11 +1104,6 @@ client_->NotifyThroughputTrackerResults(std::move(results)); } -void LayerTreeHost::ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) { - client_->ReportEventLatency(std::move(latencies)); -} - const base::WeakPtr<CompositorDelegateForInput>& LayerTreeHost::GetDelegateForInput() const { DCHECK(IsMainThread());
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h index 2f73d81..1c9e630 100644 --- a/cc/trees/layer_tree_host.h +++ b/cc/trees/layer_tree_host.h
@@ -716,8 +716,6 @@ void NotifyThroughputTrackerResults(CustomTrackerResults results); void NotifyTransitionRequestsFinished( const std::vector<uint32_t>& sequence_ids); - void ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies); LayerTreeHostClient* client() { DCHECK(IsMainThread());
diff --git a/cc/trees/layer_tree_host_client.h b/cc/trees/layer_tree_host_client.h index f52db87..d06f576 100644 --- a/cc/trees/layer_tree_host_client.h +++ b/cc/trees/layer_tree_host_client.h
@@ -6,12 +6,10 @@ #define CC_TREES_LAYER_TREE_HOST_CLIENT_H_ #include <memory> -#include <vector> #include "base/memory/ref_counted.h" #include "base/time/time.h" #include "cc/input/browser_controls_state.h" -#include "cc/metrics/event_latency_tracker.h" #include "cc/metrics/frame_sequence_tracker_collection.h" #include "cc/trees/paint_holding_reason.h" #include "cc/trees/property_tree.h" @@ -190,8 +188,6 @@ // RecordEndOfFrameMetrics. virtual std::unique_ptr<BeginMainFrameMetrics> GetBeginMainFrameMetrics() = 0; virtual void NotifyThroughputTrackerResults(CustomTrackerResults results) = 0; - virtual void ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) = 0; // Should only be implemented by Blink. virtual std::unique_ptr<WebVitalMetrics> GetWebVitalMetrics() = 0;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index ff670d87..1a93ae4 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -462,16 +462,14 @@ compositor_frame_reporting_controller_->SetFrameSequenceTrackerCollection( &frame_trackers_); +#if BUILDFLAG(IS_CHROMEOS_ASH) const bool is_ui = settings.is_layer_tree_for_ui; if (is_ui) { - compositor_frame_reporting_controller_->set_event_latency_tracker(this); - -#if BUILDFLAG(IS_CHROMEOS_ASH) dropped_frame_counter_.EnableReporForUI(); compositor_frame_reporting_controller_->SetThreadAffectsSmoothness( FrameInfo::SmoothEffectDrivingThread::kMain, true); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) } +#endif // BUILDFLAG(IS_CHROMEOS_ASH) dropped_frame_counter_.set_total_counter(&total_frame_counter_); frame_trackers_.set_custom_tracker_results_added_callback( @@ -2234,11 +2232,6 @@ SetNeedsCommit(); } -void LayerTreeHostImpl::ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) { - client_->ReportEventLatency(std::move(latencies)); -} - void LayerTreeHostImpl::OnCanDrawStateChangedForTree() { client_->OnCanDrawStateChanged(CanDraw()); }
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h index a655e6c..53a0ded1 100644 --- a/cc/trees/layer_tree_host_impl.h +++ b/cc/trees/layer_tree_host_impl.h
@@ -32,7 +32,6 @@ #include "cc/layers/layer_collections.h" #include "cc/metrics/average_lag_tracking_manager.h" #include "cc/metrics/dropped_frame_counter.h" -#include "cc/metrics/event_latency_tracker.h" #include "cc/metrics/event_metrics.h" #include "cc/metrics/events_metrics_manager.h" #include "cc/metrics/frame_sequence_tracker_collection.h" @@ -183,9 +182,6 @@ virtual size_t CommitDurationSampleCountForTesting() const = 0; - virtual void ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) = 0; - protected: virtual ~LayerTreeHostImplClient() = default; }; @@ -199,8 +195,7 @@ public VideoFrameControllerClient, public MutatorHostClient, public ImageAnimationController::Client, - public CompositorDelegateForInput, - public EventLatencyTracker { + public CompositorDelegateForInput { public: // This structure is used to build all the state required for producing a // single CompositorFrame. The |render_passes| list becomes the set of @@ -573,10 +568,6 @@ void OnCompositorFrameTransitionDirectiveProcessed( uint32_t sequence_id) override; - // EventLatencyTracker implementation. - void ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) override; - // Called from LayerTreeImpl. void OnCanDrawStateChangedForTree();
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 3db80b2d..249eebb 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -277,8 +277,6 @@ void NotifyPaintWorkletStateChange( Scheduler::PaintWorkletState state) override {} void NotifyThroughputTrackerResults(CustomTrackerResults results) override {} - void ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) override {} void DidObserveFirstScrollDelay( base::TimeDelta first_scroll_delay,
diff --git a/cc/trees/layer_tree_host_pixeltest_masks.cc b/cc/trees/layer_tree_host_pixeltest_masks.cc index 38205753..876586f 100644 --- a/cc/trees/layer_tree_host_pixeltest_masks.cc +++ b/cc/trees/layer_tree_host_pixeltest_masks.cc
@@ -64,13 +64,13 @@ display_list->push<SaveOp>(); display_list->push<ClipRectOp>(gfx::RectToSkRect(PaintableRegion()), SkClipOp::kIntersect, false); - SkColor color = SK_ColorTRANSPARENT; + SkColor4f color = SkColors::kTransparent; display_list->push<DrawColorOp>(color, SkBlendMode::kSrc); PaintFlags flags; flags.setStyle(PaintFlags::kStroke_Style); flags.setStrokeWidth(SkIntToScalar(2)); - flags.setColor(SK_ColorWHITE); + flags.setColor4f(SkColors::kWhite); gfx::Rect inset_rect(bounds_); while (!inset_rect.IsEmpty()) { @@ -444,7 +444,7 @@ display_list->push<SaveOp>(); display_list->push<ClipRectOp>(gfx::RectToSkRect(PaintableRegion()), SkClipOp::kIntersect, false); - SkColor color = SK_ColorTRANSPARENT; + SkColor4f color = SkColors::kTransparent; display_list->push<DrawColorOp>(color, SkBlendMode::kSrc); PaintFlags flags; @@ -491,7 +491,7 @@ display_list->push<SaveOp>(); display_list->push<ClipRectOp>(gfx::RectToSkRect(PaintableRegion()), SkClipOp::kIntersect, false); - SkColor color = SK_ColorTRANSPARENT; + SkColor4f color = SkColors::kTransparent; display_list->push<DrawColorOp>(color, SkBlendMode::kSrc); PaintFlags flags; @@ -783,14 +783,16 @@ static scoped_refptr<Layer> CreateCheckerboardLayer(const gfx::Size& bounds) { constexpr int kGridSize = 8; - static const SkColor color_even = SkColorSetRGB(153, 153, 153); - static const SkColor color_odd = SkColorSetRGB(102, 102, 102); + static const SkColor4f color_even = + SkColor4f::FromColor(SkColorSetRGB(153, 153, 153)); + static const SkColor4f color_odd = + SkColor4f::FromColor(SkColorSetRGB(102, 102, 102)); auto display_list = base::MakeRefCounted<DisplayItemList>(); display_list->StartPaint(); display_list->push<DrawColorOp>(color_even, SkBlendMode::kSrc); PaintFlags flags; - flags.setColor(color_odd); + flags.setColor4f(color_odd); for (int j = 0; j < (bounds.height() + kGridSize - 1) / kGridSize; j++) { for (int i = 0; i < (bounds.width() + kGridSize - 1) / kGridSize; i++) { bool is_odd_grid = (i ^ j) & 1;
diff --git a/cc/trees/proxy_impl.cc b/cc/trees/proxy_impl.cc index f772bf5..6bc47a6 100644 --- a/cc/trees/proxy_impl.cc +++ b/cc/trees/proxy_impl.cc
@@ -311,14 +311,6 @@ NOTREACHED(); } -void ProxyImpl::ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) { - DCHECK(IsImplThread()); - MainThreadTaskRunner()->PostTask( - FROM_HERE, base::BindOnce(&ProxyMain::ReportEventLatency, - proxy_main_weak_ptr_, std::move(latencies))); -} - void ProxyImpl::NotifyReadyToCommitOnImpl( CompletionEvent* completion_event, std::unique_ptr<CommitState> commit_state,
diff --git a/cc/trees/proxy_impl.h b/cc/trees/proxy_impl.h index e2a678d..6240406 100644 --- a/cc/trees/proxy_impl.h +++ b/cc/trees/proxy_impl.h
@@ -134,8 +134,6 @@ bool IsInSynchronousComposite() const override; void FrameSinksToThrottleUpdated( const base::flat_set<viz::FrameSinkId>& id) override; - void ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) override; // SchedulerClient implementation bool WillBeginImplFrame(const viz::BeginFrameArgs& args) override;
diff --git a/cc/trees/proxy_main.cc b/cc/trees/proxy_main.cc index 9dadbfa..93607be 100644 --- a/cc/trees/proxy_main.cc +++ b/cc/trees/proxy_main.cc
@@ -442,11 +442,6 @@ first_scroll_timestamp); } -void ProxyMain::ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) { - layer_tree_host_->ReportEventLatency(std::move(latencies)); -} - bool ProxyMain::IsStarted() const { DCHECK(IsMainThread()); return started_;
diff --git a/cc/trees/proxy_main.h b/cc/trees/proxy_main.h index 1f0be86..7b6736ae 100644 --- a/cc/trees/proxy_main.h +++ b/cc/trees/proxy_main.h
@@ -12,7 +12,6 @@ #include "base/time/time.h" #include "cc/cc_export.h" #include "cc/input/browser_controls_state.h" -#include "cc/metrics/event_latency_tracker.h" #include "cc/trees/layer_tree_host.h" #include "cc/trees/paint_holding_reason.h" #include "cc/trees/proxy.h" @@ -72,8 +71,6 @@ void NotifyThroughputTrackerResults(CustomTrackerResults results); void DidObserveFirstScrollDelay(base::TimeDelta first_scroll_delay, base::TimeTicks first_scroll_timestamp); - void ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies); CommitPipelineStage max_requested_pipeline_stage() const { return max_requested_pipeline_stage_;
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc index a2216b7..ffcc223 100644 --- a/cc/trees/single_thread_proxy.cc +++ b/cc/trees/single_thread_proxy.cc
@@ -893,14 +893,6 @@ ->CommitDurationSampleCountForTesting(); // IN-TEST } -void SingleThreadProxy::ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) { - DCHECK(!task_runner_provider_->HasImplThread() || - task_runner_provider_->IsImplThread()); - DebugScopedSetMainThread main(task_runner_provider_); - layer_tree_host_->ReportEventLatency(std::move(latencies)); -} - void SingleThreadProxy::SetRenderFrameObserver( std::unique_ptr<RenderFrameMetadataObserver> observer) { DCHECK(task_runner_provider_->IsMainThread());
diff --git a/cc/trees/single_thread_proxy.h b/cc/trees/single_thread_proxy.h index fef5133..0b0c476 100644 --- a/cc/trees/single_thread_proxy.h +++ b/cc/trees/single_thread_proxy.h
@@ -147,8 +147,6 @@ const base::flat_set<viz::FrameSinkId>& ids) override; void ClearHistory() override; size_t CommitDurationSampleCountForTesting() const override; - void ReportEventLatency( - std::vector<EventLatencyTracker::LatencyData> latencies) override; void RequestNewLayerTreeFrameSink();
diff --git a/chrome/VERSION b/chrome/VERSION index 3a56067c..965c3f1 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=104 MINOR=0 -BUILD=5061 +BUILD=5066 PATCH=0
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinator.java index 70e34fd..a63262a 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/ExploreSurfaceCoordinator.java
@@ -17,6 +17,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.app.feed.FeedActionDelegateImpl; import org.chromium.chrome.browser.bookmarks.BookmarkBridge; +import org.chromium.chrome.browser.feed.FeedReliabilityLogger; import org.chromium.chrome.browser.feed.FeedSurfaceCoordinator; import org.chromium.chrome.browser.feed.FeedSurfaceDelegate; import org.chromium.chrome.browser.feed.FeedSurfaceLifecycleManager; @@ -128,6 +129,10 @@ mFeedSurfaceCoordinator.enableSwipeRefresh(isVisible); } + public FeedReliabilityLogger getFeedReliabilityLogger() { + return mFeedSurfaceCoordinator.getReliabilityLogger(); + } + private class ExploreSurfaceActionDelegate extends FeedActionDelegateImpl { ExploreSurfaceActionDelegate( SnackbarManager snackbarManager, BookmarkBridge bookmarkBridge) {
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java index da574dc..c2a77a3 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java
@@ -42,19 +42,16 @@ /** * An observer that is notified when the start surface internal state, excluding - * the states notified in {@link OverviewModeObserver}, is changed. - * - * TODO(crbug.com/1115757): After crrev.com/c/2315823, Overview state and Startsurface state are - * two different things, let's audit the usage of this observer. + * the states notified in {@link TabSwitcherViewObserver}, is changed. */ interface StateObserver { /** * Called when the internal state is changed. - * @param overviewModeState the {@link StartSurfaceState}. + * @param startSurfaceState the {@link StartSurfaceState}. * @param shouldShowTabSwitcherToolbar Whether or not should show the Tab switcher toolbar. */ void onStateChanged( - @StartSurfaceState int overviewModeState, boolean shouldShowTabSwitcherToolbar); + @StartSurfaceState int startSurfaceState, boolean shouldShowTabSwitcherToolbar); } /** @@ -98,26 +95,26 @@ void initWithNative(); /** - * An observer that is notified when the StartSurface view state changes. + * An observer that is notified when the tab switcher view state changes. */ - interface OverviewModeObserver { + interface TabSwitcherViewObserver { /** - * Called when overview mode starts showing. + * Called when tab switcher starts showing. */ void startedShowing(); /** - * Called when overview mode finishes showing. + * Called when tab switcher finishes showing. */ void finishedShowing(); /** - * Called when overview mode starts hiding. + * Called when tab switcher starts hiding. */ void startedHiding(); /** - * Called when overview mode finishes hiding. + * Called when tab switcher finishes hiding. */ void finishedHiding(); } @@ -127,30 +124,26 @@ */ interface Controller { /** - * @return Whether or not the overview {@link Layout} is visible. + * @param listener Registers {@code listener} for tab switcher status changes. */ - boolean overviewVisible(); + void addTabSwitcherViewObserver(TabSwitcherViewObserver listener); /** - * @param listener Registers {@code listener} for overview mode status changes. + * @param listener Unregisters {@code listener} for tab switcher status changes. */ - void addOverviewModeObserver(OverviewModeObserver listener); + void removeTabSwitcherViewObserver(TabSwitcherViewObserver listener); /** - * @param listener Unregisters {@code listener} for overview mode status changes. - */ - void removeOverviewModeObserver(OverviewModeObserver listener); - - /** - * Hide the overview. + * Hide the tab switcher view. * @param animate Whether we should animate while hiding. */ - void hideOverview(boolean animate); + void hideTabSwitcherView(boolean animate); /** * Show the overview. * @param animate Whether we should animate while showing. */ + // TODO(crbug.com/1315676): Decouple Start surface layout and Grid tab switcher layout. void showOverview(boolean animate); /** @@ -159,7 +152,7 @@ * @param launchOrigin The {@link NewTabPageLaunchOrigin} representing what launched the * start surface. */ - void setOverviewState( + void setStartSurfaceState( @StartSurfaceState int state, @NewTabPageLaunchOrigin int launchOrigin); /** @@ -167,7 +160,7 @@ * NewTabPageLaunchOrigin}. * @param state The {@link StartSurfaceState} to show. */ - void setOverviewState(@StartSurfaceState int state); + void setStartSurfaceState(@StartSurfaceState int state); /** * Called by the TabSwitcherLayout when the system back button is pressed.
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java index 3a36a48e..fd51f36 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -417,7 +417,8 @@ mDynamicResourceLoaderSupplier.get(), mSnackbarManager, mModalDialogManager); } if (mTasksSurface != null) { - mTasksSurface.onFinishNativeInitialization(mActivity, mOmniboxStubSupplier.get()); + mTasksSurface.onFinishNativeInitialization(mActivity, mOmniboxStubSupplier.get(), + mStartSurfaceMediator.getFeedReliabilityLogger()); } if (mIsInitPending) { @@ -427,7 +428,7 @@ if (mIsSecondaryTaskInitPending) { mIsSecondaryTaskInitPending = false; mSecondaryTasksSurface.onFinishNativeInitialization( - mActivity, mOmniboxStubSupplier.get()); + mActivity, mOmniboxStubSupplier.get(), /*feedReliabilityLogger=*/null); mSecondaryTasksSurface.initialize(); } } @@ -634,7 +635,7 @@ mShareDelegateSupplier, mMultiWindowModeStateDispatcher, mContainerView); if (mIsInitializedWithNative) { mSecondaryTasksSurface.onFinishNativeInitialization( - mActivity, mOmniboxStubSupplier.get()); + mActivity, mOmniboxStubSupplier.get(), /*feedReliabilityLogger=*/null); mSecondaryTasksSurface.initialize(); } else { mIsSecondaryTaskInitPending = true;
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java index 5ff5f3c..ddc5216 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java
@@ -39,21 +39,22 @@ /** StartSurfaceDelegate. */ public class StartSurfaceDelegate { /** - * Create the {@link StartSurfaceLayout}. + * Create the {@link TabSwitcherAndStartSurfaceLayout}. * @param context The current Android's context. * @param updateHost The parent {@link LayoutUpdateHost}. * @param renderHost The parent {@link LayoutRenderHost}. * @param startSurface The {@link StartSurface} the layout should own. - * @param startSurfaceScrimAnchor {@link ViewGroup} used by start surface layout to show scrim + * @param tabSwitcherScrimAnchor {@link ViewGroup} used by tab switcher layout to show scrim * when overview is visible. * @param scrimCoordinator {@link ScrimCoordinator} to show/hide scrim. - * @return The {@link StartSurfaceLayout}. + * @return The {@link TabSwitcherAndStartSurfaceLayout}. */ - public static Layout createStartSurfaceLayout(Context context, LayoutUpdateHost updateHost, - LayoutRenderHost renderHost, StartSurface startSurface, JankTracker jankTracker, - ViewGroup startSurfaceScrimAnchor, ScrimCoordinator scrimCoordinator) { - return new StartSurfaceLayout(context, updateHost, renderHost, startSurface, jankTracker, - startSurfaceScrimAnchor, scrimCoordinator); + public static Layout createTabSwitcherAndStartSurfaceLayout(Context context, + LayoutUpdateHost updateHost, LayoutRenderHost renderHost, StartSurface startSurface, + JankTracker jankTracker, ViewGroup tabSwitcherScrimAnchor, + ScrimCoordinator scrimCoordinator) { + return new TabSwitcherAndStartSurfaceLayout(context, updateHost, renderHost, startSurface, + jankTracker, tabSwitcherScrimAnchor, scrimCoordinator); } /**
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java deleted file mode 100644 index a6e98a37..0000000 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java +++ /dev/null
@@ -1,840 +0,0 @@ -// 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. - -package org.chromium.chrome.features.start_surface; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.AnimatorSet; -import android.animation.ObjectAnimator; -import android.content.Context; -import android.graphics.Rect; -import android.graphics.RectF; -import android.os.Handler; -import android.os.SystemClock; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; -import androidx.vectordrawable.graphics.drawable.AnimationUtilsCompat; - -import org.chromium.base.Log; -import org.chromium.base.TraceEvent; -import org.chromium.base.jank_tracker.JankScenario; -import org.chromium.base.jank_tracker.JankTracker; -import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.metrics.RecordUserAction; -import org.chromium.base.supplier.Supplier; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; -import org.chromium.chrome.browser.compositor.layouts.Layout; -import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; -import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; -import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab; -import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; -import org.chromium.chrome.browser.compositor.scene_layer.TabListSceneLayer; -import org.chromium.chrome.browser.layouts.EventFilter; -import org.chromium.chrome.browser.layouts.LayoutType; -import org.chromium.chrome.browser.layouts.animation.CompositorAnimationHandler; -import org.chromium.chrome.browser.layouts.animation.CompositorAnimator; -import org.chromium.chrome.browser.layouts.scene_layer.SceneLayer; -import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tab.TabUtils; -import org.chromium.chrome.browser.tabmodel.TabModelSelector; -import org.chromium.chrome.browser.tasks.ReturnToChromeUtil; -import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher; -import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.TabListDelegate; -import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; -import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; -import org.chromium.chrome.features.tasks.TasksSurface; -import org.chromium.components.browser_ui.widget.animation.Interpolators; -import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; -import org.chromium.components.browser_ui.widget.scrim.ScrimProperties; -import org.chromium.components.version_info.VersionInfo; -import org.chromium.ui.base.DeviceFormFactor; -import org.chromium.ui.modelutil.PropertyModel; -import org.chromium.ui.resources.ResourceManager; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; - -/** - * A {@link Layout} that shows all tabs in one grid or carousel view. - */ -public class StartSurfaceLayout extends Layout { - private static final String TAG = "SSLayout"; - - // Duration of the transition animation - public static final long ZOOMING_DURATION = 300; - private static final int TRANSLATE_DURATION_MS = 500; - private static final int BACKGROUND_FADING_DURATION_MS = 150; - - private static final String TRACE_SHOW_TAB_SWITCHER = "StartSurfaceLayout.Show.TabSwitcher"; - private static final String TRACE_HIDE_TAB_SWITCHER = "StartSurfaceLayout.Hide.TabSwitcher"; - private static final String TRACE_SHOW_START_SURFACE = "StartSurfaceLayout.Show.StartSurface"; - private static final String TRACE_HIDE_START_SURFACE = "StartSurfaceLayout.Hide.StartSurface"; - - // The transition animation from a tab to the tab switcher. - private AnimatorSet mTabToSwitcherAnimation; - private boolean mIsAnimating; - - private TabListSceneLayer mSceneLayer; - private final StartSurface mStartSurface; - private final JankTracker mJankTracker; - private final StartSurface.Controller mController; - private final StartSurface.OverviewModeObserver mStartSurfaceObserver; - @Nullable - private final ViewGroup mScrimAnchor; - @Nullable - private final ScrimCoordinator mScrimCoordinator; - // Always use getGridTabListDelegate() instead to make sure it's not null. - @Nullable - private TabSwitcher.TabListDelegate mGridTabListDelegate; - // Always use getCarouselOrSingleTabListDelegate() instead to make sure it's not null. - @Nullable - private TabSwitcher.TabListDelegate mCarouselOrSingleTabListDelegate; - - // To force Toolbar finishes its animation when this Layout finished hiding. - private final LayoutTab mDummyLayoutTab; - private boolean mIsInitialized; - - private float mBackgroundAlpha; - - private int mFrameCount; - private long mStartTime; - private long mLastFrameTime; - private long mMaxFrameInterval; - private int mStartFrame; - - private boolean mAndroidViewFinishedShowing; - - private Animator mBackgroundTabAnimation; - - interface PerfListener { - void onAnimationDone( - int frameRendered, long elapsedMs, long maxFrameInterval, int dirtySpan); - } - - private PerfListener mPerfListenerForTesting; - - public StartSurfaceLayout(Context context, LayoutUpdateHost updateHost, - LayoutRenderHost renderHost, StartSurface startSurface, JankTracker jankTracker, - ViewGroup startSurfaceScrimAnchor, ScrimCoordinator scrimCoordinator) { - super(context, updateHost, renderHost); - mDummyLayoutTab = createLayoutTab(Tab.INVALID_TAB_ID, false); - mDummyLayoutTab.setShowToolbar(true); - mStartSurface = startSurface; - mStartSurface.setOnTabSelectingListener(this::onTabSelecting); - mController = mStartSurface.getController(); - mJankTracker = jankTracker; - mScrimAnchor = startSurfaceScrimAnchor; - mScrimCoordinator = scrimCoordinator; - - mStartSurfaceObserver = new StartSurface.OverviewModeObserver() { - @Override - public void startedShowing() { - mAndroidViewFinishedShowing = false; - } - - @Override - public void finishedShowing() { - mAndroidViewFinishedShowing = true; - if (!TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(context)) { - doneShowing(); - } - // When Tab-to-GTS animation is done, it's time to renew the thumbnail without - // causing janky frames. When animation is off or not used, the thumbnail is already - // updated when showing the GTS. Tab-to-GTS animation is not invoked for tablet tab - // switcher polish. - if (isTabGtsAnimationEnabled()) { - // Delay thumbnail taking a bit more to make it less likely to happen before the - // thumbnail taking triggered by ThumbnailFetcher. See crbug.com/996385 for - // details. - new Handler().postDelayed(() -> { - Tab currentTab = mTabModelSelector.getCurrentTab(); - if (currentTab != null) mTabContentManager.cacheTabThumbnail(currentTab); - mLayoutTabs = null; - }, ZOOMING_DURATION); - } else { - // crbug.com/1176548, mLayoutTabs is used to capture thumbnail, null it in a - // post delay handler to avoid creating a new pending surface in native, which - // will hold the thumbnail capturing task. - new Handler().postDelayed(() -> { mLayoutTabs = null; }, ZOOMING_DURATION); - } - } - - @Override - public void startedHiding() {} - - @Override - public void finishedHiding() { - // The Android View version of GTS overview is hidden. - // If not doing GTS-to-Tab transition animation or start surface homepage is hiding - // (instead of grid tab switcher), we show the fade-out instead, which was already - // done. - if (!isTabGtsAnimationEnabled() || isHidingStartSurfaceHomepage()) { - postHiding(); - return; - } - // If we are doing GTS-to-Tab transition animation, we start showing the Bitmap - // version of the GTS overview in the background while expanding the thumbnail to - // the viewport. - expandTab(getThumbnailLocationOfCurrentTab()); - } - }; - - mController.addOverviewModeObserver(mStartSurfaceObserver); - } - - @Override - public void onFinishNativeInitialization() { - if (mIsInitialized) return; - - mIsInitialized = true; - mStartSurface.initWithNative(); - ensureSceneLayerCreated(); - mSceneLayer.setTabModelSelector(mTabModelSelector); - } - - // Layout implementation. - @Override - public void setTabModelSelector(TabModelSelector modelSelector, TabContentManager manager) { - super.setTabModelSelector(modelSelector, manager); - if (mSceneLayer != null) { - mSceneLayer.setTabModelSelector(modelSelector); - } - } - - @Override - public LayoutTab getLayoutTab(int id) { - return mDummyLayoutTab; - } - - @Override - public void destroy() { - if (mController != null) { - mController.removeOverviewModeObserver(mStartSurfaceObserver); - } - } - - @Override - public void show(long time, boolean animate) { - boolean isShowingStartSurfaceHomepage = isShowingStartSurfaceHomepage(); - if (isShowingStartSurfaceHomepage) { - showStartSurface(time, animate); - } else { - showTabSwitcher(time, animate); - } - } - - private void showStartSurface(long time, boolean animate) { - try (TraceEvent e = TraceEvent.scoped(TRACE_SHOW_START_SURFACE)) { - show(time, animate, true /*isShowingStartSurfaceHomepage*/); - } - } - private void showTabSwitcher(long time, boolean animate) { - try (TraceEvent e = TraceEvent.scoped(TRACE_SHOW_TAB_SWITCHER)) { - show(time, animate, false /*isShowingStartSurfaceHomepage*/); - } - } - - private void show(long time, boolean animate, boolean isShowingStartSurfaceHomepage) { - super.show(time, animate); - - // When shown on StartSurface jank is tracked under - // JankScenario.START_SURFACE_TAB_SWITCHER and it's started/stopped on - // StartSurfaceMediator. - if (!StartSurfaceConfiguration.isStartSurfaceFlagEnabled()) { - mJankTracker.startTrackingScenario(JankScenario.TAB_SWITCHER); - } - - // Lazy initialization if needed. - mStartSurface.initialize(); - - // Keep the current tab in mLayoutTabs even if we are not going to show the shrinking - // animation so that thumbnail taking is not blocked. - LayoutTab sourceLayoutTab = createLayoutTab( - mTabModelSelector.getCurrentTabId(), mTabModelSelector.isIncognitoSelected()); - sourceLayoutTab.setDecorationAlpha(0); - - mLayoutTabs = new LayoutTab[] {sourceLayoutTab}; - - boolean quick; - // If start surface homepage is showing, carousel or single tab switcher is used. - // Otherwise grid tab switcher is used. - if (isShowingStartSurfaceHomepage) { - quick = getCarouselOrSingleTabListDelegate().prepareOverview(); - } else { - quick = getGridTabListDelegate().prepareOverview(); - } - - // Skip animation when there is no tab in current tab model or If it's showing - // start surface, we don't show the shrink tab animatio. - boolean isCurrentTabModelEmpty = mTabModelSelector.getCurrentModel().getCount() == 0; - animate = animate && !isCurrentTabModelEmpty && !isShowingStartSurfaceHomepage; - - if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) { - showOverviewWithTranslateUp(animate); - } else { - showOverviewWithTabShrink(animate, - () - -> getGridTabListDelegate().getThumbnailLocationOfCurrentTab(false), - isShowingStartSurfaceHomepage, quick); - } - } - - private void showBrowserScrim() { - if (mScrimCoordinator == null) return; - PropertyModel scrimProp = new PropertyModel.Builder(ScrimProperties.REQUIRED_KEYS) - .with(ScrimProperties.ANCHOR_VIEW, mScrimAnchor) - .with(ScrimProperties.SHOW_IN_FRONT_OF_ANCHOR_VIEW, false) - .build(); - mScrimCoordinator.showScrim(scrimProp); - } - - private void hideBrowserScrim() { - if (mScrimCoordinator == null || !mScrimCoordinator.isShowingScrim()) return; - mScrimCoordinator.hideScrim(true); - } - - @Override - protected void updateLayout(long time, long dt) { - ensureSceneLayerCreated(); - super.updateLayout(time, dt); - if (mLayoutTabs == null) return; - - assert mLayoutTabs.length >= 1; - boolean needUpdate = updateSnap(dt, mLayoutTabs[0]); - if (needUpdate) requestUpdate(); - } - - @Override - public void startHiding(int nextId, boolean hintAtTabSelection) { - int startSurfaceState = mController.getStartSurfaceState(); - StartSurfaceUserData.getInstance().setUnusedTabRestoredAtStartup(false); - if (startSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE) { - startHidingStartSurface(nextId, hintAtTabSelection); - } else { - startHidingTabSwitcher(nextId, hintAtTabSelection); - } - } - - private void startHidingStartSurface(int nextId, boolean hintAtTabSelection) { - try (TraceEvent e = TraceEvent.scoped(TRACE_HIDE_START_SURFACE)) { - startHidingImpl(nextId, hintAtTabSelection); - } - } - private void startHidingTabSwitcher(int nextId, boolean hintAtTabSelection) { - try (TraceEvent e = TraceEvent.scoped(TRACE_HIDE_TAB_SWITCHER)) { - startHidingImpl(nextId, hintAtTabSelection); - } - } - - private void startHidingImpl(int nextId, boolean hintAtTabSelection) { - super.startHiding(nextId, hintAtTabSelection); - - int sourceTabId = nextId; - if (sourceTabId == Tab.INVALID_TAB_ID) { - sourceTabId = mTabModelSelector.getCurrentTabId(); - } - - LayoutTab sourceLayoutTab = - createLayoutTab(sourceTabId, mTabModelSelector.isIncognitoSelected()); - sourceLayoutTab.setDecorationAlpha(0); - - List<LayoutTab> layoutTabs = new ArrayList<>(); - layoutTabs.add(sourceLayoutTab); - - if (sourceTabId != mTabModelSelector.getCurrentTabId()) { - // Keep the original tab in mLayoutTabs to unblock thumbnail taking at the end of - // the animation. - LayoutTab originalTab = createLayoutTab( - mTabModelSelector.getCurrentTabId(), mTabModelSelector.isIncognitoSelected()); - originalTab.setScale(0); - originalTab.setDecorationAlpha(0); - layoutTabs.add(originalTab); - } - mLayoutTabs = layoutTabs.toArray(new LayoutTab[0]); - - updateCacheVisibleIds(new LinkedList<>(Arrays.asList(sourceTabId))); - - mIsAnimating = true; - if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) { - translateDown(); - } else { - mController.hideOverview(!isTabGtsAnimationEnabled()); - } - } - - @Override - public void doneHiding() { - try (TraceEvent e = TraceEvent.scoped("StartSurfaceLayout.DoneHiding")) { - super.doneHiding(); - RecordUserAction.record("MobileExitStackView"); - // When shown on StartSurface jank is tracked under - // JankScenario.START_SURFACE_TAB_SWITCHER and it's started/stopped on - // StartSurfaceMediator. - if (!StartSurfaceConfiguration.isStartSurfaceFlagEnabled()) { - mJankTracker.finishTrackingScenario(JankScenario.TAB_SWITCHER); - } - } - } - - @Override - public void doneShowing() { - try (TraceEvent e = TraceEvent.scoped("StartSurfaceLayout.DoneShowing")) { - if (!mAndroidViewFinishedShowing) return; - super.doneShowing(); - } - } - - @Override - public boolean onBackPressed() { - return mController.onBackPressed(); - } - - @Override - protected EventFilter getEventFilter() { - return null; - } - - @Override - protected SceneLayer getSceneLayer() { - return mSceneLayer; - } - - private void ensureSceneLayerCreated() { - if (mSceneLayer != null) return; - mSceneLayer = new TabListSceneLayer(); - } - - @Override - public boolean handlesTabClosing() { - return true; - } - - @Override - public boolean handlesTabCreating() { - return true; - } - - @Override - protected void forceAnimationToFinish() { - super.forceAnimationToFinish(); - if (mTabToSwitcherAnimation != null) { - if (mTabToSwitcherAnimation.isRunning()) { - mTabToSwitcherAnimation.end(); - } - } - } - - @Override - public void onTabCreated(long time, int id, int index, int sourceId, boolean newIsIncognito, - boolean background, float originX, float originY) { - super.onTabCreated(time, id, index, sourceId, newIsIncognito, background, originX, originY); - if (!background || newIsIncognito - || mController.getStartSurfaceState() != StartSurfaceState.SHOWN_HOMEPAGE) { - return; - } - TasksSurface primaryTasksSurface = mStartSurface.getPrimaryTasksSurface(); - assert primaryTasksSurface != null; - - if (mBackgroundTabAnimation != null && mBackgroundTabAnimation.isStarted()) { - mBackgroundTabAnimation.end(); - } - mBackgroundTabAnimation = - BackgroundTabAnimation.create(this, (ViewGroup) primaryTasksSurface.getView(), - originX, originY, getOrientation() == Orientation.PORTRAIT); - mBackgroundTabAnimation.start(); - } - - /** - * Animate shrinking a tab to a target {@link Rect} area. - * @param animate Whether to play an entry animation. - * @param target The target {@link Rect} area. - */ - private void showOverviewWithTabShrink(boolean animate, Supplier<Rect> target, - boolean isShowingStartSurfaceHomepage, boolean quick) { - // Skip shrinking animation when there is no tab in current tab model. If it's showing - // start surface, we don't show the shrink tab animation. - boolean isCurrentTabModelEmpty = mTabModelSelector.getCurrentModel().getCount() == 0; - boolean showShrinkingAnimation = animate && isTabGtsAnimationEnabled() - && !isCurrentTabModelEmpty && !isShowingStartSurfaceHomepage; - - boolean skipSlowZooming = TabUiFeatureUtilities.SKIP_SLOW_ZOOMING.getValue(); - Log.d(TAG, "SkipSlowZooming = " + skipSlowZooming); - if (skipSlowZooming) { - showShrinkingAnimation &= quick; - } - if (TabUiFeatureUtilities.isLaunchPolishEnabled()) { - // Intentionally disable the shrinking animation when accessibility is enabled. - // During the shrinking animation, since the ComponsitorViewHolder is not focusable, - // I think we are in a temporary no "valid" focus target state, so the focus shifts - // to the omnibox and triggers an accessibility announcement of the URL and a - // keyboard hiding event. Disable the animation to avoid this temporary state. - showShrinkingAnimation &= !ChromeAccessibilityUtil.get().isAccessibilityEnabled(); - } - - if (!showShrinkingAnimation || target.get() == null) { - mController.showOverview(animate); - return; - } - - forceAnimationToFinish(); - LayoutTab sourceLayoutTab = mLayoutTabs[0]; - CompositorAnimationHandler handler = getAnimationHandler(); - Collection<Animator> animationList = new ArrayList<>(5); - - // Step 1: zoom out the source tab - Supplier<Float> scaleStartValueSupplier = () -> 1.0f; - Supplier<Float> scaleEndValueSupplier = () -> target.get().width() / (getWidth() * mDpToPx); - - Supplier<Float> xStartValueSupplier = () -> 0f; - Supplier<Float> xEndValueSupplier = () -> target.get().left / mDpToPx; - - Supplier<Float> yStartValueSupplier = () -> 0f; - Supplier<Float> yEndValueSupplier = () -> target.get().top / mDpToPx; - - animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, - LayoutTab.SCALE, scaleStartValueSupplier, scaleEndValueSupplier, ZOOMING_DURATION, - Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); - animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, - LayoutTab.X, xStartValueSupplier, xEndValueSupplier, ZOOMING_DURATION, - Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); - animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, - LayoutTab.Y, yStartValueSupplier, yEndValueSupplier, ZOOMING_DURATION, - Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); - // TODO(crbug.com/964406): when shrinking to the bottom row, bottom of the tab goes up and - // down, making the "create group" visible for a while. - animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, - LayoutTab.MAX_CONTENT_HEIGHT, sourceLayoutTab.getUnclampedOriginalContentHeight(), - TabUiFeatureUtilities.isTabThumbnailAspectRatioNotOne() - ? Math.min(getWidth() / TabUtils.getTabThumbnailAspectRatio(getContext()), - sourceLayoutTab.getUnclampedOriginalContentHeight()) - : getWidth(), - ZOOMING_DURATION, Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); - - CompositorAnimator backgroundAlpha = - CompositorAnimator.ofFloat(handler, 0f, 1f, BACKGROUND_FADING_DURATION_MS, - animator -> mBackgroundAlpha = animator.getAnimatedValue()); - backgroundAlpha.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN_INTERPOLATOR); - animationList.add(backgroundAlpha); - - mTabToSwitcherAnimation = new AnimatorSet(); - mTabToSwitcherAnimation.playTogether(animationList); - mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mTabToSwitcherAnimation = null; - // Step 2: fade in the real GTS RecyclerView. - mController.showOverview(true); - - reportAnimationPerf(true); - } - }); - mStartFrame = mFrameCount; - mStartTime = SystemClock.elapsedRealtime(); - mLastFrameTime = SystemClock.elapsedRealtime(); - mMaxFrameInterval = 0; - mTabToSwitcherAnimation.start(); - } - - /** - * Animate expanding a tab from a source {@link Rect} area. - * @param source The source {@link Rect} area. - */ - private void expandTab(Rect source) { - LayoutTab sourceLayoutTab = mLayoutTabs[0]; - - forceAnimationToFinish(); - CompositorAnimationHandler handler = getAnimationHandler(); - Collection<Animator> animationList = new ArrayList<>(5); - - // Zoom in the source tab - animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, - LayoutTab.SCALE, source.width() / (getWidth() * mDpToPx), 1, ZOOMING_DURATION, - Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); - animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, - LayoutTab.X, source.left / mDpToPx, 0f, ZOOMING_DURATION, - Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); - animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, - LayoutTab.Y, source.top / mDpToPx, 0f, ZOOMING_DURATION, - Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); - // TODO(crbug.com/964406): when shrinking to the bottom row, bottom of the tab goes up and - // down, making the "create group" visible for a while. - animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, - LayoutTab.MAX_CONTENT_HEIGHT, - TabUiFeatureUtilities.isTabThumbnailAspectRatioNotOne() - ? Math.min(getWidth() / TabUtils.getTabThumbnailAspectRatio(getContext()), - sourceLayoutTab.getUnclampedOriginalContentHeight()) - : getWidth(), - sourceLayoutTab.getUnclampedOriginalContentHeight(), ZOOMING_DURATION, - Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); - - CompositorAnimator backgroundAlpha = - CompositorAnimator.ofFloat(handler, 1f, 0f, BACKGROUND_FADING_DURATION_MS, - animator -> mBackgroundAlpha = animator.getAnimatedValue()); - backgroundAlpha.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN_INTERPOLATOR); - animationList.add(backgroundAlpha); - - mTabToSwitcherAnimation = new AnimatorSet(); - mTabToSwitcherAnimation.playTogether(animationList); - mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mTabToSwitcherAnimation = null; - postHiding(); - - reportAnimationPerf(false); - } - }); - mStartFrame = mFrameCount; - mStartTime = SystemClock.elapsedRealtime(); - mLastFrameTime = SystemClock.elapsedRealtime(); - mMaxFrameInterval = 0; - mTabToSwitcherAnimation.start(); - } - - /** - * Animate translating grid tab switcher and its toolbar up. - */ - private void showOverviewWithTranslateUp(boolean animate) { - forceAnimationToFinish(); - showBrowserScrim(); - - Animator translateUp = ObjectAnimator.ofFloat(mController.getTabSwitcherContainer(), - View.TRANSLATION_Y, mController.getTabSwitcherContainer().getHeight(), 0f); - translateUp.setInterpolator(AnimationUtilsCompat.loadInterpolator( - getContext(), R.anim.fast_out_extra_slow_in_interpolator)); - translateUp.setDuration(TRANSLATE_DURATION_MS); - - mTabToSwitcherAnimation = new AnimatorSet(); - mTabToSwitcherAnimation.play(translateUp); - mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - // Skip fade-in for tab switcher view, since it will translate in instead. - mController.getTabSwitcherContainer().setVisibility(View.VISIBLE); - mController.showOverview(false); - mController.setSnackbarParentView(mController.getTabSwitcherContainer()); - } - - @Override - public void onAnimationEnd(Animator animation) { - mTabToSwitcherAnimation = null; - mController.getTabSwitcherContainer().setY(0); - doneShowing(); - - reportTabletAnimationPerf(true); - } - }); - mTabToSwitcherAnimation.start(); - } - - /** - * Animate translating grid tab switcher and its toolbar down off-screen. - */ - private void translateDown() { - forceAnimationToFinish(); - hideBrowserScrim(); - - Animator translateDown = ObjectAnimator.ofFloat(mController.getTabSwitcherContainer(), - View.TRANSLATION_Y, 0f, mController.getTabSwitcherContainer().getHeight()); - translateDown.setInterpolator(AnimationUtilsCompat.loadInterpolator( - getContext(), R.anim.fast_out_extra_slow_in_interpolator)); - translateDown.setDuration(TRANSLATE_DURATION_MS); - - mTabToSwitcherAnimation = new AnimatorSet(); - mTabToSwitcherAnimation.play(translateDown); - mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - mController.setSnackbarParentView(null); - } - - @Override - public void onAnimationEnd(Animator animation) { - mTabToSwitcherAnimation = null; - - // Skip fade-out for tab switcher view, since it will translate out instead. - mController.hideOverview(false); - mController.getTabSwitcherContainer().setVisibility(View.GONE); - - reportTabletAnimationPerf(false); - } - }); - mTabToSwitcherAnimation.start(); - } - - private Rect getThumbnailLocationOfCurrentTab() { - if (isHidingStartSurfaceHomepage()) { - return getCarouselOrSingleTabListDelegate().getThumbnailLocationOfCurrentTab(true); - } else { - return getGridTabListDelegate().getThumbnailLocationOfCurrentTab(true); - } - } - - private TabListDelegate getCarouselOrSingleTabListDelegate() { - if (mCarouselOrSingleTabListDelegate == null) { - mCarouselOrSingleTabListDelegate = mStartSurface.getCarouselOrSingleTabListDelegate(); - } - return mCarouselOrSingleTabListDelegate; - } - - private TabListDelegate getGridTabListDelegate() { - if (mGridTabListDelegate == null) { - mGridTabListDelegate = mStartSurface.getGridTabListDelegate(); - } - return mGridTabListDelegate; - } - - private TabListDelegate getLastUsedTabListDelegate() { - // It is possible that the StartSurfaceState becomes StartSurfaceState.NOT_SHOWN when hiding - // the overview page, thus, the last used TabListDelegate is returned. - if (mController.getStartSurfaceState() == StartSurfaceState.NOT_SHOWN) { - assert mGridTabListDelegate != null || mCarouselOrSingleTabListDelegate != null; - return mGridTabListDelegate != null ? mGridTabListDelegate - : mCarouselOrSingleTabListDelegate; - } - return isShowingStartSurfaceHomepage() ? getCarouselOrSingleTabListDelegate() - : getGridTabListDelegate(); - } - - /** - * @return Whether start surface homepage is showing. - */ - private boolean isShowingStartSurfaceHomepage() { - return mController.isShowingStartSurfaceHomepage(); - } - - private boolean isHidingStartSurfaceHomepage() { - return mController.getPreviousStartSurfaceState() == StartSurfaceState.SHOWN_HOMEPAGE; - } - - private void postHiding() { - if (ReturnToChromeUtil.isStartSurfaceEnabled(getContext())) { - mStartSurface.onHide(); - } else { - getGridTabListDelegate().postHiding(); - } - mIsAnimating = false; - doneHiding(); - } - - @VisibleForTesting - void setPerfListenerForTesting(PerfListener perfListener) { - mPerfListenerForTesting = perfListener; - } - - @VisibleForTesting - public StartSurface getStartSurfaceForTesting() { - return mStartSurface; - } - - private void reportAnimationPerf(boolean isShrinking) { - int frameRendered = mFrameCount - mStartFrame; - long elapsedMs = SystemClock.elapsedRealtime() - mStartTime; - // If it's hiding start surface, TabListDelegate for carousel/single tab switcher should be - // used. - long lastDirty = isHidingStartSurfaceHomepage() - ? getCarouselOrSingleTabListDelegate().getLastDirtyTime() - : getGridTabListDelegate().getLastDirtyTime(); - int dirtySpan = (int) (lastDirty - mStartTime); - float fps = 1000.f * frameRendered / elapsedMs; - String message = String.format(Locale.US, - "fps = %.2f (%d / %dms), maxFrameInterval = %d, dirtySpan = %d", fps, frameRendered, - elapsedMs, mMaxFrameInterval, dirtySpan); - - // TODO(crbug.com/964406): stop logging it after this feature stabilizes. - if (!VersionInfo.isStableBuild()) { - Log.i(TAG, message); - } - - String suffix; - if (isShrinking) { - suffix = ".Shrink"; - } else { - suffix = ".Expand"; - } - - // TODO(crbug.com/982018): Separate histograms for carousel tab switcher. - RecordHistogram.recordCount100Histogram( - "GridTabSwitcher.FramePerSecond" + suffix, (int) fps); - RecordHistogram.recordTimesHistogram( - "GridTabSwitcher.MaxFrameInterval" + suffix, mMaxFrameInterval); - RecordHistogram.recordTimesHistogram("GridTabSwitcher.DirtySpan" + suffix, dirtySpan); - - if (mPerfListenerForTesting != null) { - mPerfListenerForTesting.onAnimationDone( - frameRendered, elapsedMs, mMaxFrameInterval, dirtySpan); - } - } - - private void reportTabletAnimationPerf(boolean translatingUp) { - // TODO(crbug.com/1304926): Record metrics for tablet animations. - } - - @Override - protected void updateSceneLayer(RectF viewport, RectF contentViewport, - TabContentManager tabContentManager, ResourceManager resourceManager, - BrowserControlsStateProvider browserControls) { - ensureSceneLayerCreated(); - super.updateSceneLayer( - viewport, contentViewport, tabContentManager, resourceManager, browserControls); - assert mSceneLayer != null; - TabListDelegate currentTabListDelegate = getLastUsedTabListDelegate(); - - // The content viewport is intentionally sent as both params below. - mSceneLayer.pushLayers(getContext(), contentViewport, contentViewport, this, - tabContentManager, resourceManager, browserControls, - isTabGtsAnimationEnabled() ? currentTabListDelegate.getResourceId() : 0, - mBackgroundAlpha, currentTabListDelegate.getTabListTopOffset()); - mFrameCount++; - if (mLastFrameTime != 0) { - long elapsed = SystemClock.elapsedRealtime() - mLastFrameTime; - mMaxFrameInterval = Math.max(mMaxFrameInterval, elapsed); - } - mLastFrameTime = SystemClock.elapsedRealtime(); - } - - @Override - public int getLayoutType() { - return LayoutType.TAB_SWITCHER; - } - - @Override - public boolean onUpdateAnimation(long time, boolean jumpToEnd) { - return mTabToSwitcherAnimation == null && !mIsAnimating; - } - - @Override - public boolean canHostBeFocusable() { - if (TabUiFeatureUtilities.isLaunchPolishEnabled() - && ChromeAccessibilityUtil.get().isAccessibilityEnabled() - && !DeviceFormFactor.isNonMultiDisplayContextOnTablet(getContext())) { - // We don't allow this layout to gain focus when accessibility is enabled so that the - // CompositorViewHolder doesn't steal focus when entering tab switcher. - // (crbug.com/1125185). - // We ignore this logic on tablets, since it would cause focus to briefly shift to the - // omnibox while entering the tab switcher. This was most notable on the NTP, where the - // virtual keyboard would quickly appear then disappear. (https://crbug.com/1320035). - return false; - } - return super.canHostBeFocusable(); - } - - /** - * Shrink/Expand animation is disabled for Tablet TabSwitcher launch polish. - * @return Whether shrink/expand animation is enabled. - */ - private boolean isTabGtsAnimationEnabled() { - if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) return false; - return TabUiFeatureUtilities.isTabToGtsAnimationEnabled(); - } -}
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java index 306800f..1ec09cf 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -49,6 +49,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.back_press.BackPressManager; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; +import org.chromium.chrome.browser.feed.FeedReliabilityLogger; import org.chromium.chrome.browser.flags.CachedFeatureFlags; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.lens.LensEntryPoint; @@ -71,6 +72,7 @@ import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher; import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.Controller; import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; +import org.chromium.chrome.features.start_surface.StartSurface.TabSwitcherViewObserver; import org.chromium.components.browser_ui.widget.gesture.BackPressHandler; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.prefs.PrefService; @@ -79,7 +81,7 @@ import org.chromium.ui.util.ColorUtils; /** The mediator implements the logic to interact with the surfaces and caller. */ -class StartSurfaceMediator implements StartSurface.Controller, TabSwitcher.OverviewModeObserver, +class StartSurfaceMediator implements StartSurface.Controller, TabSwitcher.TabSwitcherViewObserver, View.OnClickListener, StartSurface.OnTabSelectingListener, BackPressHandler { /** Interface to initialize a secondary tasks surface for more tabs. */ @@ -102,7 +104,7 @@ boolean isFinishingOrDestroyed(); } - private final ObserverList<StartSurface.OverviewModeObserver> mObservers = new ObserverList<>(); + private final ObserverList<TabSwitcherViewObserver> mObservers = new ObserverList<>(); private final TabSwitcher.Controller mController; private final TabModelSelector mTabModelSelector; @Nullable @@ -250,6 +252,17 @@ @Override public void willAddTab(Tab tab, @TabLaunchType int type) { + if (mStartSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE + && type != TabLaunchType.FROM_LONGPRESS_BACKGROUND) { + // Log if the creation of this tab will hide the surface and there is an + // ongoing feed launch. If the tab creation is due to a feed card tap, "card + // tapped" should already have been logged marking the end of the launch. + FeedReliabilityLogger logger = getFeedReliabilityLogger(); + if (logger != null) { + logger.onPageLoadStarted(); + } + } + // When the tab model is empty and a new background tab is added, it is // immediately selected, which normally causes the overview to hide. We // don't want to hide the overview when creating a tab in the background, so @@ -342,7 +355,7 @@ resources.getDimensionPixelSize(R.dimen.tab_switcher_title_top_margin)); } - mController.addOverviewModeObserver(this); + mController.addTabSwitcherViewObserver(this); mPreviousStartSurfaceState = StartSurfaceState.NOT_SHOWN; mStartSurfaceState = StartSurfaceState.NOT_SHOWN; @@ -407,16 +420,11 @@ } // Implements StartSurface.Controller - @Override - public boolean overviewVisible() { - return mController.overviewVisible(); - } - // TODO(crbug.com/1115757): After crrev.com/c/2315823, Overview state and Startsurface state are // two different things, audit the wording usage and see if we can rename this method to // setStartSurfaceState. @Override - public void setOverviewState( + public void setStartSurfaceState( @StartSurfaceState int state, @NewTabPageLaunchOrigin int launchOrigin) { // TODO(crbug.com/1039691): Refactor into state and trigger to separate SHOWING and SHOWN // states. @@ -473,8 +481,8 @@ } @Override - public void setOverviewState(@StartSurfaceState int state) { - setOverviewState(state, mLaunchOrigin); + public void setStartSurfaceState(@StartSurfaceState int state) { + setStartSurfaceState(state, mLaunchOrigin); } private void setLaunchOrigin(@NewTabPageLaunchOrigin int launchOrigin) { @@ -604,18 +612,18 @@ } @Override - public void addOverviewModeObserver(StartSurface.OverviewModeObserver observer) { + public void addTabSwitcherViewObserver(TabSwitcherViewObserver observer) { mObservers.addObserver(observer); } @Override - public void removeOverviewModeObserver(StartSurface.OverviewModeObserver observer) { + public void removeTabSwitcherViewObserver(TabSwitcherViewObserver observer) { mObservers.removeObserver(observer); } @Override - public void hideOverview(boolean animate) { - mController.hideOverview(animate); + public void hideTabSwitcherView(boolean animate) { + mController.hideTabSwitcherView(animate); } @Override @@ -638,7 +646,7 @@ @StartSurfaceState int shownState = computeOverviewStateShown(); assert (isShownState(shownState)); - setOverviewState(shownState); + setStartSurfaceState(shownState); // Make sure ExploreSurfaceCoordinator is built before the explore surface is showing // by default. @@ -646,9 +654,7 @@ && mPropertyModel.get(EXPLORE_SURFACE_COORDINATOR) == null && !mActivityStateChecker.isFinishingOrDestroyed() && mExploreSurfaceCoordinatorFactory != null) { - mPropertyModel.set(EXPLORE_SURFACE_COORDINATOR, - mExploreSurfaceCoordinatorFactory.create(ColorUtils.inNightMode(mContext), - mHasFeedPlaceholderShown, mLaunchOrigin)); + createAndSetExploreSurfaceCoordinator(); } mTabModelSelector.addObserver(mTabModelSelectorObserver); @@ -662,7 +668,7 @@ } } - mController.showOverview(animate); + mController.showTabSwitcherView(animate); } @Override @@ -687,13 +693,20 @@ // Secondary tasks surface is used as the main surface in incognito mode. // If we reached Tab switcher from HomePage, and there isn't any dialog shown, // updates the state, and ChromeTabbedActivity will handle the back button. - setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); return true; } else { return mSecondaryTasksSurfaceController.onBackPressed(isOnHomepage); } } + if (isOnHomepage) { + FeedReliabilityLogger feedReliabilityLogger = getFeedReliabilityLogger(); + if (feedReliabilityLogger != null) { + feedReliabilityLogger.onNavigateBack(); + } + } + return mController.onBackPressed(isOnHomepage); } @@ -753,14 +766,14 @@ // Implements TabSwitcher.OverviewModeObserver. @Override public void startedShowing() { - for (StartSurface.OverviewModeObserver observer : mObservers) { + for (TabSwitcherViewObserver observer : mObservers) { observer.startedShowing(); } } @Override public void finishedShowing() { - for (StartSurface.OverviewModeObserver observer : mObservers) { + for (TabSwitcherViewObserver observer : mObservers) { observer.finishedShowing(); } @@ -792,17 +805,17 @@ if (mBrowserControlsObserver != null) { mBrowserControlsStateProvider.removeObserver(mBrowserControlsObserver); } - setOverviewState(StartSurfaceState.NOT_SHOWN); + setStartSurfaceState(StartSurfaceState.NOT_SHOWN); RecordUserAction.record("StartSurface.Hidden"); } - for (StartSurface.OverviewModeObserver observer : mObservers) { + for (TabSwitcherViewObserver observer : mObservers) { observer.startedHiding(); } } @Override public void finishedHiding() { - for (StartSurface.OverviewModeObserver observer : mObservers) { + for (TabSwitcherViewObserver observer : mObservers) { observer.finishedHiding(); } } @@ -810,6 +823,10 @@ private void destroyExploreSurfaceCoordinator() { ExploreSurfaceCoordinator exploreSurfaceCoordinator = mPropertyModel.get(EXPLORE_SURFACE_COORDINATOR); + FeedReliabilityLogger logger = getFeedReliabilityLogger(); + if (logger != null) { + mOmniboxStub.removeUrlFocusChangeListener(logger); + } if (exploreSurfaceCoordinator != null) exploreSurfaceCoordinator.destroy(); mPropertyModel.set(EXPLORE_SURFACE_COORDINATOR, null); } @@ -828,7 +845,7 @@ } RecordUserAction.record("StartSurface.SinglePane.MoreTabs"); - setOverviewState(StartSurfaceState.SHOWN_TABSWITCHER); + setStartSurfaceState(StartSurfaceState.SHOWN_TABSWITCHER); } // StartSurface.OnTabSelectingListener @@ -872,9 +889,7 @@ if (isVisible && mPropertyModel.get(IS_SHOWING_OVERVIEW) && mPropertyModel.get(EXPLORE_SURFACE_COORDINATOR) == null && !mActivityStateChecker.isFinishingOrDestroyed()) { - mPropertyModel.set(EXPLORE_SURFACE_COORDINATOR, - mExploreSurfaceCoordinatorFactory.create(ColorUtils.inNightMode(mContext), - mHasFeedPlaceholderShown, mLaunchOrigin)); + createAndSetExploreSurfaceCoordinator(); } mPropertyModel.set(IS_EXPLORE_SURFACE_VISIBLE, isVisible); @@ -921,11 +936,11 @@ mSecondaryTasksSurfacePropertyModel.set(IS_INCOGNITO, mIsIncognito); } if (mSecondaryTasksSurfaceController != null && !skipUpdateController) { - mSecondaryTasksSurfaceController.showOverview(/* animate = */ true); + mSecondaryTasksSurfaceController.showTabSwitcherView(/* animate = */ true); } } else { if (mSecondaryTasksSurfaceController != null && !skipUpdateController) { - mSecondaryTasksSurfaceController.hideOverview(/* animate = */ false); + mSecondaryTasksSurfaceController.hideTabSwitcherView(/* animate = */ false); } } mPropertyModel.set(IS_SECONDARY_SURFACE_VISIBLE, isVisible); @@ -1139,4 +1154,22 @@ private int getPixelSize(int id) { return mContext.getResources().getDimensionPixelSize(id); } + + private void createAndSetExploreSurfaceCoordinator() { + ExploreSurfaceCoordinator exploreSurfaceCoordinator = + mExploreSurfaceCoordinatorFactory.create( + ColorUtils.inNightMode(mContext), mHasFeedPlaceholderShown, mLaunchOrigin); + mPropertyModel.set(EXPLORE_SURFACE_COORDINATOR, exploreSurfaceCoordinator); + FeedReliabilityLogger feedReliabilityLogger = + exploreSurfaceCoordinator.getFeedReliabilityLogger(); + if (feedReliabilityLogger != null) { + mOmniboxStub.addUrlFocusChangeListener(feedReliabilityLogger); + } + } + + FeedReliabilityLogger getFeedReliabilityLogger() { + if (mPropertyModel == null) return null; + ExploreSurfaceCoordinator coordinator = mPropertyModel.get(EXPLORE_SURFACE_COORDINATOR); + return coordinator != null ? coordinator.getFeedReliabilityLogger() : null; + } }
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout.java new file mode 100644 index 0000000..62eede9 --- /dev/null +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout.java
@@ -0,0 +1,841 @@ +// 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. + +package org.chromium.chrome.features.start_surface; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.content.Context; +import android.graphics.Rect; +import android.graphics.RectF; +import android.os.Handler; +import android.os.SystemClock; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; +import androidx.vectordrawable.graphics.drawable.AnimationUtilsCompat; + +import org.chromium.base.Log; +import org.chromium.base.TraceEvent; +import org.chromium.base.jank_tracker.JankScenario; +import org.chromium.base.jank_tracker.JankTracker; +import org.chromium.base.metrics.RecordHistogram; +import org.chromium.base.metrics.RecordUserAction; +import org.chromium.base.supplier.Supplier; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; +import org.chromium.chrome.browser.compositor.layouts.Layout; +import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; +import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; +import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab; +import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; +import org.chromium.chrome.browser.compositor.scene_layer.TabListSceneLayer; +import org.chromium.chrome.browser.layouts.EventFilter; +import org.chromium.chrome.browser.layouts.LayoutType; +import org.chromium.chrome.browser.layouts.animation.CompositorAnimationHandler; +import org.chromium.chrome.browser.layouts.animation.CompositorAnimator; +import org.chromium.chrome.browser.layouts.scene_layer.SceneLayer; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TabUtils; +import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tasks.ReturnToChromeUtil; +import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher; +import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.TabListDelegate; +import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; +import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; +import org.chromium.chrome.features.start_surface.StartSurface.TabSwitcherViewObserver; +import org.chromium.chrome.features.tasks.TasksSurface; +import org.chromium.components.browser_ui.widget.animation.Interpolators; +import org.chromium.components.browser_ui.widget.scrim.ScrimCoordinator; +import org.chromium.components.browser_ui.widget.scrim.ScrimProperties; +import org.chromium.components.version_info.VersionInfo; +import org.chromium.ui.base.DeviceFormFactor; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.resources.ResourceManager; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; + +/** + * A {@link Layout} that shows all tabs in one grid or carousel view. + */ +public class TabSwitcherAndStartSurfaceLayout extends Layout { + private static final String TAG = "SSLayout"; + + // Duration of the transition animation + public static final long ZOOMING_DURATION = 300; + private static final int TRANSLATE_DURATION_MS = 500; + private static final int BACKGROUND_FADING_DURATION_MS = 150; + + private static final String TRACE_SHOW_TAB_SWITCHER = "StartSurfaceLayout.Show.TabSwitcher"; + private static final String TRACE_HIDE_TAB_SWITCHER = "StartSurfaceLayout.Hide.TabSwitcher"; + private static final String TRACE_SHOW_START_SURFACE = "StartSurfaceLayout.Show.StartSurface"; + private static final String TRACE_HIDE_START_SURFACE = "StartSurfaceLayout.Hide.StartSurface"; + + // The transition animation from a tab to the tab switcher. + private AnimatorSet mTabToSwitcherAnimation; + private boolean mIsAnimating; + + private TabListSceneLayer mSceneLayer; + private final StartSurface mStartSurface; + private final JankTracker mJankTracker; + private final StartSurface.Controller mController; + private final TabSwitcherViewObserver mTabSwitcherObserver; + @Nullable + private final ViewGroup mScrimAnchor; + @Nullable + private final ScrimCoordinator mScrimCoordinator; + // Always use getGridTabListDelegate() instead to make sure it's not null. + @Nullable + private TabSwitcher.TabListDelegate mGridTabListDelegate; + // Always use getCarouselOrSingleTabListDelegate() instead to make sure it's not null. + @Nullable + private TabSwitcher.TabListDelegate mCarouselOrSingleTabListDelegate; + + // To force Toolbar finishes its animation when this Layout finished hiding. + private final LayoutTab mDummyLayoutTab; + private boolean mIsInitialized; + + private float mBackgroundAlpha; + + private int mFrameCount; + private long mStartTime; + private long mLastFrameTime; + private long mMaxFrameInterval; + private int mStartFrame; + + private boolean mAndroidViewFinishedShowing; + + private Animator mBackgroundTabAnimation; + + interface PerfListener { + void onAnimationDone( + int frameRendered, long elapsedMs, long maxFrameInterval, int dirtySpan); + } + + private PerfListener mPerfListenerForTesting; + + public TabSwitcherAndStartSurfaceLayout(Context context, LayoutUpdateHost updateHost, + LayoutRenderHost renderHost, StartSurface startSurface, JankTracker jankTracker, + ViewGroup tabSwitcherScrimAnchor, ScrimCoordinator scrimCoordinator) { + super(context, updateHost, renderHost); + mDummyLayoutTab = createLayoutTab(Tab.INVALID_TAB_ID, false); + mDummyLayoutTab.setShowToolbar(true); + mStartSurface = startSurface; + mStartSurface.setOnTabSelectingListener(this::onTabSelecting); + mController = mStartSurface.getController(); + mJankTracker = jankTracker; + mScrimAnchor = tabSwitcherScrimAnchor; + mScrimCoordinator = scrimCoordinator; + + mTabSwitcherObserver = new TabSwitcherViewObserver() { + @Override + public void startedShowing() { + mAndroidViewFinishedShowing = false; + } + + @Override + public void finishedShowing() { + mAndroidViewFinishedShowing = true; + if (!TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(context)) { + doneShowing(); + } + // When Tab-to-GTS animation is done, it's time to renew the thumbnail without + // causing janky frames. When animation is off or not used, the thumbnail is already + // updated when showing the GTS. Tab-to-GTS animation is not invoked for tablet tab + // switcher polish. + if (isTabGtsAnimationEnabled()) { + // Delay thumbnail taking a bit more to make it less likely to happen before the + // thumbnail taking triggered by ThumbnailFetcher. See crbug.com/996385 for + // details. + new Handler().postDelayed(() -> { + Tab currentTab = mTabModelSelector.getCurrentTab(); + if (currentTab != null) mTabContentManager.cacheTabThumbnail(currentTab); + mLayoutTabs = null; + }, ZOOMING_DURATION); + } else { + // crbug.com/1176548, mLayoutTabs is used to capture thumbnail, null it in a + // post delay handler to avoid creating a new pending surface in native, which + // will hold the thumbnail capturing task. + new Handler().postDelayed(() -> { mLayoutTabs = null; }, ZOOMING_DURATION); + } + } + + @Override + public void startedHiding() {} + + @Override + public void finishedHiding() { + // The Android View version of GTS overview is hidden. + // If not doing GTS-to-Tab transition animation or start surface homepage is hiding + // (instead of grid tab switcher), we show the fade-out instead, which was already + // done. + if (!isTabGtsAnimationEnabled() || isHidingStartSurfaceHomepage()) { + postHiding(); + return; + } + // If we are doing GTS-to-Tab transition animation, we start showing the Bitmap + // version of the GTS overview in the background while expanding the thumbnail to + // the viewport. + expandTab(getThumbnailLocationOfCurrentTab()); + } + }; + + mController.addTabSwitcherViewObserver(mTabSwitcherObserver); + } + + @Override + public void onFinishNativeInitialization() { + if (mIsInitialized) return; + + mIsInitialized = true; + mStartSurface.initWithNative(); + ensureSceneLayerCreated(); + mSceneLayer.setTabModelSelector(mTabModelSelector); + } + + // Layout implementation. + @Override + public void setTabModelSelector(TabModelSelector modelSelector, TabContentManager manager) { + super.setTabModelSelector(modelSelector, manager); + if (mSceneLayer != null) { + mSceneLayer.setTabModelSelector(modelSelector); + } + } + + @Override + public LayoutTab getLayoutTab(int id) { + return mDummyLayoutTab; + } + + @Override + public void destroy() { + if (mController != null) { + mController.removeTabSwitcherViewObserver(mTabSwitcherObserver); + } + } + + @Override + public void show(long time, boolean animate) { + boolean isShowingStartSurfaceHomepage = isShowingStartSurfaceHomepage(); + if (isShowingStartSurfaceHomepage) { + showStartSurface(time, animate); + } else { + showTabSwitcher(time, animate); + } + } + + private void showStartSurface(long time, boolean animate) { + try (TraceEvent e = TraceEvent.scoped(TRACE_SHOW_START_SURFACE)) { + show(time, animate, true /*isShowingStartSurfaceHomepage*/); + } + } + private void showTabSwitcher(long time, boolean animate) { + try (TraceEvent e = TraceEvent.scoped(TRACE_SHOW_TAB_SWITCHER)) { + show(time, animate, false /*isShowingStartSurfaceHomepage*/); + } + } + + private void show(long time, boolean animate, boolean isShowingStartSurfaceHomepage) { + super.show(time, animate); + + // When shown on StartSurface jank is tracked under + // JankScenario.START_SURFACE_TAB_SWITCHER and it's started/stopped on + // StartSurfaceMediator. + if (!StartSurfaceConfiguration.isStartSurfaceFlagEnabled()) { + mJankTracker.startTrackingScenario(JankScenario.TAB_SWITCHER); + } + + // Lazy initialization if needed. + mStartSurface.initialize(); + + // Keep the current tab in mLayoutTabs even if we are not going to show the shrinking + // animation so that thumbnail taking is not blocked. + LayoutTab sourceLayoutTab = createLayoutTab( + mTabModelSelector.getCurrentTabId(), mTabModelSelector.isIncognitoSelected()); + sourceLayoutTab.setDecorationAlpha(0); + + mLayoutTabs = new LayoutTab[] {sourceLayoutTab}; + + boolean quick; + // If start surface homepage is showing, carousel or single tab switcher is used. + // Otherwise grid tab switcher is used. + if (isShowingStartSurfaceHomepage) { + quick = getCarouselOrSingleTabListDelegate().prepareTabSwitcherView(); + } else { + quick = getGridTabListDelegate().prepareTabSwitcherView(); + } + + // Skip animation when there is no tab in current tab model or If it's showing + // start surface, we don't show the shrink tab animatio. + boolean isCurrentTabModelEmpty = mTabModelSelector.getCurrentModel().getCount() == 0; + animate = animate && !isCurrentTabModelEmpty && !isShowingStartSurfaceHomepage; + + if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) { + showOverviewWithTranslateUp(animate); + } else { + showOverviewWithTabShrink(animate, + () + -> getGridTabListDelegate().getThumbnailLocationOfCurrentTab(false), + isShowingStartSurfaceHomepage, quick); + } + } + + private void showBrowserScrim() { + if (mScrimCoordinator == null) return; + PropertyModel scrimProp = new PropertyModel.Builder(ScrimProperties.REQUIRED_KEYS) + .with(ScrimProperties.ANCHOR_VIEW, mScrimAnchor) + .with(ScrimProperties.SHOW_IN_FRONT_OF_ANCHOR_VIEW, false) + .build(); + mScrimCoordinator.showScrim(scrimProp); + } + + private void hideBrowserScrim() { + if (mScrimCoordinator == null || !mScrimCoordinator.isShowingScrim()) return; + mScrimCoordinator.hideScrim(true); + } + + @Override + protected void updateLayout(long time, long dt) { + ensureSceneLayerCreated(); + super.updateLayout(time, dt); + if (mLayoutTabs == null) return; + + assert mLayoutTabs.length >= 1; + boolean needUpdate = updateSnap(dt, mLayoutTabs[0]); + if (needUpdate) requestUpdate(); + } + + @Override + public void startHiding(int nextId, boolean hintAtTabSelection) { + int startSurfaceState = mController.getStartSurfaceState(); + StartSurfaceUserData.getInstance().setUnusedTabRestoredAtStartup(false); + if (startSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE) { + startHidingStartSurface(nextId, hintAtTabSelection); + } else { + startHidingTabSwitcher(nextId, hintAtTabSelection); + } + } + + private void startHidingStartSurface(int nextId, boolean hintAtTabSelection) { + try (TraceEvent e = TraceEvent.scoped(TRACE_HIDE_START_SURFACE)) { + startHidingImpl(nextId, hintAtTabSelection); + } + } + private void startHidingTabSwitcher(int nextId, boolean hintAtTabSelection) { + try (TraceEvent e = TraceEvent.scoped(TRACE_HIDE_TAB_SWITCHER)) { + startHidingImpl(nextId, hintAtTabSelection); + } + } + + private void startHidingImpl(int nextId, boolean hintAtTabSelection) { + super.startHiding(nextId, hintAtTabSelection); + + int sourceTabId = nextId; + if (sourceTabId == Tab.INVALID_TAB_ID) { + sourceTabId = mTabModelSelector.getCurrentTabId(); + } + + LayoutTab sourceLayoutTab = + createLayoutTab(sourceTabId, mTabModelSelector.isIncognitoSelected()); + sourceLayoutTab.setDecorationAlpha(0); + + List<LayoutTab> layoutTabs = new ArrayList<>(); + layoutTabs.add(sourceLayoutTab); + + if (sourceTabId != mTabModelSelector.getCurrentTabId()) { + // Keep the original tab in mLayoutTabs to unblock thumbnail taking at the end of + // the animation. + LayoutTab originalTab = createLayoutTab( + mTabModelSelector.getCurrentTabId(), mTabModelSelector.isIncognitoSelected()); + originalTab.setScale(0); + originalTab.setDecorationAlpha(0); + layoutTabs.add(originalTab); + } + mLayoutTabs = layoutTabs.toArray(new LayoutTab[0]); + + updateCacheVisibleIds(new LinkedList<>(Arrays.asList(sourceTabId))); + + mIsAnimating = true; + if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) { + translateDown(); + } else { + mController.hideTabSwitcherView(!isTabGtsAnimationEnabled()); + } + } + + @Override + public void doneHiding() { + try (TraceEvent e = TraceEvent.scoped("StartSurfaceLayout.DoneHiding")) { + super.doneHiding(); + RecordUserAction.record("MobileExitStackView"); + // When shown on StartSurface jank is tracked under + // JankScenario.START_SURFACE_TAB_SWITCHER and it's started/stopped on + // StartSurfaceMediator. + if (!StartSurfaceConfiguration.isStartSurfaceFlagEnabled()) { + mJankTracker.finishTrackingScenario(JankScenario.TAB_SWITCHER); + } + } + } + + @Override + public void doneShowing() { + try (TraceEvent e = TraceEvent.scoped("StartSurfaceLayout.DoneShowing")) { + if (!mAndroidViewFinishedShowing) return; + super.doneShowing(); + } + } + + @Override + public boolean onBackPressed() { + return mController.onBackPressed(); + } + + @Override + protected EventFilter getEventFilter() { + return null; + } + + @Override + protected SceneLayer getSceneLayer() { + return mSceneLayer; + } + + private void ensureSceneLayerCreated() { + if (mSceneLayer != null) return; + mSceneLayer = new TabListSceneLayer(); + } + + @Override + public boolean handlesTabClosing() { + return true; + } + + @Override + public boolean handlesTabCreating() { + return true; + } + + @Override + protected void forceAnimationToFinish() { + super.forceAnimationToFinish(); + if (mTabToSwitcherAnimation != null) { + if (mTabToSwitcherAnimation.isRunning()) { + mTabToSwitcherAnimation.end(); + } + } + } + + @Override + public void onTabCreated(long time, int id, int index, int sourceId, boolean newIsIncognito, + boolean background, float originX, float originY) { + super.onTabCreated(time, id, index, sourceId, newIsIncognito, background, originX, originY); + if (!background || newIsIncognito + || mController.getStartSurfaceState() != StartSurfaceState.SHOWN_HOMEPAGE) { + return; + } + TasksSurface primaryTasksSurface = mStartSurface.getPrimaryTasksSurface(); + assert primaryTasksSurface != null; + + if (mBackgroundTabAnimation != null && mBackgroundTabAnimation.isStarted()) { + mBackgroundTabAnimation.end(); + } + mBackgroundTabAnimation = + BackgroundTabAnimation.create(this, (ViewGroup) primaryTasksSurface.getView(), + originX, originY, getOrientation() == Orientation.PORTRAIT); + mBackgroundTabAnimation.start(); + } + + /** + * Animate shrinking a tab to a target {@link Rect} area. + * @param animate Whether to play an entry animation. + * @param target The target {@link Rect} area. + */ + private void showOverviewWithTabShrink(boolean animate, Supplier<Rect> target, + boolean isShowingStartSurfaceHomepage, boolean quick) { + // Skip shrinking animation when there is no tab in current tab model. If it's showing + // start surface, we don't show the shrink tab animation. + boolean isCurrentTabModelEmpty = mTabModelSelector.getCurrentModel().getCount() == 0; + boolean showShrinkingAnimation = animate && isTabGtsAnimationEnabled() + && !isCurrentTabModelEmpty && !isShowingStartSurfaceHomepage; + + boolean skipSlowZooming = TabUiFeatureUtilities.SKIP_SLOW_ZOOMING.getValue(); + Log.d(TAG, "SkipSlowZooming = " + skipSlowZooming); + if (skipSlowZooming) { + showShrinkingAnimation &= quick; + } + if (TabUiFeatureUtilities.isLaunchPolishEnabled()) { + // Intentionally disable the shrinking animation when accessibility is enabled. + // During the shrinking animation, since the ComponsitorViewHolder is not focusable, + // I think we are in a temporary no "valid" focus target state, so the focus shifts + // to the omnibox and triggers an accessibility announcement of the URL and a + // keyboard hiding event. Disable the animation to avoid this temporary state. + showShrinkingAnimation &= !ChromeAccessibilityUtil.get().isAccessibilityEnabled(); + } + + if (!showShrinkingAnimation || target.get() == null) { + mController.showOverview(animate); + return; + } + + forceAnimationToFinish(); + LayoutTab sourceLayoutTab = mLayoutTabs[0]; + CompositorAnimationHandler handler = getAnimationHandler(); + Collection<Animator> animationList = new ArrayList<>(5); + + // Step 1: zoom out the source tab + Supplier<Float> scaleStartValueSupplier = () -> 1.0f; + Supplier<Float> scaleEndValueSupplier = () -> target.get().width() / (getWidth() * mDpToPx); + + Supplier<Float> xStartValueSupplier = () -> 0f; + Supplier<Float> xEndValueSupplier = () -> target.get().left / mDpToPx; + + Supplier<Float> yStartValueSupplier = () -> 0f; + Supplier<Float> yEndValueSupplier = () -> target.get().top / mDpToPx; + + animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, + LayoutTab.SCALE, scaleStartValueSupplier, scaleEndValueSupplier, ZOOMING_DURATION, + Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); + animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, + LayoutTab.X, xStartValueSupplier, xEndValueSupplier, ZOOMING_DURATION, + Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); + animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, + LayoutTab.Y, yStartValueSupplier, yEndValueSupplier, ZOOMING_DURATION, + Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); + // TODO(crbug.com/964406): when shrinking to the bottom row, bottom of the tab goes up and + // down, making the "create group" visible for a while. + animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, + LayoutTab.MAX_CONTENT_HEIGHT, sourceLayoutTab.getUnclampedOriginalContentHeight(), + TabUiFeatureUtilities.isTabThumbnailAspectRatioNotOne() + ? Math.min(getWidth() / TabUtils.getTabThumbnailAspectRatio(getContext()), + sourceLayoutTab.getUnclampedOriginalContentHeight()) + : getWidth(), + ZOOMING_DURATION, Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); + + CompositorAnimator backgroundAlpha = + CompositorAnimator.ofFloat(handler, 0f, 1f, BACKGROUND_FADING_DURATION_MS, + animator -> mBackgroundAlpha = animator.getAnimatedValue()); + backgroundAlpha.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN_INTERPOLATOR); + animationList.add(backgroundAlpha); + + mTabToSwitcherAnimation = new AnimatorSet(); + mTabToSwitcherAnimation.playTogether(animationList); + mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mTabToSwitcherAnimation = null; + // Step 2: fade in the real GTS RecyclerView. + mController.showOverview(true); + + reportAnimationPerf(true); + } + }); + mStartFrame = mFrameCount; + mStartTime = SystemClock.elapsedRealtime(); + mLastFrameTime = SystemClock.elapsedRealtime(); + mMaxFrameInterval = 0; + mTabToSwitcherAnimation.start(); + } + + /** + * Animate expanding a tab from a source {@link Rect} area. + * @param source The source {@link Rect} area. + */ + private void expandTab(Rect source) { + LayoutTab sourceLayoutTab = mLayoutTabs[0]; + + forceAnimationToFinish(); + CompositorAnimationHandler handler = getAnimationHandler(); + Collection<Animator> animationList = new ArrayList<>(5); + + // Zoom in the source tab + animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, + LayoutTab.SCALE, source.width() / (getWidth() * mDpToPx), 1, ZOOMING_DURATION, + Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); + animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, + LayoutTab.X, source.left / mDpToPx, 0f, ZOOMING_DURATION, + Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); + animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, + LayoutTab.Y, source.top / mDpToPx, 0f, ZOOMING_DURATION, + Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); + // TODO(crbug.com/964406): when shrinking to the bottom row, bottom of the tab goes up and + // down, making the "create group" visible for a while. + animationList.add(CompositorAnimator.ofWritableFloatPropertyKey(handler, sourceLayoutTab, + LayoutTab.MAX_CONTENT_HEIGHT, + TabUiFeatureUtilities.isTabThumbnailAspectRatioNotOne() + ? Math.min(getWidth() / TabUtils.getTabThumbnailAspectRatio(getContext()), + sourceLayoutTab.getUnclampedOriginalContentHeight()) + : getWidth(), + sourceLayoutTab.getUnclampedOriginalContentHeight(), ZOOMING_DURATION, + Interpolators.FAST_OUT_SLOW_IN_INTERPOLATOR)); + + CompositorAnimator backgroundAlpha = + CompositorAnimator.ofFloat(handler, 1f, 0f, BACKGROUND_FADING_DURATION_MS, + animator -> mBackgroundAlpha = animator.getAnimatedValue()); + backgroundAlpha.setInterpolator(Interpolators.FAST_OUT_LINEAR_IN_INTERPOLATOR); + animationList.add(backgroundAlpha); + + mTabToSwitcherAnimation = new AnimatorSet(); + mTabToSwitcherAnimation.playTogether(animationList); + mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mTabToSwitcherAnimation = null; + postHiding(); + + reportAnimationPerf(false); + } + }); + mStartFrame = mFrameCount; + mStartTime = SystemClock.elapsedRealtime(); + mLastFrameTime = SystemClock.elapsedRealtime(); + mMaxFrameInterval = 0; + mTabToSwitcherAnimation.start(); + } + + /** + * Animate translating grid tab switcher and its toolbar up. + */ + private void showOverviewWithTranslateUp(boolean animate) { + forceAnimationToFinish(); + showBrowserScrim(); + + Animator translateUp = ObjectAnimator.ofFloat(mController.getTabSwitcherContainer(), + View.TRANSLATION_Y, mController.getTabSwitcherContainer().getHeight(), 0f); + translateUp.setInterpolator(AnimationUtilsCompat.loadInterpolator( + getContext(), R.anim.fast_out_extra_slow_in_interpolator)); + translateUp.setDuration(TRANSLATE_DURATION_MS); + + mTabToSwitcherAnimation = new AnimatorSet(); + mTabToSwitcherAnimation.play(translateUp); + mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + // Skip fade-in for tab switcher view, since it will translate in instead. + mController.getTabSwitcherContainer().setVisibility(View.VISIBLE); + mController.showOverview(false); + mController.setSnackbarParentView(mController.getTabSwitcherContainer()); + } + + @Override + public void onAnimationEnd(Animator animation) { + mTabToSwitcherAnimation = null; + mController.getTabSwitcherContainer().setY(0); + doneShowing(); + + reportTabletAnimationPerf(true); + } + }); + mTabToSwitcherAnimation.start(); + } + + /** + * Animate translating grid tab switcher and its toolbar down off-screen. + */ + private void translateDown() { + forceAnimationToFinish(); + hideBrowserScrim(); + + Animator translateDown = ObjectAnimator.ofFloat(mController.getTabSwitcherContainer(), + View.TRANSLATION_Y, 0f, mController.getTabSwitcherContainer().getHeight()); + translateDown.setInterpolator(AnimationUtilsCompat.loadInterpolator( + getContext(), R.anim.fast_out_extra_slow_in_interpolator)); + translateDown.setDuration(TRANSLATE_DURATION_MS); + + mTabToSwitcherAnimation = new AnimatorSet(); + mTabToSwitcherAnimation.play(translateDown); + mTabToSwitcherAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + mController.setSnackbarParentView(null); + } + + @Override + public void onAnimationEnd(Animator animation) { + mTabToSwitcherAnimation = null; + + // Skip fade-out for tab switcher view, since it will translate out instead. + mController.hideTabSwitcherView(false); + mController.getTabSwitcherContainer().setVisibility(View.GONE); + + reportTabletAnimationPerf(false); + } + }); + mTabToSwitcherAnimation.start(); + } + + private Rect getThumbnailLocationOfCurrentTab() { + if (isHidingStartSurfaceHomepage()) { + return getCarouselOrSingleTabListDelegate().getThumbnailLocationOfCurrentTab(true); + } else { + return getGridTabListDelegate().getThumbnailLocationOfCurrentTab(true); + } + } + + private TabListDelegate getCarouselOrSingleTabListDelegate() { + if (mCarouselOrSingleTabListDelegate == null) { + mCarouselOrSingleTabListDelegate = mStartSurface.getCarouselOrSingleTabListDelegate(); + } + return mCarouselOrSingleTabListDelegate; + } + + private TabListDelegate getGridTabListDelegate() { + if (mGridTabListDelegate == null) { + mGridTabListDelegate = mStartSurface.getGridTabListDelegate(); + } + return mGridTabListDelegate; + } + + private TabListDelegate getLastUsedTabListDelegate() { + // It is possible that the StartSurfaceState becomes StartSurfaceState.NOT_SHOWN when hiding + // the overview page, thus, the last used TabListDelegate is returned. + if (mController.getStartSurfaceState() == StartSurfaceState.NOT_SHOWN) { + assert mGridTabListDelegate != null || mCarouselOrSingleTabListDelegate != null; + return mGridTabListDelegate != null ? mGridTabListDelegate + : mCarouselOrSingleTabListDelegate; + } + return isShowingStartSurfaceHomepage() ? getCarouselOrSingleTabListDelegate() + : getGridTabListDelegate(); + } + + /** + * @return Whether start surface homepage is showing. + */ + private boolean isShowingStartSurfaceHomepage() { + return mController.isShowingStartSurfaceHomepage(); + } + + private boolean isHidingStartSurfaceHomepage() { + return mController.getPreviousStartSurfaceState() == StartSurfaceState.SHOWN_HOMEPAGE; + } + + private void postHiding() { + if (ReturnToChromeUtil.isStartSurfaceEnabled(getContext())) { + mStartSurface.onHide(); + } else { + getGridTabListDelegate().postHiding(); + } + mIsAnimating = false; + doneHiding(); + } + + @VisibleForTesting + void setPerfListenerForTesting(PerfListener perfListener) { + mPerfListenerForTesting = perfListener; + } + + @VisibleForTesting + public StartSurface getStartSurfaceForTesting() { + return mStartSurface; + } + + private void reportAnimationPerf(boolean isShrinking) { + int frameRendered = mFrameCount - mStartFrame; + long elapsedMs = SystemClock.elapsedRealtime() - mStartTime; + // If it's hiding start surface, TabListDelegate for carousel/single tab switcher should be + // used. + long lastDirty = isHidingStartSurfaceHomepage() + ? getCarouselOrSingleTabListDelegate().getLastDirtyTime() + : getGridTabListDelegate().getLastDirtyTime(); + int dirtySpan = (int) (lastDirty - mStartTime); + float fps = 1000.f * frameRendered / elapsedMs; + String message = String.format(Locale.US, + "fps = %.2f (%d / %dms), maxFrameInterval = %d, dirtySpan = %d", fps, frameRendered, + elapsedMs, mMaxFrameInterval, dirtySpan); + + // TODO(crbug.com/964406): stop logging it after this feature stabilizes. + if (!VersionInfo.isStableBuild()) { + Log.i(TAG, message); + } + + String suffix; + if (isShrinking) { + suffix = ".Shrink"; + } else { + suffix = ".Expand"; + } + + // TODO(crbug.com/982018): Separate histograms for carousel tab switcher. + RecordHistogram.recordCount100Histogram( + "GridTabSwitcher.FramePerSecond" + suffix, (int) fps); + RecordHistogram.recordTimesHistogram( + "GridTabSwitcher.MaxFrameInterval" + suffix, mMaxFrameInterval); + RecordHistogram.recordTimesHistogram("GridTabSwitcher.DirtySpan" + suffix, dirtySpan); + + if (mPerfListenerForTesting != null) { + mPerfListenerForTesting.onAnimationDone( + frameRendered, elapsedMs, mMaxFrameInterval, dirtySpan); + } + } + + private void reportTabletAnimationPerf(boolean translatingUp) { + // TODO(crbug.com/1304926): Record metrics for tablet animations. + } + + @Override + protected void updateSceneLayer(RectF viewport, RectF contentViewport, + TabContentManager tabContentManager, ResourceManager resourceManager, + BrowserControlsStateProvider browserControls) { + ensureSceneLayerCreated(); + super.updateSceneLayer( + viewport, contentViewport, tabContentManager, resourceManager, browserControls); + assert mSceneLayer != null; + TabListDelegate currentTabListDelegate = getLastUsedTabListDelegate(); + + // The content viewport is intentionally sent as both params below. + mSceneLayer.pushLayers(getContext(), contentViewport, contentViewport, this, + tabContentManager, resourceManager, browserControls, + isTabGtsAnimationEnabled() ? currentTabListDelegate.getResourceId() : 0, + mBackgroundAlpha, currentTabListDelegate.getTabListTopOffset()); + mFrameCount++; + if (mLastFrameTime != 0) { + long elapsed = SystemClock.elapsedRealtime() - mLastFrameTime; + mMaxFrameInterval = Math.max(mMaxFrameInterval, elapsed); + } + mLastFrameTime = SystemClock.elapsedRealtime(); + } + + @Override + public int getLayoutType() { + return LayoutType.TAB_SWITCHER; + } + + @Override + public boolean onUpdateAnimation(long time, boolean jumpToEnd) { + return mTabToSwitcherAnimation == null && !mIsAnimating; + } + + @Override + public boolean canHostBeFocusable() { + if (TabUiFeatureUtilities.isLaunchPolishEnabled() + && ChromeAccessibilityUtil.get().isAccessibilityEnabled() + && !DeviceFormFactor.isNonMultiDisplayContextOnTablet(getContext())) { + // We don't allow this layout to gain focus when accessibility is enabled so that the + // CompositorViewHolder doesn't steal focus when entering tab switcher. + // (crbug.com/1125185). + // We ignore this logic on tablets, since it would cause focus to briefly shift to the + // omnibox while entering the tab switcher. This was most notable on the NTP, where the + // virtual keyboard would quickly appear then disappear. (https://crbug.com/1320035). + return false; + } + return super.canHostBeFocusable(); + } + + /** + * Shrink/Expand animation is disabled for Tablet TabSwitcher launch polish. + * @return Whether shrink/expand animation is enabled. + */ + private boolean isTabGtsAnimationEnabled() { + if (TabUiFeatureUtilities.isTabletGridTabSwitcherPolishEnabled(getContext())) return false; + return TabUiFeatureUtilities.isTabToGtsAnimationEnabled(); + } +}
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java index 4e9608b..0b82f51 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java
@@ -109,7 +109,7 @@ } @Override - public boolean prepareOverview() { + public boolean prepareTabSwitcherView() { return true; }
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java index 8c8ce494..4ca2998 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java
@@ -38,6 +38,7 @@ import org.chromium.chrome.browser.tasks.tab_management.TabListFaviconProvider; import org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegate.TabSwitcherType; import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher; +import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.TabSwitcherViewObserver; import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; import org.chromium.chrome.features.start_surface.StartSurfaceConfiguration; import org.chromium.chrome.features.start_surface.StartSurfaceUserData; @@ -49,7 +50,7 @@ @VisibleForTesting public static final String SINGLE_TAB_TITLE_AVAILABLE_TIME_UMA = "SingleTabTitleAvailableTime"; - private final ObserverList<TabSwitcher.OverviewModeObserver> mObservers = new ObserverList<>(); + private final ObserverList<TabSwitcherViewObserver> mObservers = new ObserverList<>(); private final TabModelSelector mTabModelSelector; private final PropertyModel mPropertyModel; private final TabListFaviconProvider mTabListFaviconProvider; @@ -172,17 +173,17 @@ } @Override - public void addOverviewModeObserver(TabSwitcher.OverviewModeObserver observer) { + public void addTabSwitcherViewObserver(TabSwitcherViewObserver observer) { mObservers.addObserver(observer); } @Override - public void removeOverviewModeObserver(TabSwitcher.OverviewModeObserver observer) { + public void removeTabSwitcherViewObserver(TabSwitcherViewObserver observer) { mObservers.removeObserver(observer); } @Override - public void hideOverview(boolean animate) { + public void hideTabSwitcherView(boolean animate) { mShouldIgnoreNextSelect = false; mTabModelSelector.getTabModelFilterProvider().removeTabModelFilterObserver( mNormalTabModelObserver); @@ -192,16 +193,16 @@ mPropertyModel.set(FAVICON, mTabListFaviconProvider.getDefaultFaviconDrawable(false)); mPropertyModel.set(TITLE, ""); - for (TabSwitcher.OverviewModeObserver observer : mObservers) { + for (TabSwitcherViewObserver observer : mObservers) { observer.startedHiding(); } - for (TabSwitcher.OverviewModeObserver observer : mObservers) { + for (TabSwitcherViewObserver observer : mObservers) { observer.finishedHiding(); } } @Override - public void showOverview(boolean animate) { + public void showTabSwitcherView(boolean animate) { mSelectedTabDidNotChangedAfterShown = true; mTabModelSelector.addObserver(mTabModelSelectorObserver); @@ -235,10 +236,10 @@ } mPropertyModel.set(IS_VISIBLE, true); - for (TabSwitcher.OverviewModeObserver observer : mObservers) { + for (TabSwitcherViewObserver observer : mObservers) { observer.startedShowing(); } - for (TabSwitcher.OverviewModeObserver observer : mObservers) { + for (TabSwitcherViewObserver observer : mObservers) { observer.finishedShowing(); } }
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurface.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurface.java index e09771a2..84531c0 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurface.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurface.java
@@ -15,6 +15,7 @@ import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.compositor.layouts.Layout; +import org.chromium.chrome.browser.feed.FeedReliabilityLogger; import org.chromium.chrome.browser.omnibox.OmniboxStub; import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher; import org.chromium.chrome.browser.tasks.tab_management.TabSwitcherCustomViewManager; @@ -80,7 +81,8 @@ * Called when the native initialization is completed. Anything to construct a TasksSurface but * require native initialization should be constructed here. */ - void onFinishNativeInitialization(Context context, OmniboxStub omniboxStub); + void onFinishNativeInitialization(Context context, OmniboxStub omniboxStub, + @Nullable FeedReliabilityLogger feedReliabilityLogger); /** * @param onOffsetChangedListener Registers listener for the offset changes of the header view.
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java index 1ba654624..4fcd8b95 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java
@@ -21,6 +21,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; +import org.chromium.chrome.browser.feed.FeedReliabilityLogger; import org.chromium.chrome.browser.feedback.HelpAndFeedbackLauncherImpl; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher; @@ -234,13 +235,14 @@ } @Override - public void onFinishNativeInitialization(Context context, OmniboxStub omniboxStub) { + public void onFinishNativeInitialization(Context context, OmniboxStub omniboxStub, + @Nullable FeedReliabilityLogger feedReliabilityLogger) { if (mTabSwitcher != null) { mTabSwitcher.initWithNative(context, mTabContentManager, mDynamicResourceLoaderSupplier.get(), mSnackbarManager, mModalDialogManager); } - mMediator.initWithNative(omniboxStub); + mMediator.initWithNative(omniboxStub, feedReliabilityLogger); } @Override
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceMediator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceMediator.java index 6ee57c4..0b700d70 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceMediator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceMediator.java
@@ -28,13 +28,14 @@ import androidx.annotation.Nullable; import org.chromium.base.metrics.RecordUserAction; +import org.chromium.chrome.browser.feed.FeedReliabilityLogger; import org.chromium.chrome.browser.lens.LensEntryPoint; import org.chromium.chrome.browser.lens.LensMetrics; import org.chromium.chrome.browser.ntp.IncognitoCookieControlsManager; import org.chromium.chrome.browser.omnibox.OmniboxFocusReason; import org.chromium.chrome.browser.omnibox.OmniboxStub; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; -import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.OverviewModeObserver; +import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.TabSwitcherViewObserver; import org.chromium.components.content_settings.CookieControlsEnforcement; import org.chromium.ui.modelutil.PropertyModel; @@ -43,7 +44,7 @@ /** * Mediator for handling {@link TasksSurface}-related logic. */ -class TasksSurfaceMediator implements OverviewModeObserver { +class TasksSurfaceMediator implements TabSwitcherViewObserver { @Nullable private OmniboxStub mOmniboxStub; private final IncognitoCookieControlsManager mIncognitoCookieControlsManager; @@ -69,7 +70,8 @@ mModel.set(IS_LENS_BUTTON_VISIBLE, false); } - public void initWithNative(OmniboxStub omniboxStub) { + public void initWithNative( + OmniboxStub omniboxStub, @Nullable FeedReliabilityLogger feedReliabilityLogger) { mOmniboxStub = omniboxStub; assert mOmniboxStub != null; @@ -102,6 +104,9 @@ mModel.set(VOICE_SEARCH_BUTTON_CLICK_LISTENER, new View.OnClickListener() { @Override public void onClick(View v) { + if (feedReliabilityLogger != null) { + feedReliabilityLogger.onVoiceSearch(); + } mOmniboxStub.getVoiceRecognitionHandler().startVoiceRecognition( VoiceRecognitionHandler.VoiceInteractionSource.TASKS_SURFACE); RecordUserAction.record("TasksSurface.FakeBox.VoiceSearch");
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java index 3cdcfc0d41..52da6f5 100644 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
@@ -199,7 +199,7 @@ Assert.assertFalse(LibraryLoader.getInstance().isInitialized()); assertThat(cta.getLayoutManager()).isInstanceOf(LayoutManagerChromePhone.class); assertThat(cta.getLayoutManager().getOverviewLayout()) - .isInstanceOf(StartSurfaceLayout.class); + .isInstanceOf(TabSwitcherAndStartSurfaceLayout.class); } @Test @@ -226,7 +226,7 @@ Assert.assertFalse(LibraryLoader.getInstance().isInitialized()); assertThat(cta.getLayoutManager()).isInstanceOf(LayoutManagerChromePhone.class); assertThat(cta.getLayoutManager().getOverviewLayout()) - .isInstanceOf(StartSurfaceLayout.class); + .isInstanceOf(TabSwitcherAndStartSurfaceLayout.class); StartSurfaceCoordinator startSurfaceCoordinator = StartSurfaceTestUtils.getStartSurfaceFromUIThread(cta); @@ -235,7 +235,7 @@ Assert.assertFalse(startSurfaceCoordinator.isSecondaryTaskInitPendingForTesting()); TestThreadUtils.runOnUiThreadBlocking(() -> { - startSurfaceCoordinator.getController().setOverviewState( + startSurfaceCoordinator.getController().setStartSurfaceState( StartSurfaceState.SHOWN_TABSWITCHER); }); CriteriaHelper.pollUiThread(startSurfaceCoordinator::isSecondaryTaskInitPendingForTesting);
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java deleted file mode 100644 index 487262e..0000000 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java +++ /dev/null
@@ -1,443 +0,0 @@ -// 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. - -package org.chromium.chrome.features.start_surface; - -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withParent; - -import static org.hamcrest.Matchers.allOf; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import static org.chromium.base.test.util.CallbackHelper.WAIT_TIMEOUT_SECONDS; -import static org.chromium.base.test.util.CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL; -import static org.chromium.base.test.util.CriteriaHelper.DEFAULT_POLLING_INTERVAL; -import static org.chromium.components.embedder_support.util.UrlConstants.NTP_URL; - -import android.os.Build.VERSION_CODES; -import android.support.test.InstrumentationRegistry; - -import androidx.annotation.Nullable; -import androidx.test.espresso.Espresso; -import androidx.test.espresso.action.ViewActions; -import androidx.test.espresso.contrib.RecyclerViewActions; - -import org.hamcrest.Matchers; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import org.chromium.base.Log; -import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.base.test.util.Criteria; -import org.chromium.base.test.util.CriteriaHelper; -import org.chromium.base.test.util.DisableIf; -import org.chromium.base.test.util.DisabledTest; -import org.chromium.base.test.util.EnormousTest; -import org.chromium.base.test.util.FlakyTest; -import org.chromium.base.test.util.Restriction; -import org.chromium.chrome.browser.compositor.layouts.Layout; -import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; -import org.chromium.chrome.browser.flags.ChromeFeatureList; -import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.layouts.LayoutTestUtils; -import org.chromium.chrome.browser.layouts.LayoutType; -import org.chromium.chrome.browser.layouts.animation.CompositorAnimator; -import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tab.TabSelectionType; -import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; -import org.chromium.chrome.tab_ui.R; -import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.chrome.test.ChromeTabbedActivityTestRule; -import org.chromium.chrome.test.util.ChromeTabUtils; -import org.chromium.chrome.test.util.MenuUtils; -import org.chromium.chrome.test.util.browser.Features; -import org.chromium.content_public.browser.test.util.TestThreadUtils; -import org.chromium.content_public.browser.test.util.WebContentsUtils; -import org.chromium.net.test.EmbeddedTestServer; -import org.chromium.ui.test.util.UiRestriction; - -import java.io.File; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.TimeoutException; - -/** Tests for the {@link StartSurfaceLayout}, mainly for animation performance. */ -@RunWith(ChromeJUnit4ClassRunner.class) -// clang-format off -@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, - "enable-features=" + ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID + "<Study," - + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study", - "force-fieldtrials=Study/Group"}) -@Features.EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID}) -@Restriction( - {UiRestriction.RESTRICTION_TYPE_PHONE, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE}) -public class StartSurfaceLayoutPerfTest { - // clang-format on - private static final String TAG = "SSLayoutPerfTest"; - private static final String BASE_PARAMS = "force-fieldtrial-params=" - + "Study.Group:soft-cleanup-delay/0/cleanup-delay/0/skip-slow-zooming/false" - + "/zooming-min-sdk-version/19/zooming-min-memory-mb/512"; - - /** Flip this to {@code true} to run performance tests locally. */ - private static final boolean PERF_RUN = false; - - @Rule - public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); - - @SuppressWarnings("FieldCanBeLocal") - private EmbeddedTestServer mTestServer; - private StartSurfaceLayout mStartSurfaceLayout; - private String mUrl; - private int mRepeat; - private long mWaitingTime; - private int mTabNumCap; - - @Before - public void setUp() { - mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext()); - mActivityTestRule.startMainActivityFromLauncher(); - - Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(); - assertTrue(layout instanceof StartSurfaceLayout); - mStartSurfaceLayout = (StartSurfaceLayout) layout; - mUrl = mTestServer.getURL("/chrome/test/data/android/navigate/simple.html"); - mRepeat = 1; - mWaitingTime = 0; - mTabNumCap = 3; - - if (PERF_RUN) { - mRepeat = 30; - // Wait before the animation to get more stable results. - mWaitingTime = 1000; - mTabNumCap = 0; - } - assertTrue(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); - - CriteriaHelper.pollUiThread( - mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized); - } - - @Test - @EnormousTest - @CommandLineFlags.Add({BASE_PARAMS}) - public void testTabToGridFromLiveTab() throws InterruptedException { - prepareTabs(1, NTP_URL); - reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab"); - } - - @Test - @EnormousTest - @CommandLineFlags.Add({BASE_PARAMS}) - public void testTabToGridFromLiveTabWith10Tabs() throws InterruptedException { - prepareTabs(10, NTP_URL); - reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 10 tabs"); - } - - @Test - @EnormousTest - @CommandLineFlags.Add({BASE_PARAMS + "/soft-cleanup-delay/10000/cleanup-delay/10000"}) - @DisableIf.Build(message = "Flaky on Android P, see https://crbug.com/1161731", - sdk_is_greater_than = VERSION_CODES.O_MR1, sdk_is_less_than = VERSION_CODES.Q) - public void - testTabToGridFromLiveTabWith10TabsWarm() throws InterruptedException { - prepareTabs(10, NTP_URL); - reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 10 tabs (warm)"); - } - - @Test - @EnormousTest - @CommandLineFlags.Add({BASE_PARAMS + "/cleanup-delay/10000"}) - @DisableIf.Build(message = "Flaky on Android P, see https://crbug.com/1184787", - supported_abis_includes = "x86", sdk_is_greater_than = VERSION_CODES.O_MR1, - sdk_is_less_than = VERSION_CODES.Q) - public void - testTabToGridFromLiveTabWith10TabsSoft() throws InterruptedException { - prepareTabs(10, NTP_URL); - reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 10 tabs (soft)"); - } - - @Test - @EnormousTest - @CommandLineFlags.Add({BASE_PARAMS + "/downsampling-scale/1"}) - @DisableIf.Build(message = "Flaky on Android P, see https://crbug.com/1161731", - sdk_is_greater_than = VERSION_CODES.O_MR1, sdk_is_less_than = VERSION_CODES.Q) - public void - testTabToGridFromLiveTabWith10TabsNoDownsample() throws InterruptedException { - prepareTabs(10, NTP_URL); - reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 10 tabs (no downsample)"); - } - - @Test - @EnormousTest - @CommandLineFlags.Add({BASE_PARAMS + "/max-duty-cycle/1"}) - @DisableIf.Build(message = "Flaky on Android P, see https://crbug.com/1161731", - sdk_is_greater_than = VERSION_CODES.O_MR1, sdk_is_less_than = VERSION_CODES.Q) - public void - testTabToGridFromLiveTabWith10TabsNoRateLimit() throws InterruptedException { - prepareTabs(10, NTP_URL); - reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 10 tabs (no rate-limit)"); - } - - @Test - @EnormousTest - @FlakyTest(message = "https://crbug.com/1045938") - @CommandLineFlags.Add({BASE_PARAMS}) - public void testTabToGridFromLiveTabWith10TabsWithoutThumbnail() throws InterruptedException { - // Note that most of the tabs won't have thumbnails. - prepareTabs(10, null); - reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 10 tabs without thumbnails"); - } - - @Test - @EnormousTest - @CommandLineFlags.Add({BASE_PARAMS}) - @DisabledTest(message = "crbug.com/1048268") - public void testTabToGridFromLiveTabWith100Tabs() throws InterruptedException { - // Skip waiting for loading. Otherwise it would take too long. - // Note that most of the tabs won't have thumbnails. - prepareTabs(100, null); - reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 100 tabs without thumbnails"); - } - - @Test - @EnormousTest - @CommandLineFlags.Add({BASE_PARAMS}) - public void testTabToGridFromNtp() throws InterruptedException { - prepareTabs(1, NTP_URL); - reportTabToGridPerf(NTP_URL, "Tab-to-Grid from NTP"); - } - - /** - * Make Chrome have {@code numTabs} or Tabs with {@code url} loaded. - * @param url The URL to load. Skip loading when null, but the thumbnail for the NTP might not - * be saved. - */ - private void prepareTabs(int numTabs, @Nullable String url) { - assertTrue(numTabs >= 1); - assertEquals(1, mActivityTestRule.getActivity().getTabModelSelector().getTotalTabCount()); - // Only run the full size when doing local perf tests. - if (mTabNumCap > 0) numTabs = Math.min(numTabs, mTabNumCap); - - if (url != null) mActivityTestRule.loadUrl(url); - for (int i = 0; i < numTabs - 1; i++) { - MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), - mActivityTestRule.getActivity(), R.id.new_tab_menu_id); - if (url != null) mActivityTestRule.loadUrl(url); - - Tab previousTab = mActivityTestRule.getActivity() - .getTabModelSelector() - .getCurrentModel() - .getTabAt(i); - - boolean fixPendingReadbacks = mActivityTestRule.getActivity() - .getTabContentManager() - .getPendingReadbacksForTesting() - != 0; - - // When there are pending readbacks due to detached Tabs, try to fix it by switching - // back to that tab. - if (fixPendingReadbacks) { - int lastIndex = i; - // clang-format off - TestThreadUtils.runOnUiThreadBlocking(() -> - mActivityTestRule.getActivity().getCurrentTabModel().setIndex( - lastIndex, TabSelectionType.FROM_USER, false) - ); - // clang-format on - } - checkThumbnailsExist(previousTab); - if (fixPendingReadbacks) { - int currentIndex = i + 1; - // clang-format off - TestThreadUtils.runOnUiThreadBlocking(() -> - mActivityTestRule.getActivity().getCurrentTabModel().setIndex( - currentIndex, TabSelectionType.FROM_USER, false) - ); - // clang-format on - } - } - ChromeTabUtils.waitForTabPageLoaded(mActivityTestRule.getActivity().getActivityTab(), null, - null, WAIT_TIMEOUT_SECONDS * 10); - assertEquals( - numTabs, mActivityTestRule.getActivity().getTabModelSelector().getTotalTabCount()); - - CriteriaHelper.pollUiThread(() -> { - Criteria.checkThat(mActivityTestRule.getActivity() - .getTabContentManager() - .getPendingReadbacksForTesting(), - Matchers.is(0)); - }); - } - - private void reportTabToGridPerf(String fromUrl, String description) - throws InterruptedException { - List<Float> frameRates = new LinkedList<>(); - List<Float> frameInterval = new LinkedList<>(); - List<Float> dirtySpans = new LinkedList<>(); - StartSurfaceLayout.PerfListener collector = - (frameRendered, elapsedMs, maxFrameInterval, dirtySpan) -> { - assertTrue(elapsedMs - >= StartSurfaceLayout.ZOOMING_DURATION * CompositorAnimator.sDurationScale); - float fps = 1000.f * frameRendered / elapsedMs; - frameRates.add(fps); - frameInterval.add((float) maxFrameInterval); - dirtySpans.add((float) dirtySpan); - }; - - mActivityTestRule.loadUrl(fromUrl); - Thread.sleep(mWaitingTime); - - StartSurface startSurface = mStartSurfaceLayout.getStartSurfaceForTesting(); - for (int i = 0; i < mRepeat; i++) { - mStartSurfaceLayout.setPerfListenerForTesting(collector); - Thread.sleep(mWaitingTime); - TestThreadUtils.runOnUiThreadBlocking( - () - -> mActivityTestRule.getActivity().getLayoutManager().showLayout( - LayoutType.TAB_SWITCHER, true)); - final int expectedSize = i + 1; - CriteriaHelper.pollInstrumentationThread(() - -> frameRates.size() == expectedSize, - "Have not got PerfListener callback", DEFAULT_MAX_TIME_TO_POLL * 10, - DEFAULT_POLLING_INTERVAL); - assertTrue(mActivityTestRule.getActivity().getLayoutManager().isLayoutVisible( - LayoutType.TAB_SWITCHER)); - - mStartSurfaceLayout.setPerfListenerForTesting(null); - // Make sure the fading animation is done. - Thread.sleep(1000); - TestThreadUtils.runOnUiThreadBlocking( - () -> { startSurface.getController().onBackPressed(); }); - Thread.sleep(1000); - LayoutTestUtils.waitForLayout( - mActivityTestRule.getActivity().getLayoutManager(), LayoutType.BROWSING); - } - assertEquals(mRepeat, frameRates.size()); - Log.i(TAG, "%s: fps = %.2f, maxFrameInterval = %.0f, dirtySpan = %.0f", description, - median(frameRates), median(frameInterval), median(dirtySpans)); - } - - @Test - @EnormousTest - @CommandLineFlags.Add({BASE_PARAMS}) - @DisableIf.Build(message = "See https://crbug.com/1184787", supported_abis_includes = "x86") - public void testGridToTabToCurrentNTP() throws InterruptedException, TimeoutException { - prepareTabs(1, NTP_URL); - reportGridToTabPerf(false, false, "Grid-to-Tab to current NTP"); - } - - @Test - @EnormousTest - @CommandLineFlags.Add({BASE_PARAMS}) - @DisabledTest(message = "crbug.com/1087608") - public void testGridToTabToOtherNTP() throws InterruptedException, TimeoutException { - prepareTabs(2, NTP_URL); - reportGridToTabPerf(true, false, "Grid-to-Tab to other NTP"); - } - - @Test - @EnormousTest - @CommandLineFlags.Add({BASE_PARAMS}) - @DisabledTest(message = "crbug.com/1087608") - public void testGridToTabToCurrentLive() throws InterruptedException, TimeoutException { - prepareTabs(1, mUrl); - reportGridToTabPerf(false, false, "Grid-to-Tab to current live tab"); - } - - @Test - @EnormousTest - @CommandLineFlags.Add({BASE_PARAMS}) - @FlakyTest(message = "https://crbug.com/1225926") - public void testGridToTabToOtherLive() throws InterruptedException, TimeoutException { - prepareTabs(2, mUrl); - reportGridToTabPerf(true, false, "Grid-to-Tab to other live tab"); - } - - @Test - @EnormousTest - @CommandLineFlags.Add({BASE_PARAMS}) - @DisableIf.Build(message = "Flaky on Android P, see https://crbug.com/1161731", - sdk_is_greater_than = VERSION_CODES.O_MR1, sdk_is_less_than = VERSION_CODES.Q) - public void - testGridToTabToOtherFrozen() throws InterruptedException { - prepareTabs(2, mUrl); - reportGridToTabPerf(true, true, "Grid-to-Tab to other frozen tab"); - } - - private void reportGridToTabPerf(boolean switchToAnotherTab, boolean killBeforeSwitching, - String description) throws InterruptedException { - List<Float> frameRates = new LinkedList<>(); - List<Float> frameInterval = new LinkedList<>(); - StartSurfaceLayout.PerfListener collector = - (frameRendered, elapsedMs, maxFrameInterval, dirtySpan) -> { - assertTrue(elapsedMs - >= StartSurfaceLayout.ZOOMING_DURATION * CompositorAnimator.sDurationScale); - float fps = 1000.f * frameRendered / elapsedMs; - frameRates.add(fps); - frameInterval.add((float) maxFrameInterval); - }; - Thread.sleep(mWaitingTime); - - for (int i = 0; i < mRepeat; i++) { - mStartSurfaceLayout.setPerfListenerForTesting(null); - LayoutTestUtils.startShowingAndWaitForLayout( - mActivityTestRule.getActivity().getLayoutManager(), LayoutType.TAB_SWITCHER, - true); - - int index = mActivityTestRule.getActivity().getCurrentTabModel().index(); - final int targetIndex = switchToAnotherTab ? 1 - index : index; - Tab targetTab = - mActivityTestRule.getActivity().getCurrentTabModel().getTabAt(targetIndex); - if (killBeforeSwitching) { - WebContentsUtils.simulateRendererKilled(targetTab.getWebContents()); - Thread.sleep(1000); - } - - mStartSurfaceLayout.setPerfListenerForTesting(collector); - Thread.sleep(mWaitingTime); - Espresso.onView(allOf(withParent(withId( - org.chromium.chrome.tab_ui.R.id.compositor_view_holder)), - withId(org.chromium.chrome.tab_ui.R.id.tab_list_view))) - .perform(RecyclerViewActions.actionOnItemAtPosition( - targetIndex, ViewActions.click())); - - final int expectedSize = i + 1; - CriteriaHelper.pollInstrumentationThread(() - -> frameRates.size() == expectedSize, - "Have not got PerfListener callback", DEFAULT_MAX_TIME_TO_POLL * 10, - DEFAULT_POLLING_INTERVAL); - LayoutTestUtils.waitForLayout( - mActivityTestRule.getActivity().getLayoutManager(), LayoutType.BROWSING); - Thread.sleep(1000); - } - assertEquals(mRepeat, frameRates.size()); - Log.i(TAG, "%s: fps = %.2f, maxFrameInterval = %.0f", description, median(frameRates), - median(frameInterval)); - } - - private void checkThumbnailsExist(Tab tab) { - File etc1File = TabContentManager.getTabThumbnailFileEtc1(tab); - CriteriaHelper.pollInstrumentationThread(etc1File::exists, - "The thumbnail " + etc1File.getName() + " is not found", - DEFAULT_MAX_TIME_TO_POLL * 10, DEFAULT_POLLING_INTERVAL); - - File jpegFile = TabContentManager.getTabThumbnailFileJpeg(tab.getId()); - CriteriaHelper.pollInstrumentationThread(jpegFile::exists, - "The thumbnail " + jpegFile.getName() + " is not found", - DEFAULT_MAX_TIME_TO_POLL * 10, DEFAULT_POLLING_INTERVAL); - } - - private float median(List<Float> list) { - float[] array = new float[list.size()]; - for (int i = 0; i < array.length; i++) { - array[i] = list.get(i); - } - Arrays.sort(array); - return array[array.length / 2]; - } -}
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java deleted file mode 100644 index 63dcd02..0000000 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java +++ /dev/null
@@ -1,2374 +0,0 @@ -// 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. - -package org.chromium.chrome.features.start_surface; - -import static android.os.Build.VERSION_CODES.O_MR1; - -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; -import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition; -import static androidx.test.espresso.matcher.RootMatchers.withDecorView; -import static androidx.test.espresso.matcher.ViewMatchers.Visibility.GONE; -import static androidx.test.espresso.matcher.ViewMatchers.Visibility.VISIBLE; -import static androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.isEnabled; -import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility; -import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withParent; -import static androidx.test.espresso.matcher.ViewMatchers.withText; - -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.core.AllOf.allOf; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.areAnimatorsEnabled; -import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.closeFirstTabInTabSwitcher; -import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.createTabGroup; -import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.createTabs; -import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.enterTabSwitcher; -import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.finishActivity; -import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.getSwipeToDismissAction; -import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.leaveTabSwitcher; -import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.mergeAllNormalTabsToAGroup; -import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.switchTabModel; -import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.verifyTabModelTabCount; -import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.verifyTabSwitcherCardCount; -import static org.chromium.components.embedder_support.util.UrlConstants.NTP_URL; -import static org.chromium.ui.test.util.ViewUtils.onViewWaiting; -import static org.chromium.ui.test.util.ViewUtils.waitForView; - -import android.content.res.Configuration; -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.os.Build.VERSION_CODES; -import android.support.test.InstrumentationRegistry; -import android.support.test.uiautomator.UiDevice; -import android.view.View; -import android.widget.ImageView; - -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.test.espresso.Espresso; -import androidx.test.espresso.NoMatchingViewException; -import androidx.test.espresso.ViewAssertion; -import androidx.test.espresso.contrib.AccessibilityChecks; -import androidx.test.espresso.contrib.RecyclerViewActions; -import androidx.test.filters.MediumTest; - -import org.hamcrest.Matcher; -import org.hamcrest.Matchers; -import org.junit.After; -import org.junit.Before; -import org.junit.ClassRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import org.chromium.base.Callback; -import org.chromium.base.GarbageCollectionTestUtils; -import org.chromium.base.metrics.RecordHistogram; -import org.chromium.base.test.util.ApplicationTestUtils; -import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.base.test.util.Criteria; -import org.chromium.base.test.util.CriteriaHelper; -import org.chromium.base.test.util.DisableIf; -import org.chromium.base.test.util.DisabledTest; -import org.chromium.base.test.util.Feature; -import org.chromium.base.test.util.FlakyTest; -import org.chromium.base.test.util.MinAndroidSdkLevel; -import org.chromium.base.test.util.Restriction; -import org.chromium.chrome.browser.ChromeTabbedActivity; -import org.chromium.chrome.browser.compositor.layouts.Layout; -import org.chromium.chrome.browser.compositor.layouts.StaticLayout; -import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; -import org.chromium.chrome.browser.flags.CachedFeatureFlags; -import org.chromium.chrome.browser.flags.ChromeFeatureList; -import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.layouts.LayoutTestUtils; -import org.chromium.chrome.browser.layouts.LayoutType; -import org.chromium.chrome.browser.night_mode.ChromeNightModeTestUtils; -import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; -import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tab.TabLaunchType; -import org.chromium.chrome.browser.tab.TabStateExtractor; -import org.chromium.chrome.browser.tabmodel.IncognitoTabHostUtils; -import org.chromium.chrome.browser.tabmodel.TabCreator; -import org.chromium.chrome.browser.tabmodel.TabModel; -import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabModelObserver; -import org.chromium.chrome.browser.tasks.pseudotab.PseudoTab; -import org.chromium.chrome.browser.tasks.pseudotab.TabAttributeCache; -import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; -import org.chromium.chrome.browser.tasks.tab_management.TabProperties; -import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorTestingRobot; -import org.chromium.chrome.browser.tasks.tab_management.TabSuggestionMessageService; -import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher; -import org.chromium.chrome.browser.tasks.tab_management.TabSwitcherCoordinator; -import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; -import org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper; -import org.chromium.chrome.browser.tasks.tab_management.TabUiThemeProvider; -import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; -import org.chromium.chrome.browser.undo_tab_close_snackbar.UndoBarController; -import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; -import org.chromium.chrome.tab_ui.R; -import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.chrome.test.ChromeTabbedActivityTestRule; -import org.chromium.chrome.test.util.ActivityTestUtils; -import org.chromium.chrome.test.util.ChromeRenderTestRule; -import org.chromium.chrome.test.util.ChromeTabUtils; -import org.chromium.chrome.test.util.MenuUtils; -import org.chromium.chrome.test.util.browser.Features; -import org.chromium.chrome.test.util.browser.Features.DisableFeatures; -import org.chromium.chrome.test.util.browser.Features.EnableFeatures; -import org.chromium.components.browser_ui.widget.chips.ChipView; -import org.chromium.components.embedder_support.util.UrlUtilities; -import org.chromium.content_public.browser.LoadUrlParams; -import org.chromium.content_public.browser.test.util.TestThreadUtils; -import org.chromium.content_public.browser.test.util.WebContentsUtils; -import org.chromium.net.test.EmbeddedTestServer; -import org.chromium.ui.base.PageTransition; -import org.chromium.ui.test.util.DisableAnimationsTestRule; -import org.chromium.ui.test.util.UiRestriction; -import org.chromium.ui.util.ColorUtils; -import org.chromium.ui.widget.ChromeImageView; -import org.chromium.ui.widget.ViewLookupCachingFrameLayout; - -import java.io.FileOutputStream; -import java.io.IOException; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; - -// clang-format off -/** Tests for the {@link StartSurfaceLayout} */ -@SuppressWarnings("ConstantConditions") -@RunWith(ChromeJUnit4ClassRunner.class) -@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, - "force-fieldtrials=Study/Group"}) -@EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID + "<Study"}) -@Restriction( - {UiRestriction.RESTRICTION_TYPE_PHONE, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE}) -public class StartSurfaceLayoutTest { - // clang-format on - private static final String BASE_PARAMS = "force-fieldtrial-params=" - + "Study.Group:soft-cleanup-delay/0/cleanup-delay/0/skip-slow-zooming/false" - + "/zooming-min-sdk-version/19/zooming-min-memory-mb/512"; - - // Tests need animation on. - @ClassRule - public static DisableAnimationsTestRule sEnableAnimationsRule = - new DisableAnimationsTestRule(true); - - @Rule - public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); - - @Rule - public ChromeRenderTestRule mRenderTestRule = - ChromeRenderTestRule.Builder.withPublicCorpus() - .setRevision(1) - .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_MOBILE_START) - .build(); - - @SuppressWarnings("FieldCanBeLocal") - private EmbeddedTestServer mTestServer; - private StartSurfaceLayout mStartSurfaceLayout; - private String mUrl; - private int mRepeat; - private List<WeakReference<Bitmap>> mAllBitmaps = new LinkedList<>(); - private Callback<Bitmap> mBitmapListener = - (bitmap) -> mAllBitmaps.add(new WeakReference<>(bitmap)); - private TabSwitcher.TabListDelegate mTabListDelegate; - - @Before - public void setUp() { - AccessibilityChecks.enable(); - mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext()); - // After setUp, Chrome is launched and has one NTP. - mActivityTestRule.startMainActivityFromLauncher(); - - Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(); - assertTrue(layout instanceof StartSurfaceLayout); - mStartSurfaceLayout = (StartSurfaceLayout) layout; - mUrl = mTestServer.getURL("/chrome/test/data/android/navigate/simple.html"); - mRepeat = 1; - - mTabListDelegate = mStartSurfaceLayout.getStartSurfaceForTesting().getGridTabListDelegate(); - mTabListDelegate.setBitmapCallbackForTesting(mBitmapListener); - assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting()); - - mActivityTestRule.getActivity().getTabContentManager().setCaptureMinRequestTimeForTesting( - 0); - - CriteriaHelper.pollUiThread( - mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized); - - assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting()); - } - - @After - public void tearDown() { - ActivityTestUtils.clearActivityOrientation(mActivityTestRule.getActivity()); - TestThreadUtils.runOnUiThreadBlocking( - ChromeNightModeTestUtils::tearDownNightModeAfterChromeActivityDestroyed); - TestThreadUtils.runOnUiThreadBlocking( - () -> ChromeAccessibilityUtil.get().setAccessibilityEnabledForTesting(null)); - } - - @Test - @MediumTest - @Feature({"RenderTest"}) - // clang-format off - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS}) - @DisableIf.Build(message = "Flaky on emulators; see https://crbug.com/1313747", - supported_abis_includes = "x86") - public void testRenderGrid_3WebTabs() throws IOException { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - prepareTabs(3, 0, "about:blank"); - // Make sure all thumbnails are there before switching tabs. - enterGTSWithThumbnailRetry(); - leaveTabSwitcher(cta); - - ChromeTabUtils.switchTabInCurrentTabModel(cta, 0); - enterTabSwitcher(cta); - mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "3_web_tabs"); - } - - @Test - @MediumTest - @Feature({"RenderTest"}) - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS}) - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @DisabledTest(message = "https://crbug.com/1300962") - @DisableIf.Build(sdk_is_greater_than = O_MR1, message = "crbug.com/1077552") - public void testRenderGrid_10WebTabs() throws IOException { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - prepareTabs(10, 0, "about:blank"); - // Make sure all thumbnails are there before switching tabs. - enterGTSWithThumbnailRetry(); - leaveTabSwitcher(cta); - - ChromeTabUtils.switchTabInCurrentTabModel(cta, 0); - enterTabSwitcher(cta); - mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "10_web_tabs"); - } - - @Test - @MediumTest - @Feature({"RenderTest"}) - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS}) - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @DisabledTest(message = "https://crbug.com/1139807") - @DisableIf.Build(sdk_is_greater_than = O_MR1, message = "crbug.com/1077552") - public void testRenderGrid_10WebTabs_InitialScroll() throws IOException { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - prepareTabs(10, 0, "about:blank"); - assertEquals(9, cta.getTabModelSelector().getCurrentModel().index()); - enterGTSWithThumbnailRetry(); - // Make sure the grid tab switcher is scrolled down to show the selected tab. - mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "10_web_tabs-select_last"); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS}) - public void testSwitchTabModel_ScrollToSelectedTab() throws IOException { - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - prepareTabs(10, 0, "about:blank"); - assertEquals(9, cta.getCurrentTabModel().index()); - createTabs(cta, true, 1); - CriteriaHelper.pollUiThread(() -> cta.getCurrentTabModel().isIncognito()); - enterTabSwitcher(cta); - switchTabModel(cta, false); - TabUiTestHelper.verifyAllTabsHaveThumbnail(cta.getCurrentTabModel()); - // Make sure the grid tab switcher is scrolled down to show the selected tab. - onView(tabSwitcherViewMatcher()).check((v, noMatchException) -> { - if (noMatchException != null) throw noMatchException; - assertTrue(v instanceof RecyclerView); - LinearLayoutManager layoutManager = - (LinearLayoutManager) ((RecyclerView) v).getLayoutManager(); - assertEquals(9, layoutManager.findLastVisibleItemPosition()); - }); - } - - @Test - @MediumTest - @Feature({"RenderTest"}) - // clang-format off - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS}) - @DisableIf.Build(message = "Flaky on emulators; see https://crbug.com/1324721 " - + "and crbug.com/1077552", supported_abis_includes = "x86") - public void testRenderGrid_Incognito() throws IOException { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - // Prepare some incognito tabs and enter tab switcher. - prepareTabs(1, 3, "about:blank"); - assertTrue(cta.getCurrentTabModel().isIncognito()); - // Make sure all thumbnails are there before switching tabs. - enterGTSWithThumbnailRetry(); - leaveTabSwitcher(cta); - - ChromeTabUtils.switchTabInCurrentTabModel(cta, 0); - enterTabSwitcher(cta); - mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "3_incognito_web_tabs"); - } - - @Test - @MediumTest - @Feature({"RenderTest"}) - @DisableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION}) - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS}) - @DisableIf.Build(message = "Flaky on emulators; see https://crbug.com/1313747", - supported_abis_includes = "x86") - public void testRenderGrid_3NativeTabs() throws IOException { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - // Prepare some incognito native tabs and enter tab switcher. - // NTP in incognito mode is chosen for its consistency in look, and we don't have to mock - // away the MV tiles, login promo, feed, etc. - prepareTabs(1, 3, null); - assertTrue(cta.getCurrentTabModel().isIncognito()); - // Make sure all thumbnails are there before switching tabs. - enterGTSWithThumbnailRetry(); - leaveTabSwitcher(cta); - // Espresso.pressBack(); - - ChromeTabUtils.switchTabInCurrentTabModel(cta, 0); - enterTabSwitcher(cta); - mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "3_incognito_ntps"); - } - - @Test - @MediumTest - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - @CommandLineFlags.Add({BASE_PARAMS}) - public void testTabToGridFromLiveTab() throws InterruptedException { - assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); - assertEquals(0, mTabListDelegate.getSoftCleanupDelayForTesting()); - assertEquals(0, mTabListDelegate.getCleanupDelayForTesting()); - - prepareTabs(2, 0, NTP_URL); - testTabToGrid(mUrl); - } - - @Test - @MediumTest - @EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study") - @CommandLineFlags.Add({BASE_PARAMS}) - @DisabledTest(message = "crbug.com/991852 This test is flaky") - public void testTabToGridFromLiveTabAnimation() throws InterruptedException { - assertTrue(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); - - prepareTabs(2, 0, NTP_URL); - testTabToGrid(mUrl); - } - - @Test - @MediumTest - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - @CommandLineFlags.Add({BASE_PARAMS + "/soft-cleanup-delay/2000/cleanup-delay/10000"}) - public void testTabToGridFromLiveTabWarm() throws InterruptedException { - assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); - assertEquals(2000, mTabListDelegate.getSoftCleanupDelayForTesting()); - assertEquals(10000, mTabListDelegate.getCleanupDelayForTesting()); - - prepareTabs(2, 0, NTP_URL); - testTabToGrid(mUrl); - } - - @Test - @MediumTest - @EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study") - @CommandLineFlags.Add({BASE_PARAMS + "/soft-cleanup-delay/2000/cleanup-delay/10000"}) - @MinAndroidSdkLevel(Build.VERSION_CODES.M) // TODO(crbug.com/997065#c8): remove SDK restriction. - @DisabledTest(message = "https://crbug.com/1207875") - public void testTabToGridFromLiveTabWarmAnimation() throws InterruptedException { - assertTrue(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); - prepareTabs(2, 0, NTP_URL); - testTabToGrid(mUrl); - } - - @Test - @MediumTest - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - @CommandLineFlags.Add({BASE_PARAMS + "/cleanup-delay/10000"}) - public void testTabToGridFromLiveTabSoft() throws InterruptedException { - assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); - assertEquals(0, mTabListDelegate.getSoftCleanupDelayForTesting()); - assertEquals(10000, mTabListDelegate.getCleanupDelayForTesting()); - - prepareTabs(2, 0, NTP_URL); - testTabToGrid(mUrl); - } - - @Test - @MediumTest - @EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study") - @CommandLineFlags.Add({BASE_PARAMS + "/cleanup-delay/10000"}) - @MinAndroidSdkLevel(Build.VERSION_CODES.M) // TODO(crbug.com/997065#c8): remove SDK restriction. - @DisabledTest(message = "https://crbug.com/1272561") - public void testTabToGridFromLiveTabSoftAnimation() throws InterruptedException { - assertTrue(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); - prepareTabs(2, 0, NTP_URL); - testTabToGrid(mUrl); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS}) - @FlakyTest(message = "crbug.com/1130830") - public void testTabToGridFromNtp() throws InterruptedException { - prepareTabs(2, 0, NTP_URL); - testTabToGrid(NTP_URL); - } - - /** - * Make Chrome have {@code numTabs} of regular Tabs and {@code numIncognitoTabs} of incognito - * tabs with {@code url} loaded, and assert no bitmap fetching occurred. - * - * @param numTabs The number of regular tabs. - * @param numIncognitoTabs The number of incognito tabs. - * @param url The URL to load. - */ - private void prepareTabs(int numTabs, int numIncognitoTabs, @Nullable String url) { - int oldCount = mTabListDelegate.getBitmapFetchCountForTesting(); - TabUiTestHelper.prepareTabsWithThumbnail(mActivityTestRule, numTabs, numIncognitoTabs, url); - assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting() - oldCount); - } - - private void testTabToGrid(String fromUrl) throws InterruptedException { - mActivityTestRule.loadUrl(fromUrl); - - final int initCount = getCaptureCount(); - - for (int i = 0; i < mRepeat; i++) { - enterGTSWithThumbnailChecking(); - leaveGTSAndVerifyThumbnailsAreReleased(); - } - checkFinalCaptureCount(false, initCount); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - public void testGridToTabToCurrentNTP() throws InterruptedException { - prepareTabs(1, 0, NTP_URL); - testGridToTab(false, false); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - public void testGridToTabToOtherNTP() throws InterruptedException { - prepareTabs(2, 0, NTP_URL); - testGridToTab(true, false); - } - - @Test - @MediumTest - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - public void testGridToTabToCurrentLive() throws InterruptedException { - assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); - prepareTabs(1, 0, mUrl); - testGridToTab(false, false); - } - - // From https://stackoverflow.com/a/21505193 - private static boolean isEmulator() { - return Build.FINGERPRINT.startsWith("generic") || Build.FINGERPRINT.startsWith("unknown") - || Build.MODEL.contains("google_sdk") || Build.MODEL.contains("Emulator") - || Build.MODEL.contains("Android SDK built for x86") - || Build.MANUFACTURER.contains("Genymotion") - || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) - || "google_sdk".equals(Build.PRODUCT); - } - - /** - * Test that even if there are tabs with stuck pending thumbnail readback, it doesn't block - * thumbnail readback for the current tab. - */ - @Test - @MediumTest - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - // clang-format off - @DisableIf.Build(message = "Flaky on emulators; see https://crbug.com/1094492", - supported_abis_includes = "x86") - public void testGridToTabToCurrentLiveDetached() throws Exception { - // clang-format on - assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); - // This works on emulators but not on real devices. See crbug.com/986047. - if (!isEmulator()) return; - - for (int i = 0; i < 10; i++) { - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - // Quickly create some tabs, navigate to web pages, and don't wait for thumbnail - // capturing. - mActivityTestRule.loadUrl(mUrl); - ChromeTabUtils.newTabFromMenu( - InstrumentationRegistry.getInstrumentation(), cta, false, false); - mActivityTestRule.loadUrl(mUrl); - // Hopefully we are in a state where some pending readbacks are stuck because their tab - // is not attached to the view. - if (cta.getTabContentManager().getPendingReadbacksForTesting() > 0) { - break; - } - - // Restart Chrome. - // Although we're destroying the activity, the Application will still live on since its - // in the same process as this test. - TestThreadUtils.runOnUiThreadBlocking(() -> cta.getTabModelSelector().closeAllTabs()); - TabUiTestHelper.finishActivity(cta); - mActivityTestRule.startMainActivityOnBlankPage(); - assertEquals(1, mActivityTestRule.tabsCount(false)); - } - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - assertNotEquals(0, cta.getTabContentManager().getPendingReadbacksForTesting()); - assertEquals(1, cta.getCurrentTabModel().index()); - - // The last tab should still get thumbnail even though readbacks for other tabs are stuck. - enterTabSwitcher(cta); - TabUiTestHelper.checkThumbnailsExist(cta.getTabModelSelector().getCurrentTab()); - } - - @Test - @MediumTest - @EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study") - @DisabledTest(message = "crbug.com/993201 This test fails deterministically on Nexus 5X") - public void testGridToTabToCurrentLiveWithAnimation() throws InterruptedException { - assertTrue(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); - prepareTabs(1, 0, mUrl); - testGridToTab(false, false); - } - - @Test - @MediumTest - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - @DisabledTest(message = "crbug.com/1313972") - public void testGridToTabToOtherLive() throws InterruptedException { - assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); - prepareTabs(2, 0, mUrl); - testGridToTab(true, false); - } - - @Test - @MediumTest - @EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study") - @DisabledTest(message = "crbug.com/993201 This test fails deterministically on Nexus 5X") - public void testGridToTabToOtherLiveWithAnimation() throws InterruptedException { - assertTrue(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); - prepareTabs(2, 0, mUrl); - testGridToTab(true, false); - } - - @Test - @MediumTest - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - @DisabledTest(message = "crbug.com/1237623 test is flaky") - public void testGridToTabToOtherFrozen() throws InterruptedException { - assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); - prepareTabs(2, 0, mUrl); - testGridToTab(true, true); - } - - private void testGridToTab(boolean switchToAnotherTab, boolean killBeforeSwitching) - throws InterruptedException { - final int initCount = getCaptureCount(); - - for (int i = 0; i < mRepeat; i++) { - enterGTSWithThumbnailChecking(); - - final int index = mActivityTestRule.getActivity().getCurrentTabModel().index(); - final int targetIndex = switchToAnotherTab ? 1 - index : index; - Tab targetTab = - mActivityTestRule.getActivity().getCurrentTabModel().getTabAt(targetIndex); - if (killBeforeSwitching) { - WebContentsUtils.simulateRendererKilled(targetTab.getWebContents()); - } - - if (switchToAnotherTab) { - waitForCaptureRateControl(); - } - int count = getCaptureCount(); - onView(tabSwitcherViewMatcher()).perform(actionOnItemAtPosition(targetIndex, click())); - CriteriaHelper.pollUiThread(() -> { - boolean doneHiding = - !mActivityTestRule.getActivity().getLayoutManager().isLayoutVisible( - LayoutType.TAB_SWITCHER); - if (!doneHiding) { - // Before overview hiding animation is done, the tab index should not change. - Criteria.checkThat(mActivityTestRule.getActivity().getCurrentTabModel().index(), - Matchers.is(index)); - } - return doneHiding; - }, "Overview not hidden yet"); - int delta; - if (switchToAnotherTab - && !UrlUtilities.isNTPUrl(mActivityTestRule.getActivity() - .getCurrentWebContents() - .getLastCommittedUrl())) { - // Capture the original tab. - delta = 1; - } else { - delta = 0; - } - checkCaptureCount(delta, count); - } - checkFinalCaptureCount(switchToAnotherTab, initCount); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS}) - public void testRestoredTabsDontFetch() throws Exception { - prepareTabs(2, 0, mUrl); - int oldCount = mTabListDelegate.getBitmapFetchCountForTesting(); - - // Restart Chrome. - // Although we're destroying the activity, the Application will still live on since its in - // the same process as this test. - TabUiTestHelper.finishActivity(mActivityTestRule.getActivity()); - mActivityTestRule.startMainActivityOnBlankPage(); - assertEquals(3, mActivityTestRule.tabsCount(false)); - - Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(); - assertTrue(layout instanceof StartSurfaceLayout); - mStartSurfaceLayout = (StartSurfaceLayout) layout; - assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting() - oldCount); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS}) - public void testInvisibleTabsDontFetch() throws InterruptedException { - // Open a few new tabs. - final int count = mTabListDelegate.getBitmapFetchCountForTesting(); - for (int i = 0; i < 3; i++) { - MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), - mActivityTestRule.getActivity(), org.chromium.chrome.R.id.new_tab_menu_id); - } - // Fetching might not happen instantly. - Thread.sleep(1000); - - // No fetching should happen. - assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting() - count); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/soft-cleanup-delay/2000/cleanup-delay/10000"}) - @FlakyTest(message = "crbug.com/1130830") - public void testInvisibleTabsDontFetchWarm() throws InterruptedException { - // Get the GTS in the warm state. - prepareTabs(2, 0, NTP_URL); - testTabToGrid(NTP_URL); - - Thread.sleep(1000); - - // Open a few new tabs. - final int count = mTabListDelegate.getBitmapFetchCountForTesting(); - for (int i = 0; i < 3; i++) { - MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), - mActivityTestRule.getActivity(), org.chromium.chrome.R.id.new_tab_menu_id); - } - // Fetching might not happen instantly. - Thread.sleep(1000); - - // No fetching should happen. - assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting() - count); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/cleanup-delay/10000"}) - @FlakyTest(message = "crbug.com/1130830") - public void testInvisibleTabsDontFetchSoft() throws InterruptedException { - // Get the GTS in the soft cleaned up state. - prepareTabs(2, 0, NTP_URL); - testTabToGrid(NTP_URL); - - Thread.sleep(1000); - - // Open a few new tabs. - final int count = mTabListDelegate.getBitmapFetchCountForTesting(); - for (int i = 0; i < 3; i++) { - MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), - mActivityTestRule.getActivity(), org.chromium.chrome.R.id.new_tab_menu_id); - } - // Fetching might not happen instantly. - Thread.sleep(1000); - - // No fetching should happen. - assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting() - count); - } - - @Test - @MediumTest - // clang-format off - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS}) - @DisabledTest(message = "http://crbug/1005865 - Test was previously flaky but only on bots." - + "Was not locally reproducible. Disabling until verified that it's deflaked on bots.") - public void testIncognitoEnterGts() throws InterruptedException { - // clang-format on - prepareTabs(1, 1, null); - enterGTSWithThumbnailChecking(); - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); - - onView(tabSwitcherViewMatcher()).perform(actionOnItemAtPosition(0, click())); - LayoutTestUtils.waitForLayout( - mActivityTestRule.getActivity().getLayoutManager(), LayoutType.BROWSING); - - enterGTSWithThumbnailChecking(); - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS}) - // clang-format off - @DisableIf.Build(message = "Flaky on Android P, see https://crbug.com/1063991", - sdk_is_greater_than = VERSION_CODES.O_MR1, sdk_is_less_than = VERSION_CODES.Q) - public void testIncognitoToggle_tabCount() { - // clang-format on - mActivityTestRule.loadUrl(mUrl); - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - - // Prepare two incognito tabs and enter tab switcher. - createTabs(cta, true, 2); - enterTabSwitcher(cta); - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(2)); - - for (int i = 0; i < mRepeat; i++) { - switchTabModel(cta, false); - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); - - switchTabModel(cta, true); - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(2)); - } - leaveGTSAndVerifyThumbnailsAreReleased(); - } - - @Test - @MediumTest - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS}) - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @DisabledTest(message = "https://crbug.com/1233169") - public void testIncognitoToggle_thumbnailFetchCount() throws InterruptedException { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - int oldFetchCount = mTabListDelegate.getBitmapFetchCountForTesting(); - - // Prepare two incognito tabs and enter tab switcher. - prepareTabs(1, 2, mUrl); - enterGTSWithThumbnailChecking(); - - int currentFetchCount = mTabListDelegate.getBitmapFetchCountForTesting(); - assertEquals(2, currentFetchCount - oldFetchCount); - oldFetchCount = currentFetchCount; - int oldHistogramRecord = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_JPEG); - - for (int i = 0; i < mRepeat; i++) { - switchTabModel(cta, false); - currentFetchCount = mTabListDelegate.getBitmapFetchCountForTesting(); - int currentHistogramRecord = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_JPEG); - assertEquals(1, currentFetchCount - oldFetchCount); - assertEquals(1, currentHistogramRecord - oldHistogramRecord); - oldFetchCount = currentFetchCount; - oldHistogramRecord = currentHistogramRecord; - - switchTabModel(cta, true); - currentFetchCount = mTabListDelegate.getBitmapFetchCountForTesting(); - currentHistogramRecord = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_JPEG); - assertEquals(2, currentFetchCount - oldFetchCount); - assertEquals(2, currentHistogramRecord - oldHistogramRecord); - oldFetchCount = currentFetchCount; - oldHistogramRecord = currentHistogramRecord; - } - leaveGTSAndVerifyThumbnailsAreReleased(); - } - - @Test - @MediumTest - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS}) - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID, - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - public void testUrlUpdatedNotCrashing_ForUndoableClosedTab() throws Exception { - // clang-format on - mActivityTestRule.getActivity().getSnackbarManager().disableForTesting(); - prepareTabs(2, 0, null); - enterGTSWithThumbnailChecking(); - - Tab tab = mActivityTestRule.getActivity().getTabModelSelector().getCurrentTab(); - TestThreadUtils.runOnUiThreadBlocking(() -> { - mActivityTestRule.getActivity().getTabModelSelector().getCurrentModel().closeTab( - tab, false, false, true); - }); - mActivityTestRule.loadUrlInTab( - mUrl, PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR, tab); - } - - @Test - @MediumTest - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS}) - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID, - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - public void testUrlUpdatedNotCrashing_ForTabNotInCurrentModel() throws Exception { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - prepareTabs(1, 1, null); - enterGTSWithThumbnailChecking(); - - Tab tab = cta.getTabModelSelector().getCurrentTab(); - switchTabModel(cta, false); - - mActivityTestRule.loadUrlInTab( - mUrl, PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR, tab); - } - - private int getTabCountInCurrentTabModel() { - return mActivityTestRule.getActivity().getTabModelSelector().getCurrentModel().getCount(); - } - - @Test - @MediumTest - @Feature("TabSuggestion") - // clang-format off - @EnableFeatures({ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study", - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + - "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0/" - + "thumbnail_aspect_ratio/1.0"}) - public void testTabSuggestionMessageCard_dismiss() throws InterruptedException { - // clang-format on - prepareTabs(3, 0, null); - - // TODO(meiliang): Avoid using static variable for tracking state, - // TabSuggestionMessageService.isSuggestionAvailableForTesting(). Instead, we can add a - // dummy MessageObserver to track the availability of the suggestions. - CriteriaHelper.pollUiThread(TabSuggestionMessageService::isSuggestionAvailableForTesting); - CriteriaHelper.pollUiThread( - () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(3))); - - enterGTSWithThumbnailChecking(); - - // TODO(meiliang): Avoid using static variable for tracking state, - // TabSwitcherCoordinator::hasAppendedMessagesForTesting. Instead, we can query the number - // of items that the inner model of the TabSwitcher has. - CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); - onView(withId(R.id.tab_grid_message_item)).check(matches(isDisplayed())); - onView(allOf(withId(R.id.close_button), withParent(withId(R.id.tab_grid_message_item)))) - .perform(click()); - onView(withId(R.id.tab_grid_message_item)).check(doesNotExist()); - } - - @Test - @MediumTest - @Feature("TabSuggestion") - // clang-format off - @EnableFeatures({ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study", - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + - "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0" - + "/thumbnail_aspect_ratio/1.0"}) - public void testTabSuggestionMessageCard_review() throws InterruptedException { - // clang-format on - prepareTabs(3, 0, null); - - CriteriaHelper.pollUiThread(TabSuggestionMessageService::isSuggestionAvailableForTesting); - CriteriaHelper.pollUiThread( - () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(3))); - - enterGTSWithThumbnailChecking(); - - CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); - onView(withId(R.id.tab_grid_message_item)).check(matches(isDisplayed())); - onView(allOf(withId(R.id.action_button), withParent(withId(R.id.tab_grid_message_item)))) - .perform(click()); - - TabSelectionEditorTestingRobot tabSelectionEditorTestingRobot = - new TabSelectionEditorTestingRobot(); - tabSelectionEditorTestingRobot.resultRobot.verifyTabSelectionEditorIsVisible(); - - Espresso.pressBack(); - tabSelectionEditorTestingRobot.resultRobot.verifyTabSelectionEditorIsHidden(); - } - - @Test - @MediumTest - @Feature("TabSuggestion") - @DisabledTest(message = "https://crbug.com/1230107, crbug.com/1130621") - // clang-format off - @EnableFeatures({ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study", - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + - "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0/" - + "thumbnail_aspect_ratio/1.0"}) - public void testShowOnlyOneTabSuggestionMessageCard_withSoftCleanup() - throws InterruptedException { - // clang-format on - verifyOnlyOneTabSuggestionMessageCardIsShowing(); - } - - @Test - @MediumTest - @Feature("TabSuggestion") - // clang-format off - @EnableFeatures({ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study", - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + - "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0/" - + "thumbnail_aspect_ratio/1.0"}) - @DisabledTest(message = "https://crbug.com/1198484, crbug.com/1130621") - public void testShowOnlyOneTabSuggestionMessageCard_withHardCleanup() - throws InterruptedException { - // clang-format on - verifyOnlyOneTabSuggestionMessageCardIsShowing(); - } - - @Test - @MediumTest - @Feature("TabSuggestion") - // clang-format off - @EnableFeatures({ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study", - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + - "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0/" - + "thumbnail_aspect_ratio/1.0"}) - @DisabledTest(message = "https://crbug.com/1311825") - public void testTabSuggestionMessageCardDismissAfterTabClosing() throws InterruptedException { - // clang-format on - prepareTabs(3, 0, mUrl); - CriteriaHelper.pollUiThread(TabSuggestionMessageService::isSuggestionAvailableForTesting); - CriteriaHelper.pollUiThread( - () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(3))); - - enterGTSWithThumbnailChecking(); - CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); - onView(withId(R.id.tab_grid_message_item)).check(matches(isDisplayed())); - - closeFirstTabInTabSwitcher(); - - CriteriaHelper.pollUiThread( - () -> !TabSuggestionMessageService.isSuggestionAvailableForTesting()); - CriteriaHelper.pollUiThread( - () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(2))); - - onView(tabSwitcherViewMatcher()) - .check(TabUiTestHelper.ChildrenCountAssertion.havingTabSuggestionMessageCardCount( - 0)); - onView(withId(R.id.tab_grid_message_item)).check(doesNotExist()); - } - - @Test - @MediumTest - @Feature("TabSuggestion") - // clang-format off - @EnableFeatures({ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study", - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + - "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0/" - + "thumbnail_aspect_ratio/1.0"}) - public void testTabSuggestionMessageCard_orientation() throws InterruptedException { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - prepareTabs(3, 0, null); - - CriteriaHelper.pollUiThread(TabSuggestionMessageService::isSuggestionAvailableForTesting); - CriteriaHelper.pollUiThread( - () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(3))); - - enterGTSWithThumbnailChecking(); - CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); - - // Force portrait mode since the device can be wrongly in landscape. See crbug/1063639. - ActivityTestUtils.rotateActivityToOrientation(cta, Configuration.ORIENTATION_PORTRAIT); - - onView(tabSwitcherViewMatcher()) - .check(MessageCardWidthAssertion.checkMessageItemSpanSize(3, 2)); - - ActivityTestUtils.rotateActivityToOrientation(cta, Configuration.ORIENTATION_LANDSCAPE); - - onView(tabSwitcherViewMatcher()) - .check(MessageCardWidthAssertion.checkMessageItemSpanSize(3, 3)); - } - - private static class MessageCardWidthAssertion implements ViewAssertion { - private int mIndex; - private int mSpanCount; - - public static MessageCardWidthAssertion checkMessageItemSpanSize(int index, int spanCount) { - return new MessageCardWidthAssertion(index, spanCount); - } - - public MessageCardWidthAssertion(int index, int spanCount) { - mIndex = index; - mSpanCount = spanCount; - } - - @Override - public void check(View view, NoMatchingViewException noMatchException) { - if (noMatchException != null) throw noMatchException; - float tabListPadding = - TabUiThemeProvider.getTabGridCardMarginForDialogAnimation(view.getContext()); - float messageCardMargin = - TabUiThemeProvider.getMessageCardMarginDimension(view.getContext()); - - assertTrue(view instanceof RecyclerView); - RecyclerView recyclerView = (RecyclerView) view; - GridLayoutManager layoutManager = (GridLayoutManager) recyclerView.getLayoutManager(); - assertEquals(mSpanCount, layoutManager.getSpanCount()); - - RecyclerView.ViewHolder messageItemViewHolder = - recyclerView.findViewHolderForAdapterPosition(mIndex); - assertNotNull(messageItemViewHolder); - assertEquals(TabProperties.UiType.MESSAGE, messageItemViewHolder.getItemViewType()); - View messageItemView = messageItemViewHolder.itemView; - - // The message card item width should always be recyclerView width minus padding and - // margin. - assertEquals(recyclerView.getWidth() - 2 * tabListPadding - 2 * messageCardMargin, - (float) messageItemView.getWidth(), 1.0f); - } - } - - @Test - @MediumTest - @Feature("NewTabTile") - // clang-format off - @DisableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION, - ChromeFeatureList.CLOSE_TAB_SUGGESTIONS}) - @CommandLineFlags.Add({BASE_PARAMS + "/tab_grid_layout_android_new_tab_tile/false" - + "/tab_grid_layout_android_new_tab/false"}) - public void testNewTabTile_Disabled() throws InterruptedException { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - prepareTabs(2, 0, null); - - enterGTSWithThumbnailChecking(); - - onView(withId(R.id.new_tab_tile)).check(doesNotExist()); - verifyTabSwitcherCardCount(cta, 2); - - switchTabModel(cta, true); - onView(withId(R.id.new_tab_tile)).check(doesNotExist()); - verifyTabSwitcherCardCount(cta, 0); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS}) - @DisabledTest(message = "https://crbug.com/1122657") - public void testThumbnailAspectRatio_default() { - prepareTabs(2, 0, mUrl); - enterTabSwitcher(mActivityTestRule.getActivity()); - onView(tabSwitcherViewMatcher()) - .check(ThumbnailAspectRatioAssertion.havingAspectRatio(1.0)); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/0.75"}) - @DisabledTest(message = "https://crbug.com/1122657") - public void testThumbnailAspectRatio_point75() { - prepareTabs(2, 0, mUrl); - enterTabSwitcher(mActivityTestRule.getActivity()); - onView(tabSwitcherViewMatcher()) - .check(ThumbnailAspectRatioAssertion.havingAspectRatio(0.75)); - leaveGTSAndVerifyThumbnailsAreReleased(); - - Tab tab = mActivityTestRule.getActivity().getTabModelSelector().getCurrentTab(); - mActivityTestRule.loadUrlInTab( - NTP_URL, PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR, tab); - enterTabSwitcher(mActivityTestRule.getActivity()); - onView(tabSwitcherViewMatcher()) - .check(ThumbnailAspectRatioAssertion.havingAspectRatio(0.75)); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/2.0/allow_to_refetch/true"}) - @DisabledTest(message = "Flaky - https://crbug.com/1124041") - public void testThumbnailAspectRatio_fromTwoToPoint75() throws Exception { - prepareTabs(2, 0, mUrl); - enterTabSwitcher(mActivityTestRule.getActivity()); - onView(tabSwitcherViewMatcher()) - .check(ThumbnailAspectRatioAssertion.havingAspectRatio(2.0)); - TabModel currentTabModel = - mActivityTestRule.getActivity().getTabModelSelector().getCurrentModel(); - for (int i = 0; i < currentTabModel.getCount(); i++) { - TabUiTestHelper.checkThumbnailsExist(currentTabModel.getTabAt(i)); - } - leaveGTSAndVerifyThumbnailsAreReleased(); - - simulateAspectRatioChangedToPoint75(); - verifyAllThumbnailHasAspectRatio(0.75); - - enterTabSwitcher(mActivityTestRule.getActivity()); - onView(tabSwitcherViewMatcher()) - .check(ThumbnailAspectRatioAssertion.havingAspectRatio(2.0)); - TabUiTestHelper.finishActivity(mActivityTestRule.getActivity()); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS}) - @DisabledTest(message = "https://crbug.com/1138739") - public void testThumbnailFetchingResult_defaultAspectRatio() throws Exception { - prepareTabs(2, 0, mUrl); - int oldJpegCount = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_JPEG); - int oldEtc1Count = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_ETC1); - int oldNothingCount = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_NOTHING); - int oldDifferentAspectRatioJpegCount = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG); - - enterTabSwitcher(mActivityTestRule.getActivity()); - int currentJpegCount = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_JPEG); - int currentEtc1Count = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_ETC1); - int currentNothingCount = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_NOTHING); - int currentDifferentAspectRatioJpegCount = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG); - - assertEquals(1, currentJpegCount - oldJpegCount); - assertEquals(0, currentEtc1Count - oldEtc1Count); - assertEquals(0, currentDifferentAspectRatioJpegCount - oldDifferentAspectRatioJpegCount); - // Get thumbnail from a live layer. - assertEquals(1, currentNothingCount - oldNothingCount); - - oldJpegCount = currentJpegCount; - oldEtc1Count = currentEtc1Count; - oldNothingCount = currentNothingCount; - oldDifferentAspectRatioJpegCount = currentDifferentAspectRatioJpegCount; - - TabModel currentTabModel = - mActivityTestRule.getActivity().getTabModelSelector().getCurrentModel(); - for (int i = 0; i < currentTabModel.getCount(); i++) { - TabUiTestHelper.checkThumbnailsExist(currentTabModel.getTabAt(i)); - } - - TabUiTestHelper.finishActivity(mActivityTestRule.getActivity()); - mActivityTestRule.startMainActivityFromLauncher(); - - enterTabSwitcher(mActivityTestRule.getActivity()); - assertEquals(2, - RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_JPEG) - - oldJpegCount); - assertEquals(0, - RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_ETC1) - - oldEtc1Count); - assertEquals(0, - RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_NOTHING) - - oldNothingCount); - assertEquals(0, - RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG) - - oldDifferentAspectRatioJpegCount); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/2.0/allow_to_refetch/true"}) - @DisabledTest(message = "http://crbug/1119527 - Flaky on bots.") - public void testThumbnailFetchingResult_changingAspectRatio() throws Exception { - prepareTabs(2, 0, mUrl); - int oldJpegCount = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_JPEG); - int oldEtc1Count = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_ETC1); - int oldNothingCount = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_NOTHING); - int oldDifferentAspectRatioJpegCount = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG); - - enterTabSwitcher(mActivityTestRule.getActivity()); - int currentJpegCount = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_JPEG); - int currentEtc1Count = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_ETC1); - int currentNothingCount = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_NOTHING); - int currentDifferentAspectRatioJpegCount = RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG); - - assertEquals(1, currentJpegCount - oldJpegCount); - assertEquals(0, currentEtc1Count - oldEtc1Count); - assertEquals(0, currentDifferentAspectRatioJpegCount - oldDifferentAspectRatioJpegCount); - // Get thumbnail from a live layer. - assertEquals(1, currentNothingCount - oldNothingCount); - - oldJpegCount = currentJpegCount; - oldEtc1Count = currentEtc1Count; - oldNothingCount = currentNothingCount; - oldDifferentAspectRatioJpegCount = currentDifferentAspectRatioJpegCount; - - onView(tabSwitcherViewMatcher()) - .check(ThumbnailAspectRatioAssertion.havingAspectRatio(2.0)); - - TabModel currentTabModel = - mActivityTestRule.getActivity().getTabModelSelector().getCurrentModel(); - for (int i = 0; i < currentTabModel.getCount(); i++) { - TabUiTestHelper.checkThumbnailsExist(currentTabModel.getTabAt(i)); - } - leaveGTSAndVerifyThumbnailsAreReleased(); - - simulateAspectRatioChangedToPoint75(); - verifyAllThumbnailHasAspectRatio(0.75); - - enterTabSwitcher(mActivityTestRule.getActivity()); - assertEquals(0, - RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_JPEG) - - oldJpegCount); - assertEquals(2, - RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG) - - oldDifferentAspectRatioJpegCount); - assertEquals(0, - RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_ETC1) - - oldEtc1Count); - assertEquals(0, - RecordHistogram.getHistogramValueCountForTesting( - TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, - TabContentManager.ThumbnailFetchingResult.GOT_NOTHING) - - oldNothingCount); - onView(tabSwitcherViewMatcher()) - .check(ThumbnailAspectRatioAssertion.havingAspectRatio(2.0)); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS}) - public void testRecycling_defaultAspectRatio() { - prepareTabs(10, 0, mUrl); - ChromeTabUtils.switchTabInCurrentTabModel(mActivityTestRule.getActivity(), 0); - enterTabSwitcher(mActivityTestRule.getActivity()); - onView(tabSwitcherViewMatcher()).perform(RecyclerViewActions.scrollToPosition(9)); - } - - @Test - @MediumTest - // clang-format off - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/0.75"}) - @DisabledTest(message = "http://crbug/1092987") - public void testRecycling_aspectRatioPoint75() { - // clang-format on - prepareTabs(10, 0, mUrl); - ChromeTabUtils.switchTabInCurrentTabModel(mActivityTestRule.getActivity(), 0); - enterTabSwitcher(mActivityTestRule.getActivity()); - onView(tabSwitcherViewMatcher()).perform(RecyclerViewActions.scrollToPosition(9)); - } - - @Test - @MediumTest - // clang-format off - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/0.75"}) - public void testExpandTab_withAspectRatioPoint75() { - // clang-format on - prepareTabs(1, 0, mUrl); - enterTabSwitcher(mActivityTestRule.getActivity()); - leaveGTSAndVerifyThumbnailsAreReleased(); - } - - @Test - @MediumTest - @Feature({"RenderTest"}) - // clang-format off - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/1.0"}) - @DisabledTest(message = "https://crbug.com/1205952") - public void testRenderGrid_withAspectRatioOfOne() throws IOException { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - prepareTabs(3, 0, "about:blank"); - TabModel normalTabModel = cta.getTabModelSelector().getModel(false); - List<Tab> tabGroup = new ArrayList<>( - Arrays.asList(normalTabModel.getTabAt(0), normalTabModel.getTabAt(1))); - createTabGroup(cta, false, tabGroup); - // Make sure all tabs have thumbnail. - enterGTSWithThumbnailRetry(); - mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "aspect_ratio_of_one"); - } - - @Test - @MediumTest - @Feature("NewTabVariation") - @DisabledTest(message = "https://crbug.com/1144666") - // clang-format off - @Features.DisableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION, - ChromeFeatureList.CLOSE_TAB_SUGGESTIONS}) - @CommandLineFlags.Add({BASE_PARAMS + "/tab_grid_layout_android_new_tab/NewTabVariation"}) - public void testNewTabVariation() { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - prepareTabs(2, 0, null); - enterTabSwitcher(cta); - verifyTabModelTabCount(cta, 2, 0); - checkNewTabVariationVisibility(true); - - createTabs(cta, true, 1); - verifyTabModelTabCount(cta, 2, 1); - enterTabSwitcher(cta); - checkNewTabVariationVisibility(false); - - switchTabModel(cta, false); - checkNewTabVariationVisibility(false); - - switchTabModel(cta, true); - checkNewTabVariationVisibility(false); - - closeFirstTabInTabSwitcher(); - verifyTabModelTabCount(cta, 2, 0); - checkNewTabVariationVisibility(true); - - createTabs(cta, true, 2); - verifyTabModelTabCount(cta, 2, 2); - enterTabSwitcher(cta); - checkNewTabVariationVisibility(false); - - MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), cta, - R.id.close_all_incognito_tabs_menu_id); - verifyTabModelTabCount(cta, 2, 0); - checkNewTabVariationVisibility(true); - } - - private void checkNewTabVariationVisibility(boolean isVisible) { - if (isVisible) { - onView(allOf(withId(R.id.incognito_toggle_tabs), - withParent(withId(R.id.tab_switcher_toolbar)))) - .check(matches(withEffectiveVisibility(GONE))); - onView(allOf(withId(R.id.new_tab_button), - withParent(withId(R.id.tab_switcher_toolbar)))) - .check(matches(withEffectiveVisibility(GONE))); - onView(allOf(withId(R.id.new_tab_view), withParent(withId(R.id.tab_switcher_toolbar)))) - .check(matches(isDisplayed())); - } else { - onView(allOf(withId(R.id.incognito_toggle_tabs), - withParent(withId(R.id.tab_switcher_toolbar)))) - .check(matches(isDisplayed())); - onView(allOf(withId(R.id.new_tab_button), - withParent(withId(R.id.tab_switcher_toolbar)))) - .check(matches(isDisplayed())); - onView(allOf(withId(R.id.new_tab_view), withParent(withId(R.id.tab_switcher_toolbar)))) - .check(matches(withEffectiveVisibility(GONE))); - } - } - - @Test - @MediumTest - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS}) - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID, - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<study"}) - @DisabledTest(message = "https://crbug.com/1130212") - public void testCloseTabViaCloseButton() throws Exception { - // clang-format on - mActivityTestRule.getActivity().getSnackbarManager().disableForTesting(); - prepareTabs(1, 0, null); - enterGTSWithThumbnailChecking(); - - onView(allOf(withId(R.id.action_button), withParent(withId(R.id.content_view)), - withEffectiveVisibility(VISIBLE))) - .perform(click()); - } - - @Test - @MediumTest - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS}) - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<study"}) - @DisabledTest(message = "Flaky - https://crbug.com/1124041, crbug.com/1061178") - public void testSwipeToDismiss_GTS() { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - // Create 3 tabs and merge the first two tabs into one group. - createTabs(cta, false, 3); - enterTabSwitcher(cta); - TabModel normalTabModel = cta.getTabModelSelector().getModel(false); - List<Tab> tabGroup = new ArrayList<>( - Arrays.asList(normalTabModel.getTabAt(0), normalTabModel.getTabAt(1))); - createTabGroup(cta, false, tabGroup); - verifyTabSwitcherCardCount(cta, 2); - verifyTabModelTabCount(cta, 3, 0); - - // Swipe to dismiss a single tab card. - onView(tabSwitcherViewMatcher()) - .perform(RecyclerViewActions.actionOnItemAtPosition( - 1, getSwipeToDismissAction(false))); - verifyTabSwitcherCardCount(cta, 1); - verifyTabModelTabCount(cta, 2, 0); - - // Swipe to dismiss a tab group card. - onView(tabSwitcherViewMatcher()) - .perform(RecyclerViewActions.actionOnItemAtPosition( - 0, getSwipeToDismissAction(true))); - verifyTabSwitcherCardCount(cta, 0); - verifyTabModelTabCount(cta, 0, 0); - } - - @Test - @MediumTest - // clang-format off - @DisabledTest(message = "https://crbug.com/1144666") - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID + "<study", - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<study"}) - @CommandLineFlags.Add({BASE_PARAMS + "/enable_launch_polish/true"}) - public void testCloseButtonDescription() { - String expectedDescription = "Close New tab tab"; - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - enterTabSwitcher(cta); - - // Test single tab. - onView(allOf(withParent(withId(R.id.content_view)), withId(R.id.action_button), - withEffectiveVisibility(VISIBLE))) - .check(ViewContentDescription.havingDescription(expectedDescription)); - - // Create 2 tabs and merge them into one group. - createTabs(cta, false, 2); - enterTabSwitcher(cta); - TabModel normalTabModel = cta.getTabModelSelector().getModel(false); - List<Tab> tabGroup = new ArrayList<>( - Arrays.asList(normalTabModel.getTabAt(0), normalTabModel.getTabAt(1))); - createTabGroup(cta, false, tabGroup); - verifyTabSwitcherCardCount(cta, 1); - - // Test group tab. - expectedDescription = "Close tab group with 2 tabs"; - onView(allOf(withParent(withId(R.id.content_view)), withId(R.id.action_button), - withEffectiveVisibility(VISIBLE))) - .check(ViewContentDescription.havingDescription(expectedDescription)); - } - - private static class ViewContentDescription implements ViewAssertion { - private String mExpectedDescription; - - public static ViewContentDescription havingDescription(String description) { - return new ViewContentDescription(description); - } - - public ViewContentDescription(String description) { - mExpectedDescription = description; - } - - @Override - public void check(View view, NoMatchingViewException noMatchException) { - if (noMatchException != null) throw noMatchException; - - assertEquals(mExpectedDescription, view.getContentDescription()); - } - } - - private static class TabCountAssertion implements ViewAssertion { - private int mExpectedCount; - - public static TabCountAssertion havingTabCount(int tabCount) { - return new TabCountAssertion(tabCount); - } - - public TabCountAssertion(int expectedCount) { - mExpectedCount = expectedCount; - } - - @Override - public void check(View view, NoMatchingViewException noMatchException) { - if (noMatchException != null) throw noMatchException; - - RecyclerView.Adapter adapter = ((RecyclerView) view).getAdapter(); - assertEquals(mExpectedCount, adapter.getItemCount()); - } - } - - private static class ThumbnailAspectRatioAssertion implements ViewAssertion { - private double mExpectedRatio; - - public static ThumbnailAspectRatioAssertion havingAspectRatio(double ratio) { - return new ThumbnailAspectRatioAssertion(ratio); - } - - private ThumbnailAspectRatioAssertion(double expectedRatio) { - mExpectedRatio = expectedRatio; - } - - @Override - public void check(View view, NoMatchingViewException noMatchException) { - if (noMatchException != null) throw noMatchException; - - RecyclerView recyclerView = (RecyclerView) view; - - RecyclerView.Adapter adapter = recyclerView.getAdapter(); - for (int i = 0; i < adapter.getItemCount(); i++) { - RecyclerView.ViewHolder viewHolder = - recyclerView.findViewHolderForAdapterPosition(i); - if (viewHolder != null) { - ViewLookupCachingFrameLayout tabView = - (ViewLookupCachingFrameLayout) viewHolder.itemView; - ImageView thumbnail = (ImageView) tabView.fastFindViewById(R.id.tab_thumbnail); - BitmapDrawable drawable = (BitmapDrawable) thumbnail.getDrawable(); - Bitmap bitmap = drawable.getBitmap(); - double bitmapRatio = bitmap.getWidth() * 1.0 / bitmap.getHeight(); - assertTrue( - "Actual ratio: " + bitmapRatio + "; Expected ratio: " + mExpectedRatio, - Math.abs(bitmapRatio - mExpectedRatio) - <= TabContentManager.ASPECT_RATIO_PRECISION); - } - } - } - } - - private void waitForLastSearchTerm(Tab tab, String expected) { - CriteriaHelper.pollUiThread(() -> { - Criteria.checkThat( - TabAttributeCache.getLastSearchTerm(tab.getId()), Matchers.is(expected)); - }); - } - - @Test - @MediumTest - // Disable TAB_TO_GTS_ANIMATION to make it less flaky. - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - @CommandLineFlags.Add({BASE_PARAMS + "/enable_search_term_chip/true"}) - public void testSearchTermChip_noChip() throws InterruptedException { - assertTrue(TabUiFeatureUtilities.ENABLE_SEARCH_CHIP.getValue()); - prepareTabs(1, 0, mUrl); - enterTabSwitcher(mActivityTestRule.getActivity()); - - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); - onView(allOf(withId(R.id.page_info_button), - isDescendantOfA(withId(R.id.compositor_view_holder)))) - .check(matches(not(isDisplayed()))); - } - - @Test - @MediumTest - // Disable TAB_TO_GTS_ANIMATION to make it less flaky. - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - @CommandLineFlags.Add({BASE_PARAMS + "/enable_search_term_chip/true"}) - @DisabledTest(message = "http://crbug/1120822 - Flaky on bots.") - public void testSearchTermChip_withChip() throws InterruptedException { - assertTrue(TabUiFeatureUtilities.ENABLE_SEARCH_CHIP.getValue()); - // Make sure we support RTL and CJKV languages. - String searchTermWithSpecialCodePoints = "a\n ئۇيغۇرچە\u200E漢字"; - // Special code points like new line (\n) and left-to-right marker (\u200E) should - // be stripped out. See TabAttributeCache#removeEscapedCodePoints for more details. - String expectedTerm = "a ئۇيغۇرچە漢字"; - - String anotherTerm = "hello world"; - - // Do search, and verify the chip is still not shown. - AtomicReference<String> searchUrl = new AtomicReference<>(); - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - Tab currentTab = cta.getTabModelSelector().getCurrentTab(); - TestThreadUtils.runOnUiThreadBlocking(() -> { - TemplateUrlServiceFactory.get().setSearchEngine("google.com"); - searchUrl.set(TemplateUrlServiceFactory.get().getUrlForSearchQuery( - searchTermWithSpecialCodePoints)); - currentTab.loadUrl(new LoadUrlParams(searchUrl.get())); - }); - ChromeTabUtils.waitForTabPageLoaded(currentTab, null); - enterTabSwitcher(mActivityTestRule.getActivity()); - - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); - onView(withId(R.id.page_info_button)).check(matches(not(isDisplayed()))); - Espresso.pressBack(); - - // Navigate, and verify the chip is shown. - mActivityTestRule.loadUrl(mUrl); - waitForLastSearchTerm(currentTab, expectedTerm); - enterTabSwitcher(mActivityTestRule.getActivity()); - - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); - onView(withId(R.id.page_info_button)) - .check(waitForView(allOf(withText(expectedTerm), isDisplayed()))); - Espresso.pressBack(); - - // Do another search, and verify the chip is gone. - AtomicReference<String> searchUrl2 = new AtomicReference<>(); - TestThreadUtils.runOnUiThreadBlocking(() -> { - TemplateUrlServiceFactory.get().setSearchEngine("google.com"); - searchUrl2.set(TemplateUrlServiceFactory.get().getUrlForSearchQuery(anotherTerm)); - currentTab.loadUrl(new LoadUrlParams(searchUrl2.get())); - }); - ChromeTabUtils.waitForTabPageLoaded(currentTab, null); - waitForLastSearchTerm(currentTab, null); - enterTabSwitcher(mActivityTestRule.getActivity()); - - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); - onView(withId(R.id.page_info_button)).check(matches(not(isDisplayed()))); - Espresso.pressBack(); - - // Back to previous page, and verify the chip is back. - Espresso.pressBack(); - waitForLastSearchTerm(currentTab, expectedTerm); - enterTabSwitcher(mActivityTestRule.getActivity()); - - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); - onView(withId(R.id.page_info_button)) - .check(waitForView(allOf(withText(expectedTerm), isDisplayed()))); - - // Click the chip and check the tab navigates back to the search result page. - assertEquals(mUrl, ChromeTabUtils.getUrlStringOnUiThread(currentTab)); - onView(withId(R.id.page_info_button)) - .check(waitForView(allOf(withText(expectedTerm), isDisplayed()))); - onView(withId(R.id.page_info_button)).perform(click()); - LayoutTestUtils.waitForLayout(cta.getLayoutManager(), LayoutType.BROWSING); - ChromeTabUtils.waitForTabPageLoaded(currentTab, searchUrl.get()); - - // Verify the chip is gone. - waitForLastSearchTerm(currentTab, null); - enterTabSwitcher(mActivityTestRule.getActivity()); - - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); - onView(withId(R.id.page_info_button)).check(matches(not(isDisplayed()))); - } - - @Test - @MediumTest - // clang-format off - // Disable TAB_TO_GTS_ANIMATION to make it less flaky. - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - @CommandLineFlags.Add({BASE_PARAMS + - "/enable_search_term_chip/true/enable_search_term_chip_adaptive_icon/true"}) - public void testSearchTermChip_adaptiveIcon() throws InterruptedException { - // clang-format on - assertTrue(TabUiFeatureUtilities.ENABLE_SEARCH_CHIP.getValue()); - assertTrue(TabUiFeatureUtilities.ENABLE_SEARCH_CHIP_ADAPTIVE.getValue()); - String searchTerm = "hello world"; - - // Do search, and verify the chip is still not shown. - AtomicReference<String> searchUrl = new AtomicReference<>(); - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - Tab currentTab = cta.getTabModelSelector().getCurrentTab(); - TestThreadUtils.runOnUiThreadBlocking(() -> { - TemplateUrlServiceFactory.get().setSearchEngine("google.com"); - searchUrl.set(TemplateUrlServiceFactory.get().getUrlForSearchQuery(searchTerm)); - currentTab.loadUrl(new LoadUrlParams(searchUrl.get())); - }); - ChromeTabUtils.waitForTabPageLoaded(currentTab, null); - enterTabSwitcher(mActivityTestRule.getActivity()); - - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); - onView(allOf(withId(R.id.page_info_button), - isDescendantOfA(withId(R.id.compositor_view_holder)))) - .check(matches(not(isDisplayed()))); - Espresso.pressBack(); - - // Navigate, and verify the chip is shown. - mActivityTestRule.loadUrl(mUrl); - waitForLastSearchTerm(currentTab, searchTerm); - enterTabSwitcher(mActivityTestRule.getActivity()); - - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); - onView(allOf(withId(R.id.page_info_button), - isDescendantOfA(withId(R.id.compositor_view_holder)))) - .check(waitForView(allOf(withText(searchTerm), isDisplayed()))); - - // Switch the default search engine from google.com to yahoo.com, the search chip icon - // should change. - RecyclerView tabListRecyclerView = cta.findViewById(R.id.tab_list_view); - ChipView chipView = - tabListRecyclerView.findViewHolderForAdapterPosition(0).itemView.findViewById( - R.id.page_info_button); - ChromeImageView iconImageView = (ChromeImageView) chipView.getChildAt(0); - Drawable googleDrawable = iconImageView.getDrawable(); - - TestThreadUtils.runOnUiThreadBlocking( - () -> TemplateUrlServiceFactory.get().setSearchEngine("yahoo.com")); - - assertNotEquals(googleDrawable, iconImageView.getDrawable()); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID}) - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - @FlakyTest(message = "crbug.com/1096997") - public void testTabGroupManualSelection() throws InterruptedException { - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - TabSelectionEditorTestingRobot robot = new TabSelectionEditorTestingRobot(); - createTabs(cta, false, 3); - enterTabSwitcher(cta); - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(3)); - - enterTabGroupManualSelection(cta); - robot.resultRobot.verifyTabSelectionEditorIsVisible(); - - // Group first two tabs. - robot.actionRobot.clickItemAtAdapterPosition(0); - robot.actionRobot.clickItemAtAdapterPosition(1); - robot.actionRobot.clickToolbarActionButton(); - - // Exit manual selection mode, back to tab switcher. - robot.resultRobot.verifyTabSelectionEditorIsHidden(); - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(2)); - onViewWaiting(withText("2 tabs grouped")); - } - - @Test - @MediumTest - // clang-format off - @DisabledTest(message = "https://crbug.com/1144666") - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - public void testTabGroupManualSelection_DisabledForSingleTab() { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - enterTabSwitcher(cta); - verifyTabSwitcherCardCount(cta, 1); - - // Group option should be disabled when there is only one single tab. - // We are using UiDevice to finish the click here since there seems to be more than one menu - // button in the view hierarchy, and we couldn't locate it using espresso approach. Also, - // performClick() won't work as the logic that handles menu button lies in onTouchListener. - View menuButton = - cta.findViewById(R.id.tab_switcher_toolbar).findViewById(R.id.menu_button); - int[] location = new int[2]; - menuButton.getLocationOnScreen(location); - UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) - .click(location[0], location[1]); - onView(withText("Group tabs")) - .inRoot(withDecorView(not(cta.getWindow().getDecorView()))) - .check(matches(not(isEnabled()))); - - // Group option should be enabled when there is more than one single tab. - createTabs(cta, false, 2); - enterTabSwitcher(cta); - verifyTabSwitcherCardCount(cta, 2); - UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) - .click(location[0], location[1]); - onView(withText("Group tabs")) - .inRoot(withDecorView(not(cta.getWindow().getDecorView()))) - .check(matches(isEnabled())); - } - - @Test - @MediumTest - // clang-format off - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - public void testTabGroupManualSelection_SystemBackDismiss() { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - TabSelectionEditorTestingRobot robot = new TabSelectionEditorTestingRobot(); - createTabs(cta, false, 2); - enterTabSwitcher(cta); - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(2)); - enterTabGroupManualSelection(cta); - robot.resultRobot.verifyTabSelectionEditorIsVisible(); - - // Pressing system back should dismiss the selection editor. - Espresso.pressBack(); - robot.resultRobot.verifyTabSelectionEditorIsHidden(); - } - - @Test - @MediumTest - @Feature("TabSuggestion") - // clang-format off - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study"}) - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + - "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0" + - "/thumbnail_aspect_ratio/1.0"}) - public void testTabGroupManualSelection_AfterReviewTabSuggestion() throws InterruptedException { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - TabSelectionEditorTestingRobot robot = new TabSelectionEditorTestingRobot(); - createTabs(cta, false, 3); - - // Review closing tab suggestion. - CriteriaHelper.pollUiThread(TabSuggestionMessageService::isSuggestionAvailableForTesting); - CriteriaHelper.pollUiThread( - () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(3))); - - // Entering GTS with thumbnail checking here is trying to reduce flakiness that is caused by - // the TabContextObserver. TabContextObserver listens to - // TabObserver#didFirstVisuallyNonEmptyPaint and invalidates the suggestion. Do the - // thumbnail checking here is to ensure the suggestion is valid when entering tab switcher. - enterGTSWithThumbnailChecking(); - CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); - onView(withId(R.id.tab_grid_message_item)).check(matches(isDisplayed())); - onView(allOf(withId(R.id.action_button), withParent(withId(R.id.tab_grid_message_item)))) - .perform(click()); - - robot.resultRobot.verifyTabSelectionEditorIsVisible() - .verifyToolbarActionButtonWithResourceId( - R.string.tab_suggestion_close_tab_action_button); - - robot.actionRobot.clickToolbarActionButton(); - robot.resultRobot.verifyTabSelectionEditorIsHidden(); - CriteriaHelper.pollUiThread(() -> { - Criteria.checkThat(mActivityTestRule.getActivity().getCurrentTabModel().getCount(), - Matchers.is(0)); - }); - - // Show Manual Selection Mode. - createTabs(cta, false, 3); - - TabUiTestHelper.enterTabSwitcher(mActivityTestRule.getActivity()); - enterTabGroupManualSelection(cta); - robot.resultRobot.verifyTabSelectionEditorIsVisible() - .verifyToolbarActionButtonWithResourceId(R.string.tab_selection_editor_group); - - // Group first two tabs. - robot.actionRobot.clickItemAtAdapterPosition(0); - robot.actionRobot.clickItemAtAdapterPosition(1); - robot.actionRobot.clickToolbarActionButton(); - - // Exit manual selection mode, back to tab switcher. - robot.resultRobot.verifyTabSelectionEditorIsHidden(); - onViewWaiting(withText("2 tabs grouped")); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - @DisabledTest(message = "crbug.com/1187320 This doesn't work with FeedV2 and crbug.com/1096295") - public void testActivityCanBeGarbageCollectedAfterFinished() throws Exception { - prepareTabs(1, 0, "about:blank"); - - WeakReference<ChromeTabbedActivity> activityRef = - new WeakReference<>(mActivityTestRule.getActivity()); - - ChromeTabbedActivity activity = - ApplicationTestUtils.recreateActivity(mActivityTestRule.getActivity()); - InstrumentationRegistry.getInstrumentation().waitForIdleSync(); - - mStartSurfaceLayout = null; - mTabListDelegate = null; - mActivityTestRule.setActivity(activity); - - // A longer timeout is needed. Achieve that by using the CriteriaHelper.pollUiThread. - CriteriaHelper.pollUiThread( - () -> GarbageCollectionTestUtils.canBeGarbageCollected(activityRef)); - } - - /** - * This test is to simulate closing all incognito tabs during the activity recreation stage. - * This is a regression test for crbug.com/1044557. The test ensures all incognito tabs closed, - * which leads to a TabModel switching event, before the first normal tab is restored. - */ - @Test - @MediumTest - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - // clang-format off - @DisabledTest(message = "crbug.com/1044557 This regression test fails deterministically with" + - " the bot, but passes with local emulator. Disable the test for now.") - public void - closeAllIncognitoTabsBeforeRestoreCompleted() { - // clang-format on - prepareTabs(3, 1, "about:blank"); - - assertTrue(mActivityTestRule.getActivity().getCurrentTabModel().isIncognito()); - - // Need to wait for contentsState to be initialized for the tab to restore correctly. - CriteriaHelper.pollUiThread( - () - -> TabStateExtractor.from(mActivityTestRule.getActivity().getActivityTab()) - .contentsState - != null, - "Incognito tab contentsState is null"); - - ChromeTabUtils.newTabFromMenu(InstrumentationRegistry.getInstrumentation(), - mActivityTestRule.getActivity(), true, false); - - mActivityTestRule.loadUrl("about:blank"); - - // Need to wait for contentsState to be initialized for the tab to restore correctly. - CriteriaHelper.pollUiThread( - () - -> TabStateExtractor.from(mActivityTestRule.getActivity().getActivityTab()) - .contentsState - != null, - "Incognito tab contentsState is null"); - - PseudoTab.clearForTesting(); - - AtomicBoolean tabModelRestoreCompleted = new AtomicBoolean(false); - AtomicBoolean normalModelIsEmpty = new AtomicBoolean(true); - - mActivityTestRule.recreateActivity(); - ChromeTabbedActivity newActivity = mActivityTestRule.getActivity(); - - new TabModelSelectorTabModelObserver(newActivity.getTabModelSelector()) { - @Override - public void restoreCompleted() { - tabModelRestoreCompleted.set(true); - } - - @Override - public void willAddTab(Tab tab, int type) { - if (tab.isIncognito() || !normalModelIsEmpty.get()) return; - - // Ensure normal tab model is active before its first tab restores. - CriteriaHelper.pollUiThread( - () - -> !newActivity.getCurrentTabModel().isIncognito(), - "Had not switched to Normal TabModel before the first normal Tab restored"); - } - - @Override - public void didAddTab(Tab tab, int type, int creationState) { - if (tab.isIncognito()) return; - normalModelIsEmpty.set(false); - } - }; - - CriteriaHelper.pollUiThread(() - -> newActivity.didFinishNativeInitialization(), - "New Activity has not finished initialized yet"); - CriteriaHelper.pollUiThread(() - -> newActivity.getCurrentTabModel().isIncognito(), - "New Activity current TabModel is not incognito"); - TestThreadUtils.runOnUiThreadBlocking(IncognitoTabHostUtils::closeAllIncognitoTabs); - - assertTrue("Deferred startup never completed", mActivityTestRule.waitForDeferredStartup()); - - CriteriaHelper.pollUiThread(() - -> tabModelRestoreCompleted.get(), - "New Activity normal TabModel has never restored"); - - assertFalse(newActivity.getCurrentTabModel().isIncognito()); - assertNotNull(newActivity.getTabModelSelector().getCurrentTab()); - // With the fix, StaticLayout guarantees to be shown. Otherwise, StartSurfaceLayout could be - // shown, not guaranteed. - assertTrue(newActivity.getLayoutManager().getActiveLayout() instanceof StaticLayout); - } - - @Test - @MediumTest - // clang-format off - @EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - public void testTabGroupNotFormDuringRestore() throws Exception { - // clang-format on - // Finish the activity and disable the ChromeFeatureList.TAB_GROUPS_ANDROID flag. - finishActivity(mActivityTestRule.getActivity()); - CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, false); - - mActivityTestRule.startMainActivityOnBlankPage(); - final ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - mActivityTestRule.loadUrl(mUrl); - Tab parentTab = cta.getTabModelSelector().getCurrentTab(); - - // Create a tab whose parent tab is parentTab. - TabCreator tabCreator = - TestThreadUtils.runOnUiThreadBlockingNoException(() -> cta.getTabCreator(false)); - LoadUrlParams loadUrlParams = new LoadUrlParams(mUrl); - TestThreadUtils.runOnUiThreadBlocking( - () - -> tabCreator.createNewTab( - loadUrlParams, TabLaunchType.FROM_LONGPRESS_BACKGROUND, parentTab)); - enterTabSwitcher(cta); - verifyTabSwitcherCardCount(cta, 2); - - // Restart activity with tab group enabled, and the tabs should remain as single tabs. - finishActivity(cta); - CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true); - mActivityTestRule.startMainActivityOnBlankPage(); - final ChromeTabbedActivity ctaRestarted = mActivityTestRule.getActivity(); - assertTrue(ctaRestarted.getTabModelSelector() - .getTabModelFilterProvider() - .getCurrentTabModelFilter() - instanceof TabGroupModelFilter); - enterTabSwitcher(ctaRestarted); - verifyTabSwitcherCardCount(ctaRestarted, 3); - } - - @Test - @MediumTest - // clang-format off - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - public void verifyTabGroupStateAfterReparenting() throws Exception { - // clang-format on - final ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - assertTrue(cta.getTabModelSelector().getTabModelFilterProvider().getCurrentTabModelFilter() - instanceof TabGroupModelFilter); - mActivityTestRule.loadUrl(mUrl); - Tab parentTab = cta.getTabModelSelector().getCurrentTab(); - - // Create a tab whose parent tab is parentTab. - TabCreator tabCreator = - TestThreadUtils.runOnUiThreadBlockingNoException(() -> cta.getTabCreator(false)); - LoadUrlParams loadUrlParams = new LoadUrlParams(mUrl); - TestThreadUtils.runOnUiThreadBlocking( - () - -> tabCreator.createNewTab( - loadUrlParams, TabLaunchType.FROM_LONGPRESS_BACKGROUND, parentTab)); - Tab childTab = cta.getTabModelSelector().getCurrentModel().getTabAt(1); - enterTabSwitcher(cta); - verifyTabSwitcherCardCount(cta, 1); - TabGroupModelFilter filter = (TabGroupModelFilter) cta.getTabModelSelector() - .getTabModelFilterProvider() - .getCurrentTabModelFilter(); - TestThreadUtils.runOnUiThreadBlocking(() -> filter.moveTabOutOfGroup(childTab.getId())); - verifyTabSwitcherCardCount(cta, 2); - - TestThreadUtils.runOnUiThreadBlocking( - () -> ChromeNightModeTestUtils.setUpNightModeForChromeActivity(true)); - final ChromeTabbedActivity ctaNightMode = ActivityTestUtils.waitForActivity( - InstrumentationRegistry.getInstrumentation(), ChromeTabbedActivity.class); - assertTrue(ColorUtils.inNightMode(ctaNightMode)); - CriteriaHelper.pollUiThread(ctaNightMode.getTabModelSelector()::isTabStateInitialized); - enterTabSwitcher(ctaNightMode); - verifyTabSwitcherCardCount(ctaNightMode, 2); - } - - @Test - @MediumTest - // clang-format off - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID, - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - public void testUndoClosure_AccessibilityMode() throws Exception { - // clang-format on - TestThreadUtils.runOnUiThreadBlocking( - () -> ChromeAccessibilityUtil.get().setAccessibilityEnabledForTesting(true)); - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - SnackbarManager snackbarManager = mActivityTestRule.getActivity().getSnackbarManager(); - createTabs(cta, false, 3); - - // When grid tab switcher is enabled for accessibility mode, tab closure should still show - // undo snack bar. - enterTabSwitcher(cta); - verifyTabSwitcherCardCount(cta, 3); - assertNull(snackbarManager.getCurrentSnackbarForTesting()); - closeFirstTabInTabSwitcher(); - assertTrue(snackbarManager.getCurrentSnackbarForTesting().getController() - instanceof UndoBarController); - verifyTabSwitcherCardCount(cta, 2); - CriteriaHelper.pollInstrumentationThread(TabUiTestHelper::verifyUndoBarShowingAndClickUndo); - verifyTabSwitcherCardCount(cta, 3); - } - - @Test - @MediumTest - // clang-format off - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, ChromeFeatureList.INSTANT_START, - ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) - // TODO(crbug.com/1112557): Remove this test when critical tests in StartSurfaceLayoutTest are - // running with InstantStart on. - public void testSetup_WithInstantStart() throws Exception { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - enterTabSwitcher(cta); - verifyTabSwitcherCardCount(cta, 1); - - // Verify TabModelObserver is correctly setup by checking if tab switcher changes with tab - // closure. - closeFirstTabInTabSwitcher(); - verifyTabSwitcherCardCount(cta, 0); - - // Verify TabGroupModelFilter is correctly setup by checking if tab switcher changes with - // tab grouping. - createTabs(cta, false, 3); - enterTabSwitcher(cta); - verifyTabSwitcherCardCount(cta, 2); - mergeAllNormalTabsToAGroup(cta); - verifyTabSwitcherCardCount(cta, 1); - } - - @Test - @MediumTest - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID}) - public void testUndoGroupClosureInTabSwitcher() { - final ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - SnackbarManager snackbarManager = mActivityTestRule.getActivity().getSnackbarManager(); - createTabs(cta, false, 2); - enterTabSwitcher(cta); - verifyTabSwitcherCardCount(cta, 2); - // Create a tab group. - mergeAllNormalTabsToAGroup(cta); - verifyTabSwitcherCardCount(cta, 1); - assertNull(snackbarManager.getCurrentSnackbarForTesting()); - - // Verify close this tab group and undo in tab switcher. - closeFirstTabInTabSwitcher(); - assertTrue(snackbarManager.getCurrentSnackbarForTesting().getController() - instanceof UndoBarController); - verifyTabSwitcherCardCount(cta, 0); - CriteriaHelper.pollInstrumentationThread(TabUiTestHelper::verifyUndoBarShowingAndClickUndo); - verifyTabSwitcherCardCount(cta, 1); - } - - private void enterTabGroupManualSelection(ChromeTabbedActivity cta) { - MenuUtils.invokeCustomMenuActionSync( - InstrumentationRegistry.getInstrumentation(), cta, R.id.menu_group_tabs); - } - - /** - * TODO(wychen): move some of the callers to {@link TabUiTestHelper#enterTabSwitcher}. - */ - private void enterGTSWithThumbnailChecking() throws InterruptedException { - Tab currentTab = mActivityTestRule.getActivity().getTabModelSelector().getCurrentTab(); - // Native tabs need to be invalidated first to trigger thumbnail taking, so skip them. - boolean checkThumbnail = !currentTab.isNativePage(); - - if (checkThumbnail) { - mActivityTestRule.getActivity().getTabContentManager().removeTabThumbnail( - currentTab.getId()); - } - - int count = getCaptureCount(); - waitForCaptureRateControl(); - // TODO(wychen): use TabUiTestHelper.enterTabSwitcher() instead. - // Might increase flakiness though. See crbug.com/1024742. - LayoutTestUtils.startShowingAndWaitForLayout( - mActivityTestRule.getActivity().getLayoutManager(), LayoutType.TAB_SWITCHER, true); - - // Make sure the fading animation is done. - int delta; - if (UrlUtilities.isNTPUrl(mActivityTestRule.getActivity() - .getCurrentWebContents() - .getLastCommittedUrl())) { - // NTP is not invalidated, so no new captures. - delta = 0; - } else { - // The final capture at StartSurfaceLayout#finishedShowing time. - delta = 1; - if (ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - && areAnimatorsEnabled()) { - // The faster capturing without writing back to cache. - delta += 1; - } - } - checkCaptureCount(delta, count); - TabUiTestHelper.verifyAllTabsHaveThumbnail( - mActivityTestRule.getActivity().getCurrentTabModel()); - } - - /** - * Like {@link TabUiTestHelper#enterTabSwitcher}, but make sure all tabs have thumbnail. - */ - private void enterGTSWithThumbnailRetry() { - enterTabSwitcher(mActivityTestRule.getActivity()); - try { - TabUiTestHelper.verifyAllTabsHaveThumbnail( - mActivityTestRule.getActivity().getCurrentTabModel()); - } catch (AssertionError ae) { - // If the last thumbnail is missing, try without animation. - Espresso.pressBack(); - TestThreadUtils.runOnUiThreadBlocking( - () - -> mActivityTestRule.getActivity().getLayoutManager().showLayout( - LayoutType.TAB_SWITCHER, false)); - TabUiTestHelper.verifyAllTabsHaveThumbnail( - mActivityTestRule.getActivity().getCurrentTabModel()); - } - } - - /** - * If thumbnail checking is not needed, use {@link TabUiTestHelper#leaveTabSwitcher} instead. - */ - private void leaveGTSAndVerifyThumbnailsAreReleased() { - assertTrue(mActivityTestRule.getActivity().getLayoutManager().isLayoutVisible( - LayoutType.TAB_SWITCHER)); - - StartSurface startSurface = mStartSurfaceLayout.getStartSurfaceForTesting(); - TestThreadUtils.runOnUiThreadBlocking( - () -> { startSurface.getController().onBackPressed(); }); - // TODO(wychen): using default timeout or even converting to - // OverviewModeBehaviorWatcher shouldn't increase flakiness. - LayoutTestUtils.waitForLayout( - mActivityTestRule.getActivity().getLayoutManager(), LayoutType.BROWSING); - assertThumbnailsAreReleased(); - } - - private void checkFinalCaptureCount(boolean switchToAnotherTab, int initCount) { - int expected; - if (UrlUtilities.isNTPUrl(mActivityTestRule.getActivity() - .getCurrentWebContents() - .getLastCommittedUrl())) { - expected = 0; - } else { - expected = mRepeat; - if (ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - && areAnimatorsEnabled()) { - expected += mRepeat; - } - if (switchToAnotherTab) { - expected += mRepeat; - } - } - checkCaptureCount(expected, initCount); - } - - private void checkCaptureCount(int expectedDelta, int initCount) { - // TODO(wychen): With animation, the 2nd capture might be skipped if the 1st takes too long. - CriteriaHelper.pollUiThread(() -> { - Criteria.checkThat(getCaptureCount() - initCount, Matchers.is(expectedDelta)); - }); - } - - private int getCaptureCount() { - // TODO(crbug/1110961): Find a replacement for depending on Compositing.CopyFromSurfaceTime. - return RecordHistogram.getHistogramTotalCountForTesting("Compositing.CopyFromSurfaceTime"); - } - - private void waitForCaptureRateControl() throws InterruptedException { - // Needs to wait for at least |kCaptureMinRequestTimeMs| in order to capture another one. - // TODO(wychen): find out why waiting is still needed after setting - // |kCaptureMinRequestTimeMs| to 0. - Thread.sleep(2000); - } - - private void assertThumbnailsAreReleased() { - // Could not directly assert canAllBeGarbageCollected() because objects can be in Cleaner. - CriteriaHelper.pollUiThread(() -> canAllBeGarbageCollected(mAllBitmaps)); - } - - private boolean canAllBeGarbageCollected(List<WeakReference<Bitmap>> bitmaps) { - for (WeakReference<Bitmap> bitmap : bitmaps) { - if (!GarbageCollectionTestUtils.canBeGarbageCollected(bitmap)) { - return false; - } - } - return true; - } - - private void simulateAspectRatioChangedToPoint75() throws IOException { - TabModel currentModel = mActivityTestRule.getActivity().getCurrentTabModel(); - for (int i = 0; i < currentModel.getCount(); i++) { - Tab tab = currentModel.getTabAt(i); - Bitmap bitmap = TabContentManager.getJpegForTab(tab.getId()); - bitmap = Bitmap.createScaledBitmap( - bitmap, bitmap.getWidth(), (int) (bitmap.getWidth() * 1.0 / 0.75), false); - encodeJpeg(tab, bitmap); - } - } - - private void encodeJpeg(Tab tab, Bitmap bitmap) throws IOException { - FileOutputStream outputStream = - new FileOutputStream(TabContentManager.getTabThumbnailFileJpeg(tab.getId())); - bitmap.compress(Bitmap.CompressFormat.JPEG, 50, outputStream); - outputStream.close(); - } - - private void verifyAllThumbnailHasAspectRatio(double ratio) { - TabModel currentModel = mActivityTestRule.getActivity().getCurrentTabModel(); - for (int i = 0; i < currentModel.getCount(); i++) { - Tab tab = currentModel.getTabAt(i); - Bitmap bitmap = TabContentManager.getJpegForTab(tab.getId()); - double bitmapRatio = bitmap.getWidth() * 1.0 / bitmap.getHeight(); - assertTrue("Actual ratio: " + bitmapRatio + "; Expected ratio: " + ratio, - Math.abs(bitmapRatio - ratio) <= TabContentManager.ASPECT_RATIO_PRECISION); - } - } - - private void verifyOnlyOneTabSuggestionMessageCardIsShowing() throws InterruptedException { - String suggestionMessageTemplate = mActivityTestRule.getActivity().getString( - org.chromium.chrome.tab_ui.R.string.tab_suggestion_close_stale_message); - String suggestionMessage = - String.format(Locale.getDefault(), suggestionMessageTemplate, "3"); - prepareTabs(3, 0, mUrl); - CriteriaHelper.pollUiThread(TabSuggestionMessageService::isSuggestionAvailableForTesting); - CriteriaHelper.pollUiThread( - () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(3))); - - enterGTSWithThumbnailChecking(); - CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); - onView(allOf(withText(suggestionMessage), withParent(withId(R.id.tab_grid_message_item)))) - .check(matches(isDisplayed())); - leaveGTSAndVerifyThumbnailsAreReleased(); - - // With soft or hard clean up depends on the soft-cleanup-delay and cleanup-delay params. - enterGTSWithThumbnailChecking(); - CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); - // This will fail with error "matched multiple views" when there is more than one suggestion - // message card. - onView(allOf(withText(suggestionMessage), withParent(withId(R.id.tab_grid_message_item)))) - .check(matches(isDisplayed())); - } - - private Matcher<View> tabSwitcherViewMatcher() { - return allOf(withParent(withId(R.id.compositor_view_holder)), withId(R.id.tab_list_view)); - } -}
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutPerfTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutPerfTest.java new file mode 100644 index 0000000..b0ba108e --- /dev/null +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutPerfTest.java
@@ -0,0 +1,443 @@ +// 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. + +package org.chromium.chrome.features.start_surface; + +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withParent; + +import static org.hamcrest.Matchers.allOf; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import static org.chromium.base.test.util.CallbackHelper.WAIT_TIMEOUT_SECONDS; +import static org.chromium.base.test.util.CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL; +import static org.chromium.base.test.util.CriteriaHelper.DEFAULT_POLLING_INTERVAL; +import static org.chromium.components.embedder_support.util.UrlConstants.NTP_URL; + +import android.os.Build.VERSION_CODES; +import android.support.test.InstrumentationRegistry; + +import androidx.annotation.Nullable; +import androidx.test.espresso.Espresso; +import androidx.test.espresso.action.ViewActions; +import androidx.test.espresso.contrib.RecyclerViewActions; + +import org.hamcrest.Matchers; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.Log; +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.Criteria; +import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.DisableIf; +import org.chromium.base.test.util.DisabledTest; +import org.chromium.base.test.util.EnormousTest; +import org.chromium.base.test.util.FlakyTest; +import org.chromium.base.test.util.Restriction; +import org.chromium.chrome.browser.compositor.layouts.Layout; +import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.flags.ChromeSwitches; +import org.chromium.chrome.browser.layouts.LayoutTestUtils; +import org.chromium.chrome.browser.layouts.LayoutType; +import org.chromium.chrome.browser.layouts.animation.CompositorAnimator; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TabSelectionType; +import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; +import org.chromium.chrome.tab_ui.R; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.ChromeTabbedActivityTestRule; +import org.chromium.chrome.test.util.ChromeTabUtils; +import org.chromium.chrome.test.util.MenuUtils; +import org.chromium.chrome.test.util.browser.Features; +import org.chromium.content_public.browser.test.util.TestThreadUtils; +import org.chromium.content_public.browser.test.util.WebContentsUtils; +import org.chromium.net.test.EmbeddedTestServer; +import org.chromium.ui.test.util.UiRestriction; + +import java.io.File; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.TimeoutException; + +/** Tests for the {@link TabSwitcherAndStartSurfaceLayout}, mainly for animation performance. */ +@RunWith(ChromeJUnit4ClassRunner.class) +// clang-format off +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, + "enable-features=" + ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID + "<Study," + + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study", + "force-fieldtrials=Study/Group"}) +@Features.EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID}) +@Restriction( + {UiRestriction.RESTRICTION_TYPE_PHONE, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE}) +public class TabSwitcherAndStartSurfaceLayoutPerfTest { + // clang-format on + private static final String TAG = "SSLayoutPerfTest"; + private static final String BASE_PARAMS = "force-fieldtrial-params=" + + "Study.Group:soft-cleanup-delay/0/cleanup-delay/0/skip-slow-zooming/false" + + "/zooming-min-sdk-version/19/zooming-min-memory-mb/512"; + + /** Flip this to {@code true} to run performance tests locally. */ + private static final boolean PERF_RUN = false; + + @Rule + public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); + + @SuppressWarnings("FieldCanBeLocal") + private EmbeddedTestServer mTestServer; + private TabSwitcherAndStartSurfaceLayout mTabSwitcherAndStartSurfaceLayout; + private String mUrl; + private int mRepeat; + private long mWaitingTime; + private int mTabNumCap; + + @Before + public void setUp() { + mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext()); + mActivityTestRule.startMainActivityFromLauncher(); + + Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(); + assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout); + mTabSwitcherAndStartSurfaceLayout = (TabSwitcherAndStartSurfaceLayout) layout; + mUrl = mTestServer.getURL("/chrome/test/data/android/navigate/simple.html"); + mRepeat = 1; + mWaitingTime = 0; + mTabNumCap = 3; + + if (PERF_RUN) { + mRepeat = 30; + // Wait before the animation to get more stable results. + mWaitingTime = 1000; + mTabNumCap = 0; + } + assertTrue(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); + + CriteriaHelper.pollUiThread( + mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized); + } + + @Test + @EnormousTest + @CommandLineFlags.Add({BASE_PARAMS}) + public void testTabToGridFromLiveTab() throws InterruptedException { + prepareTabs(1, NTP_URL); + reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab"); + } + + @Test + @EnormousTest + @CommandLineFlags.Add({BASE_PARAMS}) + public void testTabToGridFromLiveTabWith10Tabs() throws InterruptedException { + prepareTabs(10, NTP_URL); + reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 10 tabs"); + } + + @Test + @EnormousTest + @CommandLineFlags.Add({BASE_PARAMS + "/soft-cleanup-delay/10000/cleanup-delay/10000"}) + @DisableIf.Build(message = "Flaky on Android P, see https://crbug.com/1161731", + sdk_is_greater_than = VERSION_CODES.O_MR1, sdk_is_less_than = VERSION_CODES.Q) + public void + testTabToGridFromLiveTabWith10TabsWarm() throws InterruptedException { + prepareTabs(10, NTP_URL); + reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 10 tabs (warm)"); + } + + @Test + @EnormousTest + @CommandLineFlags.Add({BASE_PARAMS + "/cleanup-delay/10000"}) + @DisableIf.Build(message = "Flaky on Android P, see https://crbug.com/1184787", + supported_abis_includes = "x86", sdk_is_greater_than = VERSION_CODES.O_MR1, + sdk_is_less_than = VERSION_CODES.Q) + public void + testTabToGridFromLiveTabWith10TabsSoft() throws InterruptedException { + prepareTabs(10, NTP_URL); + reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 10 tabs (soft)"); + } + + @Test + @EnormousTest + @CommandLineFlags.Add({BASE_PARAMS + "/downsampling-scale/1"}) + @DisableIf.Build(message = "Flaky on Android P, see https://crbug.com/1161731", + sdk_is_greater_than = VERSION_CODES.O_MR1, sdk_is_less_than = VERSION_CODES.Q) + public void + testTabToGridFromLiveTabWith10TabsNoDownsample() throws InterruptedException { + prepareTabs(10, NTP_URL); + reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 10 tabs (no downsample)"); + } + + @Test + @EnormousTest + @CommandLineFlags.Add({BASE_PARAMS + "/max-duty-cycle/1"}) + @DisableIf.Build(message = "Flaky on Android P, see https://crbug.com/1161731", + sdk_is_greater_than = VERSION_CODES.O_MR1, sdk_is_less_than = VERSION_CODES.Q) + public void + testTabToGridFromLiveTabWith10TabsNoRateLimit() throws InterruptedException { + prepareTabs(10, NTP_URL); + reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 10 tabs (no rate-limit)"); + } + + @Test + @EnormousTest + @FlakyTest(message = "https://crbug.com/1045938") + @CommandLineFlags.Add({BASE_PARAMS}) + public void testTabToGridFromLiveTabWith10TabsWithoutThumbnail() throws InterruptedException { + // Note that most of the tabs won't have thumbnails. + prepareTabs(10, null); + reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 10 tabs without thumbnails"); + } + + @Test + @EnormousTest + @CommandLineFlags.Add({BASE_PARAMS}) + @DisabledTest(message = "crbug.com/1048268") + public void testTabToGridFromLiveTabWith100Tabs() throws InterruptedException { + // Skip waiting for loading. Otherwise it would take too long. + // Note that most of the tabs won't have thumbnails. + prepareTabs(100, null); + reportTabToGridPerf(mUrl, "Tab-to-Grid from live tab with 100 tabs without thumbnails"); + } + + @Test + @EnormousTest + @CommandLineFlags.Add({BASE_PARAMS}) + public void testTabToGridFromNtp() throws InterruptedException { + prepareTabs(1, NTP_URL); + reportTabToGridPerf(NTP_URL, "Tab-to-Grid from NTP"); + } + + /** + * Make Chrome have {@code numTabs} or Tabs with {@code url} loaded. + * @param url The URL to load. Skip loading when null, but the thumbnail for the NTP might not + * be saved. + */ + private void prepareTabs(int numTabs, @Nullable String url) { + assertTrue(numTabs >= 1); + assertEquals(1, mActivityTestRule.getActivity().getTabModelSelector().getTotalTabCount()); + // Only run the full size when doing local perf tests. + if (mTabNumCap > 0) numTabs = Math.min(numTabs, mTabNumCap); + + if (url != null) mActivityTestRule.loadUrl(url); + for (int i = 0; i < numTabs - 1; i++) { + MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), + mActivityTestRule.getActivity(), R.id.new_tab_menu_id); + if (url != null) mActivityTestRule.loadUrl(url); + + Tab previousTab = mActivityTestRule.getActivity() + .getTabModelSelector() + .getCurrentModel() + .getTabAt(i); + + boolean fixPendingReadbacks = mActivityTestRule.getActivity() + .getTabContentManager() + .getPendingReadbacksForTesting() + != 0; + + // When there are pending readbacks due to detached Tabs, try to fix it by switching + // back to that tab. + if (fixPendingReadbacks) { + int lastIndex = i; + // clang-format off + TestThreadUtils.runOnUiThreadBlocking(() -> + mActivityTestRule.getActivity().getCurrentTabModel().setIndex( + lastIndex, TabSelectionType.FROM_USER, false) + ); + // clang-format on + } + checkThumbnailsExist(previousTab); + if (fixPendingReadbacks) { + int currentIndex = i + 1; + // clang-format off + TestThreadUtils.runOnUiThreadBlocking(() -> + mActivityTestRule.getActivity().getCurrentTabModel().setIndex( + currentIndex, TabSelectionType.FROM_USER, false) + ); + // clang-format on + } + } + ChromeTabUtils.waitForTabPageLoaded(mActivityTestRule.getActivity().getActivityTab(), null, + null, WAIT_TIMEOUT_SECONDS * 10); + assertEquals( + numTabs, mActivityTestRule.getActivity().getTabModelSelector().getTotalTabCount()); + + CriteriaHelper.pollUiThread(() -> { + Criteria.checkThat(mActivityTestRule.getActivity() + .getTabContentManager() + .getPendingReadbacksForTesting(), + Matchers.is(0)); + }); + } + + private void reportTabToGridPerf(String fromUrl, String description) + throws InterruptedException { + List<Float> frameRates = new LinkedList<>(); + List<Float> frameInterval = new LinkedList<>(); + List<Float> dirtySpans = new LinkedList<>(); + TabSwitcherAndStartSurfaceLayout.PerfListener collector = + (frameRendered, elapsedMs, maxFrameInterval, dirtySpan) -> { + assertTrue(elapsedMs >= TabSwitcherAndStartSurfaceLayout.ZOOMING_DURATION + * CompositorAnimator.sDurationScale); + float fps = 1000.f * frameRendered / elapsedMs; + frameRates.add(fps); + frameInterval.add((float) maxFrameInterval); + dirtySpans.add((float) dirtySpan); + }; + + mActivityTestRule.loadUrl(fromUrl); + Thread.sleep(mWaitingTime); + + StartSurface startSurface = mTabSwitcherAndStartSurfaceLayout.getStartSurfaceForTesting(); + for (int i = 0; i < mRepeat; i++) { + mTabSwitcherAndStartSurfaceLayout.setPerfListenerForTesting(collector); + Thread.sleep(mWaitingTime); + TestThreadUtils.runOnUiThreadBlocking( + () + -> mActivityTestRule.getActivity().getLayoutManager().showLayout( + LayoutType.TAB_SWITCHER, true)); + final int expectedSize = i + 1; + CriteriaHelper.pollInstrumentationThread(() + -> frameRates.size() == expectedSize, + "Have not got PerfListener callback", DEFAULT_MAX_TIME_TO_POLL * 10, + DEFAULT_POLLING_INTERVAL); + assertTrue(mActivityTestRule.getActivity().getLayoutManager().isLayoutVisible( + LayoutType.TAB_SWITCHER)); + + mTabSwitcherAndStartSurfaceLayout.setPerfListenerForTesting(null); + // Make sure the fading animation is done. + Thread.sleep(1000); + TestThreadUtils.runOnUiThreadBlocking( + () -> { startSurface.getController().onBackPressed(); }); + Thread.sleep(1000); + LayoutTestUtils.waitForLayout( + mActivityTestRule.getActivity().getLayoutManager(), LayoutType.BROWSING); + } + assertEquals(mRepeat, frameRates.size()); + Log.i(TAG, "%s: fps = %.2f, maxFrameInterval = %.0f, dirtySpan = %.0f", description, + median(frameRates), median(frameInterval), median(dirtySpans)); + } + + @Test + @EnormousTest + @CommandLineFlags.Add({BASE_PARAMS}) + @DisableIf.Build(message = "See https://crbug.com/1184787", supported_abis_includes = "x86") + public void testGridToTabToCurrentNTP() throws InterruptedException, TimeoutException { + prepareTabs(1, NTP_URL); + reportGridToTabPerf(false, false, "Grid-to-Tab to current NTP"); + } + + @Test + @EnormousTest + @CommandLineFlags.Add({BASE_PARAMS}) + @DisabledTest(message = "crbug.com/1087608") + public void testGridToTabToOtherNTP() throws InterruptedException, TimeoutException { + prepareTabs(2, NTP_URL); + reportGridToTabPerf(true, false, "Grid-to-Tab to other NTP"); + } + + @Test + @EnormousTest + @CommandLineFlags.Add({BASE_PARAMS}) + @DisabledTest(message = "crbug.com/1087608") + public void testGridToTabToCurrentLive() throws InterruptedException, TimeoutException { + prepareTabs(1, mUrl); + reportGridToTabPerf(false, false, "Grid-to-Tab to current live tab"); + } + + @Test + @EnormousTest + @CommandLineFlags.Add({BASE_PARAMS}) + @FlakyTest(message = "https://crbug.com/1225926") + public void testGridToTabToOtherLive() throws InterruptedException, TimeoutException { + prepareTabs(2, mUrl); + reportGridToTabPerf(true, false, "Grid-to-Tab to other live tab"); + } + + @Test + @EnormousTest + @CommandLineFlags.Add({BASE_PARAMS}) + @DisableIf.Build(message = "Flaky on Android P, see https://crbug.com/1161731", + sdk_is_greater_than = VERSION_CODES.O_MR1, sdk_is_less_than = VERSION_CODES.Q) + public void + testGridToTabToOtherFrozen() throws InterruptedException { + prepareTabs(2, mUrl); + reportGridToTabPerf(true, true, "Grid-to-Tab to other frozen tab"); + } + + private void reportGridToTabPerf(boolean switchToAnotherTab, boolean killBeforeSwitching, + String description) throws InterruptedException { + List<Float> frameRates = new LinkedList<>(); + List<Float> frameInterval = new LinkedList<>(); + TabSwitcherAndStartSurfaceLayout.PerfListener collector = + (frameRendered, elapsedMs, maxFrameInterval, dirtySpan) -> { + assertTrue(elapsedMs >= TabSwitcherAndStartSurfaceLayout.ZOOMING_DURATION + * CompositorAnimator.sDurationScale); + float fps = 1000.f * frameRendered / elapsedMs; + frameRates.add(fps); + frameInterval.add((float) maxFrameInterval); + }; + Thread.sleep(mWaitingTime); + + for (int i = 0; i < mRepeat; i++) { + mTabSwitcherAndStartSurfaceLayout.setPerfListenerForTesting(null); + LayoutTestUtils.startShowingAndWaitForLayout( + mActivityTestRule.getActivity().getLayoutManager(), LayoutType.TAB_SWITCHER, + true); + + int index = mActivityTestRule.getActivity().getCurrentTabModel().index(); + final int targetIndex = switchToAnotherTab ? 1 - index : index; + Tab targetTab = + mActivityTestRule.getActivity().getCurrentTabModel().getTabAt(targetIndex); + if (killBeforeSwitching) { + WebContentsUtils.simulateRendererKilled(targetTab.getWebContents()); + Thread.sleep(1000); + } + + mTabSwitcherAndStartSurfaceLayout.setPerfListenerForTesting(collector); + Thread.sleep(mWaitingTime); + Espresso.onView(allOf(withParent(withId( + org.chromium.chrome.tab_ui.R.id.compositor_view_holder)), + withId(org.chromium.chrome.tab_ui.R.id.tab_list_view))) + .perform(RecyclerViewActions.actionOnItemAtPosition( + targetIndex, ViewActions.click())); + + final int expectedSize = i + 1; + CriteriaHelper.pollInstrumentationThread(() + -> frameRates.size() == expectedSize, + "Have not got PerfListener callback", DEFAULT_MAX_TIME_TO_POLL * 10, + DEFAULT_POLLING_INTERVAL); + LayoutTestUtils.waitForLayout( + mActivityTestRule.getActivity().getLayoutManager(), LayoutType.BROWSING); + Thread.sleep(1000); + } + assertEquals(mRepeat, frameRates.size()); + Log.i(TAG, "%s: fps = %.2f, maxFrameInterval = %.0f", description, median(frameRates), + median(frameInterval)); + } + + private void checkThumbnailsExist(Tab tab) { + File etc1File = TabContentManager.getTabThumbnailFileEtc1(tab); + CriteriaHelper.pollInstrumentationThread(etc1File::exists, + "The thumbnail " + etc1File.getName() + " is not found", + DEFAULT_MAX_TIME_TO_POLL * 10, DEFAULT_POLLING_INTERVAL); + + File jpegFile = TabContentManager.getTabThumbnailFileJpeg(tab.getId()); + CriteriaHelper.pollInstrumentationThread(jpegFile::exists, + "The thumbnail " + jpegFile.getName() + " is not found", + DEFAULT_MAX_TIME_TO_POLL * 10, DEFAULT_POLLING_INTERVAL); + } + + private float median(List<Float> list) { + float[] array = new float[list.size()]; + for (int i = 0; i < array.length; i++) { + array[i] = list.get(i); + } + Arrays.sort(array); + return array[array.length / 2]; + } +}
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java new file mode 100644 index 0000000..2c40cc5 --- /dev/null +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java
@@ -0,0 +1,2377 @@ +// 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. + +package org.chromium.chrome.features.start_surface; + +import static android.os.Build.VERSION_CODES.O_MR1; + +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; +import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition; +import static androidx.test.espresso.matcher.RootMatchers.withDecorView; +import static androidx.test.espresso.matcher.ViewMatchers.Visibility.GONE; +import static androidx.test.espresso.matcher.ViewMatchers.Visibility.VISIBLE; +import static androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA; +import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; +import static androidx.test.espresso.matcher.ViewMatchers.isEnabled; +import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withParent; +import static androidx.test.espresso.matcher.ViewMatchers.withText; + +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.core.AllOf.allOf; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.areAnimatorsEnabled; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.closeFirstTabInTabSwitcher; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.createTabGroup; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.createTabs; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.enterTabSwitcher; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.finishActivity; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.getSwipeToDismissAction; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.leaveTabSwitcher; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.mergeAllNormalTabsToAGroup; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.switchTabModel; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.verifyTabModelTabCount; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.verifyTabSwitcherCardCount; +import static org.chromium.components.embedder_support.util.UrlConstants.NTP_URL; +import static org.chromium.ui.test.util.ViewUtils.onViewWaiting; +import static org.chromium.ui.test.util.ViewUtils.waitForView; + +import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Build.VERSION_CODES; +import android.support.test.InstrumentationRegistry; +import android.support.test.uiautomator.UiDevice; +import android.view.View; +import android.widget.ImageView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.test.espresso.Espresso; +import androidx.test.espresso.NoMatchingViewException; +import androidx.test.espresso.ViewAssertion; +import androidx.test.espresso.contrib.AccessibilityChecks; +import androidx.test.espresso.contrib.RecyclerViewActions; +import androidx.test.filters.MediumTest; + +import org.hamcrest.Matcher; +import org.hamcrest.Matchers; +import org.junit.After; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.Callback; +import org.chromium.base.GarbageCollectionTestUtils; +import org.chromium.base.metrics.RecordHistogram; +import org.chromium.base.test.util.ApplicationTestUtils; +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.Criteria; +import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.DisableIf; +import org.chromium.base.test.util.DisabledTest; +import org.chromium.base.test.util.Feature; +import org.chromium.base.test.util.FlakyTest; +import org.chromium.base.test.util.MinAndroidSdkLevel; +import org.chromium.base.test.util.Restriction; +import org.chromium.chrome.browser.ChromeTabbedActivity; +import org.chromium.chrome.browser.compositor.layouts.Layout; +import org.chromium.chrome.browser.compositor.layouts.StaticLayout; +import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; +import org.chromium.chrome.browser.flags.CachedFeatureFlags; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.flags.ChromeSwitches; +import org.chromium.chrome.browser.layouts.LayoutTestUtils; +import org.chromium.chrome.browser.layouts.LayoutType; +import org.chromium.chrome.browser.night_mode.ChromeNightModeTestUtils; +import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TabLaunchType; +import org.chromium.chrome.browser.tab.TabStateExtractor; +import org.chromium.chrome.browser.tabmodel.IncognitoTabHostUtils; +import org.chromium.chrome.browser.tabmodel.TabCreator; +import org.chromium.chrome.browser.tabmodel.TabModel; +import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabModelObserver; +import org.chromium.chrome.browser.tasks.pseudotab.PseudoTab; +import org.chromium.chrome.browser.tasks.pseudotab.TabAttributeCache; +import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; +import org.chromium.chrome.browser.tasks.tab_management.TabProperties; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorTestingRobot; +import org.chromium.chrome.browser.tasks.tab_management.TabSuggestionMessageService; +import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher; +import org.chromium.chrome.browser.tasks.tab_management.TabSwitcherCoordinator; +import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; +import org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper; +import org.chromium.chrome.browser.tasks.tab_management.TabUiThemeProvider; +import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; +import org.chromium.chrome.browser.undo_tab_close_snackbar.UndoBarController; +import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; +import org.chromium.chrome.tab_ui.R; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.ChromeTabbedActivityTestRule; +import org.chromium.chrome.test.util.ActivityTestUtils; +import org.chromium.chrome.test.util.ChromeRenderTestRule; +import org.chromium.chrome.test.util.ChromeTabUtils; +import org.chromium.chrome.test.util.MenuUtils; +import org.chromium.chrome.test.util.browser.Features; +import org.chromium.chrome.test.util.browser.Features.DisableFeatures; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; +import org.chromium.components.browser_ui.widget.chips.ChipView; +import org.chromium.components.embedder_support.util.UrlUtilities; +import org.chromium.content_public.browser.LoadUrlParams; +import org.chromium.content_public.browser.test.util.TestThreadUtils; +import org.chromium.content_public.browser.test.util.WebContentsUtils; +import org.chromium.net.test.EmbeddedTestServer; +import org.chromium.ui.base.PageTransition; +import org.chromium.ui.test.util.DisableAnimationsTestRule; +import org.chromium.ui.test.util.UiRestriction; +import org.chromium.ui.util.ColorUtils; +import org.chromium.ui.widget.ChromeImageView; +import org.chromium.ui.widget.ViewLookupCachingFrameLayout; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +// clang-format off +/** Tests for the {@link TabSwitcherAndStartSurfaceLayout} */ +@SuppressWarnings("ConstantConditions") +@RunWith(ChromeJUnit4ClassRunner.class) +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, + "force-fieldtrials=Study/Group"}) +@EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID + "<Study"}) +@Restriction( + {UiRestriction.RESTRICTION_TYPE_PHONE, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE}) +public class TabSwitcherAndStartSurfaceLayoutTest { + // clang-format on + private static final String BASE_PARAMS = "force-fieldtrial-params=" + + "Study.Group:soft-cleanup-delay/0/cleanup-delay/0/skip-slow-zooming/false" + + "/zooming-min-sdk-version/19/zooming-min-memory-mb/512"; + + // Tests need animation on. + @ClassRule + public static DisableAnimationsTestRule sEnableAnimationsRule = + new DisableAnimationsTestRule(true); + + @Rule + public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); + + @Rule + public ChromeRenderTestRule mRenderTestRule = + ChromeRenderTestRule.Builder.withPublicCorpus() + .setRevision(1) + .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_MOBILE_START) + .build(); + + @SuppressWarnings("FieldCanBeLocal") + private EmbeddedTestServer mTestServer; + private TabSwitcherAndStartSurfaceLayout mTabSwitcherAndStartSurfaceLayout; + private String mUrl; + private int mRepeat; + private List<WeakReference<Bitmap>> mAllBitmaps = new LinkedList<>(); + private Callback<Bitmap> mBitmapListener = + (bitmap) -> mAllBitmaps.add(new WeakReference<>(bitmap)); + private TabSwitcher.TabListDelegate mTabListDelegate; + + @Before + public void setUp() { + AccessibilityChecks.enable(); + mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext()); + // After setUp, Chrome is launched and has one NTP. + mActivityTestRule.startMainActivityFromLauncher(); + + Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(); + assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout); + mTabSwitcherAndStartSurfaceLayout = (TabSwitcherAndStartSurfaceLayout) layout; + mUrl = mTestServer.getURL("/chrome/test/data/android/navigate/simple.html"); + mRepeat = 1; + + mTabListDelegate = mTabSwitcherAndStartSurfaceLayout.getStartSurfaceForTesting() + .getGridTabListDelegate(); + mTabListDelegate.setBitmapCallbackForTesting(mBitmapListener); + assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting()); + + mActivityTestRule.getActivity().getTabContentManager().setCaptureMinRequestTimeForTesting( + 0); + + CriteriaHelper.pollUiThread( + mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized); + + assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting()); + } + + @After + public void tearDown() { + ActivityTestUtils.clearActivityOrientation(mActivityTestRule.getActivity()); + TestThreadUtils.runOnUiThreadBlocking( + ChromeNightModeTestUtils::tearDownNightModeAfterChromeActivityDestroyed); + TestThreadUtils.runOnUiThreadBlocking( + () -> ChromeAccessibilityUtil.get().setAccessibilityEnabledForTesting(null)); + } + + @Test + @MediumTest + @Feature({"RenderTest"}) + // clang-format off + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS}) + @DisableIf.Build(message = "Flaky on emulators; see https://crbug.com/1313747", + supported_abis_includes = "x86") + public void testRenderGrid_3WebTabs() throws IOException { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + prepareTabs(3, 0, "about:blank"); + // Make sure all thumbnails are there before switching tabs. + enterGTSWithThumbnailRetry(); + leaveTabSwitcher(cta); + + ChromeTabUtils.switchTabInCurrentTabModel(cta, 0); + enterTabSwitcher(cta); + mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "3_web_tabs"); + } + + @Test + @MediumTest + @Feature({"RenderTest"}) + // clang-format off + @CommandLineFlags.Add({BASE_PARAMS}) + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @DisabledTest(message = "https://crbug.com/1300962") + @DisableIf.Build(sdk_is_greater_than = O_MR1, message = "crbug.com/1077552") + public void testRenderGrid_10WebTabs() throws IOException { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + prepareTabs(10, 0, "about:blank"); + // Make sure all thumbnails are there before switching tabs. + enterGTSWithThumbnailRetry(); + leaveTabSwitcher(cta); + + ChromeTabUtils.switchTabInCurrentTabModel(cta, 0); + enterTabSwitcher(cta); + mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "10_web_tabs"); + } + + @Test + @MediumTest + @Feature({"RenderTest"}) + // clang-format off + @CommandLineFlags.Add({BASE_PARAMS}) + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @DisabledTest(message = "https://crbug.com/1139807") + @DisableIf.Build(sdk_is_greater_than = O_MR1, message = "crbug.com/1077552") + public void testRenderGrid_10WebTabs_InitialScroll() throws IOException { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + prepareTabs(10, 0, "about:blank"); + assertEquals(9, cta.getTabModelSelector().getCurrentModel().index()); + enterGTSWithThumbnailRetry(); + // Make sure the grid tab switcher is scrolled down to show the selected tab. + mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "10_web_tabs-select_last"); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS}) + public void testSwitchTabModel_ScrollToSelectedTab() throws IOException { + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + prepareTabs(10, 0, "about:blank"); + assertEquals(9, cta.getCurrentTabModel().index()); + createTabs(cta, true, 1); + CriteriaHelper.pollUiThread(() -> cta.getCurrentTabModel().isIncognito()); + enterTabSwitcher(cta); + switchTabModel(cta, false); + TabUiTestHelper.verifyAllTabsHaveThumbnail(cta.getCurrentTabModel()); + // Make sure the grid tab switcher is scrolled down to show the selected tab. + onView(tabSwitcherViewMatcher()).check((v, noMatchException) -> { + if (noMatchException != null) throw noMatchException; + assertTrue(v instanceof RecyclerView); + LinearLayoutManager layoutManager = + (LinearLayoutManager) ((RecyclerView) v).getLayoutManager(); + assertEquals(9, layoutManager.findLastVisibleItemPosition()); + }); + } + + @Test + @MediumTest + @Feature({"RenderTest"}) + // clang-format off + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS}) + @DisableIf.Build(message = "Flaky on emulators; see https://crbug.com/1324721 " + + "and crbug.com/1077552", supported_abis_includes = "x86") + public void testRenderGrid_Incognito() throws IOException { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + // Prepare some incognito tabs and enter tab switcher. + prepareTabs(1, 3, "about:blank"); + assertTrue(cta.getCurrentTabModel().isIncognito()); + // Make sure all thumbnails are there before switching tabs. + enterGTSWithThumbnailRetry(); + leaveTabSwitcher(cta); + + ChromeTabUtils.switchTabInCurrentTabModel(cta, 0); + enterTabSwitcher(cta); + ChromeRenderTestRule.sanitize(cta.findViewById(R.id.tab_list_view)); + mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "3_incognito_web_tabs"); + } + + @Test + @MediumTest + @Feature({"RenderTest"}) + @DisableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION}) + // clang-format off + @CommandLineFlags.Add({BASE_PARAMS}) + @DisableIf.Build(message = "Flaky on emulators; see https://crbug.com/1313747", + supported_abis_includes = "x86") + public void testRenderGrid_3NativeTabs() throws IOException { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + // Prepare some incognito native tabs and enter tab switcher. + // NTP in incognito mode is chosen for its consistency in look, and we don't have to mock + // away the MV tiles, login promo, feed, etc. + prepareTabs(1, 3, null); + assertTrue(cta.getCurrentTabModel().isIncognito()); + // Make sure all thumbnails are there before switching tabs. + enterGTSWithThumbnailRetry(); + leaveTabSwitcher(cta); + // Espresso.pressBack(); + + ChromeTabUtils.switchTabInCurrentTabModel(cta, 0); + enterTabSwitcher(cta); + mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "3_incognito_ntps"); + } + + @Test + @MediumTest + @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + @CommandLineFlags.Add({BASE_PARAMS}) + public void testTabToGridFromLiveTab() throws InterruptedException { + assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); + assertEquals(0, mTabListDelegate.getSoftCleanupDelayForTesting()); + assertEquals(0, mTabListDelegate.getCleanupDelayForTesting()); + + prepareTabs(2, 0, NTP_URL); + testTabToGrid(mUrl); + } + + @Test + @MediumTest + @EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study") + @CommandLineFlags.Add({BASE_PARAMS}) + @DisabledTest(message = "crbug.com/991852 This test is flaky") + public void testTabToGridFromLiveTabAnimation() throws InterruptedException { + assertTrue(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); + + prepareTabs(2, 0, NTP_URL); + testTabToGrid(mUrl); + } + + @Test + @MediumTest + @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + @CommandLineFlags.Add({BASE_PARAMS + "/soft-cleanup-delay/2000/cleanup-delay/10000"}) + public void testTabToGridFromLiveTabWarm() throws InterruptedException { + assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); + assertEquals(2000, mTabListDelegate.getSoftCleanupDelayForTesting()); + assertEquals(10000, mTabListDelegate.getCleanupDelayForTesting()); + + prepareTabs(2, 0, NTP_URL); + testTabToGrid(mUrl); + } + + @Test + @MediumTest + @EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study") + @CommandLineFlags.Add({BASE_PARAMS + "/soft-cleanup-delay/2000/cleanup-delay/10000"}) + @MinAndroidSdkLevel(Build.VERSION_CODES.M) // TODO(crbug.com/997065#c8): remove SDK restriction. + @DisabledTest(message = "https://crbug.com/1207875") + public void testTabToGridFromLiveTabWarmAnimation() throws InterruptedException { + assertTrue(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); + prepareTabs(2, 0, NTP_URL); + testTabToGrid(mUrl); + } + + @Test + @MediumTest + @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + @CommandLineFlags.Add({BASE_PARAMS + "/cleanup-delay/10000"}) + public void testTabToGridFromLiveTabSoft() throws InterruptedException { + assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); + assertEquals(0, mTabListDelegate.getSoftCleanupDelayForTesting()); + assertEquals(10000, mTabListDelegate.getCleanupDelayForTesting()); + + prepareTabs(2, 0, NTP_URL); + testTabToGrid(mUrl); + } + + @Test + @MediumTest + @EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study") + @CommandLineFlags.Add({BASE_PARAMS + "/cleanup-delay/10000"}) + @MinAndroidSdkLevel(Build.VERSION_CODES.M) // TODO(crbug.com/997065#c8): remove SDK restriction. + @DisabledTest(message = "https://crbug.com/1272561") + public void testTabToGridFromLiveTabSoftAnimation() throws InterruptedException { + assertTrue(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); + prepareTabs(2, 0, NTP_URL); + testTabToGrid(mUrl); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS}) + @FlakyTest(message = "crbug.com/1130830") + public void testTabToGridFromNtp() throws InterruptedException { + prepareTabs(2, 0, NTP_URL); + testTabToGrid(NTP_URL); + } + + /** + * Make Chrome have {@code numTabs} of regular Tabs and {@code numIncognitoTabs} of incognito + * tabs with {@code url} loaded, and assert no bitmap fetching occurred. + * + * @param numTabs The number of regular tabs. + * @param numIncognitoTabs The number of incognito tabs. + * @param url The URL to load. + */ + private void prepareTabs(int numTabs, int numIncognitoTabs, @Nullable String url) { + int oldCount = mTabListDelegate.getBitmapFetchCountForTesting(); + TabUiTestHelper.prepareTabsWithThumbnail(mActivityTestRule, numTabs, numIncognitoTabs, url); + assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting() - oldCount); + } + + private void testTabToGrid(String fromUrl) throws InterruptedException { + mActivityTestRule.loadUrl(fromUrl); + + final int initCount = getCaptureCount(); + + for (int i = 0; i < mRepeat; i++) { + enterGTSWithThumbnailChecking(); + leaveGTSAndVerifyThumbnailsAreReleased(); + } + checkFinalCaptureCount(false, initCount); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + public void testGridToTabToCurrentNTP() throws InterruptedException { + prepareTabs(1, 0, NTP_URL); + testGridToTab(false, false); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + public void testGridToTabToOtherNTP() throws InterruptedException { + prepareTabs(2, 0, NTP_URL); + testGridToTab(true, false); + } + + @Test + @MediumTest + @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + public void testGridToTabToCurrentLive() throws InterruptedException { + assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); + prepareTabs(1, 0, mUrl); + testGridToTab(false, false); + } + + // From https://stackoverflow.com/a/21505193 + private static boolean isEmulator() { + return Build.FINGERPRINT.startsWith("generic") || Build.FINGERPRINT.startsWith("unknown") + || Build.MODEL.contains("google_sdk") || Build.MODEL.contains("Emulator") + || Build.MODEL.contains("Android SDK built for x86") + || Build.MANUFACTURER.contains("Genymotion") + || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) + || "google_sdk".equals(Build.PRODUCT); + } + + /** + * Test that even if there are tabs with stuck pending thumbnail readback, it doesn't block + * thumbnail readback for the current tab. + */ + @Test + @MediumTest + @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + // clang-format off + @DisableIf.Build(message = "Flaky on emulators; see https://crbug.com/1094492", + supported_abis_includes = "x86") + public void testGridToTabToCurrentLiveDetached() throws Exception { + // clang-format on + assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); + // This works on emulators but not on real devices. See crbug.com/986047. + if (!isEmulator()) return; + + for (int i = 0; i < 10; i++) { + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + // Quickly create some tabs, navigate to web pages, and don't wait for thumbnail + // capturing. + mActivityTestRule.loadUrl(mUrl); + ChromeTabUtils.newTabFromMenu( + InstrumentationRegistry.getInstrumentation(), cta, false, false); + mActivityTestRule.loadUrl(mUrl); + // Hopefully we are in a state where some pending readbacks are stuck because their tab + // is not attached to the view. + if (cta.getTabContentManager().getPendingReadbacksForTesting() > 0) { + break; + } + + // Restart Chrome. + // Although we're destroying the activity, the Application will still live on since its + // in the same process as this test. + TestThreadUtils.runOnUiThreadBlocking(() -> cta.getTabModelSelector().closeAllTabs()); + TabUiTestHelper.finishActivity(cta); + mActivityTestRule.startMainActivityOnBlankPage(); + assertEquals(1, mActivityTestRule.tabsCount(false)); + } + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + assertNotEquals(0, cta.getTabContentManager().getPendingReadbacksForTesting()); + assertEquals(1, cta.getCurrentTabModel().index()); + + // The last tab should still get thumbnail even though readbacks for other tabs are stuck. + enterTabSwitcher(cta); + TabUiTestHelper.checkThumbnailsExist(cta.getTabModelSelector().getCurrentTab()); + } + + @Test + @MediumTest + @EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study") + @DisabledTest(message = "crbug.com/993201 This test fails deterministically on Nexus 5X") + public void testGridToTabToCurrentLiveWithAnimation() throws InterruptedException { + assertTrue(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); + prepareTabs(1, 0, mUrl); + testGridToTab(false, false); + } + + @Test + @MediumTest + @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + @DisabledTest(message = "crbug.com/1313972") + public void testGridToTabToOtherLive() throws InterruptedException { + assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); + prepareTabs(2, 0, mUrl); + testGridToTab(true, false); + } + + @Test + @MediumTest + @EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study") + @DisabledTest(message = "crbug.com/993201 This test fails deterministically on Nexus 5X") + public void testGridToTabToOtherLiveWithAnimation() throws InterruptedException { + assertTrue(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); + prepareTabs(2, 0, mUrl); + testGridToTab(true, false); + } + + @Test + @MediumTest + @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + @DisabledTest(message = "crbug.com/1237623 test is flaky") + public void testGridToTabToOtherFrozen() throws InterruptedException { + assertFalse(TabUiFeatureUtilities.isTabToGtsAnimationEnabled()); + prepareTabs(2, 0, mUrl); + testGridToTab(true, true); + } + + private void testGridToTab(boolean switchToAnotherTab, boolean killBeforeSwitching) + throws InterruptedException { + final int initCount = getCaptureCount(); + + for (int i = 0; i < mRepeat; i++) { + enterGTSWithThumbnailChecking(); + + final int index = mActivityTestRule.getActivity().getCurrentTabModel().index(); + final int targetIndex = switchToAnotherTab ? 1 - index : index; + Tab targetTab = + mActivityTestRule.getActivity().getCurrentTabModel().getTabAt(targetIndex); + if (killBeforeSwitching) { + WebContentsUtils.simulateRendererKilled(targetTab.getWebContents()); + } + + if (switchToAnotherTab) { + waitForCaptureRateControl(); + } + int count = getCaptureCount(); + onView(tabSwitcherViewMatcher()).perform(actionOnItemAtPosition(targetIndex, click())); + CriteriaHelper.pollUiThread(() -> { + boolean doneHiding = + !mActivityTestRule.getActivity().getLayoutManager().isLayoutVisible( + LayoutType.TAB_SWITCHER); + if (!doneHiding) { + // Before overview hiding animation is done, the tab index should not change. + Criteria.checkThat(mActivityTestRule.getActivity().getCurrentTabModel().index(), + Matchers.is(index)); + } + return doneHiding; + }, "Overview not hidden yet"); + int delta; + if (switchToAnotherTab + && !UrlUtilities.isNTPUrl(mActivityTestRule.getActivity() + .getCurrentWebContents() + .getLastCommittedUrl())) { + // Capture the original tab. + delta = 1; + } else { + delta = 0; + } + checkCaptureCount(delta, count); + } + checkFinalCaptureCount(switchToAnotherTab, initCount); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS}) + public void testRestoredTabsDontFetch() throws Exception { + prepareTabs(2, 0, mUrl); + int oldCount = mTabListDelegate.getBitmapFetchCountForTesting(); + + // Restart Chrome. + // Although we're destroying the activity, the Application will still live on since its in + // the same process as this test. + TabUiTestHelper.finishActivity(mActivityTestRule.getActivity()); + mActivityTestRule.startMainActivityOnBlankPage(); + assertEquals(3, mActivityTestRule.tabsCount(false)); + + Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(); + assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout); + mTabSwitcherAndStartSurfaceLayout = (TabSwitcherAndStartSurfaceLayout) layout; + assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting() - oldCount); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS}) + public void testInvisibleTabsDontFetch() throws InterruptedException { + // Open a few new tabs. + final int count = mTabListDelegate.getBitmapFetchCountForTesting(); + for (int i = 0; i < 3; i++) { + MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), + mActivityTestRule.getActivity(), org.chromium.chrome.R.id.new_tab_menu_id); + } + // Fetching might not happen instantly. + Thread.sleep(1000); + + // No fetching should happen. + assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting() - count); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/soft-cleanup-delay/2000/cleanup-delay/10000"}) + @FlakyTest(message = "crbug.com/1130830") + public void testInvisibleTabsDontFetchWarm() throws InterruptedException { + // Get the GTS in the warm state. + prepareTabs(2, 0, NTP_URL); + testTabToGrid(NTP_URL); + + Thread.sleep(1000); + + // Open a few new tabs. + final int count = mTabListDelegate.getBitmapFetchCountForTesting(); + for (int i = 0; i < 3; i++) { + MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), + mActivityTestRule.getActivity(), org.chromium.chrome.R.id.new_tab_menu_id); + } + // Fetching might not happen instantly. + Thread.sleep(1000); + + // No fetching should happen. + assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting() - count); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/cleanup-delay/10000"}) + @FlakyTest(message = "crbug.com/1130830") + public void testInvisibleTabsDontFetchSoft() throws InterruptedException { + // Get the GTS in the soft cleaned up state. + prepareTabs(2, 0, NTP_URL); + testTabToGrid(NTP_URL); + + Thread.sleep(1000); + + // Open a few new tabs. + final int count = mTabListDelegate.getBitmapFetchCountForTesting(); + for (int i = 0; i < 3; i++) { + MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), + mActivityTestRule.getActivity(), org.chromium.chrome.R.id.new_tab_menu_id); + } + // Fetching might not happen instantly. + Thread.sleep(1000); + + // No fetching should happen. + assertEquals(0, mTabListDelegate.getBitmapFetchCountForTesting() - count); + } + + @Test + @MediumTest + // clang-format off + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS}) + @DisabledTest(message = "http://crbug/1005865 - Test was previously flaky but only on bots." + + "Was not locally reproducible. Disabling until verified that it's deflaked on bots.") + public void testIncognitoEnterGts() throws InterruptedException { + // clang-format on + prepareTabs(1, 1, null); + enterGTSWithThumbnailChecking(); + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); + + onView(tabSwitcherViewMatcher()).perform(actionOnItemAtPosition(0, click())); + LayoutTestUtils.waitForLayout( + mActivityTestRule.getActivity().getLayoutManager(), LayoutType.BROWSING); + + enterGTSWithThumbnailChecking(); + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS}) + // clang-format off + @DisableIf.Build(message = "Flaky on Android P, see https://crbug.com/1063991", + sdk_is_greater_than = VERSION_CODES.O_MR1, sdk_is_less_than = VERSION_CODES.Q) + public void testIncognitoToggle_tabCount() { + // clang-format on + mActivityTestRule.loadUrl(mUrl); + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + + // Prepare two incognito tabs and enter tab switcher. + createTabs(cta, true, 2); + enterTabSwitcher(cta); + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(2)); + + for (int i = 0; i < mRepeat; i++) { + switchTabModel(cta, false); + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); + + switchTabModel(cta, true); + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(2)); + } + leaveGTSAndVerifyThumbnailsAreReleased(); + } + + @Test + @MediumTest + // clang-format off + @CommandLineFlags.Add({BASE_PARAMS}) + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @DisabledTest(message = "https://crbug.com/1233169") + public void testIncognitoToggle_thumbnailFetchCount() throws InterruptedException { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + int oldFetchCount = mTabListDelegate.getBitmapFetchCountForTesting(); + + // Prepare two incognito tabs and enter tab switcher. + prepareTabs(1, 2, mUrl); + enterGTSWithThumbnailChecking(); + + int currentFetchCount = mTabListDelegate.getBitmapFetchCountForTesting(); + assertEquals(2, currentFetchCount - oldFetchCount); + oldFetchCount = currentFetchCount; + int oldHistogramRecord = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_JPEG); + + for (int i = 0; i < mRepeat; i++) { + switchTabModel(cta, false); + currentFetchCount = mTabListDelegate.getBitmapFetchCountForTesting(); + int currentHistogramRecord = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_JPEG); + assertEquals(1, currentFetchCount - oldFetchCount); + assertEquals(1, currentHistogramRecord - oldHistogramRecord); + oldFetchCount = currentFetchCount; + oldHistogramRecord = currentHistogramRecord; + + switchTabModel(cta, true); + currentFetchCount = mTabListDelegate.getBitmapFetchCountForTesting(); + currentHistogramRecord = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_JPEG); + assertEquals(2, currentFetchCount - oldFetchCount); + assertEquals(2, currentHistogramRecord - oldHistogramRecord); + oldFetchCount = currentFetchCount; + oldHistogramRecord = currentHistogramRecord; + } + leaveGTSAndVerifyThumbnailsAreReleased(); + } + + @Test + @MediumTest + // clang-format off + @CommandLineFlags.Add({BASE_PARAMS}) + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID, + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + public void testUrlUpdatedNotCrashing_ForUndoableClosedTab() throws Exception { + // clang-format on + mActivityTestRule.getActivity().getSnackbarManager().disableForTesting(); + prepareTabs(2, 0, null); + enterGTSWithThumbnailChecking(); + + Tab tab = mActivityTestRule.getActivity().getTabModelSelector().getCurrentTab(); + TestThreadUtils.runOnUiThreadBlocking(() -> { + mActivityTestRule.getActivity().getTabModelSelector().getCurrentModel().closeTab( + tab, false, false, true); + }); + mActivityTestRule.loadUrlInTab( + mUrl, PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR, tab); + } + + @Test + @MediumTest + // clang-format off + @CommandLineFlags.Add({BASE_PARAMS}) + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID, + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + public void testUrlUpdatedNotCrashing_ForTabNotInCurrentModel() throws Exception { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + prepareTabs(1, 1, null); + enterGTSWithThumbnailChecking(); + + Tab tab = cta.getTabModelSelector().getCurrentTab(); + switchTabModel(cta, false); + + mActivityTestRule.loadUrlInTab( + mUrl, PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR, tab); + } + + private int getTabCountInCurrentTabModel() { + return mActivityTestRule.getActivity().getTabModelSelector().getCurrentModel().getCount(); + } + + @Test + @MediumTest + @Feature("TabSuggestion") + // clang-format off + @EnableFeatures({ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study", + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + + "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0/" + + "thumbnail_aspect_ratio/1.0"}) + public void testTabSuggestionMessageCard_dismiss() throws InterruptedException { + // clang-format on + prepareTabs(3, 0, null); + + // TODO(meiliang): Avoid using static variable for tracking state, + // TabSuggestionMessageService.isSuggestionAvailableForTesting(). Instead, we can add a + // dummy MessageObserver to track the availability of the suggestions. + CriteriaHelper.pollUiThread(TabSuggestionMessageService::isSuggestionAvailableForTesting); + CriteriaHelper.pollUiThread( + () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(3))); + + enterGTSWithThumbnailChecking(); + + // TODO(meiliang): Avoid using static variable for tracking state, + // TabSwitcherCoordinator::hasAppendedMessagesForTesting. Instead, we can query the number + // of items that the inner model of the TabSwitcher has. + CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); + onView(withId(R.id.tab_grid_message_item)).check(matches(isDisplayed())); + onView(allOf(withId(R.id.close_button), withParent(withId(R.id.tab_grid_message_item)))) + .perform(click()); + onView(withId(R.id.tab_grid_message_item)).check(doesNotExist()); + } + + @Test + @MediumTest + @Feature("TabSuggestion") + // clang-format off + @EnableFeatures({ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study", + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + + "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0" + + "/thumbnail_aspect_ratio/1.0"}) + public void testTabSuggestionMessageCard_review() throws InterruptedException { + // clang-format on + prepareTabs(3, 0, null); + + CriteriaHelper.pollUiThread(TabSuggestionMessageService::isSuggestionAvailableForTesting); + CriteriaHelper.pollUiThread( + () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(3))); + + enterGTSWithThumbnailChecking(); + + CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); + onView(withId(R.id.tab_grid_message_item)).check(matches(isDisplayed())); + onView(allOf(withId(R.id.action_button), withParent(withId(R.id.tab_grid_message_item)))) + .perform(click()); + + TabSelectionEditorTestingRobot tabSelectionEditorTestingRobot = + new TabSelectionEditorTestingRobot(); + tabSelectionEditorTestingRobot.resultRobot.verifyTabSelectionEditorIsVisible(); + + Espresso.pressBack(); + tabSelectionEditorTestingRobot.resultRobot.verifyTabSelectionEditorIsHidden(); + } + + @Test + @MediumTest + @Feature("TabSuggestion") + @DisabledTest(message = "https://crbug.com/1230107, crbug.com/1130621") + // clang-format off + @EnableFeatures({ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study", + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + + "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0/" + + "thumbnail_aspect_ratio/1.0"}) + public void testShowOnlyOneTabSuggestionMessageCard_withSoftCleanup() + throws InterruptedException { + // clang-format on + verifyOnlyOneTabSuggestionMessageCardIsShowing(); + } + + @Test + @MediumTest + @Feature("TabSuggestion") + // clang-format off + @EnableFeatures({ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study", + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + + "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0/" + + "thumbnail_aspect_ratio/1.0"}) + @DisabledTest(message = "https://crbug.com/1198484, crbug.com/1130621") + public void testShowOnlyOneTabSuggestionMessageCard_withHardCleanup() + throws InterruptedException { + // clang-format on + verifyOnlyOneTabSuggestionMessageCardIsShowing(); + } + + @Test + @MediumTest + @Feature("TabSuggestion") + // clang-format off + @EnableFeatures({ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study", + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + + "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0/" + + "thumbnail_aspect_ratio/1.0"}) + @DisabledTest(message = "https://crbug.com/1311825") + public void testTabSuggestionMessageCardDismissAfterTabClosing() throws InterruptedException { + // clang-format on + prepareTabs(3, 0, mUrl); + CriteriaHelper.pollUiThread(TabSuggestionMessageService::isSuggestionAvailableForTesting); + CriteriaHelper.pollUiThread( + () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(3))); + + enterGTSWithThumbnailChecking(); + CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); + onView(withId(R.id.tab_grid_message_item)).check(matches(isDisplayed())); + + closeFirstTabInTabSwitcher(); + + CriteriaHelper.pollUiThread( + () -> !TabSuggestionMessageService.isSuggestionAvailableForTesting()); + CriteriaHelper.pollUiThread( + () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(2))); + + onView(tabSwitcherViewMatcher()) + .check(TabUiTestHelper.ChildrenCountAssertion.havingTabSuggestionMessageCardCount( + 0)); + onView(withId(R.id.tab_grid_message_item)).check(doesNotExist()); + } + + @Test + @MediumTest + @Feature("TabSuggestion") + // clang-format off + @EnableFeatures({ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study", + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + + "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0/" + + "thumbnail_aspect_ratio/1.0"}) + public void testTabSuggestionMessageCard_orientation() throws InterruptedException { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + prepareTabs(3, 0, null); + + CriteriaHelper.pollUiThread(TabSuggestionMessageService::isSuggestionAvailableForTesting); + CriteriaHelper.pollUiThread( + () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(3))); + + enterGTSWithThumbnailChecking(); + CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); + + // Force portrait mode since the device can be wrongly in landscape. See crbug/1063639. + ActivityTestUtils.rotateActivityToOrientation(cta, Configuration.ORIENTATION_PORTRAIT); + + onView(tabSwitcherViewMatcher()) + .check(MessageCardWidthAssertion.checkMessageItemSpanSize(3, 2)); + + ActivityTestUtils.rotateActivityToOrientation(cta, Configuration.ORIENTATION_LANDSCAPE); + + onView(tabSwitcherViewMatcher()) + .check(MessageCardWidthAssertion.checkMessageItemSpanSize(3, 3)); + } + + private static class MessageCardWidthAssertion implements ViewAssertion { + private int mIndex; + private int mSpanCount; + + public static MessageCardWidthAssertion checkMessageItemSpanSize(int index, int spanCount) { + return new MessageCardWidthAssertion(index, spanCount); + } + + public MessageCardWidthAssertion(int index, int spanCount) { + mIndex = index; + mSpanCount = spanCount; + } + + @Override + public void check(View view, NoMatchingViewException noMatchException) { + if (noMatchException != null) throw noMatchException; + float tabListPadding = + TabUiThemeProvider.getTabGridCardMarginForDialogAnimation(view.getContext()); + float messageCardMargin = + TabUiThemeProvider.getMessageCardMarginDimension(view.getContext()); + + assertTrue(view instanceof RecyclerView); + RecyclerView recyclerView = (RecyclerView) view; + GridLayoutManager layoutManager = (GridLayoutManager) recyclerView.getLayoutManager(); + assertEquals(mSpanCount, layoutManager.getSpanCount()); + + RecyclerView.ViewHolder messageItemViewHolder = + recyclerView.findViewHolderForAdapterPosition(mIndex); + assertNotNull(messageItemViewHolder); + assertEquals(TabProperties.UiType.MESSAGE, messageItemViewHolder.getItemViewType()); + View messageItemView = messageItemViewHolder.itemView; + + // The message card item width should always be recyclerView width minus padding and + // margin. + assertEquals(recyclerView.getWidth() - 2 * tabListPadding - 2 * messageCardMargin, + (float) messageItemView.getWidth(), 1.0f); + } + } + + @Test + @MediumTest + @Feature("NewTabTile") + // clang-format off + @DisableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION, + ChromeFeatureList.CLOSE_TAB_SUGGESTIONS}) + @CommandLineFlags.Add({BASE_PARAMS + "/tab_grid_layout_android_new_tab_tile/false" + + "/tab_grid_layout_android_new_tab/false"}) + public void testNewTabTile_Disabled() throws InterruptedException { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + prepareTabs(2, 0, null); + + enterGTSWithThumbnailChecking(); + + onView(withId(R.id.new_tab_tile)).check(doesNotExist()); + verifyTabSwitcherCardCount(cta, 2); + + switchTabModel(cta, true); + onView(withId(R.id.new_tab_tile)).check(doesNotExist()); + verifyTabSwitcherCardCount(cta, 0); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS}) + @DisabledTest(message = "https://crbug.com/1122657") + public void testThumbnailAspectRatio_default() { + prepareTabs(2, 0, mUrl); + enterTabSwitcher(mActivityTestRule.getActivity()); + onView(tabSwitcherViewMatcher()) + .check(ThumbnailAspectRatioAssertion.havingAspectRatio(1.0)); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/0.75"}) + @DisabledTest(message = "https://crbug.com/1122657") + public void testThumbnailAspectRatio_point75() { + prepareTabs(2, 0, mUrl); + enterTabSwitcher(mActivityTestRule.getActivity()); + onView(tabSwitcherViewMatcher()) + .check(ThumbnailAspectRatioAssertion.havingAspectRatio(0.75)); + leaveGTSAndVerifyThumbnailsAreReleased(); + + Tab tab = mActivityTestRule.getActivity().getTabModelSelector().getCurrentTab(); + mActivityTestRule.loadUrlInTab( + NTP_URL, PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR, tab); + enterTabSwitcher(mActivityTestRule.getActivity()); + onView(tabSwitcherViewMatcher()) + .check(ThumbnailAspectRatioAssertion.havingAspectRatio(0.75)); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/2.0/allow_to_refetch/true"}) + @DisabledTest(message = "Flaky - https://crbug.com/1124041") + public void testThumbnailAspectRatio_fromTwoToPoint75() throws Exception { + prepareTabs(2, 0, mUrl); + enterTabSwitcher(mActivityTestRule.getActivity()); + onView(tabSwitcherViewMatcher()) + .check(ThumbnailAspectRatioAssertion.havingAspectRatio(2.0)); + TabModel currentTabModel = + mActivityTestRule.getActivity().getTabModelSelector().getCurrentModel(); + for (int i = 0; i < currentTabModel.getCount(); i++) { + TabUiTestHelper.checkThumbnailsExist(currentTabModel.getTabAt(i)); + } + leaveGTSAndVerifyThumbnailsAreReleased(); + + simulateAspectRatioChangedToPoint75(); + verifyAllThumbnailHasAspectRatio(0.75); + + enterTabSwitcher(mActivityTestRule.getActivity()); + onView(tabSwitcherViewMatcher()) + .check(ThumbnailAspectRatioAssertion.havingAspectRatio(2.0)); + TabUiTestHelper.finishActivity(mActivityTestRule.getActivity()); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS}) + @DisabledTest(message = "https://crbug.com/1138739") + public void testThumbnailFetchingResult_defaultAspectRatio() throws Exception { + prepareTabs(2, 0, mUrl); + int oldJpegCount = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_JPEG); + int oldEtc1Count = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_ETC1); + int oldNothingCount = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_NOTHING); + int oldDifferentAspectRatioJpegCount = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG); + + enterTabSwitcher(mActivityTestRule.getActivity()); + int currentJpegCount = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_JPEG); + int currentEtc1Count = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_ETC1); + int currentNothingCount = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_NOTHING); + int currentDifferentAspectRatioJpegCount = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG); + + assertEquals(1, currentJpegCount - oldJpegCount); + assertEquals(0, currentEtc1Count - oldEtc1Count); + assertEquals(0, currentDifferentAspectRatioJpegCount - oldDifferentAspectRatioJpegCount); + // Get thumbnail from a live layer. + assertEquals(1, currentNothingCount - oldNothingCount); + + oldJpegCount = currentJpegCount; + oldEtc1Count = currentEtc1Count; + oldNothingCount = currentNothingCount; + oldDifferentAspectRatioJpegCount = currentDifferentAspectRatioJpegCount; + + TabModel currentTabModel = + mActivityTestRule.getActivity().getTabModelSelector().getCurrentModel(); + for (int i = 0; i < currentTabModel.getCount(); i++) { + TabUiTestHelper.checkThumbnailsExist(currentTabModel.getTabAt(i)); + } + + TabUiTestHelper.finishActivity(mActivityTestRule.getActivity()); + mActivityTestRule.startMainActivityFromLauncher(); + + enterTabSwitcher(mActivityTestRule.getActivity()); + assertEquals(2, + RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_JPEG) + - oldJpegCount); + assertEquals(0, + RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_ETC1) + - oldEtc1Count); + assertEquals(0, + RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_NOTHING) + - oldNothingCount); + assertEquals(0, + RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG) + - oldDifferentAspectRatioJpegCount); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/2.0/allow_to_refetch/true"}) + @DisabledTest(message = "http://crbug/1119527 - Flaky on bots.") + public void testThumbnailFetchingResult_changingAspectRatio() throws Exception { + prepareTabs(2, 0, mUrl); + int oldJpegCount = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_JPEG); + int oldEtc1Count = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_ETC1); + int oldNothingCount = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_NOTHING); + int oldDifferentAspectRatioJpegCount = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG); + + enterTabSwitcher(mActivityTestRule.getActivity()); + int currentJpegCount = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_JPEG); + int currentEtc1Count = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_ETC1); + int currentNothingCount = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_NOTHING); + int currentDifferentAspectRatioJpegCount = RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG); + + assertEquals(1, currentJpegCount - oldJpegCount); + assertEquals(0, currentEtc1Count - oldEtc1Count); + assertEquals(0, currentDifferentAspectRatioJpegCount - oldDifferentAspectRatioJpegCount); + // Get thumbnail from a live layer. + assertEquals(1, currentNothingCount - oldNothingCount); + + oldJpegCount = currentJpegCount; + oldEtc1Count = currentEtc1Count; + oldNothingCount = currentNothingCount; + oldDifferentAspectRatioJpegCount = currentDifferentAspectRatioJpegCount; + + onView(tabSwitcherViewMatcher()) + .check(ThumbnailAspectRatioAssertion.havingAspectRatio(2.0)); + + TabModel currentTabModel = + mActivityTestRule.getActivity().getTabModelSelector().getCurrentModel(); + for (int i = 0; i < currentTabModel.getCount(); i++) { + TabUiTestHelper.checkThumbnailsExist(currentTabModel.getTabAt(i)); + } + leaveGTSAndVerifyThumbnailsAreReleased(); + + simulateAspectRatioChangedToPoint75(); + verifyAllThumbnailHasAspectRatio(0.75); + + enterTabSwitcher(mActivityTestRule.getActivity()); + assertEquals(0, + RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_JPEG) + - oldJpegCount); + assertEquals(2, + RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG) + - oldDifferentAspectRatioJpegCount); + assertEquals(0, + RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_ETC1) + - oldEtc1Count); + assertEquals(0, + RecordHistogram.getHistogramValueCountForTesting( + TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, + TabContentManager.ThumbnailFetchingResult.GOT_NOTHING) + - oldNothingCount); + onView(tabSwitcherViewMatcher()) + .check(ThumbnailAspectRatioAssertion.havingAspectRatio(2.0)); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS}) + public void testRecycling_defaultAspectRatio() { + prepareTabs(10, 0, mUrl); + ChromeTabUtils.switchTabInCurrentTabModel(mActivityTestRule.getActivity(), 0); + enterTabSwitcher(mActivityTestRule.getActivity()); + onView(tabSwitcherViewMatcher()).perform(RecyclerViewActions.scrollToPosition(9)); + } + + @Test + @MediumTest + // clang-format off + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/0.75"}) + @DisabledTest(message = "http://crbug/1092987") + public void testRecycling_aspectRatioPoint75() { + // clang-format on + prepareTabs(10, 0, mUrl); + ChromeTabUtils.switchTabInCurrentTabModel(mActivityTestRule.getActivity(), 0); + enterTabSwitcher(mActivityTestRule.getActivity()); + onView(tabSwitcherViewMatcher()).perform(RecyclerViewActions.scrollToPosition(9)); + } + + @Test + @MediumTest + // clang-format off + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/0.75"}) + public void testExpandTab_withAspectRatioPoint75() { + // clang-format on + prepareTabs(1, 0, mUrl); + enterTabSwitcher(mActivityTestRule.getActivity()); + leaveGTSAndVerifyThumbnailsAreReleased(); + } + + @Test + @MediumTest + @Feature({"RenderTest"}) + // clang-format off + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/thumbnail_aspect_ratio/1.0"}) + @DisabledTest(message = "https://crbug.com/1205952") + public void testRenderGrid_withAspectRatioOfOne() throws IOException { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + prepareTabs(3, 0, "about:blank"); + TabModel normalTabModel = cta.getTabModelSelector().getModel(false); + List<Tab> tabGroup = new ArrayList<>( + Arrays.asList(normalTabModel.getTabAt(0), normalTabModel.getTabAt(1))); + createTabGroup(cta, false, tabGroup); + // Make sure all tabs have thumbnail. + enterGTSWithThumbnailRetry(); + mRenderTestRule.render(cta.findViewById(R.id.tab_list_view), "aspect_ratio_of_one"); + } + + @Test + @MediumTest + @Feature("NewTabVariation") + @DisabledTest(message = "https://crbug.com/1144666") + // clang-format off + @Features.DisableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION, + ChromeFeatureList.CLOSE_TAB_SUGGESTIONS}) + @CommandLineFlags.Add({BASE_PARAMS + "/tab_grid_layout_android_new_tab/NewTabVariation"}) + public void testNewTabVariation() { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + prepareTabs(2, 0, null); + enterTabSwitcher(cta); + verifyTabModelTabCount(cta, 2, 0); + checkNewTabVariationVisibility(true); + + createTabs(cta, true, 1); + verifyTabModelTabCount(cta, 2, 1); + enterTabSwitcher(cta); + checkNewTabVariationVisibility(false); + + switchTabModel(cta, false); + checkNewTabVariationVisibility(false); + + switchTabModel(cta, true); + checkNewTabVariationVisibility(false); + + closeFirstTabInTabSwitcher(); + verifyTabModelTabCount(cta, 2, 0); + checkNewTabVariationVisibility(true); + + createTabs(cta, true, 2); + verifyTabModelTabCount(cta, 2, 2); + enterTabSwitcher(cta); + checkNewTabVariationVisibility(false); + + MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), cta, + R.id.close_all_incognito_tabs_menu_id); + verifyTabModelTabCount(cta, 2, 0); + checkNewTabVariationVisibility(true); + } + + private void checkNewTabVariationVisibility(boolean isVisible) { + if (isVisible) { + onView(allOf(withId(R.id.incognito_toggle_tabs), + withParent(withId(R.id.tab_switcher_toolbar)))) + .check(matches(withEffectiveVisibility(GONE))); + onView(allOf(withId(R.id.new_tab_button), + withParent(withId(R.id.tab_switcher_toolbar)))) + .check(matches(withEffectiveVisibility(GONE))); + onView(allOf(withId(R.id.new_tab_view), withParent(withId(R.id.tab_switcher_toolbar)))) + .check(matches(isDisplayed())); + } else { + onView(allOf(withId(R.id.incognito_toggle_tabs), + withParent(withId(R.id.tab_switcher_toolbar)))) + .check(matches(isDisplayed())); + onView(allOf(withId(R.id.new_tab_button), + withParent(withId(R.id.tab_switcher_toolbar)))) + .check(matches(isDisplayed())); + onView(allOf(withId(R.id.new_tab_view), withParent(withId(R.id.tab_switcher_toolbar)))) + .check(matches(withEffectiveVisibility(GONE))); + } + } + + @Test + @MediumTest + // clang-format off + @CommandLineFlags.Add({BASE_PARAMS}) + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID, + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<study"}) + @DisabledTest(message = "https://crbug.com/1130212") + public void testCloseTabViaCloseButton() throws Exception { + // clang-format on + mActivityTestRule.getActivity().getSnackbarManager().disableForTesting(); + prepareTabs(1, 0, null); + enterGTSWithThumbnailChecking(); + + onView(allOf(withId(R.id.action_button), withParent(withId(R.id.content_view)), + withEffectiveVisibility(VISIBLE))) + .perform(click()); + } + + @Test + @MediumTest + // clang-format off + @CommandLineFlags.Add({BASE_PARAMS}) + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<study"}) + @DisabledTest(message = "Flaky - https://crbug.com/1124041, crbug.com/1061178") + public void testSwipeToDismiss_GTS() { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + // Create 3 tabs and merge the first two tabs into one group. + createTabs(cta, false, 3); + enterTabSwitcher(cta); + TabModel normalTabModel = cta.getTabModelSelector().getModel(false); + List<Tab> tabGroup = new ArrayList<>( + Arrays.asList(normalTabModel.getTabAt(0), normalTabModel.getTabAt(1))); + createTabGroup(cta, false, tabGroup); + verifyTabSwitcherCardCount(cta, 2); + verifyTabModelTabCount(cta, 3, 0); + + // Swipe to dismiss a single tab card. + onView(tabSwitcherViewMatcher()) + .perform(RecyclerViewActions.actionOnItemAtPosition( + 1, getSwipeToDismissAction(false))); + verifyTabSwitcherCardCount(cta, 1); + verifyTabModelTabCount(cta, 2, 0); + + // Swipe to dismiss a tab group card. + onView(tabSwitcherViewMatcher()) + .perform(RecyclerViewActions.actionOnItemAtPosition( + 0, getSwipeToDismissAction(true))); + verifyTabSwitcherCardCount(cta, 0); + verifyTabModelTabCount(cta, 0, 0); + } + + @Test + @MediumTest + // clang-format off + @DisabledTest(message = "https://crbug.com/1144666") + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID + "<study", + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<study"}) + @CommandLineFlags.Add({BASE_PARAMS + "/enable_launch_polish/true"}) + public void testCloseButtonDescription() { + String expectedDescription = "Close New tab tab"; + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + enterTabSwitcher(cta); + + // Test single tab. + onView(allOf(withParent(withId(R.id.content_view)), withId(R.id.action_button), + withEffectiveVisibility(VISIBLE))) + .check(ViewContentDescription.havingDescription(expectedDescription)); + + // Create 2 tabs and merge them into one group. + createTabs(cta, false, 2); + enterTabSwitcher(cta); + TabModel normalTabModel = cta.getTabModelSelector().getModel(false); + List<Tab> tabGroup = new ArrayList<>( + Arrays.asList(normalTabModel.getTabAt(0), normalTabModel.getTabAt(1))); + createTabGroup(cta, false, tabGroup); + verifyTabSwitcherCardCount(cta, 1); + + // Test group tab. + expectedDescription = "Close tab group with 2 tabs"; + onView(allOf(withParent(withId(R.id.content_view)), withId(R.id.action_button), + withEffectiveVisibility(VISIBLE))) + .check(ViewContentDescription.havingDescription(expectedDescription)); + } + + private static class ViewContentDescription implements ViewAssertion { + private String mExpectedDescription; + + public static ViewContentDescription havingDescription(String description) { + return new ViewContentDescription(description); + } + + public ViewContentDescription(String description) { + mExpectedDescription = description; + } + + @Override + public void check(View view, NoMatchingViewException noMatchException) { + if (noMatchException != null) throw noMatchException; + + assertEquals(mExpectedDescription, view.getContentDescription()); + } + } + + private static class TabCountAssertion implements ViewAssertion { + private int mExpectedCount; + + public static TabCountAssertion havingTabCount(int tabCount) { + return new TabCountAssertion(tabCount); + } + + public TabCountAssertion(int expectedCount) { + mExpectedCount = expectedCount; + } + + @Override + public void check(View view, NoMatchingViewException noMatchException) { + if (noMatchException != null) throw noMatchException; + + RecyclerView.Adapter adapter = ((RecyclerView) view).getAdapter(); + assertEquals(mExpectedCount, adapter.getItemCount()); + } + } + + private static class ThumbnailAspectRatioAssertion implements ViewAssertion { + private double mExpectedRatio; + + public static ThumbnailAspectRatioAssertion havingAspectRatio(double ratio) { + return new ThumbnailAspectRatioAssertion(ratio); + } + + private ThumbnailAspectRatioAssertion(double expectedRatio) { + mExpectedRatio = expectedRatio; + } + + @Override + public void check(View view, NoMatchingViewException noMatchException) { + if (noMatchException != null) throw noMatchException; + + RecyclerView recyclerView = (RecyclerView) view; + + RecyclerView.Adapter adapter = recyclerView.getAdapter(); + for (int i = 0; i < adapter.getItemCount(); i++) { + RecyclerView.ViewHolder viewHolder = + recyclerView.findViewHolderForAdapterPosition(i); + if (viewHolder != null) { + ViewLookupCachingFrameLayout tabView = + (ViewLookupCachingFrameLayout) viewHolder.itemView; + ImageView thumbnail = (ImageView) tabView.fastFindViewById(R.id.tab_thumbnail); + BitmapDrawable drawable = (BitmapDrawable) thumbnail.getDrawable(); + Bitmap bitmap = drawable.getBitmap(); + double bitmapRatio = bitmap.getWidth() * 1.0 / bitmap.getHeight(); + assertTrue( + "Actual ratio: " + bitmapRatio + "; Expected ratio: " + mExpectedRatio, + Math.abs(bitmapRatio - mExpectedRatio) + <= TabContentManager.ASPECT_RATIO_PRECISION); + } + } + } + } + + private void waitForLastSearchTerm(Tab tab, String expected) { + CriteriaHelper.pollUiThread(() -> { + Criteria.checkThat( + TabAttributeCache.getLastSearchTerm(tab.getId()), Matchers.is(expected)); + }); + } + + @Test + @MediumTest + // Disable TAB_TO_GTS_ANIMATION to make it less flaky. + @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + @CommandLineFlags.Add({BASE_PARAMS + "/enable_search_term_chip/true"}) + public void testSearchTermChip_noChip() throws InterruptedException { + assertTrue(TabUiFeatureUtilities.ENABLE_SEARCH_CHIP.getValue()); + prepareTabs(1, 0, mUrl); + enterTabSwitcher(mActivityTestRule.getActivity()); + + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); + onView(allOf(withId(R.id.page_info_button), + isDescendantOfA(withId(R.id.compositor_view_holder)))) + .check(matches(not(isDisplayed()))); + } + + @Test + @MediumTest + // Disable TAB_TO_GTS_ANIMATION to make it less flaky. + @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + @CommandLineFlags.Add({BASE_PARAMS + "/enable_search_term_chip/true"}) + @DisabledTest(message = "http://crbug/1120822 - Flaky on bots.") + public void testSearchTermChip_withChip() throws InterruptedException { + assertTrue(TabUiFeatureUtilities.ENABLE_SEARCH_CHIP.getValue()); + // Make sure we support RTL and CJKV languages. + String searchTermWithSpecialCodePoints = "a\n ئۇيغۇرچە\u200E漢字"; + // Special code points like new line (\n) and left-to-right marker (\u200E) should + // be stripped out. See TabAttributeCache#removeEscapedCodePoints for more details. + String expectedTerm = "a ئۇيغۇرچە漢字"; + + String anotherTerm = "hello world"; + + // Do search, and verify the chip is still not shown. + AtomicReference<String> searchUrl = new AtomicReference<>(); + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + Tab currentTab = cta.getTabModelSelector().getCurrentTab(); + TestThreadUtils.runOnUiThreadBlocking(() -> { + TemplateUrlServiceFactory.get().setSearchEngine("google.com"); + searchUrl.set(TemplateUrlServiceFactory.get().getUrlForSearchQuery( + searchTermWithSpecialCodePoints)); + currentTab.loadUrl(new LoadUrlParams(searchUrl.get())); + }); + ChromeTabUtils.waitForTabPageLoaded(currentTab, null); + enterTabSwitcher(mActivityTestRule.getActivity()); + + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); + onView(withId(R.id.page_info_button)).check(matches(not(isDisplayed()))); + Espresso.pressBack(); + + // Navigate, and verify the chip is shown. + mActivityTestRule.loadUrl(mUrl); + waitForLastSearchTerm(currentTab, expectedTerm); + enterTabSwitcher(mActivityTestRule.getActivity()); + + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); + onView(withId(R.id.page_info_button)) + .check(waitForView(allOf(withText(expectedTerm), isDisplayed()))); + Espresso.pressBack(); + + // Do another search, and verify the chip is gone. + AtomicReference<String> searchUrl2 = new AtomicReference<>(); + TestThreadUtils.runOnUiThreadBlocking(() -> { + TemplateUrlServiceFactory.get().setSearchEngine("google.com"); + searchUrl2.set(TemplateUrlServiceFactory.get().getUrlForSearchQuery(anotherTerm)); + currentTab.loadUrl(new LoadUrlParams(searchUrl2.get())); + }); + ChromeTabUtils.waitForTabPageLoaded(currentTab, null); + waitForLastSearchTerm(currentTab, null); + enterTabSwitcher(mActivityTestRule.getActivity()); + + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); + onView(withId(R.id.page_info_button)).check(matches(not(isDisplayed()))); + Espresso.pressBack(); + + // Back to previous page, and verify the chip is back. + Espresso.pressBack(); + waitForLastSearchTerm(currentTab, expectedTerm); + enterTabSwitcher(mActivityTestRule.getActivity()); + + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); + onView(withId(R.id.page_info_button)) + .check(waitForView(allOf(withText(expectedTerm), isDisplayed()))); + + // Click the chip and check the tab navigates back to the search result page. + assertEquals(mUrl, ChromeTabUtils.getUrlStringOnUiThread(currentTab)); + onView(withId(R.id.page_info_button)) + .check(waitForView(allOf(withText(expectedTerm), isDisplayed()))); + onView(withId(R.id.page_info_button)).perform(click()); + LayoutTestUtils.waitForLayout(cta.getLayoutManager(), LayoutType.BROWSING); + ChromeTabUtils.waitForTabPageLoaded(currentTab, searchUrl.get()); + + // Verify the chip is gone. + waitForLastSearchTerm(currentTab, null); + enterTabSwitcher(mActivityTestRule.getActivity()); + + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); + onView(withId(R.id.page_info_button)).check(matches(not(isDisplayed()))); + } + + @Test + @MediumTest + @FlakyTest(message = "crbug.com/1324021") + // clang-format off + // Disable TAB_TO_GTS_ANIMATION to make it less flaky. + @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + @CommandLineFlags.Add({BASE_PARAMS + + "/enable_search_term_chip/true/enable_search_term_chip_adaptive_icon/true"}) + public void testSearchTermChip_adaptiveIcon() throws InterruptedException { + // clang-format on + assertTrue(TabUiFeatureUtilities.ENABLE_SEARCH_CHIP.getValue()); + assertTrue(TabUiFeatureUtilities.ENABLE_SEARCH_CHIP_ADAPTIVE.getValue()); + String searchTerm = "hello world"; + + // Do search, and verify the chip is still not shown. + AtomicReference<String> searchUrl = new AtomicReference<>(); + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + Tab currentTab = cta.getTabModelSelector().getCurrentTab(); + TestThreadUtils.runOnUiThreadBlocking(() -> { + TemplateUrlServiceFactory.get().setSearchEngine("google.com"); + searchUrl.set(TemplateUrlServiceFactory.get().getUrlForSearchQuery(searchTerm)); + currentTab.loadUrl(new LoadUrlParams(searchUrl.get())); + }); + ChromeTabUtils.waitForTabPageLoaded(currentTab, null); + enterTabSwitcher(mActivityTestRule.getActivity()); + + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); + onView(allOf(withId(R.id.page_info_button), + isDescendantOfA(withId(R.id.compositor_view_holder)))) + .check(matches(not(isDisplayed()))); + Espresso.pressBack(); + + // Navigate, and verify the chip is shown. + mActivityTestRule.loadUrl(mUrl); + waitForLastSearchTerm(currentTab, searchTerm); + enterTabSwitcher(mActivityTestRule.getActivity()); + + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(1)); + onView(allOf(withId(R.id.page_info_button), + isDescendantOfA(withId(R.id.compositor_view_holder)))) + .check(waitForView(allOf(withText(searchTerm), isDisplayed()))); + + // Switch the default search engine from google.com to yahoo.com, the search chip icon + // should change. + RecyclerView tabListRecyclerView = cta.findViewById(R.id.tab_list_view); + ChipView chipView = + tabListRecyclerView.findViewHolderForAdapterPosition(0).itemView.findViewById( + R.id.page_info_button); + ChromeImageView iconImageView = (ChromeImageView) chipView.getChildAt(0); + Drawable googleDrawable = iconImageView.getDrawable(); + + TestThreadUtils.runOnUiThreadBlocking( + () -> TemplateUrlServiceFactory.get().setSearchEngine("yahoo.com")); + + assertNotEquals(googleDrawable, iconImageView.getDrawable()); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID}) + @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + @FlakyTest(message = "crbug.com/1096997") + public void testTabGroupManualSelection() throws InterruptedException { + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + TabSelectionEditorTestingRobot robot = new TabSelectionEditorTestingRobot(); + createTabs(cta, false, 3); + enterTabSwitcher(cta); + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(3)); + + enterTabGroupManualSelection(cta); + robot.resultRobot.verifyTabSelectionEditorIsVisible(); + + // Group first two tabs. + robot.actionRobot.clickItemAtAdapterPosition(0); + robot.actionRobot.clickItemAtAdapterPosition(1); + robot.actionRobot.clickToolbarActionButton(); + + // Exit manual selection mode, back to tab switcher. + robot.resultRobot.verifyTabSelectionEditorIsHidden(); + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(2)); + onViewWaiting(withText("2 tabs grouped")); + } + + @Test + @MediumTest + // clang-format off + @DisabledTest(message = "https://crbug.com/1144666") + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + public void testTabGroupManualSelection_DisabledForSingleTab() { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + enterTabSwitcher(cta); + verifyTabSwitcherCardCount(cta, 1); + + // Group option should be disabled when there is only one single tab. + // We are using UiDevice to finish the click here since there seems to be more than one menu + // button in the view hierarchy, and we couldn't locate it using espresso approach. Also, + // performClick() won't work as the logic that handles menu button lies in onTouchListener. + View menuButton = + cta.findViewById(R.id.tab_switcher_toolbar).findViewById(R.id.menu_button); + int[] location = new int[2]; + menuButton.getLocationOnScreen(location); + UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + .click(location[0], location[1]); + onView(withText("Group tabs")) + .inRoot(withDecorView(not(cta.getWindow().getDecorView()))) + .check(matches(not(isEnabled()))); + + // Group option should be enabled when there is more than one single tab. + createTabs(cta, false, 2); + enterTabSwitcher(cta); + verifyTabSwitcherCardCount(cta, 2); + UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) + .click(location[0], location[1]); + onView(withText("Group tabs")) + .inRoot(withDecorView(not(cta.getWindow().getDecorView()))) + .check(matches(isEnabled())); + } + + @Test + @MediumTest + // clang-format off + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + public void testTabGroupManualSelection_SystemBackDismiss() { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + TabSelectionEditorTestingRobot robot = new TabSelectionEditorTestingRobot(); + createTabs(cta, false, 2); + enterTabSwitcher(cta); + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(2)); + enterTabGroupManualSelection(cta); + robot.resultRobot.verifyTabSelectionEditorIsVisible(); + + // Pressing system back should dismiss the selection editor. + Espresso.pressBack(); + robot.resultRobot.verifyTabSelectionEditorIsHidden(); + } + + @Test + @MediumTest + @Feature("TabSuggestion") + // clang-format off + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.CLOSE_TAB_SUGGESTIONS + "<Study"}) + @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + @CommandLineFlags.Add({BASE_PARAMS + "/baseline_tab_suggestions/true" + + "/baseline_close_tab_suggestions/true/min_time_between_prefetches/0" + + "/thumbnail_aspect_ratio/1.0"}) + public void testTabGroupManualSelection_AfterReviewTabSuggestion() throws InterruptedException { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + TabSelectionEditorTestingRobot robot = new TabSelectionEditorTestingRobot(); + createTabs(cta, false, 3); + + // Review closing tab suggestion. + CriteriaHelper.pollUiThread(TabSuggestionMessageService::isSuggestionAvailableForTesting); + CriteriaHelper.pollUiThread( + () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(3))); + + // Entering GTS with thumbnail checking here is trying to reduce flakiness that is caused by + // the TabContextObserver. TabContextObserver listens to + // TabObserver#didFirstVisuallyNonEmptyPaint and invalidates the suggestion. Do the + // thumbnail checking here is to ensure the suggestion is valid when entering tab switcher. + enterGTSWithThumbnailChecking(); + CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); + onView(withId(R.id.tab_grid_message_item)).check(matches(isDisplayed())); + onView(allOf(withId(R.id.action_button), withParent(withId(R.id.tab_grid_message_item)))) + .perform(click()); + + robot.resultRobot.verifyTabSelectionEditorIsVisible() + .verifyToolbarActionButtonWithResourceId( + R.string.tab_suggestion_close_tab_action_button); + + robot.actionRobot.clickToolbarActionButton(); + robot.resultRobot.verifyTabSelectionEditorIsHidden(); + CriteriaHelper.pollUiThread(() -> { + Criteria.checkThat(mActivityTestRule.getActivity().getCurrentTabModel().getCount(), + Matchers.is(0)); + }); + + // Show Manual Selection Mode. + createTabs(cta, false, 3); + + TabUiTestHelper.enterTabSwitcher(mActivityTestRule.getActivity()); + enterTabGroupManualSelection(cta); + robot.resultRobot.verifyTabSelectionEditorIsVisible() + .verifyToolbarActionButtonWithResourceId(R.string.tab_selection_editor_group); + + // Group first two tabs. + robot.actionRobot.clickItemAtAdapterPosition(0); + robot.actionRobot.clickItemAtAdapterPosition(1); + robot.actionRobot.clickToolbarActionButton(); + + // Exit manual selection mode, back to tab switcher. + robot.resultRobot.verifyTabSelectionEditorIsHidden(); + onViewWaiting(withText("2 tabs grouped")); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + @DisabledTest(message = "crbug.com/1187320 This doesn't work with FeedV2 and crbug.com/1096295") + public void testActivityCanBeGarbageCollectedAfterFinished() throws Exception { + prepareTabs(1, 0, "about:blank"); + + WeakReference<ChromeTabbedActivity> activityRef = + new WeakReference<>(mActivityTestRule.getActivity()); + + ChromeTabbedActivity activity = + ApplicationTestUtils.recreateActivity(mActivityTestRule.getActivity()); + InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + + mTabSwitcherAndStartSurfaceLayout = null; + mTabListDelegate = null; + mActivityTestRule.setActivity(activity); + + // A longer timeout is needed. Achieve that by using the CriteriaHelper.pollUiThread. + CriteriaHelper.pollUiThread( + () -> GarbageCollectionTestUtils.canBeGarbageCollected(activityRef)); + } + + /** + * This test is to simulate closing all incognito tabs during the activity recreation stage. + * This is a regression test for crbug.com/1044557. The test ensures all incognito tabs closed, + * which leads to a TabModel switching event, before the first normal tab is restored. + */ + @Test + @MediumTest + @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + // clang-format off + @DisabledTest(message = "crbug.com/1044557 This regression test fails deterministically with" + + " the bot, but passes with local emulator. Disable the test for now.") + public void + closeAllIncognitoTabsBeforeRestoreCompleted() { + // clang-format on + prepareTabs(3, 1, "about:blank"); + + assertTrue(mActivityTestRule.getActivity().getCurrentTabModel().isIncognito()); + + // Need to wait for contentsState to be initialized for the tab to restore correctly. + CriteriaHelper.pollUiThread( + () + -> TabStateExtractor.from(mActivityTestRule.getActivity().getActivityTab()) + .contentsState + != null, + "Incognito tab contentsState is null"); + + ChromeTabUtils.newTabFromMenu(InstrumentationRegistry.getInstrumentation(), + mActivityTestRule.getActivity(), true, false); + + mActivityTestRule.loadUrl("about:blank"); + + // Need to wait for contentsState to be initialized for the tab to restore correctly. + CriteriaHelper.pollUiThread( + () + -> TabStateExtractor.from(mActivityTestRule.getActivity().getActivityTab()) + .contentsState + != null, + "Incognito tab contentsState is null"); + + PseudoTab.clearForTesting(); + + AtomicBoolean tabModelRestoreCompleted = new AtomicBoolean(false); + AtomicBoolean normalModelIsEmpty = new AtomicBoolean(true); + + mActivityTestRule.recreateActivity(); + ChromeTabbedActivity newActivity = mActivityTestRule.getActivity(); + + new TabModelSelectorTabModelObserver(newActivity.getTabModelSelector()) { + @Override + public void restoreCompleted() { + tabModelRestoreCompleted.set(true); + } + + @Override + public void willAddTab(Tab tab, int type) { + if (tab.isIncognito() || !normalModelIsEmpty.get()) return; + + // Ensure normal tab model is active before its first tab restores. + CriteriaHelper.pollUiThread( + () + -> !newActivity.getCurrentTabModel().isIncognito(), + "Had not switched to Normal TabModel before the first normal Tab restored"); + } + + @Override + public void didAddTab(Tab tab, int type, int creationState) { + if (tab.isIncognito()) return; + normalModelIsEmpty.set(false); + } + }; + + CriteriaHelper.pollUiThread(() + -> newActivity.didFinishNativeInitialization(), + "New Activity has not finished initialized yet"); + CriteriaHelper.pollUiThread(() + -> newActivity.getCurrentTabModel().isIncognito(), + "New Activity current TabModel is not incognito"); + TestThreadUtils.runOnUiThreadBlocking(IncognitoTabHostUtils::closeAllIncognitoTabs); + + assertTrue("Deferred startup never completed", mActivityTestRule.waitForDeferredStartup()); + + CriteriaHelper.pollUiThread(() + -> tabModelRestoreCompleted.get(), + "New Activity normal TabModel has never restored"); + + assertFalse(newActivity.getCurrentTabModel().isIncognito()); + assertNotNull(newActivity.getTabModelSelector().getCurrentTab()); + // With the fix, StaticLayout guarantees to be shown. Otherwise, StartSurfaceLayout could be + // shown, not guaranteed. + assertTrue(newActivity.getLayoutManager().getActiveLayout() instanceof StaticLayout); + } + + @Test + @MediumTest + // clang-format off + @EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + public void testTabGroupNotFormDuringRestore() throws Exception { + // clang-format on + // Finish the activity and disable the ChromeFeatureList.TAB_GROUPS_ANDROID flag. + finishActivity(mActivityTestRule.getActivity()); + CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, false); + + mActivityTestRule.startMainActivityOnBlankPage(); + final ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + mActivityTestRule.loadUrl(mUrl); + Tab parentTab = cta.getTabModelSelector().getCurrentTab(); + + // Create a tab whose parent tab is parentTab. + TabCreator tabCreator = + TestThreadUtils.runOnUiThreadBlockingNoException(() -> cta.getTabCreator(false)); + LoadUrlParams loadUrlParams = new LoadUrlParams(mUrl); + TestThreadUtils.runOnUiThreadBlocking( + () + -> tabCreator.createNewTab( + loadUrlParams, TabLaunchType.FROM_LONGPRESS_BACKGROUND, parentTab)); + enterTabSwitcher(cta); + verifyTabSwitcherCardCount(cta, 2); + + // Restart activity with tab group enabled, and the tabs should remain as single tabs. + finishActivity(cta); + CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true); + mActivityTestRule.startMainActivityOnBlankPage(); + final ChromeTabbedActivity ctaRestarted = mActivityTestRule.getActivity(); + assertTrue(ctaRestarted.getTabModelSelector() + .getTabModelFilterProvider() + .getCurrentTabModelFilter() + instanceof TabGroupModelFilter); + enterTabSwitcher(ctaRestarted); + verifyTabSwitcherCardCount(ctaRestarted, 3); + } + + @Test + @MediumTest + // clang-format off + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + public void verifyTabGroupStateAfterReparenting() throws Exception { + // clang-format on + final ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + assertTrue(cta.getTabModelSelector().getTabModelFilterProvider().getCurrentTabModelFilter() + instanceof TabGroupModelFilter); + mActivityTestRule.loadUrl(mUrl); + Tab parentTab = cta.getTabModelSelector().getCurrentTab(); + + // Create a tab whose parent tab is parentTab. + TabCreator tabCreator = + TestThreadUtils.runOnUiThreadBlockingNoException(() -> cta.getTabCreator(false)); + LoadUrlParams loadUrlParams = new LoadUrlParams(mUrl); + TestThreadUtils.runOnUiThreadBlocking( + () + -> tabCreator.createNewTab( + loadUrlParams, TabLaunchType.FROM_LONGPRESS_BACKGROUND, parentTab)); + Tab childTab = cta.getTabModelSelector().getCurrentModel().getTabAt(1); + enterTabSwitcher(cta); + verifyTabSwitcherCardCount(cta, 1); + TabGroupModelFilter filter = (TabGroupModelFilter) cta.getTabModelSelector() + .getTabModelFilterProvider() + .getCurrentTabModelFilter(); + TestThreadUtils.runOnUiThreadBlocking(() -> filter.moveTabOutOfGroup(childTab.getId())); + verifyTabSwitcherCardCount(cta, 2); + + TestThreadUtils.runOnUiThreadBlocking( + () -> ChromeNightModeTestUtils.setUpNightModeForChromeActivity(true)); + final ChromeTabbedActivity ctaNightMode = ActivityTestUtils.waitForActivity( + InstrumentationRegistry.getInstrumentation(), ChromeTabbedActivity.class); + assertTrue(ColorUtils.inNightMode(ctaNightMode)); + CriteriaHelper.pollUiThread(ctaNightMode.getTabModelSelector()::isTabStateInitialized); + enterTabSwitcher(ctaNightMode); + verifyTabSwitcherCardCount(ctaNightMode, 2); + } + + @Test + @MediumTest + // clang-format off + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, + ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID, + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + public void testUndoClosure_AccessibilityMode() throws Exception { + // clang-format on + TestThreadUtils.runOnUiThreadBlocking( + () -> ChromeAccessibilityUtil.get().setAccessibilityEnabledForTesting(true)); + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + SnackbarManager snackbarManager = mActivityTestRule.getActivity().getSnackbarManager(); + createTabs(cta, false, 3); + + // When grid tab switcher is enabled for accessibility mode, tab closure should still show + // undo snack bar. + enterTabSwitcher(cta); + verifyTabSwitcherCardCount(cta, 3); + assertNull(snackbarManager.getCurrentSnackbarForTesting()); + closeFirstTabInTabSwitcher(); + assertTrue(snackbarManager.getCurrentSnackbarForTesting().getController() + instanceof UndoBarController); + verifyTabSwitcherCardCount(cta, 2); + CriteriaHelper.pollInstrumentationThread(TabUiTestHelper::verifyUndoBarShowingAndClickUndo); + verifyTabSwitcherCardCount(cta, 3); + } + + @Test + @MediumTest + // clang-format off + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, ChromeFeatureList.INSTANT_START, + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study"}) + // TODO(crbug.com/1112557): Remove this test when critical tests in StartSurfaceLayoutTest are + // running with InstantStart on. + public void testSetup_WithInstantStart() throws Exception { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + enterTabSwitcher(cta); + verifyTabSwitcherCardCount(cta, 1); + + // Verify TabModelObserver is correctly setup by checking if tab switcher changes with tab + // closure. + closeFirstTabInTabSwitcher(); + verifyTabSwitcherCardCount(cta, 0); + + // Verify TabGroupModelFilter is correctly setup by checking if tab switcher changes with + // tab grouping. + createTabs(cta, false, 3); + enterTabSwitcher(cta); + verifyTabSwitcherCardCount(cta, 2); + mergeAllNormalTabsToAGroup(cta); + verifyTabSwitcherCardCount(cta, 1); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID}) + public void testUndoGroupClosureInTabSwitcher() { + final ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + SnackbarManager snackbarManager = mActivityTestRule.getActivity().getSnackbarManager(); + createTabs(cta, false, 2); + enterTabSwitcher(cta); + verifyTabSwitcherCardCount(cta, 2); + // Create a tab group. + mergeAllNormalTabsToAGroup(cta); + verifyTabSwitcherCardCount(cta, 1); + assertNull(snackbarManager.getCurrentSnackbarForTesting()); + + // Verify close this tab group and undo in tab switcher. + closeFirstTabInTabSwitcher(); + assertTrue(snackbarManager.getCurrentSnackbarForTesting().getController() + instanceof UndoBarController); + verifyTabSwitcherCardCount(cta, 0); + CriteriaHelper.pollInstrumentationThread(TabUiTestHelper::verifyUndoBarShowingAndClickUndo); + verifyTabSwitcherCardCount(cta, 1); + } + + private void enterTabGroupManualSelection(ChromeTabbedActivity cta) { + MenuUtils.invokeCustomMenuActionSync( + InstrumentationRegistry.getInstrumentation(), cta, R.id.menu_group_tabs); + } + + /** + * TODO(wychen): move some of the callers to {@link TabUiTestHelper#enterTabSwitcher}. + */ + private void enterGTSWithThumbnailChecking() throws InterruptedException { + Tab currentTab = mActivityTestRule.getActivity().getTabModelSelector().getCurrentTab(); + // Native tabs need to be invalidated first to trigger thumbnail taking, so skip them. + boolean checkThumbnail = !currentTab.isNativePage(); + + if (checkThumbnail) { + mActivityTestRule.getActivity().getTabContentManager().removeTabThumbnail( + currentTab.getId()); + } + + int count = getCaptureCount(); + waitForCaptureRateControl(); + // TODO(wychen): use TabUiTestHelper.enterTabSwitcher() instead. + // Might increase flakiness though. See crbug.com/1024742. + LayoutTestUtils.startShowingAndWaitForLayout( + mActivityTestRule.getActivity().getLayoutManager(), LayoutType.TAB_SWITCHER, true); + + // Make sure the fading animation is done. + int delta; + if (UrlUtilities.isNTPUrl(mActivityTestRule.getActivity() + .getCurrentWebContents() + .getLastCommittedUrl())) { + // NTP is not invalidated, so no new captures. + delta = 0; + } else { + // The final capture at StartSurfaceLayout#finishedShowing time. + delta = 1; + if (ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + && areAnimatorsEnabled()) { + // The faster capturing without writing back to cache. + delta += 1; + } + } + checkCaptureCount(delta, count); + TabUiTestHelper.verifyAllTabsHaveThumbnail( + mActivityTestRule.getActivity().getCurrentTabModel()); + } + + /** + * Like {@link TabUiTestHelper#enterTabSwitcher}, but make sure all tabs have thumbnail. + */ + private void enterGTSWithThumbnailRetry() { + enterTabSwitcher(mActivityTestRule.getActivity()); + try { + TabUiTestHelper.verifyAllTabsHaveThumbnail( + mActivityTestRule.getActivity().getCurrentTabModel()); + } catch (AssertionError ae) { + // If the last thumbnail is missing, try without animation. + Espresso.pressBack(); + TestThreadUtils.runOnUiThreadBlocking( + () + -> mActivityTestRule.getActivity().getLayoutManager().showLayout( + LayoutType.TAB_SWITCHER, false)); + TabUiTestHelper.verifyAllTabsHaveThumbnail( + mActivityTestRule.getActivity().getCurrentTabModel()); + } + } + + /** + * If thumbnail checking is not needed, use {@link TabUiTestHelper#leaveTabSwitcher} instead. + */ + private void leaveGTSAndVerifyThumbnailsAreReleased() { + assertTrue(mActivityTestRule.getActivity().getLayoutManager().isLayoutVisible( + LayoutType.TAB_SWITCHER)); + + StartSurface startSurface = mTabSwitcherAndStartSurfaceLayout.getStartSurfaceForTesting(); + TestThreadUtils.runOnUiThreadBlocking( + () -> { startSurface.getController().onBackPressed(); }); + // TODO(wychen): using default timeout or even converting to + // OverviewModeBehaviorWatcher shouldn't increase flakiness. + LayoutTestUtils.waitForLayout( + mActivityTestRule.getActivity().getLayoutManager(), LayoutType.BROWSING); + assertThumbnailsAreReleased(); + } + + private void checkFinalCaptureCount(boolean switchToAnotherTab, int initCount) { + int expected; + if (UrlUtilities.isNTPUrl(mActivityTestRule.getActivity() + .getCurrentWebContents() + .getLastCommittedUrl())) { + expected = 0; + } else { + expected = mRepeat; + if (ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_TO_GTS_ANIMATION) + && areAnimatorsEnabled()) { + expected += mRepeat; + } + if (switchToAnotherTab) { + expected += mRepeat; + } + } + checkCaptureCount(expected, initCount); + } + + private void checkCaptureCount(int expectedDelta, int initCount) { + // TODO(wychen): With animation, the 2nd capture might be skipped if the 1st takes too long. + CriteriaHelper.pollUiThread(() -> { + Criteria.checkThat(getCaptureCount() - initCount, Matchers.is(expectedDelta)); + }); + } + + private int getCaptureCount() { + // TODO(crbug/1110961): Find a replacement for depending on Compositing.CopyFromSurfaceTime. + return RecordHistogram.getHistogramTotalCountForTesting("Compositing.CopyFromSurfaceTime"); + } + + private void waitForCaptureRateControl() throws InterruptedException { + // Needs to wait for at least |kCaptureMinRequestTimeMs| in order to capture another one. + // TODO(wychen): find out why waiting is still needed after setting + // |kCaptureMinRequestTimeMs| to 0. + Thread.sleep(2000); + } + + private void assertThumbnailsAreReleased() { + // Could not directly assert canAllBeGarbageCollected() because objects can be in Cleaner. + CriteriaHelper.pollUiThread(() -> canAllBeGarbageCollected(mAllBitmaps)); + } + + private boolean canAllBeGarbageCollected(List<WeakReference<Bitmap>> bitmaps) { + for (WeakReference<Bitmap> bitmap : bitmaps) { + if (!GarbageCollectionTestUtils.canBeGarbageCollected(bitmap)) { + return false; + } + } + return true; + } + + private void simulateAspectRatioChangedToPoint75() throws IOException { + TabModel currentModel = mActivityTestRule.getActivity().getCurrentTabModel(); + for (int i = 0; i < currentModel.getCount(); i++) { + Tab tab = currentModel.getTabAt(i); + Bitmap bitmap = TabContentManager.getJpegForTab(tab.getId()); + bitmap = Bitmap.createScaledBitmap( + bitmap, bitmap.getWidth(), (int) (bitmap.getWidth() * 1.0 / 0.75), false); + encodeJpeg(tab, bitmap); + } + } + + private void encodeJpeg(Tab tab, Bitmap bitmap) throws IOException { + FileOutputStream outputStream = + new FileOutputStream(TabContentManager.getTabThumbnailFileJpeg(tab.getId())); + bitmap.compress(Bitmap.CompressFormat.JPEG, 50, outputStream); + outputStream.close(); + } + + private void verifyAllThumbnailHasAspectRatio(double ratio) { + TabModel currentModel = mActivityTestRule.getActivity().getCurrentTabModel(); + for (int i = 0; i < currentModel.getCount(); i++) { + Tab tab = currentModel.getTabAt(i); + Bitmap bitmap = TabContentManager.getJpegForTab(tab.getId()); + double bitmapRatio = bitmap.getWidth() * 1.0 / bitmap.getHeight(); + assertTrue("Actual ratio: " + bitmapRatio + "; Expected ratio: " + ratio, + Math.abs(bitmapRatio - ratio) <= TabContentManager.ASPECT_RATIO_PRECISION); + } + } + + private void verifyOnlyOneTabSuggestionMessageCardIsShowing() throws InterruptedException { + String suggestionMessageTemplate = mActivityTestRule.getActivity().getString( + org.chromium.chrome.tab_ui.R.string.tab_suggestion_close_stale_message); + String suggestionMessage = + String.format(Locale.getDefault(), suggestionMessageTemplate, "3"); + prepareTabs(3, 0, mUrl); + CriteriaHelper.pollUiThread(TabSuggestionMessageService::isSuggestionAvailableForTesting); + CriteriaHelper.pollUiThread( + () -> Criteria.checkThat(getTabCountInCurrentTabModel(), Matchers.is(3))); + + enterGTSWithThumbnailChecking(); + CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); + onView(allOf(withText(suggestionMessage), withParent(withId(R.id.tab_grid_message_item)))) + .check(matches(isDisplayed())); + leaveGTSAndVerifyThumbnailsAreReleased(); + + // With soft or hard clean up depends on the soft-cleanup-delay and cleanup-delay params. + enterGTSWithThumbnailChecking(); + CriteriaHelper.pollUiThread(TabSwitcherCoordinator::hasAppendedMessagesForTesting); + // This will fail with error "matched multiple views" when there is more than one suggestion + // message card. + onView(allOf(withText(suggestionMessage), withParent(withId(R.id.tab_grid_message_item)))) + .check(matches(isDisplayed())); + } + + private Matcher<View> tabSwitcherViewMatcher() { + return allOf(withParent(withId(R.id.compositor_view_holder)), withId(R.id.tab_list_view)); + } +}
diff --git a/chrome/android/features/start_surface/javatests/start_surface_test_java_sources.gni b/chrome/android/features/start_surface/javatests/start_surface_test_java_sources.gni index 12b6a64..4e992376 100644 --- a/chrome/android/features/start_surface/javatests/start_surface_test_java_sources.gni +++ b/chrome/android/features/start_surface/javatests/start_surface_test_java_sources.gni
@@ -13,13 +13,13 @@ "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinderTest.java", "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceBackButtonTest.java", "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceFinaleTest.java", - "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java", - "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java", "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceMVTilesTest.java", "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java", "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTabSwitcherTest.java", "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java", "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTestUtils.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutPerfTest.java", + "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java", "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinderTest.java", "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/tasks/SingleTabViewBinderTest.java", "//chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/tasks/TasksViewBinderTest.java",
diff --git a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java index 099f2af..88df8e6 100644 --- a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java +++ b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
@@ -66,6 +66,7 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.R; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; +import org.chromium.chrome.browser.feed.FeedReliabilityLogger; import org.chromium.chrome.browser.night_mode.NightModeStateProvider; import org.chromium.chrome.browser.ntp.NewTabPageLaunchOrigin; import org.chromium.chrome.browser.omnibox.OmniboxStub; @@ -82,7 +83,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; import org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegate.TabSwitcherType; import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher; -import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.OverviewModeObserver; +import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.TabSwitcherViewObserver; import org.chromium.chrome.features.start_surface.StartSurfaceMediator.SecondaryTasksSurfaceInitializer; import org.chromium.chrome.features.tasks.TasksSurfaceProperties; import org.chromium.chrome.test.util.browser.Features; @@ -145,12 +146,14 @@ private OneshotSupplier<StartSurface> mStartSurfaceSupplier; @Mock private Runnable mInitializeMVTilesRunnable; + @Mock + private FeedReliabilityLogger mFeedReliabilityLogger; @Captor private ArgumentCaptor<TabModelSelectorObserver> mTabModelSelectorObserverCaptor; @Captor private ArgumentCaptor<TabModelObserver> mTabModelObserverCaptor; @Captor - private ArgumentCaptor<OverviewModeObserver> mOverviewModeObserverCaptor; + private ArgumentCaptor<TabSwitcherViewObserver> mTabSwitcherVisibilityObserverCaptor; @Captor private ArgumentCaptor<UrlFocusChangeListener> mUrlFocusChangeListenerCaptor; @Captor @@ -190,6 +193,12 @@ .isDialogVisibleSupplier(); doReturn(false).when(mActivityStateChecker).isFinishingOrDestroyed(); doReturn(mTab).when(mTabModelSelector).getCurrentTab(); + doReturn(mExploreSurfaceCoordinator) + .when(mExploreSurfaceCoordinatorFactory) + .create(anyBoolean(), anyBoolean(), anyInt()); + doReturn(mFeedReliabilityLogger) + .when(mExploreSurfaceCoordinator) + .getFeedReliabilityLogger(); } @After @@ -205,19 +214,19 @@ createStartSurfaceMediator(/* isStartSurfaceEnabled= */ false, true); verify(mTabModelSelector, never()).addObserver(mTabModelSelectorObserverCaptor.capture()); verify(mMainTabGridController) - .addOverviewModeObserver(mOverviewModeObserverCaptor.capture()); + .addTabSwitcherViewObserver(mTabSwitcherVisibilityObserverCaptor.capture()); mediator.showOverview(false); - verify(mMainTabGridController).showOverview(eq(false)); + verify(mMainTabGridController).showTabSwitcherView(eq(false)); - mOverviewModeObserverCaptor.getValue().startedShowing(); - mOverviewModeObserverCaptor.getValue().finishedShowing(); + mTabSwitcherVisibilityObserverCaptor.getValue().startedShowing(); + mTabSwitcherVisibilityObserverCaptor.getValue().finishedShowing(); - mediator.hideOverview(true); - verify(mMainTabGridController).hideOverview(eq(true)); + mediator.hideTabSwitcherView(true); + verify(mMainTabGridController).hideTabSwitcherView(eq(true)); - mOverviewModeObserverCaptor.getValue().startedHiding(); - mOverviewModeObserverCaptor.getValue().finishedHiding(); + mTabSwitcherVisibilityObserverCaptor.getValue().startedHiding(); + mTabSwitcherVisibilityObserverCaptor.getValue().finishedHiding(); // TODO(crbug.com/1020223): Test the other SurfaceMode.NO_START_SURFACE operations. } @@ -231,18 +240,19 @@ StartSurfaceMediator mediator = createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); verify(mMainTabGridController) - .addOverviewModeObserver(mOverviewModeObserverCaptor.capture()); + .addTabSwitcherViewObserver(mTabSwitcherVisibilityObserverCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); // Sets the current StartSurfaceState to SHOWING_START before calling the // {@link StartSurfaceMediator#showOverview()}. This is because if the current // StartSurfaceState is NOT_SHOWN, the state will be set default to SHOWING_TABSWITCHER in // {@link StartSurfaceMediator#showOverview()}. - mediator.setOverviewState(StartSurfaceState.SHOWING_START); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_START); mediator.showOverview(false); - verify(mMainTabGridController).showOverview(eq(false)); - verify(mOmniboxStub).addUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.capture()); + verify(mMainTabGridController).showTabSwitcherView(eq(false)); + verify(mOmniboxStub, times(2)) + .addUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); assertThat(mPropertyModel.get(IS_INCOGNITO), equalTo(false)); assertThat(mPropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), equalTo(true)); @@ -250,23 +260,26 @@ assertThat(mPropertyModel.get(MV_TILES_VISIBLE), equalTo(true)); assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); - mOverviewModeObserverCaptor.getValue().startedShowing(); - mOverviewModeObserverCaptor.getValue().finishedShowing(); + mTabSwitcherVisibilityObserverCaptor.getValue().startedShowing(); + mTabSwitcherVisibilityObserverCaptor.getValue().finishedShowing(); - mUrlFocusChangeListenerCaptor.getValue().onUrlFocusChange(true); + UrlFocusChangeListener urlFocusChangeListener = + mUrlFocusChangeListenerCaptor.getAllValues().get(1); + + urlFocusChangeListener.onUrlFocusChange(true); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(false)); - mUrlFocusChangeListenerCaptor.getValue().onUrlFocusChange(false); + urlFocusChangeListener.onUrlFocusChange(false); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); assertThat(mPropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), equalTo(true)); - mediator.hideOverview(true); - verify(mMainTabGridController).hideOverview(eq(true)); + mediator.hideTabSwitcherView(true); + verify(mMainTabGridController).hideTabSwitcherView(eq(true)); - mOverviewModeObserverCaptor.getValue().startedHiding(); + mTabSwitcherVisibilityObserverCaptor.getValue().startedHiding(); assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(false)); verify(mOmniboxStub).removeUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.getValue()); - mOverviewModeObserverCaptor.getValue().finishedHiding(); + mTabSwitcherVisibilityObserverCaptor.getValue().finishedHiding(); // TODO(crbug.com/1020223): Test the other SurfaceMode.SINGLE_PANE operations. } @@ -280,18 +293,19 @@ StartSurfaceMediator mediator = createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, true); verify(mMainTabGridController) - .addOverviewModeObserver(mOverviewModeObserverCaptor.capture()); + .addTabSwitcherViewObserver(mTabSwitcherVisibilityObserverCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); // Sets the current StartSurfaceState to SHOWING_START before calling the // {@link StartSurfaceMediator#showOverview()}. This is because if the current // StartSurfaceState is NOT_SHOWN, the state will be set default to SHOWING_TABSWITCHER in // {@link StartSurfaceMediator#showOverview()}. - mediator.setOverviewState(StartSurfaceState.SHOWING_START); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_START); mediator.showOverview(false); - verify(mMainTabGridController).showOverview(eq(false)); - verify(mOmniboxStub).addUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.capture()); + verify(mMainTabGridController).showTabSwitcherView(eq(false)); + verify(mOmniboxStub, times(2)) + .addUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); assertThat(mPropertyModel.get(IS_INCOGNITO), equalTo(false)); assertThat(mPropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), equalTo(true)); @@ -299,23 +313,26 @@ assertThat(mPropertyModel.get(MV_TILES_VISIBLE), equalTo(false)); assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); - mOverviewModeObserverCaptor.getValue().startedShowing(); - mOverviewModeObserverCaptor.getValue().finishedShowing(); + mTabSwitcherVisibilityObserverCaptor.getValue().startedShowing(); + mTabSwitcherVisibilityObserverCaptor.getValue().finishedShowing(); - mUrlFocusChangeListenerCaptor.getValue().onUrlFocusChange(true); + UrlFocusChangeListener urlFocusChangeListener = + mUrlFocusChangeListenerCaptor.getAllValues().get(1); + + urlFocusChangeListener.onUrlFocusChange(true); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(false)); - mUrlFocusChangeListenerCaptor.getValue().onUrlFocusChange(false); + urlFocusChangeListener.onUrlFocusChange(false); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); assertThat(mPropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), equalTo(true)); - mediator.hideOverview(true); - verify(mMainTabGridController).hideOverview(eq(true)); + mediator.hideTabSwitcherView(true); + verify(mMainTabGridController).hideTabSwitcherView(eq(true)); - mOverviewModeObserverCaptor.getValue().startedHiding(); + mTabSwitcherVisibilityObserverCaptor.getValue().startedHiding(); assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(false)); - verify(mOmniboxStub).removeUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.getValue()); + verify(mOmniboxStub).removeUrlFocusChangeListener(urlFocusChangeListener); - mOverviewModeObserverCaptor.getValue().finishedHiding(); + mTabSwitcherVisibilityObserverCaptor.getValue().finishedHiding(); // TODO(crbug.com/1020223): Test the other SurfaceMode.SINGLE_PANE operations. } @@ -331,9 +348,9 @@ createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); doReturn(0).when(mNormalTabModel).getCount(); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); mediator.showOverview(false); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); verify(mNormalTabModel).addObserver(mTabModelObserverCaptor.capture()); assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); assertThat(mPropertyModel.get(IS_TAB_CAROUSEL_VISIBLE), equalTo(false)); @@ -351,9 +368,9 @@ doReturn(2).when(mNormalTabModel).getCount(); doReturn(true).when(mTabModelSelector).isTabStateInitialized(); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mediator.showOverview(false); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); verify(mNormalTabModel).addObserver(mTabModelObserverCaptor.capture()); assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); assertThat(mPropertyModel.get(IS_TAB_CAROUSEL_VISIBLE), equalTo(true)); @@ -383,12 +400,12 @@ doReturn(1).when(mNormalTabModel).getCount(); mediator.setSecondaryTasksSurfacePropertyModel(mSecondaryTasksSurfacePropertyModel); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mediator.showOverview(false); verify(mNormalTabModel).addObserver(mTabModelObserverCaptor.capture()); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); mTabModelObserverCaptor.getValue().willCloseTab(mock(Tab.class), false); assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); assertThat(mPropertyModel.get(IS_TAB_CAROUSEL_VISIBLE), equalTo(false)); @@ -400,7 +417,7 @@ assertThat(mPropertyModel.get(IS_TAB_CAROUSEL_TITLE_VISIBLE), equalTo(true)); doReturn(2).when(mNormalTabModel).getCount(); - mediator.setOverviewState(StartSurfaceState.SHOWN_TABSWITCHER); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_TABSWITCHER); mTabModelObserverCaptor.getValue().willCloseTab(mock(Tab.class), false); mTabModelObserverCaptor.getValue().tabClosureUndone(mock(Tab.class)); doReturn(0).when(mNormalTabModel).getCount(); @@ -421,7 +438,7 @@ createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture()); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); mediator.showOverview(false); verify(mNormalTabModel, never()).addObserver(mTabModelObserverCaptor.capture()); mediator.startedHiding(); @@ -440,7 +457,7 @@ createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture()); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); mediator.showOverview(false); verify(mNormalTabModel, never()).addObserver(mTabModelObserverCaptor.capture()); @@ -477,7 +494,7 @@ verify(mTabModelSelector).removeObserver(mTabModelSelectorObserverCaptor.capture()); verify(mNormalTabModel, never()).addObserver(mTabModelObserverCaptor.capture()); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); mediator.showOverview(false); verify(mNormalTabModel).addObserver(mTabModelObserverCaptor.capture()); @@ -495,7 +512,7 @@ createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); verify(mNormalTabModel, never()).addObserver(mTabModelObserverCaptor.capture()); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mediator.showOverview(false); verify(mNormalTabModel).addObserver(mTabModelObserverCaptor.capture()); @@ -514,7 +531,7 @@ verify(mTabModelSelector, never()).addObserver(mTabModelSelectorObserverCaptor.capture()); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); mediator.showOverview(false); verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture()); @@ -534,7 +551,7 @@ doReturn(2).when(mNormalTabModel).getCount(); doReturn(true).when(mTabModelSelector).isTabStateInitialized(); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mediator.showOverview(false); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); @@ -587,7 +604,7 @@ assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); doReturn(2).when(mNormalTabModel).getCount(); - mediator.setOverviewState(StartSurfaceState.SHOWN_TABSWITCHER); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_TABSWITCHER); mediator.showOverview(false); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_TABSWITCHER)); assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); @@ -601,7 +618,7 @@ equalTo(false)); assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO), equalTo(true)); - mediator.hideOverview(false); + mediator.hideTabSwitcherView(false); mediator.startedHiding(); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); assertThat(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE), equalTo(false)); @@ -620,7 +637,7 @@ doReturn(2).when(mNormalTabModel).getCount(); doReturn(true).when(mTabModelSelector).isTabStateInitialized(); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mediator.showOverview(false); verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); @@ -664,7 +681,7 @@ doReturn(2).when(mNormalTabModel).getCount(); doReturn(true).when(mActivityStateChecker).isFinishingOrDestroyed(); doReturn(true).when(mTabModelSelector).isTabStateInitialized(); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mediator.showOverview(false); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); @@ -720,12 +737,12 @@ assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); doReturn(2).when(mNormalTabModel).getCount(); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mediator.showOverview(false); verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); - mediator.setOverviewState(StartSurfaceState.SHOWN_TABSWITCHER); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_TABSWITCHER); assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO), equalTo(false)); doReturn(true).when(mTabModelSelector).isIncognitoSelected(); @@ -734,7 +751,7 @@ mIncognitoTabModel, mNormalTabModel); assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO), equalTo(true)); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO), equalTo(true)); assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(false)); @@ -752,21 +769,21 @@ StartSurfaceMediator mediator = createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); verify(mMainTabGridController) - .addOverviewModeObserver(mOverviewModeObserverCaptor.capture()); + .addTabSwitcherViewObserver(mTabSwitcherVisibilityObserverCaptor.capture()); mediator.setSecondaryTasksSurfacePropertyModel(mSecondaryTasksSurfacePropertyModel); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); doReturn(30).when(mBrowserControlsStateProvider).getBottomControlsHeight(); doReturn(2).when(mNormalTabModel).getCount(); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mediator.showOverview(false); verify(mBrowserControlsStateProvider) .addObserver(mBrowserControlsStateProviderCaptor.capture()); assertThat(mPropertyModel.get(BOTTOM_BAR_HEIGHT), equalTo(30)); assertThat(mSecondaryTasksSurfacePropertyModel.get(BOTTOM_BAR_HEIGHT), equalTo(0)); - mOverviewModeObserverCaptor.getValue().startedShowing(); - mOverviewModeObserverCaptor.getValue().finishedShowing(); + mTabSwitcherVisibilityObserverCaptor.getValue().startedShowing(); + mTabSwitcherVisibilityObserverCaptor.getValue().finishedShowing(); mBrowserControlsStateProviderCaptor.getValue().onBottomControlsHeightChanged(0, 0); assertThat(mPropertyModel.get(BOTTOM_BAR_HEIGHT), equalTo(0)); @@ -776,8 +793,8 @@ assertThat(mPropertyModel.get(BOTTOM_BAR_HEIGHT), equalTo(10)); assertThat(mSecondaryTasksSurfacePropertyModel.get(BOTTOM_BAR_HEIGHT), equalTo(0)); - mediator.hideOverview(false); - mOverviewModeObserverCaptor.getValue().startedHiding(); + mediator.hideTabSwitcherView(false); + mTabSwitcherVisibilityObserverCaptor.getValue().startedHiding(); verify(mBrowserControlsStateProvider) .removeObserver(mBrowserControlsStateProviderCaptor.getValue()); } @@ -790,7 +807,7 @@ StartSurfaceMediator mediator = createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mediator.showOverview(false); verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture()); @@ -817,7 +834,7 @@ assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO_DESCRIPTION_VISIBLE), equalTo(false)); - mediator.hideOverview(true); + mediator.hideTabSwitcherView(true); } @Test @@ -828,7 +845,7 @@ StartSurfaceMediator mediator = createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); mediator.showOverview(false); verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture()); @@ -855,7 +872,7 @@ assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO_DESCRIPTION_VISIBLE), equalTo(false)); - mediator.hideOverview(true); + mediator.hideTabSwitcherView(true); } @Test @@ -867,25 +884,29 @@ StartSurfaceMediator mediator = createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); verify(mMainTabGridController) - .addOverviewModeObserver(mOverviewModeObserverCaptor.capture()); + .addTabSwitcherViewObserver(mTabSwitcherVisibilityObserverCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); mediator.setSecondaryTasksSurfacePropertyModel(mSecondaryTasksSurfacePropertyModel); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); mediator.showOverview(false); verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture()); - verify(mMainTabGridController).showOverview(eq(false)); - verify(mOmniboxStub).addUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.capture()); + verify(mMainTabGridController).showTabSwitcherView(eq(false)); + verify(mOmniboxStub, times(2)) + .addUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); assertThat(mediator.shouldShowTabSwitcherToolbar(), equalTo(true)); - mUrlFocusChangeListenerCaptor.getValue().onUrlFocusChange(true); + UrlFocusChangeListener urlFocusChangeListener = + mUrlFocusChangeListenerCaptor.getAllValues().get(1); + + urlFocusChangeListener.onUrlFocusChange(true); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(false)); assertThat(mediator.shouldShowTabSwitcherToolbar(), equalTo(false)); - mUrlFocusChangeListenerCaptor.getValue().onUrlFocusChange(false); + urlFocusChangeListener.onUrlFocusChange(false); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); assertThat(mPropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), equalTo(true)); assertThat(mediator.shouldShowTabSwitcherToolbar(), equalTo(true)); @@ -911,7 +932,8 @@ assertEquals(StartSurfaceUserData.getInstance().restoreFeedInstanceState(), instanceState); - mediator.setOverviewState(StartSurfaceState.SHOWING_START, NewTabPageLaunchOrigin.WEB_FEED); + mediator.setStartSurfaceState( + StartSurfaceState.SHOWING_START, NewTabPageLaunchOrigin.WEB_FEED); assertNull(StartSurfaceUserData.getInstance().restoreFeedInstanceState()); } @@ -928,7 +950,8 @@ assertEquals(StartSurfaceUserData.getInstance().restoreFeedInstanceState(), instanceState); - mediator.setOverviewState(StartSurfaceState.SHOWING_START, NewTabPageLaunchOrigin.UNKNOWN); + mediator.setStartSurfaceState( + StartSurfaceState.SHOWING_START, NewTabPageLaunchOrigin.UNKNOWN); assertNotNull(StartSurfaceUserData.getInstance().restoreFeedInstanceState()); } @@ -941,7 +964,7 @@ StartSurfaceMediator mediator = createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); verify(mMainTabGridController) - .addOverviewModeObserver(mOverviewModeObserverCaptor.capture()); + .addTabSwitcherViewObserver(mTabSwitcherVisibilityObserverCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); mediator.showOverview(false); @@ -957,29 +980,33 @@ StartSurfaceMediator mediator = createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); verify(mMainTabGridController) - .addOverviewModeObserver(mOverviewModeObserverCaptor.capture()); + .addTabSwitcherViewObserver(mTabSwitcherVisibilityObserverCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); mediator.setSecondaryTasksSurfacePropertyModel(mSecondaryTasksSurfacePropertyModel); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mediator.showOverview(false); - verify(mMainTabGridController).showOverview(eq(false)); - verify(mOmniboxStub).addUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.capture()); + verify(mMainTabGridController).showTabSwitcherView(eq(false)); + verify(mOmniboxStub, times(2)) + .addUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); assertThat(mediator.shouldShowTabSwitcherToolbar(), equalTo(true)); - mUrlFocusChangeListenerCaptor.getValue().onUrlFocusChange(true); + UrlFocusChangeListener urlFocusChangeListener = + mUrlFocusChangeListenerCaptor.getAllValues().get(1); + + urlFocusChangeListener.onUrlFocusChange(true); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(false)); assertThat(mediator.shouldShowTabSwitcherToolbar(), equalTo(false)); - mUrlFocusChangeListenerCaptor.getValue().onUrlFocusChange(false); + urlFocusChangeListener.onUrlFocusChange(false); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); assertThat(mPropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), equalTo(true)); assertThat(mediator.shouldShowTabSwitcherToolbar(), equalTo(true)); - mediator.setOverviewState(StartSurfaceState.SHOWN_TABSWITCHER); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_TABSWITCHER); assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(false)); assertThat(mediator.shouldShowTabSwitcherToolbar(), equalTo(true)); @@ -995,45 +1022,45 @@ createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); InOrder mainTabGridController = inOrder(mMainTabGridController); mainTabGridController.verify(mMainTabGridController) - .addOverviewModeObserver(mOverviewModeObserverCaptor.capture()); + .addTabSwitcherViewObserver(mTabSwitcherVisibilityObserverCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); mediator.setSecondaryTasksSurfacePropertyModel(mSecondaryTasksSurfacePropertyModel); - mediator.setOverviewState(StartSurfaceState.SHOWING_PREVIOUS); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_PREVIOUS); mediator.showOverview(false); - mainTabGridController.verify(mMainTabGridController).showOverview(eq(false)); + mainTabGridController.verify(mMainTabGridController).showTabSwitcherView(eq(false)); InOrder omniboxStub = inOrder(mOmniboxStub); - omniboxStub.verify(mOmniboxStub) + omniboxStub.verify(mOmniboxStub, times(2)) .addUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); assertThat(mediator.shouldShowTabSwitcherToolbar(), equalTo(true)); - mediator.hideOverview(true); - mOverviewModeObserverCaptor.getValue().startedHiding(); - mOverviewModeObserverCaptor.getValue().finishedHiding(); + mediator.hideTabSwitcherView(true); + mTabSwitcherVisibilityObserverCaptor.getValue().startedHiding(); + mTabSwitcherVisibilityObserverCaptor.getValue().finishedHiding(); - mediator.setOverviewState(StartSurfaceState.SHOWING_PREVIOUS); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_PREVIOUS); mediator.showOverview(false); - mainTabGridController.verify(mMainTabGridController).showOverview(eq(false)); - omniboxStub.verify(mOmniboxStub) + mainTabGridController.verify(mMainTabGridController).showTabSwitcherView(eq(false)); + omniboxStub.verify(mOmniboxStub, times(2)) .addUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); assertThat(mediator.shouldShowTabSwitcherToolbar(), equalTo(true)); - mediator.setOverviewState(StartSurfaceState.SHOWN_TABSWITCHER); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_TABSWITCHER); assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(false)); assertThat(mediator.shouldShowTabSwitcherToolbar(), equalTo(true)); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_TABSWITCHER)); - mediator.hideOverview(true); - mOverviewModeObserverCaptor.getValue().startedHiding(); - mOverviewModeObserverCaptor.getValue().finishedHiding(); + mediator.hideTabSwitcherView(true); + mTabSwitcherVisibilityObserverCaptor.getValue().startedHiding(); + mTabSwitcherVisibilityObserverCaptor.getValue().finishedHiding(); - mediator.setOverviewState(StartSurfaceState.SHOWING_PREVIOUS); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_PREVIOUS); mediator.showOverview(false); assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(false)); @@ -1051,35 +1078,35 @@ createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); InOrder mainTabGridController = inOrder(mMainTabGridController); mainTabGridController.verify(mMainTabGridController) - .addOverviewModeObserver(mOverviewModeObserverCaptor.capture()); + .addTabSwitcherViewObserver(mTabSwitcherVisibilityObserverCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mPropertyModel.set(IS_EXPLORE_SURFACE_VISIBLE, true); when(mExploreSurfaceCoordinatorFactory.create(anyBoolean(), anyBoolean(), anyInt())) .thenReturn(mExploreSurfaceCoordinator); mediator.showOverview(false); - mainTabGridController.verify(mMainTabGridController).showOverview(eq(false)); + mainTabGridController.verify(mMainTabGridController).showTabSwitcherView(eq(false)); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); assertThat(mPropertyModel.get(EXPLORE_SURFACE_COORDINATOR), equalTo(mExploreSurfaceCoordinator)); doReturn(TabLaunchType.FROM_START_SURFACE).when(mTab).getLaunchType(); - mediator.hideOverview(true); - mOverviewModeObserverCaptor.getValue().startedHiding(); - mOverviewModeObserverCaptor.getValue().finishedHiding(); + mediator.hideTabSwitcherView(true); + mTabSwitcherVisibilityObserverCaptor.getValue().startedHiding(); + mTabSwitcherVisibilityObserverCaptor.getValue().finishedHiding(); assertNull(mPropertyModel.get(EXPLORE_SURFACE_COORDINATOR)); - mediator.setOverviewState(StartSurfaceState.SHOWING_PREVIOUS); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_PREVIOUS); mediator.showOverview(false); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); assertThat(mPropertyModel.get(EXPLORE_SURFACE_COORDINATOR), equalTo(mExploreSurfaceCoordinator)); doReturn(TabLaunchType.FROM_LINK).when(mTab).getLaunchType(); - mediator.hideOverview(true); - mOverviewModeObserverCaptor.getValue().startedHiding(); - mOverviewModeObserverCaptor.getValue().finishedHiding(); + mediator.hideTabSwitcherView(true); + mTabSwitcherVisibilityObserverCaptor.getValue().startedHiding(); + mTabSwitcherVisibilityObserverCaptor.getValue().finishedHiding(); assertNull(mPropertyModel.get(EXPLORE_SURFACE_COORDINATOR)); } @@ -1102,7 +1129,7 @@ // {@link StartSurfaceMediator#showOverview()}. This is because if the current // StartSurfaceState is NOT_SHOWN, the state will be set default to SHOWING_TABSWITCHER in // {@link StartSurfaceMediator#showOverview()}. - mediator.setOverviewState(StartSurfaceState.SHOWING_START); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_START); mediator.showOverview(false); verify(mBrowserControlsStateProvider).addObserver(ArgumentMatchers.any()); @@ -1117,7 +1144,7 @@ // The top margin of tab switcher surface should be consistent with top controls // height/offset. doReturn(15).when(mBrowserControlsStateProvider).getTopControlsHeight(); - mediator.setOverviewState(StartSurfaceState.SHOWING_TABSWITCHER); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_TABSWITCHER); mediator.showOverview(false); assertEquals("Wrong top content offset on tab switcher surface.", 15, @@ -1142,18 +1169,18 @@ /* isStartSurfaceEnabled= */ true, /* excludeMVTiles= */ false, /* hadWarmStart= */ false); verify(mMainTabGridController) - .addOverviewModeObserver(mOverviewModeObserverCaptor.capture()); + .addTabSwitcherViewObserver(mTabSwitcherVisibilityObserverCaptor.capture()); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); // Sets the current StartSurfaceState to SHOWING_START before calling the // {@link StartSurfaceMediator#showOverview()}. This is because if the current // StartSurfaceState is NOT_SHOWN, the state will be set default to SHOWING_TABSWITCHER in // {@link StartSurfaceMediator#showOverview()}. - mediator.setOverviewState(StartSurfaceState.SHOWING_START); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_START); mediator.showOverview(false); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); assertThat(mPropertyModel.get(IS_EXPLORE_SURFACE_VISIBLE), equalTo(false)); - verify(mMainTabGridController).showOverview(eq(false)); + verify(mMainTabGridController).showTabSwitcherView(eq(false)); when(mMainTabGridController.overviewVisible()).thenReturn(true); mediator.initWithNative( @@ -1197,7 +1224,7 @@ /* hadWarmStart= */ true); assertFalse(mediator.shouldShowFeedPlaceholder()); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mPropertyModel.set(IS_EXPLORE_SURFACE_VISIBLE, true); when(mExploreSurfaceCoordinatorFactory.create(anyBoolean(), anyBoolean(), anyInt())) .thenReturn(mExploreSurfaceCoordinator); @@ -1220,14 +1247,14 @@ mediator.setSecondaryTasksSurfaceController(mSecondaryTasksSurfaceController); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); - mediator.setOverviewState(StartSurfaceState.SHOWING_TABSWITCHER); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_TABSWITCHER); assertFalse(mSecondaryTasksSurfacePropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE)); assertTrue(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE)); - verify(mSecondaryTasksSurfaceController, times(0)).showOverview(true); + verify(mSecondaryTasksSurfaceController, times(0)).showTabSwitcherView(true); mediator.showOverview(false); assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_TABSWITCHER)); - verify(mSecondaryTasksSurfaceController, times(1)).showOverview(true); + verify(mSecondaryTasksSurfaceController, times(1)).showTabSwitcherView(true); } @Test @@ -1242,9 +1269,9 @@ doReturn(2).when(mNormalTabModel).getCount(); doReturn(true).when(mTabModelSelector).isTabStateInitialized(); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mediator.showOverview(false); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); verify(mNormalTabModel).addObserver(mTabModelObserverCaptor.capture()); assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); assertThat(mPropertyModel.get(IS_TAB_CAROUSEL_VISIBLE), equalTo(true)); @@ -1267,9 +1294,9 @@ StartSurfaceMediator mediator = createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); mediator.showOverview(false); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); verify(mNormalTabModel).addObserver(mTabModelObserverCaptor.capture()); assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); assertThat(mPropertyModel.get(IS_TAB_CAROUSEL_VISIBLE), equalTo(false)); @@ -1286,10 +1313,63 @@ StartSurfaceMediator mediator = createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false); - mediator.setOverviewState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); verify(mInitializeMVTilesRunnable).run(); } + @Test + public void testFeedReliabilityLoggerPageLoadStarted() { + doReturn(mVoiceRecognitionHandler).when(mOmniboxStub).getVoiceRecognitionHandler(); + + StartSurfaceMediator mediator = + createStartSurfaceMediator(/*isStartSurfaceEnabled=*/true, false); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.showOverview(true); + + verify(mNormalTabModel).addObserver(mTabModelObserverCaptor.capture()); + assertThat(mPropertyModel.get(IS_EXPLORE_SURFACE_VISIBLE), equalTo(true)); + mTabModelObserverCaptor.getValue().willAddTab(/*tab=*/null, TabLaunchType.FROM_LINK); + verify(mFeedReliabilityLogger, times(1)).onPageLoadStarted(); + } + + @Test + public void testFeedReliabilityLoggerObservesUrlFocus() { + doReturn(mVoiceRecognitionHandler).when(mOmniboxStub).getVoiceRecognitionHandler(); + + StartSurfaceMediator mediator = + createStartSurfaceMediator(/*isStartSurfaceEnabled=*/true, false); + verify(mMainTabGridController) + .addTabSwitcherViewObserver(mTabSwitcherVisibilityObserverCaptor.capture()); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.showOverview(true); + + assertThat(mPropertyModel.get(IS_EXPLORE_SURFACE_VISIBLE), equalTo(true)); + verify(mOmniboxStub, times(2)) + .addUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.capture()); + UrlFocusChangeListener listener = mUrlFocusChangeListenerCaptor.getAllValues().get(0); + assertThat(listener, equalTo(mFeedReliabilityLogger)); + + mTabSwitcherVisibilityObserverCaptor.getValue().startedShowing(); + mTabSwitcherVisibilityObserverCaptor.getValue().finishedShowing(); + mTabSwitcherVisibilityObserverCaptor.getValue().startedHiding(); + + mediator.hideTabSwitcherView(true); + verify(mOmniboxStub).removeUrlFocusChangeListener(listener); + + mTabSwitcherVisibilityObserverCaptor.getValue().finishedHiding(); + } + + @Test + public void testFeedReliabilityLoggerBackPressed() { + doReturn(mVoiceRecognitionHandler).when(mOmniboxStub).getVoiceRecognitionHandler(); + StartSurfaceMediator mediator = + createStartSurfaceMediator(/*isStartSurfaceEnabled=*/true, false); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); + mediator.showOverview(true); + mediator.onBackPressed(); + verify(mFeedReliabilityLogger).onNavigateBack(); + } + private StartSurfaceMediator createStartSurfaceMediator( boolean isStartSurfaceEnabled, boolean excludeMVTiles) { return createStartSurfaceMediator(
diff --git a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediatorUnitTest.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediatorUnitTest.java index 016218b..4037b21 100644 --- a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediatorUnitTest.java +++ b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediatorUnitTest.java
@@ -45,6 +45,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; import org.chromium.chrome.browser.tasks.tab_management.TabListFaviconProvider; import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher; +import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.TabSwitcherViewObserver; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.url.GURL; import org.chromium.url.JUnitTestGURLs; @@ -79,7 +80,7 @@ @Mock private TabSwitcher.OnTabSelectingListener mOnTabSelectingListener; @Mock - private TabSwitcher.OverviewModeObserver mOverviewModeObserver; + private TabSwitcherViewObserver mTabSwitcherViewObserver; @Captor private ArgumentCaptor<TabModelSelectorObserver> mTabModelSelectorObserverCaptor; @Captor @@ -126,9 +127,9 @@ assertNotNull(mPropertyModel.get(CLICK_LISTENER)); assertFalse(mMediator.overviewVisible()); mMediator.setOnTabSelectingListener(mOnTabSelectingListener); - mMediator.addOverviewModeObserver(mOverviewModeObserver); + mMediator.addTabSwitcherViewObserver(mTabSwitcherViewObserver); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); verify(mTabModelFilterProvider) .addTabModelFilterObserver(mTabModelObserverCaptor.capture()); verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture()); @@ -136,20 +137,20 @@ .getFaviconDrawableForUrlAsync( eq(mUrl), eq(false), mFaviconCallbackCaptor.capture()); assertTrue(mMediator.overviewVisible()); - verify(mOverviewModeObserver).startedShowing(); - verify(mOverviewModeObserver).finishedShowing(); + verify(mTabSwitcherViewObserver).startedShowing(); + verify(mTabSwitcherViewObserver).finishedShowing(); assertEquals(mPropertyModel.get(TITLE), mTitle); mPropertyModel.get(CLICK_LISTENER).onClick(null); verify(mOnTabSelectingListener).onTabSelecting(anyLong(), eq(mTabId)); - mMediator.hideOverview(true); + mMediator.hideTabSwitcherView(true); assertFalse(mMediator.overviewVisible()); assertEquals(mPropertyModel.get(TITLE), ""); - verify(mOverviewModeObserver).startedHiding(); - verify(mOverviewModeObserver).finishedHiding(); + verify(mTabSwitcherViewObserver).startedHiding(); + verify(mTabSwitcherViewObserver).finishedHiding(); - mMediator.removeOverviewModeObserver(mOverviewModeObserver); + mMediator.removeTabSwitcherViewObserver(mTabSwitcherViewObserver); mMediator.setOnTabSelectingListener(null); } @@ -157,9 +158,9 @@ public void selectTabAfterSwitchingTabModel() { assertFalse(mMediator.overviewVisible()); mMediator.setOnTabSelectingListener(mOnTabSelectingListener); - mMediator.addOverviewModeObserver(mOverviewModeObserver); + mMediator.addTabSwitcherViewObserver(mTabSwitcherViewObserver); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); verify(mTabModelFilterProvider) .addTabModelFilterObserver(mTabModelObserverCaptor.capture()); verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture()); @@ -167,8 +168,8 @@ .getFaviconDrawableForUrlAsync( eq(mUrl), eq(false), mFaviconCallbackCaptor.capture()); assertTrue(mMediator.overviewVisible()); - verify(mOverviewModeObserver).startedShowing(); - verify(mOverviewModeObserver).finishedShowing(); + verify(mTabSwitcherViewObserver).startedShowing(); + verify(mTabSwitcherViewObserver).finishedShowing(); assertEquals(mPropertyModel.get(TITLE), mTitle); mTabModelObserverCaptor.getValue().didSelectTab(mTab, TabSelectionType.FROM_USER, -1); @@ -186,20 +187,20 @@ mTabModelObserverCaptor.getValue().didSelectTab(mTab, TabSelectionType.FROM_USER, mTabId); verify(mOnTabSelectingListener, times(2)).onTabSelecting(anyLong(), eq(mTabId)); - mMediator.hideOverview(true); + mMediator.hideTabSwitcherView(true); assertFalse(mMediator.overviewVisible()); assertEquals(mPropertyModel.get(TITLE), ""); - verify(mOverviewModeObserver).startedHiding(); - verify(mOverviewModeObserver).finishedHiding(); + verify(mTabSwitcherViewObserver).startedHiding(); + verify(mTabSwitcherViewObserver).finishedHiding(); } @Test public void selectNextTabAfterClosingTheSelectedTab() { assertFalse(mMediator.overviewVisible()); mMediator.setOnTabSelectingListener(mOnTabSelectingListener); - mMediator.addOverviewModeObserver(mOverviewModeObserver); + mMediator.addTabSwitcherViewObserver(mTabSwitcherViewObserver); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); verify(mTabModelFilterProvider) .addTabModelFilterObserver(mTabModelObserverCaptor.capture()); verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture()); @@ -207,8 +208,8 @@ .getFaviconDrawableForUrlAsync( eq(mUrl), eq(false), mFaviconCallbackCaptor.capture()); assertTrue(mMediator.overviewVisible()); - verify(mOverviewModeObserver).startedShowing(); - verify(mOverviewModeObserver).finishedShowing(); + verify(mTabSwitcherViewObserver).startedShowing(); + verify(mTabSwitcherViewObserver).finishedShowing(); assertEquals(mPropertyModel.get(TITLE), mTitle); mTabModelObserverCaptor.getValue().didSelectTab( @@ -216,20 +217,20 @@ verify(mOnTabSelectingListener, times(0)).onTabSelecting(anyLong(), eq(mTabId2)); assertEquals(mPropertyModel.get(TITLE), mTitle2); - mMediator.hideOverview(true); + mMediator.hideTabSwitcherView(true); assertFalse(mMediator.overviewVisible()); assertEquals(mPropertyModel.get(TITLE), ""); - verify(mOverviewModeObserver).startedHiding(); - verify(mOverviewModeObserver).finishedHiding(); + verify(mTabSwitcherViewObserver).startedHiding(); + verify(mTabSwitcherViewObserver).finishedHiding(); } @Test public void selectTabAfterSwitchingTabModelAndReshown() { assertFalse(mMediator.overviewVisible()); mMediator.setOnTabSelectingListener(mOnTabSelectingListener); - mMediator.addOverviewModeObserver(mOverviewModeObserver); + mMediator.addTabSwitcherViewObserver(mTabSwitcherViewObserver); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); verify(mTabModelFilterProvider) .addTabModelFilterObserver(mTabModelObserverCaptor.capture()); verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture()); @@ -242,27 +243,27 @@ mIncognitoTabModel, mNormalTabModel); mTabModelSelectorObserverCaptor.getValue().onTabModelSelected( mNormalTabModel, mIncognitoTabModel); - mMediator.hideOverview(true); + mMediator.hideTabSwitcherView(true); // The next tab selecting event should not be ignored after hiding and reshowing. - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); mTabModelObserverCaptor.getValue().didSelectTab(mTab, TabSelectionType.FROM_USER, -1); verify(mOnTabSelectingListener).onTabSelecting(anyLong(), eq(mTabId)); - mMediator.hideOverview(true); + mMediator.hideTabSwitcherView(true); } @Test public void onBackPressed() { assertFalse(mMediator.overviewVisible()); mMediator.setOnTabSelectingListener(mOnTabSelectingListener); - mMediator.addOverviewModeObserver(mOverviewModeObserver); + mMediator.addTabSwitcherViewObserver(mTabSwitcherViewObserver); mMediator.onHomepageChanged(false); assertNotEquals(Boolean.TRUE, mMediator.getHandleBackPressChangedSupplier().get()); assertFalse(mMediator.onBackPressed(false)); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); assertEquals(Boolean.TRUE, mMediator.getHandleBackPressChangedSupplier().get()); assertTrue(mMediator.onBackPressed(false)); verify(mOnTabSelectingListener).onTabSelecting(anyLong(), eq(mTabId));
diff --git a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/TasksSurfaceMediatorUnitTest.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/TasksSurfaceMediatorUnitTest.java index 0c28c79..80e3d302 100644 --- a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/TasksSurfaceMediatorUnitTest.java +++ b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/TasksSurfaceMediatorUnitTest.java
@@ -42,6 +42,7 @@ import org.robolectric.annotation.Config; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.feed.FeedReliabilityLogger; import org.chromium.chrome.browser.ntp.IncognitoCookieControlsManager; import org.chromium.chrome.browser.omnibox.OmniboxFocusReason; import org.chromium.chrome.browser.omnibox.OmniboxStub; @@ -67,6 +68,8 @@ private View.OnClickListener mLearnMoreOnClickListener; @Mock private IncognitoCookieControlsManager mCookieControlsManager; + @Mock + private FeedReliabilityLogger mFeedReliabilityLogger; @Captor private ArgumentCaptor<View.OnClickListener> mFakeboxClickListenerCaptor; @Captor @@ -84,7 +87,7 @@ mMediator = new TasksSurfaceMediator( mPropertyModel, mLearnMoreOnClickListener, mCookieControlsManager, true); - mMediator.initWithNative(mOmniboxStub); + mMediator.initWithNative(mOmniboxStub, mFeedReliabilityLogger); } @After @@ -165,6 +168,7 @@ verify(mVoiceRecognitionHandler, times(1)) .startVoiceRecognition( eq(VoiceRecognitionHandler.VoiceInteractionSource.TASKS_SURFACE)); + verify(mFeedReliabilityLogger, times(1)).onVoiceSearch(); } @Test
diff --git a/chrome/android/features/start_surface/start_surface_java_sources.gni b/chrome/android/features/start_surface/start_surface_java_sources.gni index b9b7ebbc..0dc54b4b 100644 --- a/chrome/android/features/start_surface/start_surface_java_sources.gni +++ b/chrome/android/features/start_surface/start_surface_java_sources.gni
@@ -18,9 +18,9 @@ "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurface.java", "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java", "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java", - "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java", "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java", "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceProperties.java", + "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayout.java", "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinder.java", "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherCoordinator.java", "//chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/SingleTabSwitcherMediator.java",
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java index 14e49055..dfda9ffa 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
@@ -405,9 +405,9 @@ mMediator.softCleanup(); } - void prepareOverview() { - mRecyclerView.prepareOverview(); - mMediator.prepareOverview(); + void prepareTabSwitcherView() { + mRecyclerView.prepareTabSwitcherView(); + mMediator.prepareTabSwitcherView(); } void postHiding() {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java index 122a7ac0..f9b99555 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -1078,7 +1078,7 @@ * Hide the blue border for selected tab for the Tab-to-Grid resizing stage. * The selected border should re-appear in the final fading-in stage. */ - void prepareOverview() { + void prepareTabSwitcherView() { if (!TabUiFeatureUtilities.isTabToGtsAnimationEnabled() || !mTabModelSelector.isTabStateInitialized()) { return;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java index 5c231a8a..630576c 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java
@@ -4,7 +4,7 @@ package org.chromium.chrome.browser.tasks.tab_management; -import static org.chromium.chrome.features.start_surface.StartSurfaceLayout.ZOOMING_DURATION; +import static org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout.ZOOMING_DURATION; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -169,7 +169,7 @@ mListener = listener; } - void prepareOverview() { + void prepareTabSwitcherView() { endAllAnimations(); registerDynamicView();
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java index 9e3c591c..080ca16 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java
@@ -58,28 +58,29 @@ DynamicResourceLoader dynamicResourceLoader, SnackbarManager snackbarManager, ModalDialogManager modalDialogManager); - // TODO(960196): Remove the following interfaces when the associated bug is resolved. + // TODO(1322733): Remove the following interfaces when we find a better way to notify the layout + // that the GTS animation is finished. /** * An observer that is notified when the TabSwitcher view state changes. */ - interface OverviewModeObserver { + interface TabSwitcherViewObserver { /** - * Called when overview mode starts showing. + * Called when tab switcher starts showing. */ void startedShowing(); /** - * Called when overview mode finishes showing. + * Called when tab switcher finishes showing. */ void finishedShowing(); /** - * Called when overview mode starts hiding. + * Called when tab switcher starts hiding. */ void startedHiding(); /** - * Called when overview mode finishes hiding. + * Called when tab switcher finishes hiding. */ void finishedHiding(); } @@ -91,29 +92,32 @@ /** * @return Whether or not the overview {@link Layout} is visible. */ + // TODO(crbug.com/1315676): Remove this method after removing the usage in + // StartSurfaceMediator. + @Deprecated // This method will be removed, please do not use. boolean overviewVisible(); /** - * @param listener Registers {@code listener} for overview mode status changes. + * @param listener Registers {@code listener} for tab switcher status changes. */ - void addOverviewModeObserver(OverviewModeObserver listener); + void addTabSwitcherViewObserver(TabSwitcherViewObserver listener); /** - * @param listener Unregisters {@code listener} for overview mode status changes. + * @param listener Unregisters {@code listener} for tab switcher status changes. */ - void removeOverviewModeObserver(OverviewModeObserver listener); + void removeTabSwitcherViewObserver(TabSwitcherViewObserver listener); /** - * Hide the overview. + * Hide the tab switcher view. * @param animate Whether we should animate while hiding. */ - void hideOverview(boolean animate); + void hideTabSwitcherView(boolean animate); /** - * Show the overview. + * Show the tab switcher view. * @param animate Whether we should animate while showing. */ - void showOverview(boolean animate); + void showTabSwitcherView(boolean animate); /** * Called by the StartSurfaceLayout when the system back button is pressed. @@ -185,16 +189,16 @@ long getLastDirtyTime(); /** - * Before calling {@link Controller#showOverview} to start showing the + * Before calling {@link Controller#showTabSwitcherView} to start showing the * TabSwitcher {@link TabListRecyclerView}, call this to populate it without making it * visible. * @return Whether the {@link TabListRecyclerView} can be shown quickly. */ - boolean prepareOverview(); + boolean prepareTabSwitcherView(); /** * This is called after the compositor animation is done, for potential clean-up work. - * {@link OverviewModeObserver#finishedHiding} happens after + * {@link TabSwitcherViewObserver#finishedHiding} happens after * the Android View animation, but before the compositor animation. */ void postHiding();
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java index b8e8d9e..a0a2e76b 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
@@ -221,7 +221,7 @@ mContainerViewChangeProcessor = PropertyModelChangeProcessor.create(containerViewModel, mTabListCoordinator.getContainerView(), TabListContainerViewBinder::bind); - mMediator.addOverviewModeObserver(new OverviewModeObserver() { + mMediator.addTabSwitcherViewObserver(new TabSwitcherViewObserver() { @Override public void startedShowing() { if (mMode == TabListMode.GRID) sIsGridTabSwitcherShowing = true; @@ -241,7 +241,7 @@ if (TabUiFeatureUtilities.isLaunchPolishEnabled() && TabUiFeatureUtilities.isTabGroupsAndroidContinuationEnabled(activity)) { - mMediator.addOverviewModeObserver(new OverviewModeObserver() { + mMediator.addTabSwitcherViewObserver(new TabSwitcherViewObserver() { @Override public void startedShowing() {} @@ -483,9 +483,9 @@ } @Override - public boolean prepareOverview() { - boolean quick = mMediator.prepareOverview(); - mTabListCoordinator.prepareOverview(); + public boolean prepareTabSwitcherView() { + boolean quick = mMediator.prepareTabSwitcherView(); + mTabListCoordinator.prepareTabSwitcherView(); return quick; }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java index 72b70e76..b04d9d1 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
@@ -59,6 +59,7 @@ import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; import org.chromium.chrome.browser.tasks.tab_management.TabListCoordinator.TabListMode; import org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegate.TabSwitcherType; +import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.TabSwitcherViewObserver; import org.chromium.chrome.features.start_surface.StartSurfaceUserData; import org.chromium.chrome.tab_ui.R; import org.chromium.content_public.browser.UiThreadTaskTraits; @@ -101,7 +102,7 @@ private final TabModelSelector mTabModelSelector; private final TabModelObserver mTabModelObserver; private final TabModelSelectorObserver mTabModelSelectorObserver; - private final ObserverList<TabSwitcher.OverviewModeObserver> mObservers = new ObserverList<>(); + private final ObserverList<TabSwitcherViewObserver> mObservers = new ObserverList<>(); private final BrowserControlsStateProvider mBrowserControlsStateProvider; private final BrowserControlsStateProvider.Observer mBrowserControlsObserver; private final ViewGroup mContainerView; @@ -613,17 +614,17 @@ } @Override - public void addOverviewModeObserver(TabSwitcher.OverviewModeObserver observer) { + public void addTabSwitcherViewObserver(TabSwitcherViewObserver observer) { mObservers.addObserver(observer); } @Override - public void removeOverviewModeObserver(TabSwitcher.OverviewModeObserver observer) { + public void removeTabSwitcherViewObserver(TabSwitcherViewObserver observer) { mObservers.removeObserver(observer); } @Override - public void hideOverview(boolean animate) { + public void hideTabSwitcherView(boolean animate) { if (!animate) mContainerViewModel.set(ANIMATE_VISIBILITY_CHANGES, false); setVisibility(false); mContainerViewModel.set(ANIMATE_VISIBILITY_CHANGES, true); @@ -663,7 +664,7 @@ mFirstMeaningfulPaintRecorder = null; } - boolean prepareOverview() { + boolean prepareTabSwitcherView() { mHandler.removeCallbacks(mSoftClearTabListRunnable); mHandler.removeCallbacks(mClearTabListRunnable); boolean quick = false; @@ -691,7 +692,7 @@ } @Override - public void showOverview(boolean animate) { + public void showTabSwitcherView(boolean animate) { mHandler.removeCallbacks(mSoftClearTabListRunnable); mHandler.removeCallbacks(mClearTabListRunnable); if (mTabModelSelector.isTabStateInitialized()) { @@ -721,28 +722,28 @@ @Override public void startedShowing(boolean isAnimating) { - for (TabSwitcher.OverviewModeObserver observer : mObservers) { + for (TabSwitcherViewObserver observer : mObservers) { observer.startedShowing(); } } @Override public void finishedShowing() { - for (TabSwitcher.OverviewModeObserver observer : mObservers) { + for (TabSwitcherViewObserver observer : mObservers) { observer.finishedShowing(); } } @Override public void startedHiding(boolean isAnimating) { - for (TabSwitcher.OverviewModeObserver observer : mObservers) { + for (TabSwitcherViewObserver observer : mObservers) { observer.startedHiding(); } } @Override public void finishedHiding() { - for (TabSwitcher.OverviewModeObserver observer : mObservers) { + for (TabSwitcherViewObserver observer : mObservers) { observer.finishedHiding(); } }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java index aab5f88..b23b115a 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java
@@ -41,7 +41,7 @@ import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.features.start_surface.StartSurfaceLayout; +import org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout; import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; @@ -81,7 +81,7 @@ public void setUp() { mActivityTestRule.startMainActivityFromLauncher(); Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(); - assertTrue(layout instanceof StartSurfaceLayout); + assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout); CriteriaHelper.pollUiThread( mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized); }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java index 263a757..cb44b8c 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
@@ -99,7 +99,7 @@ import org.chromium.chrome.browser.night_mode.ChromeNightModeTestUtils; import org.chromium.chrome.browser.tasks.pseudotab.TabAttributeCache; import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; -import org.chromium.chrome.features.start_surface.StartSurfaceLayout; +import org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout; import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; @@ -164,7 +164,7 @@ TabUiFeatureUtilities.setTabManagementModuleSupportedForTesting(true); mActivityTestRule.startMainActivityOnBlankPage(); Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(); - assertTrue(layout instanceof StartSurfaceLayout); + assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout); CriteriaHelper.pollUiThread( mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized); }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java index 3626839..4d60f61 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java
@@ -59,7 +59,7 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; -import org.chromium.chrome.features.start_surface.StartSurfaceLayout; +import org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout; import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; @@ -111,7 +111,7 @@ public void setUp() { mActivityTestRule.startMainActivityOnBlankPage(); Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(); - assertTrue(layout instanceof StartSurfaceLayout); + assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout); CriteriaHelper.pollUiThread( mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized); mModalDialogManager = TestThreadUtils.runOnUiThreadBlockingNoException(
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java index 9696d38..5fb0219 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java
@@ -63,7 +63,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.chrome.browser.tasks.pseudotab.TabAttributeCache; -import org.chromium.chrome.features.start_surface.StartSurfaceLayout; +import org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout; import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; @@ -106,7 +106,7 @@ public void setUp() { mActivityTestRule.startMainActivityFromLauncher(); Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(); - assertTrue(layout instanceof StartSurfaceLayout); + assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout); CriteriaHelper.pollUiThread( mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized); }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java index d3610b6..2e84f97 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
@@ -42,7 +42,7 @@ import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.features.start_surface.StartSurfaceLayout; +import org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout; import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; @@ -67,7 +67,7 @@ public void setUp() { mActivityTestRule.startMainActivityFromLauncher(); Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(); - assertTrue(layout instanceof StartSurfaceLayout); + assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout); CriteriaHelper.pollUiThread( mActivityTestRule.getActivity().getTabModelSelector()::isTabStateInitialized); }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java index 74fcb64..d397a5b 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherTabletTest.java
@@ -51,7 +51,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; import org.chromium.chrome.browser.toolbar.top.TabSwitcherModeTopToolbar; import org.chromium.chrome.browser.toolbar.top.ToolbarTablet; -import org.chromium.chrome.features.start_surface.StartSurfaceLayout; +import org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout; import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; @@ -103,10 +103,12 @@ .get()::isTabStateInitialized); Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(); - assertTrue(layout instanceof StartSurfaceLayout); - StartSurfaceLayout mStartSurfaceLayout = (StartSurfaceLayout) layout; + assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout); + TabSwitcherAndStartSurfaceLayout mTabSwitcherAndStartSurfaceLayout = + (TabSwitcherAndStartSurfaceLayout) layout; - mTabListDelegate = mStartSurfaceLayout.getStartSurfaceForTesting().getGridTabListDelegate(); + mTabListDelegate = mTabSwitcherAndStartSurfaceLayout.getStartSurfaceForTesting() + .getGridTabListDelegate(); Callback<Bitmap> mBitmapListener = (bitmap) -> mAllBitmaps.add(new WeakReference<>(bitmap)); mTabListDelegate.setBitmapCallbackForTesting(mBitmapListener);
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java index e0ee2b27..4b6709d3 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
@@ -59,6 +59,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelObserver; import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl; import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; +import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher.TabSwitcherViewObserver; import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features.DisableFeatures; @@ -120,7 +121,7 @@ @Mock PropertyObservable.PropertyObserver<PropertyKey> mPropertyObserver; @Mock - TabSwitcher.OverviewModeObserver mOverviewModeObserver; + TabSwitcherViewObserver mTabSwitcherViewObserver; @Mock CompositorViewHolder mCompositorViewHolder; @Mock @@ -221,7 +222,7 @@ TabListCoordinator.TabListMode.GRID); mMediator.initWithNative(controller); - mMediator.addOverviewModeObserver(mOverviewModeObserver); + mMediator.addTabSwitcherViewObserver(mTabSwitcherViewObserver); mMediator.setOnTabSelectingListener(mLayout::onTabSelecting); } @@ -233,7 +234,7 @@ @Test public void showsWithAnimation() { initAndAssertAllProperties(); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); assertThat( mModel.get(TabListContainerProperties.ANIMATE_VISIBILITY_CHANGES), equalTo(true)); @@ -245,7 +246,7 @@ public void showsWithoutAnimation() { doReturn(true).when(mTabModelSelector).isTabStateInitialized(); initAndAssertAllProperties(); - mMediator.showOverview(false); + mMediator.showTabSwitcherView(false); InOrder inOrder = inOrder(mPropertyObserver, mPropertyObserver); inOrder.verify(mPropertyObserver) @@ -274,7 +275,7 @@ doReturn(true).when(mTabModelSelector).isTabStateInitialized(); initAndAssertAllProperties(); - mMediator.showOverview(false); + mMediator.showTabSwitcherView(false); InOrder inOrder = inOrder(mPropertyObserver, mPropertyObserver); inOrder.verify(mPropertyObserver) @@ -301,13 +302,13 @@ public void hidesWithAnimation() { initAndAssertAllProperties(); mMediator.setTabGridDialogController(mTabGridDialogController); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); assertThat( mModel.get(TabListContainerProperties.ANIMATE_VISIBILITY_CHANGES), equalTo(true)); assertThat(mModel.get(TabListContainerProperties.IS_VISIBLE), equalTo(true)); - mMediator.hideOverview(true); + mMediator.hideTabSwitcherView(true); assertThat( mModel.get(TabListContainerProperties.ANIMATE_VISIBILITY_CHANGES), equalTo(true)); @@ -320,13 +321,13 @@ public void hidesWithoutAnimation() { initAndAssertAllProperties(); mMediator.setTabGridDialogController(mTabGridDialogController); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); assertThat( mModel.get(TabListContainerProperties.ANIMATE_VISIBILITY_CHANGES), equalTo(true)); assertThat(mModel.get(TabListContainerProperties.IS_VISIBLE), equalTo(true)); - mMediator.hideOverview(false); + mMediator.hideTabSwitcherView(false); InOrder inOrder = inOrder(mPropertyObserver, mPropertyObserver); inOrder.verify(mPropertyObserver) @@ -347,28 +348,28 @@ public void startedShowingPropagatesToObservers() { initAndAssertAllProperties(); mModel.get(TabListContainerProperties.VISIBILITY_LISTENER).startedShowing(true); - verify(mOverviewModeObserver).startedShowing(); + verify(mTabSwitcherViewObserver).startedShowing(); } @Test public void finishedShowingPropagatesToObservers() { initAndAssertAllProperties(); mModel.get(TabListContainerProperties.VISIBILITY_LISTENER).finishedShowing(); - verify(mOverviewModeObserver).finishedShowing(); + verify(mTabSwitcherViewObserver).finishedShowing(); } @Test public void startedHidingPropagatesToObservers() { initAndAssertAllProperties(); mModel.get(TabListContainerProperties.VISIBILITY_LISTENER).startedHiding(true); - verify(mOverviewModeObserver).startedHiding(); + verify(mTabSwitcherViewObserver).startedHiding(); } @Test public void finishedHidingPropagatesToObservers() { initAndAssertAllProperties(); mModel.get(TabListContainerProperties.VISIBILITY_LISTENER).finishedHiding(); - verify(mOverviewModeObserver).finishedHiding(); + verify(mTabSwitcherViewObserver).finishedHiding(); } @Test @@ -503,7 +504,7 @@ @Test public void hidesWhenATabIsSelected() { initAndAssertAllProperties(); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); assertThat(mModel.get(TabListContainerProperties.IS_VISIBLE), equalTo(true)); doReturn(true).when(mTabModelSelector).isTabStateInitialized(); @@ -516,7 +517,7 @@ public void doesNotHideWhenSelectedTabChangedDueToTabClosure() { doReturn(true).when(mTabModelSelector).isTabStateInitialized(); initAndAssertAllProperties(); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); assertThat(mModel.get(TabListContainerProperties.IS_VISIBLE), equalTo(true)); doReturn(true).when(mTab3).isClosing(); @@ -532,7 +533,7 @@ public void doesNotHideWhenSelectedTabChangedDueToUndoTabClosure() { doReturn(true).when(mTabModelSelector).isTabStateInitialized(); initAndAssertAllProperties(); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); assertThat(mModel.get(TabListContainerProperties.IS_VISIBLE), equalTo(true)); doReturn(true).when(mTab3).isClosing(); @@ -547,7 +548,7 @@ public void doesNotHideWhenSelectedTabChangedDueToModelChange() { doReturn(true).when(mTabModelSelector).isTabStateInitialized(); initAndAssertAllProperties(); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); assertThat(mModel.get(TabListContainerProperties.IS_VISIBLE), equalTo(true)); mTabModelSelectorObserverCaptor.getValue().onTabModelSelected(mTabModel, null); @@ -561,7 +562,7 @@ @Test public void updatesResetHandlerOnRestoreCompleted() { initAndAssertAllProperties(); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); assertThat(mModel.get(TabListContainerProperties.IS_VISIBLE), equalTo(true)); mTabModelObserverCaptor.getValue().restoreCompleted(); @@ -573,7 +574,7 @@ @Test public void setInitialScrollIndexOnRestoreCompleted() { initAndAssertAllProperties(); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); assertThat(mModel.get(TabListContainerProperties.IS_VISIBLE), equalTo(true)); mModel.set(TabListContainerProperties.INITIAL_SCROLL_INDEX, 1); @@ -672,7 +673,7 @@ public void showOverviewDoesNotUpdateResetHandlerBeforeRestoreCompleted() { initAndAssertAllProperties(); doReturn(false).when(mTabModelSelector).isTabStateInitialized(); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); // MRU will be false unless the start surface is enabled. verify(mResetHandler, never()).resetWithTabList(mTabModelFilter, true, false); @@ -682,7 +683,7 @@ public void prepareOverviewDoesNotUpdateResetHandlerBeforeRestoreCompleted() { initAndAssertAllProperties(); doReturn(false).when(mTabModelSelector).isTabStateInitialized(); - mMediator.prepareOverview(); + mMediator.prepareTabSwitcherView(); // MRU will be false unless the start surface is enabled. verify(mResetHandler, never()).resetWithTabList(mTabModelFilter, false, false); @@ -693,7 +694,7 @@ initAndAssertAllProperties(); doReturn(true).when(mTabModelSelector).isTabStateInitialized(); - mMediator.showOverview(true); + mMediator.showTabSwitcherView(true); // MRU will be false unless the start surface is enabled. verify(mResetHandler).resetWithTabList(mTabModelFilter, true, false); @@ -704,7 +705,7 @@ initAndAssertAllProperties(); doReturn(true).when(mTabModelSelector).isTabStateInitialized(); - mMediator.prepareOverview(); + mMediator.prepareTabSwitcherView(); // MRU will be false unless the start surface is enabled. verify(mResetHandler).resetWithTabList(mTabModelFilter, false, false); @@ -717,7 +718,7 @@ mModel.set(TabListContainerProperties.INITIAL_SCROLL_INDEX, 1); - mMediator.prepareOverview(); + mMediator.prepareTabSwitcherView(); assertThat(mModel.get(TabListContainerProperties.INITIAL_SCROLL_INDEX), equalTo(0)); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index ff3b36e..e822c6ac 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -889,7 +889,7 @@ if (ReturnToChromeUtil.isStartSurfaceEnabled(this) && getCurrentTabModel().getCount() > 0 && !isTablet() && !shouldShowOverviewPageOnStart() && !isInOverviewMode() && mStartSurfaceSupplier.get() != null) { - mStartSurfaceSupplier.get().getController().setOverviewState( + mStartSurfaceSupplier.get().getController().setStartSurfaceState( StartSurfaceState.NOT_SHOWN, NewTabPageLaunchOrigin.UNKNOWN); } } @@ -2416,7 +2416,7 @@ || !HomepageManager.isHomepageEnabled()) { state = StartSurfaceState.SHOWING_TABSWITCHER; } - mStartSurfaceSupplier.get().getController().setOverviewState(state, launchOrigin); + mStartSurfaceSupplier.get().getController().setStartSurfaceState(state, launchOrigin); } if (mLayoutManager == null) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/prefeditor/EditorDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/prefeditor/EditorDialog.java index 85735686..8f4d5d9f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/prefeditor/EditorDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/prefeditor/EditorDialog.java
@@ -43,6 +43,7 @@ import org.chromium.chrome.browser.autofill.AutofillUiUtils; import org.chromium.chrome.browser.autofill.settings.CreditCardNumberFormattingTextWatcher; import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.components.autofill.prefeditor.EditorFieldModel; import org.chromium.components.autofill.prefeditor.EditorFieldView; import org.chromium.components.autofill.prefeditor.EditorObserverForTest; @@ -638,13 +639,18 @@ private void initFocus() { mHandler.post(() -> { - List<EditorFieldView> invalidViews = getViewsWithInvalidInformation(false); - if (!invalidViews.isEmpty()) { - // Immediately focus the first invalid field to make it faster to edit. - invalidViews.get(0).scrollToAndFocus(); - } else { - // Trigger default focus as it is not triggered automatically on Android P+. - mLayout.requestFocus(); + // If TalkBack is enabled, we want to keep the focus at the top + // because the user would not learn about the elements that are + // above the focused field. + if (!ChromeAccessibilityUtil.get().isAccessibilityEnabled()) { + List<EditorFieldView> invalidViews = getViewsWithInvalidInformation(false); + if (!invalidViews.isEmpty()) { + // Immediately focus the first invalid field to make it faster to edit. + invalidViews.get(0).scrollToAndFocus(); + } else { + // Trigger default focus as it is not triggered automatically on Android P+. + mLayout.requestFocus(); + } } // Note that keyboard will not be shown for dropdown field since it's not necessary. if (getCurrentFocus() != null) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java index 3acfa06..1ca6b4d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
@@ -77,7 +77,7 @@ * should be used, otherwise GTS should be used. * @param tabContentManagerSupplier Supplier of the {@link TabContentManager} instance. * @param topUiThemeColorProvider {@link ThemeColorProvider} for top UI. - * @param startSurfaceScrimAnchor {@link ViewGroup} used by start surface layout to show scrim + * @param tabSwitcherScrimAnchor {@link ViewGroup} used by tab switcher layout to show scrim * when overview is visible. * @param scrimCoordinator {@link ScrimCoordinator} to show/hide scrim. */ @@ -85,7 +85,7 @@ boolean createOverviewLayout, @Nullable StartSurface startSurface, ObservableSupplier<TabContentManager> tabContentManagerSupplier, Supplier<TopUiThemeColorProvider> topUiThemeColorProvider, JankTracker jankTracker, - ViewGroup startSurfaceScrimAnchor, ScrimCoordinator scrimCoordinator) { + ViewGroup tabSwitcherScrimAnchor, ScrimCoordinator scrimCoordinator) { super(host, contentContainer, tabContentManagerSupplier, topUiThemeColorProvider); Context context = host.getContext(); LayoutRenderHost renderHost = host.getLayoutRenderHost(); @@ -109,9 +109,9 @@ if (startSurface != null) { assert TabUiFeatureUtilities.isGridTabSwitcherEnabled(context); - mOverviewLayout = StartSurfaceDelegate.createStartSurfaceLayout(context, this, - renderHost, startSurface, jankTracker, startSurfaceScrimAnchor, - scrimCoordinator); + mOverviewLayout = StartSurfaceDelegate.createTabSwitcherAndStartSurfaceLayout( + context, this, renderHost, startSurface, jankTracker, + tabSwitcherScrimAnchor, scrimCoordinator); if (TabUiFeatureUtilities.isTabletGridTabSwitcherEnabled(context)) { mTabSwitcherFocusLayoutStateObserver = new LayoutStateObserver() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java index f58b69e..24eddbf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java
@@ -42,7 +42,7 @@ * @param startSurface An interface to talk to the Grid Tab Switcher. * @param tabContentManagerSupplier Supplier of the {@link TabContentManager} instance. * @param topUiThemeColorProvider {@link ThemeColorProvider} for top UI. - * @param startSurfaceScrimAnchor {@link ViewGroup} used by start surface layout to show scrim + * @param tabSwitcherScrimAnchor {@link ViewGroup} used by tab switcher layout to show scrim * when overview is visible. * @param scrimCoordinator {@link ScrimCoordinator} to show/hide scrim. */ @@ -50,12 +50,12 @@ StartSurface startSurface, ObservableSupplier<TabContentManager> tabContentManagerSupplier, Supplier<TopUiThemeColorProvider> topUiThemeColorProvider, JankTracker jankTracker, - ViewGroup startSurfaceScrimAnchor, ScrimCoordinator scrimCoordinator, + ViewGroup tabSwitcherScrimAnchor, ScrimCoordinator scrimCoordinator, ActivityLifecycleDispatcher lifecycleDispatcher) { super(host, contentContainer, TabUiFeatureUtilities.isGridTabSwitcherEnabled(host.getContext()), startSurface, tabContentManagerSupplier, topUiThemeColorProvider, jankTracker, - startSurfaceScrimAnchor, scrimCoordinator); + tabSwitcherScrimAnchor, scrimCoordinator); mTabStripLayoutHelperManager = new StripLayoutHelperManager(host.getContext(), this, mHost.getLayoutRenderHost(), () -> mLayerTitleCache, lifecycleDispatcher);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java index 7cd4ccc..44803f8d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
@@ -597,11 +597,17 @@ } @Override + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void stopLoading() { if (isLoading()) { RewindableIterator<TabObserver> observers = getTabObservers(); while (observers.hasNext()) { - observers.next().onPageLoadFinished(this, getUrl()); + TabObserver observer = observers.next(); + String s = "TabImpl::stopLoading observer:" + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.onPageLoadFinished(this, getUrl()); + } } } if (getWebContents() != null) getWebContents().stop(); @@ -1018,19 +1024,33 @@ * @param toDifferentDocument Whether this navigation will transition between * documents (i.e., not a fragment navigation or JS History API call). */ + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") void onLoadStarted(boolean toDifferentDocument) { if (toDifferentDocument) mIsLoading = true; - for (TabObserver observer : mObservers) observer.onLoadStarted(this, toDifferentDocument); + for (TabObserver observer : mObservers) { + String s = "TabImpl::onLoadStarted observer:" + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.onLoadStarted(this, toDifferentDocument); + } + } } /** * Called when a navigation completes and no other navigation is in progress. */ + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") void onLoadStopped() { // mIsLoading should only be false if this is a same-document navigation. boolean toDifferentDocument = mIsLoading; mIsLoading = false; - for (TabObserver observer : mObservers) observer.onLoadStopped(this, toDifferentDocument); + for (TabObserver observer : mObservers) { + String s = "TabImpl::onLoadStopped observer:" + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.onLoadStopped(this, toDifferentDocument); + } + } } void handleRendererResponsiveStateChanged(boolean isResponsive) { @@ -1046,11 +1066,16 @@ * Called when a page has started loading. * @param validatedUrl URL being loaded. */ + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") void didStartPageLoad(GURL validatedUrl) { updateTitle(); if (mIsRendererUnresponsive) handleRendererResponsiveStateChanged(true); for (TabObserver observer : mObservers) { - observer.onPageLoadStarted(this, validatedUrl); + String s = "TabImpl::didStartPageLoad observer:" + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.onPageLoadStarted(this, validatedUrl); + } } } @@ -1058,10 +1083,17 @@ * Called when a page has finished loading. * @param url URL that was loaded. */ + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") void didFinishPageLoad(GURL url) { updateTitle(); - for (TabObserver observer : mObservers) observer.onPageLoadFinished(this, url); + for (TabObserver observer : mObservers) { + String s = "TabImpl::didFinishPageLoad observer:" + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.onPageLoadFinished(this, url); + } + } mIsBeingRestored = false; } @@ -1093,8 +1125,15 @@ * Notify the observers that the load progress has changed. * @param progress The current percentage of progress. */ + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") void notifyLoadProgress(float progress) { - for (TabObserver observer : mObservers) observer.onLoadProgressChanged(this, progress); + for (TabObserver observer : mObservers) { + String s = "TabImpl::notifyLoadProgress observer:" + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.onLoadProgressChanged(this, progress); + } + } } /** @@ -1176,8 +1215,15 @@ /** * Calls onContentChanged on all TabObservers and updates accessibility visibility. */ + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") void notifyContentChanged() { - for (TabObserver observer : mObservers) observer.onContentChanged(this); + for (TabObserver observer : mObservers) { + String s = "TabImpl::notifyContentChanged observer:" + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.onContentChanged(this); + } + } } void updateThemeColor(int themeColor) { @@ -1445,17 +1491,29 @@ } } + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") private void notifyPageTitleChanged() { RewindableIterator<TabObserver> observers = getTabObservers(); while (observers.hasNext()) { - observers.next().onTitleUpdated(this); + TabObserver observer = observers.next(); + String s = "TabImpl::notifyPageTitleChanged observer:" + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.onTitleUpdated(this); + } } } + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") private void notifyFaviconChanged() { RewindableIterator<TabObserver> observers = getTabObservers(); while (observers.hasNext()) { - observers.next().onFaviconUpdated(this, null); + TabObserver observer = observers.next(); + String s = "TabImpl::notifyFaviconChanged observer:" + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.onFaviconUpdated(this, null); + } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java index 1cc477e9..65b923c4c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
@@ -16,6 +16,7 @@ import org.chromium.base.Log; import org.chromium.base.ObserverList; import org.chromium.base.ObserverList.RewindableIterator; +import org.chromium.base.TraceEvent; import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.R; import org.chromium.chrome.browser.AppHooks; @@ -232,6 +233,8 @@ mTab.updateTitle(title); } + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") @Override public void didStartNavigation(NavigationHandle navigation) { if (navigation.isInPrimaryMainFrame() && !navigation.isSameDocument()) { @@ -240,23 +243,42 @@ RewindableIterator<TabObserver> observers = mTab.getTabObservers(); while (observers.hasNext()) { - observers.next().onDidStartNavigation(mTab, navigation); + TabObserver observer = observers.next(); + String s = "TabWebContentsObserver::didStartNavigation observer:" + + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.onDidStartNavigation(mTab, navigation); + } } } @Override + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didRedirectNavigation(NavigationHandle navigation) { RewindableIterator<TabObserver> observers = mTab.getTabObservers(); while (observers.hasNext()) { - observers.next().onDidRedirectNavigation(mTab, navigation); + TabObserver observer = observers.next(); + String s = "TabWebContentsObserver::didRedirectNavigation observer:" + + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.onDidRedirectNavigation(mTab, navigation); + } } } @Override + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didFinishNavigation(NavigationHandle navigation) { RewindableIterator<TabObserver> observers = mTab.getTabObservers(); while (observers.hasNext()) { - observers.next().onDidFinishNavigation(mTab, navigation); + TabObserver observer = observers.next(); + String s = "TabWebContentsObserver::didFinishNavigation.onDidFinishNavigation " + + "observer:" + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.onDidFinishNavigation(mTab, navigation); + } } if (navigation.errorCode() != NetError.OK) { @@ -279,7 +301,13 @@ observers.rewind(); while (observers.hasNext()) { - observers.next().onUrlUpdated(mTab); + TabObserver observer = observers.next(); + String s = "TabWebContentsObserver::didFinishNavigation.onUrlUpdated " + + "observer:" + observer.getClass().getName(); + try (TraceEvent e = + TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.onUrlUpdated(mTab); + } } } @@ -297,10 +325,17 @@ } @Override + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didFirstVisuallyNonEmptyPaint() { RewindableIterator<TabObserver> observers = mTab.getTabObservers(); while (observers.hasNext()) { - observers.next().didFirstVisuallyNonEmptyPaint(mTab); + TabObserver observer = observers.next(); + String s = "TabWebContentsObserver::didFirstVisuallyNonEmptyPaint observer:" + + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.didFirstVisuallyNonEmptyPaint(mTab); + } } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java index b41cdc4..7a44b526 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java
@@ -76,7 +76,8 @@ import org.chromium.chrome.browser.theme.TopUiThemeColorProvider; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.chrome.features.start_surface.StartSurface; -import org.chromium.chrome.features.start_surface.StartSurfaceLayout; +import org.chromium.chrome.features.start_surface.StartSurface.TabSwitcherViewObserver; +import org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.browser.Features; @@ -112,7 +113,7 @@ private TabSwitcher.TabListDelegate mTabListDelegate; @Captor - private ArgumentCaptor<StartSurface.OverviewModeObserver> mStartSurfaceOverviewModeCaptor; + private ArgumentCaptor<TabSwitcherViewObserver> mTabSwitcherViewObserverArgumentCaptor; private long mLastDownTime; @@ -217,10 +218,10 @@ mManagerPhone = new LayoutManagerChromePhone(layoutManagerHost, container, mStartSurface, tabContentManagerSupplier, () -> mTopUiThemeColorProvider, new DummyJankTracker()); verify(mStartSurfaceController) - .addOverviewModeObserver(mStartSurfaceOverviewModeCaptor.capture()); + .addTabSwitcherViewObserver(mTabSwitcherViewObserverArgumentCaptor.capture()); doAnswer((Answer<Void>) invocation -> { - mStartSurfaceOverviewModeCaptor.getValue().finishedShowing(); + mTabSwitcherViewObserverArgumentCaptor.getValue().finishedShowing(); simulateTime(mManager, 1000); return null; }) @@ -228,11 +229,11 @@ .showOverview(anyBoolean()); doAnswer((Answer<Void>) invocation -> { - mStartSurfaceOverviewModeCaptor.getValue().finishedHiding(); + mTabSwitcherViewObserverArgumentCaptor.getValue().finishedHiding(); return null; }) .when(mStartSurfaceController) - .hideOverview(anyBoolean()); + .hideTabSwitcherView(anyBoolean()); tabContentManagerSupplier.set(tabContentManager); mManager = mManagerPhone; @@ -731,12 +732,12 @@ launchedChromeAndEnterTabSwitcher(); TestThreadUtils.runOnUiThreadBlocking(() -> { Layout activeLayout = getActiveLayout(); - Assert.assertTrue(activeLayout instanceof StartSurfaceLayout); - - StartSurfaceLayout startSurfaceLayout = (StartSurfaceLayout) activeLayout; + // TODO(crbug.com/1315676): Check LayoutType instead. + Assert.assertTrue(activeLayout instanceof TabSwitcherAndStartSurfaceLayout); Assert.assertEquals(expectedTabListMode, - startSurfaceLayout.getStartSurfaceForTesting() + mActivityTestRule.getActivity() + .getStartSurface() .getGridTabListDelegate() .getListModeForTesting()); });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java index 30acfd9..5441e70 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareButtonControllerTest.java
@@ -144,7 +144,7 @@ -> mActivityTestRule.getActivity() .getStartSurface() .getController() - .setOverviewState(StartSurfaceState.SHOWING_START)); + .setStartSurfaceState(StartSurfaceState.SHOWING_START)); LayoutTestUtils.startShowingAndWaitForLayout( mActivityTestRule.getActivity().getLayoutManager(), LayoutType.TAB_SWITCHER, false);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/AdaptiveToolbarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/AdaptiveToolbarTest.java index 52989252..7de9ebf8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/AdaptiveToolbarTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/AdaptiveToolbarTest.java
@@ -32,7 +32,7 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.incognito.IncognitoUtils; -import org.chromium.chrome.features.start_surface.StartSurfaceLayout; +import org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.ActivityTestUtils; @@ -80,7 +80,7 @@ setupFlagsAndLaunchActivity(true); final ChromeTabbedActivity cta = mActivityTestRule.getActivity(); Layout layout = cta.getLayoutManager().getOverviewLayout(); - assertTrue(layout instanceof StartSurfaceLayout); + assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout); enterTabSwitcher(cta); verifyTabSwitcherCardCount(cta, 1); @@ -103,7 +103,7 @@ setupFlagsAndLaunchActivity(true); final ChromeTabbedActivity cta = mActivityTestRule.getActivity(); Layout layout = cta.getLayoutManager().getOverviewLayout(); - assertTrue(layout instanceof StartSurfaceLayout); + assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout); enterTabSwitcher(cta); verifyTabSwitcherCardCount(cta, 1); @@ -131,7 +131,7 @@ setupFlagsAndLaunchActivity(true); final ChromeTabbedActivity cta = mActivityTestRule.getActivity(); Layout layout = cta.getLayoutManager().getOverviewLayout(); - assertTrue(layout instanceof StartSurfaceLayout); + assertTrue(layout instanceof TabSwitcherAndStartSurfaceLayout); enterTabSwitcher(cta); verifyTabSwitcherCardCount(cta, 1);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediatorTest.java index 76d4f736..fde788f 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediatorTest.java
@@ -13,6 +13,10 @@ import android.content.Context; import android.content.Intent; import android.content.res.Resources; +import android.graphics.drawable.Drawable; + +import androidx.annotation.ColorRes; +import androidx.annotation.DrawableRes; import org.junit.Before; import org.junit.Rule; @@ -23,6 +27,8 @@ import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; import org.robolectric.shadows.ShadowLooper; import org.chromium.base.ContextUtils; @@ -32,9 +38,11 @@ import org.chromium.base.supplier.Supplier; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.browser.history_clusters.HistoryClustersItemProperties.ItemType; +import org.chromium.chrome.browser.history_clusters.HistoryClustersMediatorTest.ShadowUiUtils; import org.chromium.chrome.browser.tab.Tab; import org.chromium.components.favicon.LargeIconBridge; import org.chromium.content_public.browser.LoadUrlParams; +import org.chromium.ui.UiUtils; import org.chromium.ui.modelutil.MVCListAdapter.ListItem; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; import org.chromium.ui.modelutil.PropertyModel; @@ -45,9 +53,18 @@ /** Unit tests for HistoryClustersMediator. */ @RunWith(BaseRobolectricTestRunner.class) -@Config(manifest = Config.NONE) +@Config(manifest = Config.NONE, shadows = {ShadowUiUtils.class}) public class HistoryClustersMediatorTest { private static final String ITEM_URL_SPEC = "https://www.wombats.com/"; + @Implements(UiUtils.class) + static class ShadowUiUtils { + static Drawable sDrawable; + @Implementation + public static Drawable getTintedDrawable( + Context context, @DrawableRes int drawableId, @ColorRes int tintColorId) { + return sDrawable; + } + } @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); @@ -72,13 +89,16 @@ private GURL mMockGurl; @Mock private Function<GURL, Intent> mUrlIntentCreator; + @Mock + private Drawable mDrawable; private ClusterVisit mVisit1; private ClusterVisit mVisit2; private ClusterVisit mVisit3; private HistoryCluster mCluster1; private HistoryCluster mCluster2; - private HistoryClustersResult mHistoryClustersResult; + private HistoryClustersResult mHistoryClustersResultWithQuery; + private HistoryClustersResult mHistoryClustersResultEmptyQuery; private ModelList mModelList; private PropertyModel mToolbarModel; private Intent mIntent = new Intent(); @@ -89,6 +109,7 @@ @Before public void setUp() { ContextUtils.initApplicationContextForTests(mContext); + ShadowUiUtils.sDrawable = mDrawable; doReturn(mResources).when(mContext).getResources(); doReturn(ITEM_URL_SPEC).when(mMockGurl).getSpec(); doReturn(mIntent).when(mUrlIntentCreator).apply(mMockGurl); @@ -104,8 +125,10 @@ Arrays.asList("foo"), Arrays.asList(mVisit1, mVisit2), "label1", new ArrayList<>()); mCluster2 = new HistoryCluster( Arrays.asList("bar", "baz"), Arrays.asList(mVisit3), "label2", new ArrayList<>()); - mHistoryClustersResult = new HistoryClustersResult( + mHistoryClustersResultWithQuery = new HistoryClustersResult( Arrays.asList(mCluster1, mCluster2), "query", false, false); + mHistoryClustersResultEmptyQuery = + new HistoryClustersResult(Arrays.asList(mCluster1, mCluster2), "", false, false); } @Test @@ -121,7 +144,7 @@ mMediator.query("query"); assertEquals(mModelList.size(), 0); - fulfillPromise(promise, mHistoryClustersResult); + fulfillPromise(promise, mHistoryClustersResultWithQuery); assertEquals(mModelList.size(), 3); ListItem item = mModelList.get(0); @@ -131,6 +154,21 @@ Arrays.asList(HistoryClustersItemProperties.CLICK_HANDLER, HistoryClustersItemProperties.TITLE, HistoryClustersItemProperties.URL))); } + @Test + public void testEmptyQuery() { + Promise<HistoryClustersResult> promise = new Promise<>(); + doReturn(promise).when(mBridge).queryClusters(""); + + mMediator.query(""); + fulfillPromise(promise, mHistoryClustersResultEmptyQuery); + + assertEquals(mModelList.size(), 2); + ListItem item = mModelList.get(0); + assertEquals(item.type, ItemType.CLUSTER); + PropertyModel model = item.model; + assertTrue(model.getAllSetProperties().containsAll(Arrays.asList( + HistoryClustersItemProperties.CLICK_HANDLER, HistoryClustersItemProperties.LABEL))); + } @Test public void testOpenInFullPageTablet() {
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 677e585..e78ed71 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-103.0.5045.0_rc-r1-merged.afdo.bz2 +chromeos-chrome-amd64-103.0.5060.6_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 6635efd..fb67b0c 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -9545,9 +9545,6 @@ Sync settings </message> <if expr="chromeos_lacros"> - <message name="IDS_SYNC_CONFIRMATION_TITLE_LACROS_NON_FORCED" desc="Title of the sync confirmation dialog/screen on lacros when sync is not forced."> - Turn on Chrome browser sync? - </message> <message name="IDS_SYNC_CONFIRMATION_TITLE_LACROS" desc="Title of the sync confirmation dialog/screen on lacros."> Chrome browser sync is on </message>
diff --git a/chrome/app/generated_resources_grd/IDS_SYNC_CONFIRMATION_TITLE_LACROS_NON_FORCED.png.sha1 b/chrome/app/generated_resources_grd/IDS_SYNC_CONFIRMATION_TITLE_LACROS_NON_FORCED.png.sha1 deleted file mode 100644 index 1d05dd0b..0000000 --- a/chrome/app/generated_resources_grd/IDS_SYNC_CONFIRMATION_TITLE_LACROS_NON_FORCED.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -726e2317363b54d1d4bce3f45d083e180bb3bd81 \ No newline at end of file
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp index 0e94fc6..3d1bf95 100644 --- a/chrome/app/os_settings_strings.grdp +++ b/chrome/app/os_settings_strings.grdp
@@ -3203,13 +3203,16 @@ Your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> can then: </message> <message name="IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_CAMERA_ROLL_ITEM_SUMMARY" desc="The summary of the dialog containing the phone permissions opt-in flow shown when when a user clicks the Phone Hub 'Recent photos' setup button. Explains to the user that they need to grant Google Play Services permission to access files on the phone."> - View your phone's recent photos and media + View your phone's photos and media </message> <message name="IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_NOTIFICATION_ITEM_SUMMARY" desc="The summary of the dialog containing the phone permissions opt-in flow shown when when a user clicks the Phone Hub 'Notifications' setup button. Explains to the user that they need to grant permission to use notifications by enabling access to the Google Play Services app on their phone."> View, dismiss, and reply to your phone's notifications </message> <message name="IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_APPS_ITEM_SUMMARY" desc="The summary of the dialog containing the phone permissions opt-in flow shown when when a user clicks the Phone Hub 'Apps' setup button. Explains to the user that they need to grant phone permission to stream apps."> - Stream messaging apps + Stream your phone's apps + </message> + <message name="IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_INSTRUCTIONS" desc="The text shown in the dialog containing the phone permissions opt-in flow. Alerts the user that to grant permissions, they need to have their phone unlocked, close by, and with Bluetooth/Wi-Fi on to complete setup."> + Make sure your phone is close by, unlocked, and Bluetooth and Wi-Fi are turned on </message> <message name="IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_AWAITING_RESPONSE_TITLE" desc="The title of the dialog containing the phone permissions opt-in flow shown when the user needs to follow the setup flow instructions on their phone."> Finish setting up on your phone
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_APPS_ITEM_SUMMARY.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_APPS_ITEM_SUMMARY.png.sha1 index c99b365c..6b5692e 100644 --- a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_APPS_ITEM_SUMMARY.png.sha1 +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_APPS_ITEM_SUMMARY.png.sha1
@@ -1 +1 @@ -315f96b10a97a805cc10492e469e43a7b6f2d333 \ No newline at end of file +3e4aaa49c6c641fc3cd3b26f9cb306d0aa1b6855 \ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_CAMERA_ROLL_ITEM_SUMMARY.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_CAMERA_ROLL_ITEM_SUMMARY.png.sha1 index c99b365c..6b5692e 100644 --- a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_CAMERA_ROLL_ITEM_SUMMARY.png.sha1 +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_CAMERA_ROLL_ITEM_SUMMARY.png.sha1
@@ -1 +1 @@ -315f96b10a97a805cc10492e469e43a7b6f2d333 \ No newline at end of file +3e4aaa49c6c641fc3cd3b26f9cb306d0aa1b6855 \ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_INSTRUCTIONS.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_INSTRUCTIONS.png.sha1 new file mode 100644 index 0000000..6b5692e --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_INSTRUCTIONS.png.sha1
@@ -0,0 +1 @@ +3e4aaa49c6c641fc3cd3b26f9cb306d0aa1b6855 \ No newline at end of file
diff --git a/chrome/app/profiles_strings.grdp b/chrome/app/profiles_strings.grdp index 619c648..678d5ae 100644 --- a/chrome/app/profiles_strings.grdp +++ b/chrome/app/profiles_strings.grdp
@@ -698,13 +698,13 @@ Welcome to Chrome </message> <message name="IDS_PRIMARY_PROFILE_FIRST_RUN_SUBTITLE" desc="Subtitle of the landing screen in first run experience for the primary profile. The screen promotes Chrome sync."> - Get your Chrome browser stuff from <ph name="ACCOUNT_EMAIL">$1<ex>Jane.Doe@gmail.com</ex></ph> + Access your Chrome browser stuff from <ph name="ACCOUNT_EMAIL">$1<ex>Jane.Doe@gmail.com</ex></ph> </message> <message name="IDS_PRIMARY_PROFILE_FIRST_RUN_NEXT_BUTTON_LABEL" desc="Label of the 'next' button of the landing screen in first run experience for the primary profile. The screen promotes Chrome sync."> Let's go </message> <message name="IDS_PRIMARY_PROFILE_FIRST_RUN_SESSION_MANAGED_BY_DESCRIPTION" desc="Disclaimer on the landing screen in first run experience for the primary profile, informing that the session is managed by an administrator."> - Your account is managed by <ph name="MANAGER_NAME">$1<ex>example.com</ex></ph>. Your administrator can see and edit this Chrome browser profile and its data like bookmarks, history, and passwords. + Your account is managed by <ph name="MANAGER_NAME">$1<ex>example.com</ex></ph>. Your administrator can see and edit this Chrome browser profile and its data. Your data includes bookmarks, history, and passwords. </message> </if>
diff --git a/chrome/app/profiles_strings_grdp/IDS_PRIMARY_PROFILE_FIRST_RUN_SESSION_MANAGED_BY_DESCRIPTION.png.sha1 b/chrome/app/profiles_strings_grdp/IDS_PRIMARY_PROFILE_FIRST_RUN_SESSION_MANAGED_BY_DESCRIPTION.png.sha1 index 21c83f5..a54f825f 100644 --- a/chrome/app/profiles_strings_grdp/IDS_PRIMARY_PROFILE_FIRST_RUN_SESSION_MANAGED_BY_DESCRIPTION.png.sha1 +++ b/chrome/app/profiles_strings_grdp/IDS_PRIMARY_PROFILE_FIRST_RUN_SESSION_MANAGED_BY_DESCRIPTION.png.sha1
@@ -1 +1 @@ -326bf830998bb6dedf723e17f4a5bb468a1872f1 \ No newline at end of file +0da5976f4d66c817c3ded826cb4070505364fd1d \ No newline at end of file
diff --git a/chrome/app/profiles_strings_grdp/IDS_PRIMARY_PROFILE_FIRST_RUN_SUBTITLE.png.sha1 b/chrome/app/profiles_strings_grdp/IDS_PRIMARY_PROFILE_FIRST_RUN_SUBTITLE.png.sha1 index 21c83f5..a54f825f 100644 --- a/chrome/app/profiles_strings_grdp/IDS_PRIMARY_PROFILE_FIRST_RUN_SUBTITLE.png.sha1 +++ b/chrome/app/profiles_strings_grdp/IDS_PRIMARY_PROFILE_FIRST_RUN_SUBTITLE.png.sha1
@@ -1 +1 @@ -326bf830998bb6dedf723e17f4a5bb468a1872f1 \ No newline at end of file +0da5976f4d66c817c3ded826cb4070505364fd1d \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_af.xtb b/chrome/app/resources/chromium_strings_af.xtb index b271775..4e51cd01 100644 --- a/chrome/app/resources/chromium_strings_af.xtb +++ b/chrome/app/resources/chromium_strings_af.xtb
@@ -317,6 +317,7 @@ <translation id="8133124826068723441">Chromium-bedryfstelsel kon nie jou data sinkroniseer nie omdat sinkronisering nie vir jou domein beskikbaar is nie.</translation> <translation id="813913629614996137">Inisialiseer tans …</translation> <translation id="81770708095080097">Hierdie lêer is gevaarlik en daarom het Chromium dit geblokkeer.</translation> +<translation id="8213374284266571500">Chromium het hierdie lêer geblokkeer omdat hierdie soort lêer gevaarlik is</translation> <translation id="8248265253516264921">As 'n prent nie 'n nuttige beskrywing het nie, sal Chromium probeer om een vir jou te verskaf. Prente word na Google toe gestuur om beskrywings te skep. Jy kan dit enige tyd in instellings afskakel.</translation> <translation id="8266560134891435528">Chromium kan nie jou wagwoorde nagaan nie, want jy is nie aangemeld nie</translation> <translation id="8276522524898344151">Chromium probeer tans om wagwoorde te kopieer.</translation>
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb index 94556933..02b457f2 100644 --- a/chrome/app/resources/chromium_strings_am.xtb +++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -315,6 +315,7 @@ <translation id="8133124826068723441">ማስመር ለጎራዎ ስለማይገኝ ChromiumOS ውሂብዎን ማስመር አይችልም።</translation> <translation id="813913629614996137">በማስጀመር ላይ…</translation> <translation id="81770708095080097">ይህ ፋይል አደገኛ ስለሆነ Chromium አግዶታል።</translation> +<translation id="8213374284266571500">እንደዚህ አይነት ፋይል አደገኛ ስለሆነ Chromium ይህን ፋይል አግዶታል።</translation> <translation id="8248265253516264921">አንድ ምስል ጠቃሚ መግለጫ ከሌለው Chromium ለእርስዎ አንድ ለማቅረብ ይሞክራል። ዝርዝር መግለጫዎችን ለመፍጠር፣ ምስሎች ወደ Google ይላካሉ። ይህን በማንኛውም ጊዜ በቅንብሮች ውስጥ ሊያጠፉት ይችላሉ።</translation> <translation id="8266560134891435528">እርስዎ በመለያ ስላልገቡ ስለሆኑ Chromium የይለፍ ቃላትዎን መፈተሽ አይችልም</translation> <translation id="8276522524898344151">Chromium የይለፍ ቃላትን ለመቅዳት እየሞከረ ነው።</translation>
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb index 24f96df..7ae13ff 100644 --- a/chrome/app/resources/chromium_strings_az.xtb +++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -312,6 +312,7 @@ <translation id="8133124826068723441">ChromiumOS datanızı sinxronizasiya edə bilmədi, çünki sinxronizasiya domeniniz üçün əlçatan deyil.</translation> <translation id="813913629614996137">Başladılır...</translation> <translation id="81770708095080097">Bu fayl təklükəlidir, bu səbəbdən Chromium onu blok etdi.</translation> +<translation id="8213374284266571500">Chromium bu faylı bloklayıb, çünki bu fayl növü təhlükəlidir</translation> <translation id="8248265253516264921">Şəklin təsviri faydalı deyilsə, Chromium Sizin üçün təsviri təmin etməyə çalışacaq. Təsvir yaratmaq üçün şəkillər Google'a göndərilir. Bunu istənilən vaxt ayarlardan deaktiv edə bilərsiniz.</translation> <translation id="8266560134891435528">Hesaba daxil olmadığınız üçün Chromium parollarınızı yoxlaya bilmir</translation> <translation id="8276522524898344151">Chromium parolları kopyalamağa çalışır.</translation>
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb index ad8c6d41..8044caa 100644 --- a/chrome/app/resources/chromium_strings_bn.xtb +++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -313,6 +313,7 @@ <translation id="8133124826068723441">আপনার ডোমেনে সিঙ্ক করার সুবিধা উপলভ্য না থাকার জন্য ChromiumOS আপনার ডেটা সিঙ্ক পারেনি।</translation> <translation id="813913629614996137">আরম্ভ হচ্ছে…</translation> <translation id="81770708095080097">এই ফাইলটি বিপজ্জনক, তাই Chromium এটিকে অবরুদ্ধ করেছে।</translation> +<translation id="8213374284266571500">এই ধরনের ফাইল বিপজ্জনক বলে Chromium এটি ব্লক করেছে</translation> <translation id="8248265253516264921">কোনও ছবিতে যদি প্রয়োজনীয় বিবরণ দেওয়া না থাকে, তাহলে Chromium আপনাকে একটি বিবরণ দেওয়ার চেষ্টা করবে। বিবরণ তৈরির জন্য, Google-এ ছবি পাঠানো হয়। সেটিংসে গিয়ে আপনি যেকোনও সময়ে এটি বন্ধ করতে পারেন।</translation> <translation id="8266560134891435528">আপনি সাইন-ইন করে না থাকার কারণে Chromium আপনার পাসওয়ার্ড চেক করতে পারছে না</translation> <translation id="8276522524898344151">Chromium পাসওয়ার্ড কপি করার চেষ্টা করছে।</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb index 03aba8c..c6741e0f 100644 --- a/chrome/app/resources/chromium_strings_da.xtb +++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -315,6 +315,7 @@ <translation id="8133124826068723441">Chromium OS kunne ikke synkronisere dine data, fordi synkronisering ikke er tilgængeligt på dit domæne.</translation> <translation id="813913629614996137">Initialiserer...</translation> <translation id="81770708095080097">Denne fil er farlig, så Chromium har blokeret den.</translation> +<translation id="8213374284266571500">Chromium har blokeret denne fil, fordi denne type fil er skadelig</translation> <translation id="8248265253516264921">Hvis et billede ikke har en brugbar beskrivelse, forsøger Chromium at angive en for dig. Billederne sendes til Google, så der kan oprettes beskrivelser. Du kan til enhver tid deaktivere denne funktion i indstillingerne.</translation> <translation id="8266560134891435528">Chromium kan ikke tjekke dine adgangskoder, da du ikke er logget ind</translation> <translation id="8276522524898344151">Chromium forsøger at kopiere adgangskoder.</translation>
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb index 4ae16c06..34c903c9 100644 --- a/chrome/app/resources/chromium_strings_eu.xtb +++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -315,6 +315,7 @@ <translation id="8133124826068723441">Chromium OS-k ezin izan ditu sinkronizatu zure datuak sinkronizazioa ez dagoelako erabilgarri zure domeinuan.</translation> <translation id="813913629614996137">Hasieratzen…</translation> <translation id="81770708095080097">Fitxategia arriskutsua da; horregatik, blokeatu egin du Chromium-ek.</translation> +<translation id="8213374284266571500">Chromium-ek blokeatu egin du fitxategia mota horretako fitxategiak arriskutsuak direlako</translation> <translation id="8248265253516264921">Irudiren batek ez badu azalpen lagungarririk, halako bat lortzen ahaleginduko da Chromium. Azalpen horiek sortzeko, irudiak Google-ri bidaltzen zaizkio. Aukera hori desaktibatu nahi baduzu, joan ezarpenetara.</translation> <translation id="8266560134891435528">Chromium-ek ezin ditu egiaztatu pasahitzak saioa hasi ez duzulako</translation> <translation id="8276522524898344151">Pasahitzak kopiatzen saiatzen ari da Chromium.</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb index b3ac82a..5582dfc 100644 --- a/chrome/app/resources/chromium_strings_fa.xtb +++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -313,6 +313,7 @@ <translation id="8133124826068723441">ChromiumOS نتوانست دادههایتان را همگامسازی کند زیرا «همگامسازی» برای دامنه شما دردسترس نیست.</translation> <translation id="813913629614996137">درحال مقداردهی اولیه…</translation> <translation id="81770708095080097">این فایل خطرناک است، بنابراین Chromium آن را مسدود کرده است.</translation> +<translation id="8213374284266571500">Chromium این فایل را مسدود کرد زیرا این نوع فایل خطرناک است</translation> <translation id="8248265253516264921">اگر تصویری توضیح مفیدی نداشته باشد، Chromium توضیحی برای شما ارائه خواهد کرد. برای ایجاد توضیحات، تصاویر به Google ارسال میشود. هروقت خواستید میتوانید این گزینه را در تنظیمات خاموش کنید.</translation> <translation id="8266560134891435528">چون به سیستم وارد نشدهاید، Chromium نمیتواند گذرواژههایتان را بررسی کند</translation> <translation id="8276522524898344151">Chromium میخواهد گذرواژهها را کپی کند.</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb index 465afe928..09e281c 100644 --- a/chrome/app/resources/chromium_strings_fil.xtb +++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -317,6 +317,7 @@ <translation id="8133124826068723441">Hindi ma-sync ng ChromiumOS ang iyong data dahil hindi available ang Pag-sync para sa domain mo.</translation> <translation id="813913629614996137">Sinisimulan...</translation> <translation id="81770708095080097">Mapanganib ang file na ito, kaya na-block ito ng Chromium.</translation> +<translation id="8213374284266571500">Na-block ng Chromium ang file na ito dahil mapanganib ang ganitong uri ng file</translation> <translation id="8248265253516264921">Kung hindi sapat ang deskripsyon ng isang larawan, susubukan ng Chromium na ayusin ito para sa iyo. Para gumawa ng mga deskripsyon, ipinapadala ang mga larawan sa Google. Puwede mo itong i-off sa mga setting anumang oras.</translation> <translation id="8266560134891435528">Hindi masusuri ng Chromium ang iyong mga password dahil hindi ka naka-sign in</translation> <translation id="8276522524898344151">Sinusubukan ng Chromium na kopyahin ang mga password.</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb index 7524baa..4ecdf24 100644 --- a/chrome/app/resources/chromium_strings_gu.xtb +++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -317,6 +317,7 @@ <translation id="8133124826068723441">તમારા ડોમેન પર સિંકની સુવિધા ઉપલબ્ધ ન હોવાને કારણે ChromiumOS તમારા ડેટાને સિંક કરી શક્યું નથી.</translation> <translation id="813913629614996137">પ્રારંભ કરી રહ્યું છે...</translation> <translation id="81770708095080097">આ ફાઇલ જોખમી છે, તેથી Chromium એ તેને અવરોધિત કરેલ છે.</translation> +<translation id="8213374284266571500">આ પ્રકારની ફાઇલ જોખમી હોવાને કારણે Chromium દ્વારા આ ફાઇલને બ્લૉક કરવામાં આવી છે</translation> <translation id="8248265253516264921">જો છબીમાં ઉપયોગી વર્ણન ન હોય, તો Chromium તમને વર્ણન પૂરું પાડવાનો પ્રયાસ કરશે. વર્ણન બનાવવા માટે, Googleને છબીઓ મોકલવામાં આવે છે. તમે આને કોઈપણ સમયે સેટિંગમાં જઈને બંધ કરી શકો છો.</translation> <translation id="8266560134891435528">તમે સાઇન ઇન કરેલું ન હોવાને કારણે Chromium તમારા પાસવર્ડ ચેક કરી શકતું નથી</translation> <translation id="8276522524898344151">Chromium પાસવર્ડની કૉપિ કરવાનો પ્રયાસ કરી રહ્યું છે.</translation>
diff --git a/chrome/app/resources/chromium_strings_hy.xtb b/chrome/app/resources/chromium_strings_hy.xtb index 0bedc53..241c550 100644 --- a/chrome/app/resources/chromium_strings_hy.xtb +++ b/chrome/app/resources/chromium_strings_hy.xtb
@@ -315,6 +315,7 @@ <translation id="8133124826068723441">ChromiumOS-ին չհաջողվեց համաժամացնել տվյալները, քանի որ այդ գործառույթը հասանելի չէ ձեր տիրույթի համար։</translation> <translation id="813913629614996137">Նախապատրաստվում է...</translation> <translation id="81770708095080097">Այս ֆայլը վտանգավոր է, և Chromium-ն արգելափակել է այն։</translation> +<translation id="8213374284266571500">Chromium-ն արգելափակել է այս ֆայլը, քանի որ ֆայլի այս տեսակը վտանգավոր է։</translation> <translation id="8248265253516264921">Եթե պատկերն օգտակար նկարագրություն չունի, Chromium-ը կփորձի նոր նկարագրություն տրամադրել: Պատկերներն ուղարկվում են Google-ին՝ նկարագրություններ ստեղծելու համար։ Ցանկացած պահի կարգավորումներում կարող եք անջատել սա:</translation> <translation id="8266560134891435528">Chromium-ը չի կարող ստուգել ձեր գաղտնաբառերը, քանի որ դուք հաշիվ չեք մտել։</translation> <translation id="8276522524898344151">Chromium-ը փորձում է պատճենել գաղտնաբառերը։</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb index 2af5353..9cc3ddf 100644 --- a/chrome/app/resources/chromium_strings_id.xtb +++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -315,6 +315,7 @@ <translation id="8133124826068723441">ChromiumOS tidak dapat menyinkronkan data Anda karena Sinkronisasi tidak tersedia untuk domain Anda.</translation> <translation id="813913629614996137">Memulai...</translation> <translation id="81770708095080097">File ini berbahaya, jadi Chromium telah memblokirnya.</translation> +<translation id="8213374284266571500">Chromium memblokir file ini karena jenis file ini berbahaya</translation> <translation id="8248265253516264921">Jika gambar tidak memiliki deskripsi yang berguna, Chromium akan mencoba memberikan deskripsi untuk Anda. Untuk membuat deskripsi, gambar akan dikirim ke Google. Anda dapat menonaktifkannya kapan saja di setelan.</translation> <translation id="8266560134891435528">Chromium tidak dapat memeriksa sandi karena Anda tidak login</translation> <translation id="8276522524898344151">Chromium mencoba menyalin sandi.</translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb index 7b6c4f8..9dbcc24 100644 --- a/chrome/app/resources/chromium_strings_mn.xtb +++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -313,6 +313,7 @@ <translation id="8133124826068723441">Синк нь таны домэйнд боломжгүй тул ChromiumOS таны өгөгдлийг синк хийж чадсангүй.</translation> <translation id="813913629614996137">Эхлүүлж байна…</translation> <translation id="81770708095080097">Энэ файл аюултай тул Chromium блоклосон байна.</translation> +<translation id="8213374284266571500">Энэ төрлийн файл аюултай тул Chromium энэ файлыг блоклосон</translation> <translation id="8248265253516264921">Хэрэв зурагт хэрэгтэй тайлбар байхгүй бол Chromium танд тайлбар өгөхөөр оролдох болно. Тайлбар үүсгэхийн тулд зургийг Google-д илгээнэ. Та үүнийг хүссэн үедээ тохиргоонд унтрааж болно.</translation> <translation id="8266560134891435528">Та нэвтрээгүй байгаа тул Chromium таны нууц үгсийг шалгах боломжгүй байна</translation> <translation id="8276522524898344151">Chromium нь нууц үгс хуулахыг оролдож байна.</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb index e9751480..955f17d 100644 --- a/chrome/app/resources/chromium_strings_mr.xtb +++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -316,6 +316,7 @@ <translation id="8133124826068723441">तुमच्या डोमेनसाठी सिंक करणे उपलब्ध नसल्यामुळे, ChromiumOS ला तुमचा डेटा सिंक करता आला नाही.</translation> <translation id="813913629614996137">सुरू करत आहे…</translation> <translation id="81770708095080097">ही फाईल धोकादायक आहे, त्यामुळे Chromium ने अवरोधित केली आहे.</translation> +<translation id="8213374284266571500">या प्रकारची फाइल धोकादायक असल्यामुळे Chromium ने ती ब्लॉक केली आहे</translation> <translation id="8248265253516264921">इमेजचे उपयोगी वर्णन नसल्यास, Chromium तुमच्यासाठी ते देण्याचा प्रयत्न करेल. वर्णने तयार करण्यासाठी, इमेज Google ला पाठवल्या जातात. तुम्ही हे सेटिंग्जमध्ये कधीही बंद करू शकता.</translation> <translation id="8266560134891435528">तुम्ही साइन इन केलेले नसल्यामुळे Chromium तुमचे पासवर्ड तपासू शकत नाही</translation> <translation id="8276522524898344151">Chromium पासवर्ड कॉपी करण्याचा प्रयत्न करत आहे.</translation>
diff --git a/chrome/app/resources/chromium_strings_my.xtb b/chrome/app/resources/chromium_strings_my.xtb index 6473eb4..61342af6 100644 --- a/chrome/app/resources/chromium_strings_my.xtb +++ b/chrome/app/resources/chromium_strings_my.xtb
@@ -319,6 +319,7 @@ <translation id="8133124826068723441">သင့်ဒိုမိန်းအတွက် ‘စင့်ခ်လုပ်ခြင်း’ မရနိုင်သဖြင့် ChromiumOS က သင့်ဒေတာကို စင့်ခ်လုပ်၍မရပါ။</translation> <translation id="813913629614996137">စတင်နေသည်…</translation> <translation id="81770708095080097">ဤဖိုင်သည် အန္တရာယ်ရှိပါသည်။ ထို့ကြောင့် Chromium သည် ၎င်းကို ပိတ်ဆို့ထားပါသည်။</translation> +<translation id="8213374284266571500">ဤဖိုင်အမျိုးအစားသည် အန္တရာယ်များသဖြင့် Chromium က ပိတ်ထားသည်</translation> <translation id="8248265253516264921">ပုံတွင် အသုံးဝင်သော အကြောင်းအရာ မပါလျှင် Chromium က သင့်အတွက် ဖော်ပြပေးပါမည်။ အကြောင်းအရာများ ဖော်ပြပေးရန် ပုံများကို Google သို့ပို့လိုက်ပါသည်။ ၎င်းကို ဆက်တင်များတွင် အချိန်မရွေး ပိတ်နိုင်သည်။</translation> <translation id="8266560134891435528">လက်မှတ်ထိုးဝင်မထားသဖြင့် Chromium က သင့်စကားဝှက်များကို စစ်ဆေး၍မရပါ</translation> <translation id="8276522524898344151">Chromium က စကားဝှက်များ မိတ္တူကူးရန် ကြိုးစားနေသည်။</translation>
diff --git a/chrome/app/resources/chromium_strings_ne.xtb b/chrome/app/resources/chromium_strings_ne.xtb index d5dde0e..fd14b2d 100644 --- a/chrome/app/resources/chromium_strings_ne.xtb +++ b/chrome/app/resources/chromium_strings_ne.xtb
@@ -315,6 +315,7 @@ <translation id="8133124826068723441">तपाईंको डोमेनका हकमा सिंक गर्ने सुविधा उपलब्ध नभएको हुनाले ChromiumOS ले तपाईंको डेटा सिंक गर्न सकेन।</translation> <translation id="813913629614996137">सुरुवात गर्दै...</translation> <translation id="81770708095080097">यो फाइल खतरनाक छ, त्यसैले Chromium ले यसमाथि रोक लगाएको छ।</translation> +<translation id="8213374284266571500">यस्तो प्रकारको फाइल खतरनाक हुने भएकाले Chromium ले यो फाइल ब्लक गरेको छ</translation> <translation id="8248265253516264921">कुनै छविमा उपयोगी विवरण नभएका खण्डमा Chromium ले तपाईंलाई एउटा विवरण उपलब्ध गराउने प्रयास गर्ने छ। विवरणहरू सिर्जना गर्न फोटो Google मा पठाइन्छ। तपाईं सेटिङहरूमा गई जुनसुकै बेला यसलाई निष्क्रिय पार्न सक्नुहुन्छ।</translation> <translation id="8266560134891435528">तपाईं साइन इन नहुनुभएकाले Chromium ले तपाईंका पासवर्डहरूको जाँच गर्न सकेन</translation> <translation id="8276522524898344151">Chromium ले पासवर्डहरू प्रतिलिपि गर्ने प्रयास गर्दै छ।</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb index 9f3993f0..759b15a 100644 --- a/chrome/app/resources/chromium_strings_no.xtb +++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -314,6 +314,7 @@ <translation id="8133124826068723441">ChromiumOS kunne ikke synkronisere dataene dine, ettersom synkronisering ikke er tilgjengelig for domenet ditt.</translation> <translation id="813913629614996137">Initialiserer …</translation> <translation id="81770708095080097">Denne filen er farlig, så Chromium har blokkert den.</translation> +<translation id="8213374284266571500">Chromium har blokkert denne filen fordi denne filtypen er farlig</translation> <translation id="8248265253516264921">Hvis et bilde ikke har noen nyttig beskrivelse, prøver Chromium å finne en til deg. For å opprette beskrivelser blir bilder sendt til Google. Du kan slå av dette i innstillingene når som helst.</translation> <translation id="8266560134891435528">Chromium kan ikke sjekke passordene dine, siden du ikke er logget på</translation> <translation id="8276522524898344151">Chromium prøver å kopiere passord.</translation>
diff --git a/chrome/app/resources/chromium_strings_pa.xtb b/chrome/app/resources/chromium_strings_pa.xtb index 214bc35..66916a7 100644 --- a/chrome/app/resources/chromium_strings_pa.xtb +++ b/chrome/app/resources/chromium_strings_pa.xtb
@@ -317,6 +317,7 @@ <translation id="8133124826068723441">ChromiumOS ਤੁਹਾਡਾ ਡਾਟਾ ਸਿੰਕ ਨਹੀਂ ਕਰ ਸਕਿਆ ਕਿਉਂਕਿ ਸਿੰਕ ਤੁਹਾਡੇ ਡੋਮੇਨ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।</translation> <translation id="813913629614996137">ਸ਼ੁਰੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="81770708095080097">ਇਹ ਫ਼ਾਈਲ ਖਤਰਨਾਕ ਹੈ, ਇਸ ਲਈ Chromium ਨੇ ਇਸਨੂੰ ਬਲੌਕ ਕਰ ਦਿੱਤਾ ਹੈ।</translation> +<translation id="8213374284266571500">Chromium ਨੇ ਇਸ ਫ਼ਾਈਲ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਹੈ ਕਿਉਂਕਿ ਇਸ ਕਿਸਮ ਦੀ ਫ਼ਾਈਲ ਖਤਰਨਾਕ ਹੈ</translation> <translation id="8248265253516264921">ਜੇ ਕਿਸੇ ਚਿੱਤਰ ਦਾ ਲਾਭਕਾਰੀ ਵਰਣਨ ਨਹੀਂ ਹੈ, ਤਾਂ Chromium ਤੁਹਾਡੇ ਲਈ ਇੱਕ ਵਰਣਨ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ। ਵਰਣਨ ਬਣਾਉਣ ਲਈ, ਚਿੱਤਰ Google ਨੂੰ ਭੇਜੇ ਜਾਂਦੇ ਹਨ। ਤੁਸੀਂ ਕਿਸੇ ਵੇਲੇ ਵੀ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ।</translation> <translation id="8266560134891435528">Chromium ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਦਾ ਕਿਉਂਕਿ ਤੁਸੀਂ ਸਾਈਨ-ਇਨ ਨਹੀਂ ਕੀਤਾ ਹੈ</translation> <translation id="8276522524898344151">Chromium ਪਾਸਵਰਡਾਂ ਨੂੰ ਕਾਪੀ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਿਹਾ ਹੈ।</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb index 5037f073..fd53dea 100644 --- a/chrome/app/resources/chromium_strings_te.xtb +++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -311,6 +311,7 @@ <translation id="8133124826068723441">మీ డొమైన్ కోసం సింక్ అందుబాటులో లేనందున, ChromiumOS మీ డేటాను సింక్ చేయలేకపోయింది.</translation> <translation id="813913629614996137">ప్రారంభిస్తోంది...</translation> <translation id="81770708095080097">ఈ ఫైల్ అపాయకరమైనది, కాబట్టి Chromium దీన్ని బ్లాక్ చేసింది.</translation> +<translation id="8213374284266571500">ఈ ఫైల్ రకం ప్రమాదకరమైనందున Chromium ఈ ఫైల్ను బ్లాక్ చేసింది</translation> <translation id="8248265253516264921">చిత్రంలో ఉపయోగకరమైన వివరణ లేకుంటే, మీ కోసం ఒక వివరణను అందించడానికి Chromium ప్రయత్నిస్తుంది. వివరణలను క్రియేట్ చేయడానికి, చిత్రాలు Googleకు పంపబడతాయి. మీరు దీన్ని ఎప్పుడైనా సెట్టింగ్లలో ఆఫ్ చేయవచ్చు.</translation> <translation id="8266560134891435528">మీరు సైన్ ఇన్ చేయనందున Chromium మీ పాస్వర్డ్లను తనిఖీ చేయలేదు</translation> <translation id="8276522524898344151">పాస్వర్డ్లను కాపీ చేయడానికి Chromium ప్రయత్నిస్తోంది.</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb index bb59e25..f1247e3 100644 --- a/chrome/app/resources/chromium_strings_ur.xtb +++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -316,6 +316,7 @@ <translation id="8133124826068723441">ChromiumOS آپ کے ڈیٹا کی مطابقت پذیری نہیں کر سکا کیونکہ Sync آپ کے ڈومین کیلئے دستیاب نہیں ہے۔</translation> <translation id="813913629614996137">آغاز کیا جا رہا ہے…</translation> <translation id="81770708095080097">یہ فائل خطرناک ہے، اس لیے Chromium نے اسے مسدود کر دیا ہے۔</translation> +<translation id="8213374284266571500">Chromium نے اس فائل کو مسدود کر دیا کیونکہ اس قسم کی فائل خطرناک ہے</translation> <translation id="8248265253516264921">اگر کسی تصویر میں مفید تفصیل موجود نہیں ہے تو Chromium آپ کے لیے تفصیل فراہم کرنے کی کوشش کرے گا۔ تفصیلات تخلیق کرنے کے لیے، تصاویر Google کو بھیجی جاتی ہیں۔ آپ اسے ترتیبات میں کسی بھی وقت آف کر سکتے ہیں۔</translation> <translation id="8266560134891435528">Chromium آپ کے پاس ورڈز چیک نہیں کر سکتا کیونکہ آپ سائن ان نہیں ہیں</translation> <translation id="8276522524898344151">Chromium پاس ورڈز کاپی کرنے کی کوشش کر رہا ہے۔</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb index 3ff5118..620e7c9 100644 --- a/chrome/app/resources/chromium_strings_vi.xtb +++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -315,6 +315,7 @@ <translation id="8133124826068723441">ChromiumOS không thể đồng bộ hoá dữ liệu của bạn vì miền của bạn không dùng được tính năng Đồng bộ hoá.</translation> <translation id="813913629614996137">Đang khởi chạy...</translation> <translation id="81770708095080097">Tệp này nguy hiểm, do đó Chromium đã chặn tệp.</translation> +<translation id="8213374284266571500">Chromium đã chặn tệp này vì đây là loại tệp nguy hiểm</translation> <translation id="8248265253516264921">Chromium sẽ cố gắng mô tả cho bạn những hình ảnh không có nội dung mô tả hữu ích. Để tạo nội dung mô tả, các hình ảnh sẽ được gửi đến Google. Bạn có thể tắt dịch vụ này trong phần cài đặt bất kỳ lúc nào.</translation> <translation id="8266560134891435528">Chromium không thể kiểm tra mật khẩu của bạn vì bạn chưa đăng nhập</translation> <translation id="8276522524898344151">Chromium đang cố gắng sao chép mật khẩu.</translation>
diff --git a/chrome/app/resources/chromium_strings_zu.xtb b/chrome/app/resources/chromium_strings_zu.xtb index fc9e82fad..8ddb801ac 100644 --- a/chrome/app/resources/chromium_strings_zu.xtb +++ b/chrome/app/resources/chromium_strings_zu.xtb
@@ -317,6 +317,7 @@ <translation id="8133124826068723441">I-ChromiumOS ayikwazanga ukuvumelanisa idatha yakho ngoba Ukuvumelanisa akutholakali kusizinda sakho.</translation> <translation id="813913629614996137">Iyaqalisa...</translation> <translation id="81770708095080097">Leli fayela liyingozi, ngakho-ke i-Chromium iyivimbile.</translation> +<translation id="8213374284266571500">I-Chromium ivimbe leli fayela ngoba lolu hlobo lwefayela luyingozi</translation> <translation id="8248265253516264921">Uma isithombe singanayo incazelo ephelele, i-Chromium izozama ukukunikezela eyodwa. Ukuze udale izincazelo, izithombe zithunyelwa ku-Google. Ungavala lokhu kuzilungiselelo noma kunini.</translation> <translation id="8266560134891435528">I-Chromium ayikwazi ukuhlola amaphasiwedi akho ngoba awungenanga ngemvume</translation> <translation id="8276522524898344151">I-Chromium izama ukukopisha amaphasiwedi.</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index bdeb409..fd23e47 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -3796,6 +3796,7 @@ <translation id="4648491805942548247">Onvoldoende toestemmings</translation> <translation id="4650591383426000695">Ontkoppel jou foon van jou <ph name="DEVICE_TYPE" /></translation> <translation id="4651484272688821107">Kon nie aanlyn komponent met demonstrasiemodus-hulpbronne laai nie.</translation> +<translation id="4651921906638302153">Kan nie met hierdie rekening aanmeld nie</translation> <translation id="4652935475563630866">Die verandering in kamera-instelling vereis dat Parallels-werkskerm herbegin moet word. Parallels-werkskerm sal herbegin.</translation> <translation id="4653405415038586100">Kon nie Linux opstel nie</translation> <translation id="465406513924180949">Jy sien tans mandjies wat jou help om maklik terug te kom by items wat jy in inkopiemandjies op die web gelos het. @@ -5453,6 +5454,7 @@ <translation id="6327785803543103246">Webinstaanbediener-outo-ontdekking</translation> <translation id="6331818708794917058">Werwe kan vra om aan MIDI-toestelle te koppel</translation> <translation id="6333064448949140209">Lêer sal vir ontfouting na Google gestuur word</translation> +<translation id="6333170995003625229">Jou e-posadres of wagwoord kon nie geverifieer word nie. Probeer weer aanmeld.</translation> <translation id="6335920438823100346"><ph name="MANAGER" /> vereis dat jy jou data rugsteun en hierdie Chromebook na die fabriekinstellings terugstel om Linux te begin.</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> het ADB-ontfouting gedeaktiveer. Dit sal jou <ph name="DEVICE_TYPE" /> oor 24 uur terugstel. Rugsteun enige lêers wat jy wil hou.</translation> <translation id="6338981933082930623">Alle werwe kan enige advertensies vir jou wys</translation> @@ -5861,6 +5863,7 @@ <translation id="6735304988756581115">Wys webkoekies en ander werfdata …</translation> <translation id="6736243959894955139">Adres</translation> <translation id="6737663862851963468">Verwyder Kerberos-kaartjie</translation> +<translation id="6738430949033571771">Verifieer tans rekening …</translation> <translation id="6739923123728562974">Wys werkskermkortpad</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> is laat wag</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Jou administrateur<ph name="END_LINK" /> het Veiligblaai afgeskakel</translation> @@ -7679,6 +7682,8 @@ <translation id="8546306075665861288">Prentkas</translation> <translation id="8546930481464505581">Pasmaak raakbalk</translation> <translation id="8547013269961688403">Aktiveer volskermvergrootglas</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> word deur <ph name="MANAGER" /> bestuur. Jy kan nie hierdie e-pos as ’n bykomende rekening byvoeg nie.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />As jy <ph name="USER_EMAIL" /> wil gebruik, moet jy eers by <ph name="DEVICE_TYPE" /> afmeld. Kies dan Voeg Persoon By aan die onderkant van die skerm.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">Hou die soeksleutel in om die gedrag van die boonste ry sleutels oor te skakel</translation> <translation id="8549316893834449916">Jy sal jou Google-rekening gebruik om by jou Chromebook aan te meld – dieselfde rekening as wat jy vir Gmail, Drive, YouTube en meer gebruik.</translation> <translation id="8551388862522347954">Lisensies</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 32ad2754..433e5e7 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -3787,6 +3787,7 @@ <translation id="4648491805942548247">በቂ ያልሆኑ ፍቃዶች</translation> <translation id="4650591383426000695">ስልክዎን ከ<ph name="DEVICE_TYPE" /> ጋር ያለው ግንኙነት ያቋርጡት</translation> <translation id="4651484272688821107">የመስመር ላይ ክፍለ አካላትን ከቅንጭብ ማሳያ ሁነታ ግብዓቶች ጋር መጫን አልተቻለም።</translation> +<translation id="4651921906638302153">በዚህ መለያ መግባት አይችሉም</translation> <translation id="4652935475563630866">በካሜራ ቅንብሩ ውስጥ ያልወ ለውጥ የParallels Desktop ዳግም መጀመር ያስፈልገዋል። ለመቀጠል Parallels Desktopን ዳግም ያስጀምሩ።</translation> <translation id="4653405415038586100">Linuxን ማዋቀር ላይ ስህተት</translation> <translation id="465406513924180949">በመላው ድሩ ላይ በግዢ ተሳቢዎ ውስጥ የተዋቸው ንጥሎች ላይ በቀላሉ እንዲመለሱ የሚያግዙ ተሳቢዎችን እያዩ ነው። @@ -5443,6 +5444,7 @@ <translation id="6327785803543103246">የድር ተኪ ራስ-ግኝት</translation> <translation id="6331818708794917058">ጣቢያዎች ከMIDI መሣሪያዎች ጋር ለመገናኘት መጠየቅ ይችላሉ</translation> <translation id="6333064448949140209">ፋይሉ ለመታረም ወደ Google ይላካል</translation> +<translation id="6333170995003625229">የእርስዎ ኢሜይል አድራሻ ወይም የይለፍ ቃል መረጋገጥ አልቻለም። እንደገና ለመግባት ይሞክሩ።</translation> <translation id="6335920438823100346">Linuxን ለመጀመር <ph name="MANAGER" /> የውሂብዎን ምትኬ እንዲያስቀምጡና ይህን Chromebook ወደ የፋብሪካ ቅንብሮቹ እንዲመልሱት ይፈልግብዎታል።</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> የADB ስሕተት ማረሚያን አሰናክሏል። ይህ የእርስዎን <ph name="DEVICE_TYPE" /> በ24 ሰዓታት ውስጥ ዳግም ያስጀምረዋል። ለማቆየት የሚፈልጓቸውን ማናቸውም ፋይሎች ምትኬ ያስቀምጡላቸው።</translation> <translation id="6338981933082930623">ሁሉም ጣቢያዎች ማንኛውንም ማስታወቂያ ለእርስዎ ሊያሳዩዎት ይችላሉ</translation> @@ -5853,6 +5855,7 @@ <translation id="6735304988756581115">ኩኪዎችንና የሌላ ጣቢያ ውሂብ አሳይ…</translation> <translation id="6736243959894955139">አድራሻ</translation> <translation id="6737663862851963468">የKerberos ቲኬትን ያስወግዱ</translation> +<translation id="6738430949033571771">የመለያ ትክክለኛነትን በማረጋገጥ ላይ</translation> <translation id="6739923123728562974">የዴስክቶፕ አቋራጭን አሳይ</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> ለአፍታ ቆሟል</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />የእርስዎ አስተዳዳሪ<ph name="END_LINK" /> የጥንቃቄ አሰሳን አጥፍቷል</translation> @@ -7677,6 +7680,8 @@ <translation id="8546306075665861288">የምስል መሸጎጫ</translation> <translation id="8546930481464505581">ተነኪ አሞሌን አብጅ</translation> <translation id="8547013269961688403">የሙሉ ገጽ እይታ ማጉያን ያንቁ</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> የሚተዳደረው በ<ph name="MANAGER" /> ነው። ይህን ኢሜል እንደ ተጨማሪ መለያ ማከል አይችሉም።<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" />ን ለመጠቀም መጀመሪያ ከእርስዎ <ph name="DEVICE_TYPE" /> ዘግተው ይውጡ። ከዞያ በመግቢያ ገጽ ግርጌ ላይ ሰው አክልን ይምረጡ<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">የላይኛው ረድፍ ቁልፎች ባህሪን ለመቀየር የፍለጋ ቁልፉን ይያዙ</translation> <translation id="8549316893834449916">ወደ የእርስዎን Chromebook ለመግባት የGoogle መለያዎን ይጠቀማሉ – ለGmail፣ Drive፣ YouTube እና ተጨማሪ የሚጠቀሙበት ተመሳሳዩ መለያ።</translation> <translation id="8551388862522347954">ፍቃዶች</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index f3b8912..64e6875 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -862,6 +862,7 @@ <translation id="1813278315230285598">الخدمات</translation> <translation id="18139523105317219">اسم جهة تبادل البيانات الإلكتروني (EDI)</translation> <translation id="1815083418640426271">لصق كنص عادي</translation> +<translation id="1815097521077272760">تمت دعوتك لتجربة ميزة التحكّم في هذه اللعبة باستخدام لوحة المفاتيح.</translation> <translation id="1815181278146012280">طلب الإذن في حال محاولة أحد المواقع الإلكترونية الوصول إلى أجهزة HID</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> أخرى...</translation> <translation id="1816036116994822943">سرعة مسح لوحة المفاتيح</translation> @@ -995,6 +996,7 @@ <translation id="1935303383381416800">المواقع الإلكترونية التي يُسمح لها بالاطّلاع على موقعك الجغرافي</translation> <translation id="1936931585862840749">استخدِم رقمًا للإشارة إلى عدد النُسخ المطلوب طباعتها (من 1 إلى <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">يتعذّر استيراد نوع بنية الحاوية <ph name="ARCHITECTURE_CONTAINER" /> باستخدام هذا الجهاز الذي يمثل <ph name="ARCHITECTURE_DEVICE" />.يمكنك محاولة استعادة هذه الحاوية على جهاز مختلف، أو يمكنك الوصول إلى الملفات داخل صورة الحاوية هذه عن طريق فتح تطبيق "الملفات".</translation> +<translation id="1938320257168860255">حدث خطأ. يجب أن يكون هاتفك قريبًا وغير مُقفَل وأنّ يكون البلوتوث وشبكة Wi-Fi مفعَّلَين.</translation> <translation id="1938351510777341717">مفتاح Command الخارجي</translation> <translation id="1940546824932169984">الأجهزة المرتبطة</translation> <translation id="1941410638996203291">وقت البدء: <ph name="TIME" /></translation> @@ -1077,6 +1079,7 @@ <translation id="2030455719695904263">لوحة اللمس</translation> <translation id="2031639749079821948">تم حفظ كلمة المرور في حسابك على Google.</translation> <translation id="2031914984822377766">يمكنك إضافة <ph name="LINK_BEGIN" />اللغات المفضَّلة التي تريد عرض المواقع الإلكترونية<ph name="LINK_END" /> بها. سيتم استخدام اللغة الواردة في أعلى القائمة لترجمة المواقع الإلكترونية إلى تلك اللغة.</translation> +<translation id="2033758234986231162">لا يمكن مواصلة الاتصال بهاتفك. يجب أن يكون هاتفك قريبًا وغير مُقفَل وأنّ يكون البلوتوث وشبكة Wi-Fi مفعَّلَين.</translation> <translation id="2034346955588403444">إضافة شبكة WiFi أخرى</translation> <translation id="203574396658008164">تفعيل تدوين الملاحظات من شاشة القفل</translation> <translation id="2037445849770872822">تم إعداد الإشراف من أجل حساب Google هذا. ولإعداد المزيد من أدوات الرقابة الأبوية، يُرجى اختيار "مواصلة". @@ -3742,6 +3745,7 @@ <translation id="461661862154729886">مصدر الطاقة</translation> <translation id="4617001782309103936">قصير جدًا</translation> <translation id="4617270414136722281">خيارات الإضافات</translation> +<translation id="4617880081511131945">لا يمكن إجراء اتصال</translation> <translation id="4619564267100705184">إثبات هويّتك</translation> <translation id="4619615317237390068">علامات التبويب من الأجهزة الأخرى</translation> <translation id="4620809267248568679">يتم فرض هذا الإعداد بواسطة إحدى الإضافات.</translation> @@ -4034,6 +4038,7 @@ <translation id="4907306957610201395">فئة الإذن</translation> <translation id="4908811072292128752">فتح علامة تبويب جديدة لتصفح موقعي ويب في وقت واحد</translation> <translation id="4909038193460299775">نظرًا لأنه تتم إدارة هذا الحساب من قبل <ph name="DOMAIN" />، سيتم محو الإشارات والسجل وكلمات المرور والإعدادات الأخرى من هذا الجهاز. ومع ذلك ستبقى بياناتك مخزنة في حسابك في Google ويمكن إدارتها على <ph name="BEGIN_LINK" />لوحة تحكم Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">أوقف مشرف هاتفك ميزة بث التطبيقات.</translation> <translation id="4912643508233590958">عمليات التنشيط من الوضع بعيد</translation> <translation id="4915961947098019832">المواقع الإلكترونية التي يُسمح لها بعرض الصور</translation> <translation id="4916542008280060967">هل تريد السماح للموقع الإلكتروني بتعديل <ph name="FILE_NAME" />؟</translation> @@ -6871,6 +6876,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">ضبط حدود شاشتك</translation> <translation id="7760004034676677601">هل هذه هي صفحة بدء التشغيل التي كنت تتوقع ظهورها؟</translation> +<translation id="7762024824096060040">لا يمكن استخدام هذا الحساب</translation> <translation id="7762463735017901568">أوقف مشرف هاتفك ميزة مزامنة الإشعارات.</translation> <translation id="7764225426217299476">إضافة عنوان</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> من <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7041,6 +7047,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> ثوانٍ</translation> <translation id="7920363873148656176">بإمكان <ph name="ORIGIN" /> عرض الملف <ph name="FILENAME" />.</translation> <translation id="7920482456679570420">يُرجى إضافة كلمات تريد أن يتخطاها التدقيق الإملائي.</translation> +<translation id="7921347341284348270">لا يمكنك الاطّلاع على إشعارات هاتفك من خلال هذا الحساب المُدار. يُرجى إعادة المحاولة من خلال حساب مختلف. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> <translation id="7922935920104868876">عرض تفاصيل حظر ملفات تعريف الارتباط التابعة لجهات خارجية في وضع التصفّح المتخفي</translation> <translation id="7923564237306226146">اكتملت ترقية نظام التشغيل Linux</translation> <translation id="7924358170328001543">خطأ في إعادة توجيه المنفذ</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index c31cc836..b2d825d 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -3776,6 +3776,7 @@ <translation id="4648491805942548247">Yetərsiz icazələr</translation> <translation id="4650591383426000695">Telefonunuzu <ph name="DEVICE_TYPE" /> cihazından ayırın</translation> <translation id="4651484272688821107">Demo rejim mənbələri ilə onlayn komponentin yüklənməsi mümkün olmadı.</translation> +<translation id="4651921906638302153">Bu hesabla daxil olmaq mümkün deyil</translation> <translation id="4652935475563630866">Kamera ayarına edilən dəyişiklik Parallels Desktop'un yenidən başladılmasını tələb edir. Davam etmək üçün Parallels Desktop'u yenidən başladın.</translation> <translation id="4653405415038586100">Linux'un konfiqurasiyası ilə bağlı xəta</translation> <translation id="465406513924180949">İnternetdə alış-veriş səbətlərində qoyduğunuz əşyalara asanlıqla qayıtmağınıza kömək edən səbətlər görürsünüz. @@ -5430,6 +5431,7 @@ <translation id="6327785803543103246">Veb proksi avtomatik aşkarlama</translation> <translation id="6331818708794917058">Saytlar MIDI cihazlara qoşulmaq üçün icazə istəyə bilər</translation> <translation id="6333064448949140209">Fayl sazlama üçün Google'a göndəriləcək</translation> +<translation id="6333170995003625229">E-poçt ünvanı və ya parolunuzu doğrulamaq mümkün olmadı. Yenidən daxil olmağa cəhd edin.</translation> <translation id="6335920438823100346">Linux'u başlatmaq üçün <ph name="MANAGER" /> datanızı yedəkləmənizi və bu Chromebook'u zavod ayarlarına sıfırlamanızı tələb edir.</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> ADB sazlamasını deaktiv edib. <ph name="DEVICE_TYPE" /> cihazınız 24 saat ərzində sıfırlanacaq. Saxlamaq istədiyiniz faylları yedəkləyin.</translation> <translation id="6338981933082930623">Bütün saytlar sizə istənilən reklamı göstərə bilər</translation> @@ -5838,6 +5840,7 @@ <translation id="6735304988756581115">Kukilər və sayt datasını göstərin</translation> <translation id="6736243959894955139">Ünvan:</translation> <translation id="6737663862851963468">Kerberos biletini silin</translation> +<translation id="6738430949033571771">Hesab doğrulanır...</translation> <translation id="6739923123728562974">Masaüstü qısayolunu göstərin</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> durduruldu</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Administrator<ph name="END_LINK" /> Təhlükəsiz Baxışı deaktiv edib</translation> @@ -7655,6 +7658,8 @@ <translation id="8546306075665861288">Şəkil keşi</translation> <translation id="8546930481464505581">Toxunuş Panelini fərdiləşdirin</translation> <translation id="8547013269961688403">Tam ekran böyüdücüsünü aktiv edin</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> <ph name="MANAGER" /> tərəfindən idarə edilir. Bu e-poçtu əlavə hesab kimi əlavə edə bilməzsiniz.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" /> istifadə etmək üçün əvvəlcə <ph name="DEVICE_TYPE" /> cihazından çıxış edin. Sonra giriş ekranının aşağı hissəsində "Şəxs Əlavə Edin" seçimin edin.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">Yuxarı cərgə düymələrinin funksiyasını dəyişmək üçün Axtarış düyməsini basılı saxlayın</translation> <translation id="8549316893834449916">Chromebook'a Google Hesabınız (Gmail, Drive, YouTube və daha çoxuna daxil olmaq üçün istifadə etdiyiniz hesab) ilə daxil olacaqsınız.</translation> <translation id="8551388862522347954">Lisenziyalar</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index c9242e1..c78dacb 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -863,6 +863,7 @@ <translation id="1813278315230285598">Сэрвісы</translation> <translation id="18139523105317219">Імя боку EDI</translation> <translation id="1815083418640426271">Уставіць як звычайны тэкст</translation> +<translation id="1815097521077272760">Вас запрасілі пратэсціраваць кіраванне праз клавіятуру ў гэтай гульні.</translation> <translation id="1815181278146012280">Пытацца, калі сайт запытвае доступ да прылад HID</translation> <translation id="181577467034453336">Яшчэ <ph name="NUMBER_OF_VIEWS" />...</translation> <translation id="1816036116994822943">Хуткасць сканіравання клавіятуры</translation> @@ -996,6 +997,7 @@ <translation id="1935303383381416800">Дазволена атрымліваць звесткі пра ваша месцазнаходжанне</translation> <translation id="1936931585862840749">Каб указаць, колькі копій друкаваць, увядзіце лік (ад 1 да <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Не ўдалося імпартаваць кантэйнер з тыпам архітэктуры "<ph name="ARCHITECTURE_CONTAINER" />" на прыладу з тыпам "<ph name="ARCHITECTURE_DEVICE" />". Можна паспрабаваць аднавіць гэты кантэйнер на іншай прыладзе або атрымаць доступ да файлаў у кантэйнеры, адкрыўшы яго вобраз у праграме "Файлы".</translation> +<translation id="1938320257168860255">Нешта пайшло не так. Упэўніцеся, што тэлефон разблакіраваны, знаходзіцца паблізу і што на ім уключаны Bluetooth і Wi-Fi.</translation> <translation id="1938351510777341717">Знешняя клавіша Command</translation> <translation id="1940546824932169984">Падключаныя прылады</translation> <translation id="1941410638996203291">Час пачатку: <ph name="TIME" /></translation> @@ -1078,6 +1080,7 @@ <translation id="2030455719695904263">Сэнсарная панэль</translation> <translation id="2031639749079821948">Пароль захаваны ва Уліковым запісе Google</translation> <translation id="2031914984822377766">Дадайце прыярытэтныя <ph name="LINK_BEGIN" />мовы для вэб-сайтаў<ph name="LINK_END" />. Пры перакладзе будзе выкарыстоўвацца першая мова ў спісе.</translation> +<translation id="2033758234986231162">Не ўдалося захаваць падключэнне да вашага тэлефона. Упэўніцеся, што тэлефон разблакіраваны, знаходзіцца паблізу і што на ім уключаны Bluetooth і Wi-Fi.</translation> <translation id="2034346955588403444">Дадаць іншую сетку Wi-Fi</translation> <translation id="203574396658008164">Уключыць стварэнне нататак на экране блакіроўкі</translation> <translation id="2037445849770872822">Для гэтага Уліковага запісу Google наладжаны бацькоўскі кантроль. Каб наладзіць яго дадатковыя параметры, выберыце "Працягнуць". @@ -3743,6 +3746,7 @@ <translation id="461661862154729886">Крыніца энергіі</translation> <translation id="4617001782309103936">Занадта кароткі</translation> <translation id="4617270414136722281">Параметры пашырэння</translation> +<translation id="4617880081511131945">Не ўдалося ўстанавіць падключэнне</translation> <translation id="4619564267100705184">Пацвердзіць маю асобу</translation> <translation id="4619615317237390068">Укладкі з іншых прылад</translation> <translation id="4620809267248568679">Гэта налада ўключана пашырэннем.</translation> @@ -4035,6 +4039,7 @@ <translation id="4907306957610201395">Катэгорыя дазволаў</translation> <translation id="4908811072292128752">Адкрыйце новую ўкладку, каб праглядаць разам два сайты</translation> <translation id="4909038193460299775">Гэты ўліковы запіс знаходзіцца пад кіраваннем дамена <ph name="DOMAIN" />, таму з прылады будуць выдалены вашы закладкі, гісторыя, паролі і іншыя налады. Але вашы даныя застануцца ва Уліковым запісе Google, і імі можна будзе кіраваць на старонцы <ph name="BEGIN_LINK" />Панэль кіравання Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Перадача праграм плынню адключана адміністратарам тэлефона.</translation> <translation id="4912643508233590958">Абуджэнні ад бяздзейнасці</translation> <translation id="4915961947098019832">Дазволена паказваць відарысы</translation> <translation id="4916542008280060967">Дазволіць сайту змяніць файл <ph name="FILE_NAME" />?</translation> @@ -6869,6 +6874,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Рэгуліроўка граніц дысплэя</translation> <translation id="7760004034676677601">Ці з'яўляецца пачатковая старонка той, якую вы чакалі ўбачыць?</translation> +<translation id="7762024824096060040">Нельга выкарыстоўваць гэты ўліковы запіс</translation> <translation id="7762463735017901568">Сінхранізацыя апавяшчэнняў адключана адміністратарам тэлефона</translation> <translation id="7764225426217299476">Дадаць адрас</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> з дамена <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7038,6 +7044,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> с</translation> <translation id="7920363873148656176">Сайт <ph name="ORIGIN" /> можа праглядаць файл <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Дадайце словы, правапіс якіх не трэба правяраць</translation> +<translation id="7921347341284348270">Вы не можаце праглядаць апавяшчэнні з тэлефона праз гэты ўліковы запіс пад кіраваннем. Паўтарыце спробу, выкарыстаўшы іншы ўліковы запіс. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Паказаць падрабязныя звесткі пра блакіроўку старонніх файлаў cookie у рэжыме інкогніта</translation> <translation id="7923564237306226146">Абнаўленне Linux завершана</translation> <translation id="7924358170328001543">Памылка пераадрасацыі партоў</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 5c11ec5d..c860217 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -867,6 +867,7 @@ <translation id="1813278315230285598">Услуги</translation> <translation id="18139523105317219">Име на EDI страна</translation> <translation id="1815083418640426271">Поставяне като неформатиран текст</translation> +<translation id="1815097521077272760">Получихте покана да изпробвате управлението чрез клавиатура за тази игра.</translation> <translation id="1815181278146012280">Извеждане на запитване, когато сайт иска достъп до HID устройства</translation> <translation id="181577467034453336">Още <ph name="NUMBER_OF_VIEWS" />...</translation> <translation id="1816036116994822943">Скорост на сканиране за клавиатурата</translation> @@ -1001,6 +1002,7 @@ <translation id="1935303383381416800">Сайтове с разрешение за преглед на местоположението ви</translation> <translation id="1936931585862840749">Въведете число между 1 и <ph name="MAX_COPIES" />, за да укажете колко копия да се отпечатат .</translation> <translation id="1937774647013465102">Архитектурата на контейнера е от тип <ph name="ARCHITECTURE_CONTAINER" /> и не може да се импортира в това устройство, което е от тип <ph name="ARCHITECTURE_DEVICE" />. Можете да опитате да възстановите контейнера на друго устройство или да използвате файловете в образа му, като го отворите в приложението „Файлове“.</translation> +<translation id="1938320257168860255">Нещо се обърка. Телефонът ви трябва да е наблизо, да е отключен и с включени функции за Bluetooth и Wi-Fi.</translation> <translation id="1938351510777341717">Външен клавиш Command</translation> <translation id="1940546824932169984">Свързани устройства</translation> <translation id="1941410638996203291">Начален час: <ph name="TIME" /></translation> @@ -1083,6 +1085,7 @@ <translation id="2030455719695904263">Тракпад</translation> <translation id="2031639749079821948">Паролата ви е запазена в профила ви в Google</translation> <translation id="2031914984822377766">Добавете предпочитаните от вас <ph name="LINK_BEGIN" />езици за уебсайтове<ph name="LINK_END" />. Най-горният език в списъка ще се използва за преводи.</translation> +<translation id="2033758234986231162">Не може да се поддържа връзка с телефона ви. Той трябва да е наблизо, да е отключен и с включени функции за Bluetooth и Wi-Fi.</translation> <translation id="2034346955588403444">Добавяне на друга Wi-Fi мрежа</translation> <translation id="203574396658008164">Активиране на функцията за водене на бележки от заключения екран</translation> <translation id="2037445849770872822">Контролирането е настроено за този профил в Google. Ако искате да конфигурирате още родителски контроли, изберете „Напред“. @@ -3754,6 +3757,7 @@ <translation id="461661862154729886">Енергиен източник</translation> <translation id="4617001782309103936">Твърде кратък</translation> <translation id="4617270414136722281">Опции за разширението</translation> +<translation id="4617880081511131945">Не може да се установи връзка</translation> <translation id="4619564267100705184">Потвърдете, че сте вие</translation> <translation id="4619615317237390068">Раздели от други устройства</translation> <translation id="4620809267248568679">Тази настройка е наложена от разширение.</translation> @@ -4046,6 +4050,7 @@ <translation id="4907306957610201395">Категория за разрешения</translation> <translation id="4908811072292128752">Отворете нов раздел, за да сърфирате в два сайта едновременно</translation> <translation id="4909038193460299775">Тъй като този профил се управлява от <ph name="DOMAIN" />, вашите отметки, история, пароли и други настройки ще бъдат изчистени от устройството. Данните ви обаче ще продължат да се съхраняват в профила ви в Google. Можете да ги управлявате от <ph name="BEGIN_LINK" />Google Табло за управление<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Поточното предаване на приложения е деактивирано от администратора на телефона ви.</translation> <translation id="4912643508233590958">Събуждания при неактивност</translation> <translation id="4915961947098019832">Сайтове с разрешение за показване на изображения</translation> <translation id="4916542008280060967">Да се разреши ли на сайта да редактира <ph name="FILE_NAME" />?</translation> @@ -6875,6 +6880,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Коригиране на границите на екрана</translation> <translation id="7760004034676677601">Това ли е очакваната от вас страница при стартиране?</translation> +<translation id="7762024824096060040">Не можете да използвате този профил</translation> <translation id="7762463735017901568">Синхронизирането на известията е деактивирано от администратора на телефона ви</translation> <translation id="7764225426217299476">Добавяне на адрес</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> от <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7045,6 +7051,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> сек</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> може да преглежда <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Добавете думи, които да се пропускат при проверка на правописа</translation> +<translation id="7921347341284348270">Не можете да преглеждате известията от телефона си в този управляван профил. Опитайте отново с друг профил. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Показване на подробностите за блокирането на „бисквитки“ на трети страни в режим „инкогнито“</translation> <translation id="7923564237306226146">Надстройването на Linux завърши успешно</translation> <translation id="7924358170328001543">Грешка при пренасочване на порта</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 61342ef2..fd08dfe0 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -872,6 +872,7 @@ <translation id="1813278315230285598">পরিষেবাসমূহ</translation> <translation id="18139523105317219">EDI পার্টি নাম</translation> <translation id="1815083418640426271">সাধারণ টেক্সট হিসেবে আটকে দিন</translation> +<translation id="1815097521077272760">এই গেমের জন্য কীবোর্ড নিয়ন্ত্রণ চেষ্টা করার জন্য আপনাকে আমন্ত্রণ জানানো হয়েছে।</translation> <translation id="1815181278146012280">কোনও সাইট HID ডিভাইস অ্যাক্সেস করতে চাইলে আমাকে জিজ্ঞাসা করুন</translation> <translation id="181577467034453336">আরও <ph name="NUMBER_OF_VIEWS" />টি...</translation> <translation id="1816036116994822943">কীবোর্ড স্ক্যান করার গতি</translation> @@ -1006,6 +1007,7 @@ <translation id="1935303383381416800">আপনার লোকেশন দেখার অনুমতি দেওয়া হয়েছে</translation> <translation id="1936931585862840749">কতগুলি কপি প্রিন্ট হবে তা নির্দিষ্ট করতে একটি সংখ্যা ব্যবহার করুন (১ থেকে <ph name="MAX_COPIES" />-এর মধ্যে)।</translation> <translation id="1937774647013465102">এই ডিভাইস <ph name="ARCHITECTURE_DEVICE" /> হওয়ার ফলে <ph name="ARCHITECTURE_CONTAINER" /> ধরনের কন্টেনার আর্কিটেকচার ইম্পোর্ট করা যাচ্ছে না। আপনি একটি অন্য ডিভাইসে এই কন্টেনার ফিরিয়ে আনার চেষ্টা করতে পারেন অথবা 'ফাইল' অ্যাপ খুলে কন্টেনার ছবির অন্তর্ভুক্ত ফাইল অ্যাক্সেস করতে পারেন।</translation> +<translation id="1938320257168860255">কোনও সমস্যা হয়েছে। আপনার ফোন কাছাকাছি, আনলক অবস্থায় রয়েছে কিনা এবং তাতে ব্লুটুথ আর ওয়াই-ফাই চালু আছে কিনা দেখে নিন।</translation> <translation id="1938351510777341717">এক্সটার্নাল কমান্ড</translation> <translation id="1940546824932169984">সংযুক্ত ডিভাইস</translation> <translation id="1941410638996203291">শুরু করার সময় <ph name="TIME" /></translation> @@ -1088,6 +1090,7 @@ <translation id="2030455719695904263">ট্র্যাকপ্যাড</translation> <translation id="2031639749079821948">আপনার Google অ্যাকাউন্টে পাসওয়ার্ড সেভ করা আছে</translation> <translation id="2031914984822377766"><ph name="LINK_BEGIN" />ওয়েবসাইটে আপনার পছন্দের ভাষা<ph name="LINK_END" /> যোগ করুন। তালিকার উপরে থাকা ভাষাটি অনুবাদের জন্য ব্যবহার করা হবে।</translation> +<translation id="2033758234986231162">আপনার ফোনে সাথে কানেক্ট করে রাখতে পারছি না। আপনার ফোন কাছাকাছি, আনলক অবস্থায় রয়েছে কিনা এবং তাতে ব্লুটুথ আর ওয়াই-ফাই চালু আছে কিনা দেখে নিন।</translation> <translation id="2034346955588403444">অন্য ওয়াই ফাই নেটওয়ার্ক যোগ করুন</translation> <translation id="203574396658008164">লক স্ক্রিন থেকেই নোট নেওয়া সক্ষম করুন</translation> <translation id="2037445849770872822">এই Google অ্যাকাউন্টের জন্য তত্ত্বাবধান সেট-আপ করা আছে। আরও অভিভাবকীয় নিয়ন্ত্রণ সেট-আপ করতে, 'চালিয়ে যান' বিকল্পটি বেছে নিন। @@ -3757,6 +3760,7 @@ <translation id="461661862154729886">পাওয়ার সোর্স</translation> <translation id="4617001782309103936">খুবই ছোট</translation> <translation id="4617270414136722281">এক্সটেনশন বিকল্প</translation> +<translation id="4617880081511131945">কানেকশন সেট-আপ করা যায়নি</translation> <translation id="4619564267100705184">নিজের পরিচয় যাচাই করুন</translation> <translation id="4619615317237390068">অন্যান্য ডিভাইসগুলি থেকে ট্যাব</translation> <translation id="4620809267248568679">একটি এক্সটেনশনের মাধ্যমে এই সেটিং প্রয়োগ করা হয়৷</translation> @@ -3792,6 +3796,7 @@ <translation id="4648491805942548247">অপর্যাপ্ত অনুমতিগুলি</translation> <translation id="4650591383426000695"><ph name="DEVICE_TYPE" /> থেকে আপনার ফোন ডিসকানেক্ট করুন</translation> <translation id="4651484272688821107">ডেমো মোড রিসোর্স সহ অনলাইন কম্পোনেন্ট লোড করা যায়নি।</translation> +<translation id="4651921906638302153">এই অ্যাকাউন্টের মাধ্যমে সাইন-ইন করতে পারবেন না</translation> <translation id="4652935475563630866">ক্যামেরা সেটিংয়ে পরিবর্তন করতে হলে, Parallels Desktop আবার লঞ্চ করতে হবে। আগে কাজ চালিয়ে যাওয়ার জন্য, Parallels Desktop আবার লঞ্চ করুন।</translation> <translation id="4653405415038586100">Linux কনফিগার করার সময় কোনও সমস্যা হয়েছে</translation> <translation id="465406513924180949">আপনি কার্টগুলি দেখছেন যা আপনাকে ওয়েব জুড়ে শপিং কার্টে রেখে যাওয়া আইটেমগুলি সহজে ফিরে পেতে সহায়তা করে। @@ -4050,6 +4055,7 @@ <translation id="4907306957610201395">অনুমতির শ্রেণীবিভাগ</translation> <translation id="4908811072292128752">একসাথে দুটি সাইট ব্রাউজ করতে নতুন ট্যাব খুলুন</translation> <translation id="4909038193460299775">এই অ্যাকাউন্টটি <ph name="DOMAIN" /> দ্বারা পরিচালিত হওয়ার কারণে আপনার বুকমার্ক, ইতিহাস, পাসওয়ার্ড এবং অন্যান্য সেটিংস এই ডিভাইস থেকে সাফ করা হবে। অবশ্য, আপনার ডেটা আপনার Google অ্যাকাউন্টে সঞ্চিত থাকবে এবং <ph name="BEGIN_LINK" />Google ড্যাশবোর্ড<ph name="END_LINK" /> থেকে তা পরিচালনা করা যাবে।</translation> +<translation id="4912265719039610598">আপনার ফোনের অ্যাডমিনিস্ট্রেটর অ্যাপ স্ট্রিমিং বিষয়টি বন্ধ করেছেন।</translation> <translation id="4912643508233590958">নিষ্ক্রিয়তা সময়ের সমাপ্তি</translation> <translation id="4915961947098019832">ছবি দেখানোর অনুমতি দেওয়া হয়েছে</translation> <translation id="4916542008280060967">সাইটকে <ph name="FILE_NAME" /> এডিট করার অনুমতি দেবেন?</translation> @@ -5450,6 +5456,7 @@ <translation id="6327785803543103246">ওয়েব প্রক্সী স্বতঃআবিষ্কার</translation> <translation id="6331818708794917058">MIDI ডিভাইসের সাথে কানেক্ট করতে, সাইট অনুমতি চাইতে পারে</translation> <translation id="6333064448949140209">ফাইল ডিবাগ করার জন্য Google-এ পাঠানো হবে</translation> +<translation id="6333170995003625229">আপনার ইমেল আইডি বা পাসওয়ার্ড যাচাই করা যায়নি। আবার সাইন-ইন করে দেখুন।</translation> <translation id="6335920438823100346">Linux চালু করার আগে, <ph name="MANAGER" /> আপনাকে ডেটা ব্যাকআপ নিতে ও এই Chromebook ফ্যাক্টরি সেটিংসে রিসেট করতে বলছে।</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> ADB ডিবাগিং বন্ধ করে দিয়েছে। এটি করলে ২৪ ঘণ্টায় আপনার <ph name="DEVICE_TYPE" /> রিসেট হয়ে যাবে। কোনও ফাইল রাখতে চাইলে, সেটির ব্যাক-আপ নিন।</translation> <translation id="6338981933082930623">সব সাইটই আপনাকে যেকোনও ধরনের বিজ্ঞাপন দেখাতে পারে</translation> @@ -5860,6 +5867,7 @@ <translation id="6735304988756581115">কুকিজ এবং অন্য সাইট ডেটা দেখান...</translation> <translation id="6736243959894955139">ঠিকানা</translation> <translation id="6737663862851963468">Kerberos টিকিট সরান</translation> +<translation id="6738430949033571771">অ্যাকাউন্ট যাচাই করা হচ্ছে...</translation> <translation id="6739923123728562974">ডেস্কটপ শর্টকাট দেখান</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> বিরাম দেওয়া হয়েছে</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />আপনার অ্যাডমিনিস্ট্রেটর<ph name="END_LINK" /> Safe Browsing বন্ধ করে দিয়েছে</translation> @@ -6882,6 +6890,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">আপনার প্রদর্শনের সীমানাগুলি সমন্বয় করে</translation> <translation id="7760004034676677601">আপনি কি এই পৃষ্ঠাটিকে শুরুর পৃষ্টা হিসেবে আশা করছিলেন?</translation> +<translation id="7762024824096060040">এই অ্যাকাউন্ট ব্যবহার করা যাচ্ছে না</translation> <translation id="7762463735017901568">আপনার ফোনের অ্যাডমিনিস্ট্রেটর বিজ্ঞপ্তি সিঙ্ক করার বিষয়টি বন্ধ করেছেন</translation> <translation id="7764225426217299476">ঠিকানা যোগ করুন</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> থেকে <ph name="DOWNLOAD_RECEIVED" /></translation> @@ -7051,6 +7060,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> সেকেন্ড</translation> <translation id="7920363873148656176"><ph name="ORIGIN" />, <ph name="FILENAME" /> নামের ফাইলটি দেখতে পারবে</translation> <translation id="7920482456679570420">যেসব শব্দের বানান পরীক্ষা করতে দিতে চান না সেগুলি যোগ করুন</translation> +<translation id="7921347341284348270">আপনি এই ম্যানেজ করা অ্যাকাউন্টে আপনার ফোনের বিজ্ঞপ্তি দেখতে পাবেন না। অন্য অ্যাকাউন্ট ব্যবহার করে আবার চেষ্টা করুন। <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation> <translation id="7922935920104868876">ছদ্মবেশী মোডে থার্ড-পার্টি কুকি ব্লক করার বিষয়ে বিবরণ দেখুন</translation> <translation id="7923564237306226146">Linux আপগ্রেড করা হয়ে গেছে</translation> <translation id="7924358170328001543">পোর্ট ফরওয়ার্ড করার সময় কোনও সমস্যা হয়েছে</translation> @@ -7676,6 +7686,8 @@ <translation id="8546306075665861288">ছবি ক্যাশে</translation> <translation id="8546930481464505581">টাচ বার কাস্টমাইজ করুন</translation> <translation id="8547013269961688403">ফুলস্ক্রিন ম্যাগনিফায়ার চালু করুন</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="MANAGER" />, <ph name="USER_EMAIL" /> ম্যানেজ করেছেন। অতিরিক্ত অ্যাকাউন্ট হিসেবে এই ইমেল যোগ করতে পারবেন না।<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" /> ব্যবহার করার জন্য, প্রথমে <ph name="DEVICE_TYPE" /> থেকে সাইন-আউট করুন। তারপরে, লগ-ইন স্ক্রিনের নিচ থেকে 'ব্যক্তি যোগ করুন' বিকল্পটি বেছে নিন।<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">সবথেকে উপরের-সারির বোতামগুলির আচরণ পরিবর্তন করতে সার্চ বোতাম ধরে থাকুন</translation> <translation id="8549316893834449916">আপনার Chromebook-এ সাইন-ইন করার জন্য আপনার Google অ্যাকাউন্ট ব্যবহার করুন - সেই একই অ্যাকাউন্ট যা আপনি Gmail, Drive, YouTube এবং Google-এর আরও পরিষেবায় ব্যবহার করেন।</translation> <translation id="8551388862522347954">লাইসেন্সগুলি</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index b78dc146..d96bbe0 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -870,6 +870,7 @@ <translation id="1813278315230285598">Usluge</translation> <translation id="18139523105317219">Naziv strane u EDI komunikaciji</translation> <translation id="1815083418640426271">Zalijepi kao neformatirani tekst</translation> +<translation id="1815097521077272760">Pozvani ste da isprobate kontrolu ove igre tastaturom.</translation> <translation id="1815181278146012280">Pitaj kada web lokacija želi pristupiti HID uređajima</translation> <translation id="181577467034453336">Još <ph name="NUMBER_OF_VIEWS" />...</translation> <translation id="1816036116994822943">Brzina skeniranja tastature</translation> @@ -1004,6 +1005,7 @@ <translation id="1935303383381416800">Dozvoljen je pregled vaše lokacije</translation> <translation id="1936931585862840749">Koristite broj da naznačite koliko primjeraka želite štampati (od 1 do <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Nije moguće uvesti spremnik čija je arhitektura <ph name="ARCHITECTURE_CONTAINER" /> s ovim uređajem čija je arhitektura <ph name="ARCHITECTURE_DEVICE" />. Možete pokušati vratiti spremnik u drugi uređaj ili možete pristupiti fajlovima unutar slike ovog spremnika otvaranjem aplikacije Files.</translation> +<translation id="1938320257168860255">Nešto nije uredu. Provjerite je li telefon blizu, otključan te jesu li uključeni Bluetooth i WiFi.</translation> <translation id="1938351510777341717">Vanjska komanda</translation> <translation id="1940546824932169984">Povezani uređaji</translation> <translation id="1941410638996203291">Vrijeme početka: <ph name="TIME" /></translation> @@ -1086,6 +1088,7 @@ <translation id="2030455719695904263">Dodirna tabla</translation> <translation id="2031639749079821948">Lozinka je sačuvana na Google računu</translation> <translation id="2031914984822377766">Dodajte preferirane <ph name="LINK_BEGIN" />jezike web lokacije<ph name="LINK_END" />. Prvi jezik na listi će se koristiti za prijevode.</translation> +<translation id="2033758234986231162">Nije moguće održavati vezu s telefonom. Provjerite je li telefon blizu, otključan te jesu li uključeni Bluetooth i WiFi.</translation> <translation id="2034346955588403444">Dodajte novu WiFi mrežu</translation> <translation id="203574396658008164">Omogući bilješke sa zaključanog ekrana</translation> <translation id="2037445849770872822">Nadzor je postavljen za ovaj Google račun. Da postavite još opcija roditeljskog nadzora, odaberite Nastavi. @@ -3755,6 +3758,7 @@ <translation id="461661862154729886">Izvor energije</translation> <translation id="4617001782309103936">Prekratak</translation> <translation id="4617270414136722281">Opcije ekstenzija</translation> +<translation id="4617880081511131945">Nije moguće uspostaviti vezu</translation> <translation id="4619564267100705184">Potvrdite identitet</translation> <translation id="4619615317237390068">Kartice iz drugih uređaja</translation> <translation id="4620809267248568679">Ovu postavku je nametnula ekstenzija.</translation> @@ -4047,6 +4051,7 @@ <translation id="4907306957610201395">Kategorija odobrenja</translation> <translation id="4908811072292128752">Otvorite novu karticu da istovremeno pregledate dvije web lokacije</translation> <translation id="4909038193460299775">S obzirom da ovim računom upravlja domena <ph name="DOMAIN" />, vaše oznake, historija, lozinke i druge postavke će se izbrisati s ovog uređaja. Međutim, postojeći podaci će ostati pohranjeni na vašem Google računu i njima možete upravljati na <ph name="BEGIN_LINK" />Google kontrolnoj tabli<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Administrator telefona je onemogućio prijenos aplikacija.</translation> <translation id="4912643508233590958">Buđenja iz neaktivnosti</translation> <translation id="4915961947098019832">Dozvoljeno je prikazivanje slika</translation> <translation id="4916542008280060967">Dozvoliti web lokaciji da uredi fajl <ph name="FILE_NAME" />?</translation> @@ -6879,6 +6884,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Prilagodite granice zaslona</translation> <translation id="7760004034676677601">Je li ovo stranica za pokretanje koju ste očekivali?</translation> +<translation id="7762024824096060040">Nije moguće koristiti ovaj račun</translation> <translation id="7762463735017901568">Administrator vašeg telefona je onemogućio sinhroniziranje obavještenja</translation> <translation id="7764225426217299476">Dodaj adresu</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> sa <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7049,6 +7055,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176">Web lokacija <ph name="ORIGIN" /> može pregledati <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Dodajte riječi koje želite da provjera pravopisa preskoči</translation> +<translation id="7921347341284348270">Ne možete pregledati obavještenja telefona na ovom upravljanom računu. Pokušajte ponovo s drugim računom. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Prikaži detalje o blokiranju kolačića trećih strana u anonimnom načinu rada</translation> <translation id="7923564237306226146">Nadogradnja Linuxa je završena</translation> <translation id="7924358170328001543">Greška pri prosljeđivanju priključka</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 319a9d5..ec192a3 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -862,6 +862,7 @@ <translation id="1813278315230285598">Služby</translation> <translation id="18139523105317219">Název strany EDI</translation> <translation id="1815083418640426271">Vložit jako prostý text</translation> +<translation id="1815097521077272760">Byli jste pozváni, abyste si pro tuto hru vyzkoušeli ovládání pomocí klávesnice.</translation> <translation id="1815181278146012280">Zeptat se, když chce web získat přístup k zařízením HID</translation> <translation id="181577467034453336">Ještě <ph name="NUMBER_OF_VIEWS" />...</translation> <translation id="1816036116994822943">Rychlost prohledávání klávesnice</translation> @@ -995,6 +996,7 @@ <translation id="1935303383381416800">Povolení k přístupu k vaší poloze</translation> <translation id="1936931585862840749">Počet kopií, které chcete vytisknout, je třeba zadat jako číslo (od 1 do <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Typ architektury kontejneru <ph name="ARCHITECTURE_CONTAINER" /> do tohoto zařízení s architekturou <ph name="ARCHITECTURE_DEVICE" /> nelze importovat. Můžete tento kontejner zkusit obnovit do jiného zařízení nebo soubory v obrazu kontejneru otevřít v aplikaci Soubory.</translation> +<translation id="1938320257168860255">Došlo k chybě. Ujistěte se, že je telefon blízko, že je odemknutý a že jsou zapnuté Bluetooth a Wi-Fi.</translation> <translation id="1938351510777341717">Externí příkaz</translation> <translation id="1940546824932169984">Připojená zařízení</translation> <translation id="1941410638996203291">Čas zahájení <ph name="TIME" /></translation> @@ -1077,6 +1079,7 @@ <translation id="2030455719695904263">Touchpad</translation> <translation id="2031639749079821948">Heslo je uloženo ve vašem účtu Google</translation> <translation id="2031914984822377766">Přidejte preferované <ph name="LINK_BEGIN" />jazyky webu<ph name="LINK_END" />. První jazyk v seznamu se bude používat pro překlady.</translation> +<translation id="2033758234986231162">Nelze udržet spojení s telefonem. Ujistěte se, že je telefon blízko, že je odemknutý a že jsou zapnuté Bluetooth a Wi-Fi.</translation> <translation id="2034346955588403444">Přidat jinou síť Wi-Fi</translation> <translation id="203574396658008164">Povolit psaní poznámek na obrazovce uzamčení</translation> <translation id="2037445849770872822">V tomto účtu Google je nastaven dohled. Chcete-li nastavit další rodičovskou kontrolu, vyberte Pokračovat. @@ -3741,6 +3744,7 @@ <translation id="461661862154729886">Zdroj energie</translation> <translation id="4617001782309103936">Příliš krátké</translation> <translation id="4617270414136722281">Možnosti rozšíření</translation> +<translation id="4617880081511131945">Nelze navázat spojení</translation> <translation id="4619564267100705184">Ověřte svou totožnost</translation> <translation id="4619615317237390068">Karty z ostatních zařízení</translation> <translation id="4620809267248568679">Toto nastavení bylo vynuceno rozšířením.</translation> @@ -4033,6 +4037,7 @@ <translation id="4907306957610201395">Kategorie oprávnění</translation> <translation id="4908811072292128752">Otevřete novou kartu a prohlížejte dvě webové stránky naráz</translation> <translation id="4909038193460299775">Protože je tento účet spravován doménou <ph name="DOMAIN" />, budou z tohoto zařízení vymazány vaše záložky, historie, hesla a další nastavení. Data však zůstanou uložená ve vašem účtu Google a lze je spravovat v <ph name="BEGIN_LINK" />Hlavním panelu Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Administrátor telefonu streamování aplikací zakázal.</translation> <translation id="4912643508233590958">Probuzení z nečinnosti</translation> <translation id="4915961947098019832">Povolení zobrazovat obrázky</translation> <translation id="4916542008280060967">Povolit webu upravovat soubor <ph name="FILE_NAME" />?</translation> @@ -6862,6 +6867,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Úprava ohraničení zobrazení</translation> <translation id="7760004034676677601">Je toto počáteční stránka, kterou jste očekávali?</translation> +<translation id="7762024824096060040">Tento účet nelze použít</translation> <translation id="7762463735017901568">Administrátor telefonu synchronizaci oznámení zakázal</translation> <translation id="7764225426217299476">Přidat adresu</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> z <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7031,6 +7037,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> může číst soubor <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Přidat slova, která má kontrola pravopisu přeskakovat</translation> +<translation id="7921347341284348270">V tomto spravovaném účtu oznámení svého telefonu zobrazit nemůžete. Zkuste to znovu s jiným účtem. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Zobrazit podrobnosti o blokování souborů cookie třetí strany v anonymním režimu</translation> <translation id="7923564237306226146">Upgrade systému Linux byl dokončen.</translation> <translation id="7924358170328001543">Při přesměrování portu došlo k chybě</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index 94b47a9..61d0e3b6 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -874,6 +874,7 @@ <translation id="1813278315230285598">Gwasanaethau</translation> <translation id="18139523105317219">Enw Parti EDI</translation> <translation id="1815083418640426271">Gludo fel Testun Plaen</translation> +<translation id="1815097521077272760">Rydych wedi'ch gwahodd i roi cynnig ar reolaeth bysellfwrdd ar gyfer y gêm hon.</translation> <translation id="1815181278146012280">Gofyn pan fydd gwefan eisiau cyrchu dyfeisiau HID</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> arall...</translation> <translation id="1816036116994822943">Cyflymder chwilio am fysellfwrdd</translation> @@ -1008,6 +1009,7 @@ <translation id="1935303383381416800">Caniatâd i weld eich lleoliad</translation> <translation id="1936931585862840749">Defnyddiwch rif i nodi faint o gopïau i'w hargraffu (1 i <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Methu â mewnforio math pensaernïaeth y cynhwysydd <ph name="ARCHITECTURE_CONTAINER" /> gyda'r ddyfais hon sy'n <ph name="ARCHITECTURE_DEVICE" />. Gallwch roi cynnig ar adfer y cynhwysydd hwn i ddyfais wahanol, neu gallwch gael mynediad at y ffeiliau y tu mewn i'r llun cynhwysydd hwn drwy ei agor yn ap Files.</translation> +<translation id="1938320257168860255">Aeth rhywbeth o'i le. Gwnewch yn siŵr bod eich ffôn gerllaw, wedi'i ddatgloi a bod Bluetooth a Wi-Fi ymlaen.</translation> <translation id="1938351510777341717">Gorchymyn Allanol</translation> <translation id="1940546824932169984">Dyfeisiau sydd wedi'u cysylltu</translation> <translation id="1941410638996203291">Amser dechrau <ph name="TIME" /></translation> @@ -1090,6 +1092,7 @@ <translation id="2030455719695904263">Pad cyffwrdd</translation> <translation id="2031639749079821948">Mae eich cyfrinair wedi'i gadw yn eich Cyfrif Google</translation> <translation id="2031914984822377766">Ychwanegu eich <ph name="LINK_BEGIN" />ieithoedd gwefan<ph name="LINK_END" /> a ffefrir. Defnyddir yr iaith o frig y rhestr ar gyfer cyfieithiadau.</translation> +<translation id="2033758234986231162">Methu â chynnal cysylltiad â'ch ffôn. Gwnewch yn siŵr bod eich ffôn gerllaw, wedi'i ddatgloi a bod Bluetooth a Wi-Fi ymlaen.</translation> <translation id="2034346955588403444">Ychwanegu rhwydwaith Wi-Fi arall</translation> <translation id="203574396658008164">Galluogi cymryd nodiadau o'r clo sgrîn</translation> <translation id="2037445849770872822">Mae goruchwyliaeth wedi'i gosod ar gyfer y Cyfrif Google hwn. I osod rhagor o reolaethau rhieni, dewiswch Parhau. @@ -3760,6 +3763,7 @@ <translation id="461661862154729886">Ffynhonnell ynni</translation> <translation id="4617001782309103936">Rhy fyr</translation> <translation id="4617270414136722281">Dewisiadau'r estyniad</translation> +<translation id="4617880081511131945">Methu â sefydlu cysylltiad</translation> <translation id="4619564267100705184">Cadarnhewch mai chi sydd yno</translation> <translation id="4619615317237390068">Tabiau o ddyfeisiau eraill</translation> <translation id="4620809267248568679">Gorfodir y gosodiad hwn gan estyniad.</translation> @@ -4052,6 +4056,7 @@ <translation id="4907306957610201395">Categori Caniatâd</translation> <translation id="4908811072292128752">Agorwch dab newydd i bori dwy wefan ar yr un pryd</translation> <translation id="4909038193460299775">Oherwydd bod y cyfrif hwn yn cael ei reoli gan <ph name="DOMAIN" />, bydd eich nodau tudalen, eich hanes, eich cyfrineiriau, a'ch gosodiadau eraill yn cael eu clirio o'r ddyfais hon. Fodd bynnag, bydd eich data yn parhau i gael eu storio yn eich Cyfrif Google a gellir ei reoli yn <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Mae gweinyddwr eich ffôn wedi analluogi ffrydio apiau.</translation> <translation id="4912643508233590958">Deffro o Segur</translation> <translation id="4915961947098019832">Caniateir i ddangos lluniau</translation> <translation id="4916542008280060967">Caniatáu i'r wefan olygu <ph name="FILE_NAME" />?</translation> @@ -6888,6 +6893,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Addasu ffiniau eich sgrîn</translation> <translation id="7760004034676677601">Ai hon yw'r dudalen gychwyn yr oeddech yn ei disgwyl?</translation> +<translation id="7762024824096060040">Methu â defnyddio'r cyfrif hwn</translation> <translation id="7762463735017901568">Mae gweinyddwr eich ffôn wedi analluogi cysoni hysbysiadau</translation> <translation id="7764225426217299476">Ychwanegu cyfeiriad</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> gan <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7058,6 +7064,7 @@ <translation id="7919210519031517829"><ph name="DURATION" />e</translation> <translation id="7920363873148656176">Gall <ph name="ORIGIN" /> weld <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Ychwanegu geiriau rydych am i wirio sillafu eu neidio</translation> +<translation id="7921347341284348270">Ni allwch weld hysbysiadau eich ffôn ar y cyfrif a reolir hwn. Rhowch gynnig arall arni gyda chyfrif gwahanol. <ph name="LINK_BEGIN" />Dysgu rhagor<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Dangos manylion am rwystro cwcis trydydd parti yn y modd Anhysbys</translation> <translation id="7923564237306226146">Mae uwchraddio Linux wedi'i gwblhau</translation> <translation id="7924358170328001543">Bu gwall wrth anfon porth ymlaen</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 6259504..64ed3d35 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -872,6 +872,7 @@ <translation id="1813278315230285598">Tjenester</translation> <translation id="18139523105317219">EDI-partsnavn</translation> <translation id="1815083418640426271">Indsæt som almindelig tekst</translation> +<translation id="1815097521077272760">Du er blevet inviteret til at prøve tastaturstyring for dette spil.</translation> <translation id="1815181278146012280">Spørg, når et website vil have adgang til HID-enheder</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> mere...</translation> <translation id="1816036116994822943">Hastighed for tastaturscanning</translation> @@ -1006,6 +1007,7 @@ <translation id="1935303383381416800">Har tilladelse til at se din lokation</translation> <translation id="1936931585862840749">Brug et tal til at angive, hvor mange kopier der skal udskrives (1 til <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Containerarkitekturen <ph name="ARCHITECTURE_CONTAINER" /> kan ikke importeres med denne enhed, som kører med <ph name="ARCHITECTURE_DEVICE" />. Du kan prøve at gendanne denne container i en anden enhed, eller også kan du åbne filerne i containerbilledet i appen Filer.</translation> +<translation id="1938320257168860255">Noget gik galt. Sørg for, at din telefon er i nærheden og låst op, og at Bluetooth og Wi-Fi er aktiveret.</translation> <translation id="1938351510777341717">Ekstern kommando</translation> <translation id="1940546824932169984">Tilsluttede enheder</translation> <translation id="1941410638996203291">Starttidspunkt: <ph name="TIME" /></translation> @@ -1088,6 +1090,7 @@ <translation id="2030455719695904263">Touchplade</translation> <translation id="2031639749079821948">Din adgangskode er gemt på din Google-konto</translation> <translation id="2031914984822377766">Tilføj dine foretrukne <ph name="LINK_BEGIN" />sprog for websites<ph name="LINK_END" />. De øverste sprog på listen anvendes til oversættelser.</translation> +<translation id="2033758234986231162">Forbindelsen til din telefon kan ikke opretholdes. Sørg for, at din telefon er i nærheden og låst op, og at Bluetooth og Wi-Fi er aktiveret.</translation> <translation id="2034346955588403444">Tilføj andre Wi-Fi-netværk</translation> <translation id="203574396658008164">Aktivér notatskrivning via låseskærmen</translation> <translation id="2037445849770872822">Forældrestyring er konfigureret for denne Google-konto. Hvis du vil konfigurere yderligere forældrestyring, skal du vælge Fortsæt. @@ -3758,6 +3761,7 @@ <translation id="461661862154729886">Energikilde</translation> <translation id="4617001782309103936">For kort</translation> <translation id="4617270414136722281">Valgmuligheder for udvidelser</translation> +<translation id="4617880081511131945">Der kan ikke oprettes forbindelse</translation> <translation id="4619564267100705184">Bekræft din identitet</translation> <translation id="4619615317237390068">Faner fra andre enheder</translation> <translation id="4620809267248568679">Denne indstilling håndhæves af en udvidelse.</translation> @@ -3793,6 +3797,7 @@ <translation id="4648491805942548247">Utilstrækkelige tilladelser</translation> <translation id="4650591383426000695">Afbryd forbindelsen mellem din telefon og <ph name="DEVICE_TYPE" /></translation> <translation id="4651484272688821107">Onlinekomponenten med ressourcer til demotilstand kunne ikke indlæses.</translation> +<translation id="4651921906638302153">Du kan ikke logge ind med denne konto</translation> <translation id="4652935475563630866">Ændringen af kameraindstillingen kræver, at Parallels Desktop genstartes. Genstart Parallels Desktop for at fortsætte.</translation> <translation id="4653405415038586100">Der opstod en fejl under konfigurationen af Linux</translation> <translation id="465406513924180949">Du får vist kurve, som hjælper dig med nemt at vende tilbage til de varer, du har efterladt i kurve rundt omkring på nettet. @@ -4050,6 +4055,7 @@ <translation id="4907306957610201395">Tilladelseskategori</translation> <translation id="4908811072292128752">Åbn en ny fane for at se to websites på én gang</translation> <translation id="4909038193460299775">Eftersom denne konto administreres af <ph name="DOMAIN" />, slettes dine bogmærker, din historik, dine adgangskoder og andre indstillinger på denne enhed. Dine data vil dog fortsat være gemt på din Google-konto og kan administreres i <ph name="BEGIN_LINK" />Google Kontrolpanel<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Appstreaming er deaktiveret af din telefons administrator.</translation> <translation id="4912643508233590958">Aktivering efter dvale</translation> <translation id="4915961947098019832">Har tilladelse til at vise billeder</translation> <translation id="4916542008280060967">Skal websitet kunne redigere <ph name="FILE_NAME" />?</translation> @@ -5448,6 +5454,7 @@ <translation id="6327785803543103246">Automatisk registrering af webproxy</translation> <translation id="6331818708794917058">Websites kan anmode om tilladelse til at oprette forbindelse til MIDI-enheder</translation> <translation id="6333064448949140209">Filen sendes til Google til fejlretning</translation> +<translation id="6333170995003625229">Din mailadresse eller adgangskode kunne ikke bekræftes. Prøv at logge ind igen.</translation> <translation id="6335920438823100346"><ph name="MANAGER" /> kræver, at du sikkerhedskopierer dine data og gendanner fabriksindstillingerne på denne Chromebook, før du kan starte Linux.</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> har deaktiveret ADB-fejlretning. Dette medfører, at din <ph name="DEVICE_TYPE" /> nulstilles om 24 timer. Sikkerhedskopiér de filer, du vil beholde.</translation> <translation id="6338981933082930623">Alle websites kan vise dig alle slags annoncer</translation> @@ -5858,6 +5865,7 @@ <translation id="6735304988756581115">Vis cookies og andre websitedata...</translation> <translation id="6736243959894955139">Adresse</translation> <translation id="6737663862851963468">Fjern Kerberos-billet</translation> +<translation id="6738430949033571771">Bekræfter kontoen...</translation> <translation id="6739923123728562974">Vis genvej på skrivebordet</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> er sat på pause</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Din administrator<ph name="END_LINK" /> har deaktiveret Beskyttet browsing</translation> @@ -6880,6 +6888,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Tilpas grænserne for din skærm</translation> <translation id="7760004034676677601">Var det den opstartsside, du havde forventet?</translation> +<translation id="7762024824096060040">Denne konto kan ikke bruges</translation> <translation id="7762463735017901568">Synkronisering af notifikationer er deaktiveret af administratoren af din telefon</translation> <translation id="7764225426217299476">Tilføj adresse</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> fra <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7049,6 +7058,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> sek.</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> kan se <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Tilføj ord, som stavekontrollen skal springe over</translation> +<translation id="7921347341284348270">Du kan ikke se din telefons notifikationer på denne administrerede konto. Prøv igen med en anden konto. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Vis oplysninger om blokering af tredjepartscookies i inkognito</translation> <translation id="7923564237306226146">Linux-opgraderingen er gennemført</translation> <translation id="7924358170328001543">Fejl i forbindelse med omdirigering af port</translation> @@ -7674,6 +7684,8 @@ <translation id="8546306075665861288">Billedcache</translation> <translation id="8546930481464505581">Tilpas Touch Bar</translation> <translation id="8547013269961688403">Aktivér forstørrelse af fuld skærm</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> administreres af <ph name="MANAGER" />. Du kan ikke tilføje denne mailadresse som en ekstra konto.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Hvis du vil bruge <ph name="USER_EMAIL" />, skal du starte med at logge ud af din <ph name="DEVICE_TYPE" />. Vælg derefter Tilføj person nederst på loginskærmen.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">Hold tasten Søg nede for at skifte funktion for den øverste række taster</translation> <translation id="8549316893834449916">Du skal bruge din Google-konto til at logge ind på din Chromebook – den samme konto, som du bruger i Gmail, i Drev, på YouTube m.m.</translation> <translation id="8551388862522347954">Licenser</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 3086e21..066d75b 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -857,6 +857,7 @@ <translation id="1813278315230285598">Dienste</translation> <translation id="18139523105317219">Name der EDI-Partei</translation> <translation id="1815083418640426271">Als unformatierten Text einfügen</translation> +<translation id="1815097521077272760">Du wurdest eingeladen, die Tastatursteuerung für dieses Spiel auszuprobieren.</translation> <translation id="1815181278146012280">Nachfragen, wenn eine Website auf HID-Geräte zugreifen möchte</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> weitere...</translation> <translation id="1816036116994822943">Scangeschwindigkeit (Tastatur)</translation> @@ -990,6 +991,7 @@ <translation id="1935303383381416800">Dürfen meine Standortdaten abrufen</translation> <translation id="1936931585862840749">Gib eine Zahl ein, um die Anzahl der zu druckenden Exemplare festzulegen (1 bis <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Der Containerarchitekturtyp <ph name="ARCHITECTURE_CONTAINER" /> kann bei diesem Gerät nicht importiert werden, weil es sich um ein <ph name="ARCHITECTURE_DEVICE" />-Gerät handelt. Du kannst probieren, diesen Container auf einem anderen Gerät wiederherzustellen oder das Containerimage in der App "Dateien" öffnen und dort auf die enthaltenen Dateien zugreifen.</translation> +<translation id="1938320257168860255">Es gab ein Problem. Dein Smartphone muss sich in der Nähe befinden und entsperrt sein. Außerdem müssen Bluetooth und WLAN aktiviert sein.</translation> <translation id="1938351510777341717">Externer Befehl</translation> <translation id="1940546824932169984">Verbundene Geräte</translation> <translation id="1941410638996203291">Startzeit: <ph name="TIME" /></translation> @@ -1072,6 +1074,7 @@ <translation id="2030455719695904263">Touchpad</translation> <translation id="2031639749079821948">Dein Passwort ist in deinem Google-Konto gespeichert</translation> <translation id="2031914984822377766">Füge die gewünschten <ph name="LINK_BEGIN" />Website-Sprachen<ph name="LINK_END" /> hinzu. Die erste Sprache auf der Liste wird für Übersetzungen verwendet.</translation> +<translation id="2033758234986231162">Verbindung mit deinem Smartphone kann nicht aufrechterhalten werden. Dein Smartphone muss sich in der Nähe befinden und entsperrt sein. Außerdem müssen Bluetooth und WLAN aktiviert sein.</translation> <translation id="2034346955588403444">Anderes WLAN hinzufügen</translation> <translation id="203574396658008164">Notizen über Sperrbildschirm aktivieren</translation> <translation id="2037445849770872822">Für dieses Google-Konto wurde die Elternaufsicht eingerichtet. Wenn du zusätzliche Jugendschutzeinstellungen konfigurieren möchtest, wähle "Weiter" aus. @@ -3738,6 +3741,7 @@ <translation id="461661862154729886">Energiequelle</translation> <translation id="4617001782309103936">Zu kurz</translation> <translation id="4617270414136722281">Optionen</translation> +<translation id="4617880081511131945">Verbindung kann nicht hergestellt werden</translation> <translation id="4619564267100705184">Identität bestätigen</translation> <translation id="4619615317237390068">Tabs von anderen Geräten</translation> <translation id="4620809267248568679">Diese Einstellung wird durch eine Erweiterung erzwungen.</translation> @@ -4030,6 +4034,7 @@ <translation id="4907306957610201395">Berechtigungskategorie</translation> <translation id="4908811072292128752">Wenn du zwei Websites gleichzeitig ansehen möchtest, öffne einen neuen Tab</translation> <translation id="4909038193460299775">Da dieses Konto von <ph name="DOMAIN" /> verwaltet wird, werden der Verlauf sowie deine Lesezeichen, Passwörter und sonstigen Einstellungen von diesem Gerät gelöscht. Die Daten bleiben jedoch in deinem Google-Konto gespeichert und du kannst sie über das <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" /> verwalten.</translation> +<translation id="4912265719039610598">Das App-Streaming wurde vom Administrator deines Smartphones deaktiviert.</translation> <translation id="4912643508233590958">Inaktive Weckbefehle</translation> <translation id="4915961947098019832">Dürfen Bilder anzeigen</translation> <translation id="4916542008280060967">Website erlauben, <ph name="FILE_NAME" /> zu bearbeiten?</translation> @@ -6855,6 +6860,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Bildschirmränder anpassen</translation> <translation id="7760004034676677601">Ist das deine erwartete "Beim Start"-Seite?</translation> +<translation id="7762024824096060040">Dieses Konto kann nicht verwendet werden</translation> <translation id="7762463735017901568">Die Synchronisierung von Benachrichtigungen wurde vom Administrator deines Smartphones deaktiviert</translation> <translation id="7764225426217299476">Adresse hinzufügen</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> von <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7024,6 +7030,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> darf <ph name="FILENAME" /> aufrufen</translation> <translation id="7920482456679570420">Hier fügst du Wörter hinzu, die bei der Rechtschreibprüfung übersprungen werden sollen</translation> +<translation id="7921347341284348270">Du kannst die Benachrichtigungen deines Smartphones für dieses verwaltete Konto nicht anzeigen lassen. Versuche es mit einem anderen Konto noch einmal. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Informationen zum Blockieren von Drittanbieter-Cookies im Inkognitomodus aufrufen</translation> <translation id="7923564237306226146">Linux-Upgrade abgeschlossen</translation> <translation id="7924358170328001543">Fehler bei der Portweiterleitung</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 71b28414..180d409 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -871,6 +871,7 @@ <translation id="1813278315230285598">Υπηρεσίες</translation> <translation id="18139523105317219">Όνομα μέρους EDI</translation> <translation id="1815083418640426271">Επικόλληση ως απλό κείμενο</translation> +<translation id="1815097521077272760">Λάβατε πρόσκληση για να δοκιμάσετε τον έλεγχο μέσω πληκτρολογίου για αυτό το παιχνίδι.</translation> <translation id="1815181278146012280">Να γίνεται ερώτηση όταν κάποιος ιστότοπος θέλει να αποκτήσει πρόσβαση σε συσκευές HID.</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> ακόμη…</translation> <translation id="1816036116994822943">Ταχύτητα σάρωσης πληκτρολογίου</translation> @@ -1005,6 +1006,7 @@ <translation id="1935303383381416800">Επιτρέπεται να βλέπουν την τοποθεσία σας</translation> <translation id="1936931585862840749">Χρησιμοποιήστε έναν αριθμό για να υποδείξετε πόσα αντίγραφα θα εκτυπωθούν (1 έως <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Δεν είναι δυνατή η εισαγωγή ενός κοντέινερ με τύπο αρχιτεκτονικής <ph name="ARCHITECTURE_CONTAINER" /> με μια συσκευή της οποίας ο τύπος αρχιτεκτονικής είναι <ph name="ARCHITECTURE_DEVICE" />. Προσπαθήστε να επαναφέρετε αυτό το κοντέινερ σε μια άλλη συσκευή ή αποκτήστε πρόσβαση στα αρχεία αυτής της εικόνας κοντέινερ ανοίγοντάς τη στην εφαρμογή Αρχεία.</translation> +<translation id="1938320257168860255">Παρουσιάστηκε κάποιο πρόβλημα. Βεβαιωθείτε ότι το τηλέφωνό σας βρίσκεται κοντά, είναι ξεκλειδωμένο και είναι ενεργό το Bluetooth και το Wi-Fi.</translation> <translation id="1938351510777341717">Εξωτερικό πλήκτρο Command</translation> <translation id="1940546824932169984">Συνδεδεμένες συσκευές</translation> <translation id="1941410638996203291">Ώρα έναρξης <ph name="TIME" /></translation> @@ -1087,6 +1089,7 @@ <translation id="2030455719695904263">Επιφάνεια αφής</translation> <translation id="2031639749079821948">Ο κωδικός πρόσβασής σας αποθηκεύεται στον Λογαριασμό σας Google.</translation> <translation id="2031914984822377766">Προσθέστε τις προτιμώμενες <ph name="LINK_BEGIN" />γλώσσες ιστοτόπου<ph name="LINK_END" />. Η κορυφαία γλώσσα από τη λίστα θα χρησιμοποιηθεί για μεταφράσεις.</translation> +<translation id="2033758234986231162">Δεν είναι δυνατή η διατήρηση μιας σύνδεσης με το τηλέφωνό σας. Βεβαιωθείτε ότι το τηλέφωνό σας βρίσκεται κοντά, είναι ξεκλειδωμένο και είναι ενεργό το Bluetooth και το Wi-Fi.</translation> <translation id="2034346955588403444">Προσθήκη άλλου δικτύου Wi-Fi</translation> <translation id="203574396658008164">Ενεργοποίηση λήψης σημειώσεων από την οθόνη κλειδώματος</translation> <translation id="2037445849770872822">Η επίβλεψη ρυθμίστηκε για αυτόν τον Λογαριασμό Google. Για να ρυθμίσετε περισσότερους γονικούς ελέγχους, επιλέξτε Συνέχεια. @@ -3757,6 +3760,7 @@ <translation id="461661862154729886">Πηγή ενέργειας</translation> <translation id="4617001782309103936">Υπερβολικά μικρό</translation> <translation id="4617270414136722281">Επιλογές επεκτάσεων</translation> +<translation id="4617880081511131945">Δεν είναι δυνατή η δημιουργία σύνδεσης</translation> <translation id="4619564267100705184">Επαλήθευση ταυτότητας</translation> <translation id="4619615317237390068">Καρτέλες από άλλες συσκευές</translation> <translation id="4620809267248568679">Αυτή η ρύθμιση εφαρμόζεται από μια επέκταση.</translation> @@ -4049,6 +4053,7 @@ <translation id="4907306957610201395">Κατηγορία δικαιωμάτων</translation> <translation id="4908811072292128752">Ανοίξτε μια νέα καρτέλα για ταυτόχρονη περιήγηση σε δύο ιστότοπους</translation> <translation id="4909038193460299775">Επειδή η διαχείριση αυτού του λογαριασμού γίνεται από τον τομέα <ph name="DOMAIN" />, οι σελιδοδείκτες, το ιστορικό, οι κωδικοί πρόσβασης και άλλες ρυθμίσεις θα διαγραφούν από αυτήν τη συσκευή. Ωστόσο, τα δεδομένα σας θα παραμείνουν αποθηκευμένα στον Λογαριασμό σας Google και η διαχείρισή τους μπορεί να γίνεται στον <ph name="BEGIN_LINK" />Πίνακα ελέγχου Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Η ροή εφαρμογών έχει απενεργοποιηθεί από τον διαχειριστή του τηλεφώνου σας.</translation> <translation id="4912643508233590958">Έξοδος από την κατάσταση αδράνειας</translation> <translation id="4915961947098019832">Επιτρέπεται να εμφανίζουν εικόνες</translation> <translation id="4916542008280060967">Να επιτρέπεται στον ιστότοπο η επεξεργασία του αρχείου <ph name="FILE_NAME" />;</translation> @@ -6878,6 +6883,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Προσαρμόστε τα όρια της οθόνης σας</translation> <translation id="7760004034676677601">Είναι αυτή η σελίδα εκκίνησης που περιμένατε;</translation> +<translation id="7762024824096060040">Δεν είναι δυνατή η χρήση αυτού του λογαριασμού</translation> <translation id="7762463735017901568">Ο συγχρονισμός των ειδοποιήσεων έχει απενεργοποιηθεί από τον διαχειριστή του τηλεφώνου</translation> <translation id="7764225426217299476">Προσθήκη διεύθυνσης</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> από <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7048,6 +7054,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> δ.</translation> <translation id="7920363873148656176">Το <ph name="ORIGIN" /> μπορεί να προβάλλει το <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Προσθέστε λέξεις που θέλετε να παραβλέπονται κατά τον ορθογραφικό έλεγχο.</translation> +<translation id="7921347341284348270">Δεν είναι δυνατή η προβολή των ειδοποιήσεων του τηλεφώνου σας στον συγκεκριμένο διαχειριζόμενο λογαριασμό. Δοκιμάστε ξανά με διαφορετικό λογαριασμό. <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Εμφάνιση λεπτομερειών σχετικά με τον αποκλεισμό cookie τρίτου μέρους σε λειτουργία ανώνυμης περιήγησης</translation> <translation id="7923564237306226146">Η αναβάθμιση του Linux ολοκληρώθηκε</translation> <translation id="7924358170328001543">Σφάλμα κατά την προώθηση θύρας</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index d8d6480..df25eb92 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1722,6 +1722,7 @@ <translation id="25899519884572181">Exit reader mode</translation> <translation id="2593499352046705383">Before starting, make sure that you have a backup of your data. Installing <ph name="DEVICE_OS" /> will overwrite your hard drive. Learn more at g.co/flex/InstallGuide.</translation> <translation id="2594999711683503743">Search Google or type URL</translation> +<translation id="2597976513418770460">Get your Chrome browser stuff from <ph name="ACCOUNT_EMAIL" /></translation> <translation id="2602501489742255173">Swipe up to get started</translation> <translation id="2603115962224169880">Clean up computer</translation> <translation id="2603355571917519942">Voice Match is ready</translation> @@ -3462,6 +3463,7 @@ <translation id="4307992518367153382">Basics</translation> <translation id="4309165024397827958">Allow Android apps and services with location permission to use your device's location. Google may collect location data periodically and use this data in an anonymous way to improve location accuracy and location-based services.</translation> <translation id="4309420042698375243"><ph name="NUM_KILOBYTES" />K (<ph name="NUM_KILOBYTES_LIVE" />K live)</translation> +<translation id="4310132194679586591">Select an app on your device to open this link</translation> <translation id="4310139701823742692">File is in the wrong format. Check the PPD file and try again.</translation> <translation id="431076611119798497">&Details</translation> <translation id="4312701113286993760">{COUNT,plural, =1{1 Google Account}other{<ph name="EXTRA_ACCOUNTS" /> Google Accounts}}</translation> @@ -4692,6 +4694,7 @@ <translation id="5554403733534868102">After this, no waiting for updates</translation> <translation id="5554489410841842733">This icon will be visible when the extension can act on the current page.</translation> <translation id="5554720593229208774">Email Certification Authority</translation> +<translation id="5554866693883022680">Select an app on your <ph name="DEVICE_TYPE" /> to open this link</translation> <translation id="5555363196923735206">Flip camera</translation> <translation id="5555525474779371165">Choose your Safe Browsing protection</translation> <translation id="5556459405103347317">Reload</translation> @@ -7459,6 +7462,7 @@ <translation id="8275080796245127762">Call from Your Device</translation> <translation id="8275339871947079271">Move your password to your Google Account to access it securely wherever you're signed in</translation> <translation id="8276560076771292512">Empty cache and hard reload</translation> +<translation id="8281721647184388851">Turn on Chrome browser sync?</translation> <translation id="8281886186245836920">Skip</translation> <translation id="8283475148136688298">Authentication code rejected while connecting to "<ph name="DEVICE_NAME" />".</translation> <translation id="8284279544186306258">all <ph name="WEBSITE_1" /> sites</translation> @@ -7614,6 +7618,7 @@ <translation id="8448729345478502352">Make items on your screen smaller or larger</translation> <translation id="8449008133205184768">Paste and Match Style</translation> <translation id="8449036207308062757">Manage storage</translation> +<translation id="8451192282033883849">Your account is managed by <ph name="MANAGER_NAME" />. Your administrator can see and edit this Chrome browser profile and its data like bookmarks, history and passwords.</translation> <translation id="8456512334795994339">Find apps for work and play</translation> <translation id="845702320058262034">Can’t connect. Make sure that your phone’s Bluetooth is turned on.</translation> <translation id="8457451314607652708">Import bookmarks</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 9de5b4e3..f637849 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -857,6 +857,7 @@ <translation id="1813278315230285598">Servicios</translation> <translation id="18139523105317219">Nombre de parte EDI</translation> <translation id="1815083418640426271">Pegar como texto sin formato</translation> +<translation id="1815097521077272760">Te invitamos a probar el control de teclado en este juego.</translation> <translation id="1815181278146012280">Preguntarme cuando un sitio intente acceder a dispositivos HID</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> más…</translation> <translation id="1816036116994822943">Velocidad de análisis del teclado</translation> @@ -990,6 +991,7 @@ <translation id="1935303383381416800">Puede ver tu ubicación</translation> <translation id="1936931585862840749">Usa un número para indicar la cantidad de copias que deseas imprimir (1 a <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">No se puede importar el tipo de arquitectura de contenedores <ph name="ARCHITECTURE_CONTAINER" /> con este dispositivo porque es <ph name="ARCHITECTURE_DEVICE" />. Puedes intentar restablecer este contenedor en otro dispositivo o acceder a los archivos en su interior con la app de Archivos.</translation> +<translation id="1938320257168860255">Se produjo un error. Asegúrate de que el teléfono esté cerca y desbloqueado, y que el Bluetooth y el Wi-Fi estén encendidos.</translation> <translation id="1938351510777341717">Tecla externa Comando</translation> <translation id="1940546824932169984">Dispositivos conectados</translation> <translation id="1941410638996203291">Hora de inicio <ph name="TIME" /></translation> @@ -1072,6 +1074,7 @@ <translation id="2030455719695904263">Panel táctil</translation> <translation id="2031639749079821948">Se guardó la contraseña en tu Cuenta de Google</translation> <translation id="2031914984822377766">Agrega tus <ph name="LINK_BEGIN" />idiomas preferidos para los sitios web<ph name="LINK_END" />. Para las traducciones, se utilizará el primer idioma de la lista.</translation> +<translation id="2033758234986231162">No se puede mantener la conexión con tu teléfono. Asegúrate de que el teléfono esté cerca y desbloqueado, y que el Bluetooth y el Wi-Fi estén encendidos.</translation> <translation id="2034346955588403444">Agregar otra red Wi-Fi</translation> <translation id="203574396658008164">Habilitar la toma de notas desde la pantalla bloqueada</translation> <translation id="2037445849770872822">Se configuró la supervisión de esta Cuenta de Google. Para configurar más controles parentales, selecciona Continuar. @@ -3738,6 +3741,7 @@ <translation id="461661862154729886">Fuente de energía</translation> <translation id="4617001782309103936">Demasiado corto</translation> <translation id="4617270414136722281">Opciones de las extensiones</translation> +<translation id="4617880081511131945">No se puede establecer la conexión</translation> <translation id="4619564267100705184">Verificar tu identidad</translation> <translation id="4619615317237390068">Pestañas de otros dispositivos</translation> <translation id="4620809267248568679">Una extensión administra esta configuración.</translation> @@ -4030,6 +4034,7 @@ <translation id="4907306957610201395">Categoría de permiso</translation> <translation id="4908811072292128752">Abre una pestaña nueva para navegar en dos sitios al mismo tiempo</translation> <translation id="4909038193460299775">Debido a que esta cuenta la administra <ph name="DOMAIN" />, tus favoritos, historial, contraseñas y otras opciones de configuración se borrarán de este dispositivo. Sin embargo, tus datos permanecerán almacenados en tu cuenta de Google y se podrán administrar en el <ph name="BEGIN_LINK" />Panel de control de Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">El administrador de tu teléfono desactivó la transmisión de apps.</translation> <translation id="4912643508233590958">Reactivaciones</translation> <translation id="4915961947098019832">Puede mostrar imágenes</translation> <translation id="4916542008280060967">¿Quieres permitir que el sitio edite <ph name="FILE_NAME" />?</translation> @@ -6858,6 +6863,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ajusta los límites de la pantalla</translation> <translation id="7760004034676677601">¿Esta es la página de inicio que esperabas ver?</translation> +<translation id="7762024824096060040">No se puede usar esta cuenta</translation> <translation id="7762463735017901568">El administrador de tu teléfono desactivó la sincronización de notificaciones</translation> <translation id="7764225426217299476">Agregar dirección</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> de <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7028,6 +7034,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> puede ver <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Agrega las palabras que quieras que el corrector ortográfico omita</translation> +<translation id="7921347341284348270">No puedes ver notificaciones en tu teléfono en esta cuenta administrada. Vuelve a intentarlo con otra cuenta. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Mostrar detalles sobre cómo bloquear cookies de terceros en el modo Incógnito</translation> <translation id="7923564237306226146">Se completó la actualización de Linux</translation> <translation id="7924358170328001543">Se produjo un error al reenviar el puerto</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 8b58064..17efcf4 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -860,6 +860,7 @@ <translation id="1813278315230285598">Servicios</translation> <translation id="18139523105317219">Nombre de parte EDI</translation> <translation id="1815083418640426271">Pegar como texto sin formato</translation> +<translation id="1815097521077272760">Te han invitado a probar los controles de teclado en este juego.</translation> <translation id="1815181278146012280">Preguntar cuando un sitio web quiera acceder a los dispositivos HID</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> más...</translation> <translation id="1816036116994822943">Velocidad de búsqueda del teclado</translation> @@ -993,6 +994,7 @@ <translation id="1935303383381416800">Puede ver tu ubicación</translation> <translation id="1936931585862840749">Usa un número para indicar cuántas copias quieres imprimir (entre 1 y <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">No se puede importar el tipo de arquitectura de contenedores <ph name="ARCHITECTURE_CONTAINER" /> con este dispositivo, que es <ph name="ARCHITECTURE_DEVICE" />. Intenta restaurar este contenedor en otro dispositivo o accede a los archivos de esta imagen de contenedor abriéndola en la aplicación Archivos.</translation> +<translation id="1938320257168860255">Algo ha fallado. Comprueba que tengas el teléfono cerca, que esté desbloqueado y que el Bluetooth y el Wi‑Fi estén activados.</translation> <translation id="1938351510777341717">Tecla Comando externa</translation> <translation id="1940546824932169984">Dispositivos conectados</translation> <translation id="1941410638996203291">Hora de inicio: <ph name="TIME" /></translation> @@ -1075,6 +1077,7 @@ <translation id="2030455719695904263">Panel táctil</translation> <translation id="2031639749079821948">La contraseña está guardada en tu cuenta de Google</translation> <translation id="2031914984822377766">Añade tus <ph name="LINK_BEGIN" />idiomas preferidos para los sitios web<ph name="LINK_END" />. Para las traducciones, se usará el primer idioma de la lista.</translation> +<translation id="2033758234986231162">No se puede mantener una conexión con tu teléfono. Comprueba que tengas el teléfono cerca, que esté desbloqueado y que el Bluetooth y el Wi‑Fi estén activados.</translation> <translation id="2034346955588403444">Añadir otra red Wi-Fi</translation> <translation id="203574396658008164">Habilitar la toma de notas desde la pantalla de bloqueo</translation> <translation id="2037445849770872822">Se ha configurado la supervisión de esta cuenta de Google. Si quieres configurar más controles parentales, selecciona Continuar. @@ -3740,6 +3743,7 @@ <translation id="461661862154729886">Fuente de energía</translation> <translation id="4617001782309103936">Demasiado corto</translation> <translation id="4617270414136722281">Opciones de extensión</translation> +<translation id="4617880081511131945">No se puede establecer conexión</translation> <translation id="4619564267100705184">Verificar mi identidad</translation> <translation id="4619615317237390068">Pestañas de otros dispositivos</translation> <translation id="4620809267248568679">Una extensión aplica esta opción.</translation> @@ -4032,6 +4036,7 @@ <translation id="4907306957610201395">Categoría de permisos</translation> <translation id="4908811072292128752">Abre una pestaña nueva para navegar por dos sitios a la vez</translation> <translation id="4909038193460299775">Dado que <ph name="DOMAIN" /> administra esta cuenta, tus marcadores, tu historial, tus contraseñas y otros ajustes se borrarán de este dispositivo. No obstante, tus datos permanecerán almacenados en tu cuenta de Google y se podrán gestionar en el <ph name="BEGIN_LINK" />Panel de Control de Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">El administrador de tu teléfono ha inhabilitado el streaming de aplicaciones.</translation> <translation id="4912643508233590958">Activación inactiva</translation> <translation id="4915961947098019832">Puede mostrar imágenes</translation> <translation id="4916542008280060967">¿Permitir que el sitio web edite <ph name="FILE_NAME" />?</translation> @@ -6860,6 +6865,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ajusta los extremos de la pantalla</translation> <translation id="7760004034676677601">¿Es esta la página de inicio que esperabas?</translation> +<translation id="7762024824096060040">No se puede usar esta cuenta</translation> <translation id="7762463735017901568">El administrador de tu teléfono ha inhabilitado la sincronización de notificaciones</translation> <translation id="7764225426217299476">Añadir dirección</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> desde <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7030,6 +7036,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> puede ver <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Añade palabras que quieras que se omitan en el corrector ortográfico</translation> +<translation id="7921347341284348270">No puedes ver las notificaciones de tu teléfono en esta cuenta gestionada. Vuelve a intentarlo con otra cuenta. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Muestra información sobre cómo bloquear cookies de terceros en incógnito</translation> <translation id="7923564237306226146">Actualización de Linux completada</translation> <translation id="7924358170328001543">No se ha podido redirigir el puerto</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 860a8e6d5..7966cd68 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -863,6 +863,7 @@ <translation id="1813278315230285598">Teenused</translation> <translation id="18139523105317219">EDI-osapoole nimi</translation> <translation id="1815083418640426271">Kleebi lihttekstina</translation> +<translation id="1815097521077272760">Saite kutse proovida selles mängus klaviatuuriga juhtimist.</translation> <translation id="1815181278146012280">Küsi, kui sait soovib juurdepääsu HID-seadmetele</translation> <translation id="181577467034453336">Veel <ph name="NUMBER_OF_VIEWS" /> …</translation> <translation id="1816036116994822943">Klaviatuuri skannimiskiirus</translation> @@ -996,6 +997,7 @@ <translation id="1935303383381416800">Lubatud teie asukohta näha</translation> <translation id="1936931585862840749">Kasutage numbrit, mis näitab, kui palju koopiaid printida (1 kuni <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Selle seadmega, mis põhineb arhitektuuril <ph name="ARCHITECTURE_DEVICE" />, ei saa konteineri arhitektuuri tüüpi <ph name="ARCHITECTURE_CONTAINER" /> importida. Võite proovida konteineri muus seadmes taastada või rakendusega Failid selles konteinerikujutises olevatele failidele juurde pääseda.</translation> +<translation id="1938320257168860255">Midagi läks valesti. Veenduge, et teie telefon oleks läheduses, avatud ning Bluetooth ja WiFi oleksid sisse lülitatud.</translation> <translation id="1938351510777341717">Väline Command-klahv</translation> <translation id="1940546824932169984">Ühendatud seadmed</translation> <translation id="1941410638996203291">Algusaeg <ph name="TIME" /></translation> @@ -1078,6 +1080,7 @@ <translation id="2030455719695904263">Puuteplaat</translation> <translation id="2031639749079821948">Teie parool salvestatakse teie Google'i kontole</translation> <translation id="2031914984822377766">Lisage oma eelistatud <ph name="LINK_BEGIN" />veebisaidikeeled<ph name="LINK_END" />. Loendi kõige esimest keelt kasutatakse tõlgete jaoks.</translation> +<translation id="2033758234986231162">Ei saa ühendust teie telefoniga säilitada. Veenduge, et teie telefon oleks läheduses, avatud ning Bluetooth ja WiFi oleksid sisse lülitatud.</translation> <translation id="2034346955588403444">Muu WiFi-võrgu lisamine</translation> <translation id="203574396658008164">Luba lukustuskuval märkmete tegemine</translation> <translation id="2037445849770872822">Selle Google'i konto jaoks on seadistatud järelevalve. Kui soovite veel vanemliku järelevalve funktsioone seadistada, valige käsk Jätka. @@ -3747,6 +3750,7 @@ <translation id="461661862154729886">Energiaallikas</translation> <translation id="4617001782309103936">Liiga lühike</translation> <translation id="4617270414136722281">Laienduse valikud</translation> +<translation id="4617880081511131945">Ei saa ühendust luua</translation> <translation id="4619564267100705184">Kinnitage, et see olete teie</translation> <translation id="4619615317237390068">Muudest seadmetest pärinevad vahelehed</translation> <translation id="4620809267248568679">Selle seade jõustas laiendus.</translation> @@ -4039,6 +4043,7 @@ <translation id="4907306957610201395">Loa kategooria</translation> <translation id="4908811072292128752">Avage uus vaheleht, et kahte saiti korraga sirvida</translation> <translation id="4909038193460299775">Kuna seda kontot haldab domeen <ph name="DOMAIN" />, kustutatakse sellest seadmest teie järjehoidjad, ajalugu, paroolid ja muud seaded. Teie andmed jäävad teie Google'i kontole siiski alles ja neid saab hallata <ph name="BEGIN_LINK" />Google'i juhtpaneelil<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Teie telefoni administraator on rakenduste voogesituse keelanud.</translation> <translation id="4912643508233590958">Jõuderežiimist äratamine</translation> <translation id="4915961947098019832">Lubatud kuvada pilte</translation> <translation id="4916542008280060967">Kas lubada saidil faili <ph name="FILE_NAME" /> muuta?</translation> @@ -6867,6 +6872,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Kohandage oma ekraanikuva piire</translation> <translation id="7760004034676677601">Kas see on käivitamisel avatav leht, mida ootasite?</translation> +<translation id="7762024824096060040">Ei saa seda kontot kasutada</translation> <translation id="7762463735017901568">Teie telefoni administraator on märguannete sünkroonimise keelanud</translation> <translation id="7764225426217299476">Lisage aadress</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> asukohast <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7037,6 +7043,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> saab vaadata faili <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Lisage sõnad, mille soovite lasta õigekirjakontrollil vahele jätta</translation> +<translation id="7921347341284348270">Te ei saa sellel hallatud kontol oma telefoni märguandeid vaadata. Proovige uuesti mõne teise kontoga. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Kuva üksikasjad kolmanda osapoole küpsisefailide blokeerimise kohta inkognito režiimis</translation> <translation id="7923564237306226146">Linuxi versiooni uuendamine viidi lõpule</translation> <translation id="7924358170328001543">Viga pordi edastamisel</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 89c69d5..6dca5154 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -860,6 +860,7 @@ <translation id="1813278315230285598">Zerbitzuak</translation> <translation id="18139523105317219">EDI alderdiaren izena</translation> <translation id="1815083418640426271">Itsatsi testu arrunt gisa</translation> +<translation id="1815097521077272760">Jokoa teklatuaren bidez kontrolatzeko aukera probatzera gonbidatu zaituzte.</translation> <translation id="1815181278146012280">Eskatu nire baimena webguneren batek HID gailuak atzitu nahi dituenean</translation> <translation id="181577467034453336">Beste <ph name="NUMBER_OF_VIEWS" />…</translation> <translation id="1816036116994822943">Teklatuaren bilaketa-abiadura</translation> @@ -993,6 +994,7 @@ <translation id="1935303383381416800">Zure kokapena ikus dezakete</translation> <translation id="1936931585862840749">Zehaztu kopia kopurua (1-<ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Gailu honekin (<ph name="ARCHITECTURE_DEVICE" />) ezin da inportatu edukiontziaren <ph name="ARCHITECTURE_CONTAINER" /> arkitektura mota. Saiatu edukiontzia beste gailu batean leheneratzen edo erabili Fitxategiak aplikazioa edukiontzi-irudi honen barnean dauden fitxategiak atzitzeko.</translation> +<translation id="1938320257168860255">Arazoren bat izan da. Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetooth-a eta wifia aktibatuta dauzkala.</translation> <translation id="1938351510777341717">Kanpoko Komandoa tekla</translation> <translation id="1940546824932169984">Konektatutako gailuak</translation> <translation id="1941410638996203291">Hasiera-ordua: <ph name="TIME" /></translation> @@ -1075,6 +1077,7 @@ <translation id="2030455719695904263">Ukipen-panela</translation> <translation id="2031639749079821948">Google-ko kontuan gordeta dago pasahitza</translation> <translation id="2031914984822377766">Gehitu <ph name="LINK_BEGIN" />webguneetarako hizkuntza<ph name="LINK_END" /> lehenetsiak. Zerrendako lehen hizkuntza erabiliko da itzulpenetan.</translation> +<translation id="2033758234986231162">Ezin da mantendu gailua telefonoarekin konektatuta. Ziurtatu telefonoa hurbil eta desblokeatuta dagoela, eta Bluetooth-a eta wifia aktibatuta dauzkala.</translation> <translation id="2034346955588403444">Gehitu beste wifi-sare bat</translation> <translation id="203574396658008164">Gaitu pantaila blokeatutik oharrak idazteko aukera</translation> <translation id="2037445849770872822">Gainbegiratzea konfiguratu da Google-ko kontu honetan. Guraso-murriztapen gehiago konfiguratzeko, hautatu Egin aurrera. @@ -3740,6 +3743,7 @@ <translation id="461661862154729886">Energia-iturburua</translation> <translation id="4617001782309103936">Laburregia</translation> <translation id="4617270414136722281">Luzapenaren aukerak</translation> +<translation id="4617880081511131945">Ezin da ezarri konexioa</translation> <translation id="4619564267100705184">Egiaztatu zeu zarela</translation> <translation id="4619615317237390068">Beste gailu batzuetako fitxak</translation> <translation id="4620809267248568679">Luzapen batek betearazten du ezarpena.</translation> @@ -3775,6 +3779,7 @@ <translation id="4648491805942548247">Ez dago behar adina baimen</translation> <translation id="4650591383426000695">Deskonektatu telefonoa <ph name="DEVICE_TYPE" /> gailutik</translation> <translation id="4651484272688821107">Ezin izan da kargatu sareko osagaia demo moduko baliabideekin.</translation> +<translation id="4651921906638302153">Ezin da hasi saioa kontu honekin</translation> <translation id="4652935475563630866">Kameraren ezarpenean egindako aldaketa gauzatzeko, berrabiarazi egin behar da Parallels Desktop. Aurrera egiteko, berrabiarazi Parallels Desktop.</translation> <translation id="4653405415038586100">Errore bat gertatu da Linux konfiguratzean</translation> <translation id="465406513924180949">Sareko erosketa-saskietan utzitako produktuetara erraz itzul zaitezen ari zara ikusten saskiak. @@ -4032,6 +4037,7 @@ <translation id="4907306957610201395">Baimen-kategoria</translation> <translation id="4908811072292128752">Bi webgune aldi berean arakatzeko, ireki beste fitxa bat</translation> <translation id="4909038193460299775">Kontu hau <ph name="DOMAIN" /> domeinuak kudeatzen duenez, kendu egingo dira gailutik laster-markak, historia, pasahitzak eta bestelako ezarpenak. Hala ere, Google-ko kontuan jarraituko dute lehendik dituzun datuek, eta <ph name="BEGIN_LINK" />Google-ren Panela<ph name="END_LINK" /> erabil dezakezu haiek kudeatzeko.</translation> +<translation id="4912265719039610598">Telefonoaren administratzaileak aplikazioak zuzenean exekutatzeko aukera desgaitu du.</translation> <translation id="4912643508233590958">Jarduerarik gabeko egoeratik ateratzea</translation> <translation id="4915961947098019832">Irudiak erakuts ditzakete</translation> <translation id="4916542008280060967"><ph name="FILE_NAME" /> editatzeko baimena eman nahi diozu webguneari?</translation> @@ -5427,6 +5433,7 @@ <translation id="6327785803543103246">Web-proxyaren hautemate automatikoa</translation> <translation id="6331818708794917058">Webguneek MIDI gailuetara konektatzea eska dezakete</translation> <translation id="6333064448949140209">Google-ra bidaliko da fitxategia, hura araztu ahal izateko</translation> +<translation id="6333170995003625229">Ezin izan da egiaztatu helbide elektronikoa edo pasahitza. Hasi saioa berriro.</translation> <translation id="6335920438823100346">Linux abiaraztearren, datuen babeskopiak egiteko eta Chromebook honen jatorrizko ezarpenak berrezartzeko eskatzen du <ph name="MANAGER" /> domeinuak.</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> domeinuak ADB arazketa desgaitu du. Ondorioz, <ph name="DEVICE_TYPE" /> gailua berrezarri egingo da 24 orduren buruan. Egin gorde nahi dituzun fitxategien babeskopiak.</translation> <translation id="6338981933082930623">Webgune guztiek mota guztietako iragarkiak erakuts diezazkizukete</translation> @@ -5835,6 +5842,7 @@ <translation id="6735304988756581115">Erakutsi cookieak eta webguneko beste datu batzuk…</translation> <translation id="6736243959894955139">Helbidea</translation> <translation id="6737663862851963468">Kendu Kerberos-eko zerbitzu-eskaera bat</translation> +<translation id="6738430949033571771">Kontua egiaztatzen…</translation> <translation id="6739923123728562974">Erakutsi mahaigaineko lasterbidea</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> pausatu da</translation> <translation id="6741063444351041466">Arakatze segurua desaktibatu du <ph name="BEGIN_LINK" />administratzaileak<ph name="END_LINK" /></translation> @@ -6857,6 +6865,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Doitu ikuspegiaren mugak</translation> <translation id="7760004034676677601">Hau al da espero zenuen abioko orria?</translation> +<translation id="7762024824096060040">Ezin da erabili kontua</translation> <translation id="7762463735017901568">Telefonoaren administratzaileak jakinarazpenak sinkronizatzeko aukera desgaitu du</translation> <translation id="7764225426217299476">Gehitu helbidea</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> (domeinua: <ph name="DOWNLOAD_DOMAIN" />)</translation> @@ -7026,6 +7035,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> webguneak <ph name="FILENAME" /> ikus dezake</translation> <translation id="7920482456679570420">Gehitu zer hitz nahi duzun ortografia-zuzentzaileak saltatzea</translation> +<translation id="7921347341284348270">Ezin dituzu kontu kudeatu honetan ikusi telefonoan jasotzen dituzun jakinarazpenak. Saiatu berriro beste kontu bat erabilita. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Erakutsi ezkutuko moduan hirugarrenen cookieak blokeatzeari buruzko xehetasunak</translation> <translation id="7923564237306226146">Bertsio-berritu da Linux</translation> <translation id="7924358170328001543">Errore bat gertatu da ataka desbideratzean</translation> @@ -7650,6 +7660,8 @@ <translation id="8546306075665861288">Irudien cachea</translation> <translation id="8546930481464505581">Pertsonalizatu ukipen-barra</translation> <translation id="8547013269961688403">Gaitu pantaila osoko lupa</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="MANAGER" /> domeinuak kudeatzen du <ph name="USER_EMAIL" />. Ezin duzu gehitu helbide elektroniko hori kontu gehigarri gisa.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" /> erabiltzeko, amaitu saioa <ph name="DEVICE_TYPE" /> gailuan. Gero, saioa hasteko pantailaren behealdean, hautatu Gehitu pertsona bat.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">Goiko errenkadako teklen portaera aldatzeko, eduki sakatuta Bilaketa tekla</translation> <translation id="8549316893834449916">Chromebook-en saioa hasteko Google-ko kontua erabiliko duzu; hots, Gmail, Drive, YouTube eta zerbitzu gehiagotan erabiltzen duzun kontu bera.</translation> <translation id="8551388862522347954">Lizentziak</translation> @@ -8077,7 +8089,7 @@ <translation id="89720367119469899">Ihes-tekla</translation> <translation id="8972513834460200407">Galdetu sarearen administratzaileari suebakia Google-ren zerbitzariaren deskargak blokeatzen ari den.</translation> <translation id="8973557916016709913">Kendu zooma</translation> -<translation id="8973596347849323817">Doitu gailua zure beharretara. Ezarpenak atalean alda ditzakezu Erabilerraztasun-eginbideak.</translation> +<translation id="8973596347849323817">Doitu gailua zure beharretara. Ezarpenak atalean alda ditzakezu erabilerraztasun-eginbideak.</translation> <translation id="897414447285476047">Helmugako fitxategia ez dago osorik konexio-arazo bat izan delako.</translation> <translation id="897525204902889653">Berrogeialdi-zerbitzua</translation> <translation id="8975396729541388937">Harpidetza kentzeko, sakatu horretarako esteka jasotzen dituzun mezu elektronikoetan.</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 7154152..f14e368 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -3793,6 +3793,7 @@ <translation id="4648491805942548247">مجوزها کافی نیستند</translation> <translation id="4650591383426000695">اتصال تلفنتان را از <ph name="DEVICE_TYPE" /> قطع کنید</translation> <translation id="4651484272688821107">بااستفاده از منابع حالت نمایشی، مؤلفه آنلاین بار نشد.</translation> +<translation id="4651921906638302153">نمیتوانید با این حساب به سیستم وارد شوید</translation> <translation id="4652935475563630866">برای اعمال تغییر ایجادشده در تنظیم دوربین، باید Parallels Desktop را راهاندازی مجدد کنید. برای ادامه، Parallels Desktop را راهاندازی مجدد کنید.</translation> <translation id="4653405415038586100">خطا در پیکربندی Linux</translation> <translation id="465406513924180949">درحال دیدن سبدهای خرید هستید تا بهکمک آنها بتوانید خیلی راحت به محصولاتی که در سبدهای خریدتان در سراسر وب دارید برگردید. @@ -5449,6 +5450,7 @@ <translation id="6327785803543103246">کشف خودکار پراکسی وب</translation> <translation id="6331818708794917058">سایتها میتوانند اتصال به دستگاههای MIDI را درخواست کنند</translation> <translation id="6333064448949140209">فایل برای اشکالزدایی به Google ارسال خواهد شد</translation> +<translation id="6333170995003625229">نشانی ایمیل یا گذرواژهتان تأیید نشد. دوباره برای ورود به سیستم تلاش کنید.</translation> <translation id="6335920438823100346">برای راهاندازی Linux، <ph name="MANAGER" /> از شما میخواهد از دادههایتان پشتیبان بگیرید و این Chromebook را به تنظیمات کارخانه بازنشانی کنید.</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> اشکالزدایی «پل اشکالزدایی Android» (ADB) را غیرفعال کرده است. با این کار، <ph name="DEVICE_TYPE" /> ظرف ۲۴ ساعت بازنشانی خواهد شد. از فایلهایی که مایلید نگه دارید پشتیبانگیری کنید.</translation> <translation id="6338981933082930623">همه سایتها میتوانند هرگونه آگهی را نمایش دهند</translation> @@ -5859,6 +5861,7 @@ <translation id="6735304988756581115">نمایش کوکیها و دیگر دادههای سایت...</translation> <translation id="6736243959894955139">آدرس</translation> <translation id="6737663862851963468">حذف کردن بلیت Kerberos</translation> +<translation id="6738430949033571771">درحال تأیید حساب…</translation> <translation id="6739923123728562974">نمایش میانبر میز کار</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> موقتاً متوقف شد</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />سرپرستتان<ph name="END_LINK" /> «مرور ایمن» را خاموش کرده است</translation> @@ -7677,6 +7680,8 @@ <translation id="8546306075665861288">حافظهٔ پنهان تصویر</translation> <translation id="8546930481464505581">سفارشی کردن «نوار لمسی»</translation> <translation id="8547013269961688403">فعال کردن ذرهبین تمامصفحه</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> توسط <ph name="MANAGER" /> مدیریت میشود. نمیتوانید این ایمیل را بهعنوان حساب اضافی اضافه کنید.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />برای استفاده از <ph name="USER_EMAIL" />، ابتدا از سیستم <ph name="DEVICE_TYPE" /> خارج شوید. سپس در پایین صفحه ورود به سیستم، «افزودن شخص» را انتخاب کنید.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">برای جابهجایی بین رفتار کلیدهای ردیف بالا، کلید جستجو را نگهدارید</translation> <translation id="8549316893834449916">برای ورود به سیستم در Chromebook از «حساب Google» استفاده خواهید کرد – همان حسابی که برای Gmail، Drive، YouTube، و غیره از آن استفاده میکنید.</translation> <translation id="8551388862522347954">مجوزها</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 04ba68c..52097d3 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -870,6 +870,7 @@ <translation id="1813278315230285598">Palvelut</translation> <translation id="18139523105317219">EDI-osapuolen nimi</translation> <translation id="1815083418640426271">Liitä tekstinä</translation> +<translation id="1815097521077272760">Sinut on kutsuttu kokeilemaan pelin näppäimistöohjausta.</translation> <translation id="1815181278146012280">Kysy aina, kun sivusto pyytää HID-laitteen käyttölupaa</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> lisää…</translation> <translation id="1816036116994822943">Näppäimistöskannauksen nopeus</translation> @@ -1004,6 +1005,7 @@ <translation id="1935303383381416800">Sijainnin tarkastelu sallittu</translation> <translation id="1936931585862840749">Valitse tulostettavien kappaleiden määrä lisäämällä numero (1–<ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Säilön arkkitehtuurityyppiä <ph name="ARCHITECTURE_CONTAINER" /> ei voi tuoda tällä laitteella, joka on <ph name="ARCHITECTURE_DEVICE" />. Voit yrittää palauttaa säilön eri laitteelle tai voit käyttää säilön sisällä olevia tiedostoja avaamalla Files-sovelluksen.</translation> +<translation id="1938320257168860255">Jokin meni vikaan. Varmista, että puhelimesi on lähellä, sen lukitus on avattuna ja Bluetooth‑ ja Wi-Fi‑yhteydet ovat päällä.</translation> <translation id="1938351510777341717">Ulkoinen Komento-näppäin</translation> <translation id="1940546824932169984">Yhdistetyt laitteet</translation> <translation id="1941410638996203291">Aloitusaika: <ph name="TIME" /></translation> @@ -1086,6 +1088,7 @@ <translation id="2030455719695904263">Ohjauslevy</translation> <translation id="2031639749079821948">Salasanasi on tallennettu Google-tilillesi</translation> <translation id="2031914984822377766">Lisää <ph name="LINK_BEGIN" />sivustojen ensisijaiset kielet<ph name="LINK_END" />. Käännöksiin käytetään listan ensimmäistä kieltä.</translation> +<translation id="2033758234986231162">Menetimme yhteyden puhelimeesi. Varmista, että puhelimesi on lähellä, sen lukitus on avattuna ja Bluetooth‑ ja Wi-Fi‑yhteydet ovat päällä.</translation> <translation id="2034346955588403444">Lisää muu Wi-Fi-verkko</translation> <translation id="203574396658008164">Salli muistiinpanojen tekeminen lukitusnäytöllä</translation> <translation id="2037445849770872822">Tälle Google-tilille on määritetty valvonta. Jos haluat määrittää lisää lapsilukkoja, valitse Jatka. @@ -3753,6 +3756,7 @@ <translation id="461661862154729886">Energianlähde</translation> <translation id="4617001782309103936">Liian lyhyt</translation> <translation id="4617270414136722281">Laajennusasetukset</translation> +<translation id="4617880081511131945">Yhteyttä ei voi muodostaa</translation> <translation id="4619564267100705184">Todenna henkilöllisyytesi</translation> <translation id="4619615317237390068">Välilehdet muista laitteista</translation> <translation id="4620809267248568679">Laajennus on ottanut käyttöön tämän asetuksen.</translation> @@ -4045,6 +4049,7 @@ <translation id="4907306957610201395">Käyttöoikeusluokka</translation> <translation id="4908811072292128752">Avaa uusi välilehti, niin voit selailla kahdella sivulla yhtä aikaa.</translation> <translation id="4909038193460299775">Koska <ph name="DOMAIN" /> hallinnoi tätä tiliä, kirjanmerkkisi, historiasi, salasanasi ja muut asetuksesi tyhjennetään tältä laitteelta. Tietosi pysyvät kuitenkin Google-tililläsi ja niitä voidaan hallinnoida <ph name="BEGIN_LINK" />Google Hallintapaneelissa<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Puhelimen järjestelmänvalvoja on estänyt sovellusstriimauksen.</translation> <translation id="4912643508233590958">Käyttämätön-tilasta palautumiset</translation> <translation id="4915961947098019832">Kuvien näyttäminen sallittu</translation> <translation id="4916542008280060967">Saako sivusto muokata tiedostoa <ph name="FILE_NAME" />?</translation> @@ -6873,6 +6878,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Säädä näytön rajoja</translation> <translation id="7760004034676677601">Onko tämä haluamasi saapumissivu?</translation> +<translation id="7762024824096060040">Tiliä ei voi käyttää</translation> <translation id="7762463735017901568">Puhelimen järjestelmänvalvoja on estänyt ilmoitusten synkronoinnin</translation> <translation id="7764225426217299476">Lisää osoite</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> verkkotunnuksesta <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7042,6 +7048,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> saa nähdä tämän: <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Lisää sanoja, jotka oikeinkirjoituksen tarkistuksen tulee ohittaa</translation> +<translation id="7921347341284348270">Et voi katsoa puhelimesi ilmoituksia hallinnoidulla tilillä. Yritä uudelleen eri tilillä. <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Näytä tietoa kolmansien osapuolten evästeiden estämisestä incognito-tilassa</translation> <translation id="7923564237306226146">Linux-päivitys valmis</translation> <translation id="7924358170328001543">Virhe porttiohjauksessa</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 2c5e226..71cb421 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -3797,6 +3797,7 @@ <translation id="4648491805942548247">Hindi sapat na mga pagpapahintulot</translation> <translation id="4650591383426000695">Idiskonekta ang iyong telepono sa <ph name="DEVICE_TYPE" /></translation> <translation id="4651484272688821107">Hindi ma-load ang online na bahagi gamit ang mga resource ng demo mode.</translation> +<translation id="4651921906638302153">Hindi makapag-sign in gamit ang account na ito</translation> <translation id="4652935475563630866">Hinihingi ng pagbabago sa setting ng camera na ilunsad ulit ang Parallels Desktop. Ilunsad ulit ang Parallels Desktop para magpatuloy.</translation> <translation id="4653405415038586100">Error sa pag-configure ng Linux</translation> <translation id="465406513924180949">Nakikita mo ang mga cart na makakatulong para madali mong mabalikan ang mga item na iniwan mo sa mga shopping cart sa buong web. @@ -5453,6 +5454,7 @@ <translation id="6327785803543103246">Web proxy autodiscovery</translation> <translation id="6331818708794917058">Puwedeng hilingin ng mga site na kumonekta sa mga MIDI device</translation> <translation id="6333064448949140209">Ipapadala ang file sa Google para sa pagde-debug</translation> +<translation id="6333170995003625229">Hindi ma-verify ang iyong email address o password. Subukang mag-sign in ulit.</translation> <translation id="6335920438823100346">Para simulan ang Linux, hihilingin sa iyo ng <ph name="MANAGER" /> na i-back up ang iyong data at i-reset ang Chromebook na ito sa mga factory setting.</translation> <translation id="6336038146639916978">Na-disable ng <ph name="MANAGER" /> ang pag-debug ng ADB. Ire-reset nito ang iyong <ph name="DEVICE_TYPE" /> pagkalipas ng 24 na oras. I-back up ang anumang file na gusto mong panatilihin.</translation> <translation id="6338981933082930623">Puwedeng magpakita sa iyo ng anumang ad ang lahat ng site</translation> @@ -5863,6 +5865,7 @@ <translation id="6735304988756581115">Magpakita ng cookies at iba pang data ng site...</translation> <translation id="6736243959894955139">Address</translation> <translation id="6737663862851963468">Alisin ang ticket ng Kerberos</translation> +<translation id="6738430949033571771">Vine-verify ang account...</translation> <translation id="6739923123728562974">Ipakita ang desktop shortcut</translation> <translation id="6740234557573873150">Na-pause ang <ph name="FILE_NAME" /></translation> <translation id="6741063444351041466">Na-off ng <ph name="BEGIN_LINK" />iyong administrator<ph name="END_LINK" /> ang Ligtas na Pag-browse</translation> @@ -7683,6 +7686,8 @@ <translation id="8546306075665861288">Cache ng Larawan</translation> <translation id="8546930481464505581">I-customize ang Touch Bar</translation> <translation id="8547013269961688403">I-enable ang fullscreen magnifier</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" />Ang <ph name="USER_EMAIL" /> ay pinapamahalaan ng <ph name="MANAGER" />. Hindi mo maidaragdag ang email na ito bilang karagdagang account.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Para magamit ang <ph name="USER_EMAIL" />, mag-sign out sa iyong <ph name="DEVICE_TYPE" />. Sa ibaba ng screen sa pag-log in, piliin ang Magdagdag ng Tao.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">Pindutin nang matagal ang Key sa paghahanap upang palitan ang gawi ng mga key sa itaas na row</translation> <translation id="8549316893834449916">Gagamitin mo ang iyong Google Account para mag-sign in sa Chromebook mo – ang parehong account na ginagamit mo para sa Gmail, Drive, YouTube, at higit pa.</translation> <translation id="8551388862522347954">Mga Lisensya</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 821c39d..1fd15f2 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -861,6 +861,7 @@ <translation id="1813278315230285598">Services</translation> <translation id="18139523105317219">Nom de partie EDI</translation> <translation id="1815083418640426271">Coller en tant que texte brut</translation> +<translation id="1815097521077272760">Vous avez été invité à essayer les commandes clavier pour ce jeu.</translation> <translation id="1815181278146012280">Demander une autorisation lorsqu'un site veut accéder à des appareils HID</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> autres…</translation> <translation id="1816036116994822943">Vitesse de numérisation du clavier</translation> @@ -994,6 +995,7 @@ <translation id="1935303383381416800">Autorisés à consulter votre position</translation> <translation id="1936931585862840749">Utilisez un nombre pour indiquer le nombre de copies à imprimer (1 à <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Impossible d'importer le type d'architecture de conteneur <ph name="ARCHITECTURE_CONTAINER" /> avec cet appareil, qui utilise <ph name="ARCHITECTURE_DEVICE" />. Vous pouvez essayer de restaurer ce conteneur sur un autre appareil ou bien essayer d'accéder aux fichiers qu'il contient à l'aide de l'application Fichiers.</translation> +<translation id="1938320257168860255">Un problème est survenu. Assurez-vous que votre téléphone est à proximité et déverrouillé, et que le Bluetooth et le Wi-Fi sont activés.</translation> <translation id="1938351510777341717">Commande externe</translation> <translation id="1940546824932169984">Appareils connectés</translation> <translation id="1941410638996203291">Heure de début : <ph name="TIME" /></translation> @@ -1076,6 +1078,7 @@ <translation id="2030455719695904263">Pavé tactile</translation> <translation id="2031639749079821948">Votre mot de passe est enregistré dans votre compte Google</translation> <translation id="2031914984822377766">Ajoutez vos <ph name="LINK_BEGIN" />langues de site Web favorites<ph name="LINK_END" />. La langue dans la partie supérieure de la liste sera utilisée pour effectuer les traductions.</translation> +<translation id="2033758234986231162">Impossible de maintenir une connexion avec votre téléphone. Assurez-vous que votre téléphone est à proximité et déverrouillé, et que le Bluetooth et le Wi-Fi sont activés.</translation> <translation id="2034346955588403444">Ajouter un autre réseau Wi-Fi</translation> <translation id="203574396658008164">Activer la prise de notes à partir de l'écran de verrouillage</translation> <translation id="2037445849770872822">La supervision est configurée pour ce compte Google. Si vous souhaitez configurer davantage de contrôles parentaux, sélectionnez Continuer. @@ -3743,6 +3746,7 @@ <translation id="461661862154729886">Source d'alimentation</translation> <translation id="4617001782309103936">Trop court</translation> <translation id="4617270414136722281">Options de l'extension</translation> +<translation id="4617880081511131945">Impossible d'établir la connexion</translation> <translation id="4619564267100705184">Confirmer que c'est bien vous</translation> <translation id="4619615317237390068">Onglets ouverts sur d'autres appareils</translation> <translation id="4620809267248568679">Une extension impose la valeur attribuée à ce paramètre.</translation> @@ -4035,6 +4039,7 @@ <translation id="4907306957610201395">Catégorie d'autorisation</translation> <translation id="4908811072292128752">Ouvrez un nouvel onglet pour naviguer sur deux sites en même temps</translation> <translation id="4909038193460299775">Comme ce compte est géré par <ph name="DOMAIN" />, vos favoris, votre historique, vos mots de passe et autres paramètres seront supprimés de cet appareil. Cependant, vos données resteront stockées dans votre compte Google et peuvent être gérées sur <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">La diffusion d'application est désactivée par l'administrateur de votre téléphone.</translation> <translation id="4912643508233590958">Sorties de veille</translation> <translation id="4915961947098019832">Autorisés à afficher des images</translation> <translation id="4916542008280060967">Autoriser le site à modifier <ph name="FILE_NAME" />?</translation> @@ -6865,6 +6870,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ajustez les limites de votre affichage</translation> <translation id="7760004034676677601">Est-ce bien la page de démarrage à laquelle vous vous attendiez?</translation> +<translation id="7762024824096060040">Impossible d'utiliser ce compte</translation> <translation id="7762463735017901568">La synchronisation des notifications est désactivée par l'administrateur de votre téléphone</translation> <translation id="7764225426217299476">Ajouter une adresse</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> de <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7035,6 +7041,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> peut consulter <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Ajoutez les termes que le correcteur orthographique doit ignorer</translation> +<translation id="7921347341284348270">Vous ne pouvez pas afficher les notifications de votre téléphone sur ce compte géré. Réessayez avec un autre compte. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Afficher les détails sur le blocage des témoins tiers en navigation privée</translation> <translation id="7923564237306226146">Mise à niveau Linux terminée</translation> <translation id="7924358170328001543">Une erreur s'est produite lors du transfert du port</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 17621d03..179d576 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -861,6 +861,7 @@ <translation id="1813278315230285598">Services</translation> <translation id="18139523105317219">Nom de partie EDI</translation> <translation id="1815083418640426271">Coller en tant que texte brut</translation> +<translation id="1815097521077272760">Vous avez été invité à tester les commandes au clavier pour ce jeu.</translation> <translation id="1815181278146012280">Me demander lorsqu'un site souhaite accéder aux périphériques HID</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> autres…</translation> <translation id="1816036116994822943">Vitesse de recherche pour le clavier</translation> @@ -994,6 +995,7 @@ <translation id="1935303383381416800">Autorisé à connaître votre position</translation> <translation id="1936931585862840749">Indiquez le nombre de copies à imprimer (1 à <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Impossible d'importer le type d'architecture de conteneur <ph name="ARCHITECTURE_CONTAINER" /> avec l'appareil <ph name="ARCHITECTURE_DEVICE" />. Vous pouvez essayer de restaurer ce conteneur dans un autre appareil ou accéder aux fichiers inclus dans l'image de ce conteneur en les ouvrant dans l'application Fichiers.</translation> +<translation id="1938320257168860255">Un problème est survenu. Vérifiez que votre téléphone est déverrouillé et à proximité, et que le Bluetooth et le Wi-Fi sont activés.</translation> <translation id="1938351510777341717">Commande externe</translation> <translation id="1940546824932169984">Appareils connectés</translation> <translation id="1941410638996203291">Heure de début : <ph name="TIME" /></translation> @@ -1076,6 +1078,7 @@ <translation id="2030455719695904263">Pavé tactile</translation> <translation id="2031639749079821948">Votre mot de passe est enregistré dans votre compte Google</translation> <translation id="2031914984822377766">Ajoutez vos <ph name="LINK_BEGIN" />langues favorites pour les sites Web<ph name="LINK_END" />. La première langue de la liste sera utilisée pour les traductions.</translation> +<translation id="2033758234986231162">Impossible de maintenir la connexion avec votre téléphone. Vérifiez que votre téléphone est déverrouillé et à proximité, et que le Bluetooth et le Wi-Fi sont activés.</translation> <translation id="2034346955588403444">Ajouter un réseau Wi-Fi</translation> <translation id="203574396658008164">Activer la prise de notes depuis l'écran de verrouillage</translation> <translation id="2037445849770872822">La supervision est configurée pour ce compte Google. Pour configurer des paramètres de contrôle parental supplémentaires, sélectionnez "Continuer". @@ -3742,6 +3745,7 @@ <translation id="461661862154729886">Source d'énergie</translation> <translation id="4617001782309103936">Trop court</translation> <translation id="4617270414136722281">Options d'extension</translation> +<translation id="4617880081511131945">Impossible d'établir la connexion</translation> <translation id="4619564267100705184">Confirmer votre identité</translation> <translation id="4619615317237390068">Onglets d'autres appareils</translation> <translation id="4620809267248568679">Ce paramètre est appliqué par une extension.</translation> @@ -4034,6 +4038,7 @@ <translation id="4907306957610201395">Catégorie d'autorisation</translation> <translation id="4908811072292128752">Ouvrez un nouvel onglet pour naviguer sur deux sites Web en même temps</translation> <translation id="4909038193460299775">Étant donné que ce compte est géré par <ph name="DOMAIN" />, vos favoris, votre historique, vos mots de passe et les autres paramètres sont effacés de cet appareil. Cependant, vos données restent stockées dans votre compte Google et peuvent être gérées dans le <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Le streaming d'appli est désactivé par l'administrateur de votre téléphone.</translation> <translation id="4912643508233590958">Sorties de veille</translation> <translation id="4915961947098019832">Autorisé à afficher des images</translation> <translation id="4916542008280060967">Autoriser le site à modifier le fichier <ph name="FILE_NAME" /> ?</translation> @@ -6865,6 +6870,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Adaptez les dimensions de l'écran</translation> <translation id="7760004034676677601">Est-ce la page de démarrage que vous attendiez ?</translation> +<translation id="7762024824096060040">Impossible d'utiliser ce compte</translation> <translation id="7762463735017901568">La synchronisation des notifications est désactivée par l'administrateur de votre téléphone</translation> <translation id="7764225426217299476">Ajouter une adresse</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> du domaine <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7035,6 +7041,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> peut accéder à <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Ajoutez les termes que le correcteur orthographique doit ignorer</translation> +<translation id="7921347341284348270">Vous ne pouvez pas afficher les notifications de votre téléphone sur ce compte géré. Réessayez avec un autre compte. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Afficher les détails sur le blocage des cookies tiers en navigation privée</translation> <translation id="7923564237306226146">Mise à niveau Linux terminée</translation> <translation id="7924358170328001543">Erreur lors du transfert du port.</translation> @@ -7160,7 +7167,7 @@ <translation id="8037357227543935929">Demander (par défaut)</translation> <translation id="803771048473350947">Fichier</translation> <translation id="8041089156583427627">Envoyer</translation> -<translation id="8041267120753677077">Caster les applis de votre téléphone</translation> +<translation id="8041267120753677077">Diffuser en streaming les applis de votre téléphone</translation> <translation id="8042142357103597104">Opacité du texte</translation> <translation id="8042331986490021244">Vos mots de passe sont chiffrés sur votre appareil avant d'être enregistrés dans le Gestionnaire de mots de passe Google</translation> <translation id="8044262338717486897">L'application <ph name="LINUX_APP_NAME" /> ne répond pas.</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index e693085..b0f026d0 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -859,6 +859,7 @@ <translation id="1813278315230285598">Servizos</translation> <translation id="18139523105317219">Nome da parte EDI</translation> <translation id="1815083418640426271">Pegar como texto sen formato</translation> +<translation id="1815097521077272760">Convidáronte a probar o control co teclado neste xogo.</translation> <translation id="1815181278146012280">Preguntar cando un sitio queira acceder aos dispositivos de interface humana</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> máis...</translation> <translation id="1816036116994822943">Velocidade de busca do teclado</translation> @@ -992,6 +993,7 @@ <translation id="1935303383381416800">Sitios que poden ver a túa localización</translation> <translation id="1936931585862840749">Utiliza un número para indicar cantas copias se deben imprimir (de 1 a <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Non se pode importar a arquitectura do contedor de tipo <ph name="ARCHITECTURE_CONTAINER" /> con este dispositivo, que é <ph name="ARCHITECTURE_DEVICE" />. Podes tentar restaurar este contedor nun dispositivo diferente ou podes acceder aos ficheiros incluídos na imaxe deste contedor abrindo a aplicación Ficheiros.</translation> +<translation id="1938320257168860255">Produciuse un erro. Asegúrate de ter o teléfono preto, desbloqueado e co Bluetooth e a wifi activados.</translation> <translation id="1938351510777341717">Comando externo</translation> <translation id="1940546824932169984">Dispositivos conectados</translation> <translation id="1941410638996203291">Hora de inicio: <ph name="TIME" /></translation> @@ -1074,6 +1076,7 @@ <translation id="2030455719695904263">Panel táctil</translation> <translation id="2031639749079821948">O contrasinal está gardado na túa Conta de Google</translation> <translation id="2031914984822377766">Engade os teus <ph name="LINK_BEGIN" />idiomas preferidos para os sitios web<ph name="LINK_END" />. O primeiro da lista será o que se utilice para as traducións.</translation> +<translation id="2033758234986231162">Non se puido manter unha conexión co teléfono. Asegúrate de ter o teléfono preto, desbloqueado e co Bluetooth e a wifi activados.</translation> <translation id="2034346955588403444">Engadir outra rede wifi</translation> <translation id="203574396658008164">Activar a toma de notas desde a pantalla de bloqueo</translation> <translation id="2037445849770872822">Configurouse a supervisión para esta Conta de Google. Se queres configurar máis controis parentais, selecciona Continuar. @@ -3739,6 +3742,7 @@ <translation id="461661862154729886">Fonte de alimentación</translation> <translation id="4617001782309103936">PIN demasiado curto</translation> <translation id="4617270414136722281">Opcións de extensión</translation> +<translation id="4617880081511131945">Non se puido establecer conexión</translation> <translation id="4619564267100705184">Verificar a túa identidade</translation> <translation id="4619615317237390068">Pestanas doutros dispositivos</translation> <translation id="4620809267248568679">Unha extensión aplica esta configuración.</translation> @@ -4031,6 +4035,7 @@ <translation id="4907306957610201395">Categoría de permisos</translation> <translation id="4908811072292128752">Abre unha nova pestana para explorar dous sitios á vez</translation> <translation id="4909038193460299775">Debido a que esta conta está xestionada por <ph name="DOMAIN" />, borraranse os favoritos, o historial, os contrasinais e outras configuracións deste dispositivo. Non obstante, os teus datos permanecerán almacenados na túa conta de Google e poden xestionarse a través do <ph name="BEGIN_LINK" />Panel de control de Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">O administrador do teléfono desactivou a emisión de aplicacións.</translation> <translation id="4912643508233590958">Activacións desde o modo inactivo</translation> <translation id="4915961947098019832">Sitios que poden mostrar imaxes</translation> <translation id="4916542008280060967">Queres permitir que o sitio edite <ph name="FILE_NAME" />?</translation> @@ -6856,6 +6861,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Axusta os límites da pantalla</translation> <translation id="7760004034676677601">Esta é a páxina de inicio que esperabas?</translation> +<translation id="7762024824096060040">Non se pode usar esta conta</translation> <translation id="7762463735017901568">O administrador do teu teléfono desactivou a sincronización das notificacións</translation> <translation id="7764225426217299476">Engadir enderezo</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> de <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7025,6 +7031,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> pode ver <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Engade as palabras que queiras que omita o corrector ortográfico</translation> +<translation id="7921347341284348270">Non podes ver as notificacións do móbil nesta conta xestionada. Téntao de novo con outra conta. <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Mostrar detalles sobre o bloqueo de cookies de terceiros no modo de incógnito</translation> <translation id="7923564237306226146">Completouse a actualización de Linux</translation> <translation id="7924358170328001543">Produciuse un erro co encamiñamento do porto</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 3c9e43a..35ea3eb9 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -3778,6 +3778,7 @@ <translation id="4648491805942548247">અપર્યાપ્ત પરવાનગીઓ</translation> <translation id="4650591383426000695">તમારા ફોનને તમારા <ph name="DEVICE_TYPE" />થી ડિસ્કનેક્ટ કરો</translation> <translation id="4651484272688821107">ડેમો મોડ સંસાધનો ધરાવતું ઑનલાઇન ઘટક લોડ કરી શકાયું નહીં.</translation> +<translation id="4651921906638302153">આ એકાઉન્ટ વડે સાઇન ઇન કરી શકાતું નથી</translation> <translation id="4652935475563630866">કૅમેરાના સેટિંગમાં ફેરફાર કરવા માટે, Parallelsનું ડેસ્કટૉપ ફરીથી લૉન્ચ કરવાની આવશ્યકતા રહેશે. આગળ વધવા માટે, Parallelsનું ડેસ્કટૉપ ફરીથી લૉન્ચ કરો.</translation> <translation id="4653405415038586100">Linuxની ગોઠવણી કરવામાં ભૂલ આવી</translation> <translation id="465406513924180949">તમે એ કાર્ટ જોઈ રહ્યાં છો કે જે સમગ્ર વેબ પર શૉપિંગ કાર્ટમાં તમે ઉમેરેલી આઇટમ પર સરળતાથી પાછા ફરવામાં તમને સહાય કરે છે. @@ -5436,6 +5437,7 @@ <translation id="6327785803543103246">વેબ પ્રૉક્સીની ઑટોમૅટિક ખોજ</translation> <translation id="6331818708794917058">સાઇટ MIDI ડિવાઇસ સાથે કનેક્ટ કરવાનું પૂછી શકે છે</translation> <translation id="6333064448949140209">ડીબગિંગ માટે ફાઇલ Google ને મોકલવામાં આવશે</translation> +<translation id="6333170995003625229">તમારું ઇમેઇલ ઍડ્રેસ કે પાસવર્ડ ચકાસી શકાયો નથી. ફરીથી સાઇન ઇન કરવાનો પ્રયાસ કરો.</translation> <translation id="6335920438823100346">Linux શરૂ કરવા, <ph name="MANAGER" /> માટે જરૂરી છે કે તમે તમારા ડેટાનું બૅકઅપ લો અને આ Chromebookને ફેક્ટરી સેટિંગ પર રીસેટ કરો.</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> દ્વારા ADB ડિબગીંગ બંધ કરાયું છે. આમ કરવાથી 24 કલાકમાં તમારું <ph name="DEVICE_TYPE" /> રીસેટ થશે. તમે રાખવા માગતા હો તેવી કોઈપણ ફાઇલોનું બૅકઅપ લો.</translation> <translation id="6338981933082930623">બધી સાઇટ તમને બધા પ્રકારની જાહેરાતો બતાવી શકે છે</translation> @@ -5846,6 +5848,7 @@ <translation id="6735304988756581115">કૂકીઝ અને અન્ય સાઇટનો ડેટા બતાવો...</translation> <translation id="6736243959894955139">સરનામું</translation> <translation id="6737663862851963468">Kerberos ટિકિટ કાઢી નાખો</translation> +<translation id="6738430949033571771">એકાઉન્ટની ચકાસણી કરી રહ્યાં છીએ...</translation> <translation id="6739923123728562974">ડેસ્કટૉપ શૉર્ટકટ બતાવો</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> થોભાવી</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />તમારા વ્યવસ્થાપક<ph name="END_LINK" /> દ્વારા Safe Browsing બંધ કરવામાં આવ્યું છે</translation> @@ -7659,6 +7662,8 @@ <translation id="8546306075665861288">ફોટો કૅશ મેમરી</translation> <translation id="8546930481464505581">ટચ બારને કસ્ટમાઇઝ કરો</translation> <translation id="8547013269961688403">પૂર્ણસ્ક્રીન મેગ્નિફાયર ચાલુ કરો</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="MANAGER" /> દ્વારા <ph name="USER_EMAIL" />ને મેનેજ કરવામાં આવે છે. તમે વધારાના એકાઉન્ટ તરીકે આ ઇમેઇલ ઍડ્રેસ ઉમેરી શકતા નથી.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" />નો ઉપયોગ કરવા માટે, પહેલા તમારા <ph name="DEVICE_TYPE" />માંથી સાઇન આઉટ કરો. પછી લૉગ ઇન સ્ક્રીનની સૌથી નીચે, વ્યક્તિ ઉમેરો પસંદ કરો.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">ટોચની-પંક્તિ કીની વર્તણૂંક બદલવા માટે Search કી દબાવી રાખો</translation> <translation id="8549316893834449916">તમારા Chromebookમાં સાઇન ઇન કરવા માટે તમે તમારા Google એકાઉન્ટનો ઉપયોગ કરી શકો છો – Gmail, Drive, YouTube અને બીજા ઘણા માટે તમે ઉપયોગમાં લેતા એકાઉન્ટ વડે જ.</translation> <translation id="8551388862522347954">લાઇસેંસીસ</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 65e94d23..02cf623ae 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -862,6 +862,7 @@ <translation id="1813278315230285598">Usluge</translation> <translation id="18139523105317219">Naziv EDI strane</translation> <translation id="1815083418640426271">Zalijepi kao običan tekst</translation> +<translation id="1815097521077272760">Pozvani ste da isprobate komandu tipkovnice za ovu igru.</translation> <translation id="1815181278146012280">Kada web-lokacija želi pristupiti HID uređajima, prikaži upit</translation> <translation id="181577467034453336">Još <ph name="NUMBER_OF_VIEWS" />...</translation> <translation id="1816036116994822943">Brzina traženja tipkovnice</translation> @@ -995,6 +996,7 @@ <translation id="1935303383381416800">Dopušten je pregled vaše lokacije</translation> <translation id="1936931585862840749">Kako biste odredili broj primjeraka za ispis, navedite broj (od 1 do <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Nije moguće uvesti vrstu arhitekture spremnika <ph name="ARCHITECTURE_CONTAINER" /> na ovom uređaju jer je njegova arhitektura <ph name="ARCHITECTURE_DEVICE" />. Pokušajte vratiti spremnik na nekom drugom uređaju ili pristupite datotekama u spremniku pomoću aplikacije Datoteke.</translation> +<translation id="1938320257168860255">Nešto nije u redu. Provjerite je li telefon u blizini, je li otključan i jesu li Bluetooth i Wi-Fi uključeni.</translation> <translation id="1938351510777341717">Vanjska naredba</translation> <translation id="1940546824932169984">Povezani uređaji</translation> <translation id="1941410638996203291">Vrijeme početka <ph name="TIME" /></translation> @@ -1077,6 +1079,7 @@ <translation id="2030455719695904263">Dodirna površina</translation> <translation id="2031639749079821948">Zaporka je spremljena na vaš Google račun</translation> <translation id="2031914984822377766">Dodajte željene <ph name="LINK_BEGIN" />jezike web-lokacije<ph name="LINK_END" />. Za prijevode će se upotrebljavati prvi jezik na popisu.</translation> +<translation id="2033758234986231162">Održavanje veze s vašim telefonom nije uspjelo. Provjerite je li telefon u blizini, je li otključan i jesu li Bluetooth i Wi-Fi uključeni.</translation> <translation id="2034346955588403444">Dodavanje druge Wi-Fi mreže</translation> <translation id="203574396658008164">Omogući izradu bilježaka na zaključanom zaslonu</translation> <translation id="2037445849770872822">Postavljen je nadzor za ovaj Google račun. Da biste postavili više opcija roditeljskog nadzora, odaberite Nastavi. @@ -3744,6 +3747,7 @@ <translation id="461661862154729886">Izvor energije</translation> <translation id="4617001782309103936">Prekratko</translation> <translation id="4617270414136722281">Opcije proširenja</translation> +<translation id="4617880081511131945">Uspostavljanje veze nije uspjelo</translation> <translation id="4619564267100705184">Potvrđivanje identiteta</translation> <translation id="4619615317237390068">Kartice s drugih uređaja</translation> <translation id="4620809267248568679">Ovom postavkom upravlja proširenje.</translation> @@ -4036,6 +4040,7 @@ <translation id="4907306957610201395">Kategorija dopuštenja</translation> <translation id="4908811072292128752">Otvorite novu karticu za istodobni pregled dvije stranice</translation> <translation id="4909038193460299775">Budući da ovim računom upravlja <ph name="DOMAIN" />, vaše oznake, povijest, zaporke i druge postavke izbrisat će se s ovog uređaja. No vaši podaci ostat će pohranjeni na vašem Google računu i možete upravljati njima na <ph name="BEGIN_LINK" />Google nadzornoj ploči<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Administrator vašeg telefona nije omogućio stream aplikacije.</translation> <translation id="4912643508233590958">Buđenja iz stanja mirovanja</translation> <translation id="4915961947098019832">Dopušteno je prikazivanje slika</translation> <translation id="4916542008280060967">Dopustiti web-lokaciji da uredi <ph name="FILE_NAME" />?</translation> @@ -6865,6 +6870,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Prilagodite granice zaslona</translation> <translation id="7760004034676677601">Je li to početna stranica koju ste očekivali?</translation> +<translation id="7762024824096060040">Upotreba računa nije moguća</translation> <translation id="7762463735017901568">Administrator vašeg telefona onemogućuje sinkronizaciju obavijesti</translation> <translation id="7764225426217299476">Dodaj adresu</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> s <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7034,6 +7040,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> može pregledavati datoteku <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Dodajte riječi koje želite preskočiti u provjeri pravopisa</translation> +<translation id="7921347341284348270">Na ovom upravljanom računu ne možete pregledati obavijesti telefona Pokušajte ponovo s drugim računom. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Prikaži pojedinosti o blokiranju kolačića trećih strana u anonimnom načinu</translation> <translation id="7923564237306226146">Dovršena je nadogradnja Linuxa</translation> <translation id="7924358170328001543">Pogreška prilikom prosljeđivanja priključka</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index e0a385e..ee3b04c 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -862,6 +862,7 @@ <translation id="1813278315230285598">Services</translation> <translation id="18139523105317219">EDI կողմի անունը</translation> <translation id="1815083418640426271">Տեղադրել որպես պարզ տեքստ</translation> +<translation id="1815097521077272760">Դուք հրավիրված եք փորձելու կառավարել այս խաղը ստեղնաշարի միջոցով։</translation> <translation id="1815181278146012280">Հարցնել, երբ որևէ կայք ուզում է օգտագործել HID սարքեր</translation> <translation id="181577467034453336">Եվս <ph name="NUMBER_OF_VIEWS" />...</translation> <translation id="1816036116994822943">Ստեղնաշարի սկանավորման արագությունը</translation> @@ -995,6 +996,7 @@ <translation id="1935303383381416800">Թույլատրվում է տեսնել ձեր տեղադրությունը</translation> <translation id="1936931585862840749">Թվերով նշեք՝ քանի օրինակ է անհրաժեշտ տպել (1-ից <ph name="MAX_COPIES" />)։</translation> <translation id="1937774647013465102">Կոնտեյների կառուցվածքի <ph name="ARCHITECTURE_CONTAINER" /> տեսակը չի կարող ներմուծվել այս սարք, քանի որ այն <ph name="ARCHITECTURE_DEVICE" /> է: Կարող եք փորձել վերականգնել այս կոնտեյները մեկ այլ սարքում կամ բացել կոնտեյների պատկերը «Ֆայլեր» հավելվածում և օգտվել ֆայլերից:</translation> +<translation id="1938320257168860255">Սխալ առաջացավ։ Համոզվեք, որ ձեր հեռախոսը մոտակայքում է, ապակողպված է, և որ Bluetooth-ն ու Wi-Fi-ը միացված են։</translation> <translation id="1938351510777341717">Արտաքին Command ստեղն</translation> <translation id="1940546824932169984">Միացված սարքեր</translation> <translation id="1941410638996203291">Սկզբի ժամը` <ph name="TIME" /></translation> @@ -1077,6 +1079,7 @@ <translation id="2030455719695904263">Հպահարթակ</translation> <translation id="2031639749079821948">Ձեր գաղտնաբառը պահվել է ձեր Google հաշվում</translation> <translation id="2031914984822377766">Ավելացրեք <ph name="LINK_BEGIN" />կայքերի ձեր նախընտրած լեզուները<ph name="LINK_END" />։ Թարգմանությունների համար կօգտագործվի ցանկի սկզբում գտնվող լեզուն։</translation> +<translation id="2033758234986231162">Հնարավոր չէ կապ պահպանել ձեր հեռախոսի հետ։ Համոզվեք, որ ձեր հեռախոսը մոտակայքում է, ապակողպված է, և որ Bluetooth-ն ու Wi-Fi-ը միացված են։</translation> <translation id="2034346955588403444">Ավելացնել այլ Wi-Fi ցանց</translation> <translation id="203574396658008164">Միացնել կողպէկրանից նշումների ստեղծման գործառույթը</translation> <translation id="2037445849770872822">Այս Google հաշվի համար կարգավորված է ծնողական վերահսկողություն: Ավելի շատ պարամետրեր կարգավորելու համար ընտրեք «Շարունակել»: @@ -3741,6 +3744,7 @@ <translation id="461661862154729886">Էներգիայի աղբյուր</translation> <translation id="4617001782309103936">Չափազանց կարճ է</translation> <translation id="4617270414136722281">Ընդլայնումների ընտրանքներ</translation> +<translation id="4617880081511131945">Հնարավոր չէ կապ հաստատել</translation> <translation id="4619564267100705184">Հաստատեք ձեր ինքնությունը</translation> <translation id="4619615317237390068">Ներդիրներ այլ սարքերից</translation> <translation id="4620809267248568679">Այս կարգավորումը պարտադրված է ընդլայնման կողմից:</translation> @@ -3776,6 +3780,7 @@ <translation id="4648491805942548247">Թույլտվությունները բավարար չեն</translation> <translation id="4650591383426000695">Անջատեք ձեր հեռախոսը <ph name="DEVICE_TYPE" /> սարքից</translation> <translation id="4651484272688821107">Չհաջողվեց առցանց բաղադրիչը բեռնել դեմո ռեժիմի ռեսուրսներով։</translation> +<translation id="4651921906638302153">Չհաջողվեց մտնել այս հաշիվ</translation> <translation id="4652935475563630866">Վերագործարկեք Parallels Desktop-ը, որպեսզի տեսախցիկի կարգավորումը փոխվի, և դուք կարողանաք շարունակել աշխատանքը։</translation> <translation id="4653405415038586100">Չհաջողվեց կարգավորել Լինուքսը</translation> <translation id="465406513924180949">Այս զամբյուղները կօգնեն ձեզ համացանցում արագ անցնել գնումների զամբյուղներ, որտեղ ապրանքներ եք թողել։ @@ -4033,6 +4038,7 @@ <translation id="4907306957610201395">Թույլտվության կատեգորիա</translation> <translation id="4908811072292128752">Բացեք նոր ներդիր՝ միաժամանակ երկու կայքում աշխատելու համար</translation> <translation id="4909038193460299775">Քանի որ այս հաշիվը կառավարվում է <ph name="DOMAIN" /> տիրույթի կողմից, ձեր էջանիշները, այցելությունների պատմությունը, գաղտնաբառերը և մյուս կարգավորումները կջնջվեն այս սարքից։ Այդուհանդերձ, ձեր առկա տվյալները կպահվեն Google հաշվում, և դրանք կարող եք կառավարել <ph name="BEGIN_LINK" />Google Dashboard-ում<ph name="END_LINK" />:</translation> +<translation id="4912265719039610598">Հեռախոսի ադմինիստրատորն անջատել է հավելվածների հեռարձակումը։</translation> <translation id="4912643508233590958">Անցումներ ակտիվ ռեժիմ</translation> <translation id="4915961947098019832">Թույլատրվում է ցուցադրել պատկերներ</translation> <translation id="4916542008280060967">Թույլատրե՞լ կայքին փոփոխել <ph name="FILE_NAME" /> ֆայլը</translation> @@ -5430,6 +5436,7 @@ <translation id="6327785803543103246">Պրոքսի սերվերի ինքնահայտնաբերում</translation> <translation id="6331818708794917058">Կայքերը կարող են MIDI սարքերին միանալու թույլտվություն խնդրել</translation> <translation id="6333064448949140209">Վրիպազերծման համար ֆայլը կուղարկվի Google-ին</translation> +<translation id="6333170995003625229">Չհաջողվեց հաստատել ձեր էլ․ հասցեն կամ գաղտնաբառը։ Նորից մտեք հաշիվ։</translation> <translation id="6335920438823100346">Լինուքսը գործարկելու համար (կանոնի աղբյուրը՝ <ph name="MANAGER" />) անհրաժեշտ է, որ պահուստավորեք ձեր տվյալներն ու վերակայեք այս Chromebook-ի գործարանային կարգավորումները։</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> կայքն անջատել է ADB վրիպազերծումը։ 24 ժամ հետո ձեր <ph name="DEVICE_TYPE" /> սարքը կվերակայվի։ Պահուստավորեք ֆայլերը, որոնք ուզում եք պահել։</translation> <translation id="6338981933082930623">Բոլոր կայքերը կարող են գովազդ ցուցադրել</translation> @@ -5840,6 +5847,7 @@ <translation id="6735304988756581115">Ցույց տալ քուքիները և կայքի այլ տվյալները…</translation> <translation id="6736243959894955139">Հասցե</translation> <translation id="6737663862851963468">Հեռացնել Kerberos տոմսը</translation> +<translation id="6738430949033571771">Հաշվի հաստատում…</translation> <translation id="6739923123728562974">Ցուցադրել աշխատասեղանի դյուրանցումը</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" />-ի ներբեռնումը դադարեցված է</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Ձեր ադմինիստրատորը<ph name="END_LINK" /> անջատել է անվտանգ դիտարկումը</translation> @@ -6862,6 +6870,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Կարգավորեք ձեր էկրանի սահմանագծերը</translation> <translation id="7760004034676677601">Սա՞ է ձեր ուզած մեկնարկման էջը:</translation> +<translation id="7762024824096060040">Հնարավոր չէ օգտագործել այս հաշիվը</translation> <translation id="7762463735017901568">Հեռախոսի ադմինիստրատորն անջատել է ծանուցումների համաժամացումը</translation> <translation id="7764225426217299476">Ավելացնել հասցե</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" />՝ <ph name="DOWNLOAD_DOMAIN" />-ից</translation> @@ -7030,6 +7039,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> վ</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> կայքը կարող է դիտել <ph name="FILENAME" /> ֆայլը</translation> <translation id="7920482456679570420">Ավելացրեք բառեր, որոնք անհրաժեշտ է բաց թողնել ուղղագրությունը ստուգելիս</translation> +<translation id="7921347341284348270">Դուք չեք կարող դիտել ձեր հեռախոսի ծանուցումները այս կառավարվող հաշվում։ Նորից փորձեք՝ օգտագործելով այլ հաշիվ։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Իմանալ ավելին ինկոգնիտո ռեժիմում կողմնակի կայքերի քուքիներն արգելափակելու մասին</translation> <translation id="7923564237306226146">Լինուքսի նորացումն ավարտված է</translation> <translation id="7924358170328001543">Չհաջողվեց փոխանցել միացքը</translation> @@ -7654,6 +7664,8 @@ <translation id="8546306075665861288">Պատկերների քեշ</translation> <translation id="8546930481464505581">Հարմարեցնել հպման գոտին</translation> <translation id="8547013269961688403">Միացնել լիաէկրան խոշորացույցը</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" />Այս հասցեն (<ph name="USER_EMAIL" />) կառավարվում է <ph name="MANAGER" /> տիրույթի կողմից։ Դուք չեք կարող այս էլ․ հասցեն ավելացնել որպես լրացուցիչ հաշիվ։<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Որպեսզի օգտագործեք <ph name="USER_EMAIL" /> հասցեն, նախ դուրս եկեք հաշվից <ph name="DEVICE_TYPE" /> սարքում։ Մուտքի էկրանի ներքևի մասում ընտրեք «Ավելացնել օգտատեր»։<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">Վերևի շարքի ստեղները փոխարկելու համար սեղմած պահեք որոնման ստեղնը</translation> <translation id="8549316893834449916">Chromebook մուտք կգործեք նույն Google հաշվով, որն օգտագործում եք Gmail, Drive, YouTube և այլ ծառայություններում։</translation> <translation id="8551388862522347954">Լիցենզիաներ</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 5f5ab1ba..c7299e97 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -871,6 +871,7 @@ <translation id="1813278315230285598">Layanan</translation> <translation id="18139523105317219">EDI Party Name</translation> <translation id="1815083418640426271">Tempel Sebagai Teks Biasa</translation> +<translation id="1815097521077272760">Anda telah diundang untuk mencoba kontrol keyboard untuk game ini.</translation> <translation id="1815181278146012280">Tanyakan saat situs ingin mengakses perangkat HID</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> lainnya...</translation> <translation id="1816036116994822943">Kecepatan pemindaian keyboard</translation> @@ -1005,6 +1006,7 @@ <translation id="1935303383381416800">Diizinkan melihat lokasi Anda</translation> <translation id="1936931585862840749">Gunakan angka untuk menunjukkan jumlah salinan yang akan dicetak (1 sampai <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Tidak dapat mengimpor jenis arsitektur container <ph name="ARCHITECTURE_CONTAINER" /> dengan perangkat ini yang menggunakan arsitektur <ph name="ARCHITECTURE_DEVICE" />. Anda dapat mencoba memulihkan container ini ke dalam perangkat berbeda, atau mengakses file di dalam gambar container ini dengan membukanya di aplikasi File.</translation> +<translation id="1938320257168860255">Terjadi error. Pastikan ponsel berada di dekat Anda, tidak terkunci, serta Bluetooth dan Wi-Fi aktif.</translation> <translation id="1938351510777341717">External Command</translation> <translation id="1940546824932169984">Perangkat yang terhubung</translation> <translation id="1941410638996203291">Waktu mulai <ph name="TIME" /></translation> @@ -1087,6 +1089,7 @@ <translation id="2030455719695904263">Trackpad</translation> <translation id="2031639749079821948">Sandi disimpan di Akun Google Anda</translation> <translation id="2031914984822377766">Tambahkan <ph name="LINK_BEGIN" />bahasa situs<ph name="LINK_END" /> pilihan Anda. Bahasa di bagian teratas daftar akan digunakan untuk terjemahan.</translation> +<translation id="2033758234986231162">Tidak dapat mempertahankan koneksi dengan ponsel Anda. Pastikan ponsel berada di dekat Anda, tidak terkunci, serta Bluetooth dan Wi-Fi aktif.</translation> <translation id="2034346955588403444">Tambahkan jaringan Wi-Fi lainnya</translation> <translation id="203574396658008164">Aktifkan pencatat dari layar kunci</translation> <translation id="2037445849770872822">Pengawasan disiapkan untuk Akun Google ini. Untuk menyiapkan kontrol orang tua lain, pilih Lanjutkan. @@ -3757,6 +3760,7 @@ <translation id="461661862154729886">Sumber energi</translation> <translation id="4617001782309103936">Terlalu pendek</translation> <translation id="4617270414136722281">Opsi ekstensi</translation> +<translation id="4617880081511131945">Tidak dapat menghubungkan</translation> <translation id="4619564267100705184">Verifikasi diri Anda</translation> <translation id="4619615317237390068">Tab dari perangkat lain</translation> <translation id="4620809267248568679">Setelan ini diberlakukan oleh ekstensi.</translation> @@ -3792,6 +3796,7 @@ <translation id="4648491805942548247">Izin tidak mencukupi</translation> <translation id="4650591383426000695">Memutuskan sambungan ponsel Anda dari <ph name="DEVICE_TYPE" /></translation> <translation id="4651484272688821107">Tidak dapat memuat komponen online dengan resource mode demo.</translation> +<translation id="4651921906638302153">Tidak dapat login dengan akun ini</translation> <translation id="4652935475563630866">Perubahan pada setelan kamera mengharuskan Parallels Desktop diluncurkan kembali. Luncurkan kembali Parallels Desktop untuk melanjutkan.</translation> <translation id="4653405415038586100">Error saat mengonfigurasi Linux</translation> <translation id="465406513924180949">Anda melihat keranjang yang membantu Anda kembali dengan mudah ke item yang Anda tinggalkan di keranjang belanja di seluruh web. @@ -4049,6 +4054,7 @@ <translation id="4907306957610201395">Kategori Izin</translation> <translation id="4908811072292128752">Buka tab baru untuk mengakses 2 situs sekaligus</translation> <translation id="4909038193460299775">Karena akun ini dikelola oleh <ph name="DOMAIN" />, bookmark, histori, sandi, dan setelan yang lain akan dihapus dari perangkat ini. Namun, data Anda akan tetap disimpan di Akun Google dan dapat dikelola di <ph name="BEGIN_LINK" />Google Dasbor<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Streaming aplikasi dinonaktifkan oleh administrator ponsel Anda.</translation> <translation id="4912643508233590958">Bangun saat Nganggur</translation> <translation id="4915961947098019832">Diizinkan menampilkan gambar</translation> <translation id="4916542008280060967">Izinkan situs mengedit <ph name="FILE_NAME" />?</translation> @@ -5447,6 +5453,7 @@ <translation id="6327785803543103246">Penemuan otomatis proksi web</translation> <translation id="6331818708794917058">Situs dapat meminta untuk terhubung ke perangkat MIDI</translation> <translation id="6333064448949140209">File akan dikirim ke Google untuk proses debug</translation> +<translation id="6333170995003625229">Alamat email atau sandi Anda tidak dapat diverifikasi. Coba login lagi.</translation> <translation id="6335920438823100346">Untuk memulai Linux, <ph name="MANAGER" /> mengharuskan Anda mencadangkan data dan mereset Chromebook ini ke setelan pabrik.</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> telah menonaktifkan proses debug ADB. Ini akan mereset <ph name="DEVICE_TYPE" /> Anda setelah 24 jam. Cadangkan file yang ingin Anda simpan.</translation> <translation id="6338981933082930623">Semua situs dapat menampilkan iklan apa pun kepada Anda</translation> @@ -5855,6 +5862,7 @@ <translation id="6735304988756581115">Tampilkan cookie dan data situs lainnya...</translation> <translation id="6736243959894955139">Alamat</translation> <translation id="6737663862851963468">Hapus tiket Kerberos</translation> +<translation id="6738430949033571771">Memverifikasi akun ...</translation> <translation id="6739923123728562974">Tampilkan pintasan desktop</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> dijeda</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Administrator Anda<ph name="END_LINK" /> telah menonaktifkan Safe Browsing</translation> @@ -6877,6 +6885,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Sesuaikan batas tampilan Anda</translation> <translation id="7760004034676677601">Apakah ini halaman mulai yang Anda harapkan?</translation> +<translation id="7762024824096060040">Tidak dapat menggunakan akun ini</translation> <translation id="7762463735017901568">Sinkronisasi notifikasi dinonaktifkan oleh administrator ponsel Anda</translation> <translation id="7764225426217299476">Tambahkan alamat</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> dari <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7047,6 +7056,7 @@ <translation id="7919210519031517829"><ph name="DURATION" />d</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> dapat melihat <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Tambahkan kata yang ejaannya tidak ingin diperiksa</translation> +<translation id="7921347341284348270">Anda tidak dapat melihat notifikasi ponsel di akun terkelola ini. Coba lagi dengan akun lain. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Tampilkan detail tentang pemblokiran cookie pihak ketiga dalam mode Samaran</translation> <translation id="7923564237306226146">Upgrade Linux selesai</translation> <translation id="7924358170328001543">Error saat meneruskan port</translation> @@ -7672,6 +7682,8 @@ <translation id="8546306075665861288">Cache gambar</translation> <translation id="8546930481464505581">Sesuaikan Touch Bar</translation> <translation id="8547013269961688403">Aktifkan kaca pembesar layar penuh</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> dikelola oleh <ph name="MANAGER" />. Anda tidak dapat menambahkan email ini sebagai akun tambahan.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Untuk menggunakan <ph name="USER_EMAIL" />, logout dari <ph name="DEVICE_TYPE" /> terlebih dahulu. Lalu, di bagian bawah layar login, pilih Tambahkan Pengguna.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">Tahan tombol Penelusuran untuk mengalihkan perilaku tombol baris atas</translation> <translation id="8549316893834449916">Anda akan menggunakan Akun Google Anda untuk login ke Chromebook. Akun tersebut sama dengan yang digunakan untuk Gmail, Drive, YouTube, dan lainnya.</translation> <translation id="8551388862522347954">Lisensi</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 85b0949..aecfd5f9 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -872,6 +872,7 @@ <translation id="1813278315230285598">Þjónusta</translation> <translation id="18139523105317219">Heiti EDI-aðila</translation> <translation id="1815083418640426271">Líma sem ósniðinn texta</translation> +<translation id="1815097521077272760">Þér hefur verið boðið að prófa lyklaborðsstýringu fyrir þennan leik.</translation> <translation id="1815181278146012280">Spyrja þegar vefsvæði vill fá aðgang að HID-tækjum</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> í viðbót...</translation> <translation id="1816036116994822943">Skönnunarhraði lyklaborðs</translation> @@ -1006,6 +1007,7 @@ <translation id="1935303383381416800">Mega sjá staðsetningu þína</translation> <translation id="1936931585862840749">Notaðu tölu til að gefa til kynna fjölda eintaka sem á að prenta (1 upp í <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Ekki er hægt að flytja inn rammaskipulagsgerð <ph name="ARCHITECTURE_CONTAINER" /> með þessu tæki, sem er <ph name="ARCHITECTURE_DEVICE" />. Þú getur prófað að endurheimta þennan ramma í öðru tæki eða opnað skrárnar í þessari rammamynd í skráaforritinu.</translation> +<translation id="1938320257168860255">Eitthvað fór úrskeiðis. Gakktu úr skugga um að síminn sé nálægt þér, ólæstur og með kveikt á Bluetooth og Wi-Fi.</translation> <translation id="1938351510777341717">Ytri skipanalykill</translation> <translation id="1940546824932169984">Tengd tæki</translation> <translation id="1941410638996203291">Upphafstími <ph name="TIME" /></translation> @@ -1088,6 +1090,7 @@ <translation id="2030455719695904263">Snertiflötur</translation> <translation id="2031639749079821948">Aðgangsorðið þitt er vistað á Google reikningnum þínum</translation> <translation id="2031914984822377766">Bættu við <ph name="LINK_BEGIN" />kjörtungumálum þínum fyrir vefsvæði<ph name="LINK_END" />. Efsta tungumál listans verður notað við þýðingar.</translation> +<translation id="2033758234986231162">Ekki er hægt að halda tengingu við símann þinn. Gakktu úr skugga um að síminn sé nálægt þér, ólæstur og með kveikt á Bluetooth og Wi-Fi.</translation> <translation id="2034346955588403444">Bæta við öðru Wi-Fi neti</translation> <translation id="203574396658008164">Virkja glósur af lásskjá</translation> <translation id="2037445849770872822">Eftirlit er sett upp fyrir þennan Google reikning. Til að setja upp fleiri barnalæsingar skaltu velja „Halda áfram“. @@ -3757,6 +3760,7 @@ <translation id="461661862154729886">Orkugjafi</translation> <translation id="4617001782309103936">Of stutt</translation> <translation id="4617270414136722281">Valkostir viðbótar</translation> +<translation id="4617880081511131945">Ekki er hægt að koma á tengingu</translation> <translation id="4619564267100705184">Staðfestu hver þú ert</translation> <translation id="4619615317237390068">Flipar frá öðrum tækjum</translation> <translation id="4620809267248568679">Viðbót notar þessa stillingu.</translation> @@ -4049,6 +4053,7 @@ <translation id="4907306957610201395">Heimildarflokkur</translation> <translation id="4908811072292128752">Opnaðu flipa til að vafra á tveimur vefsvæðum samtímis</translation> <translation id="4909038193460299775">Þar sem <ph name="DOMAIN" /> stýrir þessum reikningi verða bókamerkin þín, ferillinn, aðgangsorðin og aðrar stillingar hreinsuð af tækinu. Gögnin þín verða þó áfram vistuð á Google reikningnum þínum og hægt er að hafa umsjón með þeim á <ph name="BEGIN_LINK" />stjórnborði Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Kerfisstjóri símans hefur slökkt á forritastreymi.</translation> <translation id="4912643508233590958">Vakningar í aðgerðaleysi</translation> <translation id="4915961947098019832">Mega birta myndir</translation> <translation id="4916542008280060967">Viltu leyfa svæði að breyta <ph name="FILE_NAME" />?</translation> @@ -6879,6 +6884,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Stilltu mörk skjásins</translation> <translation id="7760004034676677601">Er þetta upphafssíðan sem þú bjóst við?</translation> +<translation id="7762024824096060040">Ekki er hægt að nota þennan reikning</translation> <translation id="7762463735017901568">Stjórnandi símans hefur slökkt á samstillingu tilkynninga.</translation> <translation id="7764225426217299476">Bæta við heimilisfangi</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> frá <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7049,6 +7055,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> sek.</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> getur skoðað <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Bættu við orðum sem þú vilt að villuleitin sleppi</translation> +<translation id="7921347341284348270">Þú getur ekki skoðað tilkynningar símans á þessum stýrða reikningi. Prófaðu aftur með öðrum reikningi. <ph name="LINK_BEGIN" />Nánar<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Sýna upplýsingar um að loka á fótspor þriðju aðila í huliðsstillingu</translation> <translation id="7923564237306226146">Uppfærslu á Linux er lokið</translation> <translation id="7924358170328001543">Villa við framsendingu gáttar</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index c2bbcc8d8..fd18e120 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -870,6 +870,7 @@ <translation id="1813278315230285598">שירותים</translation> <translation id="18139523105317219">שם צד EDI</translation> <translation id="1815083418640426271">הדבקה כטקסט רגיל</translation> +<translation id="1815097521077272760">הוזמנת לנסות את התכונה לשליטה באמצעות המקלדת במשחק הזה.</translation> <translation id="1815181278146012280">צריך לבקש ממני אישור כשאתר רוצה לגשת להתקני HID</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> נוספות...</translation> <translation id="1816036116994822943">מהירות הסריקה של המקלדת</translation> @@ -1004,6 +1005,7 @@ <translation id="1935303383381416800">מורשים לראות את המיקום</translation> <translation id="1936931585862840749">יש להזין מספר שמציין כמה עותקים יש להדפיס (1 עד <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">לא ניתן לייבא ארכיטקטורת מאגר מסוג <ph name="ARCHITECTURE_CONTAINER" /> באמצעות המכשיר הזה, כי הוא מסוג <ph name="ARCHITECTURE_DEVICE" />. אפשר לנסות לשחזר את המאגר במכשיר אחר או לפתוח את האפליקציה 'קבצים' כדי לגשת לקבצים בתוך תמונת המאגר.</translation> +<translation id="1938320257168860255">משהו השתבש. יש לוודא שהטלפון נמצא בקרבת מקום, שהוא לא נעול ושה-Bluetooth וה-Wi-Fi פועלים.</translation> <translation id="1938351510777341717">מקש Command חיצוני</translation> <translation id="1940546824932169984">מכשירים מחוברים</translation> <translation id="1941410638996203291">שעת ההתחלה <ph name="TIME" /></translation> @@ -1086,6 +1088,7 @@ <translation id="2030455719695904263">משטח מגע</translation> <translation id="2031639749079821948">הסיסמה שלך שמורה בחשבון Google</translation> <translation id="2031914984822377766">יש להוסיף את <ph name="LINK_BEGIN" />שפות האתר<ph name="LINK_END" /> המועדפות. השפה המובילה מהרשימה תשמש לתרגומים.</translation> +<translation id="2033758234986231162">החיבור לטלפון לא יציב. יש לוודא שהטלפון נמצא בקרבת מקום, שהוא לא נעול ושה-Bluetooth וה-Wi-Fi פועלים.</translation> <translation id="2034346955588403444">הוספת עוד רשת Wi-Fi</translation> <translation id="203574396658008164">הפעלת רישום הערות ממסך הנעילה</translation> <translation id="2037445849770872822">הוגדר פיקוח על חשבון Google הזה. כדי להגדיר עוד אפשרויות של בקרת הורים יש ללחוץ על 'המשך'. @@ -3757,6 +3760,7 @@ <translation id="461661862154729886">מקור חשמל</translation> <translation id="4617001782309103936">קצר מדי</translation> <translation id="4617270414136722281">אפשרויות של תוספים</translation> +<translation id="4617880081511131945">לא ניתן ליצור חיבור</translation> <translation id="4619564267100705184">אימות הזהות שלך</translation> <translation id="4619615317237390068">כרטיסיות ממכשירים אחרים</translation> <translation id="4620809267248568679">הגדרה זו נאכפת על ידי תוסף.</translation> @@ -4049,6 +4053,7 @@ <translation id="4907306957610201395">קטגוריית הרשאה</translation> <translation id="4908811072292128752">פתיחת כרטיסייה חדשה כדי לגלוש בשני אתרים בו-זמנית</translation> <translation id="4909038193460299775">החשבון הזה מנוהל על-ידי <ph name="DOMAIN" />, ולכן הסימניות, ההיסטוריה, הסיסמאות והגדרות אחרות יימחקו מהמכשיר הזה. עם זאת, הנתונים עדיין יישארו בחשבון Google שלך ואפשר לנהל אותם ב<ph name="BEGIN_LINK" />מרכז השליטה של Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">האדמין של הטלפון שלך השבית את האפשרות לסטרימינג של אפליקציות.</translation> <translation id="4912643508233590958">הוצאות לא פעילות ממצב שינה</translation> <translation id="4915961947098019832">מורשים להציג תמונות</translation> <translation id="4916542008280060967">האם לאפשר לאתר לערוך את <ph name="FILE_NAME" />?</translation> @@ -6881,6 +6886,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">התאמת הגבולות של התצוגה</translation> <translation id="7760004034676677601">האם זהו דף הפתיחה שציפית לראות?</translation> +<translation id="7762024824096060040">לא ניתן להשתמש בחשבון הזה</translation> <translation id="7762463735017901568">האדמין של הטלפון שלך השבית את סנכרון ההתראות</translation> <translation id="7764225426217299476">הוספת כתובת</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> מ-<ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7050,6 +7056,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> שנ'</translation> <translation id="7920363873148656176">ל-<ph name="ORIGIN" /> יש אפשרות להציג את <ph name="FILENAME" /></translation> <translation id="7920482456679570420">הוספת מילים שיש לדלג עליהן בבדיקות איות</translation> +<translation id="7921347341284348270">אין לך אפשרות לצפות בהתראות של הטלפון בחשבון המנוהל הזה. כדאי לנסות שוב מחשבון אחר. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation> <translation id="7922935920104868876">הצגת פרטים על חסימת קובצי cookie של צדדים שלישיים במצב פרטי</translation> <translation id="7923564237306226146">השדרוג של Linux הושלם</translation> <translation id="7924358170328001543">שגיאה בהעברת היציאה</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 1b3e0ab..32bbf45 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -860,6 +860,7 @@ <translation id="1813278315230285598">სერვისები</translation> <translation id="18139523105317219">EDI მხარის სახელი</translation> <translation id="1815083418640426271">ჩასმა ჩვეულებრივი ტექსტის სახით</translation> +<translation id="1815097521077272760">თქვენ მოწვეული ხართ ამ თამაშის კლავიატურით მართვის საცდელად.</translation> <translation id="1815181278146012280">საიტების მიერ HID მოწყობილობებზე წვდომის მოთხოვნა</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> სხვა…</translation> <translation id="1816036116994822943">კლავიატურის სკანირების სიჩქარე</translation> @@ -993,6 +994,7 @@ <translation id="1935303383381416800">თქვენი მდებარეობის ნახვა დაშვებულია</translation> <translation id="1936931585862840749">ამოსაბეჭდი ეგზემპლარების რაოდენობის მისათითებლად გამოიყენეთ რიცხვი (1-დან <ph name="MAX_COPIES" />-მდე).</translation> <translation id="1937774647013465102">კონტეინერის <ph name="ARCHITECTURE_CONTAINER" /> არქიტექტურის ტიპის იმპორტირება ვერ მოხერხდება ამ მოწყობილობით, რომელიც არის <ph name="ARCHITECTURE_DEVICE" />. შეგიძლიათ ცადოთ ამ კონტეინერის აღდგენა სხვა მოწყობილობის მეშვეობით ან იქონიოთ წვდომა კონტეინერის იმიჯში შემავალ ფაილებზე Files აპის საშუალებით.</translation> +<translation id="1938320257168860255">რაღაც შეცდომა მოხდა. დარწმუნდით, რომ ტელეფონი ახლოს გაქვთ, განბლოკილია და მასზე ჩართულია Bluetooth/Wi-Fi.</translation> <translation id="1938351510777341717">გარე ბრძანება</translation> <translation id="1940546824932169984">დაკავშირებული მოწყობილობები</translation> <translation id="1941410638996203291">დასაწყისი: <ph name="TIME" /></translation> @@ -1075,6 +1077,7 @@ <translation id="2030455719695904263">ტრეკპედი</translation> <translation id="2031639749079821948">პაროლი შენახულია თქვენს Google ანგარიშში</translation> <translation id="2031914984822377766">დაამატეთ სასურველი <ph name="LINK_BEGIN" />ენები ვებსაიტებისთვის<ph name="LINK_END" />. თარგმანისთვის გამოყენებული იქნება სიის თავში მითითებული ენა.</translation> +<translation id="2033758234986231162">თქვენს ტელეფონთან კავშირის შენარჩუნება ვერ ხერხდება. დარწმუნდით, რომ ტელეფონი ახლოს გაქვთ, განბლოკილია და მასზე ჩართულია Bluetooth/Wi-Fi.</translation> <translation id="2034346955588403444">სხვა Wi-Fi ქსელის დამატება</translation> <translation id="203574396658008164">ჩაკეტილი ეკრანიდან ჩანიშვნის ჩართვა</translation> <translation id="2037445849770872822">ზედამხედველობა ამ Google ანგარიშისთვის დაყენებულია. მშობელთა მიერ კონტროლის სხვა საშუალებების დასაყენებლად აირჩიეთ „გაგრძელება“. @@ -3741,6 +3744,7 @@ <translation id="461661862154729886">ელკვების წყარო</translation> <translation id="4617001782309103936">ძალიან მოკლეა</translation> <translation id="4617270414136722281">გაფართოებების ვარიანტები</translation> +<translation id="4617880081511131945">კავშირის დამყარება ვერ ხერხდება</translation> <translation id="4619564267100705184">ვინაობის დადასტურება</translation> <translation id="4619615317237390068">ჩანართები სხვა მოწყობილობებიდან</translation> <translation id="4620809267248568679">ეს პატარამეტრი იძულებითაა დაყენებული გაფართოების მიერ.</translation> @@ -4033,6 +4037,7 @@ <translation id="4907306957610201395">ნებართვის კატეგორია</translation> <translation id="4908811072292128752">ორი საიტის ერთდროულად დასათვალიერებლად გახსენით ახალი ჩანართი</translation> <translation id="4909038193460299775">რადგან ამ ანგარიშს მართავს <ph name="DOMAIN" />, თქვენი სანიშნეები, ისტორია, პაროლები და სხვა პარამეტრები ამ მოწყობილობიდან გასუფთავდება, თუმცა თქვენს Google ანგარიშში შენახული მონაცემები კვლავ შენარჩუნდება და მათ მართვას <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />-იდან შეძლებთ.</translation> +<translation id="4912265719039610598">აპების სტრიმინგი გათიშულია თქვენი ტელეფონის ადმინისტრატორის მიერ.</translation> <translation id="4912643508233590958">უმოქმედობისას გააქტიურება</translation> <translation id="4915961947098019832">სურათების ჩვენება დაშვებულია</translation> <translation id="4916542008280060967">გსურთ საიტისთვის <ph name="FILE_NAME" />-ის რედაქტირების დაშვება?</translation> @@ -6861,6 +6866,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">თქვენი ეკრანის საზღვრების დარეგულირება</translation> <translation id="7760004034676677601">ეს ის გაშვების გვერდია, რომელსაც მოელოდით?</translation> +<translation id="7762024824096060040">ამ ანგარიშის გამოყენება ვერ ხერხდება</translation> <translation id="7762463735017901568">შეტყობინებების სინქრონიზება გათიშულია თქვენი ტელეფონის ადმინისტრატორის მიერ</translation> <translation id="7764225426217299476">მისამართის დამატება</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> <ph name="DOWNLOAD_DOMAIN" />-დან</translation> @@ -7030,6 +7036,7 @@ <translation id="7919210519031517829"><ph name="DURATION" />წმ</translation> <translation id="7920363873148656176"><ph name="ORIGIN" />-ს შეუძლია „<ph name="FILENAME" />“-ის ნახვა</translation> <translation id="7920482456679570420">დაამატეთ სიტყვები, რომლებიც გსურთ, გამოტოვებული იყოს მართლწერის შემოწმებისას</translation> +<translation id="7921347341284348270">თქვენი ტელეფონის შეტყობინებებს ამ მართულ ანგარიშზე ვერ ნახავთ. ცადეთ ხელახლა სხვა ანგარიშის გამოყენებით. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="7922935920104868876">ინკოგნიტო რეჟიმში მესამე მხარის ქუქი-ჩანაწერების დაბლოკვასთან დაკავშირებული დეტალების ჩვენება</translation> <translation id="7923564237306226146">Linux-ის ვერსიის განახლება დასრულდა</translation> <translation id="7924358170328001543">პორტის გადამისამართება ვერ მოხერხდა</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 439e6f0cb..4f7cb41 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -857,6 +857,7 @@ <translation id="1813278315230285598">Қызметтер</translation> <translation id="18139523105317219">EDI тарабының атауы</translation> <translation id="1815083418640426271">Ашық мәтін ретінде қою</translation> +<translation id="1815097521077272760">Осы ойынды пернетақтамен басқарып көруге шақыру алдыңыз.</translation> <translation id="1815181278146012280">Сайт HID құрылғыларын пайдаланғысы келгенде, рұқсат сұралсын</translation> <translation id="181577467034453336">Тағы <ph name="NUMBER_OF_VIEWS" />...</translation> <translation id="1816036116994822943">Пернетақтаның сканерлеу жылдамдығы</translation> @@ -990,6 +991,7 @@ <translation id="1935303383381416800">Геодеректеріңізді көруге рұқсаты барлар</translation> <translation id="1936931585862840749">Басып шығарылатын көшірмелер санын көрсетіңіз (1-<ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102"><ph name="ARCHITECTURE_CONTAINER" /> контейнер архитектурасы түрін бұл құрылғымен (<ph name="ARCHITECTURE_DEVICE" />) импорттау мүмкін емес. Бұл контейнерді басқа құрылғыда қалпына келтіріп көруіңізге болады немесе файлдарға контейнер кескінін Files қолданбасынан ашу арқылы кіре аласыз.</translation> +<translation id="1938320257168860255">Бірдеңе дұрыс болмады. Телефоныңыз жақын тұрғанын, оның құлпы ашық және Bluetooth, Wi-Fi функциясы қосулы екеніне көз жеткізіңіз.</translation> <translation id="1938351510777341717">Сыртқы пәрмен</translation> <translation id="1940546824932169984">Қосылған құрылғылар</translation> <translation id="1941410638996203291">Басталу уақыты: <ph name="TIME" /></translation> @@ -1072,6 +1074,7 @@ <translation id="2030455719695904263">Сенсорлық тақта</translation> <translation id="2031639749079821948">Құпия сөзіңіз Google аккаунтыңызда сақталған.</translation> <translation id="2031914984822377766">Қалаған <ph name="LINK_BEGIN" />веб-сайт тілдерін<ph name="LINK_END" /> қосыңыз. Аударма үшін тізімде ең бірінші тұрған тіл қолданылады.</translation> +<translation id="2033758234986231162">Телефоныңызбен байланыс орнату мүмкін емес. Телефоныңыз жақын тұрғанын, оның құлпы ашық және Bluetooth, Wi-Fi функциясы қосулы екеніне көз жеткізіңіз.</translation> <translation id="2034346955588403444">Басқа Wi-Fi желісін қосу</translation> <translation id="203574396658008164">Құлып экранынан жазба жазуды қосу</translation> <translation id="2037445849770872822">Осы Google аккаунты үшін қадағалау параметрлері реттелді. Басқа да ата-ана бақылауы параметрлерін реттеу үшін "Жалғастыру" түймесін таңдаңыз. @@ -3737,6 +3740,7 @@ <translation id="461661862154729886">Қуат көзі</translation> <translation id="4617001782309103936">Тым қысқа</translation> <translation id="4617270414136722281">Кеңейтім опциялары</translation> +<translation id="4617880081511131945">Байланыс орнату мүмкін емес</translation> <translation id="4619564267100705184">Жеке басыңызды растаңыз</translation> <translation id="4619615317237390068">Басқа құрылғылардағы қойындылар</translation> <translation id="4620809267248568679">Бұл параметр кеңейтім арқылы іске қосылады.</translation> @@ -4029,6 +4033,7 @@ <translation id="4907306957610201395">Рұқсат санаты</translation> <translation id="4908811072292128752">Екі сайтты бірден шолу үшін жаңа қойындыны ашыңыз</translation> <translation id="4909038193460299775">Аккаунтыңызды <ph name="DOMAIN" /> домені басқаратындықтан, бетбелгілер, тарих және басқа параметрлер құрылғыңыздан өшіріледі. Алайда олар Google аккаунтында сол күйінде сақталады және <ph name="BEGIN_LINK" />Google бақылау тақтасынан<ph name="END_LINK" /> басқарылады.</translation> +<translation id="4912265719039610598">Телефон әкімшісі қолданбаны трансляциялауды өшірді.</translation> <translation id="4912643508233590958">Әрекетсіз режимінен іске қосу</translation> <translation id="4915961947098019832">Суреттерді көрсетуге рұқсаты барлар</translation> <translation id="4916542008280060967">Сайтқа <ph name="FILE_NAME" /> файлын өзгертуге рұқсат етілсін бе?</translation> @@ -6854,6 +6859,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Дисплей жиектерін реттеңіз</translation> <translation id="7760004034676677601">Бұл сіз күткен стартап беті ме?</translation> +<translation id="7762024824096060040">Осы аккаунтты пайдалану мүмкін емес</translation> <translation id="7762463735017901568">Хабарландыру синхрондауды телефон әкімшісі өшірген.</translation> <translation id="7764225426217299476">Мекенжай қосу</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> доменінен <ph name="DOWNLOAD_RECEIVED" /></translation> @@ -7023,6 +7029,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> с</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> <ph name="FILENAME" /> файлын көре алады.</translation> <translation id="7920482456679570420">Емлесін тексеруді қажет етпейтін сөздерді қосыңыз</translation> +<translation id="7921347341284348270">Осы басқарылатын аккаунтта телефоныңыздың хабарландыруларын көре алмайсыз. Басқа аккаунтты пайдаланып көріңіз. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Инкогнито режимінде үшінші тараптың cookie файлдарын бөгеу туралы мәліметтерді көрсету</translation> <translation id="7923564237306226146">Linux жүйесін жаңартылып болды</translation> <translation id="7924358170328001543">Портты бағыттау қатесі</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index e8a8015c..720a731 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -865,6 +865,7 @@ <translation id="1813278315230285598">ಸೇವೆಗಳು</translation> <translation id="18139523105317219">EDI ಪಾರ್ಟಿ ಹೆಸರು</translation> <translation id="1815083418640426271">ಸಾದಾ ಪಠ್ಯದಂತೆ ಅಂಟಿಸಿ</translation> +<translation id="1815097521077272760">ಈ ಗೇಮ್ಗಾಗಿ ಕೀಬೋರ್ಡ್ ನಿಯಂತ್ರಣವನ್ನು ಪ್ರಯತ್ನಿಸಲು ನಿಮ್ಮನ್ನು ಆಹ್ವಾನಿಸಲಾಗಿದೆ.</translation> <translation id="1815181278146012280">ಸೈಟ್ HID ಸಾಧನಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಬಯಸಿದಾಗ ಕೇಳಿ</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> ಇನ್ನಷ್ಟು...</translation> <translation id="1816036116994822943">ಕೀಬೋರ್ಡ್ ಸ್ಕ್ಯಾನಿಂಗ್ ವೇಗ</translation> @@ -998,6 +999,7 @@ <translation id="1935303383381416800">ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ನೋಡಲು ಈ ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="1936931585862840749">ಎಷ್ಟು ಪ್ರತಿಗಳನ್ನು ಪ್ರಿಂಟ್ ಮಾಡಬೇಕೆಂದು (1 ರಿಂದ <ph name="MAX_COPIES" />) ಸೂಚಿಸಲು ಸಂಖ್ಯೆಯನ್ನು ಬಳಸಿ.</translation> <translation id="1937774647013465102"><ph name="ARCHITECTURE_DEVICE" /> ಪ್ರಕಾರದ ಈ ಸಾಧನದ ಜೊತೆಗೆ ಕಂಟೇನರ್ ಆರ್ಕಿಟೆಕ್ಚರ್ ಪ್ರಕಾರವನ್ನು <ph name="ARCHITECTURE_CONTAINER" /> ಆಮದು ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ನೀವು ಈ ಕಂಟೇನರ್ ಅನ್ನು ಬೇರೊಂದು ಸಾಧನದಲ್ಲಿ ಮರುಸ್ಥಾಪಿಸಲು ಪ್ರಯತ್ನಿಸಬಹುದು ಅಥವಾ ಫೈಲ್ಗಳು ಆ್ಯಪ್ ಅನ್ನು ತೆರೆಯುವುದರ ಮೂಲಕ ಈ ಕಂಟೇನರ್ ಚಿತ್ರದಲ್ಲಿರುವ ಫೈಲ್ಗಳನ್ನು ನೀವು ಪ್ರವೇಶಿಸಬಹುದು.</translation> +<translation id="1938320257168860255">ಏನೋ ತಪ್ಪಾಗಿದೆ. ನಿಮ್ಮ ಫೋನ್ ಸಮೀಪದಲ್ಲಿದೆ, ಅನ್ಲಾಕ್ ಆಗಿದೆ ಮತ್ತು ಅದರಲ್ಲಿ ಬ್ಲೂಟೂತ್ ಹಾಗೂ ವೈ-ಫೈ ಆನ್ ಆಗಿದೆ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.</translation> <translation id="1938351510777341717">ಬಾಹ್ಯ ಕಮಾಂಡ್ ಕೀ</translation> <translation id="1940546824932169984">ಸಂಪರ್ಕಗೊಂಡಿರುವ ಸಾಧನಗಳು</translation> <translation id="1941410638996203291">ಪ್ರಾರಂಭ ಸಮಯ <ph name="TIME" /></translation> @@ -1080,6 +1082,7 @@ <translation id="2030455719695904263">ಟ್ರ್ಯಾಕ್ಪ್ಯಾಡ್</translation> <translation id="2031639749079821948">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಲಾಗಿದೆ</translation> <translation id="2031914984822377766">ನಿಮ್ಮ ಆದ್ಯತೆಯ <ph name="LINK_BEGIN" />ವೆಬ್ಸೈಟ್ ಭಾಷೆಗಳನ್ನು<ph name="LINK_END" /> ಸೇರಿಸಿ. ಪಟ್ಟಿಯಿಂದ ಟಾಪ್ ಭಾಷೆಯನ್ನು ಅನುವಾದಗಳಿಗಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ.</translation> +<translation id="2033758234986231162">ನಿಮ್ಮ ಫೋನ್ ಮೂಲಕ ಸಂಪರ್ಕವನ್ನು ನಿರ್ವಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಫೋನ್ ಸಮೀಪದಲ್ಲಿದೆ, ಅನ್ಲಾಕ್ ಆಗಿದೆ ಮತ್ತು ಅದರಲ್ಲಿ ಬ್ಲೂಟೂತ್ ಹಾಗೂ ವೈ-ಫೈ ಆನ್ ಆಗಿದೆ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.</translation> <translation id="2034346955588403444">ಇತರ ವೈಫೈ ನೆಟ್ವರ್ಕ್ ಸೇರಿಸಿ</translation> <translation id="203574396658008164">ಲಾಕ್ ಪರದೆಯಿಂದ ಟಿಪ್ಪಣಿ ತೆಗೆದುಕೊಳ್ಳುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="2037445849770872822">ಈ Google ಖಾತೆಗೆ ಮೇಲ್ವಿಚಾರಣೆಯನ್ನು ಸೆಟಪ್ ಮಾಡಲಾಗಿದೆ. ಇನ್ನಷ್ಟು ಪೋಷಕ ನಿಯಂತ್ರಣಗಳನ್ನು ಸೆಟಪ್ ಮಾಡಲು, ಮುಂದುವರಿಸಿ ಆಯ್ಕೆಮಾಡಿ. @@ -3749,6 +3752,7 @@ <translation id="461661862154729886">ಶಕ್ತಿಯ ಮೂಲ</translation> <translation id="4617001782309103936">ತೀರಾ ಚಿಕ್ಕದು</translation> <translation id="4617270414136722281">ವಿಸ್ತರಣೆ ಆಯ್ಕೆಗಳು</translation> +<translation id="4617880081511131945">ಸಂಪರ್ಕವನ್ನು ಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="4619564267100705184">ಇದು ನೀವೇ ಎಂಬುದನ್ನು ದೃಢೀಕರಿಸಿ</translation> <translation id="4619615317237390068">ಇತರ ಸಾಧನಗಳಿಂದ ಟ್ಯಾಬ್ಗಳು</translation> <translation id="4620809267248568679">ಈ ಸೆಟ್ಟಿಂಗ್ ವಿಸ್ತರಣೆಯಿಂದ ಜಾರಿಗೊಳಿಸಲಾಗಿದೆ.</translation> @@ -4042,6 +4046,7 @@ <translation id="4907306957610201395">ಅನುಮತಿ ವರ್ಗ</translation> <translation id="4908811072292128752">ಒಮ್ಮೆಲೆ ಎರಡೂ ಸೈಟ್ಗಳನ್ನು ಬ್ರೌಸ್ ಮಾಡಲು ಟ್ಯಾಬ್ ತೆರೆಯಿರಿ</translation> <translation id="4909038193460299775">ಈ ಖಾತೆಯನ್ನು <ph name="DOMAIN" /> ನಿರ್ವಹಿಸುತ್ತಿರುವ ಕಾರಣದಿಂದ, ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಇತಿಹಾಸ, ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಈ ಸಾಧನದಿಂದ ತೆರವುಗೊಳಿಸಲಾಗುತ್ತದೆ. ಆದರೆ, ನಿಮ್ಮ ಡೇಟಾವು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿಯೇ ಸಂಗ್ರಹಿತವಾಗಿರುತ್ತದೆ ಮತ್ತು ಅದನ್ನು <ph name="BEGIN_LINK" />Google ಡ್ಯಾಶ್ಬೋರ್ಡ್ನಲ್ಲಿ<ph name="END_LINK" /> ನಿರ್ವಹಿಸಬಹುದಾಗಿದೆ.</translation> +<translation id="4912265719039610598">ನಿಮ್ಮ ಫೋನ್ನ ನಿರ್ವಾಹಕರು ಆ್ಯಪ್ಗಳ ಸ್ಟ್ರೀಮಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ.</translation> <translation id="4912643508233590958">ತಟಸ್ಥದ ಎಚ್ಚರಿಸುವಿಕೆಗಳು</translation> <translation id="4915961947098019832">ಚಿತ್ರಗಳನ್ನು ತೋರಿಸಲು ಈ ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="4916542008280060967"><ph name="FILE_NAME" /> ಅನ್ನು ಸೈಟ್ ಎಡಿಟ್ ಮಾಡಲು ಅನುಮತಿಸುವುದೇ?</translation> @@ -6874,6 +6879,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">ನಿಮ್ಮ ಡಿಸ್ಪ್ಲೇನ ಗಡಿಗಳನ್ನು ಹೊಂದಿಸಿ</translation> <translation id="7760004034676677601">ಇದು ನೀವು ನಿರೀಕ್ಷಿಸುತ್ತಿರುವ ಆರಂಭಿಕ ಪುಟವೇ?</translation> +<translation id="7762024824096060040">ಈ ಖಾತೆಯನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="7762463735017901568">ನಿಮ್ಮ ಫೋನ್ನ ನಿರ್ವಾಹಕರು ಅಧಿಸೂಚನೆ ಸಿಂಕ್ ಮಾಡುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ</translation> <translation id="7764225426217299476">ವಿಳಾಸ ಸೇರಿಸಿ</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> ರಿಂದ <ph name="DOWNLOAD_RECEIVED" /></translation> @@ -7043,6 +7049,7 @@ <translation id="7919210519031517829"><ph name="DURATION" />ಸೆ</translation> <translation id="7920363873148656176"><ph name="ORIGIN" />, <ph name="FILENAME" /> ಅನ್ನು ವೀಕ್ಷಿಸಬಹುದು</translation> <translation id="7920482456679570420">ನೀವು ಕಾಗುಣಿತ ಪರೀಕ್ಷೆಯನ್ನು ಸ್ಕಿಪ್ ಮಾಡಲು ಬಯಸುವ ಪದಗಳನ್ನು ಸೇರಿಸಿ</translation> +<translation id="7921347341284348270">ಈ ನಿರ್ವಹಿಸಲಾದ ಖಾತೆಯಲ್ಲಿ ನಿಮ್ಮ ಫೋನ್ನ ಅಧಿಸೂಚನೆಗಳನ್ನು ವೀಕ್ಷಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಿಲ್ಲ. ಬೇರೊಂದು ಖಾತೆಯ ಮೂಲಕ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation> <translation id="7922935920104868876">ಅಜ್ಞಾತ ಮೋಡ್ನಲ್ಲಿ ಥರ್ಡ್-ಪಾರ್ಟಿ ಕುಕಿಗಳನ್ನು ನಿರ್ಬಂಧಿಸುವ ಕುರಿತು ವಿವರಗಳನ್ನು ತೋರಿಸಿ</translation> <translation id="7923564237306226146">Linux ಅಪ್ಗ್ರೇಡ್ ಪೂರ್ಣವಾಗಿದೆ</translation> <translation id="7924358170328001543">ಪೋರ್ಟ್ ಫಾರ್ವರ್ಡ್ ಮಾಡುವಾಗ ದೋಷ ಕಂಡುಬಂದಿದೆ</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index be8ed1ca..26f92898 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -869,6 +869,7 @@ <translation id="1813278315230285598">ການບໍລິການ</translation> <translation id="18139523105317219">ຊື່ຝ່າຍ EDI</translation> <translation id="1815083418640426271">ແປະເປັນຂໍ້ຄວາມທໍາມະດາ</translation> +<translation id="1815097521077272760">ທ່ານຖືກເຊີນໃຫ້ລອງໃຊ້ການຄວບຄຸມດ້ວຍແປ້ນພິມສຳລັບເກມນີ້.</translation> <translation id="1815181278146012280">ຖາມເມື່ອເວັບໄຊໃດໜຶ່ງຕ້ອງການເຂົ້າເຖິງອຸປະກອນ HID</translation> <translation id="181577467034453336">ອີກ <ph name="NUMBER_OF_VIEWS" /> ອັນ...</translation> <translation id="1816036116994822943">ຄວາມໄວການສະແກນແປ້ນພິມ</translation> @@ -1002,6 +1003,7 @@ <translation id="1935303383381416800">ໄດ້ຮັບອະນຸຍາດໃຫ້ເຫັນສະຖານທີ່ຂອງທ່ານ</translation> <translation id="1936931585862840749">ໃຊ້ຕົວເລກເພື່ອຊີ້ບອກວ່າຈະພິມອອກຈັກສະບັບ (1 ຫາ <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">ບໍ່ສາມາດນຳເຂົ້າສະຖາປັດຕະຍະກຳກ່ອງບັນຈຸປະເພດ <ph name="ARCHITECTURE_CONTAINER" /> ດ້ວຍອຸປະກອນນີ້ໄດ້ ເຊິ່ງແມ່ນ <ph name="ARCHITECTURE_DEVICE" />. ທ່ານສາມາດລອງກູ້ຄືນກ່ອງບັນຈຸນີ້ໄປໃສ່ອຸປະກອນອື່ນໄດ້ ຫຼື ທ່ານສາມາດເຂົ້າເຖິງໄຟລ໌ຢູ່ພາຍໃນຮູບກ່ອງບັນຈຸນີ້ໄດ້ໂດຍການເປີດຢູ່ໃນແອັບ Files.</translation> +<translation id="1938320257168860255">ມີບາງຢ່າງຜິດພາດເກີດຂຶ້ນ. ກະລຸນາກວດສອບວ່າໂທລະສັບຂອງທ່ານຢູ່ໃກ້ໆ, ປົດລັອກແລ້ວ ແລະ ເປີດ Bluetooth ກັບ Wi-Fi ໄວ້ຢູ່.</translation> <translation id="1938351510777341717">ຄຳສັ່ງພາຍນອກ</translation> <translation id="1940546824932169984">ອຸປະກອນທີ່ເຊື່ອມຕໍ່ແລ້ວ</translation> <translation id="1941410638996203291">ເວລາເລີ່ມຕົ້ນ <ph name="TIME" /></translation> @@ -1084,6 +1086,7 @@ <translation id="2030455719695904263">ແທຣັກແຜດ</translation> <translation id="2031639749079821948">ລະຫັດຜ່ານຂອງທ່ານຈະຖືກບັນທຶກໄວ້ໃນບັນຊີ Google ຂອງທ່ານ</translation> <translation id="2031914984822377766">ເພີ່ມ <ph name="LINK_BEGIN" />ພາສາເວັບໄຊ<ph name="LINK_END" /> ທີ່ທ່ານຕ້ອງການ. ພາສາທີ່ຢູ່ເທິງສຸດຂອງລາຍຊື່ຈະຖືກໃຊ້ສຳລັບການແປພາສາ.</translation> +<translation id="2033758234986231162">ບໍ່ສາມາດຮັກສາການເຊື່ອມຕໍ່ກັບໂທລະສັບຂອງທ່ານໄວ້ໄດ້. ກະລຸນາກວດສອບວ່າໂທລະສັບຂອງທ່ານຢູ່ໃກ້ໆ, ປົດລັອກແລ້ວ ແລະ ເປີດ Bluetooth ກັບ Wi-Fi ໄວ້ຢູ່.</translation> <translation id="2034346955588403444">ເພີ່ມເຄືອຂ່າຍ WiFi ອື່ນ</translation> <translation id="203574396658008164">ເປີດນຳໃຊ້ການຈົດບັນທຶກຈາກໜ້າຈໍລັອກ</translation> <translation id="2037445849770872822">ມີການຕັ້ງຄ່າການຄວບຄຸມເບິ່ງແຍງສຳລັບບັນຊີ Google ນີ້. ເພື່ອຕັ້ງຄ່າການຄວບຄຸມຂອງພໍ່ແມ່ເພີ່ມເຕີມ, ກະລຸນາເລືອກ ສືບຕໍ່. @@ -3756,6 +3759,7 @@ <translation id="461661862154729886">ແຫຼ່ງພະລັງງານ</translation> <translation id="4617001782309103936">ສັ້ນເກີນໄປ</translation> <translation id="4617270414136722281">ຕົວເລືອກສ່ວນຂະຫຍາຍ</translation> +<translation id="4617880081511131945">ບໍ່ສາມາດເລີ່ມການເຊື່ອມຕໍ່ໄດ້</translation> <translation id="4619564267100705184">ຢັ້ງຢືນວ່າແມ່ນທ່ານແທ້</translation> <translation id="4619615317237390068">ແຖບຈາກອຸປະກອນອື່ນ</translation> <translation id="4620809267248568679">ການຕັ້ງຄ່ານີ້ຖືກບັງຄັບໂດຍສ່ວນຂະຫຍາຍ.</translation> @@ -4048,6 +4052,7 @@ <translation id="4907306957610201395">ປະເພດການອະນຸຍາດ</translation> <translation id="4908811072292128752">ເປີດແຖບໃໝ່ເພື່ອເລື່ອນເບິ່ງສອງເວັບໄຊພ້ອມກັນ</translation> <translation id="4909038193460299775">ເພາະວ່າບັນຊີນີ້ຖືກຈັດການໂດຍ <ph name="DOMAIN" />, ບຸກມາກ, ປະຫວັດ, ລະຫັດຜ່ານ ແລະ ການຕັ້ງຄ່າອື່ນຂອງທ່ານຈະຖືກລຶບລ້າງອອກຈາກອຸປະກອນນີ້. ແນວໃດກໍຕາມ, ຂໍ້ມູນຂອງທ່ານຈະຍັງຄົງຮັກສາໄວ້ຢູ່ໃນບັນຊີ Google ຂອງທ່ານ ແລະ ສາມາດຖືກຈັດການໄດ້ໃນ <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">ການສະຕຣີມແອັບຖືກປິດການນຳໃຊ້ໄວ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງໂທລະສັບທ່ານ.</translation> <translation id="4912643508233590958">ການປຸກຢູ່ຊື່ໆ</translation> <translation id="4915961947098019832">ໄດ້ຮັບອະນຸຍາດໃຫ້ສະແດງຮູບ</translation> <translation id="4916542008280060967">ອະນຸຍາດໃຫ້ເວັບໄຊແກ້ໄຂ <ph name="FILE_NAME" /> ບໍ?</translation> @@ -6875,6 +6880,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">ປັບຂອບເຂດຂອງຈໍສະແດງຜົນຂອງທ່ານ</translation> <translation id="7760004034676677601">ນີ້ແມ່ນໜ້າເລີ່ມຕົ້ນທີ່ທ່ານຄາດໄວ້ບໍ?</translation> +<translation id="7762024824096060040">ບໍ່ສາມາດໃຊ້ບັນຊີນີ້ໄດ້</translation> <translation id="7762463735017901568">ການຊິ້ງຂໍ້ມູນການແຈ້ງເຕືອນຖືກປິດການນຳໃຊ້ໄວ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງໂທລະສັບທ່ານ</translation> <translation id="7764225426217299476">ເພີ່ມທີ່ຢູ່</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> ຈາກ <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7044,6 +7050,7 @@ <translation id="7919210519031517829"><ph name="DURATION" />ວິ</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> ສາມາດເບິ່ງ <ph name="FILENAME" /> ໄດ້</translation> <translation id="7920482456679570420">ເພີ່ມຄຳທີ່ທ່ານຕ້ອງການໃຫ້ການກວດຄຳຜິດຂ້າມ</translation> +<translation id="7921347341284348270">ທ່ານບໍ່ສາມາດເບິ່ງການແຈ້ງເຕືອນໂທລະສັບຂອງທ່ານຢູ່ບັນຊີທີ່ມີການຈັດການນີ້ໄດ້. ໃຫ້ລອງໃຊ້ບັນຊີອື່ນແທນ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="7922935920104868876">ສະແດງລາຍລະອຽດກ່ຽວກັບການບລັອກຄຸກກີ້ພາກສ່ວນທີສາມໃນໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ</translation> <translation id="7923564237306226146">ອັບເກຣດ Linux ສຳເລັດແລ້ວ</translation> <translation id="7924358170328001543">ເກີດຜິດພາດໃນການສົ່ງຕໍ່ຜອດ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 1597fa4..259616c 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -874,6 +874,7 @@ <translation id="1813278315230285598">Paslaugos</translation> <translation id="18139523105317219">EDI šalies pavadinimas</translation> <translation id="1815083418640426271">Įklijuoti kaip grynąjį tekstą</translation> +<translation id="1815097521077272760">Buvote pakviesti išbandyti šio žaidimo valdymą klaviatūra.</translation> <translation id="1815181278146012280">Klausti, kai svetainė nori pasiekti HID įrenginius</translation> <translation id="181577467034453336">Dar <ph name="NUMBER_OF_VIEWS" />...</translation> <translation id="1816036116994822943">Klaviatūros nuskaitymo sparta</translation> @@ -1008,6 +1009,7 @@ <translation id="1935303383381416800">Leidžiama peržiūrėti vietovę</translation> <translation id="1936931585862840749">Skaičiumi nurodykite, kiek kopijų spausdinti (nuo 1 iki <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Nepavyko importuoti sudėtinio rodinio architektūros tipo „<ph name="ARCHITECTURE_CONTAINER" />“ naudojant šį įrenginį, kuris yra „<ph name="ARCHITECTURE_DEVICE" />“. Galite pabandyti atkurti šį sudėtinį rodinį naudodami kitą įrenginį arba galite pasiekti failus šiame sudėtinio rodinio vaizde atidarę Failų programą.</translation> +<translation id="1938320257168860255">Kažkas ne taip. Įsitikinkite, kad telefonas yra netoliese, atrakintas ir įjungtas „Bluetooth“ bei „Wi-Fi“.</translation> <translation id="1938351510777341717">Išorinė komanda</translation> <translation id="1940546824932169984">Prijungti įrenginiai</translation> <translation id="1941410638996203291">Pradžios laikas <ph name="TIME" /></translation> @@ -1090,6 +1092,7 @@ <translation id="2030455719695904263">Jutiklinė dalis</translation> <translation id="2031639749079821948">Slaptažodis išsaugotas „Google“ paskyroje</translation> <translation id="2031914984822377766">Pridėkite pageidaujamas <ph name="LINK_BEGIN" />svetainės kalbas<ph name="LINK_END" />. Bus verčiama į sąrašo viršuje nurodytą kalbą.</translation> +<translation id="2033758234986231162">Nepavyko išlaikyti ryšio su telefonu. Įsitikinkite, kad telefonas yra netoliese, atrakintas ir įjungtas „Bluetooth“ bei „Wi-Fi“.</translation> <translation id="2034346955588403444">Pridėti kitą „WiFi“ tinklą</translation> <translation id="203574396658008164">Įgalinti užrašų rašymą užrakinimo ekrane</translation> <translation id="2037445849770872822">Šioje „Google“ paskyroje nustatyta priežiūra. Jei norite nustatyti daugiau tėvų kontrolės nustatymų, pasirinkite „Tęsti“. @@ -3760,6 +3763,7 @@ <translation id="461661862154729886">Energijos šaltinis</translation> <translation id="4617001782309103936">Per trumpas</translation> <translation id="4617270414136722281">Plėtinių parinktys</translation> +<translation id="4617880081511131945">Nepavyko užmegzti ryšio</translation> <translation id="4619564267100705184">Patvirtinti tapatybę</translation> <translation id="4619615317237390068">Skirtukai iš kitų įrenginių</translation> <translation id="4620809267248568679">Šį nustatymą paleidžia plėtinys.</translation> @@ -4052,6 +4056,7 @@ <translation id="4907306957610201395">Leidimų kategorija</translation> <translation id="4908811072292128752">Jei norite naršyti iš karto dvi svetaines, atidarykite naują skirtuką</translation> <translation id="4909038193460299775">Kadangi ši paskyra tvarkoma <ph name="DOMAIN" />, jūsų žymės, istorija, slaptažodžiai ir kiti nustatymai bus išvalyti iš šio įrenginio. Tačiau duomenys bus toliau saugomi „Google“ paskyroje ir juos bus galima tvarkyti <ph name="BEGIN_LINK" />„Google“ informacijos suvestinėje<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Programų srautinį perdavimą išjungė telefono administratorius.</translation> <translation id="4912643508233590958">Neaktyvumo režimo nutraukimo veiksmai</translation> <translation id="4915961947098019832">Leidžiama rodyti vaizdus</translation> <translation id="4916542008280060967">Leisti svetainei redaguoti failą „<ph name="FILE_NAME" />“?</translation> @@ -6887,6 +6892,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Sureguliuokite ekrano ribas</translation> <translation id="7760004034676677601">Ar tai paleidimo puslapis, kurį tikėjotės išvysti?</translation> +<translation id="7762024824096060040">Negalima naudoti šios paskyros</translation> <translation id="7762463735017901568">Telefono administratorius išjungė pranešimų sinchronizavimą</translation> <translation id="7764225426217299476">Pridėti adresą</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> iš <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7057,6 +7063,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> sek.</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> gali peržiūrėti „<ph name="FILENAME" />“</translation> <translation id="7920482456679570420">Pridėkite žodžių, kuriuos rašybos tikrinimo funkcija turėtų praleisti</translation> +<translation id="7921347341284348270">Negalite peržiūrėti telefono pranešimų šioje valdomoje paskyroje. Bandykite dar kartą naudodami kitą paskyrą. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Rodyti išsamią informaciją apie trečiųjų šalių slapukų blokavimą inkognito režimu</translation> <translation id="7923564237306226146">„Linux“ naujovinimas baigtas</translation> <translation id="7924358170328001543">Prievado persiuntimo klaida</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 17c42ad4..9bb7407 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -89,6 +89,9 @@ <translation id="1082214733466244292">നിങ്ങളുടെ അഡ്മിൻ ഈ ഉപകരണത്തിന്റെ ചില ഫംഗ്ഷനുകൾ ബ്ലോക്ക് ചെയ്തു</translation> <translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> നിങ്ങളുടെ Chrome ക്രമീകരണം അവരുടെ യഥാർത്ഥ ഡിഫോൾട്ടുകളിലേക്ക് പുനഃസ്ഥാപിക്കാൻ താൽപ്പര്യപ്പെടുന്നു. ഇത് നിങ്ങളുടെ ഹോം പേജ്, പുതിയ ടാബ് പേജ്, തിരയൽ എഞ്ചിൻ എന്നിവ റീസെറ്റ് ചെയ്യും ഒപ്പം വിപുലീകരണങ്ങൾ പ്രവർത്തനരഹിതമാക്കി എല്ലാ ടാബുകളും അൺപിൻ ചെയ്യും. ഇത് കുക്കികൾ, ഉള്ളടക്കം, സൈറ്റ് വിവരം എന്നിങ്ങനെയുള്ള മറ്റ് താൽക്കാലികവും കാഷെ ചെയ്തതുമായ വിവരവും മായ്ക്കും.</translation> <translation id="1084096383128641877">ഈ പാസ്വേഡ് നീക്കം ചെയ്യുന്നത് <ph name="DOMAIN" />-ലെ നിങ്ങളുടെ അക്കൗണ്ട് ഇല്ലാതാക്കില്ല. നിങ്ങളുടെ <ph name="DOMAIN_LINK" />-ലെ അക്കൗണ്ട് മറ്റുള്ളവരിൽ നിന്ന് സുരക്ഷിതമായി സൂക്ഷിക്കാൻ അതിന്റെ പാസ്വേഡ് മാറ്റുകയോ അത് ഇല്ലാതാക്കുകയോ ചെയ്യുക.</translation> +<translation id="1084288067399862432">അപഹരിക്കപ്പെട്ട പാസ്വേഡ് മാറ്റി. + +ഏത് സമയത്തും <ph name="GOOGLE_PASSWORD_MANAGER" /> എന്നതിൽ നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കുക.</translation> <translation id="1084824384139382525">ലിങ്ക് വിലാ&സം പകർത്തുക</translation> <translation id="1085064499066015002">എപ്പോഴും എല്ലാ സൈറ്റിലും</translation> <translation id="1085697365578766383">വെർച്വൽ മെഷീൻ പ്രവർത്തനം തുടങ്ങുന്നതിൽ പിശക്. വീണ്ടും ശ്രമിക്കുക.</translation> @@ -1677,6 +1680,7 @@ <translation id="2554553592469060349">തിരഞ്ഞെടുത്ത ഫയൽ വളരെ വലുതാണ് (പരമാവധി വലുപ്പം: 3mb).</translation> <translation id="2558569818338050235">നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം നിങ്ങൾ കാണുന്ന പരസ്യങ്ങളെ ബാധിക്കും</translation> <translation id="2558896001721082624">സിസ്റ്റം മെനുവിൽ ഉപയോഗസഹായി ഓപ്ഷനുകൾ എല്ലായ്പ്പോഴും കാണിക്കുക</translation> +<translation id="2559889124253841528">ഉപകരണത്തിൽ സംരക്ഷിക്കുക</translation> <translation id="2564520396658920462">AppleScript-ലൂടെ JavaScript നടപ്പിലാക്കുന്നത് ഓഫാക്കിയിരിക്കുന്നു. അത് ഓണാക്കാൻ, മെനു ബാറിൽ നിന്നും കാഴ്ച > ഡെവലപ്പർ > Apple Events-ൽ നിന്ന് JavaScript അനുവദിക്കൽ, എന്നതിലേക്ക് പോവുക. കൂടുതൽ വിവരങ്ങൾക്ക്: https://support.google.com/chrome/?p=applescript</translation> <translation id="2564653188463346023">മെച്ചപ്പെടുത്തിയ സ്പെൽ ചെക്ക്</translation> <translation id="2568774940984945469">വിവരബാര് കണ്ടെയ്നര്</translation> @@ -1687,6 +1691,7 @@ <translation id="2575247648642144396">വിപുലീകരണത്തിന് നിലവിലെ പേജിൽ പ്രവർത്തിക്കാൻ കഴിയുമ്പോൾ ഈ ഐക്കൺ ദൃശ്യമാകും. ഐക്കണിൽ ക്ലിക്ക് ചെയ്തുകൊണ്ടോ <ph name="EXTENSION_SHORTCUT" /> അമർത്തിക്കൊണ്ടോ ഈ വിപുലീകരണം ഉപയോഗിക്കുക</translation> <translation id="2575407791320728464">URL അസാധുവാണ്. ഇത് ശരിയായി ഫോർമാറ്റ് ചെയ്തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക.</translation> <translation id="2575441894380764255">അനാവശ്യമോ തെറ്റിദ്ധരിപ്പിക്കുന്നതോ ആയ പരസ്യങ്ങൾ അനുവദനീയമല്ല</translation> +<translation id="2575713839157415345">{YEARS,plural, =1{ഈ ഉപകരണം 1 വർഷം വരെ സംരക്ഷിക്കും, അടുത്ത തവണ നിങ്ങൾക്ക് ഒരു കോഡ് ഇല്ലാതെ തന്നെ കണക്റ്റ് ചെയ്യാം. ഇത് നിങ്ങളുടെ അഡ്മിൻ സജ്ജീകരിച്ചതാണ്.}other{ഈ ഉപകരണം {YEARS} വർഷം വരെ സംരക്ഷിക്കും, അടുത്ത തവണ നിങ്ങൾക്ക് ഒരു കോഡ് ഇല്ലാതെ തന്നെ കണക്റ്റ് ചെയ്യാം. ഇത് നിങ്ങളുടെ അഡ്മിൻ സജ്ജീകരിച്ചതാണ്.}}</translation> <translation id="257779572837908839">മീറ്റിംഗിനുള്ള Chromebox സജ്ജമാക്കുക</translation> <translation id="2580889980133367162">എല്ലായ്പ്പോഴും ഒന്നിലധികം ഫയലുകൾ ഡൗൺലോഡ് ചെയ്യാൻ <ph name="HOST" />-നെ അനുവദിക്കുക</translation> <translation id="258095186877893873">ദൈർഘ്യമേറിയ</translation> @@ -2985,6 +2990,7 @@ <translation id="3856800405688283469">സമയ മേഖല തിരഞ്ഞെടുക്കുക</translation> <translation id="3857807444929313943">വിരൽ ഉയർത്തി, വീണ്ടും സ്പർശിക്കുക</translation> <translation id="3858860766373142691">പേര്</translation> +<translation id="385939467708172187">ശക്തമായ പാസ്വേഡ് ഉപയോഗിക്കുക</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" എന്ന ഉപയോക്തൃനാമം ലഭ്യമല്ല</translation> <translation id="3861977424605124250">ആരംഭത്തിൽ കാണിക്കുക</translation> <translation id="386239283124269513">&ഗ്രൂപ്പ് പുനഃസ്ഥാപിക്കുക</translation> @@ -3227,6 +3233,7 @@ <translation id="4089235344645910861">ക്രമീകരണം സംരക്ഷിച്ചു. സമന്വയം ആരംഭിച്ചു.</translation> <translation id="4090103403438682346">പരിശോധിച്ചുറപ്പിച്ച ആക്സസ് പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="4090947011087001172"><ph name="SITE" />-നുള്ള സൈറ്റ് അനുമതികൾ പുനഃസജ്ജീകരിക്കണോ?</translation> +<translation id="4092636882861724179"><ph name="GOOGLE_PASSWORD_MANAGER" /> എന്നതിൽ നിങ്ങളുടെ പാസ്വേഡുകൾ കാണാനും മാനേജ് ചെയ്യാനുമാകും.</translation> <translation id="4093865285251893588">പ്രൊഫൈൽ ചിത്രം</translation> <translation id="4093955363990068916">പ്രാദേശിക ഫയൽ:</translation> <translation id="4094647278880271855">നിങ്ങള് പിന്തുണയ്ക്കാത്ത എൻവയോൺമെന്റ് വേരിയബിൾ ഉപയോഗിക്കുന്നു:<ph name="BAD_VAR" />. സ്ഥിരതയെയും സുരക്ഷയെയും ബാധിക്കും.</translation> @@ -3517,6 +3524,7 @@ <translation id="4392896746540753732">കോൺഫിഗറേഷൻ ഫയൽ എഡിറ്റ് ചെയ്യുക</translation> <translation id="4394049700291259645">അപ്രാപ്തമാക്കുക</translation> <translation id="4396956294839002702">{COUNT,plural, =0{&എല്ലാം തുറക്കുക}=1{&ബുക്ക്മാർക്ക് തുറക്കുക}other{({COUNT}) &എല്ലാം തുറക്കുക}}</translation> +<translation id="4397372003838952832">നിങ്ങൾ ഈ പാസ്വേഡ് ഓർമ്മിക്കേണ്ടതില്ല. അത് <ph name="EMAIL" /> എന്ന അക്കൗണ്ടിനുള്ള <ph name="GOOGLE_PASSWORD_MANAGER" /> എന്നതിൽ സംരക്ഷിക്കും.</translation> <translation id="439817266247065935">നിങ്ങളുടെ ഉപകരണം ശരിയായി ഷട്ട്ഡൗൺ ചെയ്തിട്ടില്ല. Linux ആപ്പുകൾ ഉപയോഗിക്കാൻ Linux റീസ്റ്റാർട്ട് ചെയ്യുക.</translation> <translation id="4400367121200150367">ഇവിടെ ദൃശ്യമാകുന്ന സൈറ്റുകള് ഒരിക്കലും പാസ്വേഡുകള് സംരക്ഷിക്കില്ല</translation> <translation id="4400632832271803360">മുകൾ-വരിയിലെ കീകളുടെ പ്രവർത്തനരീതി മാറ്റാൻ 'ലോഞ്ചർ' കീ അമർത്തിപ്പിടിക്കുക</translation> @@ -3530,6 +3538,7 @@ <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation> <translation id="440653823335387109">നിങ്ങൾ വായിച്ച പേജുകൾ</translation> <translation id="4406883609789734330">തത്സമയ ക്യാപ്ഷൻ</translation> +<translation id="4407039574263172582">തുടരാൻ, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> നിങ്ങളുടെ പേരും ഇമെയിൽ വിലാസവും പ്രൊഫൈൽ ചിത്രവും ഈ സൈറ്റുമായി പങ്കിടും. ഈ സൈറ്റിന്റെ <ph name="BEGIN_LINK" />സേവന നിബന്ധനകൾ<ph name="END_LINK" /> കാണുക.</translation> <translation id="4408599188496843485">സ&ഹായം</translation> <translation id="4409271659088619928"><ph name="DSE" /> ആണ് നിങ്ങളുടെ തിരയൽ യന്ത്രം. ബാധകമെങ്കിൽ, നിങ്ങളുടെ തിരയൽ ചരിത്രം ഇല്ലാതാക്കാനുള്ള അതിലെ നിർദ്ദേശങ്ങൾ കാണുക.</translation> <translation id="4409697491990005945">മാര്ജിനുകള്</translation> @@ -3713,6 +3722,7 @@ <translation id="4579453506923101210">കണക്റ്റ് ചെയ്ത ഫോൺ മറക്കുക</translation> <translation id="4579581181964204535"><ph name="HOST_NAME" /> കാസ്റ്റ് ചെയ്യാനാവുന്നില്ല.</translation> <translation id="4579876313423027742">ബ്രൗസർ അറിയിപ്പുകൾക്ക്, <ph name="LINK_BEGIN" />Chrome ബ്രൗസർ ക്രമീകരണത്തിലേക്ക്<ph name="LINK_END" /> പോകുക</translation> +<translation id="4580596421317071374">പാസ്വേഡുകൾ ഈ ഉപകരണത്തിലെ <ph name="GOOGLE_PASSWORD_MANAGER" /> എന്നതിൽ സംരക്ഷിക്കുന്നു.</translation> <translation id="4581774856936278355">Linux പുനഃസ്ഥാപിക്കുന്നതിൽ പിശക്</translation> <translation id="4582297591746054421">പകർത്തിയ ടെക്സ്റ്റിന്റെ ഫോർമാറ്റ് നിലനിർത്തുന്നത് പോലുള്ള ഫീച്ചറുകൾക്ക്, സൈറ്റുകൾ സാധാരണയായി നിങ്ങളുടെ ക്ലിപ്പ്ബോർഡ് വായിക്കാറുണ്ട്</translation> <translation id="4582563038311694664">എല്ലാ ക്രമീകരണങ്ങളും റീസെറ്റ് ചെയ്യുക</translation> @@ -3884,6 +3894,7 @@ <translation id="4761104368405085019">നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കുക</translation> <translation id="4762718786438001384">ഉപകരണത്തിൽ ഡിസ്ക് ഇടം വളരെ കുറവാണ്</translation> <translation id="4763408175235639573">നിങ്ങള് ഈ പേജ് കണ്ടപ്പോള് ഇനിപ്പറയുന്ന കുക്കികളെ സജ്ജമാക്കി</translation> +<translation id="4765524037138975789">{MONTHS,plural, =1{ഈ ഉപകരണം 1 മാസം വരെ സംരക്ഷിക്കും, അടുത്ത തവണ നിങ്ങൾക്ക് ഒരു കോഡ് ഇല്ലാതെ തന്നെ കണക്റ്റ് ചെയ്യാം. ഇത് നിങ്ങളുടെ അഡ്മിൻ സജ്ജീകരിച്ചതാണ്.}other{ഈ ഉപകരണം {MONTHS} മാസം വരെ സംരക്ഷിക്കും, അടുത്ത തവണ നിങ്ങൾക്ക് ഒരു കോഡ് ഇല്ലാതെ തന്നെ കണക്റ്റ് ചെയ്യാം. ഇത് നിങ്ങളുടെ അഡ്മിൻ സജ്ജീകരിച്ചതാണ്.}}</translation> <translation id="4765582662863429759">ഫോണിൽ നിന്ന് Chromebook-ലേക്ക് ടെക്സ്റ്റുകൾ കൈമാറാൻ Android മെസേജിനെ അനുവദിക്കുന്നു</translation> <translation id="4768332406694066911">നിങ്ങള്ക്ക് ഈ ഓര്ഗനൈസേഷനുകളില് നിന്ന് നിങ്ങളെ തിരിച്ചറിയുന്ന സര്ട്ടിഫിക്കറ്റുകളുണ്ട്</translation> <translation id="4770119228883592393">അനുമതി അഭ്യർത്ഥിച്ചു, പ്രതികരിക്കാൻ ⌘ + Option + താഴേക്കുള്ള അമ്പടയാളം അമർത്തുക</translation> @@ -4498,6 +4509,7 @@ <translation id="5398497406011404839">മറച്ചിരിക്കുന്ന ബുക്ക്മാർക്കുകൾ</translation> <translation id="5398572795982417028">പേജ് റഫറൻസ് പരിധി കവിഞ്ഞു, <ph name="MAXIMUM_PAGE" /> പേജാണ് വേണ്ട പരിധി</translation> <translation id="5401426944298678474">സൈറ്റ് പിന്തുടരുന്നത് ഒഴിവാക്കുക</translation> +<translation id="5401851137404501592">തുടരാൻ, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> നിങ്ങളുടെ പേരും ഇമെയിൽ വിലാസവും പ്രൊഫൈൽ ചിത്രവും ഈ സൈറ്റുമായി പങ്കിടും.</translation> <translation id="5402815541704507626">മൊബൈല് ഡാറ്റ ഉപയോഗിച്ച് അപ്ഡേറ്റ് ഡൗൺലോഡ് ചെയ്യുക</translation> <translation id="540296380408672091"><ph name="HOST" /> എന്നതിൽ എല്ലായ്പ്പോഴും കുക്കികളെ തടയുക</translation> <translation id="5404740137318486384">“<ph name="ACTION" />” അസൈൻ ചെയ്യാൻ ഒരു സ്വിച്ചോ കീബോർഡ് കീയോ അമർത്തുക. @@ -5355,6 +5367,7 @@ <translation id="6250186368828697007">നിങ്ങൾ സ്ക്രീൻ പങ്കിടുമ്പോൾ വിശദാംശങ്ങൾ മറയ്ക്കുന്നു</translation> <translation id="6251870443722440887">GDI കൈകാര്യംചെയ്യുന്നവ</translation> <translation id="625369703868467034">നെറ്റ്വർക്ക് ഹെൽത്ത്</translation> +<translation id="6253801023880399036">പാസ്വേഡുകൾ <ph name="GOOGLE_PASSWORD_MANAGER" /> എന്നതിൽ സംരക്ഷിക്കുന്നു.</translation> <translation id="6254503684448816922">കീ കോംപ്രമൈസ്</translation> <translation id="6254892857036829079">മികച്ചത്</translation> <translation id="6257602895346497974">സമന്വയിപ്പിക്കൽ ഓണാക്കുക...</translation> @@ -6377,6 +6390,7 @@ <translation id="7282547042039404307">സ്മൂത്ത്</translation> <translation id="7282992757463864530">വിവരബാര്</translation> <translation id="7283555985781738399">അതിഥി മോഡ്</translation> +<translation id="7284307451964417957">{DAYS,plural, =1{ഈ ഉപകരണം 1 ദിവസം വരെ സംരക്ഷിക്കും, അടുത്ത തവണ നിങ്ങൾക്ക് ഒരു കോഡ് ഇല്ലാതെ തന്നെ കണക്റ്റ് ചെയ്യാം. ഇത് നിങ്ങളുടെ അഡ്മിൻ സജ്ജീകരിച്ചതാണ്.}other{ഈ ഉപകരണം {DAYS} ദിവസം വരെ സംരക്ഷിക്കും, അടുത്ത തവണ നിങ്ങൾക്ക് ഒരു കോഡ് ഇല്ലാതെ തന്നെ കണക്റ്റ് ചെയ്യാം. ഇത് നിങ്ങളുടെ അഡ്മിൻ സജ്ജീകരിച്ചതാണ്.}}</translation> <translation id="7284411326658527427">ഓരോ വ്യക്തിക്കും അവരുടെ അക്കൗണ്ട് വ്യക്തിപരമാക്കാനും ഡാറ്റ സ്വകാര്യമായി സൂക്ഷിക്കാനും കഴിയും.</translation> <translation id="7287143125007575591">ആക്സസ് നിരസിച്ചു.</translation> <translation id="7287411021188441799">ഡിഫോൾട്ട് പശ്ചാത്തലം പുനഃസ്ഥാപിക്കുക</translation> @@ -6581,6 +6595,7 @@ <translation id="7488682689406685343">തടസ്സമുണ്ടാക്കുന്ന അറിയിപ്പുകൾ അനുവദിക്കാൻ ഈ സൈറ്റ് നിങ്ങളെ കബളിപ്പിക്കാൻ ശ്രമിക്കുന്നുണ്ടാകാം.</translation> <translation id="7489761397368794366">നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് കോൾ ചെയ്യുക</translation> <translation id="749028671485790643">വ്യക്തി <ph name="VALUE" /></translation> +<translation id="7490683549040131791">ശേഷിക്കുന്ന പാസ്വേഡുകൾ പരിശോധിക്കുക</translation> <translation id="7491962110804786152">ടാബ്</translation> <translation id="7491963308094506985">{NUM_COOKIES,plural, =1{ഒരു കുക്കി}other{{NUM_COOKIES} കുക്കികള്}}</translation> <translation id="7493386493263658176">പാസ്വേഡുകൾ, ക്രെഡിറ്റ് കാർഡ് നമ്പറുകൾ എന്നിവ പോലുള്ള വ്യക്തിപരമായ വിവരങ്ങൾ ഉൾപ്പെടെ നിങ്ങൾ ടൈപ്പ് ചെയ്യുന്ന എല്ലാ ടെക്സ്റ്റും <ph name="EXTENSION_NAME" /> വിപുലീകരണം ശേഖരിച്ചേക്കാം. നിങ്ങൾക്ക് ഈ വിപുലീകരണം ഉപയോഗിക്കണോ?</translation> @@ -7472,6 +7487,7 @@ <translation id="8335587457941836791">ഷെൽഫിൽ നിന്ന് അൺപിൻ ചെയ്യുക</translation> <translation id="8336407002559723354">അപ്ഡേറ്റുകൾ <ph name="MONTH_AND_YEAR" />-ന് അവസാനിക്കുന്നു</translation> <translation id="8336739000755212683">ഉപകരണ അക്കൗണ്ട് ചിത്രം മാറ്റുക</translation> +<translation id="8337020675372081178">{HOURS,plural, =1{ഈ ഉപകരണം 1 മണിക്കൂർ വരെ സംരക്ഷിക്കും, അടുത്ത തവണ നിങ്ങൾക്ക് ഒരു കോഡ് ഇല്ലാതെ തന്നെ കണക്റ്റ് ചെയ്യാം. ഇത് നിങ്ങളുടെ അഡ്മിൻ സജ്ജീകരിച്ചതാണ്.}other{ഈ ഉപകരണം {HOURS} മണിക്കൂർ വരെ സംരക്ഷിക്കും, അടുത്ത തവണ നിങ്ങൾക്ക് ഒരു കോഡ് ഇല്ലാതെ തന്നെ കണക്റ്റ് ചെയ്യാം. ഇത് നിങ്ങളുടെ അഡ്മിൻ സജ്ജീകരിച്ചതാണ്.}}</translation> <translation id="8337047789441383384">നിങ്ങൾ മുമ്പ് ഈ സുരക്ഷാ കീ രജിസ്റ്റർ ചെയ്തിട്ടുണ്ട്. വീണ്ടും അത് രജിസ്റ്റർ ചെയ്യേണ്ടതില്ല.</translation> <translation id="8338952601723052325">ഡെവലപ്പർ വെബ്സൈറ്റ്</translation> <translation id="8339059274628563283"><ph name="SITE" />, പ്രാദേശികമായി സൂക്ഷിച്ച വിവരം</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 80450fd..60d0ae2 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -89,6 +89,9 @@ <translation id="1082214733466244292">Таны администратор энэ төхөөрөмжид зарим функцийг блоклосон</translation> <translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> нь таны Chrome-н тохиргоог өгөгдмөл хэлбэрт тохируулахыг хүсэж байна. Энэхүү тохиргоо нь таны үндсэн нүүр хуудас, шинэ цонх болон хайлтын системийн тохиргоог өөрчлөх бөгөөд таны өргөтгөлийн идэвхгүй болгож бүх цонхыг unpin хиих болно. Энэхүү тохиргоо нь күүки, мэдээлэл болон бусад сайтын мэдээлэл зэрэг түр болон хадгалагдсан бүх мэдээллийг арилгах болно.</translation> <translation id="1084096383128641877">Энэ нууц үгийг хасах нь <ph name="DOMAIN" /> дээрх таны бүртгэлийг устгахгүй. <ph name="DOMAIN_LINK" /> дээрх нууц үгээ өөрчилж эсвэл бүртгэлээ устган түүнийг бусдаас хамгаална уу.</translation> +<translation id="1084288067399862432">Алдагдсан нууц үгийг амжилттай өөрчиллөө. + +Нууц үгнүүдээ <ph name="GOOGLE_PASSWORD_MANAGER" />-с хүссэн үедээ шалгана уу.</translation> <translation id="1084824384139382525">Линкийн хаягийг хуулах</translation> <translation id="1085064499066015002">Бүх сайт дээр үргэлж</translation> <translation id="1085697365578766383">Виртуал машиныг эхлүүлэхэд алдаа гарлаа. Дахин оролдоно уу.</translation> @@ -1689,6 +1692,7 @@ <translation id="2554553592469060349">Сонгосон файл хэтэрхий том байна (дээд хэмжээ: 3 МБ)</translation> <translation id="2558569818338050235">Таны хөтчийн түүх таны хардаг зард нөлөөлнө</translation> <translation id="2558896001721082624">Хандалтын сонголтыг системийн цэсэнд тогтмол харуулах</translation> +<translation id="2559889124253841528">Төхөөрөмжид хадгалах</translation> <translation id="2564520396658920462">AppleScript-р гүйцэтгэж байгаа JavaScript-г унтраалттай байна. Үүнийг асаахын тулд цэсийн талбарын Apple-н арга хэмжээнээс Харах > Хөгжүүлэгч > JavaScript-г зөвшөөрөх хэсэгт очно уу. Дэлгэрэнгүй мэдээллийг: https://support.google.com/chrome/?p=applescript</translation> <translation id="2564653188463346023">Зөв бичгийн алдаа шалгах сайжруулсан онцлог</translation> <translation id="2568774940984945469">Мэдээллийн цонх агуулагч</translation> @@ -1699,6 +1703,7 @@ <translation id="2575247648642144396">Өргөтгөл нь тухайн хуудсанд ажиллахад тэмдэглэгээ харагдана. Энэхүү тэмдэглэгээн дээр дарж эсвэл <ph name="EXTENSION_SHORTCUT" /> дээр дарснаар өргөлтгөлийг ашиглах боломжтой.</translation> <translation id="2575407791320728464">Энэ URL буруу байна. Энэ нь зөв форматтай эсэхийг шалгана уу.</translation> <translation id="2575441894380764255">Төвөгтэй эсвэл хуурамч зар харуулахыг зөвшөөрөөгүй</translation> +<translation id="2575713839157415345">{YEARS,plural, =1{Энэ төхөөрөмжийг 1 жилийн турш хадгалах бөгөөд та дараагийн удаа кодгүйгээр холбогдох боломжтой. Үүнийг танай администратор тохируулсан.}other{Энэ төхөөрөмжийг {YEARS} жилийн турш хадгалах бөгөөд та дараагийн удаа кодгүйгээр холбогдох боломжтой. Үүнийг танай администратор тохируулсан.}}</translation> <translation id="257779572837908839">Уулзалтад зориулсан Chromebox-р тохируулах</translation> <translation id="2580889980133367162"><ph name="HOST" />-ийг хэд хэдэн файл татаж авахыг үргэлж зөвшөөрөх</translation> <translation id="258095186877893873">Урт</translation> @@ -2997,6 +3002,7 @@ <translation id="3856800405688283469">Цагийн бүс сонгох</translation> <translation id="3857807444929313943">Дээшлүүлээд дахин хүрэх</translation> <translation id="3858860766373142691">Нэр</translation> +<translation id="385939467708172187">Сайн нууц үг ашиглана уу</translation> <translation id="3861638017150647085">"<ph name="USERNAME" />" хэрэглэгчийн нэр боломжгүй байна</translation> <translation id="3861977424605124250">Гарааны компанид харуулах</translation> <translation id="386239283124269513">&Бүлгийг сэргээх</translation> @@ -3239,6 +3245,7 @@ <translation id="4089235344645910861">Тохиргоонуудыг хадгалсан. Синкийг эхлүүлсэн.</translation> <translation id="4090103403438682346">Хандалт баталгаажуулалтыг идэвхжүүлэх</translation> <translation id="4090947011087001172"><ph name="SITE" />-н сайтын зөвшөөрлийг шинэчлэх үү?</translation> +<translation id="4092636882861724179">Та <ph name="GOOGLE_PASSWORD_MANAGER" />-д хадгалсан нууц үгийг харах болон удирдах боломжтой.</translation> <translation id="4093865285251893588">Профайлын зураг</translation> <translation id="4093955363990068916">Суурин файл:</translation> <translation id="4094647278880271855">Та дэмжигдээгүй орчин тойрны хувьсагчийг ашиглаж байна: <ph name="BAD_VAR" />. Тогтвортой байдал болон аюулгүй байдал алдагдах болно.</translation> @@ -3529,6 +3536,7 @@ <translation id="4392896746540753732">Тохиргооны файл засах</translation> <translation id="4394049700291259645">Идэвхгүй болгох</translation> <translation id="4396956294839002702">{COUNT,plural, =0{&Бүгдийг нээх}=1{&Хавчуургыг нээх}other{&Бүгдийг нээх ({COUNT})}}</translation> +<translation id="4397372003838952832">Та энэ нууц үгийг санах шаардлагагүй. Үүнийг <ph name="EMAIL" />-д зориулж <ph name="GOOGLE_PASSWORD_MANAGER" />-д хадгална.</translation> <translation id="439817266247065935">Таны төхөөрөмжийг зөв унтраагаагүй байна. Linux аппуудыг ашиглахын тулд Linux-г дахин эхлүүлнэ үү.</translation> <translation id="4400367121200150367">Нууц үг огт хадгалдаггүй сайтууд энд харагдана</translation> <translation id="4400632832271803360">Дээд мөрний түлхүүрийн функцийг сэлгэхийн тулд Эхлүүлэгч түлхүүрийг дарна уу</translation> @@ -3542,6 +3550,7 @@ <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation> <translation id="440653823335387109">ТАНЫ УНШСАН ХУУДАС</translation> <translation id="4406883609789734330">Шууд тайлбар</translation> +<translation id="4407039574263172582">Үргэлжүүлэхийн тулд <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> таны нэр, имэйл хаяг болон профайл зургийг энэ сайттай хуваалцана. Энэ сайтын <ph name="BEGIN_LINK" />үйлчилгээний нөхцөлийг<ph name="END_LINK" /> харна уу.</translation> <translation id="4408599188496843485">Тусламж</translation> <translation id="4409271659088619928">Таны хайлтын систем <ph name="DSE" /> байна. Хэрэв боломжтой бол хайлтын түүхээ устгахын тулд үүний зааварчилгааг харна уу.</translation> <translation id="4409697491990005945">Хүрээний хязгаар</translation> @@ -3726,6 +3735,7 @@ <translation id="4579453506923101210">Холбогдсон утсыг мартах</translation> <translation id="4579581181964204535"><ph name="HOST_NAME" />-д дамжуулах боломжгүй.</translation> <translation id="4579876313423027742">Хөтчийн мэдэгдэл авах бол <ph name="LINK_BEGIN" />Chrome хөтийн тохиргоо<ph name="LINK_END" /> руу очно уу</translation> +<translation id="4580596421317071374">Нууц үгнүүдийг энэ төхөөрөмж дээрх <ph name="GOOGLE_PASSWORD_MANAGER" />-д хадгалсан.</translation> <translation id="4581774856936278355">Linux-г сэргээхэд алдаа гарлаа</translation> <translation id="4582297591746054421">Сайтууд ихэвчлэн таны хуулсан текстийн форматыг хадгалах зэрэг онцлогуудад зориулж таны түр санах ойг уншдаг</translation> <translation id="4582563038311694664">Бүх тохиргоог дахин тохируулах</translation> @@ -3791,6 +3801,7 @@ <translation id="4648491805942548247">Хангалтгүй зөвшөөрөл</translation> <translation id="4650591383426000695">Утсаа <ph name="DEVICE_TYPE" />-с салгах</translation> <translation id="4651484272688821107">Демо горимын эх сурвалжтай онлайн бүрэлдэхүүн хэсгийг ачаалж чадсангүй.</translation> +<translation id="4651921906638302153">Энэ бүртгэлээр нэвтрэх боломжгүй</translation> <translation id="4652935475563630866">Камерын тохиргоон дахь өөрчлөлт нь Parallels Desktop-г дахин ачаалахыг шаарддаг. Үргэлжлүүлэхийн тулд Parallels Desktop-г дахин ачаална уу.</translation> <translation id="4653405415038586100">Linux-г тохируулахад алдаа гарлаа</translation> <translation id="465406513924180949">Та веб дээр худалдан авалтын сагсандаа үлдээсэн зүйлс рүүгээ хялбархан буцахад тань туслах сагснуудыг харж байна. @@ -3897,6 +3908,7 @@ <translation id="4761104368405085019">Микрофоноо ашигла</translation> <translation id="4762718786438001384">Төхөөрөмжийн дискний багтаамж маш бага байна</translation> <translation id="4763408175235639573">Таныг энэ хуудсыг харахад дараах күүкийг тохируулсан</translation> +<translation id="4765524037138975789">{MONTHS,plural, =1{Энэ төхөөрөмжийг 1 сарын турш хадгалах бөгөөд та дараагийн удаа кодгүйгээр холбогдох боломжтой. Үүнийг танай администратор тохируулсан.}other{Энэ төхөөрөмжийг {MONTHS} сарын турш хадгалах бөгөөд та дараагийн удаа кодгүйгээр холбогдох боломжтой. Үүнийг танай администратор тохируулсан.}}</translation> <translation id="4765582662863429759">Андройд Мессежийг таны утаснаас таны Chromebook-д мессеж илгээхийг зөвшөөрдөг</translation> <translation id="4768332406694066911">Танд эдгээр байгууллагаас таныг тодорхойлох сертификат байна</translation> <translation id="4770119228883592393">Зөвшөөрлийн хүсэлт тавьсан. Хариу өгөхийн тулд ⌘ + Сонголт + Доош сумыг дарна уу</translation> @@ -4511,6 +4523,7 @@ <translation id="5398497406011404839">Нуусан хавчуурга</translation> <translation id="5398572795982417028">Хуудасны лавлагааны хязгаар болох <ph name="MAXIMUM_PAGE" />-с хэтэрсэн байна</translation> <translation id="5401426944298678474">Сайтыг дагахаа болих</translation> +<translation id="5401851137404501592">Үргэлжүүлэхийн тулд <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> таны нэр, имэйл хаяг болон профайл зургийг энэ сайттай хуваалцана.</translation> <translation id="5402815541704507626">Шинэчлэлтийг мобайл датагаар татах</translation> <translation id="540296380408672091"><ph name="HOST" /> дээрх cookies-г үргэлж блоклох</translation> <translation id="5404740137318486384">Сэлгүүр эсвэл гарын товчийг “<ph name="ACTION" />”-д оноохын тулд дээр нь дарна уу. @@ -5366,6 +5379,7 @@ <translation id="6250186368828697007">Таныг дэлгэцээ хуваалцах үед дэлгэрэнгүйг нууна</translation> <translation id="6251870443722440887">JDI бариул</translation> <translation id="625369703868467034">Сүлжээний байдал</translation> +<translation id="6253801023880399036">Нууц үгнүүдийг <ph name="GOOGLE_PASSWORD_MANAGER" />-д хадгалсан.</translation> <translation id="6254503684448816922">Түлхүүр тааруулах</translation> <translation id="6254892857036829079">Төгс</translation> <translation id="6257602895346497974">Синкийг асаах...</translation> @@ -5447,6 +5461,7 @@ <translation id="6327785803543103246">Веб прокси автоматаар илрүүлэх</translation> <translation id="6331818708794917058">Сайтууд MIDI төхөөрөмжүүдэд холбогдохыг хүсэх боломжтой</translation> <translation id="6333064448949140209">Файлыг дебаг хийхээр Google-д илгээж байна</translation> +<translation id="6333170995003625229">Таны имэйл хаяг эсвэл нууц үгийг баталгаажуулж чадсангүй. Дахин нэвтрэхээр оролдоно уу.</translation> <translation id="6335920438823100346">Linux-г эхлүүлэхийн тулд <ph name="MANAGER" /> танаас өгөгдлөө хуулбарлаж, энэ Chromebook-г үйлдвэрийн тохиргоонд шинэчлэхийг шаардаж байна.</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> ADB дебагийг идэвхгүй болгосон. Энэ нь таны <ph name="DEVICE_TYPE" />-г 24 цагийн дотор шинэчилнэ. Хадгалахыг хүссэн дурын файлуудаа хуулбарлана уу.</translation> <translation id="6338981933082930623">Бүх сайт танд дурын зар харуулах боломжтой</translation> @@ -5855,6 +5870,7 @@ <translation id="6735304988756581115">Cookies болон бусад сайтын мэдээллийг харуулах ...</translation> <translation id="6736243959894955139">Хаяг</translation> <translation id="6737663862851963468">Kerberos тасалбарыг хасах</translation> +<translation id="6738430949033571771">Бүртгэлийг баталгаажуулж байна...</translation> <translation id="6739923123728562974">Дэлгэцийн товчлолыг харуулах</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" />-г түр зогсоосон</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Таны администратор<ph name="END_LINK" /> Аюулгүй хайлтыг унтраасан</translation> @@ -6388,6 +6404,7 @@ <translation id="7282547042039404307">Зөөлөн</translation> <translation id="7282992757463864530">Мэдээллийн самбар</translation> <translation id="7283555985781738399">Зочны горим</translation> +<translation id="7284307451964417957">{DAYS,plural, =1{Энэ төхөөрөмжийг 1 хоногийн турш хадгалах бөгөөд та дараагийн удаа кодгүйгээр холбогдох боломжтой. Үүнийг танай администратор тохируулсан.}other{Энэ төхөөрөмжийг {DAYS} хоногийн турш хадгалах бөгөөд та дараагийн удаа кодгүйгээр холбогдох боломжтой. Үүнийг танай администратор тохируулсан.}}</translation> <translation id="7284411326658527427">Хүн бүр бүртгэлээ хувийн болгож, өгөгдлөө хувьдаа хадгалж болно.</translation> <translation id="7287143125007575591">Хандалтыг зөвшөөрөөгүй.</translation> <translation id="7287411021188441799">Өгөгдмөл дэвсгэрийг сэргээх</translation> @@ -6592,6 +6609,7 @@ <translation id="7488682689406685343">Энэ сайт таныг төвөгтэй мэдэгдлүүдэд зөвшөөрөл өгүүлэхээр хуурч байж болзошгүй.</translation> <translation id="7489761397368794366">Төхөөрөмжөөсөө дуудлага хийх</translation> <translation id="749028671485790643">Хувь хүн <ph name="VALUE" /></translation> +<translation id="7490683549040131791">Үлдсэн нууц үгнүүдийг шалгах</translation> <translation id="7491962110804786152">цонх</translation> <translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 күүки}other{{NUM_COOKIES} күүки}}</translation> <translation id="7493386493263658176"><ph name="EXTENSION_NAME" /> өргөтгөл таны шивсэн бүх текстийг цуглуулах бөгөөд үүнд таны нууц үг, кредит картын дугаар зэрэг хувийн өгөгдөл багтана. Та энэ өргөтгөлийг ашиглах уу?</translation> @@ -7481,6 +7499,7 @@ <translation id="8335587457941836791">Програмын жагсаалтын эхэнд байрлуулахыг болих</translation> <translation id="8336407002559723354">Шинэчлэлт нь <ph name="MONTH_AND_YEAR" /> дуусна</translation> <translation id="8336739000755212683">Төхөөрөмжийн бүртгэлийн зургийг өөрчлөх</translation> +<translation id="8337020675372081178">{HOURS,plural, =1{Энэ төхөөрөмжийг 1 цагийн турш хадгалах бөгөөд та дараагийн удаа кодгүйгээр холбогдох боломжтой. Үүнийг танай администратор тохируулсан.}other{Энэ төхөөрөмжийг {HOURS} цагийн турш хадгалах бөгөөд та дараагийн удаа кодгүйгээр холбогдох боломжтой. Үүнийг танай администратор тохируулсан.}}</translation> <translation id="8337047789441383384">Та энэ аюулгүй байдлын түлхүүрийг аль хэдийн бүртгүүлсэн байна. Та үүнийг дахин бүртгүүлэх шаардлагагүй.</translation> <translation id="8338952601723052325">Хөгжүүлэгч вебсайт</translation> <translation id="8339059274628563283"><ph name="SITE" /> дотоодод хадгалсан өгөгдөл</translation> @@ -7671,6 +7690,8 @@ <translation id="8546306075665861288">Зургийн кэш</translation> <translation id="8546930481464505581">Хүрэх мөрийг өөрчлөх</translation> <translation id="8547013269961688403">Бүтэн дэлгэцийн томруулагчийг идэвхжүүлэх</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" />-г <ph name="MANAGER" />-с удирддаг. Та энэ имэйлийг нэмэлт бүртгэлээр нэмэх боломжгүй.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" />-г ашиглахын тулд эхлээд өөрийн <ph name="DEVICE_TYPE" />-с гарна уу. Дараа нь нэвтрэлтийн дэлгэцийн доод хэсгээс Хүн нэмэхийг сонгоно уу.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">Дээд мөрний түлхүүрийн функцийг сэлгэхийн тулд Хайлтын түлхүүрийг дарна уу</translation> <translation id="8549316893834449916">Та Chromebook- дээ нэвтрэхдээ Gmail, Драйв, YouTube болон бусад зүйлд нэвтрэхдээ ашигладаг Google Бүртгэлээ ашиглана.</translation> <translation id="8551388862522347954">Лиценз</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 4ea00a2..aa7512b 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -3793,6 +3793,7 @@ <translation id="4648491805942548247">अपुर्या परवानग्या</translation> <translation id="4650591383426000695">तुमचा फोन <ph name="DEVICE_TYPE" /> वरून डिस्कनेक्ट करा</translation> <translation id="4651484272688821107">डेमो मोड स्रोतांनी ऑनलाइन घटक लोड करता आला नाही.</translation> +<translation id="4651921906638302153">हे खाते वापरून साइन इन करू शकत नाही</translation> <translation id="4652935475563630866">कॅमेऱ्याच्या सेटिंगमधील बदलासाठी Parallels Desktop पुन्हा लाँच करणे आवश्यक आहे. Parallels Desktop वर पुढे सुरू ठेवण्यासाठी पुन्हा लाँच करा.</translation> <translation id="4653405415038586100">Linux कॉंफिगर करताना एरर आली</translation> <translation id="465406513924180949">तुम्हाला संपूर्ण वेबवर शॉपिंग कार्टमध्ये साठवलेल्या आयटमवर सहजपणे परत जाण्यासाठी मदत करणारी कार्ट दिसत आहेत. @@ -5450,6 +5451,7 @@ <translation id="6327785803543103246">वेब प्रॉक्सी स्वयं शोध</translation> <translation id="6331818708794917058">साइट MIDI डिव्हाइसशी कनेक्ट करण्यासाठी विचारू शकतात</translation> <translation id="6333064448949140209">फाइल डीबग करण्यासाठी Google कडे पाठवली जाईल</translation> +<translation id="6333170995003625229">तुमचा ईमेल अॅड्रेस किंवा पासवर्डची पडताळणी करता आली नाही. पुन्हा साइन इन करून पहा.</translation> <translation id="6335920438823100346">Linux सुरू करण्यासाठी, <ph name="MANAGER" /> नुसार, तुम्ही तुमच्या डेटाचा बॅकअप घेणे आणि हे Chromebook फॅक्टरी सेटिंग्जवर रीसेट करणे आवश्यक आहे.</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> ने ADB डीबगिंग बंद केले आहे. यामुळे तुमचे <ph name="DEVICE_TYPE" /> २४ तासांमध्ये रीसेट होईल. तुम्हाला ठेवायच्या असलेल्या सर्व फाइलचा बॅकअप घ्या.</translation> <translation id="6338981933082930623">सर्व साइट तुम्हाला कोणत्याही जाहिराती दाखवू शकतात</translation> @@ -5858,6 +5860,7 @@ <translation id="6735304988756581115">कुकीज आणि इतर साइट डेटा दर्शवा...</translation> <translation id="6736243959894955139">पत्ता</translation> <translation id="6737663862851963468">Kerberos तिकीट काढा</translation> +<translation id="6738430949033571771">खात्याची पडताळणी करत आहे...</translation> <translation id="6739923123728562974">डेस्कटॉप शॉर्टकट दर्शवा</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> ला विराम दिला</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />तुमच्या अॅडमिनिस्ट्रेटरने<ph name="END_LINK" /> सुरक्षित ब्राउझिंग बंद केले आहे</translation> @@ -7675,6 +7678,8 @@ <translation id="8546306075665861288">इमेज कॅशे </translation> <translation id="8546930481464505581">स्पर्श बार कस्टमाइझ करा</translation> <translation id="8547013269961688403">पूर्णस्क्रीन भिंग सुरू करा</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> हा <ph name="MANAGER" /> द्वारे व्यवस्थापित केला जातो. तुम्ही हा ईमेल अतिरिक्त खाते म्हणून जोडू शकत नाही.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" /> वापरण्यासाठी, सर्वप्रथम तुमच्या <ph name="DEVICE_TYPE" /> मधून साइन आउट करा. त्यानंतर तुमच्या लॉग इन स्क्रीनच्या तळाशी, व्यक्ती जोडा निवडा.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">शीर्ष-पंक्ती की चे वर्तन बदलण्यासाठी शोध की दाबून ठेवा</translation> <translation id="8549316893834449916">तुमच्या Chromebook मध्ये साइन इन करण्यासाठी तुम्ही तुमचे Google खाते वापराल – जे तुम्ही Gmail, Drive, YouTube आणि बर्याच गोष्टींसाठी वापरता.</translation> <translation id="8551388862522347954">परवाने</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index e8e1b87..869f2d0 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -871,6 +871,7 @@ <translation id="1813278315230285598">Perkhidmatan</translation> <translation id="18139523105317219">Nama Pihak EDI</translation> <translation id="1815083418640426271">Tampalkan Sebagai Teks Biasa</translation> +<translation id="1815097521077272760">Anda telah diundang untuk mencuba kawalan papan kekunci untuk permainan ini.</translation> <translation id="1815181278146012280">Tanya apabila tapak mahu mengakses peranti HID</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> lagi...</translation> <translation id="1816036116994822943">Kelajuan pengimbasan papan kekunci</translation> @@ -1005,6 +1006,7 @@ <translation id="1935303383381416800">Dibenarkan untuk melihat lokasi anda</translation> <translation id="1936931585862840749">Gunakan nombor untuk menyatakan bilangan salinan yang perlu dicetak (1 hingga <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Tidak dapat mengimport seni bina bekas jenis <ph name="ARCHITECTURE_CONTAINER" /> dengan peranti ini, iaitu peranti <ph name="ARCHITECTURE_DEVICE" />. Anda boleh cuba memulihkan bekas ini dalam peranti lain atau anda boleh cuba mengakses fail dalam imej bekas ini dengan membuka fail dalam apl Files.</translation> +<translation id="1938320257168860255">Ralat telah berlaku. Pastikan telefon ada pada anda, dibuka kunci dan Bluetooth serta Wi-Fi dihidupkan.</translation> <translation id="1938351510777341717">Perintah Luaran</translation> <translation id="1940546824932169984">Peranti yang disambungkan</translation> <translation id="1941410638996203291">Masa mula <ph name="TIME" /></translation> @@ -1087,6 +1089,7 @@ <translation id="2030455719695904263">Pad jejak</translation> <translation id="2031639749079821948">Kata laluan anda disimpan dalam Akaun Google anda</translation> <translation id="2031914984822377766">Tambah <ph name="LINK_BEGIN" />bahasa laman web<ph name="LINK_END" /> pilihan anda. Bahasa teratas daripada senarai akan digunakan untuk terjemahan.</translation> +<translation id="2033758234986231162">Tidak dapat mengekalkan sambungan dengan telefon anda. Pastikan telefon ada pada anda, dibuka kunci dan Bluetooth serta Wi-Fi dihidupkan.</translation> <translation id="2034346955588403444">Tambahkan rangkaian Wi-Fi lain</translation> <translation id="203574396658008164">Dayakan ciri catatan nota daripada skrin kunci</translation> <translation id="2037445849770872822">Pengawasan ditetapkan untuk Akaun Google ini. Untuk menyediakan lebih banyak kawalan ibu bapa, pilih Teruskan. @@ -3757,6 +3760,7 @@ <translation id="461661862154729886">Sumber tenaga</translation> <translation id="4617001782309103936">Terlalu pendek</translation> <translation id="4617270414136722281">Pilihan sambungan</translation> +<translation id="4617880081511131945">Tidak dapat mewujudkan sambungan</translation> <translation id="4619564267100705184">Sahkan orang itu ialah anda</translation> <translation id="4619615317237390068">Tab daripada peranti lain</translation> <translation id="4620809267248568679">Tetapan ini dikuatkuasakan oleh sambungan.</translation> @@ -4049,6 +4053,7 @@ <translation id="4907306957610201395">Kategori Kebenaran</translation> <translation id="4908811072292128752">Buka tab baharu untuk menyemak imbas dua tapak pada masa yang sama</translation> <translation id="4909038193460299775">Oleh sebab akaun ini diurus oleh <ph name="DOMAIN" />, penanda halaman, sejarah, kata laluan dan tetapan anda yang lain akan dikosongkan daripada peranti ini. Namun begitu, data anda akan terus disimpan dalam Akaun Google anda dan boleh diurus di <ph name="BEGIN_LINK" />Papan Pemuka Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Penstriman apl dilumpuhkan oleh pentadbir telefon anda.</translation> <translation id="4912643508233590958">Bangkit Daripada Melahu</translation> <translation id="4915961947098019832">Dibenarkan untuk memaparkan imej</translation> <translation id="4916542008280060967">Benarkan tapak mengedit <ph name="FILE_NAME" />?</translation> @@ -6877,6 +6882,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Laraskan sempadan paparan anda</translation> <translation id="7760004034676677601">Adakah ini halaman permulaan yang anda jangkakan?</translation> +<translation id="7762024824096060040">Tidak boleh menggunakan akaun ini</translation> <translation id="7762463735017901568">Penyegerakan pemberitahuan dilumpuhkan oleh pentadbir telefon anda</translation> <translation id="7764225426217299476">Tambahkan alamat</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> daripada <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7047,6 +7053,7 @@ <translation id="7919210519031517829"><ph name="DURATION" />s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> boleh melihat <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Tambah perkataan yang perlu dilangkau oleh semak ejaan</translation> +<translation id="7921347341284348270">Anda tidak boleh melihat pemberitahuan telefon anda pada akaun terurus ini. Cuba lagi dengan akaun lain. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Tunjukkan butiran tentang menyekat kuki pihak ketiga dalam Inkognito</translation> <translation id="7923564237306226146">Peningkatan Linux selesai</translation> <translation id="7924358170328001543">Ralat semasa mengirim semula port</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index d4098d31..ef02c355 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -3793,6 +3793,7 @@ <translation id="4648491805942548247">ခွင့်ပြုချက်များ မလုံလောက်</translation> <translation id="4650591383426000695">သင်၏ <ph name="DEVICE_TYPE" /> ကို သင့်ဖုန်းနှင့် ချိတ်ဆက်မှု ဖြုတ်မည်</translation> <translation id="4651484272688821107">သရုပ်ပြမုဒ်အရင်းအမြစ်များဖြင့် အွန်လိုင်းအစိတ်အပိုင်းကို ဖွင့်၍မရပါ။</translation> +<translation id="4651921906638302153">ဤအကောင့်ဖြင့် လက်မှတ်ထိုးဝင်၍ မရပါ</translation> <translation id="4652935475563630866">ကင်မရာဆက်တင် ပြောင်းလဲမှု အကျိုးသက်ရောက်စေရန် Parallels Desktop ကို ပြန်ဖွင့်ရပါမည်။ ရှေ့ဆက်ရန် Parallels Desktop ကို ပြန်ဖွင့်ပါ။</translation> <translation id="4653405415038586100">Linux စီစဉ်သတ်မှတ်ရာတွင် အမှားအယွင်းရှိသည်</translation> <translation id="465406513924180949">ဝဘ်ပေါ်ရှိ ဈေးခြင်းတောင်းများတွင် ကျန်ခဲ့သောပစ္စည်းများသို့ အလွယ်တကူပြန်သွားနိုင်ရန် ကူညီပေးသည့် ဈေးခြင်းတောင်းများကို မြင်နေရခြင်းဖြစ်သည်။ @@ -5449,6 +5450,7 @@ <translation id="6327785803543103246">ဝဘ်ပရောက်စီ အလိုအလျောက် ရှာဖွေမှု</translation> <translation id="6331818708794917058">ဝဘ်ဆိုက်များက MIDI ကိရိယာများသို့ ချိတ်ဆက်လိုပါက ခွင့်တောင်းနိုင်သည်</translation> <translation id="6333064448949140209">အမှားရှာဖွေရန် ဖိုင်ကို Google သို့ ပို့လိုက်ပါမည်</translation> +<translation id="6333170995003625229">သင့်အီးမေးလ်လိပ်စာ (သို့) စကားဝှက်ကို အတည်ပြု၍ မရပါ။ ထပ်မံ၍ လက်မှတ်ထိုးဝင်ကြည့်ပါ။</translation> <translation id="6335920438823100346">Linux စတင်ရန်အတွက် သင့်ဒေတာများကို အရန်သိမ်းပြီး ဤ Chromebook ကို စက်ရုံထုတ်ဆက်တင်များအတိုင်း ပြင်ဆင်သတ်မှတ်ရန် <ph name="MANAGER" /> က သတ်မှတ်ထားသည်။</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> သည် ADB အမှားရှာပြင်ခြင်းကို ပိတ်ထားသည်။ ၎င်းက သင်၏ <ph name="DEVICE_TYPE" /> ကို ၂၄ နာရီအတွင်း ပြင်ဆင်သတ်မှတ်ပါမည်။ သိမ်းလိုသော ဖိုင်မှန်သမျှကို အရန်သိမ်းပါ။</translation> <translation id="6338981933082930623">ဝဘ်ဆိုက်အားလုံးက ကြော်ငြာမှန်သမျှကို သင့်အား ပြနိုင်သည်</translation> @@ -5855,6 +5857,7 @@ <translation id="6735304988756581115">ကူကီးများ နှင့် အခြား ဆိုက် ဒေတာကို ပြရန်</translation> <translation id="6736243959894955139">လိပ်စာ</translation> <translation id="6737663862851963468">Kerberos လက်မှတ် ဖယ်ရှားရန်</translation> +<translation id="6738430949033571771">အကောင့် အတည်ပြုနေသည်...</translation> <translation id="6739923123728562974">ဒက်စ်တော့ ဖြတ်လမ်းလင့်ခ်ကို ပြရန်</translation> <translation id="6740234557573873150">ဆိုင်းငံ့ထား<ph name="FILE_NAME" /></translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />သင့်စီမံခန့်ခွဲသူ<ph name="END_LINK" /> က 'လုံခြုံစွာ ကြည့်ရှုခြင်း' ကို ပိတ်လိုက်သည်</translation> @@ -7673,6 +7676,8 @@ <translation id="8546306075665861288">ပုံ ကက်ရှ်</translation> <translation id="8546930481464505581">ထိတွေ့ဘားကို စိတ်ကြိုက်ပြင်ဆင်ရန်</translation> <translation id="8547013269961688403">မျက်နှာပြင်အပြည့် မှန်ဘီလူးကို ဖွင့်ရန်</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> ကို <ph name="MANAGER" /> က စီမံခန့်ခွဲနေသည်။ ဤအီးမေးလ်ကို အခြားအကောင့်အဖြစ် ထည့်သွင်း၍ မရပါ။<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" /> ကို သုံးရန် <ph name="DEVICE_TYPE" /> မှ အရင်ဆုံး ထွက်ပါ။ ထို့နောက် အကောင့်ဝင်ခြင်း ဖန်သားပြင်အောက်ခြေတွင် ‘ပုဂ္ဂိုလ် ထည့်ရန်’ ကို ရွေးပါ။<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">အပေါ်ဆုံးအတန်း ခလုတ်များ၏ အမူအကျင့်ကို ပြောင်းရန် 'ရှာဖွေရန်' ခလုတ်ကို ဖိထားပါ</translation> <translation id="8549316893834449916">သင့် Chromebook သို့ လက်မှတ်ထိုးဝင်ရန် Gmail၊ Drive၊ YouTube နှင့် အခြားအရာများအတွက် အသုံးပြုသော သင်၏ Google Account ကို အသုံးပြုရမည်။</translation> <translation id="8551388862522347954">လိုင်စင်များ</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index ddefc6f..17a5eba 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -3777,6 +3777,7 @@ <translation id="4648491805942548247">अपर्याप्त अनुमतिहरू</translation> <translation id="4650591383426000695">आफ्नो <ph name="DEVICE_TYPE" /> बाट आफ्नो फोन छुटाउनुहोस्</translation> <translation id="4651484272688821107">डेमो मोडका स्रोतहरूमार्फत अनलाइन कम्पोनेन्ट लोड गर्न सकिएन।</translation> +<translation id="4651921906638302153">यो खाता प्रयोग गरी साइन इन गर्न मिल्दैन</translation> <translation id="4652935475563630866">क्यामेराको सेटिङमा गरिएका परिवर्तन लागू गर्न Parallels Desktop बन्द गरेर फेरि खोल्नु पर्ने हुन्छ। अगाडि बढ्नका निम्ति Parallels Desktop बन्द गरेर फेरि खोल्नुहोस्।</translation> <translation id="4653405415038586100">Linux कन्फिगर गर्ने क्रममा त्रुटि भयो</translation> <translation id="465406513924180949">तपाईं आफूले वेबमा रहेका सपिङ कार्टहरूमा हालेका वस्तुहरू खोज्न आफूलाई मद्दत गर्ने कार्टहरू देख्दै हुनुहुन्छ। @@ -5432,6 +5433,7 @@ <translation id="6327785803543103246">वेब प्रोक्सीको स्वत:खोज</translation> <translation id="6331818708794917058">साइटहरूले MIDI यन्त्रहरूमा कनेक्ट हुने अनुमति माग्न सक्छन्</translation> <translation id="6333064448949140209">फाइल डिबग प्रक्रियाका लागि Google मा पठाइने छ</translation> +<translation id="6333170995003625229">तपाईंको इमेल ठेगाना वा पासवर्ड पुष्टि गर्न सकिएन। फेरि साइन इन गरी हेर्नुहोस्।</translation> <translation id="6335920438823100346">Linux सुरु गर्न <ph name="MANAGER" /> का अनुसार तपाईंले आफ्नो डेटा ब्याकअप गरी यो Chromebook रिसेट गरेर फ्याक्ट्री सेटिङमा लैजानु पर्ने हुन्छ।</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> ले ADB डिबग प्रक्रिया अफ गर्नुभएको छ। परिणामस्वरूप, अबको २४ घन्टामा तपाईंको <ph name="DEVICE_TYPE" /> रिसेट हुने छ। आफूले सुरक्षित राख्न चाहेका सबै फाइलहरू ब्याकअप गर्नुहोस्।</translation> <translation id="6338981933082930623">सबै साइटहरू तपाईंलाई जुनसुकै विज्ञापन देखाउन सक्छन्</translation> @@ -5840,6 +5842,7 @@ <translation id="6735304988756581115">कूकीहरू र अन्य साइट डाटा देखाउनुहोस्...</translation> <translation id="6736243959894955139">ठेगाना</translation> <translation id="6737663862851963468">Kerberos को टिकट हटाउनुहोस्</translation> +<translation id="6738430949033571771">खाता पुष्टि गरिँदै छ...</translation> <translation id="6739923123728562974">डेस्कटपको सर्टकट देखाउनुहोस्</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> रोकियो</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />तपाईंका प्रशासक<ph name="END_LINK" />ले सुरक्षित ब्राउजिङ निष्क्रिय पारेका छन्</translation> @@ -7658,6 +7661,8 @@ <translation id="8546306075665861288">छवि क्यास</translation> <translation id="8546930481464505581">टच बारलाई आफू अनुकूल पार्नुहोस्</translation> <translation id="8547013269961688403">फुल स्क्रिन म्याग्निफायर सक्षम पार्नुहोस्</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="MANAGER" /> <ph name="USER_EMAIL" /> व्यवस्थापन गर्नुहुन्छ। तपाईं यो इमेल ठेगानालाई अतिरिक्त खाताका रूपमा लिंक गर्न सक्नुहुन्न।<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />तपाईं <ph name="USER_EMAIL" /> प्रयोग गर्न चाहनुहुन्छ भने सर्वप्रथम आफ्नो <ph name="DEVICE_TYPE" /> बाट साइन आउट गर्नुहोस्। त्यसपछि लग इन स्क्रिनको पुछारमा गई व्यक्ति समावेश गर्नुहोस् नामक विकल्प चयन गर्नुहोस्।<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">शीर्ष-पङ्क्तिका कुञ्जीहरूको व्यवहार बदल्न खोज कुञ्जीलाई थिचिराख्नुहोस्</translation> <translation id="8549316893834449916">तपाईंले आफ्नो Chromebook मा साइन इन गर्न आफूले Gmail, Drive, YouTube तथा अन्य एपहरूमा प्रयोग गरेकै Google खाता प्रयोग गर्नु पर्ने हुन्छ।</translation> <translation id="8551388862522347954">लाइसेन्सहरू</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 77801579..32d05d9f 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -3787,6 +3787,7 @@ <translation id="4648491805942548247">Utilstrekkelige tillatelser</translation> <translation id="4650591383426000695">Koble telefonen fra <ph name="DEVICE_TYPE" /></translation> <translation id="4651484272688821107">Kunne ikke laste inn nettbasert komponent med ressurser for demomodus.</translation> +<translation id="4651921906638302153">Kan ikke logge på med denne kontoen</translation> <translation id="4652935475563630866">Endringen i kamerainnstillingen krever omstart av Parallels Desktop. Start Parallels Desktop på nytt for å fortsette.</translation> <translation id="4653405415038586100">Feil under konfigureringen av Linux</translation> <translation id="465406513924180949">Du ser handlekurver, slik at du enkelt kan komme tilbake til varer du har lagt igjen i handlekurver rundt om på nettet. @@ -5442,6 +5443,7 @@ <translation id="6327785803543103246">Automatisk oppdagelse av proxy-tjenere</translation> <translation id="6331818708794917058">Nettsteder kan be om å få koble til MIDI-enheter</translation> <translation id="6333064448949140209">Filen sendes til Google for feilsøking</translation> +<translation id="6333170995003625229">Kunne ikke bekrefte e-postadressen eller passordet. Prøv å logge på igjen.</translation> <translation id="6335920438823100346">Før du kan starte Linux, krever <ph name="MANAGER" /> at du sikkerhetskopierer dataene dine og tilbakestiller Chromebook til fabrikkstandard.</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> har slått av ADB-feilsøking. <ph name="DEVICE_TYPE" /> blir tilbakestilt om 24 timer. Sikkerhetskopiér eventuelle filer du vil ta vare på.</translation> <translation id="6338981933082930623">Alle nettsteder kan vise deg alle slags annonser</translation> @@ -5850,6 +5852,7 @@ <translation id="6735304988756581115">Vis informasjonskapsler og andre nettsteddata</translation> <translation id="6736243959894955139">Adresse</translation> <translation id="6737663862851963468">Fjern Kerberos-sak</translation> +<translation id="6738430949033571771">Bekrefter kontoen …</translation> <translation id="6739923123728562974">Vis skrivebordssnarvei</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> er satt på pause</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Administratoren din<ph name="END_LINK" /> har slått av Safe Browsing</translation> @@ -7668,6 +7671,8 @@ <translation id="8546306075665861288">Bildebuffer</translation> <translation id="8546930481464505581">Tilpass Touch Bar</translation> <translation id="8547013269961688403">Aktivér forstørrelse av hele skjermen</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> administreres av <ph name="MANAGER" />. Du kan ikke legge til denne e-postadressen som en tilleggskonto.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />For å bruke <ph name="USER_EMAIL" />, logg av <ph name="DEVICE_TYPE" /> først. Deretter velger du Legg til person nederst på påloggingsskjermen.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">Hold Søk-tasten inne for å endre funksjonene for tastene på øverste rad</translation> <translation id="8549316893834449916">Du bruker Google-kontoen din til å logge på Chromebook – den samme kontoen som du bruker for Gmail, Disk, YouTube med mer.</translation> <translation id="8551388862522347954">Lisenser</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 7916d25..120493a 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -872,6 +872,7 @@ <translation id="1813278315230285598">ਸੇਵਾਵਾਂ</translation> <translation id="18139523105317219">EDI ਪਾਰਟੀ ਨਾਮ</translation> <translation id="1815083418640426271">ਸਰਲ ਲਿਖਤ ਵਜੋਂ ਪੇਸਟ ਕਰੋ</translation> +<translation id="1815097521077272760">ਤੁਹਾਨੂੰ ਇਸ ਗੇਮ ਲਈ ਕੀ-ਬੋਰਡ ਕੰਟਰੋਲ ਨੂੰ ਅਜ਼ਮਾਉਣ ਵਾਸਤੇ ਸੱਦਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।</translation> <translation id="1815181278146012280">ਕਿਸੇ ਸਾਈਟ ਵੱਲੋਂ HID ਡੀਵਾਈਸਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਵੇਲੇ ਪੁੱਛੋ</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> ਹੋਰ...</translation> <translation id="1816036116994822943">ਕੀ-ਬੋਰਡ ਸਕੈਨ ਕਰਨ ਦੀ ਗਤੀ</translation> @@ -1006,6 +1007,7 @@ <translation id="1935303383381416800">ਤੁਹਾਡੇ ਟਿਕਾਣੇ ਨੂੰ ਦੇਖਣ ਦੀ ਇਜਾਜ਼ਤ ਹੈ</translation> <translation id="1936931585862840749">ਕਿੰਨੀਆਂ ਕਾਪੀਆਂ ਪ੍ਰਿੰਟ ਕਰਨੀਆਂ ਹਨ, ਇਹ ਦੱਸਣ ਲਈ ਕੋਈ ਨੰਬਰ ਵਰਤੋ (1 ਤੋਂ <ph name="MAX_COPIES" />)।</translation> <translation id="1937774647013465102"><ph name="ARCHITECTURE_CONTAINER" /> ਬਣਾਵਟ ਵਾਲੀ ਕਿਸਮ ਦੇ ਕੰਟੇਨਰ ਨੂੰ <ph name="ARCHITECTURE_DEVICE" /> ਦੀ ਬਣਾਵਟ ਵਾਲੇ ਡੀਵਾਈਸ ਨਾਲ ਆਯਾਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਤੁਸੀਂ ਇਸ ਕੰਟੇਨਰ ਨੂੰ ਕਿਸੇ ਵੱਖਰੇ ਡੀਵਾਈਸ ਵਿੱਚ ਮੁੜ-ਬਹਾਲ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ ਫਿਰ ਤੁਸੀਂ 'ਫ਼ਾਈਲਾਂ' ਐਪ ਵਿੱਚ ਇਸ ਕੰਟੇਨਰ ਈਮੇਜ ਨੂੰ ਖੋਲ੍ਹ ਕੇ ਇਸ ਅੰਦਰਲੀਆਂ ਫ਼ਾਈਲਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੇ ਹੋ।</translation> +<translation id="1938320257168860255">ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ। ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਹਾਡਾ ਫ਼ੋਨ ਨਜ਼ਦੀਕ ਹੈ, ਅਣਲਾਕ ਹੈ, ਅਤੇ ਬਲੂਟੁੱਥ ਅਤੇ ਵਾਈ-ਫਾਈ ਚਾਲੂ ਹਨ।</translation> <translation id="1938351510777341717">ਬਾਹਰੀ ਆਦੇਸ਼</translation> <translation id="1940546824932169984">ਕਨੈਕਟ ਕੀਤੀਆਂ ਡੀਵਾਈਸਾਂ</translation> <translation id="1941410638996203291">ਸ਼ੁਰੂੂਆਤ ਦਾ ਸਮਾਂ <ph name="TIME" /></translation> @@ -1088,6 +1090,7 @@ <translation id="2030455719695904263">ਟਰੈਕਪੈਡ</translation> <translation id="2031639749079821948">ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ ਹੈ</translation> <translation id="2031914984822377766">ਆਪਣੀਆਂ ਤਰਜੀਹੀ <ph name="LINK_BEGIN" />ਵੈੱਬਸਾਈਟ ਭਾਸ਼ਾਵਾਂ<ph name="LINK_END" /> ਸ਼ਾਮਲ ਕਰੋ। ਅਨੁਵਾਦਾਂ ਲਈ ਸੂਚੀ ਵਿਚਲੀ ਪ੍ਰਮੁੱਖ ਭਾਸ਼ਾ ਵਰਤੀ ਜਾਵੇਗੀ।</translation> +<translation id="2033758234986231162">ਤੁਹਾਡੇ ਫ਼ੋਨ ਨਾਲ ਕਨੈਕਸ਼ਨ ਬਰਕਰਾਰ ਨਹੀਂ ਰੱਖਿਆ ਜਾ ਸਕਦਾ। ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਹਾਡਾ ਫ਼ੋਨ ਨਜ਼ਦੀਕ ਹੈ, ਅਣਲਾਕ ਹੈ, ਅਤੇ ਬਲੂਟੁੱਥ ਅਤੇ ਵਾਈ-ਫਾਈ ਚਾਲੂ ਹਨ।</translation> <translation id="2034346955588403444">ਹੋਰ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="203574396658008164">ਲਾਕ ਸਕ੍ਰੀਨ ਤੋਂ ਨੋਟ-ਕਥਨ ਲੈਣਾਂ ਚਾਲੂ ਕਰੋ</translation> <translation id="2037445849770872822">ਨਿਗਰਾਨੀ ਦਾ ਸੈੱਟਅੱਪ ਇਸ Google ਖਾਤੇ ਲਈ ਕੀਤਾ ਗਿਆ ਹੈ। ਮਾਪਿਆਂ ਦੇ ਹੋਰ ਕੰਟਰੋਲ ਸੈੱਟਅੱਪ ਕਰਨ ਲਈ, 'ਜਾਰੀ ਰੱਖੋ' ਚੁਣੋ। @@ -3757,6 +3760,7 @@ <translation id="461661862154729886">ਊਰਜਾ ਦਾ ਸਰੋਤ</translation> <translation id="4617001782309103936">ਬਹੁਤ ਛੋਟਾ</translation> <translation id="4617270414136722281">ਐਕਸਟੈਂਸ਼ਨ ਵਿਕਲਪ</translation> +<translation id="4617880081511131945">ਕਨੈਕਸ਼ਨ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation> <translation id="4619564267100705184">ਆਪਣੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation> <translation id="4619615317237390068">ਹੋਰ ਡੀਵਾਈਸਾਂ ਤੋਂ ਟੈਬਾਂ</translation> <translation id="4620809267248568679">ਇਹ ਸੈਟਿੰਗ ਇੱਕ ਐਕਸਟੈਂਸ਼ਨ ਵੱਲੋਂ ਲਾਗੂ ਕੀਤੀ ਗਈ ਹੈ।</translation> @@ -3792,6 +3796,7 @@ <translation id="4648491805942548247">ਨਾਕਾਫ਼ੀ ਅਨੁਮਤੀਆਂ</translation> <translation id="4650591383426000695">ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਆਪਣੀ <ph name="DEVICE_TYPE" /> ਤੋਂ ਡਿਸਕਨੈਕਟ ਕਰੋ</translation> <translation id="4651484272688821107">ਡੈਮੋ ਮੋਡ ਸਰੋਤਾਂ ਨਾਲ ਆਨਲਾਈਨ ਕੰਪੋਨੈਂਟ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।</translation> +<translation id="4651921906638302153">ਇਸ ਖਾਤੇ ਨਾਲ ਸਾਈਨ-ਇਨ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation> <translation id="4652935475563630866">ਕੈਮਰਾ ਸੈਟਿੰਗ ਵਿੱਚ ਤਬਦੀਲੀ ਲਈ Parallels Desktop ਦਾ ਮੁੜ-ਲਾਂਚ ਹੋਣਾ ਲੋੜੀਂਦਾ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ Parallels Desktop ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ।</translation> <translation id="4653405415038586100">Linux ਦਾ ਸੰਰੂਪਣ ਕਰਨ ਵੇਲੇ ਗੜਬੜ ਹੋਈ</translation> <translation id="465406513924180949">ਤੁਸੀਂ ਉਨ੍ਹਾਂ ਕਾਰਟਾਂ ਨੂੰ ਦੇਖ ਰਹੇ ਹੋ ਜੋ ਵੈੱਬ 'ਤੇ ਖਰੀਦਦਾਰੀ ਕਾਰਟਾਂ ਵਿੱਚ ਤੁਹਾਡੀਆਂ ਬਾਕੀ ਆਈਟਮਾਂ 'ਤੇ ਆਸਾਨੀ ਨਾਲ ਵਾਪਸ ਜਾਣ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਕਰਦੇ ਹਨ। @@ -4049,6 +4054,7 @@ <translation id="4907306957610201395">ਇਜਾਜ਼ਤ ਸ਼੍ਰੇਣੀ</translation> <translation id="4908811072292128752">ਦੋ ਸਾਈਟਾਂ ਨੂੰ ਇੱਕੋ ਸਮੇਂ ਬ੍ਰਾਊਜ਼ ਕਰਨ ਲਈ ਕੋਈ ਨਵੀਂ ਟੈਬ ਖੋਲ੍ਹੋ</translation> <translation id="4909038193460299775">ਕਿਉਂਕਿ ਇਹ ਖਾਤਾ <ph name="DOMAIN" /> ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਇਸਲਈ ਤੁਹਾਡੇ ਬੁੱਕਮਾਰਕ, ਇਤਿਹਾਸ, ਪਾਸਵਰਡਾਂ, ਅਤੇ ਹੋਰ ਸੈਟਿੰਗਾਂ ਨੂੰ ਇਸ ਡੀਵਾਈਸ ਤੋਂ ਕਲੀਅਰ ਕੀਤਾ ਜਾਵੇਗਾ। ਹਾਲਾਂਕਿ, ਤੁਹਾਡਾ ਡਾਟਾ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਸਟੋਰ ਕੀਤਾ ਰਹੇਗਾ ਅਤੇ ਇਸ ਨੂੰ <ph name="BEGIN_LINK" />Google ਡੈਸ਼ਬੋਰਡ<ph name="END_LINK" /> 'ਤੇ ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।</translation> +<translation id="4912265719039610598">ਐਪ ਸਟ੍ਰੀਮਿੰਗ ਦੀ ਸੁਵਿਧਾ ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ।</translation> <translation id="4912643508233590958">ਨਿਸ਼ਕਿਰਿਆ ਵੇਕ ਅਪਸ</translation> <translation id="4915961947098019832">ਚਿੱਤਰਾਂ ਨੂੰ ਦਿਖਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਹੈ</translation> <translation id="4916542008280060967">ਕੀ ਸਾਈਟ ਨੂੰ <ph name="FILE_NAME" /> ਦਾ ਸੰਪਾਦਨ ਕਰਨ ਦੇਈਏ?</translation> @@ -5447,6 +5453,7 @@ <translation id="6327785803543103246">ਵੈੱਬ ਪ੍ਰੌਕਸੀ autodiscovery</translation> <translation id="6331818708794917058">ਸਾਈਟਾਂ MIDI ਡੀਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਲਈ ਪੁੱਛ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="6333064448949140209">ਫ਼ਾਈਲ ਡੀਬੱਗਿੰਗ ਲਈ Google ਨੂੰ ਭੇਜੀ ਜਾਵੇਗੀ</translation> +<translation id="6333170995003625229">ਤੁਹਾਡੇ ਈਮੇਲ ਪਤੇ ਜਾਂ ਪਾਸਵਰਡ ਦੀ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਦੁਬਾਰਾ ਸਾਈਨ-ਇਨ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="6335920438823100346">Linux ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਵਾਸਤੇ, <ph name="MANAGER" /> ਲਈ ਤੁਹਾਨੂੰ ਆਪਣੇ ਡਾਟੇ ਦਾ ਬੈਕਅੱਪ ਲੈਣ ਅਤੇ ਇਸ Chromebook ਨੂੰ ਫੈਕਟਰੀ ਸੈਟਿੰਗਾਂ 'ਤੇ ਰੀਸੈੱਟ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> ਨੇ ADB ਡੀਬੱਗਿੰਗ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। ਇਸ ਨਾਲ ਤੁਹਾਡੀ <ph name="DEVICE_TYPE" /> 24 ਘੰਟਿਆਂ ਵਿੱਚ ਰੀਸੈੱਟ ਹੋ ਜਾਵੇਗੀ। ਉਹਨਾਂ ਫ਼ਾਈਲਾਂ ਦਾ ਬੈਕਅੱਪ ਲਓ ਜਿਨ੍ਹਾਂ ਨੂੰ ਤੁਸੀਂ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ।</translation> <translation id="6338981933082930623">ਸਾਰੀਆਂ ਸਾਈਟਾਂ ਤੁਹਾਨੂੰ ਕੋਈ ਵੀ ਵਿਗਿਆਪਨ ਦਿਖਾ ਸਕਦੀਆਂ ਹਨ</translation> @@ -5858,6 +5865,7 @@ <translation id="6735304988756581115">ਕੁਕੀਜ਼ ਅਤੇ ਹੋਰ ਸਾਈਟ ਡਾਟਾ ਦਿਖਾਓ...</translation> <translation id="6736243959894955139">ਪਤਾ</translation> <translation id="6737663862851963468">Kerberos ਟਿਕਟ ਹਟਾਓ</translation> +<translation id="6738430949033571771">ਖਾਤੇ ਦੀ ਪੁਸ਼ਟੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ...</translation> <translation id="6739923123728562974">ਡੈਸਕਟਾਪ ਸ਼ਾਰਟਕੱਟ ਦਿਖਾਓ</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> ਰੋਕੀ ਗਈ</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ<ph name="END_LINK" /> ਨੇ ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ</translation> @@ -6880,6 +6888,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">ਆਪਣੀ ਡਿਸਪਲੇ ਦੇ ਹੱਦ-ਬੰਨਿਆਂ ਨੂੰ ਵਿਵਸਥਿਤ ਕਰੋ</translation> <translation id="7760004034676677601">ਕੀ ਇਹ ਉਹੀ ਸਟਾਰਟਅਪ ਸਫ਼ਾ ਹੈ ਜਿਸਦੀ ਤੁਸੀਂ ਆਸ ਕਰ ਰਹੇ ਸੀ?</translation> +<translation id="7762024824096060040">ਇਹ ਖਾਤਾ ਨਹੀਂ ਵਰਤਿਆ ਜਾ ਸਕਦਾ</translation> <translation id="7762463735017901568">ਸੂਚਨਾ ਸਿੰਕ ਕਰਨ ਦੀ ਸੁਵਿਧਾ ਨੂੰ ਤੁਹਾਡੇ ਫ਼ੋਨ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ</translation> <translation id="7764225426217299476">ਪਤਾ ਜੋੜੋ</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> ਤੋਂ <ph name="DOWNLOAD_RECEIVED" /></translation> @@ -7049,6 +7058,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> ਸਕਿੰਟ</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> ਵੱਲੋਂ <ph name="FILENAME" /> ਨੂੰ ਦੇਖਿਆ ਜਾ ਸਕਦਾ ਹੈ</translation> <translation id="7920482456679570420">ਉਹ ਸ਼ਬਦ ਸ਼ਾਮਲ ਕਰੋ ਜਿੰਨ੍ਹਾਂ ਲਈ ਤੁਸੀਂ ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚ ਨੂੰ ਛੱਡਣਾ ਚਾਹੁੰਦੇ ਹੋ</translation> +<translation id="7921347341284348270">ਤੁਸੀਂ ਇਸ ਪ੍ਰਬੰਧਿਤ ਕੀਤੇ ਖਾਤੇ 'ਤੇ ਆਪਣੇ ਫ਼ੋਨ ਦੀਆਂ ਸੂਚਨਾਵਾਂ ਨਹੀਂ ਦੇਖ ਸਕਦੇ। ਕਿਸੇ ਵੱਖਰੇ ਖਾਤੇ ਨਾਲ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation> <translation id="7922935920104868876">ਇਨਕੋਗਨਿਟੋ ਮੋਡ ਵਿੱਚ ਤੀਜੀ-ਧਿਰ ਦੀਆਂ ਕੁਕੀਜ਼ ਨੂੰ ਬਲਾਕ ਕਰਨ ਬਾਰੇ ਵੇਰਵੇ ਦਿਖਾਓ</translation> <translation id="7923564237306226146">Linux ਅੱਪਗ੍ਰੇਡ ਪੂਰਾ ਹੋਇਆ</translation> <translation id="7924358170328001543">ਪੋਰਟ ਨੂੰ ਅੱਗੇ ਭੇਜਣ ਵੇਲੇ ਗੜਬੜ</translation> @@ -7673,6 +7683,8 @@ <translation id="8546306075665861288">ਚਿੱਤਰ ਕੈਸ਼ੇ</translation> <translation id="8546930481464505581">ਸਪੱਰਸ਼ ਪੱਟੀ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ</translation> <translation id="8547013269961688403">ਪੂਰੀ-ਸਕ੍ਰੀਨ ਵਿਸਤਾਰਕ ਚਾਲੂ ਕਰੋ</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> ਦਾ ਪ੍ਰਬੰਧਨ <ph name="MANAGER" /> ਵੱਲੋਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਤੁਸੀਂ ਇਸ ਈਮੇਲ ਨੂੰ ਵਧੀਕ ਖਾਤੇ ਵਜੋਂ ਸ਼ਾਮਲ ਨਹੀਂ ਕਰ ਸਕਦੇ।<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" /> ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਪਹਿਲਾਂ ਆਪਣੇ <ph name="DEVICE_TYPE" /> ਤੋਂ ਸਾਈਨ-ਆਊਟ ਕਰੋ। ਫਿਰ ਲੌਗ-ਇਨ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਦਿੱਤੇ 'ਵਿਅਕਤੀ ਸ਼ਾਮਲ ਕਰੋ' ਵਿਕਲਪ ਨੂੰ ਚੁਣੋ।<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">ਚੋਟੀ ਦੀ ਕਤਾਰ ਦੀਆਂ ਕੁੰਜੀਆਂ ਦੇ ਵਤੀਰੇ ਦੀ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਖੋਜ ਕੁੰਜੀ ਨੂੰ ਦਬਾਈ ਰੱਖੋ</translation> <translation id="8549316893834449916">ਤੁਸੀਂ ਆਪਣੀ Chromebook ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਆਪਣੇ Google ਖਾਤੇ ਦੀ ਵਰਤੋਂ ਕਰੋਗੇ - ਓਹੀ ਖਾਤਾ ਜਿਸਦੀ ਵਰਤੋਂ ਤੁਸੀਂ Gmail, Drive, YouTube ਅਤੇ ਹੋਰਾਂ ਲਈ ਕਰਦੇ ਹੋ।</translation> <translation id="8551388862522347954">ਲਸੰਸ</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 1b933a7..f8ee04f 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -872,6 +872,7 @@ <translation id="1813278315230285598">Serviços</translation> <translation id="18139523105317219">Nome da Parte EDI</translation> <translation id="1815083418640426271">Colar como texto sem formatação</translation> +<translation id="1815097521077272760">Você foi convidado para testar os controles de teclado para este jogo.</translation> <translation id="1815181278146012280">Perguntar quando um site quiser acessar dispositivos HID</translation> <translation id="181577467034453336">Mais <ph name="NUMBER_OF_VIEWS" />…</translation> <translation id="1816036116994822943">Velocidade da leitura do teclado</translation> @@ -1006,6 +1007,7 @@ <translation id="1935303383381416800">Permitir o acesso à localização</translation> <translation id="1936931585862840749">Use um número para indicar quantas cópias serão impressas (1 a <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Não é possível importar o tipo de arquitetura de contêiner <ph name="ARCHITECTURE_CONTAINER" /> com este dispositivo, que é <ph name="ARCHITECTURE_DEVICE" />. Tente restaurar esse contêiner em um dispositivo diferente ou acesse os arquivos que estão dentro desta imagem do contêiner abrindo-os no app Arquivos.</translation> +<translation id="1938320257168860255">Algo deu errado. Confira se o smartphone está por perto, desbloqueado e com o Bluetooth e o Wi-Fi ativados.</translation> <translation id="1938351510777341717">Comando externo</translation> <translation id="1940546824932169984">Dispositivos conectados</translation> <translation id="1941410638996203291">Horário de início: <ph name="TIME" /></translation> @@ -1088,6 +1090,7 @@ <translation id="2030455719695904263">Trackpad</translation> <translation id="2031639749079821948">Sua senha foi salva na sua Conta do Google</translation> <translation id="2031914984822377766">Adicione seus <ph name="LINK_BEGIN" />idiomas preferidos para sites<ph name="LINK_END" />. O primeiro idioma na lista será usado nas traduções.</translation> +<translation id="2033758234986231162">Não é possível manter uma conexão com o smartphone. Confira se o smartphone está por perto, desbloqueado e com o Bluetooth e o Wi-Fi ativados.</translation> <translation id="2034346955588403444">Adicionar outra rede Wi-Fi</translation> <translation id="203574396658008164">Ativar anotações a partir da tela de bloqueio</translation> <translation id="2037445849770872822">A supervisão está configurada para esta Conta do Google. Para configurar mais controles dos pais, selecione "Continuar". @@ -3759,6 +3762,7 @@ <translation id="461661862154729886">Fonte de energia</translation> <translation id="4617001782309103936">Muito curto</translation> <translation id="4617270414136722281">Opções de extensão</translation> +<translation id="4617880081511131945">Não é possível estabelecer uma conexão</translation> <translation id="4619564267100705184">Confirmar sua identidade</translation> <translation id="4619615317237390068">Guias de outros dispositivos</translation> <translation id="4620809267248568679">Esta configuração é aplicada por uma extensão.</translation> @@ -4052,6 +4056,7 @@ <translation id="4907306957610201395">Categoria de permissão</translation> <translation id="4908811072292128752">Abra uma nova guia para navegar em dois sites de uma vez</translation> <translation id="4909038193460299775">Como essa conta é gerenciada por <ph name="DOMAIN" />, seus favoritos, histórico, senhas e outras configurações serão excluídos desse dispositivo. No entanto, seus dados permanecerão armazenados na sua Conta do Google e poderão ser gerenciados no <ph name="BEGIN_LINK" />Painel do Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">O espelhamento de apps foi desativado pelo administrador do smartphone.</translation> <translation id="4912643508233590958">Ativações do estado ocioso</translation> <translation id="4915961947098019832">Permitir a exibição de imagens</translation> <translation id="4916542008280060967">Permitir que o site edite <ph name="FILE_NAME" />?</translation> @@ -6885,6 +6890,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ajuste os limites da sua tela</translation> <translation id="7760004034676677601">Esta é a página de inicialização que você esperava?</translation> +<translation id="7762024824096060040">Não é possível usar esta conta</translation> <translation id="7762463735017901568">A sincronização de notificações foi desativada pelo administrador do smartphone</translation> <translation id="7764225426217299476">Adicionar endereço</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> de <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7055,6 +7061,7 @@ <translation id="7919210519031517829"><ph name="DURATION" />s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> pode ver <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Adicione palavras a serem puladas pela verificação ortográfica</translation> +<translation id="7921347341284348270">Não é possível acessar as notificações do smartphone nesta conta gerenciada. Tente novamente com outra conta. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Mostrar detalhes sobre o bloqueio de cookies de terceiros no modo de navegação anônima</translation> <translation id="7923564237306226146">Upgrade do Linux concluído</translation> <translation id="7924358170328001543">Erro ao encaminhar a porta</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index da7e8bb..29ee513 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -860,6 +860,7 @@ <translation id="1813278315230285598">Serviços</translation> <translation id="18139523105317219">Nome da parte EDI</translation> <translation id="1815083418640426271">Colar como Texto Simples</translation> +<translation id="1815097521077272760">Recebeu um convite para experimentar a funcionalidade de controlo do teclado para este jogo.</translation> <translation id="1815181278146012280">Perguntar quando um site pretender aceder a dispositivos HID</translation> <translation id="181577467034453336">Mais <ph name="NUMBER_OF_VIEWS" />…</translation> <translation id="1816036116994822943">Velocidade de análise do teclado</translation> @@ -993,6 +994,7 @@ <translation id="1935303383381416800">Com autorização para ver a sua localização</translation> <translation id="1936931585862840749">Utilize um número para indicar as cópias a imprimir (1 a <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Não é possível importar o tipo de arquitetura de contentor <ph name="ARCHITECTURE_CONTAINER" /> com este dispositivo cuja arquitetura é <ph name="ARCHITECTURE_DEVICE" />. Pode tentar restaurar este contentor para um dispositivo diferente ou pode aceder aos ficheiros contidos na imagem deste contentor através da aplicação Ficheiros.</translation> +<translation id="1938320257168860255">Algo correu mal. Certifique-se de que o telemóvel está próximo, desbloqueado e com o Bluetooth e o Wi-Fi ativados.</translation> <translation id="1938351510777341717">Comando externo</translation> <translation id="1940546824932169984">Dispositivos associados</translation> <translation id="1941410638996203291">Hora de início: <ph name="TIME" /></translation> @@ -1075,6 +1077,7 @@ <translation id="2030455719695904263">Trackpad</translation> <translation id="2031639749079821948">A sua palavra-passe foi guardada na sua Conta Google.</translation> <translation id="2031914984822377766">Adicione os seus <ph name="LINK_BEGIN" />idiomas de Website<ph name="LINK_END" /> preferidos. O idioma principal da lista será utilizado para as traduções.</translation> +<translation id="2033758234986231162">Não é possível manter uma ligação com o seu telemóvel. Certifique-se de que o telemóvel está próximo, desbloqueado e com o Bluetooth e o Wi-Fi ativados.</translation> <translation id="2034346955588403444">Adicionar outra rede Wi-Fi</translation> <translation id="203574396658008164">Ativar a opção de tirar notas a partir do ecrã de bloqueio</translation> <translation id="2037445849770872822">A supervisão está configurada para esta Conta Google. Para configurar mais controlos parentais, selecione Continuar. @@ -3742,6 +3745,7 @@ <translation id="461661862154729886">Fonte de energia</translation> <translation id="4617001782309103936">Muito curto</translation> <translation id="4617270414136722281">Opções de extensão</translation> +<translation id="4617880081511131945">Não é possível estabelecer ligação</translation> <translation id="4619564267100705184">Validar identidade</translation> <translation id="4619615317237390068">Separadores de outros dispositivos</translation> <translation id="4620809267248568679">Esta definição é gerida por uma extensão.</translation> @@ -4034,6 +4038,7 @@ <translation id="4907306957610201395">Categoria de autorizações</translation> <translation id="4908811072292128752">Abra um novo separador para navegar em dois sites em simultâneo</translation> <translation id="4909038193460299775">Como esta conta é gerida por <ph name="DOMAIN" />, os seus marcadores, histórico, palavras-passe e outras definições serão apagados deste dispositivo. No entanto, os seus dados continuarão armazenados na sua Conta Google e podem ser geridos no <ph name="BEGIN_LINK" />Painel de Controlo Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">A funcionalidade de streaming de apps foi desativada pelo administrador do telemóvel.</translation> <translation id="4912643508233590958">Reativações após inatividade</translation> <translation id="4915961947098019832">Com autorização para mostrar imagens</translation> <translation id="4916542008280060967">Permitir que o site edite o ficheiro <ph name="FILE_NAME" />?</translation> @@ -6863,6 +6868,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ajustar os limites do ecrã</translation> <translation id="7760004034676677601">É esta a página inicial de que estava à espera?</translation> +<translation id="7762024824096060040">Não é possível usar esta conta</translation> <translation id="7762463735017901568">A sincronização de notificações foi desativada pelo administrador do telemóvel</translation> <translation id="7764225426217299476">Adicionar endereço</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> de <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7033,6 +7039,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> pode ver <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Adicione palavras que pretende que a verificação ortográfica ignore.</translation> +<translation id="7921347341284348270">Não pode ver as notificações do telemóvel nesta conta gerida. Tente novamente com uma conta diferente. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Mostrar detalhes sobre como bloquear cookies de terceiros na Navegação anónima</translation> <translation id="7923564237306226146">Atualização do Linux concluída</translation> <translation id="7924358170328001543">Ocorreu um erro no encaminhamento de porta.</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 3f30cb86..cd2ccc1 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -862,6 +862,7 @@ <translation id="1813278315230285598">Службы</translation> <translation id="18139523105317219">Имя стороны EDI</translation> <translation id="1815083418640426271">Вставить как обычный текст</translation> +<translation id="1815097521077272760">Позволяет управлять действиями в этой игре с помощью клавиатуры.</translation> <translation id="1815181278146012280">Запрашивать разрешение на доступ сайтов к HID-устройствам</translation> <translation id="181577467034453336">Ещё <ph name="NUMBER_OF_VIEWS" /></translation> <translation id="1816036116994822943">Скорость сканирования клавиатуры</translation> @@ -995,6 +996,7 @@ <translation id="1935303383381416800">Разрешить сайтам определять ваше местоположение</translation> <translation id="1936931585862840749">Укажите количество копий для печати, используя цифры (от 1 до <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Не удалось импортировать тип архитектуры контейнера <ph name="ARCHITECTURE_CONTAINER" /> на это устройство (<ph name="ARCHITECTURE_DEVICE" />). Вы можете попробовать восстановить этот контейнер на другом устройстве или получить доступ к файлам, открыв образ контейнера в приложении "Файлы".</translation> +<translation id="1938320257168860255">Произошла ошибка. Убедитесь, что телефон находится рядом, разблокирован и на нем включены функции Bluetooth и Wi-Fi.</translation> <translation id="1938351510777341717">Внешняя клавиша Command</translation> <translation id="1940546824932169984">Подключенные устройства</translation> <translation id="1941410638996203291">Время начала: <ph name="TIME" /></translation> @@ -1077,6 +1079,7 @@ <translation id="2030455719695904263">Сенсорная панель</translation> <translation id="2031639749079821948">Пароль сохранен в вашем аккаунте Google.</translation> <translation id="2031914984822377766">Добавьте <ph name="LINK_BEGIN" />языки для сайтов<ph name="LINK_END" />. Для перевода будет использоваться первый язык в списке.</translation> +<translation id="2033758234986231162">Подключение к телефону прервано. Убедитесь, что он находится рядом, разблокирован и на нем включены функции Bluetooth и Wi-Fi.</translation> <translation id="2034346955588403444">Добавить сеть Wi-Fi</translation> <translation id="203574396658008164">Делать заметки, когда экран заблокирован</translation> <translation id="2037445849770872822">Для этого аккаунта Google настроен родительский контроль. Чтобы изменить некоторые параметры, нажмите "Продолжить". @@ -3742,6 +3745,7 @@ <translation id="461661862154729886">Источник электропитания</translation> <translation id="4617001782309103936">Слишком короткий</translation> <translation id="4617270414136722281">Параметры расширений</translation> +<translation id="4617880081511131945">Не удается подключиться</translation> <translation id="4619564267100705184">Подтвердить личность</translation> <translation id="4619615317237390068">Вкладки с других устройств</translation> <translation id="4620809267248568679">Этот параметр определяется расширением.</translation> @@ -4034,6 +4038,7 @@ <translation id="4907306957610201395">Категория разрешения</translation> <translation id="4908811072292128752">Откройте новую вкладку, чтобы перейти на другой сайт, не закрывая предыдущий</translation> <translation id="4909038193460299775">Ваш аккаунт управляется доменом <ph name="DOMAIN" />. Все закладки, история, пароли и настройки будут удалены с устройства, однако данные в аккаунте Google сохранятся. Вы можете просмотреть и изменить их в <ph name="BEGIN_LINK" />Личном кабинете Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Стриминг приложений отключен администратором телефона</translation> <translation id="4912643508233590958">Переходы в активный режим</translation> <translation id="4915961947098019832">Разрешить сайтам показывать изображения</translation> <translation id="4916542008280060967">Разрешить сайту изменять файл "<ph name="FILE_NAME" />"?</translation> @@ -6868,6 +6873,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Настройте границы экрана</translation> <translation id="7760004034676677601">Другая стартовая страница?</translation> +<translation id="7762024824096060040">Не удается использовать этот аккаунт</translation> <translation id="7762463735017901568">Синхронизация уведомлений отключена администратором телефона</translation> <translation id="7764225426217299476">Добавить адрес</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> с сайта <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7037,6 +7043,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> сек.</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> может просматривать файл "<ph name="FILENAME" />".</translation> <translation id="7920482456679570420">Добавьте ниже слова, правописание которых не нужно проверять.</translation> +<translation id="7921347341284348270">Вы не можете просматривать уведомления с телефона в этом управляемом аккаунте. Повторите попытку, используя другой аккаунт. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Подробнее о блокировке сторонних файлов cookie в режиме инкогнито</translation> <translation id="7923564237306226146">Обновление Linux завершено</translation> <translation id="7924358170328001543">При переадресации порта произошла ошибка.</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index ecc7ad86..bb7ed41 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -860,6 +860,7 @@ <translation id="1813278315230285598">සේවා</translation> <translation id="18139523105317219">EDI සාද නාමය</translation> <translation id="1815083418640426271">සාමාන්ය පෙළ ලෙස අලවන්න</translation> +<translation id="1815097521077272760">මෙම ක්රීඩාව සඳහා යතුරු පුවරු පාලනය උත්සාහ කිරීමට ඔබට ආරාධනා කර ඇත.</translation> <translation id="1815181278146012280">වෙබ් අඩවියකට HID උපාංග වෙත පිවිසීමට අවශ්ය විටදී අසන්න</translation> <translation id="181577467034453336">තව <ph name="NUMBER_OF_VIEWS" />...</translation> <translation id="1816036116994822943">යතුරු පුවරු ස්කෑන් කිරීමේ වේගය</translation> @@ -994,6 +995,7 @@ <translation id="1935303383381416800">ඔබගේ ස්ථානය බැලීමට ඉඩ දේ</translation> <translation id="1936931585862840749">මුද්රණ කරන පිටපත් ගණන දැක්වීමට සංඛ්යාවක් භාවිත කරන්න (1 සිට <ph name="MAX_COPIES" /> දක්වා).</translation> <translation id="1937774647013465102"><ph name="ARCHITECTURE_DEVICE" /> වන මෙම උපාංගය සමඟ <ph name="ARCHITECTURE_CONTAINER" /> භාජන නිර්මාණශිල්ප වර්ගය ආයාත කළ නොහැක. ඔබට මෙම භාජනය වෙනත් උපාංගයකට ප්රතිසාධන කිරීමට උත්සාහ කළ හැක, නැති නම් ඔබට ගොනු යෙදුම විවෘත කිරීමෙන් මෙම භාජන රූපය තුළ ගොනු වෙත ප්රවේශ විය හැක.</translation> +<translation id="1938320257168860255">යම් දෙයක් වැරදිණි. ඔබගේ දුරකථනය ළඟ තිබෙන බව, අගුලු හැර ඇති බව, බ්ලූටූත් සහ Wi-Fi ක්රියාත්මක කර ඇති බව සහතික කර ගන්න.</translation> <translation id="1938351510777341717">බාහිර විධානය</translation> <translation id="1940546824932169984">සම්බන්ධ කළ උපාංග</translation> <translation id="1941410638996203291">ආරම්භක වේලාව <ph name="TIME" /></translation> @@ -1076,6 +1078,7 @@ <translation id="2030455719695904263">ට්රැක්පෑඩ්</translation> <translation id="2031639749079821948">ඔබේ මුරපදය ඔබේ Google ගිණුම තුළ සුරැකේ</translation> <translation id="2031914984822377766">ඔබ වඩා කැමති <ph name="LINK_BEGIN" />වෙබ් අඩවි භාෂා<ph name="LINK_END" /> එක් කරන්න ලැයිස්තුවේ ඉහළම භාෂාව පරිවර්තන සඳහා භාවිත කරනු ඇත.</translation> +<translation id="2033758234986231162">ඔබගේ දුරකථනය සමඟ සම්බන්ධතාවක් පවත්වා ගත නොහැකිය. ඔබගේ දුරකථනය ළඟ තිබෙන බව, අගුලු හැර ඇති බව, බ්ලූටූත් සහ Wi-Fi ක්රියාත්මක කර ඇති බව සහතික කර ගන්න.</translation> <translation id="2034346955588403444">වෙනත් WiFi ජාල එක් කරන්න</translation> <translation id="203574396658008164">අගුළු තිරයෙන් සටහන්-ගැනීම සබල කරන්න</translation> <translation id="2037445849770872822">මෙම Google ගිණුම සඳහා අධීක්ෂණය සකසා ඇත. තවත් මාපිය පාලන සැකසීමට, 'ඉදිරියට යන්න' තෝරන්න. @@ -3745,6 +3748,7 @@ <translation id="461661862154729886">බලශක්ති මූලාශ්රය</translation> <translation id="4617001782309103936">ඉතා කෙටියි</translation> <translation id="4617270414136722281">දිගු විකල්ප</translation> +<translation id="4617880081511131945">සම්බන්ධතාව ස්ථාපිත කළ නොහැකිය</translation> <translation id="4619564267100705184">ඒ ඔබ බව සත්යාපනය කරන්න</translation> <translation id="4619615317237390068">වෙනත් උපාංග වෙතින් ටැබ</translation> <translation id="4620809267248568679">මෙම සැකසුම දිගුවක් මගින් බලකර ඇත.</translation> @@ -4037,6 +4041,7 @@ <translation id="4907306957610201395">අවසර ප්රවර්ගය</translation> <translation id="4908811072292128752">අඩවි දෙකක් එකවර බ්රවුස් කිරීම සඳහා නව පටිත්තක් විවෘත කරන්න</translation> <translation id="4909038193460299775">මෙම ගිණුම <ph name="DOMAIN" /> මගින් කළමනාකරණය කරන නිසා, ඔබගේ පිටුසන්, ඉතිහාසය, මුරපද, සහ අනෙකුත් සැකසීම් මෙම උපාංගය වෙතින් හිස් කරනු ඇත. කෙසේ වෙතත්, ඔබගේ දත්ත ඔබගේ Google ගිණුමේ ගබඩා කර තිබෙනු ඇති අතර <ph name="BEGIN_LINK" />Google උපකරණ පුවරුව<ph name="END_LINK" /> තුළ කළමනාකරණය කළ හැකිය.</translation> +<translation id="4912265719039610598">යෙදුම් ප්රවාහය ඔබගේ දුරකථනයේ පරිපාලක විසින් අබල කර ඇත.</translation> <translation id="4912643508233590958">අක්රීය අවධි වීම්</translation> <translation id="4915961947098019832">රූප පෙන්වීමට ඉඩ දේ</translation> <translation id="4916542008280060967">වෙබ් අඩවියට <ph name="FILE_NAME" /> සංස්කරණ කිරීමට ඉඩ දෙන්නේද?</translation> @@ -6866,6 +6871,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">ඔබේ සංදර්ශකයේ මායිම් සීරුමාරු කරන්න</translation> <translation id="7760004034676677601">මෙය ඔබ බලාපොරොත්තු වූ ආරම්භක පිටුව ද?</translation> +<translation id="7762024824096060040">මෙම ගිණුම භාවිත කළ නොහැකිය</translation> <translation id="7762463735017901568">ඔබගේ දුරකථනයේ පරිපාලක විසින් දැනුම්දීම් සමමුහුර්ත කිරීම අබල කර ඇත</translation> <translation id="7764225426217299476">ලිපිනය එක් කරන්න</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> වෙතින් <ph name="DOWNLOAD_RECEIVED" /></translation> @@ -7034,6 +7040,7 @@ <translation id="7919210519031517829">ත<ph name="DURATION" /></translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> හට <ph name="FILENAME" /> බැලිය හැක</translation> <translation id="7920482456679570420">ඔබට අක්ෂර වින්යාස පරීක්ෂාව විසින් මග හරිනු ලැබීමට අවශ්ය වචන එක් කරන්න</translation> +<translation id="7921347341284348270">ඔබට මෙම කළමනාකරණය කළ ගිණුමේ ඔබගේ දුරකථනයේ දැනුම්දීම් බැලිය නොහැකිය. වෙනත් ගිණුමක් සමඟ නැවත උත්සාහ කරන්න. <ph name="LINK_BEGIN" />තව දැන ගන්න<ph name="LINK_END" /></translation> <translation id="7922935920104868876">අප්රසිද්ධ ප්රකාරය තුළ තෙවන පාර්ශ්ව කුකි අවහිර කිරීම පිළිබඳ විස්තර පෙන්වන්න</translation> <translation id="7923564237306226146">Linux උත්ශ්රේණි කිරීම සම්පූර්ණයි</translation> <translation id="7924358170328001543">තොට යොමු කිරීමේ දෝෂයයි</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index f44ded6c..c3d2ebd4 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -874,6 +874,7 @@ <translation id="1813278315230285598">Storitve</translation> <translation id="18139523105317219">Ime skupine EDI</translation> <translation id="1815083418640426271">Prilepi kot navadno besedilo</translation> +<translation id="1815097521077272760">Povabljeni ste bili k upravljanju te igre s tipkovnico.</translation> <translation id="1815181278146012280">Vprašaj, ko želi spletno mesto dostopati do naprav HID</translation> <translation id="181577467034453336">Še <ph name="NUMBER_OF_VIEWS" /> ...</translation> <translation id="1816036116994822943">Hitrost iskanja po tipkovnici</translation> @@ -1008,6 +1009,7 @@ <translation id="1935303383381416800">Dovoljen je ogled lokacije</translation> <translation id="1936931585862840749">Vnesite število izvodov, ki jih želite natisniti (od 1 do <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Vsebnika z arhitekturo tipa <ph name="ARCHITECTURE_CONTAINER" /> ni mogoče uvoziti v to napravo z arhitekturo <ph name="ARCHITECTURE_DEVICE" />. Poskusite lahko obnoviti ta vsebnik v drugi napravi ali dostopate do datotek v sliki vsebnika tako, da jo odprete v aplikaciji Datoteke.</translation> +<translation id="1938320257168860255">Prišlo je do napake. Poskrbite, da je telefon v bližini, odklenjen in ima vklopljeno povezavo Bluetooth ter omrežje Wi-Fi.</translation> <translation id="1938351510777341717">Zunanji ukaz</translation> <translation id="1940546824932169984">Povezane naprave</translation> <translation id="1941410638996203291">Začetni čas: <ph name="TIME" /></translation> @@ -1090,6 +1092,7 @@ <translation id="2030455719695904263">Sledilna ploščica</translation> <translation id="2031639749079821948">Geslo je shranjeno v računu Google</translation> <translation id="2031914984822377766">Dodajte <ph name="LINK_BEGIN" />prednostne jezike spletnih mest<ph name="LINK_END" />. Prvouvrščeni jezik na seznamu bo uporabljen za prevode.</translation> +<translation id="2033758234986231162">Povezave s telefonom ni mogoče ohraniti. Poskrbite, da je telefon v bližini, odklenjen in ima vklopljeno povezavo Bluetooth ter omrežje Wi-Fi.</translation> <translation id="2034346955588403444">Dodaj drugo omrežje Wi-Fi</translation> <translation id="203574396658008164">Omogoči ustvarjanje zapiskov na zaklenjenem zaslonu</translation> <translation id="2037445849770872822">Za ta račun Google je nastavljen nadzor. Če želite nastaviti več starševskega nadzora, izberite »Naprej«. @@ -3760,6 +3763,7 @@ <translation id="461661862154729886">Vir energije</translation> <translation id="4617001782309103936">Prekratko</translation> <translation id="4617270414136722281">Možnosti razširitev</translation> +<translation id="4617880081511131945">Povezave ni mogoče vzpostaviti</translation> <translation id="4619564267100705184">Potrditev identitete</translation> <translation id="4619615317237390068">Zavihki iz drugih naprav</translation> <translation id="4620809267248568679">To nastavitev je vsilila razširitev.</translation> @@ -4052,6 +4056,7 @@ <translation id="4907306957610201395">Kategorija dovoljenj</translation> <translation id="4908811072292128752">Odprite nov zavihek, če želite brskati na dveh spletnih mestih hkrati</translation> <translation id="4909038193460299775">Ta račun upravlja domena <ph name="DOMAIN" />, zato bodo vaši zaznamki, zgodovina, gesla in druge nastavitve izbrisani iz te naprave. Vaši podatki bodo kljub temu še naprej shranjeni v Google Računu in jih bo mogoče upravljati na <ph name="BEGIN_LINK" />Google Nadzorni plošči<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Skrbnik telefona je onemogočil pretočno izvajanje aplikacij.</translation> <translation id="4912643508233590958">Prekinitve nedejavnosti</translation> <translation id="4915961947098019832">Dovoljeno je prikazovanje slik</translation> <translation id="4916542008280060967">Želite spletnemu mestu omogočiti, da ureja datoteko <ph name="FILE_NAME" />?</translation> @@ -6888,6 +6893,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Prilagodite meje zaslona</translation> <translation id="7760004034676677601">Ali je to začetna stran, ki ste jo pričakovali?</translation> +<translation id="7762024824096060040">Tega računa ni mogoče uporabiti</translation> <translation id="7762463735017901568">Skrbnik telefona je onemogočil sinhroniziranje obvestil</translation> <translation id="7764225426217299476">Dodaj naslov</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> iz <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7058,6 +7064,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176">Spletno mesto <ph name="ORIGIN" /> si lahko ogleda datoteko <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Dodajte besede, za katere želite, da jih preverjanje črkovanja preskoči</translation> +<translation id="7921347341284348270">V tem upravljanem računu si ni mogoče ogledati obvestil telefona. Poskusite z drugim računom. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Prikaži podrobnosti o blokiranju piškotkov drugih mest v anonimnem načinu</translation> <translation id="7923564237306226146">Nadgradnja Linuxa je dokončana</translation> <translation id="7924358170328001543">Napaka pri posredovanju vrat</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 87c30d9..7caa8e5f 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -857,6 +857,7 @@ <translation id="1813278315230285598">Shërbimet</translation> <translation id="18139523105317219">Emri i palës EDI</translation> <translation id="1815083418640426271">Ngjite si tekst të thjeshtë</translation> +<translation id="1815097521077272760">Je ftuar të provosh kontrollin e tastierës për këtë lojë.</translation> <translation id="1815181278146012280">Pyet kur një sajt dëshiron të ketë qasje te pajisjet HID</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> të tjera...</translation> <translation id="1816036116994822943">Shpejtësia e skanimit të tastierës</translation> @@ -990,6 +991,7 @@ <translation id="1935303383381416800">Lejohen të shikojnë vendndodhjen tënde</translation> <translation id="1936931585862840749">Përdor një numër për të treguar sa kopje do të printohen (1 deri në <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Nuk mund të importojë llojin e arkitekturës së kontejnerit <ph name="ARCHITECTURE_CONTAINER" /> me këtë pajisje që është <ph name="ARCHITECTURE_DEVICE" />. Mund të provosh ta restaurosh këtë kontejner në një pajisje tjetër ose mund të kesh qasje te skedarët brenda këtij imazhi kontejneri duke hapur aplikacionin "Skedarët".</translation> +<translation id="1938320257168860255">Ndodhi një gabim. Sigurohu që telefoni yt të jetë pranë, i shkyçur dhe që Bluetooth-i dhe Wi-Fi të jenë të aktivizuar.</translation> <translation id="1938351510777341717">Komandë e jashtme</translation> <translation id="1940546824932169984">Pajisjet e lidhura</translation> <translation id="1941410638996203291">Koha e nisjes: <ph name="TIME" /></translation> @@ -1072,6 +1074,7 @@ <translation id="2030455719695904263">Blloku i prekjes</translation> <translation id="2031639749079821948">Fjalëkalimi yt është ruajtur në "Llogarinë tënde të Google"</translation> <translation id="2031914984822377766">Shto gjuhët e tua të preferuara për <ph name="LINK_BEGIN" />sajtet e uebit<ph name="LINK_END" />. Gjuha kryesore nga lista do të përdoret për përkthimet.</translation> +<translation id="2033758234986231162">Nuk mund të ruhej një lidhje me telefonin tënd. Sigurohu që telefoni yt të jetë pranë, i shkyçur dhe që Bluetooth-i dhe Wi-Fi të jenë të aktivizuar.</translation> <translation id="2034346955588403444">Shto një rrjet tjetër WiFi</translation> <translation id="203574396658008164">Aktivizo mbajtjen e shënimeve nga ekrani i kyçjes</translation> <translation id="2037445849770872822">Mbikëqyrja është konfiguruar për këtë "Llogari të Google". Për të konfiguruar kontrolle të tjera prindërore, zgjidh "Vazhdo". @@ -3738,6 +3741,7 @@ <translation id="461661862154729886">Burimi i energjisë</translation> <translation id="4617001782309103936">Shumë i shkurtër</translation> <translation id="4617270414136722281">Opsionet e prapashtesës</translation> +<translation id="4617880081511131945">Nuk mund të vendoset lidhja</translation> <translation id="4619564267100705184">Verifiko që je ti</translation> <translation id="4619615317237390068">Skedat nga pajisjet e tjera</translation> <translation id="4620809267248568679">Ky cilësim është detyruar nga një shtesë.</translation> @@ -4030,6 +4034,7 @@ <translation id="4907306957610201395">Kategoria e lejes</translation> <translation id="4908811072292128752">Hap një skedë të re për të shfletuar dy sajte njëkohësisht</translation> <translation id="4909038193460299775">Duke qenë se kjo llogari menaxhohet nga <ph name="DOMAIN" />, faqeshënuesit, historiku, fjalëkalimet dhe cilësimet e tjera do të fshihen nga kjo pajisje. Sidoqoftë, të dhënat e tua do të qëndrojnë të ruajtura te llogaria jote e Google dhe mund të menaxhohen në <ph name="BEGIN_LINK" />Panelin analitik të Google<ph name="END_LINK" /></translation> +<translation id="4912265719039610598">Transmetimi i aplikacioneve është çaktivizuar nga administratori i telefonit.</translation> <translation id="4912643508233590958">Zgjimet nga gjendja e qetë</translation> <translation id="4915961947098019832">Lejohen të shfaqin imazhe</translation> <translation id="4916542008280060967">Do ta lejosh sajtin të modifikojë <ph name="FILE_NAME" />?</translation> @@ -6858,6 +6863,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Rregullo kufijtë e ekranit tënd</translation> <translation id="7760004034676677601">A është kjo faqja e fillimit që prisje?</translation> +<translation id="7762024824096060040">Kjo llogari nuk mund të përdoret</translation> <translation id="7762463735017901568">Sinkronizimi i njoftimeve është çaktivizuar nga administratori i telefonit tënd</translation> <translation id="7764225426217299476">Shto adresë</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> nga <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7026,6 +7032,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> sek.</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> mund ta shikojë skedarin <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Shto fjalët që dëshiron të kapërcejë kontrolli drejtshkrimor</translation> +<translation id="7921347341284348270">Nuk mund t'i shikosh njoftimet e telefonit tënd në këtë llogari të menaxhuar. Provoje përsëri me një llogari tjetër. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Shfaq detajet për bllokimin e kukive të palëve të treta në modalitetin "I fshehtë"</translation> <translation id="7923564237306226146">Përmirësimi i Linux përfundoi</translation> <translation id="7924358170328001543">Gabim në transferimin e portës</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 33497ba..cc8a6023 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -859,6 +859,7 @@ <translation id="1813278315230285598">Usluge</translation> <translation id="18139523105317219">Ime EDI strane</translation> <translation id="1815083418640426271">Nalepi kao čisti tekst</translation> +<translation id="1815097521077272760">Pozvani ste da isprobate kontrolisanje tastaturom za ovu igru.</translation> <translation id="1815181278146012280">Pitaj kada sajt želi da pristupi uređajima sa interfejsom</translation> <translation id="181577467034453336">još <ph name="NUMBER_OF_VIEWS" />…</translation> <translation id="1816036116994822943">Brzina skeniranja tastature</translation> @@ -992,6 +993,7 @@ <translation id="1935303383381416800">Dozvoljeno im je da vide vašu lokaciju</translation> <translation id="1936931585862840749">Navedite broj primeraka za štampanje (1–<ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Ne možete da uvezete tip arhitekture kontejnera <ph name="ARCHITECTURE_CONTAINER" /> pomoću ovog uređaja, koji je <ph name="ARCHITECTURE_DEVICE" />. Možete da probate da vratite ovaj kontejner na drugi uređaj ili da otvorite aplikaciju Datoteke da biste pristupili datotekama u slici ovog kontejnera.</translation> +<translation id="1938320257168860255">Došlo je do greške. Uverite se da je telefon u blizini, da je otključan i da su Bluetooth i WiFi uključeni.</translation> <translation id="1938351510777341717">Spoljna komanda</translation> <translation id="1940546824932169984">Povezani uređaji</translation> <translation id="1941410638996203291">Vreme početka <ph name="TIME" /></translation> @@ -1074,6 +1076,7 @@ <translation id="2030455719695904263">Dodirna tabla</translation> <translation id="2031639749079821948">Lozinka je sačuvana na Google nalogu</translation> <translation id="2031914984822377766">Dodajte željene <ph name="LINK_BEGIN" />jezike za veb-sajt<ph name="LINK_END" />. Prvi jezik sa liste će se koristiti za prevode.</translation> +<translation id="2033758234986231162">Nismo uspeli da održimo vezu sa telefonom. Uverite se da je telefon u blizini, da je otključan i da su Bluetooth i WiFi uključeni.</translation> <translation id="2034346955588403444">Dodaj drugu WiFi mrežu</translation> <translation id="203574396658008164">Omogući pravljenje beleški sa zaključanog ekrana</translation> <translation id="2037445849770872822">Nadzor je podešen za ovaj Google nalog. Da biste podesili dodatni roditeljski nadzor, izaberite Nastavi. @@ -3740,6 +3743,7 @@ <translation id="461661862154729886">Izvor energije</translation> <translation id="4617001782309103936">Prekratko</translation> <translation id="4617270414136722281">Opcije dodataka</translation> +<translation id="4617880081511131945">Uspostavljanje veze nije uspelo</translation> <translation id="4619564267100705184">Potvrdite svoj identitet</translation> <translation id="4619615317237390068">Kartice sa drugih uređaja</translation> <translation id="4620809267248568679">Dodatak primenjuje ovo podešavanje.</translation> @@ -4032,6 +4036,7 @@ <translation id="4907306957610201395">Kategorija dozvole</translation> <translation id="4908811072292128752">Otvorite novu karticu da biste pregledali dva sajta istovremeno</translation> <translation id="4909038193460299775">Pošto ovim nalogom upravlja <ph name="DOMAIN" />, vaši obeleživači, istorija, lozinke i druga podešavanja će biti izbrisani sa ovog uređaja. Međutim, vaši podaci će se i dalje čuvati na Google nalogu i njima možete da upravljate na <ph name="BEGIN_LINK" />Google kontrolnoj tabli<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Administrator telefona je onemogućio strimovanje aplikacija.</translation> <translation id="4912643508233590958">Buđenja iz stanja mirovanja</translation> <translation id="4915961947098019832">Dozvoljeno im je da prikazuju slike</translation> <translation id="4916542008280060967">Želite li da dozvolite sajtu da menja datoteku <ph name="FILE_NAME" />?</translation> @@ -6864,6 +6869,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Prilagodite granice prikaza</translation> <translation id="7760004034676677601">Je li ovo početna stranica koju ste očekivali?</translation> +<translation id="7762024824096060040">Ne možete da koristite ovaj nalog</translation> <translation id="7762463735017901568">Sinhronizovanje obaveštenja je onemogućio administrator telefona</translation> <translation id="7764225426217299476">Dodajte adresu</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> sa <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7033,6 +7039,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> sek</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> može da pregleda <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Dodajte reči koje provera pravopisa treba da preskače</translation> +<translation id="7921347341284348270">Ne možete da pregledate obaveštenja telefona na ovom upravljanom nalogu. Probajte ponovo sa drugim nalogom. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Prikazuj detalje o blokiranju kolačića trećih strana u režimu bez arhiviranja</translation> <translation id="7923564237306226146">Nadogradnja Linux-a je završena</translation> <translation id="7924358170328001543">Greška pri prosleđivanju porta</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index e2d0da0..5431883e 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -859,6 +859,7 @@ <translation id="1813278315230285598">Услуге</translation> <translation id="18139523105317219">Име EDI стране</translation> <translation id="1815083418640426271">Налепи као чисти текст</translation> +<translation id="1815097521077272760">Позвани сте да испробате контролисање тастатуром за ову игру.</translation> <translation id="1815181278146012280">Питај када сајт жели да приступи уређајима са интерфејсом</translation> <translation id="181577467034453336">још <ph name="NUMBER_OF_VIEWS" />…</translation> <translation id="1816036116994822943">Брзина скенирања тастатуре</translation> @@ -992,6 +993,7 @@ <translation id="1935303383381416800">Дозвољено им је да виде вашу локацију</translation> <translation id="1936931585862840749">Наведите број примерака за штампање (1–<ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Не можете да увезете тип архитектуре контејнера <ph name="ARCHITECTURE_CONTAINER" /> помоћу овог уређаја, који је <ph name="ARCHITECTURE_DEVICE" />. Можете да пробате да вратите овај контејнер на други уређај или да отворите апликацију Датотеке да бисте приступили датотекама у слици овог контејнера.</translation> +<translation id="1938320257168860255">Дошло је до грешке. Уверите се да је телефон у близини, да је откључан и да су Bluetooth и WiFi укључени.</translation> <translation id="1938351510777341717">Спољна команда</translation> <translation id="1940546824932169984">Повезани уређаји</translation> <translation id="1941410638996203291">Време почетка <ph name="TIME" /></translation> @@ -1074,6 +1076,7 @@ <translation id="2030455719695904263">Додирна табла</translation> <translation id="2031639749079821948">Лозинка је сачувана на Google налогу</translation> <translation id="2031914984822377766">Додајте жељене <ph name="LINK_BEGIN" />језике за веб-сајт<ph name="LINK_END" />. Први језик са листе ће се користити за преводе.</translation> +<translation id="2033758234986231162">Нисмо успели да одржимо везу са телефоном. Уверите се да је телефон у близини, да је откључан и да су Bluetooth и WiFi укључени.</translation> <translation id="2034346955588403444">Додај другу WiFi мрежу</translation> <translation id="203574396658008164">Омогући прављење белешки са закључаног екрана</translation> <translation id="2037445849770872822">Надзор је подешен за овај Google налог. Да бисте подесили додатни родитељски надзор, изаберите Настави. @@ -3740,6 +3743,7 @@ <translation id="461661862154729886">Извор енергије</translation> <translation id="4617001782309103936">Прекратко</translation> <translation id="4617270414136722281">Опције додатака</translation> +<translation id="4617880081511131945">Успостављање везе није успело</translation> <translation id="4619564267100705184">Потврдите свој идентитет</translation> <translation id="4619615317237390068">Картице са других уређаја</translation> <translation id="4620809267248568679">Додатак примењује ово подешавање.</translation> @@ -4032,6 +4036,7 @@ <translation id="4907306957610201395">Категорија дозволе</translation> <translation id="4908811072292128752">Отворите нову картицу да бисте прегледали два сајта истовремено</translation> <translation id="4909038193460299775">Пошто овим налогом управља <ph name="DOMAIN" />, ваши обележивачи, историја, лозинке и друга подешавања ће бити избрисани са овог уређаја. Међутим, ваши подаци ће се и даље чувати на Google налогу и њима можете да управљате на <ph name="BEGIN_LINK" />Google контролној табли<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Администратор телефона је онемогућио стримовање апликација.</translation> <translation id="4912643508233590958">Буђења из стања мировања</translation> <translation id="4915961947098019832">Дозвољено им је да приказују слике</translation> <translation id="4916542008280060967">Желите ли да дозволите сајту да мења датотеку <ph name="FILE_NAME" />?</translation> @@ -6864,6 +6869,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Прилагодите границе приказа</translation> <translation id="7760004034676677601">Је ли ово почетна страница коју сте очекивали?</translation> +<translation id="7762024824096060040">Не можете да користите овај налог</translation> <translation id="7762463735017901568">Синхронизовање обавештења је онемогућио администратор телефона</translation> <translation id="7764225426217299476">Додајте адресу</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> са <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7033,6 +7039,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> сек</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> може да прегледа <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Додајте речи које провера правописа треба да прескаче</translation> +<translation id="7921347341284348270">Не можете да прегледате обавештења телефона на овом управљаном налогу. Пробајте поново са другим налогом. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Приказуј детаље о блокирању колачића трећих страна у режиму без архивирања</translation> <translation id="7923564237306226146">Надоградња Linux-а је завршена</translation> <translation id="7924358170328001543">Грешка при прослеђивању порта</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 8da307d..a0f57b37 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -871,6 +871,7 @@ <translation id="1813278315230285598">Tjänster</translation> <translation id="18139523105317219">EDI-partsnamn</translation> <translation id="1815083418640426271">Klistra in som oformaterad text</translation> +<translation id="1815097521077272760">Du har bjudits in till att testa tangentbordsstyrning för det här spelet.</translation> <translation id="1815181278146012280">Fråga om en webbplats försöker få åtkomst till HID-enheter</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> till …</translation> <translation id="1816036116994822943">Genomsökningshastighet för tangentbord</translation> @@ -1005,6 +1006,7 @@ <translation id="1935303383381416800">Får se var du befinner dig</translation> <translation id="1936931585862840749">Använd ett nummer som anger hur många kopior som ska skrivas ut (1 till <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Det går inte att importera en behållararkitektur av typen <ph name="ARCHITECTURE_CONTAINER" /> med den här enheten, som är en <ph name="ARCHITECTURE_DEVICE" />. Du kan testa att återställa behållaren till en annan enhet, eller så kan du öppna filerna i behållarbilden via appen Filer.</translation> +<translation id="1938320257168860255">Något gick fel. Kontrollera att telefonen är i närheten, olåst och att Bluetooth och wifi har aktiverats.</translation> <translation id="1938351510777341717">Extern kommandotangent</translation> <translation id="1940546824932169984">Anslutna enheter</translation> <translation id="1941410638996203291">Starttid <ph name="TIME" /></translation> @@ -1087,6 +1089,7 @@ <translation id="2030455719695904263">Styrplatta</translation> <translation id="2031639749079821948">Ditt lösenord har sparats i Google-kontot</translation> <translation id="2031914984822377766">Lägg till önskade <ph name="LINK_BEGIN" />språk för webbplatser<ph name="LINK_END" />. Det första språket på listan används för översättningar.</translation> +<translation id="2033758234986231162">Det gick inte att upprätthålla anslutningen till telefonen. Kontrollera att telefonen är i närheten, olåst och att Bluetooth och wifi har aktiverats.</translation> <translation id="2034346955588403444">Lägg till ett annat wifi-nätverk</translation> <translation id="203574396658008164">Aktivera anteckningar på låsskärmen</translation> <translation id="2037445849770872822">Kontroll har konfigurerats för det här Google-kontot. Välj Fortsätt om du vill konfigurera fler föräldrakontroller. @@ -3757,6 +3760,7 @@ <translation id="461661862154729886">Energikälla</translation> <translation id="4617001782309103936">För kort</translation> <translation id="4617270414136722281">Tilläggsalternativ</translation> +<translation id="4617880081511131945">Det gick inte att upprätta en anslutning</translation> <translation id="4619564267100705184">Verifiera din identitet</translation> <translation id="4619615317237390068">Flikar från andra enheter</translation> <translation id="4620809267248568679">Den här inställningen är låst av ett tillägg.</translation> @@ -4049,6 +4053,7 @@ <translation id="4907306957610201395">Behörighetskategori</translation> <translation id="4908811072292128752">Öppna en ny flik om du vill surfa på två webbplatser samtidigt</translation> <translation id="4909038193460299775">Eftersom kontot hanteras av <ph name="DOMAIN" /> raderas bokmärken, historik, lösenord och andra inställningar från enheten. Däremot finns uppgifterna kvar i Google-kontot och kan hanteras via <ph name="BEGIN_LINK" />Google Översikt<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Appstreaming har inaktiverats av telefonens administratör.</translation> <translation id="4912643508233590958">Antal gånger som systemets vänteprocess har väckts</translation> <translation id="4915961947098019832">Får visa bilder</translation> <translation id="4916542008280060967">Vill du låta webbplatsen redigera <ph name="FILE_NAME" />?</translation> @@ -6877,6 +6882,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Justera skärmens avgränsning</translation> <translation id="7760004034676677601">Är det här den startsida du väntade dig?</translation> +<translation id="7762024824096060040">Det här kontot kan inte användas</translation> <translation id="7762463735017901568">Synkronisering av aviseringar har inaktiverats av telefonens administratör</translation> <translation id="7764225426217299476">Lägg till adress</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> från <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7047,6 +7053,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> sek</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> har visningsbehörighet till <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Lägg till ord som ska hoppas över vid stavningskontrollen</translation> +<translation id="7921347341284348270">Du kan inte se telefonens aviseringar i det här hanterade kontot. Försök igen med ett annat konto. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Visa information om att blockera cookies från tredje part i inkognitoläge</translation> <translation id="7923564237306226146">Linux har uppgraderats</translation> <translation id="7924358170328001543">Det gick inte att vidarebefordra porten</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 81d21b3..fd0fcb91 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -868,6 +868,7 @@ <translation id="1813278315230285598">Huduma</translation> <translation id="18139523105317219">Jina la Sehemu ya EDI</translation> <translation id="1815083418640426271">Bandika Kama Matini Makavu</translation> +<translation id="1815097521077272760">Umealikwa ujaribu kidhibiti kibodi cha mchezo huu.</translation> <translation id="1815181278146012280">Iulize wakati tovuti inataka kufikia vifaa vya HID</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> zaidi...</translation> <translation id="1816036116994822943">Kasi ya kuchanganua katika kibodi</translation> @@ -1001,6 +1002,7 @@ <translation id="1935303383381416800">Zinazoruhusiwa kuona mahali ulipo</translation> <translation id="1936931585862840749">Tumia nambari kuonyesha idadi ya nakala za kuchapisha (moja hadi <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Haiwezi kupakia metadata ya aina ya usanifu wa<ph name="ARCHITECTURE_CONTAINER" /> kwa kutumia kifaa hiki ambacho ni <ph name="ARCHITECTURE_DEVICE" />. Unaweza kujaribu kurejesha metadata hii kwenye kifaa tofauti, au unaweza kufikia faili zilizo ndani ya picha ya metadata hii kwa kuzifungua katika programu ya Faili.</translation> +<translation id="1938320257168860255">Hitilafu fulani imetokea. Hakikisha simu yako ipo karibu, imefunguliwa na umewasha Bluetooth pamoja na Wi-Fi.</translation> <translation id="1938351510777341717">Amri ya Nje</translation> <translation id="1940546824932169984">Vifaa vilivyounganishwa</translation> <translation id="1941410638996203291">Wakati wa kuanza <ph name="TIME" /></translation> @@ -1083,6 +1085,7 @@ <translation id="2030455719695904263">Padi ya kusogeza</translation> <translation id="2031639749079821948">Nenosiri lako limehifadhiwa kwenye Akaunti yako ya Google</translation> <translation id="2031914984822377766">Weka <ph name="LINK_BEGIN" />lugha unazopendelea zitumike kwenye tovuti<ph name="LINK_END" />. Lugha ya kwanza kwenye orodha itatumika kwa ajili ya tafsiri.</translation> +<translation id="2033758234986231162">Imeshindwa kudumisha muunganisho na simu yako. Hakikisha simu yako ipo karibu, imefunguliwa na umewasha Bluetooth pamoja na Wi-Fi.</translation> <translation id="2034346955588403444">Ongeza mtandao mwingine wa WiFi</translation> <translation id="203574396658008164">Washa kipengele cha kuandika vidokezo kutoka kwenye skrini iliyofungwa</translation> <translation id="2037445849770872822">Mipangilio ya usimamizi ya Akaunti hii ya Google imewekwa. Ili uweke vidhibiti zaidi vya wazazi, bofya 'Endelea'. @@ -3752,6 +3755,7 @@ <translation id="461661862154729886">Chanzo cha nishati</translation> <translation id="4617001782309103936">Ni fupi mno</translation> <translation id="4617270414136722281">Chaguo za viendelezi</translation> +<translation id="4617880081511131945">Imeshindwa kuunganisha kwenye simu</translation> <translation id="4619564267100705184">Thibitisha kwamba ni wewe</translation> <translation id="4619615317237390068">Vichupo kutoka kwenye vifaa vingine</translation> <translation id="4620809267248568679">Mpangilio huu unatekelezwa kwa kiendelezi.</translation> @@ -4044,6 +4048,7 @@ <translation id="4907306957610201395">Aina ya Ruhusa</translation> <translation id="4908811072292128752">Fungua kichupo kipya ili uvinjari tovuti mbili kwa wakati mmoja</translation> <translation id="4909038193460299775">Kwa sababu akaunti hii inadhibitiwa na <ph name="DOMAIN" />, alamisho, historia, manenosiri, na mipangilio yako mingine itafutwa kwenye kifaa hiki. Hata hivyo, data yako itaendelea kuhifadhiwa katika Akaunti yako ya Google na inaweza kudhibitiwa kwenye <ph name="BEGIN_LINK" />Dashibodi ya Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Msimamizi wa simu yako amezima utiririshaji programu.</translation> <translation id="4912643508233590958">Miamsho Isiyofanya kazi</translation> <translation id="4915961947098019832">Zinazoruhusiwa kuonyesha picha</translation> <translation id="4916542008280060967">Ungependa kuruhusu tovuti ibadilishe <ph name="FILE_NAME" />?</translation> @@ -6872,6 +6877,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Rekebisha mipaka ya skrini yako</translation> <translation id="7760004034676677601">Je, huu ndio ukurasa unaoanza uliokuwa ukitarajia?</translation> +<translation id="7762024824096060040">Imeshindwa kutumia akaunti hii</translation> <translation id="7762463735017901568">Usawazishaji wa arifa umezimwa na msimamizi wa simu yako</translation> <translation id="7764225426217299476">Ongeza anwani</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> kutoka <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7043,6 +7049,7 @@ <translation id="7919210519031517829">Sek <ph name="DURATION" /></translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> inaweza kuona <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Ongeza maneno ambayo ungependa yarukwe na kikagua maendelezo</translation> +<translation id="7921347341284348270">Huwezi kutazama arifa za simu yako kwenye akaunti hii inayosimamiwa. Jaribu tena ukitumia akaunti tofauti. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Onesha maelezo kuhusu kuzuia vidakuzi vya tovuti nyingine katika Hali Fiche</translation> <translation id="7923564237306226146">Usasishaji wa Linux umekamilika</translation> <translation id="7924358170328001543">Hitilafu imetokea wakati wa kusambaza mlango</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 81a099771..caf7d1ef 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -3795,6 +3795,7 @@ <translation id="4648491805942548247">చాలని అనుమతులు</translation> <translation id="4650591383426000695">మీ <ph name="DEVICE_TYPE" /> నుండి మీ ఫోన్ను డిస్కనెక్ట్ చేయండి</translation> <translation id="4651484272688821107">డెమో మోడ్ వనరులతో ఆన్లైన్ అంతర్భాగాన్ని లోడ్ చేయడం సాధ్యపడలేదు.</translation> +<translation id="4651921906638302153">ఈ ఖాతాతో సైన్ ఇన్ చేయడం సాధ్యం కాలేదు</translation> <translation id="4652935475563630866">కెమెరా సెట్టింగ్లో మార్చడానికి పారలల్స్ డెస్క్టాప్ను మళ్లీ ప్రారంభించవలసి ఉంటుంది. కొనసాగించడానికి పారలల్స్ డెస్క్టాప్ను మళ్లీ ప్రారంభించండి.</translation> <translation id="4653405415038586100">Linuxను కాన్ఫిగర్ చేయడంలో ఎర్రర్</translation> <translation id="465406513924180949">వెబ్ అంతటా గల మీ షాపింగ్ కార్ట్లలో ఉన్న ఐటెమ్లకు మీరు తిరిగి వెళ్లడంలో మీకు సహాయపడే కార్ట్లు మీకు కనిపిస్తున్నాయి. @@ -5451,6 +5452,7 @@ <translation id="6327785803543103246">వెబ్ ప్రాక్సీ స్వీయశోధన</translation> <translation id="6331818708794917058">MIDI పరికరాలకు కనెక్ట్ చేయడానికి సైట్లు అడగగలవు</translation> <translation id="6333064448949140209">ఫైల్ డీబగ్గింగ్ కోసం Googleకు పంపబడుతుంది</translation> +<translation id="6333170995003625229">మీ ఈమెయిల్ అడ్రస్ లేదా పాస్వర్డ్ను వెరిఫై చేయడం సాధ్యం కాలేదు. తిరిగి సైన్ ఇన్ చేయడాన్ని ట్రై చేయండి.</translation> <translation id="6335920438823100346">Linuxను ప్రారంభించడానికి, <ph name="MANAGER" />కు మీ డేటాను బ్యాకప్ చేసి, ఈ Chromebookను ఫ్యాక్టరీ సెట్టింగ్లకు రీసెట్ చేయాలి.</translation> <translation id="6336038146639916978"><ph name="MANAGER" />, ADB డీబగ్గింగ్ను డిజేబుల్ చేసింది. ఇది మీ <ph name="DEVICE_TYPE" />ను 24 గంటలలో రీసెట్ చేస్తుంది. మీరు ఉంచాలనుకునే ఫైళ్లను బ్యాకప్ చేసుకోండి.</translation> <translation id="6338981933082930623">అన్నీ సైట్లు మీకు ఎటువంటి యాడ్లనైనా చూపించగలవు</translation> @@ -5859,6 +5861,7 @@ <translation id="6735304988756581115">కుక్కీలు మరియు ఇతర సైట్ డేటాను చూపించు...</translation> <translation id="6736243959894955139">అడ్రస్</translation> <translation id="6737663862851963468">Kerberos టిక్కెట్ను తీసివేయండి</translation> +<translation id="6738430949033571771">ఖాతాను వెరిఫై చేస్తోంది...</translation> <translation id="6739923123728562974">డెస్క్టాప్ షార్ట్కట్ను చూపు</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> పాజ్ చేయబడింది</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />మీ అడ్మినిస్ట్రేటర్<ph name="END_LINK" /> సురక్షిత బ్రౌజింగ్ను ఆఫ్ చేశారు</translation> @@ -7674,6 +7677,8 @@ <translation id="8546306075665861288">చిత్రం కాష్</translation> <translation id="8546930481464505581">టచ్ బార్ని అనుకూలీకరించండి</translation> <translation id="8547013269961688403">ఫుల్-స్క్రీన్ మాగ్నిఫయర్ను ప్రారంభించండి</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" />ను <ph name="MANAGER" /> మేనేజ్ చేస్తారు. మీరు అదనపు ఖాతాగా ఈ ఈమెయిల్ను జోడించలేరు.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" />ను ఉపయోగించడానికి, మొదట మీ <ph name="DEVICE_TYPE" /> నుండి సైన్ అవుట్ చేయండి. ఆపై, లాగిన్ స్క్రీన్ కింద, వ్యక్తిని జోడించండి ఆప్షన్ను ఎంచుకోండి.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">ఎగువ-అడ్డు వరుసలోని కీల ప్రవర్తనను మార్చడానికి శోధన కీని నొక్కి ఉంచండి</translation> <translation id="8549316893834449916">మీ Chromebookకు సైన్ ఇన్ చేయడానికి మీరు మీ Google ఖాతాను ఉపయోగిస్తారు – Gmail, Drive, YouTube మరిన్నింటి కోసం మీరు ఉపయోగించే అదే ఖాతా.</translation> <translation id="8551388862522347954">లైసెన్స్లు</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 0cdfbf6b..261e7933 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -89,6 +89,9 @@ <translation id="1082214733466244292">ผู้ดูแลระบบบล็อกฟังก์ชันการทำงานบางอย่างในอุปกรณ์นี้</translation> <translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> ต้องการคืนค่าการตั้งค่า Chrome ของคุณกลับไปเป็นค่าเริ่มต้นดั้งเดิม การดำเนินการนี้จะรีเซ็ตหน้าหลักของคุณ หน้าแท็บใหม่ และเครื่องมือค้นหา ปิดใช้ส่วนขยาย และเลิกปักหมุดแท็บทั้งหมด นอกจากนี้ยังล้างข้อมูลชั่วคราวอื่นๆ และข้อมูลที่แคชไว้ เช่น คุกกี้ เนื้อหา และข้อมูลเว็บไซต์อีกด้วย</translation> <translation id="1084096383128641877">การนำรหัสผ่านนี้ออกจะไม่ลบบัญชีของคุณใน <ph name="DOMAIN" /> เปลี่ยนรหัสผ่านหรือลบบัญชีของคุณใน <ph name="DOMAIN_LINK" /> เพื่อให้ปลอดภัยจากบุคคลอื่น</translation> +<translation id="1084288067399862432">เปลี่ยนรหัสผ่านที่ถูกละเมิดเรียบร้อยแล้ว + +ตรวจสอบรหัสผ่านได้ทุกเมื่อใน <ph name="GOOGLE_PASSWORD_MANAGER" /></translation> <translation id="1084824384139382525">คัดลอก&ที่อยู่ลิงก์</translation> <translation id="1085064499066015002">ตลอดเวลาในทุกเว็บไซต์</translation> <translation id="1085697365578766383">เกิดข้อผิดพลาดขณะเริ่มต้นเครื่องเสมือน โปรดลองอีกครั้ง</translation> @@ -1678,6 +1681,7 @@ <translation id="2554553592469060349">ไฟล์ที่เลือกมีขนาดใหญ่เกินไป (ขนาดสูงสุด: 3 MB)</translation> <translation id="2558569818338050235">ประวัติการท่องเว็บของคุณส่งผลต่อโฆษณาที่คุณเห็น</translation> <translation id="2558896001721082624">แสดงตัวเลือกการเข้าถึงในเมนูระบบไว้เสมอ</translation> +<translation id="2559889124253841528">บันทึกลงในอุปกรณ์</translation> <translation id="2564520396658920462">การเรียกใช้ JavaScript ผ่าน AppleScript ปิดอยู่ หากต้องการเปิด จากแถบเมนู ให้ไปที่ มุมมอง > นักพัฒนาซอฟต์แวร์ > อนุญาตให้เรียกใช้ JavaScript จากกิจกรรมใน Apple ดูข้อมูลเพิ่มเติมที่ https://support.google.com/chrome/?p=applescript</translation> <translation id="2564653188463346023">การตรวจตัวสะกดที่ได้รับการปรับปรุง</translation> <translation id="2568774940984945469">ที่เก็บแถบข้อมูล</translation> @@ -1688,6 +1692,7 @@ <translation id="2575247648642144396">ไอคอนนี้จะปรากฏเมื่อส่วนขยายสามารถทำงานบนหน้าเว็บปัจจุบัน ใช้ส่วนขยายนี้โดยคลิกที่ไอคอน หรือกด <ph name="EXTENSION_SHORTCUT" /></translation> <translation id="2575407791320728464">URL ไม่ถูกต้อง โปรดตรวจสอบว่า URL มีรูปแบบถูกต้อง</translation> <translation id="2575441894380764255">ไม่ได้รับอนุญาตให้แสดงโฆษณาที่รบกวนหรือทำให้เข้าใจผิด</translation> +<translation id="2575713839157415345">{YEARS,plural, =1{อุปกรณ์นี้จะได้รับการบันทึกไว้เป็นเวลา 1 ปีและคุณสามารถเชื่อมต่อโดยไม่ใช้รหัสได้ในครั้งถัดไป ผู้ดูแลระบบเป็นคนตั้งค่านี้}other{อุปกรณ์นี้จะได้รับการบันทึกไว้เป็นเวลา {YEARS} ปีและคุณสามารถเชื่อมต่อโดยไม่ใช้รหัสได้ในครั้งถัดไป ผู้ดูแลระบบเป็นคนตั้งค่านี้}}</translation> <translation id="257779572837908839">ตั้งค่าเป็น Chromebox สำหรับการประชุม</translation> <translation id="2580889980133367162">อนุญาตให้ <ph name="HOST" /> ดาวน์โหลดไฟล์หลายไฟล์เสมอ</translation> <translation id="258095186877893873">ยาว</translation> @@ -2986,6 +2991,7 @@ <translation id="3856800405688283469">เลือกเขตเวลา</translation> <translation id="3857807444929313943">ยกนิ้วขึ้นแล้วแตะอีกครั้ง</translation> <translation id="3858860766373142691">ชื่อ</translation> +<translation id="385939467708172187">ใช้รหัสผ่านที่รัดกุม</translation> <translation id="3861638017150647085">ใช้ชื่อผู้ใช้ "<ph name="USERNAME" />" ไม่ได้</translation> <translation id="3861977424605124250">แสดงเมื่อเริ่มต้นใช้งาน</translation> <translation id="386239283124269513">&กู้คืนกลุ่ม</translation> @@ -3229,6 +3235,7 @@ <translation id="4089235344645910861">บันทึกการตั้งค่าและเริ่มซิงค์แล้ว</translation> <translation id="4090103403438682346">เปิดใช้การเข้าถึงที่ได้รับการยืนยัน</translation> <translation id="4090947011087001172">รีเซ็ตสิทธิ์เว็บไซต์สำหรับ <ph name="SITE" /> ไหม</translation> +<translation id="4092636882861724179">คุณดูและจัดการรหัสผ่านที่บันทึกไว้ได้ใน <ph name="GOOGLE_PASSWORD_MANAGER" /></translation> <translation id="4093865285251893588">รูปโปรไฟล์</translation> <translation id="4093955363990068916">ไฟล์ในเครื่อง:</translation> <translation id="4094647278880271855">คุณใช้ตัวแปรสภาพแวดล้อมที่ระบบไม่รองรับ: <ph name="BAD_VAR" /> ซึ่งจะส่งผลต่อความเสถียรและความปลอดภัย</translation> @@ -3519,6 +3526,7 @@ <translation id="4392896746540753732">แก้ไขไฟล์การกำหนดค่า</translation> <translation id="4394049700291259645">ปิดการใช้งาน</translation> <translation id="4396956294839002702">{COUNT,plural, =0{&เปิดทั้งหมด}=1{&เปิดบุ๊กมาร์ก}other{&เปิดทั้งหมด ({COUNT})}}</translation> +<translation id="4397372003838952832">คุณไม่ต้องจำรหัสผ่านนี้ เพราะระบบจะบันทึกไว้ใน <ph name="GOOGLE_PASSWORD_MANAGER" />สำหรับ <ph name="EMAIL" /></translation> <translation id="439817266247065935">อุปกรณ์ของคุณไม่ได้ปิดอย่างถูกต้อง รีสตาร์ท Linux เพื่อใช้แอป Linux</translation> <translation id="4400367121200150367">เว็บไซต์ที่ไม่เคยบันทึกรหัสผ่านจะแสดงที่นี่</translation> <translation id="4400632832271803360">กดแป้น "Launcher" ค้างไว้เพื่อเปลี่ยนการทำงานของแป้นแถวบนสุด</translation> @@ -3532,6 +3540,7 @@ <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation> <translation id="440653823335387109">หน้าที่คุณอ่านแล้ว</translation> <translation id="4406883609789734330">คำบรรยายสด</translation> +<translation id="4407039574263172582">หากต้องการดำเนินการต่อ <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> จะแชร์ชื่อ อีเมล และรูปโปรไฟล์ของคุณกับเว็บไซต์นี้ ดู<ph name="BEGIN_LINK" />ข้อกำหนดในการให้บริการ<ph name="END_LINK" />ของเว็บไซต์นี้</translation> <translation id="4408599188496843485">ความ&ช่วยเหลือ</translation> <translation id="4409271659088619928">เครื่องมือค้นหาของคุณคือ <ph name="DSE" /> ดูวิธีลบประวัติการค้นหา (หากมี) ของเครื่องมือค้นหาที่คุณใช้</translation> <translation id="4409697491990005945">ระยะขอบ</translation> @@ -3715,6 +3724,7 @@ <translation id="4579453506923101210">เลิกจำโทรศัพท์ที่เชื่อมต่ออยู่</translation> <translation id="4579581181964204535">ไม่สามารถแคสต์ <ph name="HOST_NAME" /></translation> <translation id="4579876313423027742">สำหรับการแจ้งเตือนของเบราว์เซอร์ ให้ไปที่<ph name="LINK_BEGIN" />การตั้งค่าเบราว์เซอร์ Chrome<ph name="LINK_END" /></translation> +<translation id="4580596421317071374">รหัสผ่านจะบันทึกไว้ใน <ph name="GOOGLE_PASSWORD_MANAGER" />บนอุปกรณ์นี้</translation> <translation id="4581774856936278355">เกิดข้อผิดพลาดขณะคืนค่า Linux</translation> <translation id="4582297591746054421">โดยปกติแล้วเว็บไซต์จะอ่านคลิปบอร์ดของคุณเพื่อดำเนินการตามฟีเจอร์ต่างๆ เช่น คงการจัดรูปแบบข้อความที่คุณคัดลอกไว้</translation> <translation id="4582563038311694664">รีเซ็ตการตั้งค่าทั้งหมด</translation> @@ -3886,6 +3896,7 @@ <translation id="4761104368405085019">ใช้ไมโครโฟนของคุณ</translation> <translation id="4762718786438001384">พื้นที่ดิสก์ของอุปกรณ์ใกล้จะเต็มแล้ว</translation> <translation id="4763408175235639573">มีการวางคุกกี้ต่อไปนี้เมื่อคุณดูหน้าเว็บนี้</translation> +<translation id="4765524037138975789">{MONTHS,plural, =1{อุปกรณ์นี้จะได้รับการบันทึกไว้เป็นเวลา 1 เดือนและคุณสามารถเชื่อมต่อโดยไม่ใช้รหัสได้ในครั้งถัดไป ผู้ดูแลระบบเป็นคนตั้งค่านี้}other{อุปกรณ์นี้จะได้รับการบันทึกไว้เป็นเวลา {MONTHS} เดือนและคุณสามารถเชื่อมต่อโดยไม่ใช้รหัสได้ในครั้งถัดไป ผู้ดูแลระบบเป็นคนตั้งค่านี้}}</translation> <translation id="4765582662863429759">อนุญาตให้ Android Messages นำส่งข้อความจากโทรศัพท์ไปยัง Chromebook ของคุณ</translation> <translation id="4768332406694066911">คุณมีใบรับรองจากองค์กรเหล่านี้ซึ่งระบุถึงตัวคุณ</translation> <translation id="4770119228883592393">ขอสิทธิ์ กด ⌘ + Option + ลูกศรลงเพื่อตอบกลับ</translation> @@ -4500,6 +4511,7 @@ <translation id="5398497406011404839">บุ๊กมาร์กที่ซ่อนอยู่</translation> <translation id="5398572795982417028">การอ้างอิงหน้าอยู่นอกขอบเขต จำกัดไว้ที่ <ph name="MAXIMUM_PAGE" /> หน้า</translation> <translation id="5401426944298678474">เลิกติดตามเว็บไซต์</translation> +<translation id="5401851137404501592">หากต้องการดำเนินการต่อ <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> จะแชร์ชื่อ อีเมล และรูปโปรไฟล์ของคุณกับเว็บไซต์นี้</translation> <translation id="5402815541704507626">ดาวน์โหลดอัปเดตโดยใช้อินเทอร์เน็ตมือถือ</translation> <translation id="540296380408672091">บล็อกคุกกี้เสมอบน <ph name="HOST" /></translation> <translation id="5404740137318486384">กดสวิตช์หรือแป้นบนแป้นพิมพ์ที่จะกำหนดให้กับ "<ph name="ACTION" />" @@ -5352,6 +5364,7 @@ <translation id="6250186368828697007">รายละเอียดจะซ่อนอยู่ขณะที่คุณแชร์หน้าจอ</translation> <translation id="6251870443722440887">GDI จัดการ</translation> <translation id="625369703868467034">สถานภาพเครือข่าย</translation> +<translation id="6253801023880399036">รหัสผ่านจะบันทึกไว้ใน <ph name="GOOGLE_PASSWORD_MANAGER" /></translation> <translation id="6254503684448816922">คีย์ไม่สมบูรณ์</translation> <translation id="6254892857036829079">ยอดเยี่ยม</translation> <translation id="6257602895346497974">เปิดการซิงค์...</translation> @@ -6374,6 +6387,7 @@ <translation id="7282547042039404307">ราบรื่น</translation> <translation id="7282992757463864530">แถบข้อมูล</translation> <translation id="7283555985781738399">โหมดผู้มาเยือน</translation> +<translation id="7284307451964417957">{DAYS,plural, =1{อุปกรณ์นี้จะได้รับการบันทึกไว้เป็นเวลา 1 วันและคุณสามารถเชื่อมต่อโดยไม่ใช้รหัสได้ในครั้งถัดไป ผู้ดูแลระบบเป็นคนตั้งค่านี้}other{อุปกรณ์นี้จะได้รับการบันทึกไว้เป็นเวลา {DAYS} วันและคุณสามารถเชื่อมต่อโดยไม่ใช้รหัสได้ในครั้งถัดไป ผู้ดูแลระบบเป็นคนตั้งค่านี้}}</translation> <translation id="7284411326658527427">โดยแต่ละคนจะปรับเปลี่ยนการตั้งค่าบัญชีในแบบของตนและเก็บเป็นข้อมูลส่วนตัวได้</translation> <translation id="7287143125007575591">ปฏิเสธการเข้าถึง</translation> <translation id="7287411021188441799">คืนค่าพื้นหลังเริ่มต้น</translation> @@ -6578,6 +6592,7 @@ <translation id="7488682689406685343">เว็บไซต์นี้อาจกำลังพยายามหลอกล่อคุณให้อนุญาตการแจ้งเตือนที่ล่วงล้ำ</translation> <translation id="7489761397368794366">โทรจากอุปกรณ์ของคุณ</translation> <translation id="749028671485790643">คนที่ <ph name="VALUE" /></translation> +<translation id="7490683549040131791">ตรวจสอบรหัสผ่านที่เหลือ</translation> <translation id="7491962110804786152">แท็บ</translation> <translation id="7491963308094506985">{NUM_COOKIES,plural, =1{คุกกี้ 1 รายการ}other{คุกกี้ {NUM_COOKIES} รายการ}}</translation> <translation id="7493386493263658176">ส่วนขยาย <ph name="EXTENSION_NAME" /> อาจรวบรวมข้อความทั้งหมดที่คุณพิมพ์ ซึ่งรวมถึงข้อมูลส่วนตัว เช่น รหัสผ่านและหมายเลขบัตรเครดิต คุณต้องการใช้ส่วนขยายนี้ไหม</translation> @@ -7469,6 +7484,7 @@ <translation id="8335587457941836791">เลิกปักหมุดในชั้นวาง</translation> <translation id="8336407002559723354">การอัปเดตจะสิ้นสุดใน<ph name="MONTH_AND_YEAR" /></translation> <translation id="8336739000755212683">เปลี่ยนรูปภาพของบัญชีอุปกรณ์</translation> +<translation id="8337020675372081178">{HOURS,plural, =1{อุปกรณ์นี้จะได้รับการบันทึกไว้เป็นเวลา 1 ชั่วโมงและคุณสามารถเชื่อมต่อโดยไม่ใช้รหัสได้ในครั้งถัดไป ผู้ดูแลระบบเป็นคนตั้งค่านี้}other{อุปกรณ์นี้จะได้รับการบันทึกไว้เป็นเวลา {HOURS} ชั่วโมงและคุณสามารถเชื่อมต่อโดยไม่ใช้รหัสได้ในครั้งถัดไป ผู้ดูแลระบบเป็นคนตั้งค่านี้}}</translation> <translation id="8337047789441383384">คุณลงทะเบียนคีย์ความปลอดภัยนี้ไปแล้ว ไม่จำเป็นต้องลงทะเบียนซ้ำ</translation> <translation id="8338952601723052325">เว็บไซต์สำหรับนักพัฒนาซอฟต์แวร์</translation> <translation id="8339059274628563283">ข้อมูล <ph name="SITE" /> ที่เก็บไว้ในเครื่อง</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index a8d0f63..6104aa4 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -860,6 +860,7 @@ <translation id="1813278315230285598">Hizmetler</translation> <translation id="18139523105317219">EDI Grup Adı</translation> <translation id="1815083418640426271">Düz Metin Olarak Yapıştır</translation> +<translation id="1815097521077272760">Bu oyundaki klavye kontrolü özelliğini denemeye davet edildiniz.</translation> <translation id="1815181278146012280">Bir site HID cihazlara erişmek istediğinde sor</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> görüntüleme daha...</translation> <translation id="1816036116994822943">Klavye tarama hızı</translation> @@ -993,6 +994,7 @@ <translation id="1935303383381416800">Konumunuzu görmesine izin verilen siteler</translation> <translation id="1936931585862840749">Yazdırılacak kopya sayısını göstermek için bir sayı (1-<ph name="MAX_COPIES" /> arası) kullanın.</translation> <translation id="1937774647013465102">Bu cihaz (<ph name="ARCHITECTURE_DEVICE" />) ile kapsayıcı mimarisinin türü <ph name="ARCHITECTURE_CONTAINER" /> içe aktarılamıyor. Bu kapsayıcıyı farklı bir cihaza geri yüklemeyi deneyebilir veya Files uygulamasını açarak bu kapsayıcı görüntüsündeki dosyalara erişebilirsiniz.</translation> +<translation id="1938320257168860255">Bir sorun oldu. Telefonunuzun yakında bulunduğundan, kilidinin ve Bluetooth ile kablosuz bağlantının da açık olduğundan emin olun.</translation> <translation id="1938351510777341717">Harici Komut</translation> <translation id="1940546824932169984">Bağlı cihazlar</translation> <translation id="1941410638996203291">Başlangıç zamanı: <ph name="TIME" /></translation> @@ -1075,6 +1077,7 @@ <translation id="2030455719695904263">Dokunmatik yüzey</translation> <translation id="2031639749079821948">Şifreniz Google Hesabınızda kayıtlı</translation> <translation id="2031914984822377766">Tercih ettiğiniz <ph name="LINK_BEGIN" />web sitesi dillerini<ph name="LINK_END" /> ekleyin. Çeviriler için listede ilk sırada bulunan dil kullanılır.</translation> +<translation id="2033758234986231162">Telefonunuzla bağlantı sürdürülemiyor. Telefonunuzun yakında bulunduğundan, kilidinin ve Bluetooth ile kablosuz bağlantının da açık olduğundan emin olun.</translation> <translation id="2034346955588403444">Başka kablosuz ağ ekle</translation> <translation id="203574396658008164">Kilit ekranından not almayı etkinleştir</translation> <translation id="2037445849770872822">Bu Google Hesabı için denetim kuruldu. Diğer ebeveyn denetimlerini kurmak için Devam'ı seçin. @@ -3738,6 +3741,7 @@ <translation id="461661862154729886">Enerji kaynağı</translation> <translation id="4617001782309103936">Çok kısa</translation> <translation id="4617270414136722281">Uzantı seçenekleri</translation> +<translation id="4617880081511131945">Bağlantı kurulamıyor</translation> <translation id="4619564267100705184">Kimliğinizi doğrulayın</translation> <translation id="4619615317237390068">Diğer cihazlardan sekmeler</translation> <translation id="4620809267248568679">Bu ayar bir uzantı tarafından zorunlu tutuluyor.</translation> @@ -4030,6 +4034,7 @@ <translation id="4907306957610201395">İzin Kategorisi</translation> <translation id="4908811072292128752">İki siteye aynı anda göz atmak için yeni bir sekme açın</translation> <translation id="4909038193460299775">Bu hesap <ph name="DOMAIN" /> tarafından yönetildiğinden, yer işaretleri, geçmişi, şifreler ve diğer ayarlarınız bu cihazdan silinir. Ancak verileriniz Google Hesabınızda kalmaya devam eder ve <ph name="BEGIN_LINK" />Google Hesap Özeti<ph name="END_LINK" />'nde yönetilebilir.</translation> +<translation id="4912265719039610598">Uygulama aktarma telefonunuzun yöneticisi tarafından devre dışı bırakıldı.</translation> <translation id="4912643508233590958">Boşta Kalma Uyanmaları</translation> <translation id="4915961947098019832">Resim göstermesine izin verilen siteler</translation> <translation id="4916542008280060967">Siteye <ph name="FILE_NAME" /> dosyasını düzenleme izni verilsin mi?</translation> @@ -6859,6 +6864,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ekranınızın sınırlarını ayarlayın</translation> <translation id="7760004034676677601">Bu beklediğiniz başlangıç sayfası mı?</translation> +<translation id="7762024824096060040">Bu hesap kullanılamıyor</translation> <translation id="7762463735017901568">Bildirim senkronizasyonu telefonunuzun yöneticisi tarafından devre dışı bırakıldı</translation> <translation id="7764225426217299476">Adres ekle</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> alan adından <ph name="DOWNLOAD_RECEIVED" /></translation> @@ -7028,6 +7034,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> sn.</translation> <translation id="7920363873148656176"><ph name="ORIGIN" />, <ph name="FILENAME" /> dosyasını görüntüleyebilir</translation> <translation id="7920482456679570420">Yazım denetiminin atlamasını istediğiniz kelimeleri ekleyin</translation> +<translation id="7921347341284348270">Telefon bildirimlerinizi bu yönetilen hesapta görüntüleyemezsiniz. Farklı bir hesapla tekrar deneyin. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Gizli modda üçüncü taraf çerezleri engelleme ile ilgili ayrıntıları göster</translation> <translation id="7923564237306226146">Linux'u yeni sürüme geçirme işlemi tamamlandı</translation> <translation id="7924358170328001543">Bağlantı noktası yönlendirme hatası</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index fe82923..65f078f 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -3781,6 +3781,7 @@ <translation id="4648491805942548247">ناکافی اجازتیں</translation> <translation id="4650591383426000695">اپنے فون کو <ph name="DEVICE_TYPE" /> سے غیر منسلک کریں</translation> <translation id="4651484272688821107">ڈیمو موڈ کے وسائل کے ساتھ آن لائن جزو کو لوڈ نہیں کیا جا سکا۔</translation> +<translation id="4651921906638302153">اس اکاؤنٹ کے ساتھ سائن ان نہیں کر سکتے</translation> <translation id="4652935475563630866">کیمرے کی ترتیب میں تبدیلی کے لیے، Parallels ڈیسک ٹاپ کو بند کر کے دوبارہ چلانے کی ضرورت ہے۔ آگے بڑھنے کے لیے Parallels ڈیسک ٹاپ کو بند کر کے دوبارہ چلائیں۔</translation> <translation id="4653405415038586100">Linux کو کنفیگر کرنے میں خرابی</translation> <translation id="465406513924180949">آپ ایسے کارٹس کو دیکھ رہے ہیں جو آپ کو ویب پر شاپنگ کارٹس میں آپ کے چھوڑے ہوئے آئٹمز کو آسانی سے واپس لانے میں مدد کرتی ہیں۔ @@ -5436,6 +5437,7 @@ <translation id="6327785803543103246">ویب پراکسی کی خودکار دریافت</translation> <translation id="6331818708794917058">سائٹس MIDI آلات سے منسلک ہونے کے لیے پوچھ سکتی ہیں</translation> <translation id="6333064448949140209">ڈیبگ کرنے کیلئے فائل Google کو بھیج دی جائے گی</translation> +<translation id="6333170995003625229">آپ کے ای میل پتہ یا پاس ورڈ کی توثیق نہیں کی جا سکی۔ دوبارہ سائن ان کرنے کی کوشش کریں۔</translation> <translation id="6335920438823100346">Linux شروع کرنے کے لیے <ph name="MANAGER" /> کا تقاضہ ہے کہ آپ اپنے ڈیٹا کا بیک اپ لیں اور اس Chromebook کو فیکٹری کی ترتیبات پر ری سیٹ کریں۔</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> نے ADB ڈیبگنگ کو غیر فعال کر دیا ہے۔ یہ آپ کے <ph name="DEVICE_TYPE" /> کو 24 گھنٹوں میں ری سیٹ کر دے گا۔ کوئی بھی فائل کا بیک اپ لیں جسے آپ رکھنا چاہتے ہیں۔</translation> <translation id="6338981933082930623">سبھی سائٹس آپ کو کوئی اشتہار دکھا سکتی ہیں</translation> @@ -5844,6 +5846,7 @@ <translation id="6735304988756581115">کوکیز اور دیگر سائٹ ڈیٹا کو دکھائیں…</translation> <translation id="6736243959894955139">پتہ</translation> <translation id="6737663862851963468">Kerberos ٹکٹ ہٹائیں</translation> +<translation id="6738430949033571771">اکاؤنٹ کی توثیق کی جا رہی ہے...</translation> <translation id="6739923123728562974">ڈیسک ٹاپ شارٹ کٹ دکھائیں</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> موقوف ہو گئی</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />آپ کے منتظم<ph name="END_LINK" /> نے محفوظ براؤزنگ کو آف کر دیا ہے</translation> @@ -7661,6 +7664,8 @@ <translation id="8546306075665861288">تصویر کا کیش</translation> <translation id="8546930481464505581">ٹچ بار کو حسب ضرورت بنائيں</translation> <translation id="8547013269961688403">پوری اسکرین مکبّر کو فعال کریں</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> <ph name="MANAGER" /> کے زیر انتظام ہے۔ آپ اس ای میل کو اضافی اکاؤنٹ کے طور پر شامل نہیں کر سکتے۔<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" /> استعمال کرنے کے لیے، پہلے اپنے<ph name="DEVICE_TYPE" /> سے سائن آؤٹ کریں۔ پھر لاگ ان اسکرین کے نیچے، فرد شامل کریں کو منتخب کریں۔<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">سر فہرست قطار کی کلیدوں کے برتاؤ کو سوئچ کرنے کیلئے تلاش کی کلید کو دبائے رہیں</translation> <translation id="8549316893834449916">آپ اپنے Google اکاؤنٹ کو اپنے Chromebook میں سائن ان کرنے کیلئے استعمال کریں گے - وہی اکاؤنٹ جسے آپ Gmail, Drive, YouTube اور بہت کچھ کے لئے استعمال کرتے ہیں۔</translation> <translation id="8551388862522347954">لائسنسز</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 9880f8e..4a6c999b 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -858,6 +858,7 @@ <translation id="1813278315230285598">Xizmatlar</translation> <translation id="18139523105317219">EDI tarafi nomi</translation> <translation id="1815083418640426271">Oddiy matn sifatida joylash</translation> +<translation id="1815097521077272760">Klaviatura yordamida bu oʻyindagi harakatlarni boshqarish imkonini beradi.</translation> <translation id="1815181278146012280">Sayt HID qurilmalardan foydalanmoqchi bo‘lganda ruxsat so‘ralsin</translation> <translation id="181577467034453336">Yana <ph name="NUMBER_OF_VIEWS" /> ta...</translation> <translation id="1816036116994822943">Klaviaturani tekshirish tezligi</translation> @@ -992,6 +993,7 @@ <translation id="1935303383381416800">Joylashuvingizni koʻrishga ruxsat berilgan</translation> <translation id="1936931585862840749">Chop etish uchun nusxalar sonini kiriting (1-<ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102"><ph name="ARCHITECTURE_DEVICE" /> protsessorli qurilmangizga <ph name="ARCHITECTURE_CONTAINER" /> turidagi zaxiraviy nusxasi tiklanmaydi. Arxivni boshqa turdagi protsessorli qurilmada tiklash yoki Fayllar ilovasi orqali tarkibidagi zaxiralangan fayllarini ochish mumkin.</translation> +<translation id="1938320257168860255">Xatolik yuz berdi. Uning yaqin-atrofda, qulfdan chiqarilgan, Bluetooth va Wi-Fi yoqilganligiga ishonch hosil qiling.</translation> <translation id="1938351510777341717">Tashqi buyruq</translation> <translation id="1940546824932169984">Ulangan qurilmalar</translation> <translation id="1941410638996203291">Boshlanish vaqti: <ph name="TIME" /></translation> @@ -1074,6 +1076,7 @@ <translation id="2030455719695904263">Sensorli panel</translation> <translation id="2031639749079821948">Parol Google hisobingizga saqlandi</translation> <translation id="2031914984822377766"><ph name="LINK_BEGIN" />Vebsayt<ph name="LINK_END" /> uchun afzal tillarni kiriting. Tarjimalarda roʻyxat boshidagi til ishlatiladi.</translation> +<translation id="2033758234986231162">Telefon bilan aloqa uzildi. Uning yaqin-atrofda, qulfdan chiqarilgan, Bluetooth va Wi-Fi yoqilganligiga ishonch hosil qiling.</translation> <translation id="2034346955588403444">Boshqa WiFi tarmoq qo‘shish</translation> <translation id="203574396658008164">Qulflangan ekrandan eslatmalar olishga ruxsat berish</translation> <translation id="2037445849770872822">Bu Google hisobi uchun nazorat sozlangan. Ota-ona nazoratini chuqurroq sozlash uchun Davom etish tugmasini bosing. @@ -3744,6 +3747,7 @@ <translation id="461661862154729886">Energiya manbai</translation> <translation id="4617001782309103936">Juda qisqa</translation> <translation id="4617270414136722281">Kengaytma parametrlari</translation> +<translation id="4617880081511131945">Aloqa oʻrnatilmadi</translation> <translation id="4619564267100705184">Bu siz ekaningizni isbotlang</translation> <translation id="4619615317237390068">Boshqa qurilmalardan sinxronlangan varaqlar</translation> <translation id="4620809267248568679">Bu parametr kengaytma tomonidan kuchga kiritilgan.</translation> @@ -4036,6 +4040,7 @@ <translation id="4907306957610201395">Ruxsatnomalar turkumi</translation> <translation id="4908811072292128752">Yangi varaq ochib, bir vaqtda ikkita saytni kezish mumkin</translation> <translation id="4909038193460299775">Chunki bu hisob <ph name="DOMAIN" /> domeni tomonidan boshqariladi. Xatcho‘plar, tarix, parol va boshqa sozlamalar bu qurilmadan o‘chiriladi, lekin mavjud ma’lumotlaringiz Google hisobingizda saqlanib qoladi va ular bilan <ph name="BEGIN_LINK" />Google Shaxsiy kabinet<ph name="END_LINK" /> orqali ishlash mumkin.</translation> +<translation id="4912265719039610598">Ilovalar strimingini telefon administratori taqiqlagan.</translation> <translation id="4912643508233590958">Uyqu rejimidan chiqishlar</translation> <translation id="4915961947098019832">Rasmlarni koʻrsatishga ruxsat berilgan</translation> <translation id="4916542008280060967">Saytga <ph name="FILE_NAME" /> faylini tahrirlashga ruxsat berilsinmi?</translation> @@ -6864,6 +6869,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Ekraningiz chetini chegaralar bilan moslang</translation> <translation id="7760004034676677601">Bu boshqa bosh sahifami?</translation> +<translation id="7762024824096060040">Bu hisobdan foydalanish imkonsiz</translation> <translation id="7762463735017901568">Bildirishnomalar sinxronizatsiyasi telefon administratori tomonidan faolsizlantirilgan</translation> <translation id="7764225426217299476">Manzil kiritish</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_DOMAIN" /> saytidan <ph name="DOWNLOAD_RECEIVED" /></translation> @@ -7033,6 +7039,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> s</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> sayti <ph name="FILENAME" /> faylini koʻra oladi</translation> <translation id="7920482456679570420">Imlo tekshiruvidan istisno soʻzlarni kiriting</translation> +<translation id="7921347341284348270">Bu boshqariladigan hisobda telefon bildirishnomalarini koʻra olmaysiz. Boshqa hisob bilan qayta urining. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Inkognito rejimida tashqi cookie fayllar bloklanishi tafsilotini chiqarish</translation> <translation id="7923564237306226146">Linux yangilandi</translation> <translation id="7924358170328001543">Portni uzatishda xato</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 96690ce..d4b61e6f 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -871,6 +871,7 @@ <translation id="1813278315230285598">Dịch vụ</translation> <translation id="18139523105317219">Tên của Bên EDI</translation> <translation id="1815083418640426271">Dán dưới dạng văn bản thuần túy</translation> +<translation id="1815097521077272760">Bạn được mời dùng thử tính năng kiểm soát bàn phím cho trò chơi này.</translation> <translation id="1815181278146012280">Hỏi khi một trang web muốn truy cập vào các thiết bị HID</translation> <translation id="181577467034453336"><ph name="NUMBER_OF_VIEWS" /> lượt xem khác...</translation> <translation id="1816036116994822943">Tốc độ quét khi dùng bàn phím</translation> @@ -1005,6 +1006,7 @@ <translation id="1935303383381416800">Được phép xem vị trí của bạn</translation> <translation id="1936931585862840749">Hãy dùng số để biểu thị số lượng bản cần in (1 đến <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">Không thể nhập loại kiến trúc vùng chứa <ph name="ARCHITECTURE_CONTAINER" /> bằng thiết bị thuộc loại <ph name="ARCHITECTURE_DEVICE" /> này. Bạn có thể thử khôi phục vùng chứa này vào một thiết bị khác hoặc truy cập vào các tệp bên trong hình ảnh vùng chứa này bằng cách mở trong ứng dụng Files.</translation> +<translation id="1938320257168860255">Đã xảy ra lỗi. Hãy đảm bảo điện thoại của bạn đang ở gần, đã mở khoá và đã bật Bluetooth và Wi-Fi.</translation> <translation id="1938351510777341717">Lệnh bên ngoài</translation> <translation id="1940546824932169984">Thiết bị đã kết nối</translation> <translation id="1941410638996203291">Thời gian bắt đầu <ph name="TIME" /></translation> @@ -1087,6 +1089,7 @@ <translation id="2030455719695904263">Bàn di chuột</translation> <translation id="2031639749079821948">Mật khẩu của bạn được lưu trong Tài khoản Google</translation> <translation id="2031914984822377766">Thêm <ph name="LINK_BEGIN" />các ngôn ngữ ưu tiên cho trang web<ph name="LINK_END" />. Ngôn ngữ hàng đầu trong danh sách này sẽ được dùng cho các bản dịch.</translation> +<translation id="2033758234986231162">Không duy trì được kết nối với điện thoại của bạn. Hãy đảm bảo điện thoại của bạn đang ở gần, đã mở khoá và đã bật Bluetooth và Wi-Fi.</translation> <translation id="2034346955588403444">Thêm mạng Wi-Fi khác</translation> <translation id="203574396658008164">Bật tính năng ghi chú từ màn hình khóa</translation> <translation id="2037445849770872822">Tính năng giám sát đã được thiết lập cho Tài khoản Google này. Để thiết lập thêm quyền kiểm soát của cha mẹ, hãy chọn Tiếp tục. @@ -3757,6 +3760,7 @@ <translation id="461661862154729886">Nguồn điện</translation> <translation id="4617001782309103936">Quá ngắn</translation> <translation id="4617270414136722281">Tùy chọn tiện ích</translation> +<translation id="4617880081511131945">Không thiết lập được kết nối</translation> <translation id="4619564267100705184">Xác minh danh tính của bạn</translation> <translation id="4619615317237390068">Thẻ từ các thiết bị khác</translation> <translation id="4620809267248568679">Cài đặt này được tiện ích thực hiện.</translation> @@ -3792,6 +3796,7 @@ <translation id="4648491805942548247">Không đủ quyền</translation> <translation id="4650591383426000695">Ngắt kết nối điện thoại khỏi <ph name="DEVICE_TYPE" /></translation> <translation id="4651484272688821107">Không thể tải thành phần trực tuyến có tài nguyên chế độ minh họa.</translation> +<translation id="4651921906638302153">Không đăng nhập được bằng tài khoản này</translation> <translation id="4652935475563630866">Bạn cần chạy lại ứng dụng Parallels Desktop để thay đổi tùy chọn cài đặt máy ảnh. Hãy chạy lại ứng dụng Parallels Desktop để tiếp tục.</translation> <translation id="4653405415038586100">Lỗi khi định cấu hình Linux</translation> <translation id="465406513924180949">Bạn đang xem những giỏ hàng giúp bạn dễ dàng tìm lại các mặt hàng mà bạn từng đưa vào các giỏ hàng trên mạng. @@ -4049,6 +4054,7 @@ <translation id="4907306957610201395">Danh mục quyền</translation> <translation id="4908811072292128752">Mở thẻ mới để duyệt hai trang web cùng lúc</translation> <translation id="4909038193460299775">Vì tài khoản này do <ph name="DOMAIN" /> quản lý nên dấu trang, lịch sử, mật khẩu và các cài đặt khác của bạn sẽ bị xóa khỏi thiết bị này. Tuy nhiên, dữ liệu của bạn sẽ vẫn được lưu trữ trong Tài khoản Google và có thể được quản lý trên <ph name="BEGIN_LINK" />Trang tổng quan Google<ph name="END_LINK" />.</translation> +<translation id="4912265719039610598">Quản trị viên phụ trách điện thoại của bạn đã tắt tính năng phát trực tuyến qua ứng dụng.</translation> <translation id="4912643508233590958">Đánh thức khỏi chế độ rảnh</translation> <translation id="4915961947098019832">Được phép hiển thị hình ảnh</translation> <translation id="4916542008280060967">Cho phép trang web chỉnh sửa <ph name="FILE_NAME" />?</translation> @@ -5447,6 +5453,7 @@ <translation id="6327785803543103246">Tự động phát hiện proxy web</translation> <translation id="6331818708794917058">Các trang web có thể yêu cầu kết nối với thiết bị MIDI</translation> <translation id="6333064448949140209">Tệp sẽ được gửi tới Google để được gỡ lỗi</translation> +<translation id="6333170995003625229">Không xác minh được địa chỉ email hoặc mật khẩu của bạn. Hãy thử đăng nhập lại.</translation> <translation id="6335920438823100346">Để khởi động Linux, <ph name="MANAGER" /> yêu cầu bạn sao lưu dữ liệu và đặt lại thiết bị Chromebook này về trạng thái cài đặt ban đầu.</translation> <translation id="6336038146639916978"><ph name="MANAGER" /> đã tắt tùy chọn gỡ lỗi ADB. Thao tác này sẽ đặt lại <ph name="DEVICE_TYPE" /> của bạn sau 24 giờ nữa. Hãy sao lưu mọi tệp bạn muốn giữ lại.</translation> <translation id="6338981933082930623">Mọi trang web đều có thể hiển thị quảng cáo bất kỳ cho bạn</translation> @@ -5855,6 +5862,7 @@ <translation id="6735304988756581115">Hiển thị cookie và các dữ liệu khác của trang web...</translation> <translation id="6736243959894955139">Địa chỉ</translation> <translation id="6737663862851963468">Xóa vé Kerberos</translation> +<translation id="6738430949033571771">Đang xác minh tài khoản...</translation> <translation id="6739923123728562974">Hiển thị lối tắt trên màn hình</translation> <translation id="6740234557573873150">Đã tạm dừng <ph name="FILE_NAME" /></translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Quản trị viên của bạn<ph name="END_LINK" /> đã tắt tính năng Duyệt web an toàn</translation> @@ -6877,6 +6885,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">Điều chỉnh ranh giới cho màn hình của bạn</translation> <translation id="7760004034676677601">Đây có phải là trang khởi động bạn muốn không?</translation> +<translation id="7762024824096060040">Không dùng được tài khoản này</translation> <translation id="7762463735017901568">Quản trị viên phụ trách điện thoại của bạn đã tắt chế độ đồng bộ hoá thông báo</translation> <translation id="7764225426217299476">Thêm địa chỉ</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> từ <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7047,6 +7056,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> giây</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> có thể xem <ph name="FILENAME" /></translation> <translation id="7920482456679570420">Thêm các từ mà bạn muốn tính năng kiểm tra lỗi chính tả bỏ qua</translation> +<translation id="7921347341284348270">Bạn không xem được thông báo của điện thoại trên tài khoản được quản lý này. Hãy thử một tài khoản khác. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="7922935920104868876">Hiện thông tin chi tiết về việc chặn cookie bên thứ ba trong chế độ Ẩn danh</translation> <translation id="7923564237306226146">Đã hoàn tất quá trình nâng cấp Linux</translation> <translation id="7924358170328001543">Lỗi khi chuyển tiếp cổng</translation> @@ -7672,6 +7682,8 @@ <translation id="8546306075665861288">Bộ nhớ đệm hình ảnh</translation> <translation id="8546930481464505581">Tùy chỉnh Thanh cảm ứng</translation> <translation id="8547013269961688403">Bật tính năng phóng to toàn bộ màn hình</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> do <ph name="MANAGER" /> quản lý. Bạn không thêm được email này làm tài khoản bổ sung.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Để sử dụng <ph name="USER_EMAIL" />, trước hết hãy đăng nhập khỏi <ph name="DEVICE_TYPE" />. Sau đó, ở dưới dùng màn hình đăng nhập, hãy chọn Thêm người.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">Giữ phím Tìm kiếm để chuyển đổi chức năng của các phím hàng trên cùng</translation> <translation id="8549316893834449916">Bạn sẽ dùng Tài khoản Google để đăng nhập vào Chromebook. Đây cũng chính là tài khoản bạn dùng cho Gmail, Drive, YouTube và nhiều sản phẩm khác.</translation> <translation id="8551388862522347954">Giấy phép</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index fbc7a3b..9add732 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -855,6 +855,7 @@ <translation id="1813278315230285598">服务</translation> <translation id="18139523105317219">EDI 参与方名称</translation> <translation id="1815083418640426271">粘贴为纯文本</translation> +<translation id="1815097521077272760">您已受邀试用此游戏的键盘控件。</translation> <translation id="1815181278146012280">当网站想访问 HID 设备时询问您</translation> <translation id="181577467034453336">另外还有 <ph name="NUMBER_OF_VIEWS" /> 个…</translation> <translation id="1816036116994822943">键盘扫描速度</translation> @@ -986,6 +987,7 @@ <translation id="1935303383381416800">允许查看您的位置信息</translation> <translation id="1936931585862840749">请使用一个介于 1-<ph name="MAX_COPIES" /> 之间的数字来表明要打印多少份。</translation> <translation id="1937774647013465102">无法使用此设备(即 <ph name="ARCHITECTURE_DEVICE" />)导入容器架构类型 <ph name="ARCHITECTURE_CONTAINER" />。您既可尝试将此容器恢复到另一设备中,也可使用“文件”应用打开此容器映像内的文件以进行访问。</translation> +<translation id="1938320257168860255">出了点问题。请确保您的手机就在附近、处于解锁状态,且已开启蓝牙和 Wi-Fi。</translation> <translation id="1938351510777341717">外部命令</translation> <translation id="1940546824932169984">已连接的设备</translation> <translation id="1941410638996203291">开始时间:<ph name="TIME" /></translation> @@ -1068,6 +1070,7 @@ <translation id="2030455719695904263">触控板</translation> <translation id="2031639749079821948">您的密码已保存到您的 Google 帐号中</translation> <translation id="2031914984822377766">添加您首选的<ph name="LINK_BEGIN" />网站语言<ph name="LINK_END" />。列表中的第一种语言将被用作翻译时的目标语言。</translation> +<translation id="2033758234986231162">无法保持与您手机的连接。请确保您的手机就在附近、处于解锁状态,且已开启蓝牙和 Wi-Fi。</translation> <translation id="2034346955588403444">添加其他 Wi-Fi 网络</translation> <translation id="203574396658008164">从锁定屏幕启用备注功能</translation> <translation id="2037445849770872822">此 Google 帐号的监管功能已设置完毕。要设置更多家长控制,请选择“继续”。 @@ -3729,6 +3732,7 @@ <translation id="461661862154729886">电源</translation> <translation id="4617001782309103936">太短</translation> <translation id="4617270414136722281">扩展程序选项</translation> +<translation id="4617880081511131945">无法建立连接</translation> <translation id="4619564267100705184">请验证是您本人在操作</translation> <translation id="4619615317237390068">从其他设备打开的标签页</translation> <translation id="4620809267248568679">此设置是由扩展程序强制设置的。</translation> @@ -4021,6 +4025,7 @@ <translation id="4907306957610201395">权限类别</translation> <translation id="4908811072292128752">只需打开一个新标签页,即可同时浏览两个网站</translation> <translation id="4909038193460299775">由于此帐号是由 <ph name="DOMAIN" /> 管理,因此系统将会从该设备中清除您的书签、历史记录、密码及其他设置。但是,您的数据依然会存储在您的 Google 帐号中,而且您可以通过 <ph name="BEGIN_LINK" />Google 信息中心<ph name="END_LINK" />管理这些数据。</translation> +<translation id="4912265719039610598">应用串流已被您手机的管理员停用。</translation> <translation id="4912643508233590958">闲置状态唤醒</translation> <translation id="4915961947098019832">允许显示图片</translation> <translation id="4916542008280060967">允许此网站修改“<ph name="FILE_NAME" />”?</translation> @@ -6846,6 +6851,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">调整显示屏的边界</translation> <translation id="7760004034676677601">这是您想要的启动页吗?</translation> +<translation id="7762024824096060040">无法使用此帐号</translation> <translation id="7762463735017901568">手机管理员已停用通知同步功能</translation> <translation id="7764225426217299476">添加地址</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" />,来自 <ph name="DOWNLOAD_DOMAIN" /></translation> @@ -7015,6 +7021,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> 秒</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> 可以查看“<ph name="FILENAME" />”的内容</translation> <translation id="7920482456679570420">添加您想让“拼写检查”功能跳过的字词</translation> +<translation id="7921347341284348270">您无法通过这个受管理的帐号查看手机上的通知。请换个帐号重试。<ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation> <translation id="7922935920104868876">显示在无痕模式下屏蔽第三方 Cookie 的有关详情</translation> <translation id="7923564237306226146">Linux 升级完毕</translation> <translation id="7924358170328001543">转发端口时出错</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 3882a62a..e6949418 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -859,6 +859,7 @@ <translation id="1813278315230285598">服務</translation> <translation id="18139523105317219">EDI 合作對象名稱</translation> <translation id="1815083418640426271">以純文字貼上</translation> +<translation id="1815097521077272760">你已受邀試用這個遊戲的鍵盤操控功能。</translation> <translation id="1815181278146012280">網站必須先詢問你,才能存取 HID 裝置</translation> <translation id="181577467034453336">還有 <ph name="NUMBER_OF_VIEWS" /> 個畫面...</translation> <translation id="1816036116994822943">鍵盤掃描速度</translation> @@ -992,6 +993,7 @@ <translation id="1935303383381416800">可以查看你的位置資訊</translation> <translation id="1936931585862840749">使用數字指定列印份數 (1 至 <ph name="MAX_COPIES" />)。</translation> <translation id="1937774647013465102">這個裝置使用 <ph name="ARCHITECTURE_DEVICE" />,因此無法匯入容器架構類型 <ph name="ARCHITECTURE_CONTAINER" />。你可以嘗試將這個容器還原至其他裝置,或透過 Files 應用程式開啟這個容器映像檔,以存取其中的檔案。</translation> +<translation id="1938320257168860255">發生錯誤。請確認你的手機在附近且處於解鎖狀態,並已開啟藍牙和 Wi-Fi。</translation> <translation id="1938351510777341717">外部 Command 鍵</translation> <translation id="1940546824932169984">已連結的裝置</translation> <translation id="1941410638996203291">開始時間 <ph name="TIME" /></translation> @@ -1074,6 +1076,7 @@ <translation id="2030455719695904263">觸控板</translation> <translation id="2031639749079821948">你已將密碼儲存在 Google 帳戶中</translation> <translation id="2031914984822377766">新增偏好的<ph name="LINK_BEGIN" />網站語言<ph name="LINK_END" />。系統會將文字翻譯成清單頂端的語言。</translation> +<translation id="2033758234986231162">無法與你的手機維持連線狀態。請確認你的手機在附近且處於解鎖狀態,並已開啟藍牙和 Wi-Fi。</translation> <translation id="2034346955588403444">新增其他 WiFi 網路</translation> <translation id="203574396658008164">允許在螢幕鎖定狀態下建立記事</translation> <translation id="2037445849770872822">你已設定這個 Google 帳戶的監督功能。如要設定更多家長監護功能,請選取 [繼續]。 @@ -3738,6 +3741,7 @@ <translation id="461661862154729886">電源</translation> <translation id="4617001782309103936">太短</translation> <translation id="4617270414136722281">擴充功能選項</translation> +<translation id="4617880081511131945">無法建立連線</translation> <translation id="4619564267100705184">驗證身分</translation> <translation id="4619615317237390068">在其他裝置上開啟的分頁</translation> <translation id="4620809267248568679">這項設定是由擴充功能執行。</translation> @@ -4030,6 +4034,7 @@ <translation id="4907306957610201395">權限類別</translation> <translation id="4908811072292128752">開啟新分頁即可一次瀏覽兩個網站</translation> <translation id="4909038193460299775">這個帳戶是由 <ph name="DOMAIN" /> 所管理,因此系統會將你的書籤、歷史記錄、密碼和其他設定從這個裝置上清除。不過,你的資料仍會儲存在你的 Google 帳戶中,並可透過 <ph name="BEGIN_LINK" />Google 資訊主頁<ph name="END_LINK" />管理。</translation> +<translation id="4912265719039610598">手機管理員已停用應用程式串流功能。</translation> <translation id="4912643508233590958">閒置喚醒</translation> <translation id="4915961947098019832">可以顯示圖片</translation> <translation id="4916542008280060967">要允許網站編輯「<ph name="FILE_NAME" />」嗎?</translation> @@ -6854,6 +6859,7 @@ <translation id="7758143121000533418">Family Link</translation> <translation id="7758450972308449809">調整顯示畫面邊界</translation> <translation id="7760004034676677601">這是你想要的起始網頁嗎?</translation> +<translation id="7762024824096060040">無法使用這個帳戶</translation> <translation id="7762463735017901568">手機管理員已停用通知同步功能</translation> <translation id="7764225426217299476">新增地址</translation> <translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> (來源網域:<ph name="DOWNLOAD_DOMAIN" />)</translation> @@ -7024,6 +7030,7 @@ <translation id="7919210519031517829"><ph name="DURATION" /> 秒</translation> <translation id="7920363873148656176"><ph name="ORIGIN" /> 可以檢視「<ph name="FILENAME" />」</translation> <translation id="7920482456679570420">新增要讓拼字檢查功能略過的字詞</translation> +<translation id="7921347341284348270">無法透過這個受管理的帳戶查看手機的通知,請改用其他帳戶重試。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="7922935920104868876">顯示在無痕模式中封鎖第三方 Cookie 的詳細資料</translation> <translation id="7923564237306226146">Linux 升級已完成</translation> <translation id="7924358170328001543">轉送連接埠時發生錯誤</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 156185dc..15d4a9c 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -3796,6 +3796,7 @@ <translation id="4648491805942548247">Izimvume ezinganele</translation> <translation id="4650591383426000695">Nqamula ifoni yakho kusuka ku-<ph name="DEVICE_TYPE" /> yakho</translation> <translation id="4651484272688821107">Ayikwazanga ukulayisha into ngezisetshenziswa zemodi yedemo.</translation> +<translation id="4651921906638302153">Awukwazi ukungena ngemvume ngale akhawunti</translation> <translation id="4652935475563630866">Ushintsho kusethingi yekhamera kudinga ukuthi i-Paralles Desktop iqalise kabusha. Qala kabusha i-Parallels Desktop ukuze uqhubeke.</translation> <translation id="4653405415038586100">Iphutha lokulungiselela i-Linux</translation> <translation id="465406513924180949">Ubona obhasikidi akusiza ukuthi ubuyele kalula ezintweni ozishiye kobhasikidi bokuthenga kuwebhu yonkana. @@ -5455,6 +5456,7 @@ <translation id="6327785803543103246">Ukuthola ngokuzenzakalela ummeleli wewebhu</translation> <translation id="6331818708794917058">Amasayithi angacela ukuxhumeka kumadivayisi e-MIDI</translation> <translation id="6333064448949140209">Ifayela lizothunyelwa ku-Google ngokususa amaphutha</translation> +<translation id="6333170995003625229">Ikheli le-imeyili yakho noma iphasiwedi ayiqinisekiswanga. Zama ukuphinda ungene ngemvume.</translation> <translation id="6335920438823100346">Ukuze uqalise i-Linux, i-<ph name="MANAGER" /> idinga ukuba wenza isipele kudatha yakho bese usethe kabusha le-Chromebook kuzilungiselelo zasekuqaleni.</translation> <translation id="6336038146639916978">I-<ph name="MANAGER" /> ikhubaze ukulungisa amaphutha e-ADB. Lokhu kuzosetha kabusha i-<ph name="DEVICE_TYPE" /> yakho emahoreni angu-24. Yenza ikhophi yasenqolobaneni noma yimaphi amafayela ongathanda ukuwagcina.</translation> <translation id="6338981933082930623">Wonke amasayithi angabonisa noma iziphi izikhangiso kuwe</translation> @@ -5865,6 +5867,7 @@ <translation id="6735304988756581115">Bonisa amakhukhi nenye idatha yesayithi...</translation> <translation id="6736243959894955139">Ikheli</translation> <translation id="6737663862851963468">Susa ithikithi le-Kerberos</translation> +<translation id="6738430949033571771">Qinisekisa i-akhawunti...</translation> <translation id="6739923123728562974">Bonisa isinqamuleli sedeskithophu</translation> <translation id="6740234557573873150">I-<ph name="FILE_NAME" /> emiswe isikhashana</translation> <translation id="6741063444351041466"><ph name="BEGIN_LINK" />Umlawuli wakho<ph name="END_LINK" /> uvale ukuphequlula ngokuphephile</translation> @@ -7682,6 +7685,8 @@ <translation id="8546306075665861288">Inqolobane yesithombe</translation> <translation id="8546930481464505581">Yenza ngezifiso ibha yokuthinta</translation> <translation id="8547013269961688403">Nika amandla isikhulisi sesikrini esigcwele</translation> +<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" />i-<ph name="USER_EMAIL" /> iphethwe ngu-<ph name="MANAGER" />. Awukwazi ukwengeza le imeyili njenge-akhawunti engeziwe.<ph name="END_PARAGRAPH1" /> + <ph name="BEGIN_PARAGRAPH2" />Ukuze usebenzise i-<ph name="USER_EMAIL" />, qala ngokuphuma ngemvume ku-<ph name="DEVICE_TYPE" />yakho. Bese ngaphansi kwesikrini sokungena ngemvume, khetha okuthi Engeza Umuntu.<ph name="END_PARAGRAPH2" /></translation> <translation id="85486688517848470">Bamba ukhiye we-Usesho ukuze ushintshe impatho yokhiye abakurowu eliphezulu</translation> <translation id="8549316893834449916">Uzosebenzisa i-akhawunti yakho ye-Google ukungena ngemvume ku-Chromebook yakho– i-akhawunti efanayo oyisebenzisela i-Gmail, IDrayivu, i-YouTube, nokuningi.</translation> <translation id="8551388862522347954">Amalayisense</translation>
diff --git a/chrome/app/resources/google_chrome_strings_af.xtb b/chrome/app/resources/google_chrome_strings_af.xtb index 7a463d11..7fb01c0 100644 --- a/chrome/app/resources/google_chrome_strings_af.xtb +++ b/chrome/app/resources/google_chrome_strings_af.xtb
@@ -192,6 +192,7 @@ <translation id="4969674060580488087">Chrome OS Flex kon nie jou data sinkroniseer nie omdat jou rekening se aanmeldbesonderhede verouderd is.</translation> <translation id="4970761609246024540">Welkom by Chrome-profiele</translation> <translation id="4970880042055371251">Chrome-bedryfstelselweergawe</translation> +<translation id="4970947549776831107">Chrome het hierdie lêer geblokkeer omdat hierdie soort lêer gevaarlik is</translation> <translation id="4990567037958725628">Google Chrome Kanarie</translation> <translation id="5037581483200764584">Jy het macOS 10.13 of nuwer nodig om in die toekoms Google Chrome-opdaterings te kry. Hierdie rekenaar gebruik OS X 10.11.</translation> <translation id="5112116809696021727">Gaan na <ph name="LINK_BEGIN" />Chrome-bedryfstelselinstellings<ph name="LINK_END" /> om te sien of jou toestel bygewerk is</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb index f3a705b..e45a975 100644 --- a/chrome/app/resources/google_chrome_strings_am.xtb +++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -190,6 +190,7 @@ <translation id="4969674060580488087">የመለያ መግቢያ ዝርዝሮችዎ ጊዜ ያለፈባቸው ስለሆኑ ChromeOS Flex ውሂብዎን ማስመር አልቻለም።</translation> <translation id="4970761609246024540">ወደ Chrome መገለጫዎች እንኳን በደህና መጡ</translation> <translation id="4970880042055371251">የChromeOS ስሪት</translation> +<translation id="4970947549776831107">እንደዚህ አይነት ፋይል አደገኛ ስለሆነ Chrome ይህን ፋይል አግዶታል።</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5037581483200764584">የወደፊት የGoogle Chrome ዝመኔዎችን ለማግኘት፣ macOS 10.13 ወይም ከዚያ በኋላ ያለው ያስፈልግዎታል። ይህ ኮምፒተር OS X 10.11 እየተጠቀመ ነው።</translation> <translation id="5112116809696021727">መሣሪያዎ የተዘመነ ከሆነ ለማየት ወደ <ph name="LINK_BEGIN" />የChromeOS ቅንብሮች ይሂዱ<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb index 82ed057e..4747743 100644 --- a/chrome/app/resources/google_chrome_strings_az.xtb +++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -189,6 +189,7 @@ <translation id="4969674060580488087">ChromeOS Flex datanızı sinxronizasiya edə bilmir, çünki hesaba giriş məlumatlarınız köhnədir.</translation> <translation id="4970761609246024540">Chrome profillərinə xoş gəlmisiniz</translation> <translation id="4970880042055371251">ChromeOS versiyası</translation> +<translation id="4970947549776831107">Chrome bu faylı bloklayıb, çünki bu fayl növü təhlükəlidir</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5037581483200764584">Google Chrome güncəlləmələrini əldə etmək üçün macOS 10.13 və ya daha yeni versiya tələb olunur. Bu kompüter OS X 10.11 istifadə edir.</translation> <translation id="5112116809696021727">Cihazınızın güncəl olub-olmadığına baxmaq üçün <ph name="LINK_BEGIN" />ChromeOS Ayarlarına<ph name="LINK_END" /> keçin</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb index 30847313..bcb93d01 100644 --- a/chrome/app/resources/google_chrome_strings_bn.xtb +++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -190,6 +190,7 @@ <translation id="4969674060580488087">আপনার অ্যাকাউন্টের সাইন-ইনের বিবরণ পুরানো হয়ে যাওয়ার কারণে ChromeOS Flex আপনার ডেটা সিঙ্ক করতে পারেনি।</translation> <translation id="4970761609246024540">Chrome প্রোফাইলে স্বাগতম</translation> <translation id="4970880042055371251">ChromeOS ভার্সন</translation> +<translation id="4970947549776831107">এই ধরনের ফাইল বিপজ্জনক বলে Chrome এটি ব্লক করেছে</translation> <translation id="4990567037958725628">Google Chrome ক্যানারি</translation> <translation id="5037581483200764584">ভবিষ্যতে Google Chrome আপডেট পেতে হলে, আপনার macOS 10.13 বা এর পরবর্তী ভার্সন থাকতে হবে। এই কম্পিউটারে OS X 10.11 ভার্সন ব্যবহার করা হচ্ছে।</translation> <translation id="5112116809696021727">আপনার ডিভাইস আপ-টু-ডেট আছে কিনা তা দেখতে <ph name="LINK_BEGIN" />ChromeOS সেটিংস<ph name="LINK_END" /> বিকল্পে যান</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb index 75a95192..2b27794 100644 --- a/chrome/app/resources/google_chrome_strings_da.xtb +++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -188,6 +188,7 @@ <translation id="4969674060580488087">ChromeOS Flex kunne ikke synkronisere dine data, da loginoplysningerne for din konto er forældede.</translation> <translation id="4970761609246024540">Velkommen til Chrome-profiler</translation> <translation id="4970880042055371251">Chrome OS-version</translation> +<translation id="4970947549776831107">Chrome har blokeret denne fil, fordi denne type fil er skadelig</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5037581483200764584">Hvis du vil have fremtidige Google Chrome-opdateringer, skal du have macOS 10.13 eller nyere. Denne computer anvender OS X 10.11.</translation> <translation id="5112116809696021727">Du kan se, om en enhed er opdateret, ved at gå til <ph name="LINK_BEGIN" />indstillingerne for Chrome OS<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb index ebb3579..9c999ea6 100644 --- a/chrome/app/resources/google_chrome_strings_eu.xtb +++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -191,6 +191,7 @@ <translation id="4969674060580488087">ChromeOS Flex-ek ezin izan ditu sinkronizatu zure datuak, kontuan saioa hasteko xehetasunak iraungi egin direlako.</translation> <translation id="4970761609246024540">Ongi etorri Chrome-ko profiletara</translation> <translation id="4970880042055371251">Chrome OS-ren bertsioa</translation> +<translation id="4970947549776831107">Chrome-k blokeatu egin du fitxategia mota horretako fitxategiak arriskutsuak direlako</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5037581483200764584">Etorkizunean Google Chrome-ren eguneratzeak eskuratzeko, macOS 10.13 edo berriago bat beharko duzu. Ordenagailu hau OS X 10.11 erabiltzen ari da.</translation> <translation id="5112116809696021727">Gailua eguneratuta dagoen ikusteko, joan <ph name="LINK_BEGIN" />Chrome OS-ren ezarpenetara<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb index 8ad0961..c098a22 100644 --- a/chrome/app/resources/google_chrome_strings_fa.xtb +++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -188,6 +188,7 @@ <translation id="4969674060580488087">ChromeOS Flex نتوانست دادههایتان را همگامسازی کند زیرا جزئیات ورود به سیستم حسابتان بهروز نیست.</translation> <translation id="4970761609246024540">به نمایههای Chrome خوشآمدید</translation> <translation id="4970880042055371251">نسخه ChromeOS</translation> +<translation id="4970947549776831107">Chrome این فایل را مسدود کرد زیرا این نوع فایل خطرناک است</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5037581483200764584">برای دریافت بهروزرسانیهای آتی Google Chrome، باید macOS نسخه ۱۰.۱۳ یا بالاتر داشته باشید. این رایانه از OS X نسخه ۱۰.۱۱ استفاده میکند.</translation> <translation id="5112116809696021727">برای اینکه ببینید دستگاهتان بهروز است یا نه، به <ph name="LINK_BEGIN" />تنظیمات ChromeOS<ph name="LINK_END" /> بروید</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb index e5e806ac..a46a5aaf 100644 --- a/chrome/app/resources/google_chrome_strings_fil.xtb +++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -192,6 +192,7 @@ <translation id="4969674060580488087">Hindi ma-sync ng ChromeOS Flex ang iyong data dahil hindi napapanahon ang mga detalye sa pag-sign in sa iyong account.</translation> <translation id="4970761609246024540">Welcome sa mga profile sa Chrome</translation> <translation id="4970880042055371251">Bersyon ng ChromeOS</translation> +<translation id="4970947549776831107">Na-block ng Chrome ang file na ito dahil mapanganib ang ganitong uri ng file</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5037581483200764584">Para makakuha ng mga update sa Google Chrome sa hinaharap, kakailanganin mo ng macOS 10.13 o mas bago. Gumagamit ang computer na ito ng OS X 10.11.</translation> <translation id="5112116809696021727">Para makita kung up to date ang iyong device, pumunta sa <ph name="LINK_BEGIN" />Mga Setting ng ChromeOS<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb index 8b17364..5a661ace 100644 --- a/chrome/app/resources/google_chrome_strings_gu.xtb +++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -192,6 +192,7 @@ <translation id="4969674060580488087">તમારા એકાઉન્ટની સાઇન ઇન વિગતો જૂની હોવાને કારણે ChromeOS Flex તમારા ડેટાને સિંક કરી શક્યું નથી.</translation> <translation id="4970761609246024540">Chrome પ્રોફાઇલમાં આપનું સ્વાગત છે</translation> <translation id="4970880042055371251">ChromeOSનું વર્ઝન</translation> +<translation id="4970947549776831107">આ પ્રકારની ફાઇલ જોખમી હોવાને કારણે Chrome દ્વારા આ ફાઇલને બ્લૉક કરવામાં આવી છે</translation> <translation id="4990567037958725628">Google Chrome કૅનેરી</translation> <translation id="5037581483200764584">Google Chromeની ભાવિ અપડેટ મેળવવા માટે, તમારે macOS 10.13 કે તે પછીના વર્ઝન પર અપડેટ કરવું જરૂરી રહેશે. આ કમ્પ્યુટર OS X 10.11નો ઉપયોગ કરે છે.</translation> <translation id="5112116809696021727">તમારું ડિવાઇસ અપ ટૂ ડેટ છે કે નહીં, તે જાણવા માટે <ph name="LINK_BEGIN" />ChromeOSના સેટિંગ<ph name="LINK_END" /> પર જાઓ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hy.xtb b/chrome/app/resources/google_chrome_strings_hy.xtb index 9b09efc..20f9cba9 100644 --- a/chrome/app/resources/google_chrome_strings_hy.xtb +++ b/chrome/app/resources/google_chrome_strings_hy.xtb
@@ -188,6 +188,7 @@ <translation id="4969674060580488087">ChromeOS Flex-ին չհաջողվեց համաժամացնել տվյալները, քանի որ ձեր հաշվի մուտքի տվյալները հնացած են։</translation> <translation id="4970761609246024540">Բարի գալուստ Chrome-ի պրոֆիլներ</translation> <translation id="4970880042055371251">ChromeOS-ի տարբերակը</translation> +<translation id="4970947549776831107">Chrome-ն արգելափակել է այս ֆայլը, քանի որ ֆայլի այս տեսակը վտանգավոր է։</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5037581483200764584">Google Chrome-ի հետագա թարմացումները ստանալու համար ձեզ անհրաժեշտ է macOS 10.13 կամ ավելի նոր տարբերակ։ Այս համակարգիչն օգտագործում է OS X 10.11 տարբերակը։</translation> <translation id="5112116809696021727">Սարքի ծրագրակազմի տարբերակը տեսնելու համար անցեք <ph name="LINK_BEGIN" />ChromeOS-ի կարգավորումներ<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb index 57b85d3..6b5daef 100644 --- a/chrome/app/resources/google_chrome_strings_id.xtb +++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -188,6 +188,7 @@ <translation id="4969674060580488087">ChromeOS Flex tidak dapat menyinkronkan data Anda karena detail login akun Anda belum diperbarui.</translation> <translation id="4970761609246024540">Selamat datang di profil Chrome</translation> <translation id="4970880042055371251">Versi ChromeOS</translation> +<translation id="4970947549776831107">Chrome memblokir file ini karena jenis file ini berbahaya</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5037581483200764584">Untuk mendapatkan update Google Chrome berikutnya, Anda perlu macOS 10.13 atau yang lebih baru. Komputer ini menggunakan OS X 10.11.</translation> <translation id="5112116809696021727">Untuk melihat apakah versi pada perangkat Anda adalah yang terbaru, buka <ph name="LINK_BEGIN" />Setelan ChromeOS<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb index 5eac34e8..0ce4cf5 100644 --- a/chrome/app/resources/google_chrome_strings_mn.xtb +++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -192,6 +192,7 @@ <translation id="4969674060580488087">Таны бүртгэлийн нэвтрэх дэлгэрэнгүй мэдээлэл хуучирсан тул ChromeOS Flex таны өгөгдлийг синк хийж чадсангүй.</translation> <translation id="4970761609246024540">Chrome профайлд тавтай морилно уу</translation> <translation id="4970880042055371251">ChromeOS-н хувилбар</translation> +<translation id="4970947549776831107">Энэ төрлийн файл аюултай тул Chrome энэ файлыг блоклосон</translation> <translation id="4990567037958725628">Google Chrome цайвар шаргал өнгө</translation> <translation id="5037581483200764584">Google Chrome-н цаашдын шинэчлэлтийг авахын тулд танд macOS 10.13 эсвэл түүнээс хойших хувилбар хэрэгтэй болно. Энэ компьютер OS X 10.11 хувилбарыг ашиглаж байна.</translation> <translation id="5112116809696021727">Таны төхөөрөмж шинэчлэгдсэн эсэхийг харахын тулд <ph name="LINK_BEGIN" />ChromeOS-н тохиргоо<ph name="LINK_END" /> руу очно уу</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb index 74ba8e51..ced4642 100644 --- a/chrome/app/resources/google_chrome_strings_mr.xtb +++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -191,6 +191,7 @@ <translation id="4969674060580488087">तुमच्या खात्याचे साइन-इन तपशील कालबाह्य झाल्यामुळे ChromeOS Flex ला तुमचा डेटा सिंक करता आला नाही.</translation> <translation id="4970761609246024540">Chrome प्रोफाइलमध्ये स्वागत आहे</translation> <translation id="4970880042055371251">ChromeOS ची आवृत्ती</translation> +<translation id="4970947549776831107">या प्रकारची फाइल धोकादायक असल्यामुळे Chrome ने ती ब्लॉक केली आहे</translation> <translation id="4990567037958725628">Google Chrome कॅनरी</translation> <translation id="5037581483200764584">भविष्यातील Google Chrome अपडेट मिळवण्यासाठी, तुमच्याकडे macOS 10.13 किंवा त्यानंतरची आवृत्ती असणे आवश्यक आहे. हा कॉंप्युटर OS X 10.11 ही आवृत्ती वापरत आहे.</translation> <translation id="5112116809696021727">तुमचे डिव्हाइस अप टू डेट आहे का हे पाहण्यासाठी, <ph name="LINK_BEGIN" />ChromeOS सेटिंग्ज<ph name="LINK_END" /> वर जा</translation>
diff --git a/chrome/app/resources/google_chrome_strings_my.xtb b/chrome/app/resources/google_chrome_strings_my.xtb index 24804b7..45a2286 100644 --- a/chrome/app/resources/google_chrome_strings_my.xtb +++ b/chrome/app/resources/google_chrome_strings_my.xtb
@@ -192,6 +192,7 @@ <translation id="4969674060580488087">သင့်အကောင့် လက်မှတ်ထိုးဝင်ခြင်းဆိုင်ရာ အသေးစိတ်အချက်များ ဟောင်းသွားသဖြင့် ChromeOS Flex က သင့်ဒေတာကို စင့်ခ်လုပ်၍မရပါ။</translation> <translation id="4970761609246024540">Chrome ပရိုဖိုင်များမှ ကြိုဆိုပါသည်</translation> <translation id="4970880042055371251">ChromeOS ဗားရှင်း</translation> +<translation id="4970947549776831107">ဤဖိုင်အမျိုးအစားသည် အန္တရာယ်များသဖြင့် Chrome က ပိတ်ထားသည်</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5037581483200764584">နောက်ပိုင်းထွက်မည့် Google Chrome အပ်ဒိတ်များ ရယူရန် macOS 10.13 နှင့်အထက် လိုအပ်ပါမည်။ ဤကွန်ပျူတာက OS X 10.11 အသုံးပြုနေသည်။</translation> <translation id="5112116809696021727">သင်၏စက် အပ်ဒိတ်ဖြစ်၊ မဖြစ် ကြည့်ရန် <ph name="LINK_BEGIN" />ChromeOS ဆက်တင်များ<ph name="LINK_END" /> သို့သွားပါ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ne.xtb b/chrome/app/resources/google_chrome_strings_ne.xtb index 66a2da9..78d1446 100644 --- a/chrome/app/resources/google_chrome_strings_ne.xtb +++ b/chrome/app/resources/google_chrome_strings_ne.xtb
@@ -190,6 +190,7 @@ <translation id="4969674060580488087">तपाईंको खाताको साइन इनसम्बन्धी विवरणको म्याद सकिएको हुनाले ChromeOS Flex ले तपाईंको डेटा सिंक गर्न सकेन।</translation> <translation id="4970761609246024540">Chrome का प्रोफाइलमा तपाईंलाई स्वागत छ</translation> <translation id="4970880042055371251">ChromeOS को संस्करण</translation> +<translation id="4970947549776831107">यस्तो प्रकारको फाइल खतरनाक हुने भएकाले Chrome ले यो फाइल ब्लक गरेको छ</translation> <translation id="4990567037958725628">Google Chrome क्यानरी</translation> <translation id="5037581483200764584">तपाईंको कम्प्युटरमा macOS १०.१३ वा सोभन्दा नयाँ संस्करण छ भने मात्र तपाईं भविष्यमा Google Chrome का अपडेट प्राप्त गर्नुहुन्छ। यो कम्प्युटरमा OS X १०.११ प्रयोग भइरहेको छ।</translation> <translation id="5112116809696021727">तपाईं आफ्नो डिभाइस अप टु डेट छ कि छैन भन्ने कुरा हेर्न चाहनुहुन्छ भने <ph name="LINK_BEGIN" />ChromeOS का सेटिङ<ph name="LINK_END" />मा जानुहोस्</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb index 4fdc914..ff3d377 100644 --- a/chrome/app/resources/google_chrome_strings_no.xtb +++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -187,6 +187,7 @@ <translation id="4969674060580488087">ChromeOS Flex kunne ikke synkronisere dataene dine. Dette skyldes at påloggingsopplysningene for kontoen din er utdaterte.</translation> <translation id="4970761609246024540">Velkommen til Chrome-profiler</translation> <translation id="4970880042055371251">ChromeOS-versjon</translation> +<translation id="4970947549776831107">Chrome har blokkert denne filen fordi denne filtypen er farlig</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5037581483200764584">For å få fremtidige Google Chrome-oppdateringer må du ha macOS 10.13 eller nyere. Denne datamaskinen bruker OS X 10.11.</translation> <translation id="5112116809696021727">For å se om enheten er oppdatert, gå til <ph name="LINK_BEGIN" />ChromeOS-innstillingene<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_pa.xtb b/chrome/app/resources/google_chrome_strings_pa.xtb index 6ea9326..13b3b25 100644 --- a/chrome/app/resources/google_chrome_strings_pa.xtb +++ b/chrome/app/resources/google_chrome_strings_pa.xtb
@@ -192,6 +192,7 @@ <translation id="4969674060580488087">ChromeOS Flex ਤੁਹਾਡਾ ਡਾਟਾ ਸਿੰਕ ਨਹੀਂ ਕਰ ਸਕਿਆ ਕਿਉਂਕਿ ਤੁਹਾਡੇ ਖਾਤਾ ਸਾਈਨ-ਇਨ ਵੇਰਵੇ ਪੁਰਾਣੇ ਹਨ।</translation> <translation id="4970761609246024540">Chrome ਪ੍ਰੋਫਾਈਲਾਂ ਵਿੱਚ ਜੀ ਆਇਆਂ ਨੂੰ</translation> <translation id="4970880042055371251">ChromeOS ਵਰਜਨ</translation> +<translation id="4970947549776831107">Chrome ਨੇ ਇਸ ਫ਼ਾਈਲ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਹੈ ਕਿਉਂਕਿ ਇਸ ਕਿਸਮ ਦੀ ਫ਼ਾਈਲ ਖਤਰਨਾਕ ਹੈ</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5037581483200764584">Google Chrome ਸੰਬੰਧੀ ਭਵਿੱਖੀ ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ macOS 10.13 ਜਾਂ ਇਸ ਤੋਂ ਬਾਅਦ ਵਾਲੇ ਵਰਜਨ ਦੀ ਲੋੜ ਪਵੇਗੀ। ਇਸ ਕੰਪਿਊਟਰ 'ਤੇ OS X 10.11 ਵਰਜਨ ਵਰਤਿਆ ਜਾ ਰਿਹਾ ਹੈ।</translation> <translation id="5112116809696021727">ਇਹ ਦੇਖਣ ਲਈ ਕਿ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਅੱਪ-ਟੂ-ਡੇਟ ਹੈ ਜਾਂ ਨਹੀਂ, <ph name="LINK_BEGIN" />ChromeOS ਸੈਟਿੰਗਾਂ<ph name="LINK_END" /> 'ਤੇ ਜਾਓ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb index f6c55b26..bdfbe45 100644 --- a/chrome/app/resources/google_chrome_strings_te.xtb +++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -188,6 +188,7 @@ <translation id="4969674060580488087">మీ ఖాతా సైన్ ఇన్ వివరాల గడువు ముగిసినందున, ChromeOS Flex మీ డేటాను సింక్ చేయలేకపోయింది.</translation> <translation id="4970761609246024540">Chrome ప్రొఫైళ్లకు స్వాగతం</translation> <translation id="4970880042055371251">ChromeOS వెర్షన్</translation> +<translation id="4970947549776831107">ఈ ఫైల్ రకం ప్రమాదకరమైనందున Chrome ఈ ఫైల్ను బ్లాక్ చేసింది</translation> <translation id="4990567037958725628">Google Chrome కేనరీ</translation> <translation id="5037581483200764584">భవిష్యత్తులో Google Chrome అప్డేట్లను పొందడానికి, మీకు macOS 10.13 లేదా ఆ తర్వాతి వెర్షన్ అవసరం అవుతుంది. ఈ కంప్యూటర్ OS X 10.11ను ఉపయోగిస్తోంది.</translation> <translation id="5112116809696021727">మీ పరికరం అప్డేట్ అయ్యి ఉందో లేదో చూడటానికి, <ph name="LINK_BEGIN" />ChromeOS సెట్టింగ్లకు<ph name="LINK_END" /> వెళ్లండి</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb index 4cdf12f..d16aa7e 100644 --- a/chrome/app/resources/google_chrome_strings_ur.xtb +++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -191,6 +191,7 @@ <translation id="4969674060580488087">ChromeOS Flex آپ کے اکاؤنٹ کی سائن ان تفصیلات پرانی ہونے کی وجہ سے آپ کے ڈیٹا کی مطابقت پذیری نہیں کر سکا۔</translation> <translation id="4970761609246024540">Chrome کی پروفائلز میں خوش آمدید</translation> <translation id="4970880042055371251">ChromeOS ورژن</translation> +<translation id="4970947549776831107">Chrome نے اس فائل کو مسدود کر دیا کیونکہ اس قسم کی فائل خطرناک ہے</translation> <translation id="4990567037958725628">Google Chrome کینیری</translation> <translation id="5037581483200764584">مستقبل میں Google Chrome اپ ڈیٹس حاصل کرنے کے لیے آپ کو macOS 10.13 یا اس کے بعد کے ورژن کی ضرورت ہوگی۔ یہ کمپیوٹر OS X 10.11 استعمال کرتا ہے۔</translation> <translation id="5112116809696021727">یہ دیکھنے کی لیے کہ کیا آپ کا آلہ اپ ٹو ڈیٹ ہے <ph name="LINK_BEGIN" />ChromiumOS کی ترتیبات<ph name="LINK_END" /> پر جائیں</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb index 2cb8aee0e..137b8543 100644 --- a/chrome/app/resources/google_chrome_strings_vi.xtb +++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -189,6 +189,7 @@ <translation id="4969674060580488087">ChromeOS Flex không đồng bộ hoá được dữ liệu của bạn vì thông tin đăng nhập tài khoản của bạn đã cũ.</translation> <translation id="4970761609246024540">Chào mừng bạn đến với hồ sơ trên Chrome</translation> <translation id="4970880042055371251">Phiên bản ChromeOS</translation> +<translation id="4970947549776831107">Chrome đã chặn tệp này vì đây loại tệp nguy hiểm</translation> <translation id="4990567037958725628">Google Chrome Canary</translation> <translation id="5037581483200764584">Để nhận các bản cập nhật Google Chrome sau này, bạn cần có macOS 10.13 trở lên. Máy tính này đang dùng OS X 10.11.</translation> <translation id="5112116809696021727">Để kiểm tra xem thiết bị của bạn đã cập nhật hay chưa, hãy chuyển đến phần <ph name="LINK_BEGIN" />Cài đặt ChromeOS<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/google_chrome_strings_zu.xtb b/chrome/app/resources/google_chrome_strings_zu.xtb index 1af1d93..b515dbe 100644 --- a/chrome/app/resources/google_chrome_strings_zu.xtb +++ b/chrome/app/resources/google_chrome_strings_zu.xtb
@@ -192,6 +192,7 @@ <translation id="4969674060580488087">I-ChromeOS Flex ayikwazanga ukuvumelanisa idatha yakho ngoba imininingwane yokungena ngemvume ku-akhawunti yakho iphelelwe isikhathi.</translation> <translation id="4970761609246024540">Siyakwamukela kumaphrofayela we-Chrome</translation> <translation id="4970880042055371251">Uhlobo lwe-ChromeOS</translation> +<translation id="4970947549776831107">I-Chrome ivimbe leli fayela ngoba lolu hlobo lwefayela luyingozi</translation> <translation id="4990567037958725628">I-Canary ye-Google Chrome</translation> <translation id="5037581483200764584">Ukuze uthole izibuyekezo zesikhathi esizayo ze-Google Chrome, uzodinga i-macOS 10.13 noma eyakamuva. Le khompuyutha isebenzisa i-OS X 10.11.</translation> <translation id="5112116809696021727">Ukuze ubone ukuthi idivayisi yakho isesikhathini yini, iya <ph name="LINK_BEGIN" />Kumasethingi we-ChromeOS<ph name="LINK_END" /></translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index e691f44..ac4d9e4a 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -14,7 +14,7 @@ import("//chrome/browser/buildflags.gni") import("//chrome/browser/downgrade/buildflags.gni") import("//chrome/common/features.gni") -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") import("//components/captive_portal/core/features.gni") import("//components/exo/buildflags.gni") import("//components/feed/features.gni") @@ -5054,7 +5054,8 @@ "//chrome/services/sharing/public/cpp", "//chrome/services/sharing/public/proto", "//chrome/services/speech:lib", - "//chromeos/assistant:buildflags", + "//chromeos/ash/components/assistant:buildflags", + "//chromeos/ash/components/dbus/concierge", "//chromeos/components/feature_usage", "//chromeos/components/quick_answers", "//chromeos/components/sync_wifi",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 03b98161..fed30c6 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -237,7 +237,7 @@ #include "chrome/browser/memory/memory_ablation_study.h" #include "chrome/browser/nearby_sharing/common/nearby_share_features.h" #include "chrome/common/webui_url_constants.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/services/assistant/public/cpp/features.h" #include "components/app_restore/features.h" #include "components/metrics/structured/structured_metrics_features.h" // nogncheck @@ -4835,6 +4835,10 @@ flag_descriptions::kPreferConstantFrameRateName, flag_descriptions::kPreferConstantFrameRateDescription, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::features::kPreferConstantFrameRate)}, + {"more-video-capture-buffers", + flag_descriptions::kMoreVideoCaptureBuffersName, + flag_descriptions::kMoreVideoCaptureBuffersDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kMoreVideoCaptureBuffers)}, {"force-control-face-ae", flag_descriptions::kForceControlFaceAeName, flag_descriptions::kForceControlFaceAeDescription, kOsCrOS, MULTI_VALUE_TYPE(kForceControlFaceAeChoices)}, @@ -8578,6 +8582,14 @@ FEATURE_VALUE_TYPE(features::kNetworkServiceInProcess)}, #endif + {"autofill-remove-card-expiry-from-downstream-suggestion", + flag_descriptions::kAutofillRemoveCardExpiryFromDownstreamSuggestionName, + flag_descriptions:: + kAutofillRemoveCardExpiryFromDownstreamSuggestionDescription, + kOsAll, + FEATURE_VALUE_TYPE(autofill::features:: + kAutofillRemoveCardExpiryFromDownstreamSuggestion)}, + // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/ash/app_mode/startup_app_launcher.cc b/chrome/browser/ash/app_mode/startup_app_launcher.cc index 45a0202d2..d9c0649 100644 --- a/chrome/browser/ash/app_mode/startup_app_launcher.cc +++ b/chrome/browser/ash/app_mode/startup_app_launcher.cc
@@ -24,8 +24,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_switches.h" #include "components/crx_file/id_util.h" -#include "extensions/browser/app_window/app_window.h" -#include "extensions/browser/app_window/app_window_registry.h" #include "net/base/load_flags.h" namespace ash { @@ -44,10 +42,7 @@ DCHECK(crx_file::id_util::IdIsValid(app_id_)); } -StartupAppLauncher::~StartupAppLauncher() { - if (state_ == LaunchState::kWaitingForWindow) - window_registry_->RemoveObserver(this); -} +StartupAppLauncher::~StartupAppLauncher() = default; void StartupAppLauncher::Initialize() { DCHECK(state_ != LaunchState::kReadyToLaunch && @@ -241,26 +236,9 @@ } void StartupAppLauncher::OnLaunchSuccess() { + state_ = LaunchState::kLaunchSucceeded; delegate_->OnAppLaunched(); - state_ = LaunchState::kWaitingForWindow; - - window_registry_ = extensions::AppWindowRegistry::Get(profile_); - // Start waiting for app window. - if (!window_registry_->GetAppWindowsForApp(app_id_).empty()) { - delegate_->OnAppWindowCreated(); - state_ = LaunchState::kLaunchSucceeded; - return; - } else { - window_registry_->AddObserver(this); - } -} - -void StartupAppLauncher::OnAppWindowAdded(extensions::AppWindow* app_window) { - if (app_window->extension_id() == app_id_) { - state_ = LaunchState::kLaunchSucceeded; - window_registry_->RemoveObserver(this); - delegate_->OnAppWindowCreated(); - } + delegate_->OnAppWindowCreated(); } void StartupAppLauncher::OnLaunchFailure(KioskAppLaunchError::Error error) {
diff --git a/chrome/browser/ash/app_mode/startup_app_launcher.h b/chrome/browser/ash/app_mode/startup_app_launcher.h index 8a8b5ab..fc0ac92 100644 --- a/chrome/browser/ash/app_mode/startup_app_launcher.h +++ b/chrome/browser/ash/app_mode/startup_app_launcher.h
@@ -15,20 +15,14 @@ #include "chrome/browser/ash/app_mode/kiosk_app_manager_observer.h" #include "chrome/browser/chromeos/app_mode/chrome_kiosk_app_installer.h" #include "chrome/browser/chromeos/app_mode/chrome_kiosk_app_launcher.h" -#include "extensions/browser/app_window/app_window_registry.h" class Profile; -namespace extensions { -class AppWindowRegistry; -} - namespace ash { // Responsible for the startup of the app for Chrome App kiosk. class StartupAppLauncher : public KioskAppLauncher, - public KioskAppManagerObserver, - public extensions::AppWindowRegistry::Observer { + public KioskAppManagerObserver { public: StartupAppLauncher(Profile* profile, const std::string& app_id, @@ -71,9 +65,6 @@ bool RetryWhenNetworkIsAvailable(); void OnKioskAppDataLoadStatusChanged(const std::string& app_id); - // AppWindowRegistry::Observer: - void OnAppWindowAdded(extensions::AppWindow* app_window) override; - // KioskAppManagerObserver overrides. void OnKioskExtensionLoadedInCache(const std::string& app_id) override; void OnKioskExtensionDownloadFailed(const std::string& app_id) override; @@ -86,8 +77,6 @@ std::unique_ptr<ChromeKioskAppInstaller> installer_; std::unique_ptr<ChromeKioskAppLauncher> launcher_; - extensions::AppWindowRegistry* window_registry_; - base::ScopedObservation<KioskAppManagerBase, KioskAppManagerObserver> kiosk_app_manager_observation_{this};
diff --git a/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc b/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc index fbe8e46..0befb82 100644 --- a/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc +++ b/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc
@@ -11,6 +11,7 @@ #include <vector> #include "ash/components/settings/cros_settings_names.h" +#include "ash/test/ash_test_helper.h" #include "base/callback.h" #include "base/command_line.h" #include "base/files/file_path.h" @@ -33,10 +34,13 @@ #include "chrome/browser/extensions/external_provider_impl.h" #include "chrome/browser/extensions/install_tracker.h" #include "chrome/browser/extensions/pending_extension_manager.h" +#include "chrome/browser/ui/apps/chrome_app_delegate.h" #include "chrome/common/chrome_switches.h" #include "components/account_id/account_id.h" #include "components/user_manager/scoped_user_manager.h" #include "components/version_info/channel.h" +#include "content/public/browser/browser_context.h" +#include "extensions/browser/app_window/test_app_window_contents.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/external_install_info.h" @@ -333,18 +337,56 @@ std::set<std::string> pending_update_urls_; }; +void InitAppWindow(extensions::AppWindow* app_window, const gfx::Rect& bounds) { + // Create a TestAppWindowContents for the ShellAppDelegate to initialize the + // ShellExtensionWebContentsObserver with. + std::unique_ptr<content::WebContents> web_contents( + content::WebContents::Create( + content::WebContents::CreateParams(app_window->browser_context()))); + auto app_window_contents = + std::make_unique<extensions::TestAppWindowContents>( + std::move(web_contents)); + + // Initialize the web contents and AppWindow. + app_window->app_delegate()->InitWebContents( + app_window_contents->GetWebContents()); + + content::RenderFrameHost* main_frame = + app_window_contents->GetWebContents()->GetMainFrame(); + DCHECK(main_frame); + + extensions::AppWindow::CreateParams params; + params.content_spec.bounds = bounds; + app_window->Init(GURL(), app_window_contents.release(), main_frame, params); +} + +extensions::AppWindow* CreateAppWindow(Profile* profile, + const TestKioskExtensionBuilder& builder, + gfx::Rect bounds = {}) { + extensions::AppWindow* app_window = new extensions::AppWindow( + profile, new ChromeAppDelegate(profile, true), builder.Build().get()); + InitAppWindow(app_window, bounds); + return app_window; +} + } // namespace class StartupAppLauncherTest : public extensions::ExtensionServiceTestBase, public KioskAppManager::Overrides { public: - StartupAppLauncherTest() = default; + StartupAppLauncherTest() + : extensions::ExtensionServiceTestBase( + std::make_unique<content::BrowserTaskEnvironment>( + content::BrowserTaskEnvironment::REAL_IO_THREAD)) {} + StartupAppLauncherTest(const StartupAppLauncherTest&) = delete; StartupAppLauncherTest& operator=(const StartupAppLauncherTest&) = delete; ~StartupAppLauncherTest() override = default; // testing::Test: void SetUp() override { + ash_test_helper_.SetUp(); + command_line_.GetProcessCommandLine()->AppendSwitch( switches::kForceAppMode); command_line_.GetProcessCommandLine()->AppendSwitch(switches::kAppId); @@ -355,7 +397,6 @@ extensions::ExtensionServiceTestBase::SetUp(); - InitializeKioskAppUser(); InitializeEmptyExtensionService(); external_apps_loader_handler_ = std::make_unique<TestKioskLoaderVisitor>( browser_context(), registry(), service()); @@ -385,6 +426,8 @@ accounts_settings_helper_.reset(); extensions::ExtensionServiceTestBase::TearDown(); + + ash_test_helper_.TearDown(); } // KioskAppManager::Overrides: @@ -568,17 +611,6 @@ } protected: - void InitializeKioskAppUser() { - const AccountId kiosk_account_id( - AccountId::FromUserEmail(kTestUserAccount)); - auto fake_user_manager_ = std::make_unique<FakeChromeUserManager>(); - fake_user_manager_->AddKioskAppUser(kiosk_account_id); - fake_user_manager_->LoginUser(kiosk_account_id); - - user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(fake_user_manager_)); - } - TestAppLaunchDelegate startup_launch_delegate_; std::unique_ptr<KioskAppLauncher> startup_app_launcher_; @@ -590,6 +622,7 @@ bool kiosk_app_session_initialized_ = false; private: + ash::AshTestHelper ash_test_helper_; base::test::ScopedCommandLine command_line_; std::unique_ptr<ScopedCrosSettingsTestHelper> accounts_settings_helper_; @@ -630,6 +663,7 @@ EXPECT_FALSE(kiosk_app_session_initialized_); startup_app_launcher_->LaunchApp(); + CreateAppWindow(profile(), primary_app_builder); EXPECT_EQ(std::vector<LaunchState>({LaunchState::kLaunchSucceeded}), startup_launch_delegate_.launch_state_changes()); @@ -672,6 +706,7 @@ EXPECT_TRUE(startup_launch_delegate_.launch_state_changes().empty()); startup_app_launcher_->LaunchApp(); + CreateAppWindow(profile(), primary_app_builder); EXPECT_EQ(std::vector<LaunchState>({LaunchState::kLaunchSucceeded}), startup_launch_delegate_.launch_state_changes()); @@ -704,6 +739,7 @@ EXPECT_FALSE(kiosk_app_session_initialized_); startup_app_launcher_->LaunchApp(); + CreateAppWindow(profile(), primary_app_builder); EXPECT_EQ(std::vector<LaunchState>({LaunchState::kLaunchSucceeded}), startup_launch_delegate_.launch_state_changes()); @@ -844,6 +880,7 @@ EXPECT_FALSE(kiosk_app_session_initialized_); startup_app_launcher_->LaunchApp(); + CreateAppWindow(profile(), primary_app_builder); EXPECT_TRUE(registry()->enabled_extensions().Contains(kTestPrimaryAppId)); EXPECT_TRUE(registry()->enabled_extensions().Contains(kSecondaryAppId)); @@ -893,6 +930,7 @@ EXPECT_FALSE(kiosk_app_session_initialized_); startup_app_launcher_->LaunchApp(); + CreateAppWindow(profile(), primary_app_builder); EXPECT_EQ(std::vector<LaunchState>({LaunchState::kLaunchSucceeded}), startup_launch_delegate_.launch_state_changes()); @@ -944,6 +982,7 @@ EXPECT_TRUE(startup_launch_delegate_.launch_state_changes().empty()); startup_app_launcher_->LaunchApp(); + CreateAppWindow(profile(), primary_app_builder); EXPECT_EQ(std::vector<LaunchState>({LaunchState::kLaunchSucceeded}), startup_launch_delegate_.launch_state_changes()); @@ -977,6 +1016,7 @@ startup_launch_delegate_.ClearLaunchStateChanges(); startup_app_launcher_->LaunchApp(); + CreateAppWindow(profile(), primary_app_builder); EXPECT_EQ(std::vector<LaunchState>({LaunchState::kLaunchSucceeded}), startup_launch_delegate_.launch_state_changes()); @@ -1006,6 +1046,7 @@ startup_launch_delegate_.ClearLaunchStateChanges(); startup_app_launcher_->LaunchApp(); + CreateAppWindow(profile(), primary_app_builder); // When trying to launch app we should realize that the app is not offline // enabled and request a network connection. @@ -1026,6 +1067,7 @@ startup_launch_delegate_.ClearLaunchStateChanges(); startup_app_launcher_->LaunchApp(); + CreateAppWindow(profile(), primary_app_builder); EXPECT_EQ(std::vector<LaunchState>({LaunchState::kLaunchSucceeded}), startup_launch_delegate_.launch_state_changes()); @@ -1079,6 +1121,7 @@ startup_launch_delegate_.ClearLaunchStateChanges(); startup_app_launcher_->LaunchApp(); + CreateAppWindow(profile(), primary_app_builder); EXPECT_EQ(std::vector<LaunchState>({LaunchState::kLaunchSucceeded}), startup_launch_delegate_.launch_state_changes()); @@ -1115,6 +1158,7 @@ startup_launch_delegate_.ClearLaunchStateChanges(); startup_app_launcher_->LaunchApp(); + CreateAppWindow(profile(), primary_app_builder); EXPECT_THAT(startup_launch_delegate_.launch_state_changes(), ElementsAre(LaunchState::kLaunchSucceeded)); @@ -1148,6 +1192,7 @@ EXPECT_FALSE(kiosk_app_session_initialized_); startup_app_launcher_->LaunchApp(); + CreateAppWindow(profile(), primary_app_builder); EXPECT_EQ(std::vector<LaunchState>({LaunchState::kLaunchSucceeded}), startup_launch_delegate_.launch_state_changes());
diff --git a/chrome/browser/ash/arc/accessibility/arc_accessibility_tree_tracker.cc b/chrome/browser/ash/arc/accessibility/arc_accessibility_tree_tracker.cc index d53e98a..1c48978f 100644 --- a/chrome/browser/ash/arc/accessibility/arc_accessibility_tree_tracker.cc +++ b/chrome/browser/ash/arc/accessibility/arc_accessibility_tree_tracker.cc
@@ -118,6 +118,9 @@ SET_NATIVE_CHROME_VOX_RESPONSE_WINDOWNOTFOUND; case arc::mojom::SetNativeChromeVoxResponse::FAILURE: return SetNativeChromeVoxResponse::SET_NATIVE_CHROME_VOX_RESPONSE_FAILURE; + case arc::mojom::SetNativeChromeVoxResponse::NEED_DEPRECATION_CONFIRMATION: + return SetNativeChromeVoxResponse:: + SET_NATIVE_CHROME_VOX_RESPONSE_NEEDDEPRECATIONCONFIRMATION; } }
diff --git a/chrome/browser/ash/arc/policy/OWNERS b/chrome/browser/ash/arc/policy/OWNERS index eac329b..e124ac3 100644 --- a/chrome/browser/ash/arc/policy/OWNERS +++ b/chrome/browser/ash/arc/policy/OWNERS
@@ -1,4 +1,2 @@ -bartfab@chromium.org -phweiss@chromium.org pbond@chromium.org mhasank@chromium.org \ No newline at end of file
diff --git a/chrome/browser/ash/assistant/DIR_METADATA b/chrome/browser/ash/assistant/DIR_METADATA index cfb0c371..5ba0efa 100644 --- a/chrome/browser/ash/assistant/DIR_METADATA +++ b/chrome/browser/ash/assistant/DIR_METADATA
@@ -1 +1 @@ -mixins: "//chromeos/assistant/COMMON_METADATA" +mixins: "//chromeos/ash/components/assistant/COMMON_METADATA"
diff --git a/chrome/browser/ash/assistant/OWNERS b/chrome/browser/ash/assistant/OWNERS index dd0c97af..574ed11 100644 --- a/chrome/browser/ash/assistant/OWNERS +++ b/chrome/browser/ash/assistant/OWNERS
@@ -1 +1 @@ -file://chromeos/assistant/OWNERS +file://chromeos/ash/components/assistant/OWNERS
diff --git a/chrome/browser/ash/chrome_browser_main_parts_ash.cc b/chrome/browser/ash/chrome_browser_main_parts_ash.cc index d9b4cfd3..46e42cf3 100644 --- a/chrome/browser/ash/chrome_browser_main_parts_ash.cc +++ b/chrome/browser/ash/chrome_browser_main_parts_ash.cc
@@ -39,6 +39,7 @@ #include "ash/system/firmware_update/firmware_update_notification_controller.h" #include "ash/system/pcie_peripheral/pcie_peripheral_notification_controller.h" #include "ash/system/usb_peripheral/usb_peripheral_notification_controller.h" +#include "ash/webui/camera_app_ui/document_scanner_installer.h" #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" @@ -641,6 +642,9 @@ // DBus is initialized in ChromeMainDelegate::PostEarlyInitialization(). CHECK(DBusThreadManager::IsInitialized()); + // Triggers the installation as earlier as possible. + ash::DocumentScannerInstaller::GetInstance()->TriggerInstall(); + #if !defined(USE_REAL_DBUS_CLIENTS) // USE_REAL_DBUS clients may be undefined even if the device is using real // dbus clients.
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn index 7826a7a..b5b3fed 100644 --- a/chrome/browser/ash/crosapi/BUILD.gn +++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -100,6 +100,8 @@ "field_trial_service_ash.h", "file_manager_ash.cc", "file_manager_ash.h", + "file_system_provider_service_ash.cc", + "file_system_provider_service_ash.h", "files_app_launcher.cc", "files_app_launcher.h", "force_installed_tracker_ash.cc",
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.cc b/chrome/browser/ash/crosapi/crosapi_ash.cc index 4885421..95bc55a5 100644 --- a/chrome/browser/ash/crosapi/crosapi_ash.cc +++ b/chrome/browser/ash/crosapi/crosapi_ash.cc
@@ -43,6 +43,7 @@ #include "chrome/browser/ash/crosapi/feedback_ash.h" #include "chrome/browser/ash/crosapi/field_trial_service_ash.h" #include "chrome/browser/ash/crosapi/file_manager_ash.h" +#include "chrome/browser/ash/crosapi/file_system_provider_service_ash.h" #include "chrome/browser/ash/crosapi/force_installed_tracker_ash.h" #include "chrome/browser/ash/crosapi/geolocation_service_ash.h" #include "chrome/browser/ash/crosapi/identity_manager_ash.h" @@ -160,6 +161,8 @@ feedback_ash_(std::make_unique<FeedbackAsh>()), field_trial_service_ash_(std::make_unique<FieldTrialServiceAsh>()), file_manager_ash_(std::make_unique<FileManagerAsh>()), + file_system_provider_service_ash_( + std::make_unique<FileSystemProviderServiceAsh>()), force_installed_tracker_ash_( std::make_unique<ForceInstalledTrackerAsh>()), geolocation_service_ash_(std::make_unique<GeolocationServiceAsh>()),
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.h b/chrome/browser/ash/crosapi/crosapi_ash.h index f48780b..6ca180c 100644 --- a/chrome/browser/ash/crosapi/crosapi_ash.h +++ b/chrome/browser/ash/crosapi/crosapi_ash.h
@@ -49,6 +49,7 @@ class FeedbackAsh; class FieldTrialServiceAsh; class FileManagerAsh; +class FileSystemProviderServiceAsh; class ForceInstalledTrackerAsh; class GeolocationServiceAsh; class IdentityManagerAsh; @@ -313,6 +314,10 @@ CertDatabaseAsh* cert_database_ash() { return cert_database_ash_.get(); } + FileSystemProviderServiceAsh* file_system_provider_service_ash() { + return file_system_provider_service_ash_.get(); + } + LoginAsh* login_ash() { return login_ash_.get(); } LoginScreenStorageAsh* login_screen_storage_ash() { @@ -357,6 +362,8 @@ std::unique_ptr<FeedbackAsh> feedback_ash_; std::unique_ptr<FieldTrialServiceAsh> field_trial_service_ash_; std::unique_ptr<FileManagerAsh> file_manager_ash_; + std::unique_ptr<FileSystemProviderServiceAsh> + file_system_provider_service_ash_; std::unique_ptr<ForceInstalledTrackerAsh> force_installed_tracker_ash_; std::unique_ptr<GeolocationServiceAsh> geolocation_service_ash_; std::unique_ptr<IdentityManagerAsh> identity_manager_ash_;
diff --git a/chrome/browser/ash/crosapi/file_system_provider_service_ash.cc b/chrome/browser/ash/crosapi/file_system_provider_service_ash.cc new file mode 100644 index 0000000..86aaf99 --- /dev/null +++ b/chrome/browser/ash/crosapi/file_system_provider_service_ash.cc
@@ -0,0 +1,270 @@ +// 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/ash/crosapi/file_system_provider_service_ash.h" + +#include "base/numerics/safe_conversions.h" +#include "chrome/browser/ash/file_system_provider/provided_file_system_info.h" +#include "chrome/browser/ash/file_system_provider/service.h" +#include "chrome/browser/chromeos/extensions/file_system_provider/provider_function.h" +#include "chrome/browser/profiles/profile_manager.h" + +using ash::file_system_provider::MountOptions; +using ash::file_system_provider::OpenedFiles; +using ash::file_system_provider::ProvidedFileSystemInfo; +using ash::file_system_provider::ProvidedFileSystemInterface; +using ash::file_system_provider::ProvidedFileSystemObserver; +using ash::file_system_provider::ProviderId; +using ash::file_system_provider::Service; +using ash::file_system_provider::Watchers; + +namespace crosapi { +namespace { + +// Convert |result| to a string, empty string for success and invokes +// |callback|. +void RunErrorCallback(base::OnceCallback<void(const std::string&)> callback, + const base::File::Error result) { + std::string error; + if (result != base::File::FILE_OK) { + error = extensions::FileErrorToString(result); + } + std::move(callback).Run(std::move(error)); +} + +// Converts from native filesystem watchers to their mojom counterparts +std::vector<crosapi::mojom::FSPWatcherPtr> ConvertWatchersToMojom( + const Watchers& watchers) { + std::vector<crosapi::mojom::FSPWatcherPtr> mojom_watchers; + for (const auto& watcher : watchers) { + crosapi::mojom::FSPWatcherPtr watcher_item = + crosapi::mojom::FSPWatcher::New(); + watcher_item->entry_path = watcher.second.entry_path; + watcher_item->recursive = watcher.second.recursive; + watcher_item->last_tag = watcher.second.last_tag; + mojom_watchers.push_back(std::move(watcher_item)); + } + return mojom_watchers; +} + +// Converts from native filesystem opened files to their mojom counterparts +std::vector<crosapi::mojom::OpenedFilePtr> ConvertOpenedFilesToMojom( + const OpenedFiles& opened_files) { + std::vector<crosapi::mojom::OpenedFilePtr> mojom_opened_files; + for (const auto& opened_file : opened_files) { + crosapi::mojom::OpenedFilePtr opened_file_item = + crosapi::mojom::OpenedFile::New(); + opened_file_item->open_request_id = opened_file.first; + opened_file_item->file_path = opened_file.second.file_path.value(); + switch (opened_file.second.mode) { + case ash::file_system_provider::OPEN_FILE_MODE_READ: + opened_file_item->mode = crosapi::mojom::OpenFileMode::kRead; + break; + case ash::file_system_provider::OPEN_FILE_MODE_WRITE: + opened_file_item->mode = crosapi::mojom::OpenFileMode::kWrite; + break; + } + mojom_opened_files.push_back(std::move(opened_file_item)); + } + return mojom_opened_files; +} + +// Converts native file system to mojom. +crosapi::mojom::FileSystemInfoPtr ConvertFileSystemToMojom( + Profile* profile, + const ProvidedFileSystemInfo& file_system_info, + const std::string& provider) { + Service* const service = Service::Get(profile); + crosapi::mojom::FileSystemInfoPtr item = + crosapi::mojom::FileSystemInfo::New(); + item->metadata = crosapi::mojom::FileSystemMetadata::New(); + item->metadata->file_system_id = crosapi::mojom::FileSystemId::New(); + item->metadata->file_system_id->provider = provider; + + ProvidedFileSystemInterface* const file_system = + service->GetProvidedFileSystem(file_system_info.provider_id(), + file_system_info.file_system_id()); + + DCHECK(file_system); + + item->watchers = ConvertWatchersToMojom( + file_system_info.watchable() ? *file_system->GetWatchers() : Watchers()); + item->opened_files = ConvertOpenedFilesToMojom(file_system->GetOpenedFiles()); + item->metadata->file_system_id->id = file_system_info.file_system_id(); + item->metadata->display_name = file_system_info.display_name(); + item->metadata->writable = file_system_info.writable(); + item->metadata->opened_files_limit = file_system_info.opened_files_limit(); + + return item; +} + +storage::WatcherManager::ChangeType ParseChangeType(mojom::FSPChangeType type) { + switch (type) { + case mojom::FSPChangeType::kChanged: + return storage::WatcherManager::CHANGED; + case mojom::FSPChangeType::kDeleted: + return storage::WatcherManager::DELETED; + } +} + +// Convert the change from the mojom type to a native type. +ProvidedFileSystemObserver::Change ParseChange(mojom::FSPChangePtr change) { + ProvidedFileSystemObserver::Change result; + result.entry_path = change->path; + result.change_type = ParseChangeType(change->type); + return result; +} + +// Converts a list of child changes from the mojom type to a native type. +std::unique_ptr<ProvidedFileSystemObserver::Changes> ParseChanges( + std::vector<mojom::FSPChangePtr> changes) { + auto results = std::make_unique<ProvidedFileSystemObserver::Changes>(); + for (auto& change : changes) { + results->push_back(ParseChange(std::move(change))); + } + return results; +} + +} // namespace + +FileSystemProviderServiceAsh::FileSystemProviderServiceAsh() = default; +FileSystemProviderServiceAsh::~FileSystemProviderServiceAsh() = default; + +void FileSystemProviderServiceAsh::RegisterFileSystemProvider( + mojo::PendingRemote<mojom::FileSystemProvider> provider) {} + +void FileSystemProviderServiceAsh::Mount(mojom::FileSystemMetadataPtr metadata, + bool persistent, + MountCallback callback) { + MountWithProfile(std::move(metadata), persistent, std::move(callback), + ProfileManager::GetPrimaryUserProfile()); +} + +void FileSystemProviderServiceAsh::Unmount( + mojom::FileSystemIdPtr file_system_id, + UnmountCallback callback) { + UnmountWithProfile(std::move(file_system_id), std::move(callback), + ProfileManager::GetPrimaryUserProfile()); +} + +void FileSystemProviderServiceAsh::GetAll(const std::string& provider, + GetAllCallback callback) { + GetAllWithProfile(provider, std::move(callback), + ProfileManager::GetPrimaryUserProfile()); +} +void FileSystemProviderServiceAsh::Get(mojom::FileSystemIdPtr file_system_id, + GetCallback callback) { + GetWithProfile(std::move(file_system_id), std::move(callback), + ProfileManager::GetPrimaryUserProfile()); +} +void FileSystemProviderServiceAsh::Notify( + mojom::FileSystemIdPtr file_system_id, + mojom::FSPWatcherPtr watcher, + mojom::FSPChangeType type, + std::vector<mojom::FSPChangePtr> changes, + NotifyCallback callback) { + NotifyWithProfile(std::move(file_system_id), std::move(watcher), type, + std::move(changes), std::move(callback), + ProfileManager::GetPrimaryUserProfile()); +} + +void FileSystemProviderServiceAsh::MountWithProfile( + mojom::FileSystemMetadataPtr metadata, + bool persistent, + MountCallback callback, + Profile* profile) { + Service* const service = Service::Get(profile); + DCHECK(service); + + MountOptions options; + options.file_system_id = metadata->file_system_id->id; + options.display_name = metadata->display_name; + options.writable = metadata->writable; + options.opened_files_limit = + base::saturated_cast<int>(metadata->opened_files_limit); + options.supports_notify_tag = metadata->supports_notify; + options.persistent = persistent; + + const base::File::Error result = service->MountFileSystem( + ProviderId::CreateFromExtensionId(metadata->file_system_id->provider), + options); + RunErrorCallback(std::move(callback), result); +} + +void FileSystemProviderServiceAsh::UnmountWithProfile( + mojom::FileSystemIdPtr file_system_id, + UnmountCallback callback, + Profile* profile) { + Service* const service = Service::Get(profile); + const base::File::Error result = service->UnmountFileSystem( + ProviderId::CreateFromExtensionId(file_system_id->provider), + file_system_id->id, Service::UNMOUNT_REASON_USER); + RunErrorCallback(std::move(callback), result); +} + +void FileSystemProviderServiceAsh::GetAllWithProfile( + const std::string& provider, + GetAllCallback callback, + Profile* profile) { + Service* const service = Service::Get(profile); + ProviderId provider_id = ProviderId::CreateFromExtensionId(provider); + const std::vector<ProvidedFileSystemInfo> file_systems = + service->GetProvidedFileSystemInfoList(provider_id); + + std::vector<crosapi::mojom::FileSystemInfoPtr> items; + + for (const auto& file_system_info : file_systems) { + items.push_back( + ConvertFileSystemToMojom(profile, file_system_info, provider)); + } + + std::move(callback).Run(std::move(items)); +} + +void FileSystemProviderServiceAsh::FileSystemProviderServiceAsh::GetWithProfile( + mojom::FileSystemIdPtr file_system_id, + GetCallback callback, + Profile* profile) { + Service* const service = Service::Get(profile); + DCHECK(service); + + ProvidedFileSystemInterface* file_system = service->GetProvidedFileSystem( + ProviderId::CreateFromExtensionId(file_system_id->provider), + file_system_id->id); + if (!file_system) { + std::move(callback).Run(nullptr); + return; + } + + std::move(callback).Run(ConvertFileSystemToMojom( + profile, file_system->GetFileSystemInfo(), file_system_id->provider)); +} + +void FileSystemProviderServiceAsh::NotifyWithProfile( + mojom::FileSystemIdPtr file_system_id, + mojom::FSPWatcherPtr watcher, + mojom::FSPChangeType type, + std::vector<mojom::FSPChangePtr> changes, + NotifyCallback callback, + Profile* profile) { + Service* const service = Service::Get(profile); + DCHECK(service); + + ProvidedFileSystemInterface* const file_system = + service->GetProvidedFileSystem( + ProviderId::CreateFromExtensionId(file_system_id->provider), + file_system_id->id); + if (!file_system) { + std::move(callback).Run( + extensions::FileErrorToString(base::File::FILE_ERROR_NOT_FOUND)); + return; + } + + file_system->Notify(watcher->entry_path, watcher->recursive, + ParseChangeType(type), ParseChanges(std::move(changes)), + watcher->last_tag, + base::BindOnce(&RunErrorCallback, std::move(callback))); +} + +} // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/file_system_provider_service_ash.h b/chrome/browser/ash/crosapi/file_system_provider_service_ash.h new file mode 100644 index 0000000..f1c76595 --- /dev/null +++ b/chrome/browser/ash/crosapi/file_system_provider_service_ash.h
@@ -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. + +#ifndef CHROME_BROWSER_ASH_CROSAPI_FILE_SYSTEM_PROVIDER_SERVICE_ASH_H_ +#define CHROME_BROWSER_ASH_CROSAPI_FILE_SYSTEM_PROVIDER_SERVICE_ASH_H_ + +#include "chromeos/crosapi/mojom/file_system_provider.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" + +class Profile; + +namespace crosapi { + +// Implements the ash side of the file_system_provider interface. This interface +// allows extensions to implement file systems. Extensions call into this class +// either directly via c++ (ash) or via crosapi (lacros) to fulfill information +// requests about the file system. +class FileSystemProviderServiceAsh : public mojom::FileSystemProviderService { + public: + FileSystemProviderServiceAsh(); + FileSystemProviderServiceAsh(const FileSystemProviderServiceAsh&) = delete; + FileSystemProviderServiceAsh& operator=(const FileSystemProviderServiceAsh&) = + delete; + ~FileSystemProviderServiceAsh() override; + + // crosapi::mojom::FileSystemProviderService: + void RegisterFileSystemProvider( + mojo::PendingRemote<mojom::FileSystemProvider> provider) override; + void Mount(mojom::FileSystemMetadataPtr metadata, + bool persistent, + MountCallback callback) override; + void Unmount(mojom::FileSystemIdPtr file_system_id, + UnmountCallback callback) override; + void GetAll(const std::string& provider, GetAllCallback callback) override; + void Get(mojom::FileSystemIdPtr file_system_id, + GetCallback callback) override; + void Notify(mojom::FileSystemIdPtr file_system_id, + mojom::FSPWatcherPtr watcher, + mojom::FSPChangeType type, + std::vector<mojom::FSPChangePtr> changes, + NotifyCallback callback) override; + + // In order to support multi-login in ash, a legacy feature that is going + // away in Lacros, all methods above are redirected to a variation that + // supports directly passing in a Profile*. + void MountWithProfile(mojom::FileSystemMetadataPtr metadata, + bool persistent, + MountCallback callback, + Profile* profile); + void UnmountWithProfile(mojom::FileSystemIdPtr file_system_id, + UnmountCallback callback, + Profile* profile); + void GetAllWithProfile(const std::string& provider, + GetAllCallback callback, + Profile* profile); + void GetWithProfile(mojom::FileSystemIdPtr file_system_id, + GetCallback callback, + Profile* profile); + void NotifyWithProfile(mojom::FileSystemIdPtr file_system_id, + mojom::FSPWatcherPtr watcher, + mojom::FSPChangeType type, + std::vector<mojom::FSPChangePtr> changes, + NotifyCallback callback, + Profile* profile); +}; + +} // namespace crosapi + +#endif // CHROME_BROWSER_ASH_CROSAPI_FILE_SYSTEM_PROVIDER_SERVICE_ASH_H_
diff --git a/chrome/browser/ash/crostini/crostini_installer.cc b/chrome/browser/ash/crostini/crostini_installer.cc index 29939bb..7ddf34f 100644 --- a/chrome/browser/ash/crostini/crostini_installer.cc +++ b/chrome/browser/ash/crostini/crostini_installer.cc
@@ -180,8 +180,8 @@ void CrostiniInstaller::Shutdown() { if (restart_id_ != CrostiniManager::kUninitializedRestartId) { - CrostiniManager::GetForProfile(profile_)->AbortRestartCrostini( - restart_id_, base::DoNothing()); + CrostiniManager::GetForProfile(profile_)->CancelRestartCrostini( + restart_id_); restart_id_ = CrostiniManager::kUninitializedRestartId; } } @@ -275,7 +275,7 @@ // Abort the long-running flow, and RestartObserver methods will not be called // again until next installation. auto* crostini_manager = crostini::CrostiniManager::GetForProfile(profile_); - crostini_manager->AbortRestartCrostini(restart_id_, base::DoNothing()); + crostini_manager->CancelRestartCrostini(restart_id_); restart_id_ = CrostiniManager::kUninitializedRestartId; RecordSetupResult(InstallStateToCancelledSetupResult(installing_state_));
diff --git a/chrome/browser/ash/crostini/crostini_manager.cc b/chrome/browser/ash/crostini/crostini_manager.cc index d7a6503..853ef5bd 100644 --- a/chrome/browser/ash/crostini/crostini_manager.cc +++ b/chrome/browser/ash/crostini/crostini_manager.cc
@@ -194,6 +194,8 @@ const char kCrostiniStabilityHistogram[] = "Crostini.Stability"; +CrostiniManager::RestartId CrostiniManager::next_restart_id_ = 0; + CrostiniManager::RestartOptions::RestartOptions() = default; CrostiniManager::RestartOptions::RestartOptions(RestartOptions&&) = default; CrostiniManager::RestartOptions::~RestartOptions() = default; @@ -204,49 +206,45 @@ : public ash::VmShutdownObserver, public chromeos::SchedulerConfigurationManagerBase::Observer { public: + struct RestartRequest { + RestartId restart_id; + RestartOptions options; + CrostiniResultCallback callback; + RestartObserver* observer; // optional + }; + CrostiniRestarter(Profile* profile, CrostiniManager* crostini_manager, ContainerId container_id, - RestartOptions options, - CrostiniManager::CrostiniResultCallback callback); + RestartRequest request); ~CrostiniRestarter() override; - void Restart(); - void AddObserver(CrostiniManager::RestartObserver* observer) { - observer_list_.AddObserver(observer); - } + void AddRequest(RestartRequest request); - // This gets called exactly once, at the end of the restart, either from - // Abort() or from CrostiniManager::FinishRestart(). - void RunCallback(CrostiniResult result); + // Start the restart flow. This should only be called once. This cannot be + // called directly from the constructor as in some cases it immediately + // (synchronously) fails and causes |this| to be deleted. + void Restart(); // ash::VmShutdownObserver void OnVmShutdown(const std::string& vm_name) override; void Timeout(mojom::InstallerState state); - // On abort, |completed_callback_| is immediately invoked via RunCallback(). - // We wait for the current stage to complete and then quit the flow and call - // |callback|. + // Cancel an individual request and fire its callback immediately. If there + // are no other outstanding requests, stop the restarter once possible. + void CancelRequest(RestartId restart_id); + // Abort the entire restart. Pending requests are immediately completed, and + // |callback| is called once the current operation has finished. Requests + // should not be added to an aborted restarter. void Abort(base::OnceClosure callback); - // If this method returns true, then |this| may have been deleted and it is - // unsafe to refer to any member variables. - bool ReturnEarlyIfAborted(); // These are called directly from CrostiniManager. void OnContainerDownloading(int download_percent); void OnLxdContainerStarting( vm_tools::cicerone::LxdContainerStartingSignal_Status status); - CrostiniManager::RestartId restart_id() const { return restart_id_; } const ContainerId& container_id() { return container_id_; } - bool is_aborted() const { return !abort_callbacks_.empty(); } - // If the restarter was not aborted early (either via Abort() or an option - // like start_vm_only), the result can be used to complete other restarters - // for the same ContainerId. - bool RestartAppliesToEquivalentRestarters() { - return restart_applies_to_equivalent_restarters_; - } // This is public so CallRestarterStartLxdContainerFinishedForTesting can call // it. @@ -256,9 +254,25 @@ void StartStage(mojom::InstallerState stage); void EmitMetricIfInIncorrectState(mojom::InstallerState expected); + using RequestFilter = base::RepeatingCallback<bool(const RestartRequest&)>; + // Removes matched requests and returns a closure which will run the + // corresponding completion callbacks. + base::OnceClosure ExtractRequests(RequestFilter filter, + CrostiniResult result); + void FinishRequests(RequestFilter filter, CrostiniResult result) { + return ExtractRequests(filter, result).Run(); + } + + // The restarter flow ends early if Abort() is called or all requests have + // been cancelled or otherwise fulfilled (e.g. when start_vm_only is set). + // If this method returns true, then FinishRestart() is called and |this| + // gets deleted so it is unsafe to refer to any member variables. + bool ReturnEarlyIfNeeded(); + // In a successful complete restart, every function in the below list in - // called in order, from Restart() to FinishRestart(). If the restarter is - // aborted or an operation fails or times out, it proceeds directly to + // called in order, from Restart() to FinishRestart(). If the restarter + // finishes early (i.e. restarter aborted, all requests cancelled or + // completed, operation fails or times out), it proceeds directly to // FinishRestart(). // Public function - Restart(); @@ -277,11 +291,16 @@ void CreateLxdContainerFinished(CrostiniResult result); void SetUpLxdContainerUserFinished(bool success); // Public function - StartLxdContainerFinished(CrostiniResult result); - // FinishRestart function can cause |this| to be deleted, so callers should - // return immediately after calling this. This should be called exactly once - // per restarter. + // FinishRestart() causes |this| to be deleted, so callers should return + // immediately after calling this. void FinishRestart(CrostiniResult result); + // If the current operation can be cancelled, cancel it, complete the + // restart (deleting |this|), and return true. + bool MaybeCancelCurrentOperation(); + + void LogRestarterResult(CrostiniResult result); + base::OneShotTimer stage_timeout_timer_; base::TimeTicks stage_start_; @@ -312,53 +331,45 @@ CrostiniManager* crostini_manager_; const ContainerId container_id_; - base::FilePath disk_path_; - RestartOptions options_; - std::string source_path_; - base::FilePath container_homedir_; bool is_initial_install_ = false; - CrostiniManager::CrostiniResultCallback completed_callback_; std::vector<base::OnceClosure> abort_callbacks_; + // Options which only affect new containers will be taken from the first + // request. + std::vector<RestartRequest> requests_; + // Pulled out of requests_ for convenience. base::ObserverList<CrostiniManager::RestartObserver>::Unchecked observer_list_; - CrostiniManager::RestartId restart_id_; + // TODO(timloh): This should just be an extra state at the start of the flow. bool is_running_ = false; - bool restart_applies_to_equivalent_restarters_ = true; - size_t num_cores_disabled_ = 0; - mojom::InstallerState stage_ = mojom::InstallerState::kStart; - CrostiniResult result_ = CrostiniResult::NEVER_FINISHED; - static CrostiniManager::RestartId next_restart_id_; + // Data passed between different steps of the restart flow. + base::FilePath disk_path_; + size_t num_cores_disabled_ = 0; + + mojom::InstallerState stage_ = mojom::InstallerState::kStart; base::WeakPtrFactory<CrostiniRestarter> weak_ptr_factory_{this}; }; -CrostiniManager::RestartId - CrostiniManager::CrostiniRestarter::next_restart_id_ = 0; - CrostiniManager::CrostiniRestarter::CrostiniRestarter( Profile* profile, CrostiniManager* crostini_manager, ContainerId container_id, - RestartOptions options, - CrostiniManager::CrostiniResultCallback callback) + RestartRequest request) : profile_(profile), crostini_manager_(crostini_manager), - container_id_(std::move(container_id)), - options_(std::move(options)), - completed_callback_(std::move(callback)), - restart_id_(next_restart_id_++) {} + container_id_(std::move(container_id)) { + AddRequest(std::move(request)); +} CrostiniManager::CrostiniRestarter::~CrostiniRestarter() { - // Do not record results if this restart was triggered by the installer. - // The crostini installer has its own histograms that should be kept - // separate. - if (!is_initial_install_) { - base::UmaHistogramEnumeration("Crostini.RestarterResult", result_); - } crostini_manager_->RemoveVmShutdownObserver(this); - if (completed_callback_) { - LOG(ERROR) << "Destroying without having called the callback."; + if (!requests_.empty()) { + // This is triggered by logging out when restarts are in progress. + LOG(WARNING) << "Destroying with outstanding requests."; + for (int i = 0; i < requests_.size(); i++) { + LogRestarterResult(CrostiniResult::NEVER_FINISHED); + } } } @@ -372,11 +383,16 @@ } crostini_manager_->AddVmShutdownObserver(this); - - StartStage(mojom::InstallerState::kStart); + // TODO(timloh): This is currently false for additional containers created via + // settings, but we probably don't want those to be bucketed in the same + // histograms as other non-install restarts. + // TODO(b/205650706): It is possible to invoke a CrostiniRestarter to install + // Crostini without using the actual installer. We should handle these better. is_initial_install_ = crostini_manager_->GetCrostiniDialogStatus(DialogType::INSTALLER); - if (ReturnEarlyIfAborted()) { + + StartStage(mojom::InstallerState::kStart); + if (ReturnEarlyIfNeeded()) { return; } @@ -389,21 +405,19 @@ } } -void CrostiniManager::CrostiniRestarter::RunCallback(CrostiniResult result) { - // Observer should not be called if we have completed. - observer_list_.Clear(); +void CrostiniManager::CrostiniRestarter::AddRequest(RestartRequest request) { + // CrostiniManager doesn't add requests to aborted restarts. + DCHECK(abort_callbacks_.empty()); - DCHECK_EQ(result_, CrostiniResult::NEVER_FINISHED); - result_ = result; - - if (completed_callback_) { - std::move(completed_callback_).Run(result_); + if (request.observer) { + observer_list_.AddObserver(request.observer); } + requests_.push_back(std::move(request)); } void CrostiniManager::CrostiniRestarter::OnVmShutdown( const std::string& vm_name) { - if (ReturnEarlyIfAborted()) { + if (ReturnEarlyIfNeeded()) { return; } if (vm_name == container_id_.vm_name) { @@ -451,47 +465,39 @@ case mojom::InstallerState::kStart: NOTREACHED(); } - // Note: FinishRestart may delete |this|. + // Note: FinishRestart deletes |this|. FinishRestart(result); } +void CrostiniManager::CrostiniRestarter::CancelRequest(RestartId restart_id) { + FinishRequests( + base::BindRepeating( + [](RestartId restart_id, const RestartRequest& request) -> bool { + return request.restart_id == restart_id; + }, + restart_id), + CrostiniResult::RESTART_ABORTED); + + if (requests_.empty()) { + // May delete |this|. + MaybeCancelCurrentOperation(); + } +} + void CrostiniManager::CrostiniRestarter::Abort(base::OnceClosure callback) { - restart_applies_to_equivalent_restarters_ = false; abort_callbacks_.push_back(std::move(callback)); if (abort_callbacks_.size() > 1) { // The subsequent steps only need to be run once. return; } - // Run the main callback immediately, but wait for the current step to + // Run the result callbacks immediately, but wait for the current step to // finish before invoking the abort callback. - RunCallback(CrostiniResult::RESTART_ABORTED); - if (stage_ == mojom::InstallerState::kInstallImageLoader) { - // TerminaInstaller offers a way to cancel installation, which also - // prevents any callback from running. In this case we can proceed - // directly to running the abort callbacks. - crostini_manager_->CancelInstallTermina(); - // Callers may not expect their callback to be run within the same task. - base::SequencedTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce( - [](base::WeakPtr<CrostiniRestarter> weak_this) { - if (weak_this) { - weak_this->ReturnEarlyIfAborted(); - } - }, - weak_ptr_factory_.GetWeakPtr())); - } -} - -bool CrostiniManager::CrostiniRestarter::ReturnEarlyIfAborted() { - if (!is_aborted()) - return false; - - for (auto& abort_callback : abort_callbacks_) { - std::move(abort_callback).Run(); - } - FinishRestart(CrostiniResult::RESTART_ABORTED); - return true; + FinishRequests( + base::BindRepeating([](const RestartRequest& request) { return true; }), + CrostiniResult::RESTART_ABORTED); + // May delete |this|. + MaybeCancelCurrentOperation(); } void CrostiniManager::CrostiniRestarter::OnContainerDownloading( @@ -530,7 +536,7 @@ for (auto& observer : observer_list_) { observer.OnContainerStarted(result); } - if (ReturnEarlyIfAborted()) { + if (ReturnEarlyIfNeeded()) { return; } EmitMetricIfInIncorrectState(mojom::InstallerState::kStartContainer); @@ -585,6 +591,41 @@ } } +base::OnceClosure CrostiniManager::CrostiniRestarter::ExtractRequests( + RequestFilter filter, + CrostiniResult result) { + std::vector<CrostiniResultCallback> callbacks; + for (auto it = requests_.begin(); it != requests_.end();) { + if (!filter.Run(*it)) { + it++; + continue; + } + + crostini_manager_->RemoveRestartId(it->restart_id); + if (it->observer) + observer_list_.RemoveObserver(it->observer); + callbacks.push_back(std::move(it->callback)); + requests_.erase(it); + + LogRestarterResult(result); + } + + return base::BindOnce( + [](std::vector<CrostiniResultCallback> callbacks, CrostiniResult result) { + for (auto& callback : callbacks) + std::move(callback).Run(result); + }, + std::move(callbacks), result); +} + +bool CrostiniManager::CrostiniRestarter::ReturnEarlyIfNeeded() { + if (!requests_.empty()) + return false; + // The result is ignored since there are no requests left. + FinishRestart(CrostiniResult::UNKNOWN_ERROR); + return true; +} + void CrostiniManager::CrostiniRestarter::ContinueRestart() { is_running_ = true; // Skip to the end immediately if testing. @@ -608,7 +649,7 @@ for (auto& observer : observer_list_) { observer.OnComponentLoaded(result); } - if (ReturnEarlyIfAborted()) { + if (ReturnEarlyIfNeeded()) { return; } EmitMetricIfInIncorrectState(mojom::InstallerState::kInstallImageLoader); @@ -620,7 +661,7 @@ profile_->GetPrefs()->SetBoolean(crostini::prefs::kCrostiniEnabled, true); // Allow concierge to choose an appropriate disk image size. - int64_t disk_size_bytes = options_.disk_size_bytes.value_or(0); + int64_t disk_size_bytes = requests_[0].options.disk_size_bytes.value_or(0); // If we have an already existing disk, CreateDiskImage will just return its // path so we can pass it to StartTerminaVm. StartStage(mojom::InstallerState::kCreateDiskImage); @@ -641,7 +682,7 @@ for (auto& observer : observer_list_) { observer.OnDiskImageCreated(success, status, disk_size_bytes); } - if (ReturnEarlyIfAborted()) { + if (ReturnEarlyIfNeeded()) { return; } EmitMetricIfInIncorrectState(mojom::InstallerState::kCreateDiskImage); @@ -707,7 +748,7 @@ for (auto& observer : observer_list_) { observer.OnVmStarted(success); } - if (ReturnEarlyIfAborted()) { + if (ReturnEarlyIfNeeded()) { return; } EmitMetricIfInIncorrectState(mojom::InstallerState::kStartTerminaVm); @@ -724,15 +765,23 @@ crostini_manager_->UpdateTerminaVmKernelVersion(); } - if (options_.start_vm_only) { - restart_applies_to_equivalent_restarters_ = false; - FinishRestart(CrostiniResult::SUCCESS); + // TODO(timloh): Requests with start_vm_only added too late will miss this and + // thus fail if any later step fails. Perhaps they should be completed + // immediately. + FinishRequests(base::BindRepeating([](const RestartRequest& request) { + return request.options.start_vm_only; + }), + CrostiniResult::SUCCESS); + if (ReturnEarlyIfNeeded()) { return; } // Share any non-persisted paths for the VM. + // TODO(timloh): This should probably share paths from all requests. Requests + // added too late will also miss this. guest_os::GuestOsSharePath::GetForProfile(profile_)->SharePaths( - container_id_.vm_name, options_.share_paths, /*persist=*/false, + container_id_.vm_name, requests_[0].options.share_paths, + /*persist=*/false, base::BindOnce(&CrostiniRestarter::SharePathsFinished, weak_ptr_factory_.GetWeakPtr())); } @@ -756,7 +805,7 @@ for (auto& observer : observer_list_) { observer.OnLxdStarted(result); } - if (ReturnEarlyIfAborted()) { + if (ReturnEarlyIfNeeded()) { return; } EmitMetricIfInIncorrectState(mojom::InstallerState::kStartLxd); @@ -764,14 +813,19 @@ FinishRestart(result); return; } - if (options_.stop_after_lxd_available) { - restart_applies_to_equivalent_restarters_ = false; - FinishRestart(CrostiniResult::SUCCESS); + + FinishRequests(base::BindRepeating([](const RestartRequest& request) { + return request.options.stop_after_lxd_available; + }), + CrostiniResult::SUCCESS); + if (ReturnEarlyIfNeeded()) { return; } + StartStage(mojom::InstallerState::kCreateContainer); crostini_manager_->CreateLxdContainer( - container_id_, options_.image_server_url, options_.image_alias, + container_id_, requests_[0].options.image_server_url, + requests_[0].options.image_alias, base::BindOnce(&CrostiniRestarter::CreateLxdContainerFinished, weak_ptr_factory_.GetWeakPtr())); } @@ -782,7 +836,7 @@ for (auto& observer : observer_list_) { observer.OnContainerCreated(result); } - if (ReturnEarlyIfAborted()) { + if (ReturnEarlyIfNeeded()) { return; } EmitMetricIfInIncorrectState(mojom::InstallerState::kCreateContainer); @@ -794,7 +848,7 @@ StartStage(mojom::InstallerState::kSetupContainer); crostini_manager_->SetUpLxdContainerUser( container_id_, - options_.container_username.value_or( + requests_[0].options.container_username.value_or( DefaultContainerUserNameForProfile(profile_)), base::BindOnce(&CrostiniRestarter::SetUpLxdContainerUserFinished, weak_ptr_factory_.GetWeakPtr())); @@ -807,7 +861,7 @@ for (auto& observer : observer_list_) { observer.OnContainerSetup(success); } - if (ReturnEarlyIfAborted()) { + if (ReturnEarlyIfNeeded()) { return; } EmitMetricIfInIncorrectState(mojom::InstallerState::kSetupContainer); @@ -824,14 +878,64 @@ } void CrostiniManager::CrostiniRestarter::FinishRestart(CrostiniResult result) { - // RunCallback() is usually invoked from CrostiniManager::FinishRestart() - // but when aborted is explicitly called earlier. - DCHECK(result_ == CrostiniResult::NEVER_FINISHED || - result_ == CrostiniResult::RESTART_ABORTED); EmitTimeInStageHistogram(base::TimeTicks::Now() - stage_start_, stage_); - // CrostiniManager::FinishRestart deletes |this|, sometimes synchronously. - crostini_manager_->FinishRestart(this, result); + base::OnceClosure closure; + if (abort_callbacks_.empty()) { + closure = ExtractRequests( + base::BindRepeating([](const RestartRequest& request) { return true; }), + result); + } else { + // Requests have already been completed, and new requests are not allowed. + for (auto& abort_callback : abort_callbacks_) { + std::move(abort_callback).Run(); + } + abort_callbacks_.clear(); + closure = base::DoNothing(); + } + + DCHECK(requests_.empty()); + DCHECK(observer_list_.empty()); + + // CrostiniManager::RestartCompleted deletes |this| + crostini_manager_->RestartCompleted(this, std::move(closure)); +} + +bool CrostiniManager::CrostiniRestarter::MaybeCancelCurrentOperation() { + if (stage_ == mojom::InstallerState::kInstallImageLoader) { + // TerminaInstaller offers a way to cancel installation, which also + // prevents any callback from running. + crostini_manager_->CancelInstallTermina(); + + // Not specific to kInstallImageLoader, this will also need to be run if + // any other steps are made cancellable. + // TODO(timloh): This posts a task because unit tests synchronously cancel + // restart requests from observer methods. If we remove this behaviour, + // we could just call ReturnEarlyIfNeeded() directly. + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce( + [](base::WeakPtr<CrostiniRestarter> weak_this) { + if (weak_this) { + weak_this->ReturnEarlyIfNeeded(); + } + }, + weak_ptr_factory_.GetWeakPtr())); + return true; + } + + // Current stage can not be cancelled. + return false; +} + +void CrostiniManager::CrostiniRestarter::LogRestarterResult( + CrostiniResult result) { + // Separate Crostini installer restarts from already-installed restarts. + // The installer has separate histograms in Crostini.SetupResult. + // TODO(timloh): The installer histograms are less granular, we might want to + // also log something here. + if (!is_initial_install_) { + base::UmaHistogramEnumeration("Crostini.RestarterResult", result); + } } // Unit tests need this initialized to true. In Browser tests and real life, @@ -2170,50 +2274,53 @@ return kUninitializedRestartId; } - auto restarter = std::make_unique<CrostiniRestarter>( - profile_, this, container_id, std::move(options), std::move(callback)); - auto restart_id = restarter->restart_id(); - restarters_by_container_.emplace(container_id, restart_id); - restarters_by_id_[restart_id] = std::move(restarter); + RestartId restart_id = next_restart_id_++; + restarters_by_id_.emplace(restart_id, container_id); - // Observers will watch this restarter and any others that run before it. - if (observer) { - auto range = restarters_by_container_.equal_range(container_id); - for (auto it = range.first; it != range.second; ++it) { - restarters_by_id_[it->second]->AddObserver(observer); - } - } + CrostiniRestarter::RestartRequest request = {restart_id, std::move(options), + std::move(callback), observer}; - if (restarters_by_container_.count(container_id) > 1) { - VLOG(1) << "Already restarting " << container_id; + auto it = restarters_by_container_.find(container_id); + if (it == restarters_by_container_.end()) { + VLOG(1) << "Creating new restarter for " << container_id; + restarters_by_container_[container_id] = + std::make_unique<CrostiniRestarter>(profile_, this, container_id, + std::move(request)); + // In some cases this will synchronously finish the restart and cause it to + // be deleted and removed from the map. + restarters_by_container_[container_id]->Restart(); } else { - // Restart() needs to be called after the restarter is inserted into - // restarters_by_id_ because some tests will make the restart process - // complete before Restart() returns. - restarters_by_id_[restart_id]->Restart(); + VLOG(1) << "Already restarting " << container_id; + if (request.options.container_username || request.options.disk_size_bytes || + request.options.image_server_url || request.options.image_alias) { + LOG(ERROR) + << "Crostini restart options for new containers will be ignored " + "as a restart is already in progress."; + } + it->second->AddRequest(std::move(request)); } return restart_id; } -void CrostiniManager::AbortRestartCrostini( - CrostiniManager::RestartId restart_id, - base::OnceClosure callback) { - auto restarter_it = restarters_by_id_.find(restart_id); - if (restarter_it == restarters_by_id_.end()) { - // This can happen if a user cancels the install flow at the exact right - // moment, for example. - LOG(ERROR) << "Aborting a restarter that already finished"; - content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE, - std::move(callback)); +void CrostiniManager::CancelRestartCrostini( + CrostiniManager::RestartId restart_id) { + auto container_it = restarters_by_id_.find(restart_id); + if (container_it == restarters_by_id_.end()) { + // Only tests execute this path at the time of writing but be defensive + // just in case. + LOG(ERROR) + << "Cancelling a restarter that does not exist (already finished?)" + << ", id = " << restart_id; return; } - restarter_it->second->Abort(std::move(callback)); + auto restarter_it = restarters_by_container_.find(container_it->second); + DCHECK(restarter_it != restarters_by_container_.end()); + restarter_it->second->CancelRequest(restart_id); } bool CrostiniManager::IsRestartPending(RestartId restart_id) { - auto it = restarters_by_id_.find(restart_id); - return it != restarters_by_id_.end() && !it->second->is_aborted(); + return restarters_by_id_.find(restart_id) != restarters_by_id_.end(); } void CrostiniManager::AddShutdownContainerCallback( @@ -2441,6 +2548,11 @@ << vm_name; UpdateVmState(vm_name, VmState::STARTED); + // TODO(timloh): These should probably either be in CrostiniRestarter + // alongside sharing non-persisted paths, or separated entirely from the + // restart flow and instead run for all Guest OS types whenever they start + // up. For fonts, this could be done directly in concierge (b/231252066). + // Share fonts directory with the VM but don't persist as a shared path. guest_os::GuestOsSharePath::GetForProfile(profile_)->SharePath( vm_name, base::FilePath(file_manager::util::kSystemFontsPath), @@ -3088,10 +3200,9 @@ return; } ContainerId container_id(signal.vm_name(), signal.container_name()); - auto range = restarters_by_container_.equal_range(container_id); - for (auto it = range.first; it != range.second; ++it) { - restarters_by_id_[it->second]->OnContainerDownloading( - signal.download_progress()); + auto iter = restarters_by_container_.find(container_id); + if (iter != restarters_by_container_.end()) { + iter->second->OnContainerDownloading(signal.download_progress()); } } @@ -3115,9 +3226,6 @@ return; ContainerId container_id(signal.vm_name(), signal.container_name()); CrostiniResult result; - std::pair<std::multimap<crostini::ContainerId, int>::iterator, - std::multimap<crostini::ContainerId, int>::iterator> - range; switch (signal.status()) { case vm_tools::cicerone::LxdContainerStartingSignal::UNKNOWN: @@ -3132,12 +3240,13 @@ case vm_tools::cicerone::LxdContainerStartingSignal::FAILED: result = CrostiniResult::CONTAINER_START_FAILED; break; - case vm_tools::cicerone::LxdContainerStartingSignal::STARTING: - range = restarters_by_container_.equal_range(container_id); - for (auto it = range.first; it != range.second; ++it) { - restarters_by_id_[it->second]->OnLxdContainerStarting(signal.status()); + case vm_tools::cicerone::LxdContainerStartingSignal::STARTING: { + auto iter = restarters_by_container_.find(container_id); + if (iter != restarters_by_container_.end()) { + iter->second->OnLxdContainerStarting(signal.status()); } return; + } default: result = CrostiniResult::UNKNOWN_ERROR; break; @@ -3337,7 +3446,7 @@ weak_ptr_factory_.GetWeakPtr())); auto abort_callback = base::BarrierClosure( - restarters_by_id_.size(), + restarters_by_container_.size(), base::BindOnce( [](scoped_refptr<CrostiniRemover> remover) { content::GetUIThreadTaskRunner({})->PostTask( @@ -3346,8 +3455,8 @@ }, crostini_remover)); - for (const auto& restarter_it : restarters_by_id_) { - AbortRestartCrostini(restarter_it.first, abort_callback); + for (const auto& iter : restarters_by_container_) { + iter.second->Abort(abort_callback); } } @@ -3358,74 +3467,22 @@ remove_crostini_callbacks_.clear(); } -void CrostiniManager::FinishRestart(CrostiniRestarter* restarter, - CrostiniResult result) { - if (restarter->RestartAppliesToEquivalentRestarters()) { - // Invoke callbacks for all restarters of that container and then delete - // the restarters. - auto range = - restarters_by_container_.equal_range(restarter->container_id()); - std::vector<std::unique_ptr<CrostiniRestarter>> pending_restarters; +void CrostiniManager::RemoveRestartId(RestartId restart_id) { + // restarters_by_container_ is handled in RestartCompleted() + restarters_by_id_.erase(restart_id); +} - // Erase first, because restarter->RunCallback() may modify our maps, and - // because the upgrade process will want to run more restarters. - for (auto it = range.first; it != range.second; ++it) { - CrostiniManager::RestartId restart_id = it->second; - pending_restarters.emplace_back(std::move(restarters_by_id_[restart_id])); - restarters_by_id_.erase(restart_id); - } - restarters_by_container_.erase(range.first, range.second); +void CrostiniManager::RestartCompleted(CrostiniRestarter* restarter, + base::OnceClosure closure) { + ContainerId container_id = restarter->container_id(); + restarter = nullptr; + // Destroy the restarter. + restarters_by_container_.erase(container_id); - std::vector<base::OnceClosure> callbacks; - for (auto&& restarter : pending_restarters) { - callbacks.push_back(base::BindOnce( - [](std::unique_ptr<CrostiniRestarter> restarter, - CrostiniResult result) { restarter->RunCallback(result); }, - std::move(restarter), result)); - } - - if (ShouldWarnAboutExpiredVersion(profile_, restarter->container_id())) { - CrostiniExpiredContainerWarningView::Show(profile_, std::move(callbacks)); - } else { - for (auto&& callback : callbacks) { - std::move(callback).Run(); - } - } - return; - } - - // Restart did not fully complete (aborted or only only a partial restart - // was requested). - - // Aborted restarts have the callback run immediately when Abort() is called. - if (result != CrostiniResult::RESTART_ABORTED) { - restarter->RunCallback(result); - } - - CrostiniManager::RestartId restart_id = restarter->restart_id(); - ContainerId key = restarter->container_id(); - - { - auto restarter_it = restarters_by_id_.find(restart_id); - DCHECK(restarter_it != restarters_by_id_.end()); - - auto range = - restarters_by_container_.equal_range(restarter->container_id()); - for (auto it = range.first; it != range.second; ++it) { - if (it->second == restart_id) { - restarters_by_container_.erase(it); - break; - } - } - // This destroys the restarter. - restarters_by_id_.erase(restarter_it); - restarter = nullptr; - } - - // Kick off the "next" (in order of arrival) pending Restart() if any. - auto range = restarters_by_container_.equal_range(key); - if (range.first != range.second) { - restarters_by_id_[range.first->second]->Restart(); + if (ShouldWarnAboutExpiredVersion(profile_, container_id)) { + CrostiniExpiredContainerWarningView::Show(profile_, std::move(closure)); + } else { + std::move(closure).Run(); } } @@ -3883,8 +3940,10 @@ void CrostiniManager::CallRestarterStartLxdContainerFinishedForTesting( CrostiniManager::RestartId id, CrostiniResult result) { - auto restarter_it = restarters_by_id_.find(id); - DCHECK(restarter_it != restarters_by_id_.end()); + auto container_it = restarters_by_id_.find(id); + DCHECK(container_it != restarters_by_id_.end()); + auto restarter_it = restarters_by_container_.find(container_it->second); + DCHECK(restarter_it != restarters_by_container_.end()); restarter_it->second->StartLxdContainerFinished(result); }
diff --git a/chrome/browser/ash/crostini/crostini_manager.h b/chrome/browser/ash/crostini/crostini_manager.h index d60e841..a14d117 100644 --- a/chrome/browser/ash/crostini/crostini_manager.h +++ b/chrome/browser/ash/crostini/crostini_manager.h
@@ -449,8 +449,8 @@ // Runs all the steps required to restart the given crostini vm and container. // The optional |observer| tracks progress. If provided, it must be alive - // until the restart completes (i.e. when |callback| is called) or the restart - // is aborted via |AbortRestartCrostini|. + // until the restart completes (i.e. when |callback| is called) or the request + // is cancelled via |CancelRestartCrostini|. RestartId RestartCrostini(ContainerId container_id, CrostiniResultCallback callback, RestartObserver* observer = nullptr); @@ -460,10 +460,11 @@ CrostiniResultCallback callback, RestartObserver* observer = nullptr); - // Aborts a restart. A "next" restarter with the same ContainerId will run, if - // there is one. |callback| will be called once the restart has finished - // aborting - void AbortRestartCrostini(RestartId restart_id, base::OnceClosure callback); + // Cancel a restart request. The associated result callback will be fired + // immediately and the observer will be removed. If there were multiple + // restart requests for the same container id, the restart may actually keep + // going. + void CancelRestartCrostini(RestartId restart_id); // Returns true if the Restart corresponding to |restart_id| is not yet // complete. @@ -825,7 +826,12 @@ // checking component registration code may block. void MaybeUpdateCrostiniAfterChecks(); - void FinishRestart(CrostiniRestarter* restarter, CrostiniResult result); + // Called by CrostiniRestarter once it's done with a specific restart request. + void RemoveRestartId(RestartId restart_id); + // Called by CrostiniRestarter once it's finished. |closure| encapsulates any + // outstanding callbacks passed to RestartCrostini*(). + void RestartCompleted(CrostiniRestarter* restarter, + base::OnceClosure closure); // Callback for CrostiniManager::RemoveCrostini. void OnRemoveCrostini(CrostiniResult result); @@ -905,14 +911,12 @@ base::ObserverList<ash::VmShutdownObserver> vm_shutdown_observers_; base::ObserverList<ash::VmStartingObserver> vm_starting_observers_; - // Only one restarter flow is actually running for a given container, other - // restarters will just have their callback called when the running restarter - // completes. - std::multimap<ContainerId, CrostiniManager::RestartId> + // RestartIds present in |restarters_by_id_| will always have a restarter in + // |restarters_by_container_| for the corresponding ContainerId. + std::map<CrostiniManager::RestartId, ContainerId> restarters_by_id_; + std::map<ContainerId, std::unique_ptr<CrostiniRestarter>> restarters_by_container_; - - std::map<CrostiniManager::RestartId, std::unique_ptr<CrostiniRestarter>> - restarters_by_id_; + static RestartId next_restart_id_; base::ObserverList<CrostiniDialogStatusObserver> crostini_dialog_status_observers_;
diff --git a/chrome/browser/ash/crostini/crostini_manager_unittest.cc b/chrome/browser/ash/crostini/crostini_manager_unittest.cc index 7c47d95..26e9b99 100644 --- a/chrome/browser/ash/crostini/crostini_manager_unittest.cc +++ b/chrome/browser/ash/crostini/crostini_manager_unittest.cc
@@ -711,41 +711,39 @@ } void OnComponentLoaded(CrostiniResult result) override { - if (abort_on_component_loaded_) { - Abort(); + if (cancel_on_component_loaded_) { + Cancel(); } } void OnDiskImageCreated(bool success, vm_tools::concierge::DiskImageStatus status, int64_t disk_size_available) override { - if (abort_on_disk_image_created_) { - Abort(); + if (cancel_on_disk_image_created_) { + Cancel(); } } void OnVmStarted(bool success) override { - if (abort_on_vm_started_) { - Abort(); + if (cancel_on_vm_started_) { + Cancel(); } } void OnLxdStarted(CrostiniResult result) override { - if (abort_on_lxd_started_) { - Abort(); + if (cancel_on_lxd_started_) { + Cancel(); } } void OnContainerCreated(CrostiniResult result) override { - if (abort_on_container_created_) { - Abort(); + if (cancel_on_container_created_) { + Cancel(); } - if (abort_then_stop_vm_) { - auto barrier_closure = base::BarrierClosure(2, run_loop()->QuitClosure()); - - // Don't use the Abort() method because it terminates the run loop + if (cancel_then_stop_vm_) { + // Don't use the Cancel() method because it terminates the run loop // immediately, and we want to wait for the OnVmStopped task to complete. - crostini_manager()->AbortRestartCrostini(restart_id_, barrier_closure); + crostini_manager()->CancelRestartCrostini(restart_id_); // Signal that the VM has stopped by posting a task to avoid deleting // CrostiniRestarter inside a CrostiniRestarter call. @@ -756,19 +754,19 @@ FROM_HERE, base::BindOnce(&CrostiniManager::OnVmStopped, base::Unretained(crostini_manager()), signal), - barrier_closure); + run_loop()->QuitClosure()); } } void OnContainerStarted(CrostiniResult result) override { - if (abort_on_container_started_) { - Abort(); + if (cancel_on_container_started_) { + Cancel(); } } void OnContainerSetup(bool success) override { - if (abort_on_container_setup_) { - Abort(); + if (cancel_on_container_setup_) { + Cancel(); } } @@ -778,8 +776,8 @@ EXPECT_EQ(result, last_crostini_callback_result_); } - void Abort() { - crostini_manager()->AbortRestartCrostini(restart_id_, base::DoNothing()); + void Cancel() { + crostini_manager()->CancelRestartCrostini(restart_id_); run_loop()->Quit(); } @@ -793,14 +791,14 @@ CrostiniManager::kUninitializedRestartId; const CrostiniManager::RestartId uninitialized_id_ = CrostiniManager::kUninitializedRestartId; - bool abort_on_component_loaded_ = false; - bool abort_on_disk_image_created_ = false; - bool abort_on_vm_started_ = false; - bool abort_on_lxd_started_ = false; - bool abort_on_container_created_ = false; - bool abort_on_container_started_ = false; - bool abort_on_container_setup_ = false; - bool abort_then_stop_vm_ = false; + bool cancel_on_component_loaded_ = false; + bool cancel_on_disk_image_created_ = false; + bool cancel_on_vm_started_ = false; + bool cancel_on_lxd_started_ = false; + bool cancel_on_container_created_ = false; + bool cancel_on_container_started_ = false; + bool cancel_on_container_setup_ = false; + bool cancel_then_stop_vm_ = false; int restart_crostini_callback_count_ = 0; CrostiniResult last_crostini_callback_result_ = CrostiniResult::SUCCESS; @@ -917,8 +915,8 @@ ExpectRestarterUmaCount(1); } -TEST_F(CrostiniManagerRestartTest, AbortOnComponentLoaded) { - abort_on_component_loaded_ = true; +TEST_F(CrostiniManagerRestartTest, CancelOnComponentLoaded) { + cancel_on_component_loaded_ = true; restart_id_ = crostini_manager()->RestartCrostini( container_id(), base::BindOnce(&CrostiniManagerRestartTest::RestartCrostiniCallback, @@ -951,8 +949,8 @@ "Crostini.RestarterTimeInState2.CreateDiskImage", 0); } -TEST_F(CrostiniManagerRestartTest, AbortOnDiskImageCreated) { - abort_on_disk_image_created_ = true; +TEST_F(CrostiniManagerRestartTest, CancelOnDiskImageCreated) { + cancel_on_disk_image_created_ = true; restart_id_ = crostini_manager()->RestartCrostini( container_id(), base::BindOnce(&CrostiniManagerRestartTest::RestartCrostiniCallback, @@ -1005,8 +1003,8 @@ 1); } -TEST_F(CrostiniManagerRestartTest, AbortOnVmStarted) { - abort_on_vm_started_ = true; +TEST_F(CrostiniManagerRestartTest, CancelOnVmStarted) { + cancel_on_vm_started_ = true; restart_id_ = crostini_manager()->RestartCrostini( container_id(), base::BindOnce(&CrostiniManagerRestartTest::RestartCrostiniCallback, @@ -1054,8 +1052,8 @@ ExpectRestarterUmaCount(1); } -TEST_F(CrostiniManagerRestartTest, AbortOnLxdStarted) { - abort_on_lxd_started_ = true; +TEST_F(CrostiniManagerRestartTest, CancelOnLxdStarted) { + cancel_on_lxd_started_ = true; restart_id_ = crostini_manager()->RestartCrostini( container_id(), base::BindOnce(&CrostiniManagerRestartTest::RestartCrostiniCallback, @@ -1101,8 +1099,8 @@ ExpectRestarterUmaCount(1); } -TEST_F(CrostiniManagerRestartTest, AbortOnContainerCreated) { - abort_on_container_created_ = true; +TEST_F(CrostiniManagerRestartTest, CancelOnContainerCreated) { + cancel_on_container_created_ = true; restart_id_ = crostini_manager()->RestartCrostini( ContainerId::GetDefault(), base::BindOnce(&CrostiniManagerRestartTest::RestartCrostiniCallback, @@ -1173,8 +1171,8 @@ ExpectRestarterUmaCount(1); } -TEST_F(CrostiniManagerRestartTest, AbortOnContainerCreatedError) { - abort_on_container_started_ = true; +TEST_F(CrostiniManagerRestartTest, CancelOnContainerCreatedError) { + cancel_on_container_started_ = true; fake_cicerone_client_->set_lxd_container_created_signal_status( vm_tools::cicerone::LxdContainerCreatedSignal::UNKNOWN); restart_id_ = crostini_manager()->RestartCrostini( @@ -1190,8 +1188,8 @@ ExpectRestarterUmaCount(1); } -TEST_F(CrostiniManagerRestartTest, AbortOnContainerStarted) { - abort_on_container_started_ = true; +TEST_F(CrostiniManagerRestartTest, CancelOnContainerStarted) { + cancel_on_container_started_ = true; restart_id_ = crostini_manager()->RestartCrostini( ContainerId::GetDefault(), base::BindOnce(&CrostiniManagerRestartTest::RestartCrostiniCallback, @@ -1204,8 +1202,8 @@ ExpectRestarterUmaCount(1); } -TEST_F(CrostiniManagerRestartTest, AbortOnContainerSetup) { - abort_on_container_setup_ = true; +TEST_F(CrostiniManagerRestartTest, CancelOnContainerSetup) { + cancel_on_container_setup_ = true; restart_id_ = crostini_manager()->RestartCrostini( ContainerId::GetDefault(), base::BindOnce(&CrostiniManagerRestartTest::RestartCrostiniCallback, @@ -1294,8 +1292,8 @@ ExpectRestarterUmaCount(1); } -TEST_F(CrostiniManagerRestartTest, AbortThenStopVm) { - abort_then_stop_vm_ = true; +TEST_F(CrostiniManagerRestartTest, CancelThenStopVm) { + cancel_then_stop_vm_ = true; restart_id_ = crostini_manager()->RestartCrostini( container_id(), base::BindOnce(&CrostiniManagerRestartTest::RestartCrostiniCallback, @@ -1308,7 +1306,7 @@ ExpectRestarterUmaCount(1); } -TEST_F(CrostiniManagerRestartTest, AbortFinishedRestartIsSafe) { +TEST_F(CrostiniManagerRestartTest, CancelFinishedRestartIsSafe) { restart_id_ = crostini_manager()->RestartCrostini( container_id(), base::BindOnce(&CrostiniManagerRestartTest::RestartCrostiniCallback, @@ -1319,27 +1317,20 @@ ExpectCrostiniRestartResult(CrostiniResult::SUCCESS); base::RunLoop run_loop; - crostini_manager()->AbortRestartCrostini(restart_id_, run_loop.QuitClosure()); - run_loop.Run(); + crostini_manager()->CancelRestartCrostini(restart_id_); + run_loop.RunUntilIdle(); + // Just make sure nothing crashes. } -TEST_F(CrostiniManagerRestartTest, DoubleAbortIsSafe) { +TEST_F(CrostiniManagerRestartTest, DoubleCancelIsSafe) { restart_id_ = crostini_manager()->RestartCrostini( container_id(), base::BindOnce(&CrostiniManagerRestartTest::RestartCrostiniCallback, - base::Unretained(this), base::DoNothing()), + base::Unretained(this), run_loop()->QuitClosure()), this); - // When abort is called multiple times, the callback set for each abort should - // be called at the same time. We test this here by blocking the runloop until - // they have been called the expected number of times. - int kAbortCount = 2; - auto barrier_closure = - base::BarrierClosure(kAbortCount, run_loop()->QuitClosure()); - for (int i = 0; i < kAbortCount; i++) { - crostini_manager()->AbortRestartCrostini(restart_id_, barrier_closure); - } - + crostini_manager()->CancelRestartCrostini(restart_id_); + crostini_manager()->CancelRestartCrostini(restart_id_); run_loop()->Run(); ExpectCrostiniRestartResult(CrostiniResult::RESTART_ABORTED); } @@ -1484,9 +1475,6 @@ run_loop()->Run(); - // Aborts don't call the restart callback. If that changes, everything that - // calls RestartCrostini will need to be checked to make sure they handle it - // in a sensible way. ExpectCrostiniRestartResult(CrostiniResult::RESTART_ABORTED); EXPECT_EQ(1, remove_crostini_callback_count_); ExpectRestarterUmaCount(1); @@ -1527,6 +1515,31 @@ ExpectRestarterUmaCount(3); } +TEST_F(CrostiniManagerRestartTest, UninstallWithRestarterTimeout) { + fake_concierge_client_->set_send_start_vm_response_delay( + base::TimeDelta::Max()); + on_stage_started_ = + base::BindLambdaForTesting([&](mojom::InstallerState state) { + if (state == mojom::InstallerState::kStartTerminaVm) + run_loop()->Quit(); + }); + restart_id_ = crostini_manager()->RestartCrostini(container_id(), + base::DoNothing(), this); + run_loop()->Run(); + + // In the kStartTerminaVm state now. Start an uninstall and then wait for + // the timeout to be hit. + + crostini_manager()->RemoveCrostini( + kVmName, + base::BindOnce(&CrostiniManagerRestartTest::RemoveCrostiniCallback, + base::Unretained(this), base::DoNothing())); + + task_environment_.FastForwardBy(kLongTime); + task_environment_.RunUntilIdle(); + EXPECT_EQ(1, remove_crostini_callback_count_); +} + TEST_F(CrostiniManagerRestartTest, UninstallThenRestart) { // Install crostini first so that the uninstaller doesn't terminate before we // can call the installer again @@ -1723,10 +1736,6 @@ EXPECT_EQ(std::vector<crostini::mojom::InstallerState>({ crostini::mojom::InstallerState::kCreateDiskImage, crostini::mojom::InstallerState::kStartTerminaVm, - crostini::mojom::InstallerState::kStart, - crostini::mojom::InstallerState::kInstallImageLoader, - crostini::mojom::InstallerState::kCreateDiskImage, - crostini::mojom::InstallerState::kStartTerminaVm, crostini::mojom::InstallerState::kStartLxd, crostini::mojom::InstallerState::kCreateContainer, crostini::mojom::InstallerState::kSetupContainer, @@ -1741,14 +1750,14 @@ restart_id_ = crostini_manager()->RestartCrostini( container_id(), base::BindOnce(&CrostiniManagerRestartTest::RestartCrostiniCallback, - base::Unretained(this), base::DoNothing()), + base::Unretained(this), run_loop()->QuitClosure()), &observer1); CrostiniManager::RestartOptions options; options.start_vm_only = true; restart_id_ = crostini_manager()->RestartCrostiniWithOptions( container_id(), std::move(options), base::BindOnce(&CrostiniManagerRestartTest::RestartCrostiniCallback, - base::Unretained(this), run_loop()->QuitClosure()), + base::Unretained(this), base::DoNothing()), &observer2); run_loop()->Run(); EXPECT_EQ(2, restart_crostini_callback_count_); @@ -1766,10 +1775,6 @@ EXPECT_EQ(std::vector<crostini::mojom::InstallerState>({ crostini::mojom::InstallerState::kCreateDiskImage, crostini::mojom::InstallerState::kStartTerminaVm, - crostini::mojom::InstallerState::kStartLxd, - crostini::mojom::InstallerState::kCreateContainer, - crostini::mojom::InstallerState::kSetupContainer, - crostini::mojom::InstallerState::kStartContainer, }), observer2.stages); } @@ -1803,10 +1808,6 @@ EXPECT_EQ(std::vector<crostini::mojom::InstallerState>({ crostini::mojom::InstallerState::kCreateDiskImage, crostini::mojom::InstallerState::kStartTerminaVm, - crostini::mojom::InstallerState::kStart, - crostini::mojom::InstallerState::kInstallImageLoader, - crostini::mojom::InstallerState::kCreateDiskImage, - crostini::mojom::InstallerState::kStartTerminaVm, }), observer2.stages); } @@ -1840,11 +1841,6 @@ crostini::mojom::InstallerState::kCreateDiskImage, crostini::mojom::InstallerState::kStartTerminaVm, crostini::mojom::InstallerState::kStartLxd, - crostini::mojom::InstallerState::kStart, - crostini::mojom::InstallerState::kInstallImageLoader, - crostini::mojom::InstallerState::kCreateDiskImage, - crostini::mojom::InstallerState::kStartTerminaVm, - crostini::mojom::InstallerState::kStartLxd, crostini::mojom::InstallerState::kCreateContainer, crostini::mojom::InstallerState::kSetupContainer, crostini::mojom::InstallerState::kStartContainer,
diff --git a/chrome/browser/ash/dbus/fusebox_service_provider.cc b/chrome/browser/ash/dbus/fusebox_service_provider.cc index 8dbdef9..b021a75 100644 --- a/chrome/browser/ash/dbus/fusebox_service_provider.cc +++ b/chrome/browser/ash/dbus/fusebox_service_provider.cc
@@ -13,11 +13,9 @@ #include "ash/constants/ash_features.h" #include "base/bind.h" #include "base/callback.h" -#include "base/callback_helpers.h" #include "base/logging.h" #include "base/memory/scoped_refptr.h" #include "base/task/bind_post_task.h" -#include "base/task/thread_pool.h" #include "chrome/browser/ash/file_manager/fileapi_util.h" #include "chrome/browser/profiles/profile_manager.h" #include "chromeos/ash/components/dbus/fusebox/fusebox_reverse_client.h" @@ -306,14 +304,7 @@ } // namespace -FuseBoxServiceProvider::OnCloseCallbackTracker::OnCloseCallbackTracker( - base::ScopedClosureRunner on_close_callback) - : on_close_callback_runner(std::move(on_close_callback)) {} - -FuseBoxServiceProvider::OnCloseCallbackTracker::~OnCloseCallbackTracker() = - default; - -FuseBoxServiceProvider::FuseBoxServiceProvider() : next_tracker_key_(1) {} +FuseBoxServiceProvider::FuseBoxServiceProvider() = default; FuseBoxServiceProvider::~FuseBoxServiceProvider() = default; @@ -354,23 +345,15 @@ dbus::MessageReader reader(method_call); auto common = ParseCommonDBusMethodArguments(&reader); if (common.error_code != base::File::Error::FILE_OK) { - ReplyToClose(std::move(common.fs_context), method_call, std::move(sender), + ReplyToClose(common.fs_context, method_call, std::move(sender), common.error_code); return; } - uint64_t cookie = 0; - if (!reader.PopUint64(&cookie)) { - LOG(ERROR) << "No Cookie"; - ReplyToClose(std::move(common.fs_context), method_call, std::move(sender), - base::File::Error::FILE_ERROR_INVALID_OPERATION); - return; - } - - trackers_.erase(cookie); - - ReplyToClose(std::move(common.fs_context), method_call, std::move(sender), - base::File::Error::FILE_OK); + // Fail with an invalid operation error for now. TODO(crbug.com/1249754) + // implement MTP device writing. + ReplyToClose(common.fs_context, method_call, std::move(sender), + base::File::Error::FILE_ERROR_INVALID_OPERATION); } void FuseBoxServiceProvider::Open(dbus::MethodCall* method_call, @@ -380,93 +363,15 @@ dbus::MessageReader reader(method_call); auto common = ParseCommonDBusMethodArguments(&reader); if (common.error_code != base::File::Error::FILE_OK) { - ReplyToOpenFailure(std::move(common.fs_context), method_call, - std::move(sender), common.error_code); + ReplyToOpenFailure(common.fs_context, method_call, std::move(sender), + common.error_code); return; } - int32_t flags = 0; - if (!reader.PopInt32(&flags)) { - LOG(ERROR) << "No Flags"; - ReplyToOpenFailure(std::move(common.fs_context), method_call, - std::move(sender), - base::File::Error::FILE_ERROR_INVALID_OPERATION); - return; - } - int base_file_flags = base::File::FLAG_OPEN; - switch (mode_t(flags) & O_ACCMODE) { - case O_RDWR: - base_file_flags |= base::File::FLAG_READ | base::File::FLAG_WRITE; - break; - case O_WRONLY: - base_file_flags |= base::File::FLAG_WRITE; - break; - default: - base_file_flags |= base::File::FLAG_READ; - break; - } - - auto reply_to_open_typical = base::BindPostTask( - base::SequencedTaskRunnerHandle::Get(), - base::BindOnce(&FuseBoxServiceProvider::ReplyToOpenTypical, - weak_ptr_factory_.GetWeakPtr(), common.fs_context, - method_call, std::move(sender))); - - content::GetIOThreadTaskRunner({})->PostTask( - FROM_HERE, - base::BindOnce( - base::IgnoreResult(&storage::FileSystemOperationRunner::OpenFile), - // Unretained is safe: common.fs_context owns its operation_runner. - base::Unretained(common.fs_context->operation_runner()), - common.fs_url, base_file_flags, std::move(reply_to_open_typical))); -} - -void FuseBoxServiceProvider::ReplyToOpenTypical( - scoped_refptr<storage::FileSystemContext> fs_context, // See (§) above. - dbus::MethodCall* method_call, - dbus::ExportedObject::ResponseSender sender, - base::File file, - base::ScopedClosureRunner on_close_callback) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - uint64_t cookie = next_tracker_key_++; - scoped_refptr<OnCloseCallbackTracker> tracker; - if (on_close_callback) { - tracker = base::MakeRefCounted<OnCloseCallbackTracker>( - std::move(on_close_callback)); - trackers_[cookie] = tracker; - } else { - // No-op. We don't need to track when client and server have closed, since - // the action we'd otherwise take is to run a null on_close_callback. - } - - std::unique_ptr<dbus::Response> response = - dbus::Response::FromMethodCall(method_call); - dbus::MessageWriter writer(response.get()); - - writer.AppendInt32(static_cast<int32_t>(file.error_details())); - writer.AppendUint64(cookie); - if (file.IsValid()) { - // AppendFileDescriptor will dup its file-descriptor argument. - writer.AppendFileDescriptor(file.GetPlatformFile()); - } - - std::move(sender).Run(std::move(response)); - - // Call base::File::Close, which can block, off the UI thread. - base::ThreadPool::PostTask( - FROM_HERE, - { - base::MayBlock(), - base::TaskPriority::BEST_EFFORT, - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN, - }, - base::BindOnce( - [](base::File file, scoped_refptr<OnCloseCallbackTracker> tracker) { - file.Close(); - // The |tracker| destructor will run after |file| was closed. - }, - std::move(file), tracker)); + // Fail with an invalid operation error for now. TODO(crbug.com/1249754) + // implement MTP device writing. + ReplyToOpenFailure(common.fs_context, method_call, std::move(sender), + base::File::Error::FILE_ERROR_INVALID_OPERATION); } void FuseBoxServiceProvider::Read(dbus::MethodCall* method_call,
diff --git a/chrome/browser/ash/dbus/fusebox_service_provider.h b/chrome/browser/ash/dbus/fusebox_service_provider.h index 0d136d0..91349cd 100644 --- a/chrome/browser/ash/dbus/fusebox_service_provider.h +++ b/chrome/browser/ash/dbus/fusebox_service_provider.h
@@ -5,10 +5,7 @@ #ifndef CHROME_BROWSER_ASH_DBUS_FUSEBOX_SERVICE_PROVIDER_H_ #define CHROME_BROWSER_ASH_DBUS_FUSEBOX_SERVICE_PROVIDER_H_ -#include "base/callback_helpers.h" -#include "base/containers/flat_map.h" #include "base/files/file.h" -#include "base/memory/ref_counted_delete_on_sequence.h" #include "base/memory/weak_ptr.h" #include "chromeos/ash/components/dbus/services/cros_dbus_service.h" #include "dbus/exported_object.h" @@ -30,34 +27,6 @@ void Start(scoped_refptr<dbus::ExportedObject> object) override; private: - // storage::FileSystemOperationRunner::OpenFile gives us an - // "on_close_calback" that we are supposed to run after the file is closed. - // To complicate matters, we duplicate the underlying FD (file descriptor) - // and pass it over D-Bus to the fusebox::kFuseBoxServiceInterface client for - // which we are the fusebox::kFuseBoxServiceInterface server. - // - // This struct tracks when the underlying FD is closed in both client and - // server. When its ref-count hits zero, on_close_callback_runner will run. - class OnCloseCallbackTracker - : public base::RefCounted<OnCloseCallbackTracker> { - public: - explicit OnCloseCallbackTracker( - base::ScopedClosureRunner on_close_callback); - OnCloseCallbackTracker(const OnCloseCallbackTracker&) = delete; - OnCloseCallbackTracker& operator=(const OnCloseCallbackTracker&) = delete; - - private: - ~OnCloseCallbackTracker(); - friend class base::DeleteHelper<OnCloseCallbackTracker>; - friend class base::RefCounted<OnCloseCallbackTracker>; - - base::ScopedClosureRunner on_close_callback_runner; - }; - - // trackers_ and next_tracker_key_ should only be accessed on the UI thread. - base::flat_map<uint64_t, scoped_refptr<OnCloseCallbackTracker>> trackers_; - uint64_t next_tracker_key_; - // D-Bus methods. // // In terms of semantics, they're roughly equivalent to the C standard @@ -74,12 +43,6 @@ void Stat(dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender sender); - void ReplyToOpenTypical(scoped_refptr<storage::FileSystemContext> fs_context, - dbus::MethodCall* method_call, - dbus::ExportedObject::ResponseSender sender, - base::File file, - base::ScopedClosureRunner on_close_callback); - // base::WeakPtr{this} factory. base::WeakPtrFactory<FuseBoxServiceProvider> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest.cc b/chrome/browser/ash/file_manager/file_manager_browsertest.cc index 10f7ded..61d6a67 100644 --- a/chrome/browser/ash/file_manager/file_manager_browsertest.cc +++ b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
@@ -495,6 +495,7 @@ TestCase("zipExtractCheckContent").ExtractArchive().FilesSwa(), TestCase("zipExtractCheckDuplicates").ExtractArchive().FilesSwa(), TestCase("zipExtractCheckEncodings").ExtractArchive().FilesSwa(), + TestCase("zipExtractNotEnoughSpace").ExtractArchive().FilesSwa(), TestCase("zipExtractShowPanel").ExtractArchive().FilesSwa(), TestCase("zipExtractSelectionMenus").ExtractArchive().FilesSwa()));
diff --git a/chrome/browser/ash/file_manager/file_tasks.cc b/chrome/browser/ash/file_manager/file_tasks.cc index 84d55f7..58d5790 100644 --- a/chrome/browser/ash/file_manager/file_tasks.cc +++ b/chrome/browser/ash/file_manager/file_tasks.cc
@@ -17,6 +17,8 @@ #include "base/containers/contains.h" #include "base/feature_list.h" #include "base/metrics/histogram_macros.h" +#include "base/metrics/user_metrics.h" +#include "base/metrics/user_metrics_action.h" #include "base/strings/strcat.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" @@ -107,6 +109,27 @@ const char kPluginVmAppTaskType[] = "pluginvm"; const char kWebAppTaskType[] = "web"; +constexpr char kPdfMimeType[] = "application/pdf"; +constexpr char kPdfFileExtension[] = ".pdf"; + +void RecordChangesInDefaultPdfApp(const std::string& new_default_app_id, + const std::set<std::string>& mime_types, + const std::set<std::string>& suffixes) { + bool hasPdfMimeType = base::Contains(mime_types, kPdfMimeType); + bool hasPdfSuffix = base::Contains(suffixes, kPdfFileExtension); + if (!hasPdfMimeType || !hasPdfSuffix) { + return; + } + + if (new_default_app_id == web_app::kMediaAppId) { + base::RecordAction( + base::UserMetricsAction("MediaApp.PDF.DefaultApp.SwitchedTo")); + } else { + base::RecordAction( + base::UserMetricsAction("MediaApp.PDF.DefaultApp.SwitchedAway")); + } +} + // Returns True if the `app_id` belongs to Files app either extension or SWA. inline bool isFilesAppId(const std::string& app_id) { return app_id == kFileManagerAppId || app_id == kFileManagerSwaAppId; @@ -672,15 +695,22 @@ } } + std::set<std::string> lowercase_suffixes; if (!suffixes.empty()) { DictionaryPrefUpdate mime_type_pref(pref_service, prefs::kDefaultTasksBySuffix); for (const std::string& suffix : suffixes) { // Suffixes are case insensitive. std::string lower_suffix = base::ToLowerASCII(suffix); + lowercase_suffixes.insert(lower_suffix); mime_type_pref->SetStringKey(lower_suffix, task_id); } } + + if (base::FeatureList::IsEnabled(chromeos::features::kMediaAppHandlesPdf)) { + RecordChangesInDefaultPdfApp(task_descriptor.app_id, mime_types, + lowercase_suffixes); + } } bool GetDefaultTaskFromPrefs(const PrefService& pref_service,
diff --git a/chrome/browser/ash/file_manager/file_tasks_unittest.cc b/chrome/browser/ash/file_manager/file_tasks_unittest.cc index 3ec362f9..4bddb94b 100644 --- a/chrome/browser/ash/file_manager/file_tasks_unittest.cc +++ b/chrome/browser/ash/file_manager/file_tasks_unittest.cc
@@ -10,10 +10,13 @@ #include <set> #include <utility> +#include "ash/constants/ash_features.h" #include "base/bind.h" #include "base/command_line.h" #include "base/run_loop.h" #include "base/strings/escape.h" +#include "base/test/metrics/user_action_tester.h" +#include "base/test/scoped_feature_list.h" #include "base/values.h" #include "chrome/browser/ash/crostini/crostini_pref_names.h" #include "chrome/browser/ash/crostini/crostini_test_helper.h" @@ -27,6 +30,7 @@ #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/test_extension_system.h" +#include "chrome/browser/web_applications/web_app_id_constants.h" #include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_profile.h" @@ -327,6 +331,47 @@ EXPECT_TRUE(tasks[0].is_default); } +// Test that for changes of default app for PDF files, a metric is recorded. +TEST(FileManagerFileTasksTest, UpdateDefaultTask_RecordsPdfDefaultAppChanges) { + base::test::ScopedFeatureList scoped_feature_list{ + ash::features::kMediaAppHandlesPdf}; + TestingPrefServiceSimple pref_service; + RegisterDefaultTaskPreferences(&pref_service); + base::UserActionTester user_action_tester; + + // Non-PDF file types are not recorded. + TaskDescriptor other_app_task("other-app-id", TASK_TYPE_FILE_HANDLER, + "action-id"); + UpdateDefaultTask(&pref_service, other_app_task, {".txt"}, {"text/plain"}); + // Even if it's the Media App. + TaskDescriptor media_app_task(web_app::kMediaAppId, TASK_TYPE_FILE_HANDLER, + "action-id"); + UpdateDefaultTask(&pref_service, media_app_task, {"tiff"}, {"image/tiff"}); + + EXPECT_EQ(0, user_action_tester.GetActionCount( + "MediaApp.PDF.DefaultApp.SwitchedAway")); + EXPECT_EQ(0, user_action_tester.GetActionCount( + "MediaApp.PDF.DefaultApp.SwitchedTo")); + + // PDF files are recorded. + UpdateDefaultTask(&pref_service, media_app_task, {".pdf"}, + {"application/pdf"}); + + EXPECT_EQ(1, user_action_tester.GetActionCount( + "MediaApp.PDF.DefaultApp.SwitchedTo")); + EXPECT_EQ(0, user_action_tester.GetActionCount( + "MediaApp.PDF.DefaultApp.SwitchedAway")); + user_action_tester.ResetCounts(); + + UpdateDefaultTask(&pref_service, other_app_task, {".pdf"}, + {"application/pdf"}); + + EXPECT_EQ(0, user_action_tester.GetActionCount( + "MediaApp.PDF.DefaultApp.SwitchedTo")); + EXPECT_EQ(1, user_action_tester.GetActionCount( + "MediaApp.PDF.DefaultApp.SwitchedAway")); +} + // Test FileHandlerIsEnabled which returns whether a file handler should be // used. TEST(FileManagerFileTasksTest, FileHandlerIsEnabled) {
diff --git a/chrome/browser/ash/login/encryption_migration_browsertest.cc b/chrome/browser/ash/login/encryption_migration_browsertest.cc index 0eaf767..cfc08f74 100644 --- a/chrome/browser/ash/login/encryption_migration_browsertest.cc +++ b/chrome/browser/ash/login/encryption_migration_browsertest.cc
@@ -367,7 +367,9 @@ .has_account_id()); } -IN_PROC_BROWSER_TEST_F(EncryptionMigrationTest, InsufficientSpaceOnResume) { +// TODO(crbug.com/1324733): Re-enable this test +IN_PROC_BROWSER_TEST_F(EncryptionMigrationTest, + DISABLED_InsufficientSpaceOnResume) { set_free_space(5 * 1000 * 1000); MarkUserHasEnterprisePolicy(); @@ -393,7 +395,8 @@ .has_account_id()); } -IN_PROC_BROWSER_TEST_F(EncryptionMigrationTest, MigrationFailure) { +// TODO(crbug.com/1324694): Re-enable this test +IN_PROC_BROWSER_TEST_F(EncryptionMigrationTest, DISABLED_MigrationFailure) { MarkUserHasEnterprisePolicy(); OobeScreenWaiter encryption_migration_screen_waiter(
diff --git a/chrome/browser/ash/login/enrollment/enrollment_screen.cc b/chrome/browser/ash/login/enrollment/enrollment_screen.cc index 39344ac..2b147087 100644 --- a/chrome/browser/ash/login/enrollment/enrollment_screen.cc +++ b/chrome/browser/ash/login/enrollment/enrollment_screen.cc
@@ -513,6 +513,9 @@ } void EnrollmentScreen::OnConfirmationClosed() { + if (features::IsOobeConsolidatedConsentEnabled()) + StartupUtils::MarkEulaAccepted(); + // TODO(crbug.com/1271134): Logging as "WARNING" to make sure it's preserved // in the logs. LOG(WARNING) << "Confirmation closed.";
diff --git a/chrome/browser/ash/login/existing_user_controller.cc b/chrome/browser/ash/login/existing_user_controller.cc index 02df9159..3874d7e 100644 --- a/chrome/browser/ash/login/existing_user_controller.cc +++ b/chrome/browser/ash/login/existing_user_controller.cc
@@ -45,6 +45,7 @@ #include "chrome/browser/ash/crosapi/browser_data_migrator.h" #include "chrome/browser/ash/customization/customization_document.h" #include "chrome/browser/ash/login/auth/chrome_login_performer.h" +#include "chrome/browser/ash/login/demo_mode/demo_session.h" #include "chrome/browser/ash/login/easy_unlock/easy_unlock_service.h" #include "chrome/browser/ash/login/enterprise_user_session_metrics.h" #include "chrome/browser/ash/login/helper.h" @@ -104,7 +105,6 @@ #include "components/account_id/account_id.h" #include "components/google/core/common/google_util.h" #include "components/policy/core/common/cloud/cloud_policy_core.h" -#include "components/policy/core/common/cloud/cloud_policy_store.h" #include "components/policy/core/common/cloud/device_management_service.h" #include "components/policy/core/common/policy_map.h" #include "components/policy/core/common/policy_service.h" @@ -333,40 +333,42 @@ } // namespace -// Utility class used to wait for a Public Session policy store load if public -// session login is requested before the associated policy store is loaded. -// When the store gets loaded, it will run the callback passed to the +// Utility class used to wait for a Public Session policy to be available if +// public session login is requested before the associated policy is loaded. +// When the policy is available, it will run the callback passed to the // constructor. -class ExistingUserController::PolicyStoreLoadWaiter - : public policy::CloudPolicyStore::Observer { +class ExistingUserController::DeviceLocalAccountPolicyWaiter + : public policy::DeviceLocalAccountPolicyService::Observer { public: - PolicyStoreLoadWaiter(policy::CloudPolicyStore* store, - base::OnceClosure callback) - : callback_(std::move(callback)) { - DCHECK(!store->is_initialized()); - scoped_observation_.Observe(store); + DeviceLocalAccountPolicyWaiter( + policy::DeviceLocalAccountPolicyService* policy_service, + base::OnceClosure callback) + : policy_service_(policy_service), callback_(std::move(callback)) { + scoped_observation_.Observe(policy_service); } - ~PolicyStoreLoadWaiter() override = default; + ~DeviceLocalAccountPolicyWaiter() override = default; - PolicyStoreLoadWaiter(const PolicyStoreLoadWaiter& other) = delete; - PolicyStoreLoadWaiter& operator=(const PolicyStoreLoadWaiter& other) = delete; + DeviceLocalAccountPolicyWaiter(const DeviceLocalAccountPolicyWaiter& other) = + delete; + DeviceLocalAccountPolicyWaiter& operator=( + const DeviceLocalAccountPolicyWaiter& other) = delete; - // policy::CloudPolicyStore::Observer: - void OnStoreLoaded(policy::CloudPolicyStore* store) override { + // policy::DeviceLocalAccountPolicyService::Observer: + void OnPolicyUpdated(const std::string& user_id) override { + if (!policy_service_->IsPolicyAvailableForUser(user_id)) + return; scoped_observation_.Reset(); std::move(callback_).Run(); } - void OnStoreError(policy::CloudPolicyStore* store) override { - // If store load fails, run the callback to unblock public session login - // attempt, which will likely fail. - scoped_observation_.Reset(); - std::move(callback_).Run(); - } + + void OnDeviceLocalAccountsChanged() override {} private: + base::raw_ptr<policy::DeviceLocalAccountPolicyService> policy_service_ = + nullptr; base::OnceClosure callback_; - base::ScopedObservation<policy::CloudPolicyStore, - policy::CloudPolicyStore::Observer> + base::ScopedObservation<policy::DeviceLocalAccountPolicyService, + policy::DeviceLocalAccountPolicyService::Observer> scoped_observation_{this}; }; @@ -435,11 +437,18 @@ // use stored cryptohome powerwash state later policy::PowerwashRequirementsChecker::Initialize(); } - bool show_users_on_signin; + bool show_users_on_signin = true; user_manager::UserList saml_users_for_password_sync; cros_settings_->GetBoolean(kAccountsPrefShowUserNamesOnSignIn, &show_users_on_signin); + GetLoginDisplayHost()->metrics_recorder()->OnShowUsersOnSignin( + show_users_on_signin); + bool enable_ephemeral_users = false; + cros_settings_->GetBoolean(kAccountsPrefEphemeralUsersEnabled, + &enable_ephemeral_users); + GetLoginDisplayHost()->metrics_recorder()->OnEnableEphemeralUsers( + enable_ephemeral_users); user_manager::UserManager* const user_manager = user_manager::UserManager::Get(); // By default disable offline login from the error screen. @@ -470,6 +479,7 @@ // Records total number of users on the login screen. base::UmaHistogramCounts100("Login.NumberOfUsersOnLoginScreen", regular_users_counter); + GetLoginDisplayHost()->metrics_recorder()->OnUserCount(regular_users_counter); auto login_users = ExtractLoginUsers(users); @@ -1246,35 +1256,33 @@ return; } - // Public session login will fail if attempted if the associated policy store - // is not initialized - wait for the policy store load before starting the + // Public session login will fail if attempted if the associated policy + // is not ready - wait for the policy to become available before starting the // auto-login timer. - policy::CloudPolicyStore* policy_store = - g_browser_process->platform_part() - ->browser_policy_connector_ash() - ->GetDeviceLocalAccountPolicyService() - ->GetBrokerForUser(user->GetAccountId().GetUserEmail()) - ->core() - ->store(); + policy::BrowserPolicyConnectorAsh* connector = + g_browser_process->platform_part()->browser_policy_connector_ash(); + policy::DeviceLocalAccountPolicyService* policy_service = + connector->GetDeviceLocalAccountPolicyService(); - if (!policy_store->is_initialized()) { - VLOG(2) << "Public session policy store not yet initialized"; - policy_store_waiter_ = std::make_unique<PolicyStoreLoadWaiter>( - policy_store, + if (policy_service && !policy_service->IsPolicyAvailableForUser( + user_context.GetAccountId().GetUserEmail())) { + VLOG(2) << "Policies are not yet available for public session"; + policy_waiter_ = std::make_unique<DeviceLocalAccountPolicyWaiter>( + policy_service, base::BindOnce( - &ExistingUserController::LoginAsPublicSessionWithPolicyStoreReady, + &ExistingUserController::LoginAsPublicSessionWhenPolicyAvailable, base::Unretained(this), user_context)); return; } - LoginAsPublicSessionWithPolicyStoreReady(user_context); + LoginAsPublicSessionWhenPolicyAvailable(user_context); } -void ExistingUserController::LoginAsPublicSessionWithPolicyStoreReady( +void ExistingUserController::LoginAsPublicSessionWhenPolicyAvailable( const UserContext& user_context) { - VLOG(2) << "LoginAsPublicSessionWithPolicyStoreReady"; - policy_store_waiter_.reset(); + VLOG(2) << __func__; + policy_waiter_.reset(); UserContext new_user_context = user_context; std::string locale = user_context.GetPublicSessionLocale(); @@ -1435,12 +1443,18 @@ } void ExistingUserController::StartAutoLoginTimer() { + auto session_state = session_manager::SessionManager::Get()->session_state(); if (is_login_in_progress_ || - !public_session_auto_login_account_id_.is_valid()) { + !public_session_auto_login_account_id_.is_valid() || + (session_state == session_manager::SessionState::OOBE && + !DemoSession::IsDeviceInDemoMode())) { VLOG(2) << "Not starting autologin timer, because:"; VLOG_IF(2, is_login_in_progress_) << "* Login is in process;"; VLOG_IF(2, !public_session_auto_login_account_id_.is_valid()) << "* No valid autologin account;"; + VLOG_IF(2, session_state == session_manager::SessionState::OOBE && + !DemoSession::IsDeviceInDemoMode()) + << "* OOBE isn't completed and device isn't in demo mode;"; return; } VLOG(2) << "Starting autologin timer with delay: " << auto_login_delay_;
diff --git a/chrome/browser/ash/login/existing_user_controller.h b/chrome/browser/ash/login/existing_user_controller.h index 473ed14..582a98b 100644 --- a/chrome/browser/ash/login/existing_user_controller.h +++ b/chrome/browser/ash/login/existing_user_controller.h
@@ -155,7 +155,7 @@ FRIEND_TEST_ALL_PREFIXES(ExistingUserControllerTest, ExistingUserLogin); - class PolicyStoreLoadWaiter; + class DeviceLocalAccountPolicyWaiter; void LoginAsGuest(); void LoginAsPublicSession(const UserContext& user_context); @@ -247,13 +247,11 @@ // Sends an accessibility alert event to extension listeners. void SendAccessibilityAlert(const std::string& alert_text); - // Continues public session login if the associated user cloud policy store is - // loaded. + // Continues public session login if the public session policy is loaded. // This is intended to delay public session login if the login is requested - // before the policy store is initialized (in which case the login attempt - // would fail). - void LoginAsPublicSessionWithPolicyStoreReady( - const UserContext& user_context); + // before the policy is available (in which case the login attempt would + // fail). + void LoginAsPublicSessionWhenPolicyAvailable(const UserContext& user_context); // Callback invoked when the keyboard layouts available for a public session // have been retrieved. Selects the first layout from the list and continues @@ -388,9 +386,9 @@ std::unique_ptr<OAuth2TokenInitializer> oauth2_token_initializer_; - // Used to wait for cloud policy store load during public session login, if - // the store is not yet initialized when the login is attempted. - std::unique_ptr<PolicyStoreLoadWaiter> policy_store_waiter_; + // Used to wait for local account policy during session login, if policy is + // not yet available when the login is attempted. + std::unique_ptr<DeviceLocalAccountPolicyWaiter> policy_waiter_; // The source of PIN salts. Used to retrieve PIN during TransformPinKey. std::unique_ptr<quick_unlock::PinSaltStorage> pin_salt_storage_;
diff --git a/chrome/browser/ash/login/existing_user_controller_auto_login_unittest.cc b/chrome/browser/ash/login/existing_user_controller_auto_login_unittest.cc index f370495..cfa250b 100644 --- a/chrome/browser/ash/login/existing_user_controller_auto_login_unittest.cc +++ b/chrome/browser/ash/login/existing_user_controller_auto_login_unittest.cc
@@ -20,6 +20,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chromeos/dbus/session_manager/fake_session_manager_client.h" #include "components/ownership/mock_owner_key_util.h" +#include "components/session_manager/core/session_manager.h" #include "components/user_manager/scoped_user_manager.h" #include "content/public/test/browser_task_environment.h" #include "testing/gmock/include/gmock/gmock.h" @@ -83,6 +84,9 @@ existing_user_controller_->local_account_auto_login_id_subscription_ = {}; existing_user_controller_ ->local_account_auto_login_delay_subscription_ = {}; + + session_manager_.SetSessionState( + session_manager::SessionState::LOGIN_PRIMARY); } ExistingUserController* existing_user_controller() const { @@ -148,6 +152,8 @@ user_manager::ScopedUserManager scoped_user_manager_; std::unique_ptr<ArcKioskAppManager> arc_kiosk_app_manager_; + session_manager::SessionManager session_manager_; + // `existing_user_controller_` must be destroyed before // `device_settings_test_helper_`. std::unique_ptr<ExistingUserController> existing_user_controller_;
diff --git a/chrome/browser/ash/login/existing_user_controller_browsertest.cc b/chrome/browser/ash/login/existing_user_controller_browsertest.cc index adb8c422..3305d04 100644 --- a/chrome/browser/ash/login/existing_user_controller_browsertest.cc +++ b/chrome/browser/ash/login/existing_user_controller_browsertest.cc
@@ -1310,7 +1310,9 @@ EXPECT_TRUE(user->force_online_signin()); } -IN_PROC_BROWSER_TEST_F(ExistingUserControllerAuthFailureTest, TpmError) { +// TODO(crbug.com/1324677): Re-enable this test +IN_PROC_BROWSER_TEST_F(ExistingUserControllerAuthFailureTest, + DISABLED_TpmError) { SetUpStubAuthenticatorAndAttemptLogin(AuthFailure::TPM_ERROR); OobeScreenWaiter(TpmErrorView::kScreenId).Wait();
diff --git a/chrome/browser/ash/login/oobe_interactive_ui_test.cc b/chrome/browser/ash/login/oobe_interactive_ui_test.cc index c394cad..eddcca48 100644 --- a/chrome/browser/ash/login/oobe_interactive_ui_test.cc +++ b/chrome/browser/ash/login/oobe_interactive_ui_test.cc
@@ -60,7 +60,7 @@ #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/user_creation_screen_handler.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/dbus/update_engine/update_engine_client.h" #include "chromeos/system/fake_statistics_provider.h" #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/ash/login/reset_browsertest.cc b/chrome/browser/ash/login/reset_browsertest.cc index 7bd7cf42..be11d09 100644 --- a/chrome/browser/ash/login/reset_browsertest.cc +++ b/chrome/browser/ash/login/reset_browsertest.cc
@@ -281,7 +281,7 @@ EXPECT_TRUE(LoginScreenTestApi::IsGuestButtonShown()); } -IN_PROC_BROWSER_TEST_F(ResetTest, RestartBeforePowerwash) { +IN_PROC_BROWSER_TEST_F(ResetTest, DISABLED_RestartBeforePowerwash) { EXPECT_TRUE(LoginScreenTestApi::IsGuestButtonShown()); PrefService* prefs = g_browser_process->local_state(); @@ -513,7 +513,8 @@ } IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, - ResetFromSigninWithFirmwareUpdate) { + // TODO(crbug.com/1324763): Re-enable this test + DISABLED_ResetFromSigninWithFirmwareUpdate) { OobeScreenWaiter(ResetView::kScreenId).Wait(); ASSERT_TRUE(HasPendingTpmFirmwareUpdateCheck());
diff --git a/chrome/browser/ash/login/screens/assistant_optin_flow_screen.cc b/chrome/browser/ash/login/screens/assistant_optin_flow_screen.cc index 96b7b8a..454890a 100644 --- a/chrome/browser/ash/login/screens/assistant_optin_flow_screen.cc +++ b/chrome/browser/ash/login/screens/assistant_optin_flow_screen.cc
@@ -11,7 +11,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" namespace ash { namespace {
diff --git a/chrome/browser/ash/login/screens/consolidated_consent_screen.cc b/chrome/browser/ash/login/screens/consolidated_consent_screen.cc index dffcc2d8..5a11330 100644 --- a/chrome/browser/ash/login/screens/consolidated_consent_screen.cc +++ b/chrome/browser/ash/login/screens/consolidated_consent_screen.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ash/login/screens/consolidated_consent_screen.h" #include "ash/components/arc/arc_prefs.h" +#include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/command_line.h" @@ -119,6 +120,9 @@ bool ConsolidatedConsentScreen::MaybeSkip(WizardContext* context) { if (context->skip_post_login_screens_for_tests) { + if (features::IsOobeConsolidatedConsentEnabled()) + StartupUtils::MarkEulaAccepted(); + exit_callback_.Run(Result::NOT_APPLICABLE); return true; }
diff --git a/chrome/browser/ash/login/screens/pin_setup_screen.cc b/chrome/browser/ash/login/screens/pin_setup_screen.cc index 246aeb6e..a0a4ba0 100644 --- a/chrome/browser/ash/login/screens/pin_setup_screen.cc +++ b/chrome/browser/ash/login/screens/pin_setup_screen.cc
@@ -11,8 +11,8 @@ #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/tablet_mode.h" -#include "base/auto_reset.h" #include "base/check.h" +#include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "chrome/browser/ash/login/quick_unlock/auth_token.h" #include "chrome/browser/ash/login/quick_unlock/pin_backend.h" @@ -36,9 +36,6 @@ constexpr const char kUserActionSkipButtonClickedInFlow[] = "skip-button-in-flow"; -// If set to true ShouldSkipBecauseOfPolicy returns false. -static bool g_force_no_skip_because_of_policy_for_tests = false; - struct PinSetupUserAction { const char* name_; PinSetupScreen::UserAction uma_name_; @@ -85,8 +82,6 @@ // static bool PinSetupScreen::ShouldSkipBecauseOfPolicy() { - if (g_force_no_skip_because_of_policy_for_tests) - return false; PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); if (chrome_user_manager_util::IsPublicSessionOrEphemeralLogin() || quick_unlock::IsPinDisabledByPolicy(prefs, quick_unlock::Purpose::kAny)) { @@ -96,13 +91,6 @@ return false; } -// static -std::unique_ptr<base::AutoReset<bool>> -PinSetupScreen::SetForceNoSkipBecauseOfPolicyForTests(bool value) { - return std::make_unique<base::AutoReset<bool>>( - &g_force_no_skip_because_of_policy_for_tests, value); -} - PinSetupScreen::PinSetupScreen(PinSetupScreenView* view, const ScreenExitCallback& exit_callback) : BaseScreen(PinSetupScreenView::kScreenId, OobeScreenPriority::DEFAULT), @@ -134,23 +122,14 @@ if (!context->extra_factors_auth_session) return SkipScreen(context); - Profile* active_user_profile = ProfileManager::GetActiveUserProfile(); - - // Show setup for Family Link users on tablet and clamshell if the device - // supports PIN for login. - bool show_for_family_link_user = - active_user_profile->IsChild() && has_login_support_.value_or(false); - if (show_for_family_link_user) + // If cryptohome takes very long to respond, `has_login_support_` may be null + // here, but this is very unusual. + LOG_IF(WARNING, !has_login_support_.has_value()) + << "Could not determine hardware support support for login"; + // Show pin setup if we have hardware support for login with pin. + if (has_login_support_.value_or(false)) { return false; - - // Show setup for managed users if the device supports PIN for login. - const bool is_managed_user = - active_user_profile->GetProfilePolicyConnector()->IsManaged() && - !active_user_profile->IsChild(); - const bool show_for_managed_users = - is_managed_user && has_login_support_.value_or(false); - if (show_for_managed_users) - return false; + } // Show the screen if the device is in tablet mode or tablet mode first user // run is forced on the device.
diff --git a/chrome/browser/ash/login/screens/pin_setup_screen_browsertest.cc b/chrome/browser/ash/login/screens/pin_setup_screen_browsertest.cc index 2a04f02..b7d827d0 100644 --- a/chrome/browser/ash/login/screens/pin_setup_screen_browsertest.cc +++ b/chrome/browser/ash/login/screens/pin_setup_screen_browsertest.cc
@@ -4,25 +4,20 @@ #include "chrome/browser/ash/login/screens/pin_setup_screen.h" -#include "ash/components/login/auth/stub_authenticator_builder.h" #include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" #include "ash/public/cpp/test/shell_test_api.h" -#include "base/auto_reset.h" #include "base/bind.h" #include "base/run_loop.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/ash/login/screen_manager.h" -#include "chrome/browser/ash/login/test/device_state_mixin.h" -#include "chrome/browser/ash/login/test/embedded_policy_test_server_mixin.h" -#include "chrome/browser/ash/login/test/fake_gaia_mixin.h" #include "chrome/browser/ash/login/test/js_checker.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" #include "chrome/browser/ash/login/test/oobe_screen_waiter.h" -#include "chrome/browser/ash/login/test/user_policy_mixin.h" #include "chrome/browser/ash/login/ui/login_display_host.h" #include "chrome/browser/ash/login/wizard_controller.h" +#include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/webui/chromeos/login/pin_setup_screen_handler.h" #include "chromeos/dbus/userdataauth/fake_userdataauth_client.h" #include "components/user_manager/user_type.h" @@ -43,73 +38,47 @@ } // namespace -class PinSetupScreenTest - : public OobeBaseTest, - public testing::WithParamInterface<user_manager::UserType> { +// Fixture to prepare oobe and the PIN setup screen. By default with this +// fixture, the PIN setup screen shouldn't be shown. There are child classes +// which perform the necessary setup so that the PIN setup screen is shown. +class PinSetupScreenTest : public OobeBaseTest { public: - PinSetupScreenTest() { - if (GetParam() == user_manager::USER_TYPE_CHILD) { - fake_gaia_ = std::make_unique<FakeGaiaMixin>(&mixin_host_); - policy_server_ = - std::make_unique<EmbeddedPolicyTestServerMixin>(&mixin_host_); - user_policy_mixin_ = std::make_unique<UserPolicyMixin>( - &mixin_host_, test_child_user_.account_id, policy_server_.get()); - } + PinSetupScreenTest() { chromeos::UserDataAuthClient::InitializeFake(); } - chromeos::UserDataAuthClient::InitializeFake(); - } ~PinSetupScreenTest() override = default; - void SetUpOnMainThread() override { + // This must be called very early (e.g. in the constructor) so that the + // hardware support flag before `PinSetupScreen` reads it. + static void SetHardwareSupport(bool is_supported) { FakeUserDataAuthClient::TestApi::Get() - ->set_supports_low_entropy_credentials(false); + ->set_supports_low_entropy_credentials(is_supported); + } + + static void SetTabletMode(bool in_tablet_mode) { + ShellTestApi().SetTabletModeEnabledForTest(in_tablet_mode); + } + + void SetUpOnMainThread() override { + OobeBaseTest::SetUpOnMainThread(); original_callback_ = GetScreen()->get_exit_callback_for_testing(); GetScreen()->set_exit_callback_for_testing(base::BindRepeating( &PinSetupScreenTest::HandleScreenExit, base::Unretained(this))); - OobeBaseTest::SetUpOnMainThread(); - } - - void SetUpInProcessBrowserTestFixture() override { - // Child users require a user policy, set up an empty one so the user can - // get through login. - if (GetParam() == user_manager::USER_TYPE_CHILD) - ASSERT_TRUE(user_policy_mixin_->RequestPolicyUpdate()); - - OobeBaseTest::SetUpInProcessBrowserTestFixture(); + // Force the sync screen to be shown so that we don't jump to PIN setup + // screen (consuming auth session) in unbranded build + LoginDisplayHost::default_host()->GetWizardContext()->is_branded_build = + true; + login_manager_mixin_.LoginAsNewRegularUser(); } PinSetupScreen* GetScreen() { return WizardController::default_controller()->GetScreen<PinSetupScreen>(); } - void LogIn() { - if (GetParam() == user_manager::USER_TYPE_CHILD) { - UserContext user_context = - LoginManagerMixin::CreateDefaultUserContext(test_child_user_); - user_context.SetRefreshToken(FakeGaiaMixin::kFakeRefreshToken); - fake_gaia_->SetupFakeGaiaForChildUser( - test_child_user_.account_id.GetUserEmail(), - test_child_user_.account_id.GetGaiaId(), - FakeGaiaMixin::kFakeRefreshToken, true /*issue_any_scope_token*/); - login_manager_mixin_.AttemptLoginUsingAuthenticator( - user_context, - std::make_unique<StubAuthenticatorBuilder>(user_context)); - } else { - login_manager_mixin_.LoginAsNewRegularUser(); - } - } - void EnterPin() { test::OobeJS().TypeIntoPath("654321", kPinKeyboardInput); } void ShowPinSetupScreen() { - // Force the sync screen to be shown so that we don't jump to PIN setup - // screen (consuming auth session) in unbranded build - LoginDisplayHost::default_host()->GetWizardContext()->is_branded_build = - true; - - LogIn(); OobeScreenExitWaiter(GetFirstSigninScreen()).Wait(); if (!screen_exited_) { LoginDisplayHost::default_host()->StartWizard( @@ -121,6 +90,8 @@ OobeScreenWaiter(PinSetupScreenView::kScreenId).Wait(); } + void TapSkipButton() { test::OobeJS().TapOnPath(kSkipButton); } + void WaitForScreenExit() { if (screen_exited_) return; @@ -134,9 +105,6 @@ bool screen_exited_ = false; LoginManagerMixin login_manager_mixin_{&mixin_host_}; - std::unique_ptr<FakeGaiaMixin> fake_gaia_; - std::unique_ptr<EmbeddedPolicyTestServerMixin> policy_server_; - std::unique_ptr<UserPolicyMixin> user_policy_mixin_; private: void HandleScreenExit(PinSetupScreen::Result result) { @@ -149,36 +117,102 @@ PinSetupScreen::ScreenExitCallback original_callback_; base::RepeatingClosure screen_exit_callback_; - - // Used for child account test. - const LoginManagerMixin::TestUserInfo test_child_user_{ - AccountId::FromUserEmailGaiaId("user@test.com", "123456789"), - user_manager::USER_TYPE_CHILD}; }; -INSTANTIATE_TEST_SUITE_P(All, - PinSetupScreenTest, - ::testing::Values(user_manager::USER_TYPE_REGULAR, - user_manager::USER_TYPE_CHILD)); - -IN_PROC_BROWSER_TEST_P(PinSetupScreenTest, Skipped) { +// By default, oobe should skip the PIN setup screen. +IN_PROC_BROWSER_TEST_F(PinSetupScreenTest, Skipped) { ShowPinSetupScreen(); - WaitForScreenExit(); + EXPECT_EQ(screen_result_.value(), PinSetupScreen::Result::NOT_APPLICABLE); + histogram_tester_.ExpectTotalCount( "OOBE.StepCompletionTimeByExitReason.Pin-setup.Done", 0); histogram_tester_.ExpectTotalCount("OOBE.StepCompletionTime.Pin-setup", 0); } -IN_PROC_BROWSER_TEST_P(PinSetupScreenTest, SkipOnStart) { - ShellTestApi().SetTabletModeEnabledForTest(true); +// Oobe should show the PIN setup screen if the device is in tablet mode. +IN_PROC_BROWSER_TEST_F(PinSetupScreenTest, ShowInTabletMode) { + SetTabletMode(true); + + ShowPinSetupScreen(); + TapSkipButton(); + WaitForScreenExit(); + EXPECT_EQ(screen_result_.value(), PinSetupScreen::Result::USER_SKIP); +} + +// Fixture to pretend that we have hardware support for login. +class PinSetupScreenTestLoginSupport : public PinSetupScreenTest { + public: + PinSetupScreenTestLoginSupport() { SetHardwareSupport(true); } + + ~PinSetupScreenTestLoginSupport() override = default; +}; + +// Oobe should show the PIN setup screen if the TPM supports PIN for login. +IN_PROC_BROWSER_TEST_F(PinSetupScreenTestLoginSupport, + ShowWithHardwareSupport) { ShowPinSetupScreen(); WaitForScreenShown(); - test::OobeJS().TapOnPath(kSkipButton); - WaitForScreenExit(); + + EXPECT_EQ(screen_result_.value(), PinSetupScreen::Result::USER_SKIP); +} + +// Oobe should skip the PIN setup screen if policies are set such that PIN +// cannot be used for both login/unlock and web authn. +IN_PROC_BROWSER_TEST_F(PinSetupScreenTestLoginSupport, NoPinPolicy) { + PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); + prefs->SetList(prefs::kQuickUnlockModeAllowlist, base::Value::List()); + prefs->SetList(prefs::kWebAuthnFactors, base::Value::List()); + + ShowPinSetupScreen(); + WaitForScreenExit(); + + EXPECT_EQ(screen_result_.value(), PinSetupScreen::Result::NOT_APPLICABLE); +} + +// Oobe should show the PIN setup screen if the unlock factor policy allows +// PIN. +IN_PROC_BROWSER_TEST_F(PinSetupScreenTestLoginSupport, PinForUnlockPolicy) { + PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); + base::Value::List unlock_factors; + unlock_factors.Append(base::Value("PIN")); + prefs->SetList(prefs::kQuickUnlockModeAllowlist, std::move(unlock_factors)); + prefs->SetList(prefs::kWebAuthnFactors, base::Value::List()); + + ShowPinSetupScreen(); + TapSkipButton(); + WaitForScreenExit(); + + EXPECT_EQ(screen_result_.value(), PinSetupScreen::Result::USER_SKIP); +} + +// Oobe should show the PIN setup screen if the web authn factor policy allows +// PIN. +IN_PROC_BROWSER_TEST_F(PinSetupScreenTestLoginSupport, PinForWebAuthnPolicy) { + PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); + prefs->SetList(prefs::kQuickUnlockModeAllowlist, base::Value::List()); + base::Value::List web_authn_factors; + web_authn_factors.Append(base::Value("all")); + prefs->SetList(prefs::kWebAuthnFactors, std::move(web_authn_factors)); + + ShowPinSetupScreen(); + TapSkipButton(); + WaitForScreenExit(); + + EXPECT_EQ(screen_result_.value(), PinSetupScreen::Result::USER_SKIP); +} + +// A series of test cases for skipping the PIN setup page at various stages in +// the flow. +IN_PROC_BROWSER_TEST_F(PinSetupScreenTestLoginSupport, SkipOnStart) { + ShowPinSetupScreen(); + WaitForScreenShown(); + TapSkipButton(); + WaitForScreenExit(); + EXPECT_EQ(screen_result_.value(), PinSetupScreen::Result::USER_SKIP); histogram_tester_.ExpectTotalCount( "OOBE.StepCompletionTimeByExitReason.Pin-setup.Skipped", 1); @@ -191,8 +225,7 @@ 1))); } -IN_PROC_BROWSER_TEST_P(PinSetupScreenTest, SkipInFlow) { - ShellTestApi().SetTabletModeEnabledForTest(true); +IN_PROC_BROWSER_TEST_F(PinSetupScreenTestLoginSupport, SkipInFlow) { ShowPinSetupScreen(); WaitForScreenShown(); @@ -200,7 +233,7 @@ test::OobeJS().TapOnPath(kNextButton); test::OobeJS().CreateVisibilityWaiter(true, {kBackButton})->Wait(); - test::OobeJS().TapOnPath(kSkipButton); + TapSkipButton(); WaitForScreenExit(); EXPECT_EQ(screen_result_.value(), PinSetupScreen::Result::USER_SKIP); @@ -215,8 +248,7 @@ 1))); } -IN_PROC_BROWSER_TEST_P(PinSetupScreenTest, FinishedFlow) { - ShellTestApi().SetTabletModeEnabledForTest(true); +IN_PROC_BROWSER_TEST_F(PinSetupScreenTestLoginSupport, FinishedFlow) { ShowPinSetupScreen(); WaitForScreenShown(); @@ -242,159 +274,4 @@ 1))); } -// Tests the PIN setup screen in the scenario when the device supports low -// entropy credentials and PIN can be used for login. -class PinForLoginSetupScreenTest : public PinSetupScreenTest { - protected: - PinForLoginSetupScreenTest() { - // Enable PIN for login (overrides base class setting). - UserDataAuthClient::InitializeFake(); - - FakeUserDataAuthClient::TestApi::Get() - ->set_supports_low_entropy_credentials(true); - } - ~PinForLoginSetupScreenTest() override = default; -}; - -INSTANTIATE_TEST_SUITE_P(All, - PinForLoginSetupScreenTest, - ::testing::Values(user_manager::USER_TYPE_REGULAR, - user_manager::USER_TYPE_CHILD)); - -// Tests that PIN setup is shown to Family Link users (but not to regular users) -// on clamshell devices that support low entropy credentials. -IN_PROC_BROWSER_TEST_P(PinForLoginSetupScreenTest, ClamshellMode) { - ShowPinSetupScreen(); - - if (GetParam() == user_manager::USER_TYPE_CHILD) { - WaitForScreenShown(); - - EnterPin(); - test::OobeJS().TapOnPath(kNextButton); - test::OobeJS().CreateVisibilityWaiter(true, {kBackButton})->Wait(); - - EnterPin(); - test::OobeJS().TapOnPath(kNextButton); - test::OobeJS().CreateVisibilityWaiter(true, {kDoneButton})->Wait(); - - test::OobeJS().TapOnPath(kDoneButton); - - WaitForScreenExit(); - EXPECT_EQ(screen_result_.value(), PinSetupScreen::Result::DONE); - histogram_tester_.ExpectTotalCount( - "OOBE.StepCompletionTimeByExitReason.Pin-setup.Done", 1); - histogram_tester_.ExpectTotalCount("OOBE.StepCompletionTime.Pin-setup", 1); - EXPECT_THAT( - histogram_tester_.GetAllSamples("OOBE.PinSetupScreen.UserActions"), - ElementsAre(base::Bucket( - static_cast<int>(PinSetupScreen::UserAction::kDoneButtonClicked), - 1))); - } else { - WaitForScreenExit(); - EXPECT_EQ(screen_result_.value(), PinSetupScreen::Result::NOT_APPLICABLE); - histogram_tester_.ExpectTotalCount( - "OOBE.StepCompletionTimeByExitReason.Pin-setup.Done", 0); - histogram_tester_.ExpectTotalCount("OOBE.StepCompletionTime.Pin-setup", 0); - } -} - -// Tests that PIN setup is shown to Family Link and regular users in tablet -// mode. -IN_PROC_BROWSER_TEST_P(PinForLoginSetupScreenTest, TabletMode) { - ShellTestApi().SetTabletModeEnabledForTest(true); - ShowPinSetupScreen(); - - WaitForScreenShown(); - - EnterPin(); - test::OobeJS().TapOnPath(kNextButton); - test::OobeJS().CreateVisibilityWaiter(true, {kBackButton})->Wait(); - - EnterPin(); - test::OobeJS().TapOnPath(kNextButton); - test::OobeJS().CreateVisibilityWaiter(true, {kDoneButton})->Wait(); - - test::OobeJS().TapOnPath(kDoneButton); - - WaitForScreenExit(); - EXPECT_EQ(screen_result_.value(), PinSetupScreen::Result::DONE); - histogram_tester_.ExpectTotalCount( - "OOBE.StepCompletionTimeByExitReason.Pin-setup.Done", 1); - histogram_tester_.ExpectTotalCount("OOBE.StepCompletionTime.Pin-setup", 1); - EXPECT_THAT( - histogram_tester_.GetAllSamples("OOBE.PinSetupScreen.UserActions"), - ElementsAre(base::Bucket( - static_cast<int>(PinSetupScreen::UserAction::kDoneButtonClicked), - 1))); -} - -class PinSetupForManagedUsers : public PinForLoginSetupScreenTest { - public: - void ManagedLogIn() { - // Force the sync screen to be shown so that we don't jump to PIN setup - // screen (consuming auth session) in unbranded build - LoginDisplayHost::default_host()->GetWizardContext()->is_branded_build = - true; - policy_reset_ = PinSetupScreen::SetForceNoSkipBecauseOfPolicyForTests(true); - user_policy_mixin_->RequestPolicyUpdate(); - fake_gaia_->SetupFakeGaiaForLogin( - managed_test_user_.account_id.GetUserEmail(), - managed_test_user_.account_id.GetGaiaId(), - FakeGaiaMixin::kFakeRefreshToken); - login_manager_mixin_.LoginWithDefaultContext(managed_test_user_); - OobeScreenExitWaiter(GetFirstSigninScreen()).Wait(); - if (!screen_exited_) { - LoginDisplayHost::default_host()->StartWizard( - PinSetupScreenView::kScreenId); - } - } - - protected: - PinSetupForManagedUsers() : PinForLoginSetupScreenTest() { - policy_server_ = - std::make_unique<EmbeddedPolicyTestServerMixin>(&mixin_host_); - fake_gaia_ = std::make_unique<FakeGaiaMixin>(&mixin_host_); - user_policy_mixin_ = std::make_unique<UserPolicyMixin>( - &mixin_host_, managed_test_user_.account_id, policy_server_.get()); - } - - private: - std::unique_ptr<base::AutoReset<bool>> policy_reset_; - base::test::ScopedFeatureList scoped_feature_list_; - const LoginManagerMixin::TestUserInfo managed_test_user_{ - AccountId::FromUserEmailGaiaId("user@example.com", "1111")}; -}; - -INSTANTIATE_TEST_SUITE_P(All, - PinSetupForManagedUsers, - ::testing::Values(user_manager::USER_TYPE_REGULAR)); - -// Tests that PIN setup is shown to Managed users with enabled policies and -// PIN login support. -IN_PROC_BROWSER_TEST_P(PinSetupForManagedUsers, BasicFlow) { - ManagedLogIn(); - WaitForScreenShown(); - - EnterPin(); - test::OobeJS().TapOnPath(kNextButton); - test::OobeJS().CreateVisibilityWaiter(true, {kBackButton})->Wait(); - - EnterPin(); - test::OobeJS().TapOnPath(kNextButton); - test::OobeJS().CreateVisibilityWaiter(true, {kDoneButton})->Wait(); - - test::OobeJS().TapOnPath(kDoneButton); - - WaitForScreenExit(); - EXPECT_EQ(screen_result_.value(), PinSetupScreen::Result::DONE); - histogram_tester_.ExpectTotalCount( - "OOBE.StepCompletionTimeByExitReason.Pin-setup.Done", 1); - histogram_tester_.ExpectTotalCount("OOBE.StepCompletionTime.Pin-setup", 1); - EXPECT_THAT( - histogram_tester_.GetAllSamples("OOBE.PinSetupScreen.UserActions"), - ElementsAre(base::Bucket( - static_cast<int>(PinSetupScreen::UserAction::kDoneButtonClicked), - 1))); -} - } // namespace ash
diff --git a/chrome/browser/ash/login/session/user_session_manager.cc b/chrome/browser/ash/login/session/user_session_manager.cc index e7cda97..887357a 100644 --- a/chrome/browser/ash/login/session/user_session_manager.cc +++ b/chrome/browser/ash/login/session/user_session_manager.cc
@@ -126,7 +126,7 @@ #include "chrome/common/chrome_switches.h" #include "chrome/common/logging_chrome.h" #include "chrome/common/pref_names.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/session_manager/session_manager_client.h" #include "chromeos/dbus/tpm_manager/tpm_manager.pb.h"
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 4a5416a..dc5a5d33 100644 --- a/chrome/browser/ash/login/ui/login_display_host_mojo.cc +++ b/chrome/browser/ash/login/ui/login_display_host_mojo.cc
@@ -184,14 +184,12 @@ } void LoginDisplayHostMojo::SetUserCount(int user_count) { - const bool was_zero_users = (user_count_ == 0); - user_count_ = user_count; - if (GetOobeUI()) - GetOobeUI()->SetLoginUserCount(user_count_); + const bool was_zero_users = !has_user_pods_; + has_user_pods_ = user_count > 0; // Hide Gaia dialog in case empty list of users switched to a non-empty one. // And if the dialog shows login screen. - if (was_zero_users && user_count_ != 0 && dialog_ && dialog_->IsVisible() && + if (was_zero_users && has_user_pods_ && dialog_ && dialog_->IsVisible() && (!wizard_controller_->is_initialized() || (wizard_controller_->current_screen() && WizardController::IsSigninScreen( @@ -413,7 +411,7 @@ // TODO(crbug.com/1283052): simplify the logic here. const bool no_users = - !login_display_->IsSigninInProgress() && user_count_ == 0; + !login_display_->IsSigninInProgress() && !has_user_pods_; if (no_users && !saml_video_timeout) { return; } @@ -450,7 +448,7 @@ } bool LoginDisplayHostMojo::HasUserPods() { - return user_count_ > 0; + return has_user_pods_; } void LoginDisplayHostMojo::VerifyOwnerForKiosk(base::OnceClosure on_success) { @@ -691,10 +689,6 @@ dialog_->GetOobeUI()->signin_screen_handler()->SetDelegate( login_display_.get()); - // It may happen that LoginDisplayHostMojo::SetUserCount was called before - // the dialog_ was created. Set number of users once again here. - SetUserCount(user_count_); - views::View* web_dialog_view = dialog_->GetWebDialogView(); scoped_observation_.Observe(web_dialog_view);
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 a639c19..5f69aec 100644 --- a/chrome/browser/ash/login/ui/login_display_host_mojo.h +++ b/chrome/browser/ash/login/ui/login_display_host_mojo.h
@@ -212,8 +212,8 @@ OobeUIDialogDelegate* dialog_ = nullptr; // Not owned. std::unique_ptr<WizardController> wizard_controller_; - // Number of users that are visible in the views login screen. - int user_count_ = 0; + // Whether or not there are users that are visible in the views login screen. + bool has_user_pods_ = false; // The account id of the user pod that's being focused. AccountId focused_pod_account_id_;
diff --git a/chrome/browser/ash/sync/sync_explicit_passphrase_client_ash_unittest.cc b/chrome/browser/ash/sync/sync_explicit_passphrase_client_ash_unittest.cc index bd4708d8..7ada26f6 100644 --- a/chrome/browser/ash/sync/sync_explicit_passphrase_client_ash_unittest.cc +++ b/chrome/browser/ash/sync/sync_explicit_passphrase_client_ash_unittest.cc
@@ -86,7 +86,7 @@ const SyncExplicitPassphraseClientAshTest&) = delete; SyncExplicitPassphraseClientAshTest& operator=( const SyncExplicitPassphraseClientAshTest&) = delete; - ~SyncExplicitPassphraseClientAshTest() = default; + ~SyncExplicitPassphraseClientAshTest() override = default; void SetUp() override { ON_CALL(sync_service_, GetAccountInfo())
diff --git a/chrome/browser/ash/system_web_apps/OWNERS b/chrome/browser/ash/system_web_apps/OWNERS new file mode 100644 index 0000000..44a1559 --- /dev/null +++ b/chrome/browser/ash/system_web_apps/OWNERS
@@ -0,0 +1 @@ +file://ash/webui/PLATFORM_OWNERS
diff --git a/chrome/browser/ash/system_web_apps/types/system_web_app_delegate_map.cc b/chrome/browser/ash/system_web_apps/types/system_web_app_delegate_map.cc new file mode 100644 index 0000000..7786baab --- /dev/null +++ b/chrome/browser/ash/system_web_apps/types/system_web_app_delegate_map.cc
@@ -0,0 +1,35 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/system_web_apps/types/system_web_app_delegate_map.h" + +#include "base/feature_list.h" +#include "chrome/common/chrome_features.h" + +namespace ash { + +bool IsSystemWebAppEnabled(const SystemWebAppDelegateMap& delegates, + web_app::SystemAppType type) { + if (base::FeatureList::IsEnabled(features::kEnableAllSystemWebApps)) + return true; + + const web_app::SystemWebAppDelegate* delegate = + GetSystemWebApp(delegates, type); + if (!delegate) + return false; + + return delegate->IsAppEnabled(); +} + +const web_app::SystemWebAppDelegate* GetSystemWebApp( + const SystemWebAppDelegateMap& delegates, + web_app::SystemAppType type) { + auto it = delegates.find(type); + if (it == delegates.end()) + return nullptr; + + return it->second.get(); +} + +} // namespace ash
diff --git a/chrome/browser/ash/system_web_apps/types/system_web_app_delegate_map.h b/chrome/browser/ash/system_web_apps/types/system_web_app_delegate_map.h new file mode 100644 index 0000000..ea11c0a5 --- /dev/null +++ b/chrome/browser/ash/system_web_apps/types/system_web_app_delegate_map.h
@@ -0,0 +1,31 @@ +// 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_ASH_SYSTEM_WEB_APPS_TYPES_SYSTEM_WEB_APP_DELEGATE_MAP_H_ +#define CHROME_BROWSER_ASH_SYSTEM_WEB_APPS_TYPES_SYSTEM_WEB_APP_DELEGATE_MAP_H_ + +#include <memory> + +#include "base/containers/flat_map.h" +#include "chrome/browser/web_applications/system_web_apps/system_web_app_delegate.h" +#include "chrome/browser/web_applications/system_web_apps/system_web_app_types.h" + +namespace ash { + +using SystemWebAppDelegateMap = + base::flat_map<web_app::SystemAppType, + std::unique_ptr<web_app::SystemWebAppDelegate>>; + +// Returns whether the given app type is enabled. +bool IsSystemWebAppEnabled(const SystemWebAppDelegateMap& delegates, + web_app::SystemAppType type); + +// Returns the System App Delegate for the given App |type|. +const web_app::SystemWebAppDelegate* GetSystemWebApp( + const SystemWebAppDelegateMap& delegates, + web_app::SystemAppType type); + +} // namespace ash + +#endif // CHROME_BROWSER_ASH_SYSTEM_WEB_APPS_TYPES_SYSTEM_WEB_APP_DELEGATE_MAP_H_
diff --git a/chrome/browser/ash/web_applications/os_feedback_app_integration_browsertest.cc b/chrome/browser/ash/web_applications/os_feedback_app_integration_browsertest.cc index e20a77ec..807d9a4e 100644 --- a/chrome/browser/ash/web_applications/os_feedback_app_integration_browsertest.cc +++ b/chrome/browser/ash/web_applications/os_feedback_app_integration_browsertest.cc
@@ -15,6 +15,7 @@ #include "chrome/browser/ui/web_applications/system_web_app_ui_utils.h" #include "chrome/browser/web_applications/system_web_apps/system_web_app_manager.h" #include "chrome/browser/web_applications/system_web_apps/test/system_web_app_browsertest_base.h" +#include "chrome/common/pref_names.h" #include "chrome/test/base/ui_test_utils.h" #include "components/webapps/browser/install_result_code.h" #include "content/public/browser/notification_types.h" @@ -79,6 +80,32 @@ ->GetVisibleURL()); } +// This test verifies that the Feedback app is not opened when +// UserFeedbackAllowed is set to false. +IN_PROC_BROWSER_TEST_P(OSFeedbackAppIntegrationTest, UserFeedbackNotAllowed) { + WaitForTestSystemAppInstall(); + + browser()->profile()->GetPrefs()->SetBoolean(prefs::kUserFeedbackAllowed, + false); + + GURL main_feedback_url(ash::kChromeUIOSFeedbackUrl); + GURL old_url = browser()->tab_strip_model()->GetActiveWebContents()->GetURL(); + ui_test_utils::SendToOmniboxAndSubmit(browser(), main_feedback_url.spec()); + web_app::FlushSystemWebAppLaunchesForTesting(browser()->profile()); + + // browser() tab contents should be unaffected. + EXPECT_EQ(1, browser()->tab_strip_model()->count()); + EXPECT_EQ(old_url, + browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); + + // We now still have one browser. + EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); + EXPECT_EQ(old_url, chrome::FindLastActive() + ->tab_strip_model() + ->GetActiveWebContents() + ->GetVisibleURL()); +} + // Test that the Feedback App has a default bounds of 640(height)x600(width) // and is in the center of the screen. IN_PROC_BROWSER_TEST_P(OSFeedbackAppIntegrationTest, DefaultWindowBounds) { @@ -97,11 +124,11 @@ int expected_height = 640; int x = (work_area.width() - expected_width) / 2; int y = (work_area.height() - expected_height) / 2; - EXPECT_EQ(browser->window()->GetBounds(), - gfx::Rect(x, y, expected_width, expected_height)); + EXPECT_EQ(gfx::Rect(x, y, expected_width, expected_height), + browser->window()->GetBounds()); } -// Test that the Feedback App +// Test that when the policy UserFeedbackAllowed is true, the Feedback App // 1) shows in launcher // 2) shows in search // 3) is single window @@ -122,5 +149,21 @@ EXPECT_FALSE(system_app->ShouldAllowMaximize()); } +// Test that when the policy UserFeedbackAllowed is false, the Feedback App +// 1) does not show in launcher +// 2) does not show in search +IN_PROC_BROWSER_TEST_P(OSFeedbackAppIntegrationTest, + HideInLauncherAndSearchWhenUserFeedbackNotAllowed) { + WaitForTestSystemAppInstall(); + browser()->profile()->GetPrefs()->SetBoolean(prefs::kUserFeedbackAllowed, + false); + + // Check the correct attributes for Feedback App. + auto* system_app = + GetManager().GetSystemApp(web_app::SystemAppType::OS_FEEDBACK); + EXPECT_FALSE(system_app->ShouldShowInLauncher()); + EXPECT_FALSE(system_app->ShouldShowInSearch()); +} + INSTANTIATE_SYSTEM_WEB_APP_MANAGER_TEST_SUITE_REGULAR_PROFILE_P( OSFeedbackAppIntegrationTest);
diff --git a/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.cc b/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.cc index df0072dd..953aa5e 100644 --- a/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.cc +++ b/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.cc
@@ -12,16 +12,25 @@ #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h" #include "chrome/browser/web_applications/user_display_mode.h" #include "chrome/browser/web_applications/web_app_install_info.h" +#include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" +#include "components/prefs/pref_service.h" #include "third_party/blink/public/mojom/manifest/display_mode.mojom.h" #include "ui/base/l10n/l10n_util.h" #include "ui/display/screen.h" namespace { + // All Feedback Tool window will be a fixed 600px*640px portal per // specification. constexpr int kFeedbackAppDefaultWidth = 600; constexpr int kFeedbackAppDefaultHeight = 640; + +bool IsUserFeedbackAllowed(Profile* profile) { + return profile->GetPrefs()->GetBoolean(prefs::kUserFeedbackAllowed); +} + } // namespace std::unique_ptr<WebAppInstallInfo> CreateWebAppInfoForOSFeedbackSystemWebApp() { @@ -76,6 +85,30 @@ bool OSFeedbackAppDelegate::ShouldAllowResize() const { return false; } + +bool OSFeedbackAppDelegate::ShouldShowInLauncher() const { + return IsUserFeedbackAllowed(profile()); +} + +bool OSFeedbackAppDelegate::ShouldShowInSearch() const { + return ShouldShowInLauncher(); +} + gfx::Rect OSFeedbackAppDelegate::GetDefaultBounds(Browser* browser) const { return GetDefaultBoundsForOSFeedbackApp(browser); } + +Browser* OSFeedbackAppDelegate::LaunchAndNavigateSystemWebApp( + Profile* profile, + web_app::WebAppProvider* provider, + const GURL& url, + const apps::AppLaunchParams& params) const { + // This check is needed to enforce the policy no matter how and from where the + // feedback tool is to be launched. + if (!IsUserFeedbackAllowed(profile)) { + return nullptr; + } + // TODO(xiangdongkong): Take a screenshot and launch the app afterward. + return SystemWebAppDelegate::LaunchAndNavigateSystemWebApp(profile, provider, + url, params); +}
diff --git a/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.h b/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.h index 18cde2561..add38a4 100644 --- a/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.h +++ b/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.h
@@ -15,6 +15,10 @@ class Browser; struct WebAppInstallInfo; +namespace web_app { +class WebAppProvider; +} // namespace web_app + class OSFeedbackAppDelegate : public web_app::SystemWebAppDelegate { public: explicit OSFeedbackAppDelegate(Profile* profile); @@ -26,7 +30,14 @@ bool ShouldCaptureNavigations() const override; bool ShouldAllowMaximize() const override; bool ShouldAllowResize() const override; + bool ShouldShowInLauncher() const override; + bool ShouldShowInSearch() const override; gfx::Rect GetDefaultBounds(Browser*) const override; + Browser* LaunchAndNavigateSystemWebApp( + Profile* profile, + web_app::WebAppProvider* provider, + const GURL& url, + const apps::AppLaunchParams& params) const override; }; // Returns a WebAppInstallInfo used to install the app.
diff --git a/chrome/browser/autofill/captured_sites_test_utils.cc b/chrome/browser/autofill/captured_sites_test_utils.cc index c8de5c7..c715bd8 100644 --- a/chrome/browser/autofill/captured_sites_test_utils.cc +++ b/chrome/browser/autofill/captured_sites_test_utils.cc
@@ -63,6 +63,9 @@ // The command-line flag to specify the command file flag. const char kCommandFileFlag[] = "command_file"; +// The command line flag to turn on verbose WPR logging. +const char kWebPageReplayVerboseFlag[] = "wpr_verbose"; + // The maximum amount of time to wait for Chrome to finish autofilling a form. const base::TimeDelta kAutofillActionWaitForVisualUpdateTimeout = base::Seconds(3); @@ -90,6 +93,12 @@ const char kClockNotSetMessage[] = "No AutofillClock override set from wpr archive: "; +// Check and return that the caller wants verbose WPR output (off by default). +bool IsVerboseWprLoggingEnabled() { + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + return command_line && command_line->HasSwitch(kWebPageReplayVerboseFlag); +} + void PrintDebugInstructions(const base::FilePath& command_file_path) { const char msg[] = R"( @@ -575,8 +584,9 @@ args.push_back("--serve_response_in_chronological_sequence"); // Start WPR in quiet mode, removing the extra verbose ServeHTTP // interactions that are for the the overwhelming majority unhelpful, but - // for extra debugging of a test case, this might make sense to comment out. - args.push_back("--quiet_mode"); + // for extra debugging of a test case, include 'wpr_verbose' in command. + if (!IsVerboseWprLoggingEnabled()) + args.push_back("--quiet_mode"); } args.push_back(base::StringPrintf( "--inject_scripts=%s,%s",
diff --git a/chrome/browser/autofill_assistant/common_dependencies_chrome.cc b/chrome/browser/autofill_assistant/common_dependencies_chrome.cc index 5ec6c6e..6bbf03b932 100644 --- a/chrome/browser/autofill_assistant/common_dependencies_chrome.cc +++ b/chrome/browser/autofill_assistant/common_dependencies_chrome.cc
@@ -44,11 +44,10 @@ g_browser_process->variations_service()); } -PersonalDataManager* CommonDependenciesChrome::GetPersonalDataManager() const { - // TODO(b/201964911): Using |GetLastUsedProfile| is probably not the best - // option for desktop. Consider passing a profile on instantiation instead. - return autofill::PersonalDataManagerFactory::GetForProfile( - ProfileManager::GetLastUsedProfile()); +PersonalDataManager* CommonDependenciesChrome::GetPersonalDataManager( + content::BrowserContext* browser_context) const { + return autofill::PersonalDataManagerFactory::GetForBrowserContext( + browser_context); } PasswordManagerClient* CommonDependenciesChrome::GetPasswordManagerClient(
diff --git a/chrome/browser/autofill_assistant/common_dependencies_chrome.h b/chrome/browser/autofill_assistant/common_dependencies_chrome.h index 41445c0..8148a211 100644 --- a/chrome/browser/autofill_assistant/common_dependencies_chrome.h +++ b/chrome/browser/autofill_assistant/common_dependencies_chrome.h
@@ -29,7 +29,8 @@ std::string GetCountryCode() const override; - autofill::PersonalDataManager* GetPersonalDataManager() const override; + autofill::PersonalDataManager* GetPersonalDataManager( + content::BrowserContext* browser_context) const override; password_manager::PasswordManagerClient* GetPasswordManagerClient( content::WebContents* web_contents) const override;
diff --git a/chrome/browser/autofill_assistant/password_change/apc_client_impl.cc b/chrome/browser/autofill_assistant/password_change/apc_client_impl.cc index 950f3acbe..1ca716dc 100644 --- a/chrome/browser/autofill_assistant/password_change/apc_client_impl.cc +++ b/chrome/browser/autofill_assistant/password_change/apc_client_impl.cc
@@ -9,7 +9,9 @@ #include "base/bind.h" #include "base/memory/raw_ptr.h" -#include "chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator_impl.h" +#include "chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/autofill_assistant/password_change/assistant_display_delegate.h" #include "content/public/browser/web_contents.h" #include "url/gurl.h" @@ -43,6 +45,14 @@ void ApcClientImpl::OnRunComplete() {} +std::unique_ptr<ApcOnboardingCoordinator> +ApcClientImpl::CreateOnboardingCoordinator( + AssistantDisplayDelegate* display_delegate) { + return ApcOnboardingCoordinator::Create( + Profile::FromBrowserContext(GetWebContents().GetBrowserContext()), + display_delegate); +} + WEB_CONTENTS_USER_DATA_KEY_IMPL(ApcClientImpl); ApcClient* ApcClient::GetOrCreateForWebContents(
diff --git a/chrome/browser/autofill_assistant/password_change/apc_client_impl.h b/chrome/browser/autofill_assistant/password_change/apc_client_impl.h index 3e6716f2..44f76bb 100644 --- a/chrome/browser/autofill_assistant/password_change/apc_client_impl.h +++ b/chrome/browser/autofill_assistant/password_change/apc_client_impl.h
@@ -36,6 +36,12 @@ void Stop() override; bool IsRunning() const override; + protected: + // Creates an onboarding coordinator. Protected to allow for overrides + // by test classes. + virtual std::unique_ptr<ApcOnboardingCoordinator> CreateOnboardingCoordinator( + AssistantDisplayDelegate* display_delegate); + private: explicit ApcClientImpl(content::WebContents* web_contents); friend class content::WebContentsUserData<ApcClientImpl>;
diff --git a/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator.h b/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator.h index 8a03aa0..e08f0b52 100644 --- a/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator.h +++ b/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator.h
@@ -7,6 +7,9 @@ #include "base/callback.h" +class AssistantDisplayDelegate; +class Profile; + // Abstract interface for an onboarding coordinator. class ApcOnboardingCoordinator { public: @@ -14,6 +17,12 @@ // given. using Callback = base::OnceCallback<void(bool)>; + // Factory function to create an |ApcOnboardingCoordinator| that is defined + // in `apc_onboarding_controller_impl.cc`. + static std::unique_ptr<ApcOnboardingCoordinator> Create( + Profile* profile, + AssistantDisplayDelegate* display_delegate); + ApcOnboardingCoordinator() = default; virtual ~ApcOnboardingCoordinator() = default;
diff --git a/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator_impl.cc b/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator_impl.cc index 4ac565d8..7ee561e 100644 --- a/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator_impl.cc +++ b/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator_impl.cc
@@ -7,12 +7,16 @@ #include <memory> #include "base/bind.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/autofill_assistant/password_change/assistant_onboarding_controller.h" #include "chrome/browser/ui/autofill_assistant/password_change/assistant_onboarding_prompt.h" +#include "chrome/common/pref_names.h" +#include "components/prefs/pref_service.h" ApcOnboardingCoordinatorImpl::ApcOnboardingCoordinatorImpl( + Profile* profile, AssistantDisplayDelegate* display_delegate) - : display_delegate_(display_delegate) {} + : pref_service_(profile->GetPrefs()), display_delegate_(display_delegate) {} ApcOnboardingCoordinatorImpl::~ApcOnboardingCoordinatorImpl() = default; @@ -38,7 +42,8 @@ base::Unretained(this))); } -std::unique_ptr<AssistantOnboardingController> CreateOnboardingController( +std::unique_ptr<AssistantOnboardingController> +ApcOnboardingCoordinatorImpl::CreateOnboardingController( const AssistantOnboardingInformation& onboarding_information) { return AssistantOnboardingController::Create(onboarding_information); } @@ -50,10 +55,20 @@ } bool ApcOnboardingCoordinatorImpl::IsOnboardingAlreadyAccepted() { - // TODO(crbug.com/1322387): Check preference key. - return false; + return pref_service_->GetBoolean(prefs::kAutofillAssistantOnDesktopEnabled); } void ApcOnboardingCoordinatorImpl::OnControllerResponseReceived(bool success) { + if (success) { + pref_service_->SetBoolean(prefs::kAutofillAssistantOnDesktopEnabled, true); + } std::move(callback_).Run(success); } + +// static +std::unique_ptr<ApcOnboardingCoordinator> ApcOnboardingCoordinator::Create( + Profile* profile, + AssistantDisplayDelegate* display_delegate) { + return std::make_unique<ApcOnboardingCoordinatorImpl>(profile, + display_delegate); +}
diff --git a/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator_impl.h b/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator_impl.h index 59cd87c..231659c 100644 --- a/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator_impl.h +++ b/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator_impl.h
@@ -15,12 +15,15 @@ #include "chrome/browser/ui/autofill_assistant/password_change/assistant_onboarding_controller.h" #include "chrome/browser/ui/autofill_assistant/password_change/assistant_onboarding_prompt.h" +class PrefService; +class Profile; + // Implementation of the |ApcOnboardingCoordinator| interface that takes care // of onboarding/consent for automated password change. class ApcOnboardingCoordinatorImpl : public ApcOnboardingCoordinator { public: - explicit ApcOnboardingCoordinatorImpl( - AssistantDisplayDelegate* display_delegate); + ApcOnboardingCoordinatorImpl(Profile* profile, + AssistantDisplayDelegate* display_delegate); ~ApcOnboardingCoordinatorImpl() override; // ApcOnboardingCoordinator: @@ -30,9 +33,10 @@ // These methods pass through their arguments to the respective factory // functions. Encapsulating them allows injecting mock controllers and // mock prompts during unit tests. - std::unique_ptr<AssistantOnboardingController> CreateOnboardingController( + virtual std::unique_ptr<AssistantOnboardingController> + CreateOnboardingController( const AssistantOnboardingInformation& onboarding_information); - AssistantOnboardingPrompt* CreateOnboardingPrompt( + virtual AssistantOnboardingPrompt* CreateOnboardingPrompt( AssistantOnboardingController* controller, AssistantDisplayDelegate* display_delegate); @@ -44,6 +48,9 @@ // Handles the response from the UI controller prompting the user for consent. void OnControllerResponseReceived(bool success); + // Handles the pref that stores whether onboarding was accepted. + raw_ptr<PrefService> pref_service_; + // Provides the ability to (un-)register the onboarding view. raw_ptr<AssistantDisplayDelegate> display_delegate_;
diff --git a/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator_impl_unittest.cc b/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator_impl_unittest.cc new file mode 100644 index 0000000..61b69a7c --- /dev/null +++ b/chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator_impl_unittest.cc
@@ -0,0 +1,145 @@ +// 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/autofill_assistant/password_change/apc_onboarding_coordinator_impl.h" + +#include <memory> + +#include "base/memory/ptr_util.h" +#include "base/test/gmock_move_support.h" +#include "base/test/mock_callback.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/autofill_assistant/password_change/assistant_onboarding_controller.h" +#include "chrome/browser/ui/autofill_assistant/password_change/assistant_onboarding_prompt.h" +#include "chrome/browser/ui/autofill_assistant/password_change/mock_assistant_display_delegate.h" +#include "chrome/browser/ui/autofill_assistant/password_change/mock_assistant_onboarding_controller.h" +#include "chrome/common/pref_names.h" +#include "chrome/test/base/testing_profile.h" +#include "components/prefs/pref_service.h" +#include "content/public/test/browser_task_environment.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +class TestApcOnboardingCoordinatorImpl : public ApcOnboardingCoordinatorImpl { + public: + TestApcOnboardingCoordinatorImpl(Profile* profile, + AssistantDisplayDelegate* display_delegate); + + MOCK_METHOD(std::unique_ptr<AssistantOnboardingController>, + CreateOnboardingController, + (const AssistantOnboardingInformation&), + (override)); + MOCK_METHOD(AssistantOnboardingPrompt*, + CreateOnboardingPrompt, + (AssistantOnboardingController*, AssistantDisplayDelegate*), + (override)); +}; + +TestApcOnboardingCoordinatorImpl::TestApcOnboardingCoordinatorImpl( + Profile* profile, + AssistantDisplayDelegate* display_delegate) + : ApcOnboardingCoordinatorImpl(profile, display_delegate) {} + +class ApcOnboardingCoordinatorImplTest : public ::testing::Test { + public: + ApcOnboardingCoordinatorImplTest() { + coordinator_ = std::make_unique<TestApcOnboardingCoordinatorImpl>( + &profile_, &display_delegate_); + } + + TestApcOnboardingCoordinatorImpl* coordinator() { return coordinator_.get(); } + PrefService* GetPrefs() { return profile_.GetPrefs(); } + + private: + // Testing setup. + content::BrowserTaskEnvironment task_environment_; + TestingProfile profile_; + + // Mocks + MockAssistantDisplayDelegate display_delegate_; + + // The object to be tested. + std::unique_ptr<TestApcOnboardingCoordinatorImpl> coordinator_; +}; + +TEST_F(ApcOnboardingCoordinatorImplTest, + PerformOnboardingWithPreviouslyGivenConsent) { + // Simulate previously given consent. + GetPrefs()->SetBoolean(prefs::kAutofillAssistantOnDesktopEnabled, true); + + base::MockCallback<ApcOnboardingCoordinator::Callback> callback; + EXPECT_CALL(callback, Run(true)); + // Since onboarding was previously accepted, no dialog is ever created. + EXPECT_CALL(*coordinator(), CreateOnboardingController).Times(0); + + coordinator()->PerformOnboarding(callback.Get()); + + // Consent is still registered as in the pref. + EXPECT_TRUE( + GetPrefs()->GetBoolean(prefs::kAutofillAssistantOnDesktopEnabled)); +} + +TEST_F(ApcOnboardingCoordinatorImplTest, PerformOnboardingAndAccept) { + // The default is false. + EXPECT_FALSE( + GetPrefs()->GetBoolean(prefs::kAutofillAssistantOnDesktopEnabled)); + + // Create a mock controller. + raw_ptr<MockAssistantOnboardingController> controller = + new MockAssistantOnboardingController(); + EXPECT_CALL(*coordinator(), CreateOnboardingController) + .WillOnce([controller]() { + return base::WrapUnique<AssistantOnboardingController>(controller); + }); + EXPECT_CALL(*coordinator(), CreateOnboardingPrompt); + + // Prepare to extract the callback to the controller. + AssistantOnboardingController::Callback controller_callback; + EXPECT_CALL(*controller, Show).WillOnce(MoveArg<1>(&controller_callback)); + + // Start the onboarding. + base::MockCallback<ApcOnboardingCoordinator::Callback> coordinator_callback; + coordinator()->PerformOnboarding(coordinator_callback.Get()); + + // And call the controller. + ASSERT_TRUE(controller_callback); + EXPECT_CALL(coordinator_callback, Run(true)); + std::move(controller_callback).Run(true); + + // Consent is saved in the pref. + EXPECT_TRUE( + GetPrefs()->GetBoolean(prefs::kAutofillAssistantOnDesktopEnabled)); +} + +TEST_F(ApcOnboardingCoordinatorImplTest, PerformOnboardingAndDecline) { + // The default is false. + EXPECT_FALSE( + GetPrefs()->GetBoolean(prefs::kAutofillAssistantOnDesktopEnabled)); + + // Create a mock controller. + raw_ptr<MockAssistantOnboardingController> controller = + new MockAssistantOnboardingController(); + EXPECT_CALL(*coordinator(), CreateOnboardingController) + .WillOnce([controller]() { + return base::WrapUnique<AssistantOnboardingController>(controller); + }); + EXPECT_CALL(*coordinator(), CreateOnboardingPrompt); + + // Prepare to extract the callback to the controller. + AssistantOnboardingController::Callback controller_callback; + EXPECT_CALL(*controller, Show).WillOnce(MoveArg<1>(&controller_callback)); + + // Start the onboarding. + base::MockCallback<ApcOnboardingCoordinator::Callback> coordinator_callback; + coordinator()->PerformOnboarding(coordinator_callback.Get()); + + // And call the controller. + ASSERT_TRUE(controller_callback); + EXPECT_CALL(coordinator_callback, Run(false)); + std::move(controller_callback).Run(false); + + // Consent is saved in the pref. + EXPECT_FALSE( + GetPrefs()->GetBoolean(prefs::kAutofillAssistantOnDesktopEnabled)); +}
diff --git a/chrome/browser/browsing_data/browsing_data_quota_helper_impl.cc b/chrome/browser/browsing_data/browsing_data_quota_helper_impl.cc index 9d9231e7..6aae854 100644 --- a/chrome/browser/browsing_data/browsing_data_quota_helper_impl.cc +++ b/chrome/browser/browsing_data/browsing_data_quota_helper_impl.cc
@@ -68,83 +68,69 @@ StorageType::kPersistent, StorageType::kSyncable}; - // Query hosts for each storage types. When complete, process the collected - // hosts. - PendingHosts* pending_hosts = new PendingHosts(); + // Query storage keys for each storage types. When complete, process the + // collected quota info. + QuotaInfoMap* quota_info = new QuotaInfoMap(); + base::RepeatingClosure completion = base::BarrierClosure( std::size(types), - base::BindOnce(&BrowsingDataQuotaHelperImpl::OnGetOriginsComplete, - weak_factory_.GetWeakPtr(), std::move(callback), - base::Owned(pending_hosts))); - - for (const StorageType& type : types) { - quota_manager_->GetStorageKeysForType( - type, base::BindOnce(&BrowsingDataQuotaHelperImpl::GotStorageKeys, - weak_factory_.GetWeakPtr(), pending_hosts, - completion, type)); - } -} - -void BrowsingDataQuotaHelperImpl::GotStorageKeys( - PendingHosts* pending_hosts, - base::OnceClosure completion, - StorageType type, - const std::set<blink::StorageKey>& storage_keys) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - for (const blink::StorageKey& storage_key : storage_keys) { - if (!browsing_data::IsWebScheme(storage_key.origin().scheme())) - continue; // Non-websafe state is not considered browsing data. - pending_hosts->insert(std::make_pair(storage_key.origin().host(), type)); - } - std::move(completion).Run(); -} - -void BrowsingDataQuotaHelperImpl::OnGetOriginsComplete( - FetchResultCallback callback, - PendingHosts* pending_hosts) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - - // Query usage for each (host, type). When complete, process the results. - QuotaInfoMap* quota_info = new QuotaInfoMap(); - base::RepeatingClosure completion = base::BarrierClosure( - pending_hosts->size(), base::BindOnce(&BrowsingDataQuotaHelperImpl::OnGetHostsUsageComplete, weak_factory_.GetWeakPtr(), std::move(callback), base::Owned(quota_info))); - for (const auto& itr : *pending_hosts) { - const std::string& host = itr.first; - StorageType type = itr.second; - quota_manager_->GetHostUsageWithBreakdown( - host, type, - base::BindOnce(&BrowsingDataQuotaHelperImpl::GotHostUsage, - weak_factory_.GetWeakPtr(), quota_info, completion, host, - type)); + for (const StorageType& type : types) { + quota_manager_->GetStorageKeysForType( + type, base::BindOnce(&BrowsingDataQuotaHelperImpl::GotStorageKeys, + weak_factory_.GetWeakPtr(), quota_info, completion, + type)); } } -void BrowsingDataQuotaHelperImpl::GotHostUsage( +void BrowsingDataQuotaHelperImpl::GotStorageKeys( QuotaInfoMap* quota_info, base::OnceClosure completion, - const std::string& host, + StorageType type, + const std::set<blink::StorageKey>& storage_keys) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + int storage_key_count = base::ranges::count_if( + storage_keys, [](const blink::StorageKey& storage_key) { + return browsing_data::IsWebScheme(storage_key.origin().scheme()); + }); + + auto storage_key_completion = + base::BarrierClosure(storage_key_count, std::move(completion)); + for (const blink::StorageKey& storage_key : storage_keys) { + if (!browsing_data::IsWebScheme(storage_key.origin().scheme())) + continue; // Non-websafe state is not considered browsing data. + quota_manager_->GetStorageKeyUsageWithBreakdown( + storage_key, type, + base::BindOnce(&BrowsingDataQuotaHelperImpl::GotStorageKeyUsage, + weak_factory_.GetWeakPtr(), quota_info, storage_key, + type) + .Then(storage_key_completion)); + } +} + +void BrowsingDataQuotaHelperImpl::GotStorageKeyUsage( + QuotaInfoMap* quota_info, + const blink::StorageKey& storage_key, StorageType type, int64_t usage, blink::mojom::UsageBreakdownPtr usage_breakdown) { DCHECK_CURRENTLY_ON(BrowserThread::IO); switch (type) { case StorageType::kTemporary: - (*quota_info)[host].temporary_usage = usage; + (*quota_info)[storage_key.origin().host()].temporary_usage += usage; break; case StorageType::kPersistent: - (*quota_info)[host].persistent_usage = usage; + (*quota_info)[storage_key.origin().host()].persistent_usage += usage; break; case StorageType::kSyncable: - (*quota_info)[host].syncable_usage = usage; + (*quota_info)[storage_key.origin().host()].syncable_usage += usage; break; default: NOTREACHED(); } - std::move(completion).Run(); } void BrowsingDataQuotaHelperImpl::OnGetHostsUsageComplete(
diff --git a/chrome/browser/browsing_data/browsing_data_quota_helper_impl.h b/chrome/browser/browsing_data/browsing_data_quota_helper_impl.h index e0f77695..55f4189 100644 --- a/chrome/browser/browsing_data/browsing_data_quota_helper_impl.h +++ b/chrome/browser/browsing_data/browsing_data_quota_helper_impl.h
@@ -52,22 +52,17 @@ void FetchQuotaInfoOnIOThread(FetchResultCallback callback); // Callback function for QuotaManager::GetStorageKeysForType. - void GotStorageKeys(PendingHosts* pending_hosts, + void GotStorageKeys(QuotaInfoMap* quota_info, base::OnceClosure completion, blink::mojom::StorageType type, const std::set<blink::StorageKey>& storage_keys); - // Calls QuotaManager::GetHostUsage for each (origin, type) pair. - void OnGetOriginsComplete(FetchResultCallback callback, - PendingHosts* pending_hosts); - - // Callback function for QuotaManager::GetHostUsage. - void GotHostUsage(QuotaInfoMap* quota_info, - base::OnceClosure completion, - const std::string& host, - blink::mojom::StorageType type, - int64_t usage, - blink::mojom::UsageBreakdownPtr usage_breakdown); + // Callback function for QuotaManager::GetStorageKeyUsage. + void GotStorageKeyUsage(QuotaInfoMap* quota_info, + const blink::StorageKey& storage_key, + blink::mojom::StorageType type, + int64_t usage, + blink::mojom::UsageBreakdownPtr usage_breakdown); // Called when all QuotaManager::GetHostUsage requests are complete. void OnGetHostsUsageComplete(FetchResultCallback callback,
diff --git a/chrome/browser/chrome_navigation_browsertest.cc b/chrome/browser/chrome_navigation_browsertest.cc index ec5f5b8..36e45b02 100644 --- a/chrome/browser/chrome_navigation_browsertest.cc +++ b/chrome/browser/chrome_navigation_browsertest.cc
@@ -72,7 +72,7 @@ #include "services/network/public/cpp/features.h" #include "testing/gmock/include/gmock/gmock.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" using ::testing::IsEmpty; using ::testing::UnorderedElementsAre;
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 4c6dba68..39b4b8fa 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -145,6 +145,7 @@ "//ash/services/secure_channel/public/cpp/client", "//ash/services/secure_channel/public/mojom", "//ash/webui/camera_app_ui", + "//ash/webui/camera_app_ui:document_scanning", "//ash/webui/connectivity_diagnostics", "//ash/webui/diagnostics_ui", "//ash/webui/eche_app_ui", @@ -237,6 +238,7 @@ "//chrome/services/printing/public/mojom", "//chrome/services/wilco_dtc_supportd/public/mojom", "//chromeos:chromeos_export", + "//chromeos/ash/components/assistant:buildflags", "//chromeos/ash/components/dbus/authpolicy", "//chromeos/ash/components/dbus/authpolicy:authpolicy_proto", "//chromeos/ash/components/dbus/biod", @@ -267,7 +269,6 @@ "//chromeos/ash/components/dbus/upstart", "//chromeos/ash/components/hibernate:buildflags", "//chromeos/ash/components/scanning", - "//chromeos/assistant:buildflags", "//chromeos/components/cdm_factory_daemon:cdm_factory_daemon_browser", "//chromeos/components/chromebox_for_meetings/buildflags", "//chromeos/components/feature_usage",
diff --git a/chrome/browser/chromeos/app_mode/chrome_kiosk_app_launcher.cc b/chrome/browser/chromeos/app_mode/chrome_kiosk_app_launcher.cc index 271590a..9b4834e 100644 --- a/chrome/browser/chromeos/app_mode/chrome_kiosk_app_launcher.cc +++ b/chrome/browser/chromeos/app_mode/chrome_kiosk_app_launcher.cc
@@ -11,6 +11,8 @@ #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/extensions/application_launch.h" +#include "extensions/browser/app_window/app_window.h" +#include "extensions/browser/app_window/app_window_registry.h" #include "extensions/browser/disable_reason.h" #include "extensions/browser/extension_system.h" #include "extensions/common/extension_id.h" @@ -92,7 +94,25 @@ WindowOpenDisposition::NEW_WINDOW, apps::mojom::LaunchSource::kFromKiosk)); - ReportLaunchSuccess(); + WaitForAppWindow(); +} + +void ChromeKioskAppLauncher::WaitForAppWindow() { + auto* window_registry_ = extensions::AppWindowRegistry::Get(profile_); + if (!window_registry_->GetAppWindowsForApp(app_id_).empty()) { + ReportLaunchSuccess(); + } else { + // Start waiting for app window. + app_window_observation_.Observe(window_registry_); + } +} + +void ChromeKioskAppLauncher::OnAppWindowAdded( + extensions::AppWindow* app_window) { + if (app_window->extension_id() == app_id_) { + app_window_observation_.Reset(); + ReportLaunchSuccess(); + } } void ChromeKioskAppLauncher::MaybeUpdateAppData() { @@ -108,6 +128,7 @@ } void ChromeKioskAppLauncher::ReportLaunchSuccess() { + SYSLOG(INFO) << "App launch completed"; std::move(on_ready_callback_) .Run(ChromeKioskAppLauncher::LaunchResult::kSuccess); }
diff --git a/chrome/browser/chromeos/app_mode/chrome_kiosk_app_launcher.h b/chrome/browser/chromeos/app_mode/chrome_kiosk_app_launcher.h index cdb36a450..04476613 100644 --- a/chrome/browser/chromeos/app_mode/chrome_kiosk_app_launcher.h +++ b/chrome/browser/chromeos/app_mode/chrome_kiosk_app_launcher.h
@@ -6,13 +6,16 @@ #define CHROME_BROWSER_CHROMEOS_APP_MODE_CHROME_KIOSK_APP_LAUNCHER_H_ #include "base/callback.h" +#include "base/scoped_observation.h" #include "chrome/browser/profiles/profile.h" #include "chromeos/crosapi/mojom/chrome_app_kiosk_service.mojom.h" +#include "extensions/browser/app_window/app_window.h" +#include "extensions/browser/app_window/app_window_registry.h" #include "extensions/common/extension.h" namespace ash { -class ChromeKioskAppLauncher { +class ChromeKioskAppLauncher : public extensions::AppWindowRegistry::Observer { public: using LaunchResult = crosapi::mojom::ChromeKioskLaunchResult; using LaunchCallback = @@ -23,11 +26,16 @@ bool network_available); ChromeKioskAppLauncher(const ChromeKioskAppLauncher&) = delete; ChromeKioskAppLauncher& operator=(const ChromeKioskAppLauncher&) = delete; - ~ChromeKioskAppLauncher(); + ~ChromeKioskAppLauncher() override; void LaunchApp(LaunchCallback callback); private: + // AppWindowRegistry::Observer: + void OnAppWindowAdded(extensions::AppWindow* app_window) override; + + void WaitForAppWindow(); + void ReportLaunchSuccess(); void ReportLaunchFailure(LaunchResult result); @@ -47,9 +55,13 @@ std::string app_id_; bool network_available_ = false; + base::ScopedObservation<extensions::AppWindowRegistry, + extensions::AppWindowRegistry::Observer> + app_window_observation_{this}; + LaunchCallback on_ready_callback_; }; } // namespace ash -#endif // CHROME_BROWSER_CHROMEOS_APP_MODE_CHROME_KIOSK_APP_LAUNCHER_H_ \ No newline at end of file +#endif // CHROME_BROWSER_CHROMEOS_APP_MODE_CHROME_KIOSK_APP_LAUNCHER_H_
diff --git a/chrome/browser/chromeos/app_mode/chrome_kiosk_app_launcher_unittest.cc b/chrome/browser/chromeos/app_mode/chrome_kiosk_app_launcher_unittest.cc index 0dfe4a7a..2072241 100644 --- a/chrome/browser/chromeos/app_mode/chrome_kiosk_app_launcher_unittest.cc +++ b/chrome/browser/chromeos/app_mode/chrome_kiosk_app_launcher_unittest.cc
@@ -7,6 +7,7 @@ #include <memory> #include <vector> +#include "ash/test/ash_test_helper.h" #include "base/memory/scoped_refptr.h" #include "base/scoped_observation.h" #include "base/test/scoped_command_line.h" @@ -15,7 +16,11 @@ #include "chrome/browser/chromeos/app_mode/chrome_kiosk_app_installer.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_service_test_base.h" +#include "chrome/browser/ui/apps/chrome_app_delegate.h" #include "chrome/common/chrome_switches.h" +#include "content/public/test/browser_task_environment.h" +#include "extensions/browser/app_window/app_window.h" +#include "extensions/browser/app_window/test_app_window_contents.h" #include "extensions/browser/test_event_router.h" #include "extensions/common/api/app_runtime.h" @@ -74,13 +79,53 @@ observation_{this}; std::vector<std::string> launched_apps_; }; + +void InitAppWindow(extensions::AppWindow* app_window, const gfx::Rect& bounds) { + // Create a TestAppWindowContents for the ShellAppDelegate to initialize the + // ShellExtensionWebContentsObserver with. + std::unique_ptr<content::WebContents> web_contents( + content::WebContents::Create( + content::WebContents::CreateParams(app_window->browser_context()))); + auto app_window_contents = + std::make_unique<extensions::TestAppWindowContents>( + std::move(web_contents)); + + // Initialize the web contents and AppWindow. + app_window->app_delegate()->InitWebContents( + app_window_contents->GetWebContents()); + + content::RenderFrameHost* main_frame = + app_window_contents->GetWebContents()->GetMainFrame(); + DCHECK(main_frame); + + extensions::AppWindow::CreateParams params; + params.content_spec.bounds = bounds; + app_window->Init(GURL(), app_window_contents.release(), main_frame, params); +} + +extensions::AppWindow* CreateAppWindow(Profile* profile, + const extensions::Extension* extension, + gfx::Rect bounds = {}) { + extensions::AppWindow* app_window = new extensions::AppWindow( + profile, new ChromeAppDelegate(profile, true), extension); + InitAppWindow(app_window, bounds); + return app_window; +} + } // namespace class ChromeKioskAppLauncherTest : public extensions::ExtensionServiceTestBase, extensions::TestEventRouter::EventObserver { public: + ChromeKioskAppLauncherTest() + : extensions::ExtensionServiceTestBase( + std::make_unique<content::BrowserTaskEnvironment>( + content::BrowserTaskEnvironment::REAL_IO_THREAD)) {} + // testing::Test: void SetUp() override { + ash_test_helper_.SetUp(ash::AshTestHelper::InitParams()); + command_line_.GetProcessCommandLine()->AppendSwitch( switches::kForceAppMode); command_line_.GetProcessCommandLine()->AppendSwitch(switches::kAppId); @@ -97,6 +142,7 @@ app_launch_tracker_.reset(); extensions::ExtensionServiceTestBase::TearDown(); + ash_test_helper_.TearDown(); } protected: @@ -105,6 +151,11 @@ profile(), kTestPrimaryAppId, is_network_ready); } + void SimulateAppWindowLaunch(const extensions::Extension* extension) { + CreateAppWindow(profile(), extension); + } + + ash::AshTestHelper ash_test_helper_; std::unique_ptr<ChromeKioskAppLauncher> launcher_; std::unique_ptr<AppLaunchTracker> app_launch_tracker_; @@ -172,6 +223,8 @@ TestFuture<LaunchResult> future; launcher_->LaunchApp(future.GetCallback()); + SimulateAppWindowLaunch(primary_app.get()); + ASSERT_THAT(future.Get(), Eq(LaunchResult::kSuccess)); EXPECT_THAT(app_launch_tracker_->launched_apps(), @@ -209,6 +262,8 @@ TestFuture<LaunchResult> future; launcher_->LaunchApp(future.GetCallback()); + SimulateAppWindowLaunch(primary_app.get()); + ASSERT_THAT(future.Get(), Eq(LaunchResult::kSuccess)); EXPECT_THAT(app_launch_tracker_->launched_apps(),
diff --git a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.cc b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.cc index f238fb19..da22774 100644 --- a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.cc +++ b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.cc
@@ -13,6 +13,9 @@ #include "base/memory/ptr_util.h" #include "base/trace_event/trace_event.h" #include "base/values.h" +#include "chrome/browser/ash/crosapi/crosapi_ash.h" +#include "chrome/browser/ash/crosapi/crosapi_manager.h" +#include "chrome/browser/ash/crosapi/file_system_provider_service_ash.h" #include "chrome/browser/ash/file_system_provider/provided_file_system_info.h" #include "chrome/browser/ash/file_system_provider/provided_file_system_interface.h" #include "chrome/browser/ash/file_system_provider/request_manager.h" @@ -21,6 +24,7 @@ #include "chrome/browser/extensions/chrome_extension_function_details.h" #include "chrome/common/extensions/api/file_system_provider.h" #include "chrome/common/extensions/api/file_system_provider_internal.h" +#include "chromeos/crosapi/mojom/file_system_provider.mojom.h" #include "storage/browser/file_system/watcher_manager.h" using ash::file_system_provider::MountOptions; @@ -36,87 +40,90 @@ namespace extensions { namespace { -// Converts the change type from the IDL type to a native type. |changed_type| -// must be specified (not CHANGE_TYPE_NONE). -storage::WatcherManager::ChangeType ParseChangeType( - const api::file_system_provider::ChangeType& change_type) { - switch (change_type) { - case api::file_system_provider::CHANGE_TYPE_CHANGED: - return storage::WatcherManager::CHANGED; - case api::file_system_provider::CHANGE_TYPE_DELETED: - return storage::WatcherManager::DELETED; - default: - break; - } - NOTREACHED(); - return storage::WatcherManager::CHANGED; -} - -// Convert the change from the IDL type to a native type. The reason IDL types -// are not used is since they are imperfect, eg. paths are stored as strings. -ProvidedFileSystemObserver::Change ParseChange( - const api::file_system_provider::Change& change) { - ProvidedFileSystemObserver::Change result; - result.entry_path = base::FilePath::FromUTF8Unsafe(change.entry_path); - result.change_type = ParseChangeType(change.change_type); - return result; -} - -// Converts a list of child changes from the IDL type to a native type. -std::unique_ptr<ProvidedFileSystemObserver::Changes> ParseChanges( - const std::vector<api::file_system_provider::Change>& changes) { - std::unique_ptr<ProvidedFileSystemObserver::Changes> results( - new ProvidedFileSystemObserver::Changes); - for (const auto& change : changes) { - results->push_back(ParseChange(change)); - } - return results; -} - -// Fills the IDL's FileSystemInfo with FSP's ProvidedFileSystemInfo and -// Watchers. -void FillFileSystemInfo(const ProvidedFileSystemInfo& file_system_info, - const Watchers& watchers, - const OpenedFiles& opened_files, - api::file_system_provider::FileSystemInfo* output) { - using api::file_system_provider::Watcher; +api::file_system_provider::FileSystemInfo ConvertFileSystemInfoMojomToExtension( + crosapi::mojom::FileSystemInfoPtr info) { using api::file_system_provider::OpenedFile; + using api::file_system_provider::Watcher; + api::file_system_provider::FileSystemInfo item; + item.file_system_id = info->metadata->file_system_id->id; + item.display_name = info->metadata->display_name; + item.writable = info->metadata->writable; + item.opened_files_limit = info->metadata->opened_files_limit; - output->file_system_id = file_system_info.file_system_id(); - output->display_name = file_system_info.display_name(); - output->writable = file_system_info.writable(); - output->opened_files_limit = file_system_info.opened_files_limit(); - - for (const auto& watcher : watchers) { + for (const auto& watcher : info->watchers) { Watcher watcher_item; - watcher_item.entry_path = watcher.second.entry_path.value(); - watcher_item.recursive = watcher.second.recursive; - if (!watcher.second.last_tag.empty()) - watcher_item.last_tag = - std::make_unique<std::string>(watcher.second.last_tag); - output->watchers.push_back(std::move(watcher_item)); + watcher_item.entry_path = watcher->entry_path.value(); + watcher_item.recursive = watcher->recursive; + if (!watcher->last_tag.empty()) { + watcher_item.last_tag = std::make_unique<std::string>(watcher->last_tag); + } + item.watchers.push_back(std::move(watcher_item)); } - for (const auto& opened_file : opened_files) { + for (const auto& opened_file : info->opened_files) { OpenedFile opened_file_item; - opened_file_item.open_request_id = opened_file.first; - opened_file_item.file_path = opened_file.second.file_path.value(); - switch (opened_file.second.mode) { - case ash::file_system_provider::OPEN_FILE_MODE_READ: + opened_file_item.open_request_id = opened_file->open_request_id; + opened_file_item.file_path = opened_file->file_path; + switch (opened_file->mode) { + case crosapi::mojom::OpenFileMode::kRead: opened_file_item.mode = extensions::api::file_system_provider::OPEN_FILE_MODE_READ; break; - case ash::file_system_provider::OPEN_FILE_MODE_WRITE: + case crosapi::mojom::OpenFileMode::kWrite: opened_file_item.mode = extensions::api::file_system_provider::OPEN_FILE_MODE_WRITE; break; } - output->opened_files.push_back(std::move(opened_file_item)); + item.opened_files.push_back(std::move(opened_file_item)); } + return item; +} + +// Converts the change type from the IDL type to a mojom type. |changed_type| +// must be specified (not CHANGE_TYPE_NONE). +crosapi::mojom::FSPChangeType ParseChangeType( + const api::file_system_provider::ChangeType& change_type) { + switch (change_type) { + case api::file_system_provider::CHANGE_TYPE_CHANGED: + return crosapi::mojom::FSPChangeType::kChanged; + case api::file_system_provider::CHANGE_TYPE_DELETED: + return crosapi::mojom::FSPChangeType::kDeleted; + default: + break; + } + NOTREACHED(); + return crosapi::mojom::FSPChangeType::kChanged; +} + +// Convert the change from the IDL type to mojom type. +crosapi::mojom::FSPChangePtr ParseChange( + const api::file_system_provider::Change& change) { + crosapi::mojom::FSPChangePtr result = crosapi::mojom::FSPChange::New(); + result->path = base::FilePath::FromUTF8Unsafe(change.entry_path); + result->type = ParseChangeType(change.change_type); + return result; +} + +// Converts a list of child changes from the IDL type to mojom type. +std::vector<crosapi::mojom::FSPChangePtr> ParseChanges( + const std::vector<api::file_system_provider::Change>& changes) { + std::vector<crosapi::mojom::FSPChangePtr> results; + for (const auto& change : changes) { + results.push_back(ParseChange(change)); + } + return results; } } // namespace +void FileSystemProviderBase::RespondWithError(const std::string& error) { + if (error.empty()) { + Respond(NoArguments()); + } else { + Respond(Error(error)); + } +} + ExtensionFunction::ResponseAction FileSystemProviderMountFunction::Run() { using api::file_system_provider::Mount::Params; const std::unique_ptr<Params> params(Params::Create(args())); @@ -141,28 +148,30 @@ Error(FileErrorToString(base::File::FILE_ERROR_INVALID_OPERATION))); } - Service* const service = - Service::Get(Profile::FromBrowserContext(browser_context())); - DCHECK(service); + bool persistent = params->options.persistent.get() + ? *params->options.persistent.get() + : true; + crosapi::mojom::FileSystemMetadataPtr metadata = + crosapi::mojom::FileSystemMetadata::New(); + metadata->file_system_id = crosapi::mojom::FileSystemId::New(); + metadata->file_system_id->provider = extension_id(); + metadata->file_system_id->id = params->options.file_system_id; + metadata->display_name = params->options.display_name; + metadata->writable = params->options.writable != nullptr; + metadata->opened_files_limit = base::saturated_cast<uint32_t>( + params->options.opened_files_limit.get() + ? *params->options.opened_files_limit.get() + : 0); + metadata->supports_notify = params->options.supports_notify_tag != nullptr; - MountOptions options; - options.file_system_id = params->options.file_system_id; - options.display_name = params->options.display_name; - options.writable = params->options.writable != nullptr; - options.opened_files_limit = params->options.opened_files_limit.get() - ? *params->options.opened_files_limit.get() - : 0; - options.supports_notify_tag = params->options.supports_notify_tag != nullptr; - options.persistent = params->options.persistent.get() - ? *params->options.persistent.get() - : true; - - const base::File::Error result = service->MountFileSystem( - ProviderId::CreateFromExtensionId(extension_id()), options); - if (result != base::File::FILE_OK) - return RespondNow(Error(FileErrorToString(result))); - - return RespondNow(NoArguments()); + auto callback = + base::BindOnce(&FileSystemProviderMountFunction::RespondWithError, this); + crosapi::CrosapiManager::Get() + ->crosapi_ash() + ->file_system_provider_service_ash() + ->MountWithProfile(std::move(metadata), persistent, std::move(callback), + Profile::FromBrowserContext(browser_context())); + return RespondLater(); } ExtensionFunction::ResponseAction FileSystemProviderUnmountFunction::Run() { @@ -170,49 +179,38 @@ std::unique_ptr<Params> params(Params::Create(args())); EXTENSION_FUNCTION_VALIDATE(params); - Service* const service = - Service::Get(Profile::FromBrowserContext(browser_context())); - DCHECK(service); - - const base::File::Error result = service->UnmountFileSystem( - ProviderId::CreateFromExtensionId(extension_id()), - params->options.file_system_id, Service::UNMOUNT_REASON_USER); - if (result != base::File::FILE_OK) - return RespondNow(Error(FileErrorToString(result))); - - return RespondNow(NoArguments()); + auto id = crosapi::mojom::FileSystemId::New(); + id->provider = extension_id(); + id->id = params->options.file_system_id; + auto callback = base::BindOnce( + &FileSystemProviderUnmountFunction::RespondWithError, this); + crosapi::CrosapiManager::Get() + ->crosapi_ash() + ->file_system_provider_service_ash() + ->UnmountWithProfile(std::move(id), std::move(callback), + Profile::FromBrowserContext(browser_context())); + return RespondLater(); } ExtensionFunction::ResponseAction FileSystemProviderGetAllFunction::Run() { + auto callback = + base::BindOnce(&FileSystemProviderGetAllFunction::RespondWithInfos, this); + crosapi::CrosapiManager::Get() + ->crosapi_ash() + ->file_system_provider_service_ash() + ->GetAllWithProfile(extension_id(), std::move(callback), + Profile::FromBrowserContext(browser_context())); + return RespondLater(); +} + +void FileSystemProviderGetAllFunction::RespondWithInfos( + std::vector<crosapi::mojom::FileSystemInfoPtr> infos) { using api::file_system_provider::FileSystemInfo; - Service* const service = - Service::Get(Profile::FromBrowserContext(browser_context())); - DCHECK(service); - - ProviderId provider_id = ProviderId::CreateFromExtensionId(extension_id()); - const std::vector<ProvidedFileSystemInfo> file_systems = - service->GetProvidedFileSystemInfoList(provider_id); - std::vector<FileSystemInfo> items; - - for (const auto& file_system_info : file_systems) { - FileSystemInfo item; - - ProvidedFileSystemInterface* const file_system = - service->GetProvidedFileSystem(file_system_info.provider_id(), - file_system_info.file_system_id()); - - DCHECK(file_system); - - FillFileSystemInfo( - file_system_info, - file_system_info.watchable() ? *file_system->GetWatchers() : Watchers(), - file_system->GetOpenedFiles(), &item); - - items.push_back(std::move(item)); + for (auto& info : infos) { + items.push_back(ConvertFileSystemInfoMojomToExtension(std::move(info))); } - - return RespondNow( + Respond( ArgumentList(api::file_system_provider::GetAll::Results::Create(items))); } @@ -221,29 +219,29 @@ std::unique_ptr<Params> params(Params::Create(args())); EXTENSION_FUNCTION_VALIDATE(params); + auto id = crosapi::mojom::FileSystemId::New(); + id->provider = extension_id(); + id->id = params->file_system_id; + auto callback = + base::BindOnce(&FileSystemProviderGetFunction::RespondWithInfo, this); + crosapi::CrosapiManager::Get() + ->crosapi_ash() + ->file_system_provider_service_ash() + ->GetWithProfile(std::move(id), std::move(callback), + Profile::FromBrowserContext(browser_context())); + return RespondLater(); +} + +void FileSystemProviderGetFunction::RespondWithInfo( + crosapi::mojom::FileSystemInfoPtr info) { using api::file_system_provider::FileSystemInfo; - Service* const service = - Service::Get(Profile::FromBrowserContext(browser_context())); - DCHECK(service); - - ProvidedFileSystemInterface* const file_system = - service->GetProvidedFileSystem( - ProviderId::CreateFromExtensionId(extension_id()), - params->file_system_id); - - if (!file_system) { - return RespondNow( - Error(FileErrorToString(base::File::FILE_ERROR_NOT_FOUND))); + if (!info) { + Respond(Error(FileErrorToString(base::File::FILE_ERROR_NOT_FOUND))); + return; } - - FileSystemInfo file_system_info; - FillFileSystemInfo(file_system->GetFileSystemInfo(), - file_system->GetFileSystemInfo().watchable() - ? *file_system->GetWatchers() - : Watchers(), - file_system->GetOpenedFiles(), &file_system_info); - return RespondNow(ArgumentList( - api::file_system_provider::Get::Results::Create(file_system_info))); + auto result = ConvertFileSystemInfoMojomToExtension(std::move(info)); + Respond(ArgumentList( + api::file_system_provider::Get::Results::Create(std::move(result)))); } ExtensionFunction::ResponseAction FileSystemProviderNotifyFunction::Run() { @@ -251,28 +249,31 @@ std::unique_ptr<Params> params(Params::Create(args())); EXTENSION_FUNCTION_VALIDATE(params); - Service* const service = Service::Get(browser_context()); - DCHECK(service); + auto callback = + base::BindOnce(&FileSystemProviderNotifyFunction::RespondWithError, this); + auto id = crosapi::mojom::FileSystemId::New(); + id->provider = extension_id(); + id->id = params->options.file_system_id; - ProvidedFileSystemInterface* const file_system = - service->GetProvidedFileSystem( - ProviderId::CreateFromExtensionId(extension_id()), - params->options.file_system_id); - if (!file_system) { - return RespondNow( - Error(FileErrorToString(base::File::FILE_ERROR_NOT_FOUND))); + crosapi::mojom::FSPWatcherPtr watcher = crosapi::mojom::FSPWatcher::New(); + watcher->entry_path = + base::FilePath::FromUTF8Unsafe(params->options.observed_path); + watcher->recursive = params->options.recursive; + watcher->last_tag = + params->options.tag.get() ? *params->options.tag.get() : ""; + crosapi::mojom::FSPChangeType type = + ParseChangeType(params->options.change_type); + std::vector<crosapi::mojom::FSPChangePtr> changes; + if (params->options.changes.get()) { + changes = ParseChanges(*params->options.changes.get()); } - file_system->Notify( - base::FilePath::FromUTF8Unsafe(params->options.observed_path), - params->options.recursive, ParseChangeType(params->options.change_type), - params->options.changes.get() - ? ParseChanges(*params->options.changes.get()) - : base::WrapUnique(new ProvidedFileSystemObserver::Changes), - params->options.tag.get() ? *params->options.tag.get() : "", - base::BindOnce(&FileSystemProviderNotifyFunction::OnNotifyCompleted, - this)); - + crosapi::CrosapiManager::Get() + ->crosapi_ash() + ->file_system_provider_service_ash() + ->NotifyWithProfile(std::move(id), std::move(watcher), type, + std::move(changes), std::move(callback), + Profile::FromBrowserContext(browser_context())); return RespondLater(); }
diff --git a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.h b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.h index 6a300fa..c782b17f 100644 --- a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.h +++ b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.h
@@ -6,11 +6,18 @@ #define CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_SYSTEM_PROVIDER_FILE_SYSTEM_PROVIDER_API_H_ #include "chrome/browser/chromeos/extensions/file_system_provider/provider_function.h" +#include "chromeos/crosapi/mojom/file_system_provider.mojom.h" #include "extensions/browser/extension_function.h" namespace extensions { -class FileSystemProviderMountFunction : public ExtensionFunction { +class FileSystemProviderBase : public ExtensionFunction { + protected: + ~FileSystemProviderBase() override {} + void RespondWithError(const std::string& error); +}; + +class FileSystemProviderMountFunction : public FileSystemProviderBase { public: DECLARE_EXTENSION_FUNCTION("fileSystemProvider.mount", FILESYSTEMPROVIDER_MOUNT) @@ -20,7 +27,7 @@ ResponseAction Run() override; }; -class FileSystemProviderUnmountFunction : public ExtensionFunction { +class FileSystemProviderUnmountFunction : public FileSystemProviderBase { public: DECLARE_EXTENSION_FUNCTION("fileSystemProvider.unmount", FILESYSTEMPROVIDER_UNMOUNT) @@ -36,6 +43,7 @@ FILESYSTEMPROVIDER_GETALL) protected: + void RespondWithInfos(std::vector<crosapi::mojom::FileSystemInfoPtr>); ~FileSystemProviderGetAllFunction() override {} ResponseAction Run() override; }; @@ -45,11 +53,12 @@ DECLARE_EXTENSION_FUNCTION("fileSystemProvider.get", FILESYSTEMPROVIDER_GET) protected: + void RespondWithInfo(crosapi::mojom::FileSystemInfoPtr info); ~FileSystemProviderGetFunction() override {} ResponseAction Run() override; }; -class FileSystemProviderNotifyFunction : public ExtensionFunction { +class FileSystemProviderNotifyFunction : public FileSystemProviderBase { public: DECLARE_EXTENSION_FUNCTION("fileSystemProvider.notify", FILESYSTEMPROVIDER_NOTIFY)
diff --git a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc index 9fd700c..811c5c9d 100644 --- a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc +++ b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc
@@ -164,13 +164,7 @@ << message_; } -// TODO(crbug.com/1324887): Re-enable this test -#if defined(MEMORY_SANITIZER) -#define MAYBE_Unmount DISABLED_Unmount -#else -#define MAYBE_Unmount Unmount -#endif -IN_PROC_BROWSER_TEST_F(FileSystemProviderApiTest, MAYBE_Unmount) { +IN_PROC_BROWSER_TEST_F(FileSystemProviderApiTest, Unmount) { ASSERT_TRUE(RunExtensionTest("file_system_provider/unmount", {.launch_as_platform_app = true}, {.load_as_component = true}))
diff --git a/chrome/browser/component_updater/pki_metadata_component_installer_browsertest.cc b/chrome/browser/component_updater/pki_metadata_component_installer_browsertest.cc index 8c542a6..281cac75 100644 --- a/chrome/browser/component_updater/pki_metadata_component_installer_browsertest.cc +++ b/chrome/browser/component_updater/pki_metadata_component_installer_browsertest.cc
@@ -183,6 +183,8 @@ public PKIMetadataComponentInstallerService::Observer { public: void SetUpInProcessBrowserTestFixture() override { + SystemNetworkContextManager::SetEnableCertificateTransparencyForTesting( + false); PKIMetadataComponentInstallerService::GetInstance()->AddObserver(this); InProcessBrowserTest::SetUpInProcessBrowserTestFixture(); ASSERT_TRUE(component_dir_.CreateUniqueTempDir()); @@ -191,6 +193,8 @@ void TearDownInProcessBrowserTestFixture() override { PKIMetadataComponentInstallerService::GetInstance()->RemoveObserver(this); + SystemNetworkContextManager::SetEnableCertificateTransparencyForTesting( + absl::nullopt); } class CRSWaiter {
diff --git a/chrome/browser/download/bubble/OWNERS b/chrome/browser/download/bubble/OWNERS new file mode 100644 index 0000000..826d32a --- /dev/null +++ b/chrome/browser/download/bubble/OWNERS
@@ -0,0 +1,2 @@ +bhatiarohit@google.com +xinghuilu@chromium.org \ No newline at end of file
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc b/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc index 6d98fd7..f9b603bd 100644 --- a/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc +++ b/chrome/browser/extensions/api/networking_private/networking_private_apitest.cc
@@ -162,49 +162,53 @@ VoidResult(std::move(success_callback), std::move(failure_callback)); } - // Synchronous methods - base::Value GetEnabledNetworkTypes() override { + void GetEnabledNetworkTypes(EnabledNetworkTypesCallback callback) override { base::Value result(base::Value::Type::LIST); if (!fail_) { result.Append(::onc::network_config::kEthernet); } - return result; + std::move(callback).Run(base::Value::ToUniquePtrValue(std::move(result))); } - std::unique_ptr<DeviceStateList> GetDeviceStateList() override { + void GetDeviceStateList(DeviceStateListCallback callback) override { std::unique_ptr<DeviceStateList> result; - if (fail_) - return result; - result = std::make_unique<DeviceStateList>(); - std::unique_ptr<api::networking_private::DeviceStateProperties> properties( - new api::networking_private::DeviceStateProperties); - properties->type = api::networking_private::NETWORK_TYPE_ETHERNET; - properties->state = api::networking_private::DEVICE_STATE_TYPE_ENABLED; - result->push_back(std::move(properties)); - return result; + if (!fail_) { + result = std::make_unique<DeviceStateList>(); + std::unique_ptr<api::networking_private::DeviceStateProperties> + properties(new api::networking_private::DeviceStateProperties); + properties->type = api::networking_private::NETWORK_TYPE_ETHERNET; + properties->state = api::networking_private::DEVICE_STATE_TYPE_ENABLED; + result->push_back(std::move(properties)); + } + std::move(callback).Run(std::move(result)); } - base::Value GetGlobalPolicy() override { - return base::Value(base::Value::Type::DICTIONARY); + void GetGlobalPolicy(GetGlobalPolicyCallback callback) override { + std::move(callback).Run(base::Value::ToUniquePtrValue( + base::Value(base::Value::Type::DICTIONARY))); } - base::Value GetCertificateLists() override { - return base::Value(base::Value::Type::DICTIONARY); + void GetCertificateLists(GetCertificateListsCallback callback) override { + std::move(callback).Run(base::Value::ToUniquePtrValue( + base::Value(base::Value::Type::DICTIONARY))); } - bool EnableNetworkType(const std::string& type) override { + // Synchronous methods + void EnableNetworkType(const std::string& type, + BoolCallback callback) override { enabled_[type] = true; - return !fail_; + std::move(callback).Run(!fail_); } - bool DisableNetworkType(const std::string& type) override { + void DisableNetworkType(const std::string& type, + BoolCallback callback) override { disabled_[type] = true; - return !fail_; + std::move(callback).Run(!fail_); } - bool RequestScan(const std::string& type) override { + void RequestScan(const std::string& type, BoolCallback callback) override { scan_requested_.push_back(type); - return !fail_; + std::move(callback).Run(!fail_); } void set_fail(bool fail) { fail_ = fail; }
diff --git a/chrome/browser/extensions/api/tabs/tabs_api.cc b/chrome/browser/extensions/api/tabs/tabs_api.cc index 7d41dc1..dcc75d0 100644 --- a/chrome/browser/extensions/api/tabs/tabs_api.cc +++ b/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -15,6 +15,7 @@ #include "base/bind.h" #include "base/check_op.h" #include "base/command_line.h" +#include "base/containers/contains.h" #include "base/location.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted_memory.h" @@ -834,10 +835,30 @@ } chrome::SelectNumberedTab(new_window, 0, {TabStripModel::GestureType::kNone}); - if (focused) + if (focused) { new_window->window()->Show(); - else + } else { + // The new window isn't supposed to be focused. Here, instead of showing an + // unfocused window on top (possible on some operating systems), we show + // the window and then bring the old focused window back on top. + // We still use ShowInactive() (instead of doing a Show() followed + // immediately by Deactivate()) because the process of showing the window is + // somewhat asynchronous. This causes the immediate Deactivate() call to not + // work. + BrowserList* const browser_list = BrowserList::GetInstance(); + Browser* active_browser = browser_list->GetLastActive(); + bool reset_active = false; + // Check if there's a currently-active window that should re-take focus. + // NOTE: This browser *may* be from another profile. We don't access any + // data from it. + if (active_browser && active_browser->window()->IsActive()) + reset_active = true; new_window->window()->ShowInactive(); + // NOTE: It's possible that showing the new browser synchronously caused + // the old one to close. Ensure it's still valid before activating it. + if (reset_active && base::Contains(*browser_list, active_browser)) + active_browser->window()->Activate(); + } // Lock the window fullscreen only after the new tab has been created // (otherwise the tabstrip is empty), and window()->show() has been called
diff --git a/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc b/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc index 14ed45ad..fd7d505e 100644 --- a/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc +++ b/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc
@@ -8,6 +8,7 @@ #include "base/memory/raw_ptr.h" #include "base/run_loop.h" #include "base/strings/pattern.h" +#include "base/strings/stringprintf.h" #include "base/values.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -20,15 +21,24 @@ #include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/interactive_test_utils.h" +#include "chrome/test/base/ui_test_utils.h" #include "content/public/test/browser_test.h" #include "extensions/browser/api_test_utils.h" #include "extensions/common/extension_builder.h" +#include "extensions/test/result_catcher.h" +#include "extensions/test/test_extension_dir.h" +#include "ui/views/test/widget_test.h" #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_observer.h" +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) +#include "ui/ozone/buildflags.h" +#endif + namespace extensions { namespace keys = tabs_constants; @@ -416,4 +426,112 @@ } #endif // !BUILDFLAG(IS_MAC) +using TabsApiInteractiveTest = ExtensionApiTest; + +// Tests that a window created with `focused: false` does not cover the focused +// window. Regression test for https://crbug.com/1302159. +IN_PROC_BROWSER_TEST_F(TabsApiInteractiveTest, + OpeningAnUnfocusedWindowDoesntCoverTheFocusedWindow) { + ASSERT_TRUE(StartEmbeddedTestServer()); + + const GURL url1 = embedded_test_server()->GetURL("/title1.html"); + const GURL url2 = embedded_test_server()->GetURL("/title2.html"); + + // Navigate to `url1` and ensure the browser is active. + { + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url1)); + ui_test_utils::BrowserActivationWaiter activation_waiter(browser()); + browser()->window()->Activate(); + activation_waiter.WaitForActivation(); + } + ASSERT_TRUE(browser()->window()->IsActive()); + + // Create and load an extension that creates a new window with a tab at + // `url2` with `focused: false` and waits for the tab to complete loading. + static constexpr char kManifest[] = + R"({ + "name": "Interactive Test", + "manifest_version": 3, + "version": "0.1", + "background": { "service_worker": "background.js" }, + "permissions": ["tabs"] + })"; + static constexpr char kBackgroundJs[] = + R"(chrome.test.runTests([ + async function openUnfocusedWindow() { + const url = '%s'; + const tabCreatedPromise = new Promise((resolve) => { + chrome.tabs.onUpdated.addListener( + function listener(tabId, changeInfo, tab) { + if (changeInfo.status === 'complete' && + tab.url === url) { + chrome.tabs.onUpdated.removeListener(listener); + resolve(); + } + }); + }); + const win = + await chrome.windows.create({focused: false, url: url}); + chrome.test.assertFalse(win.focused); + await tabCreatedPromise; + chrome.test.succeed(); + }, + ]);)"; + + TestExtensionDir test_dir; + test_dir.WriteManifest(kManifest); + test_dir.WriteFile(FILE_PATH_LITERAL("background.js"), + base::StringPrintf(kBackgroundJs, url2.spec().c_str())); + + ResultCatcher result_catcher; + const Extension* extension = LoadExtension(test_dir.UnpackedPath()); + ASSERT_TRUE(extension); + ASSERT_TRUE(result_catcher.GetNextResult()) << result_catcher.message(); + + // Now, verify the browsers. There should be exactly two browser windows (the + // original and the one created by the extension). + BrowserList* browser_list = BrowserList::GetInstance(); + ASSERT_EQ(2u, browser_list->size()); + ASSERT_TRUE(base::Contains(*browser_list, browser())); + // Find the new browser. Be flexible in case BrowserList's internal sort + // changes. + Browser* new_browser = browser_list->get(0) == browser() + ? browser_list->get(1) + : browser_list->get(0); + EXPECT_NE(new_browser, browser()); + + // The new browser should have a tab pointed to `url2`; we use this mostly as + // validation that setup went according to plan. + EXPECT_EQ(1, new_browser->tab_strip_model()->count()); + EXPECT_EQ(url2, new_browser->tab_strip_model() + ->GetActiveWebContents() + ->GetLastCommittedURL()); + + bool check_window_active_state = true; +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(OZONE_PLATFORM_WAYLAND) + check_window_active_state = false; +#endif +#endif + + // The new browser should be inactive, since it was created with + // `focused: false`. The old browser should remain active. + // This assertion fails on Wayland. This is possibly due to + // https://crbug.com/1280332, where bubbles are drawn on the same window, + // but that is yet to be confirmed. + if (check_window_active_state) { + EXPECT_FALSE(new_browser->window()->IsActive()); + EXPECT_TRUE(browser()->window()->IsActive()); + } + + // The old browser (which retains focus) should be on top of the new browser. + // This currently fails because WidgetTest::IsWindowStackedAbove() doesn't + // work for different BrowserViews. While the functionality is currently + // correct, this means we don't have a good regression test for it. + // TODO(https://crbug.com/1302159): Fix this. + // EXPECT_TRUE(views::test::WidgetTest::IsWindowStackedAbove( + // BrowserView::GetBrowserViewForBrowser(browser())->frame(), + // BrowserView::GetBrowserViewForBrowser(new_browser)->frame())); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/updater/extension_updater_unittest.cc b/chrome/browser/extensions/updater/extension_updater_unittest.cc index 82732d2d..53f84cb6 100644 --- a/chrome/browser/extensions/updater/extension_updater_unittest.cc +++ b/chrome/browser/extensions/updater/extension_updater_unittest.cc
@@ -2361,7 +2361,7 @@ std::unique_ptr<ManifestFetchData> fetch_other( CreateManifestFetchData(GURL("http://localhost/foo"), other_priority)); - fetch_data->Merge(*fetch_other); + fetch_data->Merge(std::move(fetch_other)); ASSERT_EQ(expected_priority, fetch_data->fetch_priority()); }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index f8d8869..14b23961 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -525,6 +525,11 @@ "expiry_milestone": 105 }, { + "name": "autofill-remove-card-expiry-from-downstream-suggestion", + "owners": [ "siyua", "siashah" ], + "expiry_milestone": 105 + }, + { "name": "autofill-save-card-dismiss-on-navigation", "owners": [ "sczs", "bling-flags@google.com" ], "expiry_milestone": 82 @@ -2377,8 +2382,8 @@ }, { "name": "enable-media-foundation-video-capture", - "owners": [ "agpalak", "guidou" ], - "expiry_milestone": 99 + "owners": [ "agpalak", "herre" ], + "expiry_milestone": 110 }, { "name": "enable-migrate-default-chrome-app-to-web-apps-gsuite", @@ -3524,7 +3529,7 @@ { "name": "help-app-launcher-search", "owners": [ "//ash/webui/help_app_ui/OWNERS" ], - "expiry_milestone": 102 + "expiry_milestone": 107 }, { "name": "help-app-search-service-integration", @@ -4161,6 +4166,11 @@ "expiry_milestone": 99 }, { + "name": "more-video-capture-buffers", + "owners": [ "chromeos-camera-eng@google.com" ], + "expiry_milestone": 110 + }, + { "name": "mouse-subframe-no-implicit-capture", "owners": [ "eirage", "nzolghadr", "input-dev" ], "expiry_milestone": 84 @@ -5594,7 +5604,7 @@ { "name": "subframe-shutdown-delay", "owners": [ "jessemckenna@google.com", "olivierli" ], - "expiry_milestone": 102 + "expiry_milestone": 106 }, { "name": "suggestions-scrolling-ipad",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 6568436..d963c04 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -427,6 +427,12 @@ "When enabled, Autofill will attempt to fill merchant promo/coupon/gift " "code fields when data is available."; +const char kAutofillRemoveCardExpiryFromDownstreamSuggestionName[] = + "Remove card expiration date from the Autofill card suggestions"; +const char kAutofillRemoveCardExpiryFromDownstreamSuggestionDescription[] = + "When enabled, card expiration date will no longer be displayed in " + "a card suggestion."; + const char kAutofillHighlightOnlyChangedValuesInPreviewModeName[] = "Highlight only changed values in preview mode."; const char kAutofillHighlightOnlyChangedValuesInPreviewModeDescription[] = @@ -1019,7 +1025,8 @@ const char kEnableIphName[] = "Enable IPH"; const char kEnableIphDescription[] = - "Enables the ability to show IPH. When disabled, IPHs are disabled system wide."; + "Enables the ability to show IPH. When disabled, IPHs are disabled system " + "wide."; const char kEnableRgbKeyboardName[] = "Enable RGB Keyboard Support"; const char kEnableRgbKeyboardDescription[] = @@ -4307,6 +4314,12 @@ "Enables this flag to prefer using constant frame rate for camera when " "streaming"; +const char kMoreVideoCaptureBuffersName[] = "More Video Capture Buffers"; +const char kMoreVideoCaptureBuffersDescription[] = + "This flag enables using a larger amount Chrome-allocated buffers for " + "video capture. This larger amount is needed for deeper pipelines, e.g. " + "sophisticated camera effects."; + const char kForceControlFaceAeName[] = "Force control face AE"; const char kForceControlFaceAeDescription[] = "Control this flag to force enable or disable face AE for camera"; @@ -4768,11 +4781,14 @@ "Enable the new permissions onboarding flow for Phone Hub notifications " "and Eche."; -const char kEcheSWAName[] = "Enable Eche App SWA."; -const char kEcheSWADescription[] = "Enable the SWA version of the Eche."; +const char kEcheSWAName[] = "Enable Eche feature"; +const char kEcheSWADescription[] = "This is the main flag for enabling Eche."; const char kEcheSWADebugModeName[] = "Enable Eche Debug Mode"; -const char kEcheSWADebugModeDescription[] = "Enable the Debug Mode of the Eche"; +const char kEcheSWADebugModeDescription[] = + "Enables the Debug Mode of Eche in which the window is not closed after " + "a failure happens in order to give the user a chance to look at the " + "console logs."; const char kEnableIkev2VpnName[] = "Enable IKEv2 VPN"; const char kEnableIkev2VpnDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index a814b76..68b1089 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -247,6 +247,10 @@ extern const char kAutofillParseMerchantPromoCodeFieldsName[]; extern const char kAutofillParseMerchantPromoCodeFieldsDescription[]; +extern const char kAutofillRemoveCardExpiryFromDownstreamSuggestionName[]; +extern const char + kAutofillRemoveCardExpiryFromDownstreamSuggestionDescription[]; + extern const char kAutofillSaveAndFillVPAName[]; extern const char kAutofillSaveAndFillVPADescription[]; @@ -2460,6 +2464,9 @@ extern const char kPreferConstantFrameRateName[]; extern const char kPreferConstantFrameRateDescription[]; +extern const char kMoreVideoCaptureBuffersName[]; +extern const char kMoreVideoCaptureBuffersDescription[]; + extern const char kForceControlFaceAeName[]; extern const char kForceControlFaceAeDescription[];
diff --git a/chrome/browser/history_clusters/BUILD.gn b/chrome/browser/history_clusters/BUILD.gn index ade260d7..b01fc5d3 100644 --- a/chrome/browser/history_clusters/BUILD.gn +++ b/chrome/browser/history_clusters/BUILD.gn
@@ -9,6 +9,7 @@ android_resources("java_resources") { sources = [ "java/res/drawable/ic_journeys.xml", + "java/res/layout/history_cluster.xml", "java/res/layout/history_cluster_visit.xml", "java/res/layout/history_clusters_activity_content.xml", "java/res/layout/history_clusters_toolbar.xml", @@ -21,6 +22,7 @@ sources = [ "java/src/org/chromium/chrome/browser/history_clusters/ClusterVisit.java", "java/src/org/chromium/chrome/browser/history_clusters/HistoryCluster.java", + "java/src/org/chromium/chrome/browser/history_clusters/HistoryClusterView.java", "java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersBridge.java", "java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersConstants.java", "java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java", @@ -50,9 +52,11 @@ "//content/public/android:content_java", "//third_party/androidx:androidx_annotation_annotation_java", "//third_party/androidx:androidx_appcompat_appcompat_java", + "//third_party/androidx:androidx_core_core_java", "//third_party/androidx:androidx_recyclerview_recyclerview_java", "//ui/android:ui_no_recycler_view_java", "//ui/android:ui_recycler_view_java", + "//ui/android:ui_utils_java", "//url:gurl_java", ]
diff --git a/chrome/browser/history_clusters/java/res/layout/history_cluster.xml b/chrome/browser/history_clusters/java/res/layout/history_cluster.xml new file mode 100644 index 0000000..31e8519 --- /dev/null +++ b/chrome/browser/history_clusters/java/res/layout/history_cluster.xml
@@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. --> + +<org.chromium.chrome.browser.history_clusters.HistoryClusterView + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> \ No newline at end of file
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClusterView.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClusterView.java new file mode 100644 index 0000000..3fc194f1 --- /dev/null +++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClusterView.java
@@ -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. + +package org.chromium.chrome.browser.history_clusters; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; + +import org.chromium.components.browser_ui.widget.selectable_list.SelectableItemView; + +class HistoryClusterView extends SelectableItemView<HistoryCluster> { + /** + * Constructor for inflating from XML. + */ + public HistoryClusterView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mEndButtonView.setVisibility(GONE); + } + + @Override + protected void onClick() {} + + void setLabel(String text) { + mTitleView.setText(text); + } + + void setIconDrawable(Drawable drawable) { + mStartIconView.setImageDrawable(drawable); + } +}
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java index 60dee36..d3d22e9f 100644 --- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java +++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java
@@ -109,6 +109,8 @@ mAdapter = new SimpleRecyclerViewAdapter(mModelList); mAdapter.registerType( ItemType.VISIT, this::buildVisitView, HistoryClustersViewBinder::bindVisitView); + mAdapter.registerType(ItemType.CLUSTER, this::buildClusterView, + HistoryClustersViewBinder::bindClusterView); LayoutInflater layoutInflater = LayoutInflater.from(mContext); mActivityContentView = (ViewGroup) layoutInflater.inflate( @@ -140,6 +142,13 @@ mActivityViewInflated = true; } + private View buildClusterView(ViewGroup parent) { + SelectableItemView<HistoryCluster> clusterView = + (SelectableItemView<HistoryCluster>) LayoutInflater.from(parent.getContext()) + .inflate(R.layout.history_cluster, parent, false); + return clusterView; + } + private View buildVisitView(ViewGroup parent) { SelectableItemView<ClusterVisit> itemView = (SelectableItemView<ClusterVisit>) LayoutInflater.from(parent.getContext())
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersItemProperties.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersItemProperties.java index 05d9491..7949611 100644 --- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersItemProperties.java +++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersItemProperties.java
@@ -20,14 +20,16 @@ new WritableObjectPropertyKey<>(); static final WritableObjectPropertyKey<Drawable> ICON_DRAWABLE = new WritableObjectPropertyKey<>(); + static final WritableObjectPropertyKey<String> LABEL = new WritableObjectPropertyKey<>(); static final WritableObjectPropertyKey<String> TITLE = new WritableObjectPropertyKey<>(); static final WritableObjectPropertyKey<String> URL = new WritableObjectPropertyKey<>(); - static final PropertyKey[] ALL_KEYS = {CLICK_HANDLER, ICON_DRAWABLE, TITLE, URL}; + static final PropertyKey[] ALL_KEYS = {CLICK_HANDLER, ICON_DRAWABLE, LABEL, TITLE, URL}; - @IntDef({HistoryClustersItemProperties.ItemType.VISIT}) + @IntDef({HistoryClustersItemProperties.ItemType.VISIT, ItemType.CLUSTER}) @Retention(RetentionPolicy.SOURCE) @interface ItemType { int VISIT = 1; + int CLUSTER = 2; } } \ No newline at end of file
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediator.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediator.java index c3a8e8e..fa304a49 100644 --- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediator.java +++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediator.java
@@ -29,6 +29,7 @@ import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.favicon.LargeIconBridge; import org.chromium.content_public.browser.LoadUrlParams; +import org.chromium.ui.UiUtils; import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.modelutil.MVCListAdapter.ListItem; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; @@ -141,7 +142,22 @@ } private void queryComplete(HistoryClustersResult result) { + boolean isQueryless = result.getQuery().isEmpty(); for (HistoryCluster cluster : result.getClusters()) { + if (isQueryless) { + PropertyModel clusterModel = + new PropertyModel(HistoryClustersItemProperties.ALL_KEYS); + clusterModel.set(HistoryClustersItemProperties.LABEL, cluster.getLabel()); + clusterModel.set(HistoryClustersItemProperties.CLICK_HANDLER, + (v) -> startSearch(cluster.getLabel())); + Drawable journeysDrawable = UiUtils.getTintedDrawable( + mContext, R.drawable.ic_journeys, R.color.default_icon_color_tint_list); + clusterModel.set(HistoryClustersItemProperties.ICON_DRAWABLE, journeysDrawable); + ListItem visitItem = new ListItem(ItemType.CLUSTER, clusterModel); + mModelList.add(visitItem); + continue; + } + for (ClusterVisit visit : cluster.getVisits()) { PropertyModel visitModel = new PropertyModel(HistoryClustersItemProperties.ALL_KEYS);
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersResult.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersResult.java index 3a2009c..7fc71258 100644 --- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersResult.java +++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersResult.java
@@ -23,4 +23,8 @@ public List<HistoryCluster> getClusters() { return mClusters; } + + public String getQuery() { + return mQuery; + } }
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersViewBinder.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersViewBinder.java index 4fe95b4..d3ef035e 100644 --- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersViewBinder.java +++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersViewBinder.java
@@ -51,4 +51,15 @@ } } } + + public static void bindClusterView(PropertyModel model, View view, PropertyKey key) { + HistoryClusterView clusterView = (HistoryClusterView) view; + if (key == HistoryClustersItemProperties.CLICK_HANDLER) { + clusterView.setOnClickListener(model.get(HistoryClustersItemProperties.CLICK_HANDLER)); + } else if (key == HistoryClustersItemProperties.ICON_DRAWABLE) { + clusterView.setIconDrawable(model.get(HistoryClustersItemProperties.ICON_DRAWABLE)); + } else if (key == HistoryClustersItemProperties.LABEL) { + clusterView.setLabel(model.get(HistoryClustersItemProperties.LABEL)); + } + } } \ No newline at end of file
diff --git a/chrome/browser/language/android/BUILD.gn b/chrome/browser/language/android/BUILD.gn index dbe69d9..c08e34a 100644 --- a/chrome/browser/language/android/BUILD.gn +++ b/chrome/browser/language/android/BUILD.gn
@@ -91,6 +91,7 @@ "java/res/layout/add_languages_main.xml", "java/res/layout/app_language_confirm_content.xml", "java/res/layout/app_language_prompt_content.xml", + "java/res/layout/app_language_prompt_more_languages.xml", "java/res/layout/app_language_prompt_row.xml", "java/res/layout/language_ask_prompt_content.xml", "java/res/layout/language_ask_prompt_row.xml",
diff --git a/chrome/browser/language/android/java/res/layout/app_language_prompt_content.xml b/chrome/browser/language/android/java/res/layout/app_language_prompt_content.xml index 7511eb8..ede770c 100644 --- a/chrome/browser/language/android/java/res/layout/app_language_prompt_content.xml +++ b/chrome/browser/language/android/java/res/layout/app_language_prompt_content.xml
@@ -43,8 +43,7 @@ android:src="@drawable/modern_toolbar_shadow" android:scaleType="fitXY" android:importantForAccessibility="no" - android:layout_gravity="top" - android:visibility="invisible" /> + android:layout_gravity="top" /> <ImageView android:id="@+id/bottom_shadow"
diff --git a/chrome/browser/language/android/java/res/layout/app_language_prompt_more_languages.xml b/chrome/browser/language/android/java/res/layout/app_language_prompt_more_languages.xml new file mode 100644 index 0000000..52e612e --- /dev/null +++ b/chrome/browser/language/android/java/res/layout/app_language_prompt_more_languages.xml
@@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2017 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. --> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/app_language_prompt_row" + style="@style/ListItemContainer" + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:orientation="horizontal"> + + <!-- Invisible but used for alignment of the TextView --> + <RadioButton + android:id="@+id/app_language_prompt_radiobutton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:visibility="invisible" + android:paddingEnd="8dp" /> + + <!-- TODO(https://crbug.com/1325465) Change wording --> + <TextView + android:id="@+id/more_languages_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/languages_select_other" + style="@style/TextAppearance.Button.Text.Blue" /> + +</LinearLayout>
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java index 2787863..9321a3d 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java
@@ -43,7 +43,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashSet; -import java.util.List; import java.util.Locale; /** @@ -60,11 +59,12 @@ private long mStartTime; /** Annotation for row item type. Either a LanguageItem or separator */ - @IntDef({ItemType.LANGUAGE, ItemType.SEPARATOR}) + @IntDef({ItemType.LANGUAGE, ItemType.SEPARATOR, ItemType.MORE_LANGUAGES}) @Retention(RetentionPolicy.SOURCE) private @interface ItemType { int LANGUAGE = 0; int SEPARATOR = 1; + int MORE_LANGUAGES = 2; } /** @@ -122,11 +122,14 @@ /** * Internal class for managing a list of languages in a RecyclerView. + * TODO(https://crbug.com/1325473) Refactor this to a separate file. */ - private class LanguageItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { - private List<LanguageItem> mTopLanguages; - private List<LanguageItem> mOtherLanguages; + protected static class LanguageItemAdapter + extends RecyclerView.Adapter<RecyclerView.ViewHolder> { + private ArrayList<LanguageItem> mTopLanguages; + private ArrayList<LanguageItem> mOtherLanguages; private LanguageItem mCurrentLanguage; + private boolean mShowOtherLanguages; /** * @param topLanguages - LanguageItems to appear at the top of the adapter list. @@ -142,17 +145,23 @@ @Override public int getItemViewType(int position) { - // The seperator is between top and other languages. - return (position == mTopLanguages.size()) ? ItemType.SEPARATOR : ItemType.LANGUAGE; + // The separator or "More languages" item is between top and other languages. + if (position != mTopLanguages.size()) return ItemType.LANGUAGE; + return mShowOtherLanguages ? ItemType.SEPARATOR : ItemType.MORE_LANGUAGES; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case ItemType.LANGUAGE: - View row = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.app_language_prompt_row, parent, false); - return new AppLanguagePromptRowViewHolder(row); + return new AppLanguagePromptRowViewHolder( + LayoutInflater.from(parent.getContext()) + .inflate(R.layout.app_language_prompt_row, parent, false)); + case ItemType.MORE_LANGUAGES: + return new MoreLanguagesRowViewHolder( + LayoutInflater.from(parent.getContext()) + .inflate(R.layout.app_language_prompt_more_languages, parent, + false)); case ItemType.SEPARATOR: return new SeparatorViewHolder( LayoutInflater.from(parent.getContext()) @@ -166,33 +175,46 @@ @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { - switch (getItemViewType(position)) { - case ItemType.LANGUAGE: - LanguageItem languageItem = getLanguageItemAt(position); - ((AppLanguagePromptRowViewHolder) holder) - .bindViewHolder(languageItem, languageItem.equals(mCurrentLanguage)); - break; - case ItemType.SEPARATOR: - // No binding necessary for the separator. - break; - default: - assert false : "No matching viewType"; + if (getItemViewType(position) == ItemType.LANGUAGE) { + LanguageItem languageItem = getLanguageItemAt(position); + ((AppLanguagePromptRowViewHolder) holder) + .bindViewHolder(languageItem, languageItem.equals(mCurrentLanguage)); } } /** + * Modify the LanguageItemAdapter to show the other languages in addition to the top + * languages. Can only called once. The other languages can not be hidden once shown. + */ + public void showOtherLanguages() { + mShowOtherLanguages = true; + notifyItemRemoved(mTopLanguages.size()); // Remove "More languages" item. + // Other languages plus a horizontal separator have been added. + notifyItemRangeInserted(mTopLanguages.size(), mOtherLanguages.size() + 1); + } + + /** * Set the currently selected LanguageItem based on the position. - * @param postion Offset of the LanguageItem to select. + * TODO(https://crbug.com/1325522) Refactor to not use notifyDataSetChanged. + * @param position Offset of the LanguageItem to select. */ public void setSelectedLanguage(int position) { mCurrentLanguage = getLanguageItemAt(position); notifyDataSetChanged(); } + /** + * Return the number of items in the list making room for the list separator or more + * languages item. + */ @Override public int getItemCount() { - // Sum of both lists + a separator. - return mTopLanguages.size() + mOtherLanguages.size() + 1; + // The top languages and a separator or "More languages" item are always shown. + int count = mTopLanguages.size() + 1; + if (mShowOtherLanguages) { + count += mOtherLanguages.size(); + } + return count; } public LanguageItem getSelectedLanguage() { @@ -203,7 +225,7 @@ return mTopLanguages.contains(mCurrentLanguage); } - private LanguageItem getLanguageItemAt(int position) { + protected LanguageItem getLanguageItemAt(int position) { if (position < mTopLanguages.size()) { return mTopLanguages.get(position); } else if (position > mTopLanguages.size()) { @@ -218,7 +240,7 @@ /** * Internal class representing an individual language row. */ - private class AppLanguagePromptRowViewHolder + private static class AppLanguagePromptRowViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private TextView mPrimaryNameTextView; private TextView mSecondaryNameTextView; @@ -268,9 +290,27 @@ } /** + * Internal class representing the "More languages" list item. + */ + private static class MoreLanguagesRowViewHolder + extends RecyclerView.ViewHolder implements View.OnClickListener { + MoreLanguagesRowViewHolder(View view) { + super(view); + view.setOnClickListener(this); + } + + @Override + public void onClick(View row) { + // TODO(https://crbug.com/1325471) Add meteric recording action. + LanguageItemAdapter adapter = (LanguageItemAdapter) getBindingAdapter(); + adapter.showOtherLanguages(); + } + } + + /** * Internal class representing the separator row. */ - private class SeparatorViewHolder extends RecyclerView.ViewHolder { + private static class SeparatorViewHolder extends RecyclerView.ViewHolder { SeparatorViewHolder(View view) { super(view); } @@ -298,7 +338,6 @@ R.layout.app_language_prompt_content, null, false); RecyclerView list = customView.findViewById(R.id.app_language_prompt_content_recycler_view); list.setAdapter(mAdapter); - list.setHasFixedSize(true); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mActivity); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); @@ -309,7 +348,7 @@ ImageView bottomShadow = customView.findViewById(R.id.bottom_shadow); list.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override - public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (recyclerView.canScrollVertically(-1)) { topShadow.setVisibility(View.VISIBLE); } else {
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialogTest.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialogTest.java index a666cbd..01158196 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialogTest.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialogTest.java
@@ -12,6 +12,7 @@ import org.chromium.base.LocaleUtils; import org.chromium.base.test.util.Batch; +import org.chromium.chrome.browser.language.AppLanguagePromoDialog.LanguageItemAdapter; import org.chromium.chrome.browser.language.settings.LanguageItem; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -110,4 +111,23 @@ Assert.assertFalse(AppLanguagePromoDialog.isOverrideLanguageOriginalSystemLanguage( FOLLOW_SYSTEM, LocaleUtils.forLanguageTag("zu"))); } + + // Test LanguageItemAdapter + @Test + @SmallTest + public void testLanguageItemAdapter() { + ArrayList<LanguageItem> topLanguages = new ArrayList<>(Arrays.asList(LANG_AF, LANG_AZ)); + ArrayList<LanguageItem> otherLanguages = + new ArrayList<>(Arrays.asList(LANG_EN_GB, LANG_EN_US, LANG_ZU)); + LanguageItem currentLanguage = LANG_AF; + LanguageItemAdapter adapter = + new LanguageItemAdapter(topLanguages, otherLanguages, currentLanguage); + + // Only the top languages plus "More languages" item are showing to start. + Assert.assertEquals(3, adapter.getItemCount()); + + adapter.showOtherLanguages(); + // All languages should now be showing. + Assert.assertEquals(6, adapter.getItemCount()); + } }
diff --git a/chrome/browser/metrics/sampled_out_client_id_saved_browsertest.cc b/chrome/browser/metrics/sampled_out_client_id_saved_browsertest.cc index 973cb3e..7292a82e 100644 --- a/chrome/browser/metrics/sampled_out_client_id_saved_browsertest.cc +++ b/chrome/browser/metrics/sampled_out_client_id_saved_browsertest.cc
@@ -96,17 +96,13 @@ // reporting (including first run users), or, // 2) They disabled metrics reporting. // TODO(crbug.com/1324877): Re-enable this test -#if defined(ADDRESS_SANITIZER) -#define MAYBE_ClientIdSaved DISABLED_ClientIdSaved -#else -#define MAYBE_ClientIdSaved ClientIdSaved -#endif IN_PROC_BROWSER_TEST_F(SampledOutClientIdSavedBrowserTest, - MAYBE_ClientIdSaved) { + DISABLED_ClientIdSaved) { // Verify that the client ID is initially empty. ASSERT_TRUE(metrics_service()->GetClientId().empty()); ASSERT_TRUE( local_state()->GetString(metrics::prefs::kMetricsClientID).empty()); + // TODO(crbug.com/1325166): Re-enable this test #if BUILDFLAG(IS_ANDROID) // On Android Chrome, since we have not yet consented to metrics reporting,
diff --git a/chrome/browser/navigation_predictor/anchor_element_preloader_browsertest.cc b/chrome/browser/navigation_predictor/anchor_element_preloader_browsertest.cc index ce8f2ba3..b8ad3a1 100644 --- a/chrome/browser/navigation_predictor/anchor_element_preloader_browsertest.cc +++ b/chrome/browser/navigation_predictor/anchor_element_preloader_browsertest.cc
@@ -1,7 +1,6 @@ // Copyright 2022 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/run_loop.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" @@ -22,7 +21,6 @@ #include "net/test/embedded_test_server/embedded_test_server.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/common/input/web_mouse_event.h" namespace { class AnchorElementPreloaderBrowserTest @@ -46,12 +44,6 @@ subresource_filter::SubresourceFilterBrowserTest::SetUp(); } - void SetUpCommandLine(base::CommandLine* command_line) override { - // Without this flag, clicks emitted by SimulateMouseClickOrTapElementWithId - // are suppressed in these tests. - command_line->AppendSwitch("allow-pre-commit-input"); - } - void SetUpOnMainThread() override { subresource_filter::SubresourceFilterBrowserTest::SetUpOnMainThread(); host_resolver()->ClearRules(); @@ -110,12 +102,16 @@ std::unique_ptr<base::HistogramTester> histogram_tester_; }; -IN_PROC_BROWSER_TEST_F(AnchorElementPreloaderBrowserTest, OneAnchor) { +IN_PROC_BROWSER_TEST_F(AnchorElementPreloaderBrowserTest, OneAnchorTest) { const GURL& url = GetTestURL("/one_anchor.html"); EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - content::SimulateMouseClickOrTapElementWithId( - browser()->tab_strip_model()->GetActiveWebContents(), "anchor1"); - + EXPECT_TRUE(content::ExecuteScript( + browser()->tab_strip_model()->GetActiveWebContents(), + R"( + const a = document.getElementById('anchor1'); + var e = new PointerEvent('pointerdown', {isPrimary: true}); + a.dispatchEvent(e); + )")); WaitForPreresolveCountForURL(1); EXPECT_EQ(1, preresolve_count_); ukm::SourceId ukm_source_id = browser() @@ -144,8 +140,13 @@ IN_PROC_BROWSER_TEST_F(AnchorElementPreloaderBrowserTest, InvalidHref) { const GURL& url = GetTestURL("/invalid_href_anchor.html"); EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - content::SimulateMouseClickOrTapElementWithId( - browser()->tab_strip_model()->GetActiveWebContents(), "anchor2"); + EXPECT_TRUE(content::ExecuteScript( + browser()->tab_strip_model()->GetActiveWebContents(), + R"( + const a = document.getElementById('anchor2'); + var e = new PointerEvent('pointerdown', {isPrimary: true}); + a.dispatchEvent(e); + )")); EXPECT_EQ(0, preresolve_count_); histogram_tester()->ExpectTotalCount( @@ -167,9 +168,15 @@ IN_PROC_BROWSER_TEST_F(AnchorElementPreloaderBrowserTest, DISABLED_IframeTest) { const GURL& url = GetTestURL("/iframe_anchor.html"); EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - content::SimulateMouseClickAt( - browser()->tab_strip_model()->GetActiveWebContents(), 0, - blink::WebMouseEvent::Button::kLeft, gfx::Point(200, 200)); + EXPECT_TRUE(content::ExecuteScript( + browser()->tab_strip_model()->GetActiveWebContents(), + R"( + const iframe = document.getElementById('iframe1'); + const iframe_doc = iframe.contentWindow.document; + const a = iframe_doc.getElementById('iframe_anchor'); + var e = new PointerEvent('pointerdown', {isPrimary: true}); + a.dispatchEvent(e); + )")); WaitForPreresolveCountForURL(1); EXPECT_EQ(1, preresolve_count_); @@ -202,8 +209,13 @@ prefetch::PreloadPagesState::kNoPreloading); const GURL& url = GetTestURL("/one_anchor.html"); EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - content::SimulateMouseClickOrTapElementWithId( - browser()->tab_strip_model()->GetActiveWebContents(), "anchor1"); + EXPECT_TRUE(content::ExecuteScript( + browser()->tab_strip_model()->GetActiveWebContents(), + R"( + const a = document.getElementById('anchor1'); + var e = new PointerEvent('pointerdown', {isPrimary: true}); + a.dispatchEvent(e); + )")); EXPECT_EQ(0, preresolve_count_); histogram_tester()->ExpectTotalCount( @@ -225,10 +237,13 @@ : public AnchorElementPreloaderBrowserTest { public: void SetFeatures() override { - feature_list_.InitAndEnableFeatureWithParameters( + feature_list_holdback_.InitAndEnableFeatureWithParameters( blink::features::kAnchorElementInteraction, {{"preconnect_holdback", "true"}}); } + + private: + base::test::ScopedFeatureList feature_list_holdback_; }; IN_PROC_BROWSER_TEST_F(AnchorElementPreloaderHoldbackBrowserTest, @@ -236,16 +251,15 @@ const GURL& url = GetTestURL("/one_anchor.html"); EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - content::SimulateMouseClickOrTapElementWithId( - browser()->tab_strip_model()->GetActiveWebContents(), "anchor1"); + EXPECT_TRUE(content::ExecuteScript( + browser()->tab_strip_model()->GetActiveWebContents(), + R"( + const a = document.getElementById('anchor1'); + var e = new PointerEvent('pointerdown', {isPrimary: true}); + a.dispatchEvent(e); + )")); EXPECT_EQ(0, preresolve_count_); - while ( - histogram_tester() - ->GetAllSamples(kPreloadingAnchorElementPreloaderPreloadingTriggered) - .empty()) { - base::RunLoop().RunUntilIdle(); - } histogram_tester()->ExpectTotalCount( kPreloadingAnchorElementPreloaderPreloadingTriggered, 1);
diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc index 79346fb..25fcf64 100644 --- a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc +++ b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc
@@ -4010,12 +4010,8 @@ wifi_credentials.set_wifi_password(wifi_password); // Automatically set up the Wi-Fi network for the user. - wifi_network_handler_->ConfigureWifiNetwork( - wifi_credentials, - base::BindOnce([](const absl::optional<std::string>& network_guid, - const std::string& error_message) { - // TODO(crisrael): Add metrics - })); + wifi_network_handler_->ConfigureWifiNetwork(wifi_credentials, + base::DoNothing()); } } return true;
diff --git a/chrome/browser/net/private_network_access_browsertest.cc b/chrome/browser/net/private_network_access_browsertest.cc index 5c466f4..b85cc81 100644 --- a/chrome/browser/net/private_network_access_browsertest.cc +++ b/chrome/browser/net/private_network_access_browsertest.cc
@@ -48,7 +48,7 @@ #include "services/network/public/cpp/url_loader_completion_status.h" #include "testing/gmock/include/gmock/gmock.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" namespace {
diff --git a/chrome/browser/notifications/non_persistent_notification_handler.cc b/chrome/browser/notifications/non_persistent_notification_handler.cc index fd8fa58..c402afd 100644 --- a/chrome/browser/notifications/non_persistent_notification_handler.cc +++ b/chrome/browser/notifications/non_persistent_notification_handler.cc
@@ -9,7 +9,9 @@ #include "build/build_config.h" #include "chrome/browser/notifications/notification_common.h" #include "chrome/browser/notifications/notification_permission_context.h" +#include "chrome/browser/permissions/notifications_engagement_service_factory.h" #include "chrome/browser/profiles/profile.h" +#include "components/permissions/features.h" #include "components/permissions/permission_uma_util.h" #include "components/permissions/permission_util.h" #include "content/public/browser/notification_event_dispatcher.h" @@ -62,6 +64,15 @@ &NonPersistentNotificationHandler::DidDispatchClickEvent, weak_ptr_factory_.GetWeakPtr(), profile, origin, notification_id, std::move(completed_closure))); + + if (base::FeatureList::IsEnabled( + permissions::features::kNotificationInteractionHistory)) { + auto* service = + NotificationsEngagementServiceFactory::GetForProfile(profile); + // This service might be missing for incognito profiles and in tests. + if (service) + service->RecordNotificationInteraction(origin); + } } void NonPersistentNotificationHandler::DidDispatchClickEvent(
diff --git a/chrome/browser/notifications/platform_notification_service_impl.cc b/chrome/browser/notifications/platform_notification_service_impl.cc index ebdc9212..17b9ed63 100644 --- a/chrome/browser/notifications/platform_notification_service_impl.cc +++ b/chrome/browser/notifications/platform_notification_service_impl.cc
@@ -226,6 +226,15 @@ permissions::PermissionUmaUtil::RecordPermissionUsage( ContentSettingsType::NOTIFICATIONS, profile_, nullptr, notification.origin_url()); + + if (base::FeatureList::IsEnabled( + permissions::features::kNotificationInteractionHistory)) { + auto* service = + NotificationsEngagementServiceFactory::GetForProfile(profile_); + // This service might be missing for incognito profiles and in tests. + if (service) + service->RecordNotificationDisplayed(notification.origin_url()); + } } void PlatformNotificationServiceImpl::DisplayPersistentNotification(
diff --git a/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc b/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc index 9ea7581..8a3649d 100644 --- a/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc +++ b/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc
@@ -537,14 +537,15 @@ : public PageContentAnnotationsServiceBrowserTest { public: PageContentAnnotationsServiceRemotePageEntitiesBrowserTest() { + // Make sure remote page metadata works without page content annotations + // enabled. scoped_feature_list_.InitWithFeaturesAndParameters( {{features::kOptimizationHints, {}}, - {features::kPageContentAnnotations, + {features::kRemotePageMetadata, { - {"write_to_history_service", "true"}, - {"fetch_remote_page_entities", "true"}, + {"persist_page_entities", "true"}, }}}, - /*disabled_features=*/{}); + /*disabled_features=*/{{features::kPageContentAnnotations}}); set_load_model_on_startup(false); } ~PageContentAnnotationsServiceRemotePageEntitiesBrowserTest() override = @@ -595,6 +596,62 @@ history::VisitContentModelAnnotations::Category("entity1", 50))); } +class PageContentAnnotationsServiceRemoteMetadataBrowserTest + : public PageContentAnnotationsServiceBrowserTest { + public: + PageContentAnnotationsServiceRemoteMetadataBrowserTest() { + // Make sure remote page metadata works without page content annotations + // enabled. + scoped_feature_list_.InitWithFeaturesAndParameters( + {{features::kOptimizationHints, {}}, + {features::kRemotePageMetadata, + { + {"persist_page_metadata", "true"}, + }}}, + /*disabled_features=*/{{features::kPageContentAnnotations}}); + set_load_model_on_startup(false); + } + ~PageContentAnnotationsServiceRemoteMetadataBrowserTest() override = default; + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(PageContentAnnotationsServiceRemoteMetadataBrowserTest, + StoresMetadataFromRemoteService) { + base::HistogramTester histogram_tester; + + GURL url(embedded_test_server()->GetURL("a.com", "/hello.html")); + + proto::PageEntitiesMetadata page_entities_metadata; + page_entities_metadata.set_alternative_title("alternative title"); + OptimizationMetadata metadata; + metadata.SetAnyMetadataForTesting(page_entities_metadata); + OptimizationGuideKeyedServiceFactory::GetForProfile(browser()->profile()) + ->AddHintForTesting(url, proto::PAGE_ENTITIES, metadata); + + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); + RetryForHistogramUntilCountReached( + &histogram_tester, + "OptimizationGuide.PageContentAnnotationsService." + "ContentAnnotationsStorageStatus", + 1); + + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.PageContentAnnotationsService." + "ContentAnnotationsStorageStatus", + PageContentAnnotationsStorageStatus::kSuccess, 1); + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.PageContentAnnotationsService." + "ContentAnnotationsStorageStatus.RemoteMetadata", + PageContentAnnotationsStorageStatus::kSuccess, 1); + + absl::optional<history::VisitContentAnnotations> got_content_annotations = + GetContentAnnotationsForURL(url); + ASSERT_TRUE(got_content_annotations.has_value()); + EXPECT_EQ(got_content_annotations->alternative_title, "alternative title"); +} + class PageContentAnnotationsServiceNoHistoryTest : public PageContentAnnotationsServiceBrowserTest { public:
diff --git a/chrome/browser/optimization_guide/page_content_annotations_service_factory.cc b/chrome/browser/optimization_guide/page_content_annotations_service_factory.cc index e95eff3..a0de82b 100644 --- a/chrome/browser/optimization_guide/page_content_annotations_service_factory.cc +++ b/chrome/browser/optimization_guide/page_content_annotations_service_factory.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/optimization_guide/page_content_annotations_service_factory.h" +#include "base/feature_list.h" #include "base/no_destructor.h" #include "base/task/sequenced_task_runner.h" #include "base/task/task_traits.h" @@ -25,11 +26,13 @@ namespace { bool ShouldEnablePageContentAnnotations() { - // Allow for the validation experiment and/or the Topics experiment to enable - // the PCAService without need to enable both features. + // Allow for the validation experiment, remote page metadata, or the Topics + // experiment to enable the PCAService without need to enable both features. return optimization_guide::features::IsPageContentAnnotationEnabled() || base::FeatureList::IsEnabled( optimization_guide::features::kPageContentAnnotationsValidation) || + base::FeatureList::IsEnabled( + optimization_guide::features::kRemotePageMetadata) || base::FeatureList::IsEnabled(blink::features::kBrowsingTopics); }
diff --git a/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc b/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc index 135a61a5..ebc30bf 100644 --- a/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
@@ -18,7 +18,7 @@ #include "content/public/test/web_contents_tester.h" #include "extensions/buildflags/buildflags.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "url/gurl.h" #if BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc index 432aaa5..ebccd89 100644 --- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc +++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
@@ -53,7 +53,7 @@ #include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_source.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "ui/gfx/geometry/size.h" #include "url/gurl.h" #include "url/url_constants.h"
diff --git a/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.cc index 8a8071be..368f2387a 100644 --- a/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/prefetch_proxy_page_load_metrics_observer.cc
@@ -55,11 +55,13 @@ return CONTINUE_OBSERVING; } -// TODO(https://crbug.com/1317494): Audit and use appropriate policy. page_load_metrics::PageLoadMetricsObserver::ObservePolicy PrefetchProxyPageLoadMetricsObserver::OnFencedFramesStart( content::NavigationHandle* navigation_handle, const GURL& currently_committed_url) { + // All observing events are preprocessed by PageLoadTracker so that the + // outermost page's observer instance sees gathered information. So, the + // instance for FencedFrames doesn't need to do anything. return STOP_OBSERVING; }
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc index b710fce..1fbf2e80 100644 --- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc +++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -99,8 +99,8 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/user_agent/user_agent_metadata.h" -#include "third_party/blink/public/mojom/use_counter/css_property_id.mojom.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "ui/gfx/geometry/size.h" #include "url/gurl.h" @@ -577,7 +577,9 @@ << "Recorded metrics: " << GetRecordedPageLoadMetricNames(); } -IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, MainFrameViewportRect) { +// TODO(crbug.com/1324432): Re-enable this test +IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest, + DISABLED_MainFrameViewportRect) { ASSERT_TRUE(embedded_test_server()->Start()); GURL url = embedded_test_server()->GetURL( "a.com", "/scroll/scrollable_page_with_content.html"); @@ -661,7 +663,8 @@ IN_PROC_BROWSER_TEST_F( PageLoadMetricsBrowserTest, - NonZeroMainFrameScrollOffset_NestedSameOriginFrame_MainFrameIntersection) { + // TODO(crbug.com/1324760): Re-enable this test + DISABLED_NonZeroMainFrameScrollOffset_NestedSameOriginFrame_MainFrameIntersection) { ASSERT_TRUE(embedded_test_server()->Start()); GURL url = embedded_test_server()->GetURL( "a.com", "/scroll/scrollable_page_with_content.html");
diff --git a/chrome/browser/permissions/permission_update_message_controller_android.cc b/chrome/browser/permissions/permission_update_message_controller_android.cc index 9596e06f..50f93b2 100644 --- a/chrome/browser/permissions/permission_update_message_controller_android.cc +++ b/chrome/browser/permissions/permission_update_message_controller_android.cc
@@ -61,6 +61,13 @@ int title_id, int description_id, PermissionUpdatedCallback callback) { + // crbug.com/1319880: Some permission clients tend to request to re-prompt + // more than expected. + for (auto& delegate : message_delegates_) { + if (delegate->GetTitleId() == title_id) { + return; + } + } auto delegate = std::make_unique<PermissionUpdateMessageDelegate>( &GetWebContents(), required_android_permissions, optional_android_permissions, content_settings_types, icon_id, title_id,
diff --git a/chrome/browser/permissions/permission_update_message_controller_android_unittest.cc b/chrome/browser/permissions/permission_update_message_controller_android_unittest.cc index 2b1d5941..f4dc7dd 100644 --- a/chrome/browser/permissions/permission_update_message_controller_android_unittest.cc +++ b/chrome/browser/permissions/permission_update_message_controller_android_unittest.cc
@@ -23,7 +23,7 @@ PermissionUpdateMessageController* GetController() { return controller_; } - void Show(base::OnceCallback<void(bool)> callback) { + void ShowLocation(base::OnceCallback<void(bool)> callback) { EXPECT_CALL(message_dispatcher_bridge_, EnqueueMessage); GetController()->ShowMessageInternal( {}, {}, {}, IDR_ANDROID_INFOBAR_GEOLOCATION, @@ -31,6 +31,20 @@ IDS_MESSAGE_MISSING_LOCATION_PERMISSION_TEXT, std::move(callback)); } + void ShowMedia(base::OnceCallback<void(bool)> callback) { + ShowMedia(std::move(callback), true); + } + + void ShowMedia(base::OnceCallback<void(bool)> callback, bool expect_qneueue) { + if (expect_qneueue) + EXPECT_CALL(message_dispatcher_bridge_, EnqueueMessage); + GetController()->ShowMessageInternal( + {}, {}, {}, IDR_ANDROID_INFOBAR_GEOLOCATION, + IDS_MESSAGE_MISSING_MICROPHONE_CAMERA_PERMISSION_TITLE, + IDS_MESSAGE_MISSING_MICROPHONE_CAMERA_PERMISSIONS_TEXT, + std::move(callback)); + } + size_t GetMessageDelegatesSize() { return GetController()->message_delegates_.size(); } @@ -86,9 +100,9 @@ OnMessageDismissedByPrimaryAction) { base::MockOnceCallback<void(bool)> mock_permission_update_callback1; base::MockOnceCallback<void(bool)> mock_permission_update_callback2; - Show(mock_permission_update_callback1.Get()); + ShowLocation(mock_permission_update_callback1.Get()); EXPECT_EQ(1u, GetMessageDelegatesSize()); - Show(mock_permission_update_callback2.Get()); + ShowMedia(mock_permission_update_callback2.Get()); EXPECT_EQ(2u, GetMessageDelegatesSize()); EXPECT_CALL(mock_permission_update_callback1, Run(false)); @@ -111,7 +125,7 @@ // In this case, dismiss callback is invoked when the controller is trying // to delete the message delegate. The dismiss reason should be UNKNOWN. base::MockOnceCallback<void(bool)> mock_permission_update_callback1; - Show(mock_permission_update_callback1.Get()); + ShowLocation(mock_permission_update_callback1.Get()); EXPECT_EQ(1u, GetMessageDelegatesSize()); SetPermissionResultTriggeredSynchronously(); EXPECT_CALL(mock_permission_update_callback1, Run(true)); @@ -120,7 +134,7 @@ EXPECT_EQ(0u, GetMessageDelegatesSize()); base::MockOnceCallback<void(bool)> mock_permission_update_callback2; - Show(mock_permission_update_callback2.Get()); + ShowMedia(mock_permission_update_callback2.Get()); EXPECT_EQ(1u, GetMessageDelegatesSize()); SetPermissionResultTriggeredSynchronously(); EXPECT_CALL(mock_permission_update_callback2, Run(false)); @@ -128,3 +142,23 @@ OnPermissionGranted(false); EXPECT_EQ(0u, GetMessageDelegatesSize()); } + +TEST_F(PermissionUpdateMessageControllerAndroidTest, + OnEnqueuingDuplciatedMessage) { + base::MockOnceCallback<void(bool)> mock_permission_update_callback1; + base::MockOnceCallback<void(bool)> mock_permission_update_callback2; + ShowMedia(mock_permission_update_callback1.Get()); + EXPECT_EQ(1u, GetMessageDelegatesSize()); + ShowMedia(mock_permission_update_callback2.Get(), false); + EXPECT_EQ(1u, GetMessageDelegatesSize()); + EXPECT_CALL(mock_permission_update_callback1, Run(false)); + EXPECT_CALL(mock_permission_update_callback2, Run(false)).Times(0); + + // Message is dismissed first by primary action, and then permission update + // callback is invoked. In this case, the dismiss reason should be + // PRIMARY_ACTION. + ExpectDismiss(messages::DismissReason::PRIMARY_ACTION); + DismissedByPrimaryAction(); + OnPermissionGranted(false); + EXPECT_EQ(0u, GetMessageDelegatesSize()); +}
diff --git a/chrome/browser/permissions/permission_update_message_delegate_android.cc b/chrome/browser/permissions/permission_update_message_delegate_android.cc index 45fd088a..ba07441 100644 --- a/chrome/browser/permissions/permission_update_message_delegate_android.cc +++ b/chrome/browser/permissions/permission_update_message_delegate_android.cc
@@ -38,6 +38,7 @@ base::BindOnce(&PermissionUpdateMessageDelegate::HandleDismissCallback, base::Unretained(this))); + title_id_ = title_id; message_->SetTitle(l10n_util::GetStringUTF16(title_id)); message_->SetDescription(l10n_util::GetStringUTF16(description_id)); message_->SetPrimaryButtonText( @@ -62,6 +63,10 @@ std::move(delete_callback_).Run(this); } +int PermissionUpdateMessageDelegate::GetTitleId() { + return title_id_; +} + void PermissionUpdateMessageDelegate::HandlePrimaryActionCallback() { permission_update_requester_->RequestPermissions(); }
diff --git a/chrome/browser/permissions/permission_update_message_delegate_android.h b/chrome/browser/permissions/permission_update_message_delegate_android.h index b775f9bd..7477a57 100644 --- a/chrome/browser/permissions/permission_update_message_delegate_android.h +++ b/chrome/browser/permissions/permission_update_message_delegate_android.h
@@ -40,6 +40,7 @@ ~PermissionUpdateMessageDelegate(); void OnPermissionResult(bool all_permissions_granted); + int GetTitleId(); private: friend class PermissionUpdateMessageControllerAndroidTest; @@ -53,6 +54,7 @@ base::OnceCallback<void(PermissionUpdateMessageDelegate*)> delete_callback_; std::unique_ptr<PermissionUpdateRequester> permission_update_requester_; std::unique_ptr<messages::MessageWrapper> message_; + int title_id_; }; #endif // CHROME_BROWSER_PERMISSIONS_PERMISSION_UPDATE_MESSAGE_DELEGATE_ANDROID_H_
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc index 0e1f51bb..bef51f0e 100644 --- a/chrome/browser/prerender/prerender_browsertest.cc +++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -21,7 +21,7 @@ #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #if BUILDFLAG(IS_ANDROID) #include "chrome/test/base/android/android_browser_test.h"
diff --git a/chrome/browser/printing/print_browsertest.cc b/chrome/browser/printing/print_browsertest.cc index 8be3c31..2fa38c2 100644 --- a/chrome/browser/printing/print_browsertest.cc +++ b/chrome/browser/printing/print_browsertest.cc
@@ -339,7 +339,7 @@ uint32_t expected_rendered_page_count_ = 1; uint32_t rendered_page_count_ = 0; - const bool wait_for_loaded_ = false; + const bool wait_for_loaded_; raw_ptr<content::WebContents> preview_dialog_ = nullptr; base::RunLoop* run_loop_ = nullptr; }; @@ -3525,7 +3525,7 @@ // TODO(crbug.com/1256506): Re-enable test on Windows // TODO(crbug.com/1321689): Re-enable test on Mac #if !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_MAC) -IN_PROC_BROWSER_TEST_P(ContentAnalysisPrintBrowserTest, PrintNow) { +IN_PROC_BROWSER_TEST_P(ContentAnalysisPrintBrowserTest, DISABLED_PrintNow) { ASSERT_TRUE(embedded_test_server()->Started()); GURL url(embedded_test_server()->GetURL("/printing/test1.html")); ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
diff --git a/chrome/browser/privacy_budget/privacy_budget_browsertest.cc b/chrome/browser/privacy_budget/privacy_budget_browsertest.cc index ee44b266..fbc4a852 100644 --- a/chrome/browser/privacy_budget/privacy_budget_browsertest.cc +++ b/chrome/browser/privacy_budget/privacy_budget_browsertest.cc
@@ -59,7 +59,7 @@ #include "third_party/blink/public/common/privacy_budget/identifiability_study_settings.h" #include "third_party/blink/public/common/privacy_budget/identifiable_surface.h" #include "third_party/blink/public/common/privacy_budget/identifiable_token.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "url/gurl.h" class Profile;
diff --git a/chrome/browser/profiles/profile_avatar_icon_util.cc b/chrome/browser/profiles/profile_avatar_icon_util.cc index d315b90..0876cb9 100644 --- a/chrome/browser/profiles/profile_avatar_icon_util.cc +++ b/chrome/browser/profiles/profile_avatar_icon_util.cc
@@ -120,24 +120,16 @@ POSITION_BOTTOM_CENTER, }; - enum AvatarBorder { - BORDER_NONE, - BORDER_NORMAL, - BORDER_ETCHED, - }; - AvatarImageSource(gfx::ImageSkia avatar, const gfx::Size& canvas_size, int width, AvatarPosition position, - AvatarBorder border, profiles::AvatarShape shape); AvatarImageSource(gfx::ImageSkia avatar, const gfx::Size& canvas_size, int width, - AvatarPosition position, - AvatarBorder border); + AvatarPosition position); AvatarImageSource(const AvatarImageSource&) = delete; AvatarImageSource& operator=(const AvatarImageSource&) = delete; @@ -153,7 +145,6 @@ const int width_; const int height_; const AvatarPosition position_; - const AvatarBorder border_; const profiles::AvatarShape shape_; }; @@ -161,14 +152,12 @@ const gfx::Size& canvas_size, int width, AvatarPosition position, - AvatarBorder border, profiles::AvatarShape shape) : gfx::CanvasImageSource(canvas_size), canvas_size_(canvas_size), width_(width), height_(GetScaledAvatarHeightForWidth(width, avatar)), position_(position), - border_(border), shape_(shape) { avatar_ = gfx::ImageSkiaOperations::CreateResizedImage( avatar, skia::ImageOperations::RESIZE_BEST, @@ -178,13 +167,11 @@ AvatarImageSource::AvatarImageSource(gfx::ImageSkia avatar, const gfx::Size& canvas_size, int width, - AvatarPosition position, - AvatarBorder border) + AvatarPosition position) : AvatarImageSource(avatar, canvas_size, width, position, - border, profiles::SHAPE_SQUARE) {} AvatarImageSource::~AvatarImageSource() { @@ -224,73 +211,6 @@ #endif canvas->DrawImageInt(avatar_, x, y); - - // The border should be square. - int border_size = std::max(width_, height_); - // Reset the x and y for the square border. - x = (canvas_size_.width() - border_size) / 2; - y = (canvas_size_.height() - border_size) / 2; - - if (border_ == BORDER_NORMAL) { - // Draw a gray border on the inside of the avatar. - SkColor border_color = SkColorSetARGB(83, 0, 0, 0); - - // Offset the rectangle by a half pixel so the border is drawn within the - // appropriate pixels no matter the scale factor. Subtract 1 from the right - // and bottom sizes to specify the endpoints, yielding -0.5. - SkPath path; - path.addRect(SkFloatToScalar(x + 0.5f), // left - SkFloatToScalar(y + 0.5f), // top - SkFloatToScalar(x + border_size - 0.5f), // right - SkFloatToScalar(y + border_size - 0.5f)); // bottom - - cc::PaintFlags flags; - flags.setColor(border_color); - flags.setStyle(cc::PaintFlags::kStroke_Style); - flags.setStrokeWidth(SkIntToScalar(1)); - - canvas->DrawPath(path, flags); - } else if (border_ == BORDER_ETCHED) { - // Give the avatar an etched look by drawing a highlight on the bottom and - // right edges. - SkColor shadow_color = SkColorSetARGB(83, 0, 0, 0); - SkColor highlight_color = SkColorSetARGB(96, 255, 255, 255); - - cc::PaintFlags flags; - flags.setStyle(cc::PaintFlags::kStroke_Style); - flags.setStrokeWidth(SkIntToScalar(1)); - - SkPath path; - - // Left and top shadows. To support higher scale factors than 1, position - // the orthogonal dimension of each line on the half-pixel to separate the - // pixel. For a vertical line, this means adding 0.5 to the x-value. - path.moveTo(SkFloatToScalar(x + 0.5f), SkIntToScalar(y + height_)); - - // Draw up to the top-left. Stop with the y-value at a half-pixel. - path.rLineTo(SkIntToScalar(0), SkFloatToScalar(-height_ + 0.5f)); - - // Draw right to the top-right, stopping within the last pixel. - path.rLineTo(SkFloatToScalar(width_ - 0.5f), SkIntToScalar(0)); - - flags.setColor(shadow_color); - canvas->DrawPath(path, flags); - - path.reset(); - - // Bottom and right highlights. Note that the shadows own the shared corner - // pixels, so reduce the sizes accordingly. - path.moveTo(SkIntToScalar(x + 1), SkFloatToScalar(y + height_ - 0.5f)); - - // Draw right to the bottom-right. - path.rLineTo(SkFloatToScalar(width_ - 1.5f), SkIntToScalar(0)); - - // Draw up to the top-right. - path.rLineTo(SkIntToScalar(0), SkFloatToScalar(-height_ + 1.5f)); - - flags.setColor(highlight_color); - canvas->DrawPath(path, flags); - } } class ImageWithBackgroundSource : public gfx::CanvasImageSource { @@ -373,44 +293,32 @@ } gfx::Image GetSizedAvatarIcon(const gfx::Image& image, - bool is_rectangle, int width, int height, AvatarShape shape) { - if (!is_rectangle && image.Height() <= height) - return image; - gfx::Size size(width, height); - // Source for a centered, sized icon. GAIA images get a border. + // Source for a centered, sized icon. std::unique_ptr<gfx::ImageSkiaSource> source( new AvatarImageSource(*image.ToImageSkia(), size, std::min(width, height), - AvatarImageSource::POSITION_CENTER, - AvatarImageSource::BORDER_NONE, shape)); + AvatarImageSource::POSITION_CENTER, shape)); return gfx::Image(gfx::ImageSkia(std::move(source), size)); } -gfx::Image GetSizedAvatarIcon(const gfx::Image& image, - bool is_rectangle, - int width, - int height) { - return GetSizedAvatarIcon(image, is_rectangle, width, height, - profiles::SHAPE_SQUARE); +gfx::Image GetSizedAvatarIcon(const gfx::Image& image, int width, int height) { + return GetSizedAvatarIcon(image, width, height, profiles::SHAPE_SQUARE); } -gfx::Image GetAvatarIconForWebUI(const gfx::Image& image, - bool is_rectangle) { - return GetSizedAvatarIcon(image, is_rectangle, kAvatarIconSize, - kAvatarIconSize); +gfx::Image GetAvatarIconForWebUI(const gfx::Image& image) { + return GetSizedAvatarIcon(image, kAvatarIconSize, kAvatarIconSize); } gfx::Image GetAvatarIconForTitleBar(const gfx::Image& image, - bool is_gaia_image, int dst_width, int dst_height) { // The image requires no border or resizing. - if (!is_gaia_image && image.Height() <= kAvatarIconSize) + if (image.Height() <= kAvatarIconSize) return image; int size = std::min({kAvatarIconSize, dst_width, dst_height}); @@ -420,9 +328,7 @@ // with an etched border (for GAIA images). std::unique_ptr<gfx::ImageSkiaSource> source( new AvatarImageSource(*image.ToImageSkia(), dst_size, size, - AvatarImageSource::POSITION_BOTTOM_CENTER, - is_gaia_image ? AvatarImageSource::BORDER_ETCHED - : AvatarImageSource::BORDER_NONE)); + AvatarImageSource::POSITION_BOTTOM_CENTER)); return gfx::Image(gfx::ImageSkia(std::move(source), dst_size)); } @@ -441,9 +347,8 @@ // Get a higher res than 16px so it looks good after cropping to a circle. gfx::Image icon = entry->GetAvatarIcon(kAvatarIconSize, /*download_high_res=*/false); - return profiles::GetSizedAvatarIcon(icon, /*is_rectangle=*/true, - kMenuAvatarIconSize, kMenuAvatarIconSize, - profiles::SHAPE_CIRCLE); + return profiles::GetSizedAvatarIcon( + icon, kMenuAvatarIconSize, kMenuAvatarIconSize, profiles::SHAPE_CIRCLE); } #endif
diff --git a/chrome/browser/profiles/profile_avatar_icon_util.h b/chrome/browser/profiles/profile_avatar_icon_util.h index e7256c8..4531074b 100644 --- a/chrome/browser/profiles/profile_avatar_icon_util.h +++ b/chrome/browser/profiles/profile_avatar_icon_util.h
@@ -69,24 +69,18 @@ // done on the width/height so make sure they're reasonable values; in the // range of 16-256 is probably best. gfx::Image GetSizedAvatarIcon(const gfx::Image& image, - bool is_rectangle, int width, int height, AvatarShape shape); -gfx::Image GetSizedAvatarIcon(const gfx::Image& image, - bool is_rectangle, - int width, - int height); +gfx::Image GetSizedAvatarIcon(const gfx::Image& image, int width, int height); // Returns a version of |image| suitable for use in WebUI. -gfx::Image GetAvatarIconForWebUI(const gfx::Image& image, - bool is_rectangle); +gfx::Image GetAvatarIconForWebUI(const gfx::Image& image); // Returns a version of |image| suitable for use in title bars. The returned // image is scaled to fit |dst_width| and |dst_height|. gfx::Image GetAvatarIconForTitleBar(const gfx::Image& image, - bool is_rectangle, int dst_width, int dst_height);
diff --git a/chrome/browser/profiles/profile_avatar_icon_util_unittest.cc b/chrome/browser/profiles/profile_avatar_icon_util_unittest.cc index 1eff1ea..b49e5b0 100644 --- a/chrome/browser/profiles/profile_avatar_icon_util_unittest.cc +++ b/chrome/browser/profiles/profile_avatar_icon_util_unittest.cc
@@ -33,41 +33,21 @@ } TEST(ProfileInfoUtilTest, SizedMenuIcon) { - // Test that an avatar icon isn't changed. - const gfx::Image& profile_image( - ui::ResourceBundle::GetSharedInstance().GetImageNamed( - IDR_PROFILE_AVATAR_0)); - gfx::Image result = - profiles::GetSizedAvatarIcon(profile_image, false, 50, 50); - - EXPECT_FALSE(gfx::test::IsEmpty(result)); - EXPECT_TRUE(gfx::test::AreImagesEqual(profile_image, result)); - - // Test that a rectangular picture (e.g., GAIA image) is changed. gfx::Image rect_picture(gfx::test::CreateImage()); gfx::Size size(30, 20); - gfx::Image result2 = profiles::GetSizedAvatarIcon( - rect_picture, true, size.width(), size.height()); + gfx::Image result = + profiles::GetSizedAvatarIcon(rect_picture, size.width(), size.height()); - VerifyScaling(result2, size); + VerifyScaling(result, size); } TEST(ProfileInfoUtilTest, WebUIIcon) { - // Test that an avatar icon isn't changed. - const gfx::Image& profile_image( - ui::ResourceBundle::GetSharedInstance().GetImageNamed( - IDR_PROFILE_AVATAR_0)); - gfx::Image result = profiles::GetAvatarIconForWebUI(profile_image, false); - EXPECT_FALSE(gfx::test::IsEmpty(result)); - EXPECT_TRUE(gfx::test::AreImagesEqual(profile_image, result)); - - // Test that a rectangular picture is changed. gfx::Image rect_picture(gfx::test::CreateImage()); gfx::Size size(profiles::kAvatarIconSize, profiles::kAvatarIconSize); - gfx::Image result2 = profiles::GetAvatarIconForWebUI(rect_picture, true); + gfx::Image result = profiles::GetAvatarIconForWebUI(rect_picture); - VerifyScaling(result2, size); + VerifyScaling(result, size); } TEST(ProfileInfoUtilTest, TitleBarIcon) { @@ -78,19 +58,10 @@ const gfx::Image& profile_image( ui::ResourceBundle::GetSharedInstance().GetImageNamed( IDR_PROFILE_AVATAR_0)); - gfx::Image result = profiles::GetAvatarIconForTitleBar( - profile_image, false, width, height); + gfx::Image result = + profiles::GetAvatarIconForTitleBar(profile_image, width, height); EXPECT_FALSE(gfx::test::IsEmpty(result)); EXPECT_TRUE(gfx::test::AreImagesEqual(profile_image, result)); - - // Test that a rectangular picture is changed. - gfx::Image rect_picture(gfx::test::CreateImage()); - - gfx::Size size(width, height); - gfx::Image result2 = profiles::GetAvatarIconForTitleBar( - rect_picture, true, width, height); - - VerifyScaling(result2, size); } } // namespace
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc index fdad390f..7747bd9 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -594,8 +594,7 @@ int target_dip_height = icon.Height(); gfx::CalculateFaviconTargetSize(&target_dip_width, &target_dip_height); gfx::Image sized_icon = profiles::GetSizedAvatarIcon( - icon, true /* is_rectangle */, target_dip_width, target_dip_height, - profiles::SHAPE_CIRCLE); + icon, target_dip_width, target_dip_height, profiles::SHAPE_CIRCLE); menu->SetIcon(menu->GetItemCount() - 1, ui::ImageModel::FromImage(sized_icon)); }
diff --git a/chrome/browser/resources/apc_internals/OWNERS b/chrome/browser/resources/apc_internals/OWNERS index 3b8a8be5..3eed6932 100644 --- a/chrome/browser/resources/apc_internals/OWNERS +++ b/chrome/browser/resources/apc_internals/OWNERS
@@ -1,2 +1,3 @@ +jkeitel@google.com treib@chromium.org vizcay@google.com
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 18db96e..b584ebf 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
@@ -235,5 +235,6 @@ BrailleCommandHandler.instance_; BridgeHelper.registerHandler( - BridgeTargets.BRAILLE_COMMAND_HANDLER, BridgeActions.SET_ENABLED, + BridgeConstants.BrailleCommandHandler.TARGET, + BridgeConstants.BrailleCommandHandler.Action.SET_ENABLED, enabled => BrailleCommandHandler.setEnabled(enabled));
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js index 4bac26f..bda84b7 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js
@@ -15,13 +15,9 @@ goog.require('LibLouis.FormType'); goog.require('Spannable'); -/** - * Attached to the value region of a braille spannable. - */ +/** Attached to the value region of a braille spannable. */ ValueSpan = class { - /** - * @param {number} offset The offset of the span into the value. - */ + /** @param {number} offset The offset of the span into the value. */ constructor(offset) { /** * The offset of the span into the value. @@ -53,12 +49,8 @@ ValueSpan, 'ValueSpan', ValueSpan.fromJson, ValueSpan.prototype.toJson); -/** - * Attached to the selected text within a value. - */ -ValueSelectionSpan = class { - constructor() {} -}; +/** Attached to the selected text within a value. */ +ValueSelectionSpan = class {}; Spannable.registerStatelessSerializableSpan( @@ -78,13 +70,9 @@ }; -/** - * Indicates a text form during translation in Liblouis. - */ +/** Indicates a text form during translation in Liblouis. */ BrailleTextStyleSpan = class { - /** - * @param {LibLouis.FormType} formType - */ + /** @param {LibLouis.FormType} formType */ constructor(formType) { /** @type {LibLouis.FormType} */ this.formType = formType;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js index f9115da6..19f262b 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js
@@ -38,20 +38,7 @@ if (ChromeVoxState.instance) { throw 'Trying to create two instances of singleton ChromeVoxState.'; } - const backgroundWindow = chrome.extension.getBackgroundPage(); - // Only install the singleton instance if we are within the background page - // context. Otherwise, take the instance from the background page (e.g. for - // the panel page). - if (backgroundWindow === window) { - ChromeVoxState.instance = this; - } else { - Object.defineProperty(ChromeVoxState, 'instance', { - get: () => { - return backgroundWindow.ChromeVoxState.instance; - } - }); - return; - } + ChromeVoxState.instance = this; /** @private {!Array<!chrome.accessibilityPrivate.ScreenRect>} */ this.focusBounds_ = [];
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 8c92348..642e01c 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
@@ -303,9 +303,24 @@ Msgs.getMsg('announce_install_talkback'))); ChromeVox.tts.speak( Msgs.getMsg('announce_install_talkback'), QueueMode.FLUSH); + } else if ( + response === + chrome.accessibilityPrivate.SetNativeChromeVoxResponse + .NEED_DEPRECATION_CONFIRMATION) { + ChromeVox.braille.write(NavBraille.fromText( + Msgs.getMsg('announce_talkback_deprecation'))); + ChromeVox.tts.speak( + Msgs.getMsg('announce_talkback_deprecation'), + QueueMode.FLUSH); } }); break; + case 'showTalkBackKeyboardShortcuts': + chrome.tabs.create({ + url: + 'https://support.google.com/accessibility/android/answer/6110948', + }); + return false; case 'showTtsSettings': chrome.accessibilityPrivate.openSettingsSubpage( 'manageAccessibility/tts');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js index 94981383e..a101d22 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js
@@ -45,8 +45,8 @@ */ async setEnabled(enabled) { return BridgeHelper.sendMessage( - BridgeTargets.BRAILLE_COMMAND_HANDLER, BridgeActions.SET_ENABLED, - enabled); + BridgeConstants.BrailleCommandHandler.TARGET, + BridgeConstants.BrailleCommandHandler.Action.SET_ENABLED, enabled); }, };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_constants.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_constants.js index cc9960d..c0c62b2d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_constants.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_constants.js
@@ -13,7 +13,6 @@ /** @enum {string} */ BridgeTargets = { - BRAILLE_COMMAND_HANDLER: 'BrailleCommandHandler', CHROMEVOX_BACKGROUND: 'ChromeVoxBackground', CHROMEVOX_PREFS: 'ChromeVoxPrefs', CHROMEVOX_STATE: 'ChromeVoxState', @@ -42,6 +41,15 @@ REFRESH_BRAILLE_TABLE: 'refreshBrailleTable', }, }, + + BrailleCommandHandler: { + /** @public {BridgeTarget} */ + TARGET: 'BrailleCommandHandler', + /** @enum {string} */ + Action: { + SET_ENABLED: 'setEnabled', + }, + }, }; /** @@ -80,6 +88,8 @@ /** * The action that the message is requesting be performed. - * @typedef {BridgeActions|BridgeConstants.BrailleBackground.Action} + * @typedef {BridgeActions | + * BridgeConstants.BrailleBackground.Action | + * BridgeConstants.BrailleCommandHandler.Action} */ BridgeAction;
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 aa8a31e..b58a24d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_map.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/key_map.js
@@ -743,6 +743,10 @@ sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.OEM_6]}} }, { + command: 'showTalkBackKeyboardShortcuts', + sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.A, KeyCode.K]}} + }, + { command: 'forceClickOnCurrentItem', sequence: {cvoxModifier: true, keys: {keyCode: [KeyCode.SPACE]}, doubleTap: true}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js index 8664909c..d698a997 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js
@@ -10,7 +10,6 @@ goog.require('BrailleKeyCommand'); goog.require('BrailleKeyEvent'); goog.require('ChromeVox'); -goog.require('ChromeVoxState'); goog.require('KeySequence'); goog.require('LibLouis'); goog.require('Msgs');
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp b/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp index 3018b304..c7a634cf 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp +++ b/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
@@ -3384,4 +3384,7 @@ <message desc="Spoken message asking users to install the Accessibility Suite app from the Play Store when users tried to turn on Talkback without installing Accessibility Suite." name="IDS_CHROMEVOX_ANNOUNCE_INSTALL_TALKBACK" is_accessibility_with_no_ui="true"> TalkBack is currently not installed. Please install Android AccessibilitySuite through Play Store and try again. </message> + <message desc="Spoken message notifying users that using TalkBack on Chromebook is no longer supported and keyboard shortcut are no longer customized for Chromebooks." name="IDS_CHROMEVOX_ANNOUNCE_TALKBACK_DEPRECATION" is_accessibility_with_no_ui="true"> + TalkBack no longer provides customization for Chromebooks. You can still use it, but use TalkBack default keyboard shortcuts. Press Search+A, then K to see available shortcuts. If you still want to use TalkBack, press the command again. + </message> </grit-part>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.js b/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.js index 81579b6..5a075e1 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.js +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_related_info.js
@@ -199,6 +199,12 @@ * Handles event when animation webview cannot be loaded. */ onWebViewErrorOccurred(details) { + if (details && details.error == 'net::ERR_ABORTED') { + // Retry triggers net::ERR_ABORTED, so ignore it. + // TODO(b/232592745): Replace with a state machine to handle aborts + // gracefully and avoid duplicate reloads. + return; + } this.dispatchEvent( new CustomEvent('error', {bubbles: true, composed: true})); this.loadingError_ = true;
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 e5c10008..3a171143 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.js +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.js
@@ -264,6 +264,12 @@ * Handles event when value prop webview cannot be loaded. */ onWebViewErrorOccurred(details) { + if (details && details.error == 'net::ERR_ABORTED') { + // Retry triggers net::ERR_ABORTED, so ignore it. + // TODO(b/232592745): Replace with a state machine to handle aborts + // gracefully and avoid duplicate reloads. + return; + } this.dispatchEvent( new CustomEvent('error', {bubbles: true, composed: true})); this.loadingError_ = true;
diff --git a/chrome/browser/resources/chromeos/login/cr_ui.js b/chrome/browser/resources/chromeos/login/cr_ui.js index 2e0316d..a316fa9 100644 --- a/chrome/browser/resources/chromeos/login/cr_ui.js +++ b/chrome/browser/resources/chromeos/login/cr_ui.js
@@ -142,14 +142,6 @@ } /** - * Sets the number of users on the views login screen. - * @param {number} userCount The number of users. - */ - static setLoginUserCount(userCount) { - Oobe.getInstance().setLoginUserCount(userCount); - } - - /** * Skip to login screen for telemetry. */ static skipToLoginForTesting() {
diff --git a/chrome/browser/resources/chromeos/login/display_manager.js b/chrome/browser/resources/chromeos/login/display_manager.js index ba6253a..02a8f06 100644 --- a/chrome/browser/resources/chromeos/login/display_manager.js +++ b/chrome/browser/resources/chromeos/login/display_manager.js
@@ -102,15 +102,6 @@ this.displayType_ = DISPLAY_TYPE.UNKNOWN; /** - * Number of users in the login screen UI. This is used by the views login - * screen, and is always 0 for WebUI login screen. - * TODO(crbug.com/808271): WebUI and views implementation should return - * the same user list. - * @type {number} - */ - this.userCount_ = 0; - - /** * Stored OOBE configuration for newly registered screens. * @type {OobeTypes.OobeConfiguration|undefined} */ @@ -159,14 +150,6 @@ } /** - * Returns true if the login screen has user pods. - * @return {boolean} - */ - get hasUserPods() { - return this.showingViewsLogin && this.userCount_ > 0; - } - - /** * Sets the current height of the shelf area. * @param {number} height current shelf height */ @@ -225,14 +208,6 @@ } /** - * Sets the number of users on the views login screen. - * @param {number} userCount The number of users. - */ - setLoginUserCount(userCount) { - this.userCount_ = userCount; - } - - /** * Handle accelerators. * @param {string} name Accelerator name. *
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 5409973..467b8a3 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
@@ -683,6 +683,11 @@ WebViewHelper.loadUrlContentToWebView( webView, TERMS_URL, WebViewHelper.ContentType.HTML); return; + } else if (details && details.error == 'net::ERR_ABORTED') { + // Retry triggers net::ERR_ABORTED, so ignore it. + // TODO(b/232592745): Replace with a state machine to handle aborts + // gracefully and avoid duplicate reloads. + return; } this.showError_(); }
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 d226c7e..d0518968 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/error_message.js +++ b/chrome/browser/resources/chromeos/login/screens/common/error_message.js
@@ -175,6 +175,14 @@ type: Boolean, value: false, }, + + /** + * @private + */ + hasUserPods_: { + type: Boolean, + value: false, + }, }; } @@ -209,7 +217,7 @@ * @type {boolean} */ get closable() { - return Oobe.getInstance().hasUserPods && !this.is_persistent_error_; + return this.hasUserPods_ && !this.is_persistent_error_; } /** @@ -395,6 +403,7 @@ onBeforeShow(data) { this.enableWifiScans_ = true; this.$.backButton.disabled = !this.closable; + this.hasUserPods_ = data && ('hasUserPods' in data) && data.hasUserPods; } /**
diff --git a/chrome/browser/resources/management/BUILD.gn b/chrome/browser/resources/management/BUILD.gn index 6a8dcd5..99b4ae4 100644 --- a/chrome/browser/resources/management/BUILD.gn +++ b/chrome/browser/resources/management/BUILD.gn
@@ -5,9 +5,10 @@ import("//chrome/common/features.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("//tools/typescript/ts_library.gni") import("//ui/webui/resources/tools/generate_grd.gni") +import("management.gni") assert(!is_android, "!is_android check failed") @@ -40,37 +41,27 @@ } preprocess_if_expr("preprocess") { - in_folder = "./" + in_folder = "." out_folder = "$target_gen_dir/$preprocess_folder" - in_files = [ "management_browser_proxy.ts" ] + in_files = ts_files } preprocess_if_expr("preprocess_generated") { - deps = [ ":web_components" ] + deps = [ ":html_wrapper_files" ] in_folder = target_gen_dir out_folder = "$target_gen_dir/$preprocess_folder" - in_files = [ - "icons.ts", - "management_ui.ts", - ] + in_files = html_wrapper_files } -html_to_js("web_components") { - js_files = [ - "icons.ts", - "management_ui.ts", - ] +html_to_wrapper("html_wrapper_files") { + in_files = html_files + icons_html_files } ts_library("build_ts") { root_dir = "$target_gen_dir/$preprocess_folder" out_dir = "$target_gen_dir/tsc" tsconfig_base = "tsconfig_base.json" - in_files = [ - "icons.ts", - "management_browser_proxy.ts", - "management_ui.ts", - ] + in_files = ts_files + html_wrapper_files deps = [ "//third_party/polymer/v3_0:library", "//ui/webui/resources:library",
diff --git a/chrome/browser/resources/management/icons.ts b/chrome/browser/resources/management/icons.ts deleted file mode 100644 index 500ccf6..0000000 --- a/chrome/browser/resources/management/icons.ts +++ /dev/null
@@ -1,10 +0,0 @@ -// 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. - -import 'chrome://resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js'; - -import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -const template = html`{__html_template__}`; -document.head.appendChild(template.content);
diff --git a/chrome/browser/resources/management/management.gni b/chrome/browser/resources/management/management.gni new file mode 100644 index 0000000..203ddf8 --- /dev/null +++ b/chrome/browser/resources/management/management.gni
@@ -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. + +# Files holding a Polymer element definition and have an equivalent .html file. +web_component_files = [ "management_ui.ts" ] + +# Files that are passed as input to html_to_wrapper(). +html_files = [] +foreach(f, web_component_files) { + html_files += [ string_replace(f, ".ts", ".html") ] +} + +icons_html_files = [ "icons.html" ] + +# Files that are generated by html_to_wrapper(). +html_wrapper_files = [] +foreach(f, html_files + icons_html_files) { + html_wrapper_files += [ f + ".ts" ] +} + +ts_files = [ "management_browser_proxy.ts" ] + web_component_files
diff --git a/chrome/browser/resources/management/management_ui.ts b/chrome/browser/resources/management/management_ui.ts index 1b4c411..8f39376 100644 --- a/chrome/browser/resources/management/management_ui.ts +++ b/chrome/browser/resources/management/management_ui.ts
@@ -9,14 +9,15 @@ import 'chrome://resources/cr_elements/hidden_style_css.m.js'; import 'chrome://resources/cr_elements/icons.m.js'; import 'chrome://resources/cr_elements/shared_style_css.m.js'; -import './icons.js'; +import './icons.html.js'; import './strings.m.js'; import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {sanitizeInnerHtml} from 'chrome://resources/js/parse_html_subset.m.js'; import {WebUIListenerMixin} from 'chrome://resources/js/web_ui_listener_mixin.js'; -import {html, 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 './management_ui.html.js'; import {BrowserReportingResponse, Extension, ManagementBrowserProxy, ManagementBrowserProxyImpl, ReportingType, ThreatProtectionInfo} from './management_browser_proxy.js'; // <if expr="chromeos_ash"> @@ -35,6 +36,10 @@ return 'management-ui'; } + static get template() { + return getTemplate(); + } + static get properties() { return { /** @@ -377,10 +382,6 @@ // </if> }); } - - static get template() { - return html`{__html_template__}`; - } } customElements.define(ManagementUiElement.is, ManagementUiElement);
diff --git a/chrome/browser/resources/new_tab_page_third_party/BUILD.gn b/chrome/browser/resources/new_tab_page_third_party/BUILD.gn index b219694..dc865a3 100644 --- a/chrome/browser/resources/new_tab_page_third_party/BUILD.gn +++ b/chrome/browser/resources/new_tab_page_third_party/BUILD.gn
@@ -5,7 +5,6 @@ import("//chrome/common/features.gni") import("//tools/grit/grit_rule.gni") import("//tools/grit/preprocess_if_expr.gni") -import("//tools/polymer/html_to_js.gni") import("//tools/typescript/ts_library.gni") import("//ui/webui/resources/tools/generate_grd.gni")
diff --git a/chrome/browser/resources/pdf/BUILD.gn b/chrome/browser/resources/pdf/BUILD.gn index 682e04f1..55909353 100644 --- a/chrome/browser/resources/pdf/BUILD.gn +++ b/chrome/browser/resources/pdf/BUILD.gn
@@ -6,7 +6,7 @@ import("//pdf/features.gni") import("//tools/grit/grit_rule.gni") import("//tools/grit/preprocess_if_expr.gni") -import("//tools/polymer/html_to_js.gni") +import("//tools/polymer/css_to_wrapper.gni") import("//tools/polymer/html_to_wrapper.gni") import("//tools/typescript/ts_library.gni") import("//ui/webui/resources/tools/generate_grd.gni") @@ -37,7 +37,7 @@ } html_to_wrapper("html_wrapper_files") { - in_files = html_files + in_files = html_files + shared_icons_html_files } # Preprocess and build a manifest file for the Print Preview HTML/CSS files, @@ -194,8 +194,8 @@ output_dir = "$root_gen_dir/chrome" } -html_to_js("css_wrapper_files") { - js_files = css_wrapper_files +css_to_wrapper("css_wrapper_files") { + in_files = css_files } ts_library("build_ts") {
diff --git a/chrome/browser/resources/pdf/elements/icons.ts b/chrome/browser/resources/pdf/elements/icons.ts deleted file mode 100644 index 500ccf6..0000000 --- a/chrome/browser/resources/pdf/elements/icons.ts +++ /dev/null
@@ -1,10 +0,0 @@ -// 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. - -import 'chrome://resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js'; - -import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -const template = html`{__html_template__}`; -document.head.appendChild(template.content);
diff --git a/chrome/browser/resources/pdf/elements/pdf-shared.css b/chrome/browser/resources/pdf/elements/pdf-shared.css new file mode 100644 index 0000000..4476f7c --- /dev/null +++ b/chrome/browser/resources/pdf/elements/pdf-shared.css
@@ -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. */ + +/* #css_wrapper_metadata_start + * #type=style + * #import=chrome://resources/cr_elements/shared_vars_css.m.js + * #css_wrapper_metadata_end */ + +cr-icon-button { + --cr-icon-button-fill-color: var(--pdf-toolbar-text-color); + --cr-icon-button-focus-outline-color: var(--google-grey-500); + margin: 0; +} + +cr-icon-button:hover { + background: rgba(255, 255, 255, 0.08); + border-radius: 50%; +} + +/* Dark mode styles copied from + ui/webui/resources/cr_elements/shared_vars_css.html. Unfortunately there + seems to be no great way to share styles with the + "prefers-color-scheme: dark" @media query selector. + TODO(crbug.com/1231199): Remove these overrides when the PDF viewer + supports light and dark modes. */ +cr-action-menu, +viewer-bookmark { + --cr-menu-background-color: var(--google-grey-900); + --cr-menu-shadow: rgba(0, 0, 0, .3) 0 1px 2px 0, + rgba(0, 0, 0, .15) 0 3px 6px 2px; + --cr-primary-text-color: var(--google-grey-200); + --cr-menu-background-focus-color: var(--google-grey-700); + --cr-menu-background-sheen: rgba(255, 255, 255, .06); + --cr-separator-line: var(--cr-separator-height) solid + rgba(255, 255, 255, .1); +}
diff --git a/chrome/browser/resources/pdf/elements/shared-css.html b/chrome/browser/resources/pdf/elements/shared-css.html deleted file mode 100644 index eea9186..0000000 --- a/chrome/browser/resources/pdf/elements/shared-css.html +++ /dev/null
@@ -1,33 +0,0 @@ -<template> - <style> - cr-icon-button { - --cr-icon-button-fill-color: var(--pdf-toolbar-text-color); - --cr-icon-button-focus-outline-color: var(--google-grey-500); - margin: 0; - } - - cr-icon-button:hover { - background: rgba(255, 255, 255, 0.08); - border-radius: 50%; - } - - /* Dark mode styles copied from - ui/webui/resources/cr_elements/shared_vars_css.html. Unfortunately there - seems to be no great way to share styles with the - "prefers-color-scheme: dark" @media query selector. - TODO(crbug.com/1231199): Remove these overrides when the PDF viewer - supports light and dark modes. */ - cr-action-menu, - viewer-bookmark { - --cr-menu-background-color: var(--google-grey-900); - --cr-menu-shadow: rgba(0, 0, 0, .3) 0 1px 2px 0, - rgba(0, 0, 0, .15) 0 3px 6px 2px; - --cr-primary-text-color: var(--google-grey-200); - --cr-menu-background-focus-color: var(--google-grey-700); - --cr-menu-background-sheen: rgba(255, 255, 255, .06); - --cr-separator-line: var(--cr-separator-height) solid - rgba(255, 255, 255, .1); - } - - </style> -</template>
diff --git a/chrome/browser/resources/pdf/elements/shared-css.ts b/chrome/browser/resources/pdf/elements/shared-css.ts deleted file mode 100644 index 044c715..0000000 --- a/chrome/browser/resources/pdf/elements/shared-css.ts +++ /dev/null
@@ -1,10 +0,0 @@ -// 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. - -import 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import 'chrome://resources/cr_elements/shared_vars_css.m.js'; - -const styleMod = document.createElement('dom-module'); -styleMod.innerHTML = `{__html_template__}`; -styleMod.register('pdf-shared');
diff --git a/chrome/browser/resources/pdf/elements/shared-vars.css b/chrome/browser/resources/pdf/elements/shared-vars.css new file mode 100644 index 0000000..fa4f8efe --- /dev/null +++ b/chrome/browser/resources/pdf/elements/shared-vars.css
@@ -0,0 +1,16 @@ +/* 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. */ + +/* #css_wrapper_metadata_start + * #type=vars + * #import=chrome://resources/polymer/v3_0/paper-styles/color.js + * #css_wrapper_metadata_end */ + +html { + --iron-icon-height: 20px; + --iron-icon-width: 20px; + --viewer-icon-ink-color: rgb(189, 189, 189); + --viewer-pdf-toolbar-background-color: rgb(50, 54, 57); + --viewer-text-input-selection-color: rgba(255, 255, 255, 0.3); +}
diff --git a/chrome/browser/resources/pdf/elements/shared-vars.html b/chrome/browser/resources/pdf/elements/shared-vars.html deleted file mode 100644 index 8d898bb..0000000 --- a/chrome/browser/resources/pdf/elements/shared-vars.html +++ /dev/null
@@ -1,11 +0,0 @@ -<custom-style> - <style> - html { - --iron-icon-height: 20px; - --iron-icon-width: 20px; - --viewer-icon-ink-color: rgb(189, 189, 189); - --viewer-pdf-toolbar-background-color: rgb(50, 54, 57); - --viewer-text-input-selection-color: rgba(255, 255, 255, 0.3); - } - </style> -</custom-style>
diff --git a/chrome/browser/resources/pdf/elements/shared-vars.ts b/chrome/browser/resources/pdf/elements/shared-vars.ts deleted file mode 100644 index 8ada546..0000000 --- a/chrome/browser/resources/pdf/elements/shared-vars.ts +++ /dev/null
@@ -1,10 +0,0 @@ -// 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. - -import 'chrome://resources/polymer/v3_0/paper-styles/color.js'; -import 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -const $_documentContainer = document.createElement('template'); -$_documentContainer.innerHTML = `{__html_template__}`; -document.head.appendChild($_documentContainer.content);
diff --git a/chrome/browser/resources/pdf/elements/viewer-annotations-bar.ts b/chrome/browser/resources/pdf/elements/viewer-annotations-bar.ts index b10fb400..d3c6eeb 100644 --- a/chrome/browser/resources/pdf/elements/viewer-annotations-bar.ts +++ b/chrome/browser/resources/pdf/elements/viewer-annotations-bar.ts
@@ -4,8 +4,8 @@ import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import 'chrome://resources/cr_elements/icons.m.js'; -import './icons.js'; -import './shared-css.js'; +import './icons.html.js'; +import './pdf-shared.css.js'; import './viewer-pen-options.js'; import './viewer-toolbar-dropdown.js';
diff --git a/chrome/browser/resources/pdf/elements/viewer-bookmark.ts b/chrome/browser/resources/pdf/elements/viewer-bookmark.ts index 6886caa..6c9fdcff 100644 --- a/chrome/browser/resources/pdf/elements/viewer-bookmark.ts +++ b/chrome/browser/resources/pdf/elements/viewer-bookmark.ts
@@ -6,7 +6,7 @@ import 'chrome://resources/cr_elements/icons.m.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import 'chrome://resources/polymer/v3_0/paper-styles/color.js'; -import './shared-css.js'; +import './pdf-shared.css.js'; import {CrIconButtonElement} from 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/pdf/elements/viewer-document-outline.ts b/chrome/browser/resources/pdf/elements/viewer-document-outline.ts index fac3830a..bb99986 100644 --- a/chrome/browser/resources/pdf/elements/viewer-document-outline.ts +++ b/chrome/browser/resources/pdf/elements/viewer-document-outline.ts
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import './shared-css.js'; +import './pdf-shared.css.js'; import './viewer-bookmark.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/pdf/elements/viewer-download-controls.ts b/chrome/browser/resources/pdf/elements/viewer-download-controls.ts index 6f616c6e..857dafa 100644 --- a/chrome/browser/resources/pdf/elements/viewer-download-controls.ts +++ b/chrome/browser/resources/pdf/elements/viewer-download-controls.ts
@@ -5,8 +5,8 @@ import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js'; import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import 'chrome://resources/cr_elements/icons.m.js'; -import './icons.js'; -import './shared-css.js'; +import './icons.html.js'; +import './pdf-shared.css.js'; import {AnchorAlignment, CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js'; import {CrIconButtonElement} from 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
diff --git a/chrome/browser/resources/pdf/elements/viewer-page-selector.ts b/chrome/browser/resources/pdf/elements/viewer-page-selector.ts index fd380a1b..5525764 100644 --- a/chrome/browser/resources/pdf/elements/viewer-page-selector.ts +++ b/chrome/browser/resources/pdf/elements/viewer-page-selector.ts
@@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import './shared-vars.js'; +import './shared-vars.css.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + import {getTemplate} from './viewer-page-selector.html.js'; export interface ViewerPageSelectorElement {
diff --git a/chrome/browser/resources/pdf/elements/viewer-pdf-sidenav.ts b/chrome/browser/resources/pdf/elements/viewer-pdf-sidenav.ts index 99f9ef48e..3d5fbf1 100644 --- a/chrome/browser/resources/pdf/elements/viewer-pdf-sidenav.ts +++ b/chrome/browser/resources/pdf/elements/viewer-pdf-sidenav.ts
@@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import './shared-vars.js'; -import '../pdf_viewer_shared_style.js'; -import './icons.js'; +import './shared-vars.css.js'; +import '../pdf_viewer_shared_style.css.js'; +import './icons.html.js'; import './viewer-document-outline.js'; import './viewer-thumbnail-bar.js'; import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
diff --git a/chrome/browser/resources/pdf/elements/viewer-thumbnail.ts b/chrome/browser/resources/pdf/elements/viewer-thumbnail.ts index 7c3151d..17dd39625 100644 --- a/chrome/browser/resources/pdf/elements/viewer-thumbnail.ts +++ b/chrome/browser/resources/pdf/elements/viewer-thumbnail.ts
@@ -2,10 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import './shared-css.js'; +import './pdf-shared.css.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + import {getTemplate} from './viewer-thumbnail.html.js'; // The maximum widths of thumbnails for each layout (px).
diff --git a/chrome/browser/resources/pdf/elements/viewer-toolbar.ts b/chrome/browser/resources/pdf/elements/viewer-toolbar.ts index dfdf58d..c26950e 100644 --- a/chrome/browser/resources/pdf/elements/viewer-toolbar.ts +++ b/chrome/browser/resources/pdf/elements/viewer-toolbar.ts
@@ -7,11 +7,11 @@ import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import 'chrome://resources/polymer/v3_0/paper-progress/paper-progress.js'; -import './icons.js'; +import './icons.html.js'; import './viewer-download-controls.js'; import './viewer-page-selector.js'; -import './shared-css.js'; -import './shared-vars.js'; +import './pdf-shared.css.js'; +import './shared-vars.css.js'; // <if expr="enable_ink"> import './viewer-annotations-bar.js'; import './viewer-annotations-mode-dialog.js';
diff --git a/chrome/browser/resources/pdf/elements/viewer-zoom-toolbar.ts b/chrome/browser/resources/pdf/elements/viewer-zoom-toolbar.ts index ae40807..a5cddb6 100644 --- a/chrome/browser/resources/pdf/elements/viewer-zoom-toolbar.ts +++ b/chrome/browser/resources/pdf/elements/viewer-zoom-toolbar.ts
@@ -4,7 +4,7 @@ import 'chrome://resources/cr_elements/hidden_style_css.m.js'; import 'chrome://resources/cr_elements/icons.m.js'; -import './icons.js'; +import './icons.html.js'; import './viewer-zoom-button.js'; import {isRTL} from 'chrome://resources/js/util.m.js';
diff --git a/chrome/browser/resources/pdf/pdf.gni b/chrome/browser/resources/pdf/pdf.gni index f8ca4e0..9fac94c18 100644 --- a/chrome/browser/resources/pdf/pdf.gni +++ b/chrome/browser/resources/pdf/pdf.gni
@@ -44,7 +44,14 @@ pdf_html_wrapper_files += [ f + ".ts" ] } -pdf_css_wrapper_files = [ "elements/shared-css.ts" ] +# Files that are passed as input to css_to_wrapper(). +pdf_css_files = [ "elements/pdf-shared.css" ] + +# Files that are generated by css_to_wrapper(). +pdf_css_wrapper_files = [] +foreach(f, pdf_css_files) { + pdf_css_wrapper_files += [ f + ".ts" ] +} # Files to pass directly to preprocess_if_expr() that are used only in PDF # Viewer. @@ -108,9 +115,11 @@ shared_html_files += [ string_replace(f, ".ts", ".html") ] } +shared_icons_html_files = [ "elements/icons.html" ] + # Files that are generated by html_to_wrapper(). shared_html_wrapper_files = [] -foreach(f, shared_html_files) { +foreach(f, shared_html_files + shared_icons_html_files) { shared_html_wrapper_files += [ f + ".ts" ] } @@ -133,12 +142,18 @@ "zoom_manager.ts", ] + shared_web_component_files -shared_css_wrapper_files = [ - "elements/icons.ts", - "elements/shared-vars.ts", - "pdf_viewer_shared_style.ts", +# Files that are passed as input to css_to_wrapper(). +shared_css_files = [ + "elements/shared-vars.css", + "pdf_viewer_shared_style.css", ] +# Files that are generated by css_to_wrapper(). +shared_css_wrapper_files = [] +foreach(f, shared_css_files) { + shared_css_wrapper_files += [ f + ".ts" ] +} + # ------------------Shared files end-------------------------------------------- # Combined lists, to make consuming them in the BULID.gn easier. @@ -149,6 +164,8 @@ html_wrapper_files = pdf_html_wrapper_files + shared_html_wrapper_files + print_preview_html_wrapper_files +css_files = pdf_css_files + shared_css_files + css_wrapper_files = pdf_css_wrapper_files + shared_css_wrapper_files print_preview_only_files =
diff --git a/chrome/browser/resources/pdf/pdf_viewer.ts b/chrome/browser/resources/pdf/pdf_viewer.ts index 36696af..41e9cb08 100644 --- a/chrome/browser/resources/pdf/pdf_viewer.ts +++ b/chrome/browser/resources/pdf/pdf_viewer.ts
@@ -10,8 +10,8 @@ import './elements/viewer-pdf-sidenav.js'; import './elements/viewer-properties-dialog.js'; import './elements/viewer-toolbar.js'; -import './elements/shared-vars.js'; -import './pdf_viewer_shared_style.js'; +import './elements/shared-vars.css.js'; +import './pdf_viewer_shared_style.css.js'; import 'chrome://resources/cr_elements/hidden_style_css.m.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js';
diff --git a/chrome/browser/resources/pdf/pdf_viewer_pp.ts b/chrome/browser/resources/pdf/pdf_viewer_pp.ts index fb88b84..4f479fa 100644 --- a/chrome/browser/resources/pdf/pdf_viewer_pp.ts +++ b/chrome/browser/resources/pdf/pdf_viewer_pp.ts
@@ -4,9 +4,9 @@ import './elements/viewer-error-dialog.js'; import './elements/viewer-page-indicator.js'; -import './elements/shared-vars.js'; +import './elements/shared-vars.css.js'; import './elements/viewer-zoom-toolbar.js'; -import './pdf_viewer_shared_style.js'; +import './pdf_viewer_shared_style.css.js'; import {assertNotReached} from 'chrome://resources/js/assert_ts.js'; import {isRTL} from 'chrome://resources/js/util.m.js';
diff --git a/chrome/browser/resources/pdf/pdf_viewer_shared_style.css b/chrome/browser/resources/pdf/pdf_viewer_shared_style.css new file mode 100644 index 0000000..f6cf8d3 --- /dev/null +++ b/chrome/browser/resources/pdf/pdf_viewer_shared_style.css
@@ -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. */ + +/* #css_wrapper_metadata_start + * #type=style + * #css_wrapper_metadata_end */ + +#content { + height: 100%; + position: fixed; + width: 100%; + z-index: 1; +} + +#plugin { + display: block; + height: 100%; + position: absolute; + width: 100%; +} + +#sizer { + position: absolute; + z-index: 0; +}
diff --git a/chrome/browser/resources/pdf/pdf_viewer_shared_style.html b/chrome/browser/resources/pdf/pdf_viewer_shared_style.html deleted file mode 100644 index 9cfc9097..0000000 --- a/chrome/browser/resources/pdf/pdf_viewer_shared_style.html +++ /dev/null
@@ -1,22 +0,0 @@ -<template> - <style> - #content { - height: 100%; - position: fixed; - width: 100%; - z-index: 1; - } - - #plugin { - display: block; - height: 100%; - position: absolute; - width: 100%; - } - - #sizer { - position: absolute; - z-index: 0; - } - </style> -</template>
diff --git a/chrome/browser/resources/pdf/pdf_viewer_shared_style.ts b/chrome/browser/resources/pdf/pdf_viewer_shared_style.ts deleted file mode 100644 index 5b422b5..0000000 --- a/chrome/browser/resources/pdf/pdf_viewer_shared_style.ts +++ /dev/null
@@ -1,9 +0,0 @@ -// 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. - -import 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -const styleMod = document.createElement('dom-module'); -styleMod.innerHTML = `{__html_template__}`; -styleMod.register('pdf-viewer-shared-style');
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.html index 9c4d569..755ab42 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.html +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.html
@@ -264,7 +264,7 @@ <div id="instruction"> <iron-icon id="instruction-icon" icon="os-settings:failure-alert"> </iron-icon> - $i18n{multideviceNotificationAccessSetupInstructions} + $i18n{multidevicePermissionsSetupInstructions} </div> </template> <template is="dom-if" if="[[hasStartedSetupAttempt_]]" restamp>
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.js index aef3e77..0174c1f 100644 --- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.js +++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.js
@@ -488,7 +488,7 @@ return this.i18n('multidevicePermissionsSetupOperationsInstructions'); case Status.CONNECTION_REQUESTED: case Status.CONNECTING: - return this.i18n('multideviceNotificationAccessSetupInstructions'); + return this.i18n('multidevicePermissionsSetupInstructions'); default: return ''; }
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js index c6409044..34a7d90 100644 --- a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js +++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.js
@@ -48,16 +48,16 @@ * @extends {PolymerElement} * @implements {DeepLinkingBehaviorInterface} * @implements {WebUIListenerBehaviorInterface} - * @implements {RouteObserverBehaviorInterface} * @implements {MainPageBehaviorInterface} + * @implements {RouteObserverBehaviorInterface} * @implements {I18nBehaviorInterface} */ const OsSettingsAboutPageBase = mixinBehaviors( [ DeepLinkingBehavior, WebUIListenerBehavior, - RouteObserverBehavior, MainPageBehavior, + RouteObserverBehavior, I18nBehavior, ], PolymerElement); @@ -314,7 +314,12 @@ * @param {!Route=} oldRoute */ currentRouteChanged(newRoute, oldRoute) { - super.currentRouteChanged(newRoute, oldRoute); + // super.currentRouteChanged() does not produce desired results since + // RouteObserverBehavior has higher precedence than MainPageBehavior given + // this element's behavior list order. In order to trigger the + // MainPageBehavior method, we must directly call it. + // See https://crbug.com/1324103 for more details. + MainPageBehavior.currentRouteChanged.call(this, newRoute, oldRoute); // Does not apply to this page. if (newRoute !== routes.ABOUT_ABOUT) {
diff --git a/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html b/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html index 0209360..046c4d84 100644 --- a/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html +++ b/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html
@@ -5,7 +5,7 @@ --banner-size: auto; --footer-margin: 40px; --content-container-margin-bottom: calc(48px + var(--footer-margin)); - --content-container-margin-top: 72px; + --content-container-margin-top: 104px; --info-box-margin-inline: auto; --info-box-margin-top: 32px; --info-box-width: 514px; @@ -42,6 +42,7 @@ } #headerContainer { + background-color: var(--header-background-color); height: var(--banner-height); position: relative; width: 100%; @@ -101,35 +102,29 @@ } #contentContainer { - font-size: 14px; - line-height: 20px; margin-bottom: var(--content-container-margin-bottom); margin-inline: auto; margin-top: var(--content-container-margin-top); text-align: center; - width: 382px; } #contentContainer h2 { - font-size: 24px; - font-weight: 500; - line-height: 32px; + font-size: 1.85em; + font-weight: normal; margin-bottom: 8px; } .info-box { align-items: center; - bottom: 0; + border: 1px solid var(--google-grey-200); + border-radius: 8px; color: var(--google-grey-700); display: flex; flex-direction: row; - font-size: 11px; - line-height: 16px; margin-inline: var(--info-box-margin-inline); margin-top: var(--info-box-margin-top); padding-block: 12px; padding-inline-end: 18px; - position: absolute; width: var(--info-box-width); } @@ -180,6 +175,7 @@ } .info-box { + border-color: var(--google-grey-600); color: var(--google-grey-100); } @@ -210,17 +206,17 @@ [[subtitle_]] </p> </template> -</div> -<template is="dom-if" if="[[enterpriseInfo_]]"> - <div class="info-box"> - <div class="icon-container"> - <iron-icon icon="cr:domain"></iron-icon> + <template is="dom-if" if="[[enterpriseInfo_]]"> + <div class="info-box"> + <div class="icon-container"> + <iron-icon icon="cr:domain"></iron-icon> + </div> + <p id="enterpriseInfo" > + [[enterpriseInfo_]] + </p> </div> - <p id="enterpriseInfo" > - [[enterpriseInfo_]] - </p> - </div> -</template> + </template> +</div> <template is="dom-if" if="[[showLinkDataCheckbox_]]"> <cr-checkbox id="linkData" checked="{{linkData_}}"> <div>$i18n{linkDataText}</div>
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 919ed16..3ad1ec0f 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
@@ -152,6 +152,7 @@ } private setProfileInfo_(info: EnterpriseProfileInfo) { + this.style.setProperty('--header-background-color', info.backgroundColor); this.pictureUrl_ = info.pictureUrl; this.showEnterpriseBadge_ = info.showEnterpriseBadge; this.title_ = info.title;
diff --git a/chrome/browser/resources/signin/enterprise_profile_welcome/images/enterprise_profile_welcome_illustration.svg b/chrome/browser/resources/signin/enterprise_profile_welcome/images/enterprise_profile_welcome_illustration.svg index 84e095599..07b340c 100644 --- a/chrome/browser/resources/signin/enterprise_profile_welcome/images/enterprise_profile_welcome_illustration.svg +++ b/chrome/browser/resources/signin/enterprise_profile_welcome/images/enterprise_profile_welcome_illustration.svg
@@ -1 +1 @@ -<svg width="768" height="176" viewBox="0 0 768 176" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path d="M331.381 51.256c-3.426.433-6.141 2.286-7.808 4.919-1.149 1.773-2.875 3.04-4.883 3.529l-.946.218c-2.008.49-4.119-.02-5.924-1.086-2.633-1.666-5.91-2.137-9.19-1.073-4.806 1.543-8.012 6.474-7.415 11.497.678 6.59 6.929 10.87 13.205 9.5a10.59 10.59 0 0 0 6.778-4.733c1.118-1.69 2.844-2.956 4.852-3.445l.946-.219c2.008-.489 4.067-.095 5.84 1.055 2.329 1.455 5.258 2.082 8.181 1.459 6.276-1.372 10.116-7.982 7.946-14.175-1.648-5.037-6.558-8.044-11.582-7.446Z" fill="#4384F4"/><path d="M614.55 140.585c6.472 3.003 9.225 10.816 6.222 17.288-3.004 6.472-10.816 9.225-17.288 6.222l-30.907-14.499c-6.472-3.004-9.226-10.816-6.222-17.288 3.003-6.472 10.816-9.226 17.288-6.222l30.907 14.499Z" fill="#56A55C"/><path d="m488.802 85.099 60.196 15.679" stroke="#E8EAED" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/><path d="m552.844 59.499-47.338-12.33a2.603 2.603 0 0 0-3.177 1.863l-7.538 29.055a2.61 2.61 0 0 0 1.87 3.178l47.338 12.33a2.602 2.602 0 0 0 3.177-1.864l7.538-29.054a2.61 2.61 0 0 0-1.87-3.178Z" fill="#fff" stroke="#DADCE0" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/><path d="m539.735 63.491-7.459-1.943a2.042 2.042 0 0 0-2.492 1.462l-1.933 7.45a2.047 2.047 0 0 0 1.467 2.493l7.458 1.943a2.041 2.041 0 0 0 2.492-1.462l1.933-7.45a2.046 2.046 0 0 0-1.466-2.493Z" fill="#4285F4"/><path d="m616.041 38.663-12.013 39.3a3.026 3.026 0 0 0 2.009 3.774l14.344 4.398a3.019 3.019 0 0 0 3.774-2.002l12.013-39.3a3.026 3.026 0 0 0-2.009-3.774l-14.344-4.398a3.019 3.019 0 0 0-3.774 2.002Z" fill="#fff" stroke="#DADCE0" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/><path d="m615.317 55.968-2.25 7.36a2.046 2.046 0 0 0 1.358 2.554l7.369 2.259a2.042 2.042 0 0 0 2.553-1.354l2.25-7.36a2.047 2.047 0 0 0-1.359-2.553l-7.369-2.26a2.04 2.04 0 0 0-2.552 1.354Z" fill="#34A853"/><path d="M619.345 42.08a1.294 1.294 0 1 0 .538-2.534 1.293 1.293 0 0 0-1.537.996c-.149.7.298 1.389.999 1.538Z" fill="#E8EAED"/><path d="M558.535 49.767c6.422-7.733 24.275-19.222 44.312-3.318" stroke="#DADCE0" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="4.9 5.6"/><path d="m31.648 100.453 12.4 37.102a4.672 4.672 0 0 0 5.918 2.945l26.127-8.75a4.678 4.678 0 0 0 2.956-5.916l-12.4-37.102a4.672 4.672 0 0 0-5.918-2.945l-26.127 8.75a4.679 4.679 0 0 0-2.956 5.916Z" fill="#fff" stroke="#DADCE0" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/><path d="m45.952 105.212 4.75 1.054-5.73-17.145-7.911 2.649 5.73 17.145 3.16-3.703Z" fill="#3982F8" stroke="#3982F8" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/><path d="m51.783 114.337 14.072-4.712m-11.97 11.003 14.072-4.712m-11.97 11 14.072-4.712" stroke="#DADCE0" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/><path d="M46.309 117.95a1.714 1.714 0 1 0-1.634-3.011 1.715 1.715 0 0 0-.691 2.324 1.715 1.715 0 0 0 2.325.687Zm2.102 6.289a1.715 1.715 0 0 0 .69-2.324 1.715 1.715 0 0 0-3.015 1.637 1.714 1.714 0 0 0 2.325.687Zm2.103 6.29a1.714 1.714 0 0 0 .69-2.324 1.714 1.714 0 0 0-3.015 1.637 1.714 1.714 0 0 0 2.325.687Z" fill="#3982F8"/><path d="M671.546 114.779a7.242 7.242 0 0 1 9.319-4.251l38.424 14.351a7.244 7.244 0 0 1 4.251 9.32l-.621 1.661a7.243 7.243 0 0 1-9.319 4.251l-38.424-14.351a7.244 7.244 0 0 1-4.251-9.32l.621-1.661Z" fill="#fff" stroke="#DADCE0" stroke-width="1.4"/><circle cx="688.042" cy="121.887" r="2.943" transform="rotate(20.48 688.042 121.887)" fill="#34A853"/><circle cx="678.851" cy="118.454" r="2.943" transform="rotate(20.48 678.851 118.454)" fill="#34A853"/><circle cx="706.423" cy="128.752" r="2.943" transform="rotate(20.48 706.423 128.752)" fill="#34A853"/><circle cx="715.613" cy="132.185" r="2.943" transform="rotate(20.48 715.613 132.185)" fill="#34A853"/><circle cx="697.232" cy="125.32" r="2.943" transform="rotate(20.48 697.232 125.32)" fill="#34A853"/><path fill-rule="evenodd" clip-rule="evenodd" d="M690.604 79.038c3.137.176 5.672 2.443 6.326 5.368l13.994.784-.421 7.481-2.496-.14.071-1.25a1.254 1.254 0 0 0-2.503-.14l-.071 1.25-2.495-.14.21-3.74-6.503-.365a6.88 6.88 0 0 1-13.369-2.633c.213-3.785 3.473-6.687 7.257-6.475Zm2.098 8.753a3.121 3.121 0 0 1-2.659 1.227 3.13 3.13 0 0 1-2.949-3.295 3.13 3.13 0 0 1 3.3-2.944 3.117 3.117 0 0 1 2.429 1.396h-.004l-.001.008a3.103 3.103 0 0 1-.116 3.608Z" fill="#DADCE0"/><path d="m237.748 80.487-6.196 2.99a1.806 1.806 0 0 0-.841 2.41l2.99 6.196a1.805 1.805 0 0 0 2.41.84l6.196-2.989a1.805 1.805 0 0 0 .841-2.41l-2.99-6.196a1.805 1.805 0 0 0-2.41-.841Z" fill="#E989F7"/><path d="m124.612 82.962-.138.08c-4.68 2.74-6.253 8.756-3.512 13.437 2.74 4.68 8.756 6.252 13.436 3.512l.138-.08c4.68-2.741 6.253-8.757 3.512-13.437-2.74-4.68-8.756-6.253-13.436-3.512Z" fill="#5185EC"/><path d="M204.298 126.531c.789 2.001.917 4.196.364 6.273a10.196 10.196 0 0 1-3.445 5.294l-19.229 15.577a10.506 10.506 0 0 1-7.602 2.277 10.435 10.435 0 0 1-7.014-3.672 10.31 10.31 0 0 1-1.675-2.79 10.059 10.059 0 0 1-.358-6.269 10.206 10.206 0 0 1 3.439-5.291l19.258-15.585a10.466 10.466 0 0 1 4.379-2.103c1.609-.35 3.28-.32 4.874.089a10.464 10.464 0 0 1 4.297 2.262 10.22 10.22 0 0 1 2.776 3.938h-.064Z" stroke="#D85140" stroke-width="3" stroke-miterlimit="10"/><path d="m667.687 29.01 13.94 1a.582.582 0 0 1 .526.62.577.577 0 0 1-.096.28l-8 11.21a.573.573 0 0 1-.809.155.564.564 0 0 1-.191-.235l-6-12.21a.574.574 0 0 1 .063-.603.58.58 0 0 1 .567-.217Z" fill="#E989F7"/><path d="m375.987 32.537-3.77-3.77a.743.743 0 0 1-.19-.72l1.38-5.11a.75.75 0 0 1 .53-.53l5.15-1.38a.737.737 0 0 1 .72.19l3.77 3.72a.76.76 0 0 1 .2.73l-1.38 5.15a.75.75 0 0 1-.53.53l-5.15 1.38a.763.763 0 0 1-.73-.19Z" fill="#F2BE42"/><path d="M407.043 43.411c8.808 8.963 33.243 24.205 60.52 13.464" stroke="#D95140" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round"/><path d="m206.175 43.53-8.299-6.868c-.667-.572-.954-1.431-.858-2.29l1.812-10.588c.191-.858.763-1.621 1.527-1.908l10.111-3.72c.858-.286 1.717-.19 2.385.382l8.299 6.868c.667.572.954 1.43.858 2.29l-1.812 10.587c-.191.859-.763 1.622-1.527 1.908l-10.111 3.72c-.763.287-1.717.096-2.385-.381Z" fill="#F1F3F4"/><path d="M69 34.774a23.85 23.85 0 0 1 7.36-2.39 29.9 29.9 0 0 1 16.71 2.1l.36.14.52.23.35.15.34.16.34.16.35.17.35.17.54.28.37.2.59.31.41.23.43.24.69.39 1 .58 1.65 1 1.22.7.86.49.6.33.57.3.36.19.52.26.5.25.17.08.33.15.33.15.34.15 1 .44c7.23 2.9 16.7 2.3 24.25-1.67" stroke="#56A55C" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h768v176H0z"/></clipPath></defs></svg> \ No newline at end of file +<svg width="768" height="204" viewBox="0 0 768 204" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M625.349 182.757h-13.05v-13.268h-12.975v-13.344h-12.975v-13.268h-9.45V68.409h-43.275v65.495h-26.475v-29.45h-43.35v69.56" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="m693.671 162.813-13.65 5.905c-.825.383-1.8 0-2.1-.844l-5.775-13.958c-.375-.843 0-1.84.825-2.147l13.65-5.905c.825-.384 1.8 0 2.1.843l5.775 13.958c.375.844 0 1.841-.825 2.148z" fill="#34A853"/><path d="M576.899 68.41V83.9c1.125.154 2.325.23 3.525.23 14.325 0 25.95-11.887 25.95-26.535s-11.625-26.535-25.95-26.535-25.95 11.887-25.95 26.535c0 3.835.825 7.516 2.25 10.813h20.175z" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/><path d="M580.424 8.437v9.356m-41.625 15.262 7.95 4.678m67.35 39.803 7.95 4.678m-7.95-44.481 7.95-4.678M509.325 76.31V40.646H476.55v49.467h-20.025v-22.24H423.75v69.253" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M549.074 79.913h-6.3v8.13h6.3v-8.13zm14.551 0h-6.3v8.13h6.3v-8.13zm-14.551 18.099h-6.3v8.129h6.3v-8.13zm14.551 0h-6.3v8.129h6.3v-8.13zm-14.551 18.1h-6.3v8.13h6.3v-8.13zm14.551 0h-6.3v8.13h6.3v-8.13zm-14.551 18.099h-6.3v8.129h6.3v-8.129z" fill="#FBBC05"/><path d="M518.849 151.85h-6.3v8.129h6.3v-8.129zm0 18.099h-6.3v8.13h6.3v-8.13z" fill="#4285F4"/><path d="M563.625 134.211h-6.3v8.129h6.3v-8.129z" fill="#FBBC05"/><path d="M486.599 117.723h-6.3v8.129h6.3v-8.129zm14.55 0h-6.3v8.129h6.3v-8.129zm-14.55 18.098h-6.3v8.13h6.3v-8.13zm14.55 0h-6.3v8.13h6.3v-8.13zm-14.55 18.099h-6.3v8.129h6.3v-8.129zm181.726-64.037c4.184 0 7.575-3.468 7.575-7.745 0-4.279-3.391-7.746-7.575-7.746s-7.575 3.468-7.575 7.746c0 4.277 3.391 7.745 7.575 7.745z" fill="#4285F4"/><path d="m150.291 105.311 11.243-55.464-9.838-1.532-9.946 66.459 46.703 7.165 1.297-8.423-39.459-8.205z" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/><path d="m260.867 31.61-2.85 16.75c-.143.962.641 1.684 1.425 1.443l14.324-5.53c.784-.32.998-1.523.357-2.084L262.72 31.05c-.641-.72-1.639-.32-1.853.561z" fill="#4285F4"/><path d="M341.839 139.986c3.571-1.305 5.49-5.447 4.317-9.249-1.226-3.802-5.117-5.845-8.688-4.596l-17.057 6.128c-3.571 1.305-5.489 5.448-4.317 9.25 1.226 3.801 5.117 5.844 8.688 4.596l17.057-6.129z" fill="#FBBC05"/><path d="m182.25 68.018 23.25 4.84-18.524-28.377-4.726 23.537z" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/><path d="M151.5 165.654c2.9 0 5.25-2.404 5.25-5.369 0-2.964-2.35-5.368-5.25-5.368-2.899 0-5.25 2.404-5.25 5.368 0 2.965 2.351 5.369 5.25 5.369z" fill="#FBBC05"/><path d="m252.494 189.251-46.002-16.628a2.614 2.614 0 0 1-1.551-3.337l24.392-70.614c.481-1.367 1.925-2.078 3.263-1.586l46.002 16.628a2.614 2.614 0 0 1 1.551 3.336l-24.392 70.615a2.617 2.617 0 0 1-3.263 1.586z" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/><path d="m258.859 183.891-5.616-2.024m8.024-4.868-5.617-2.023m7.97-4.869-5.616-2.024m8.023-4.923-5.616-2.024m8.023-4.868-5.616-2.024m7.97-4.922-5.617-2.024m8.024-4.869-5.617-2.024m7.971-4.867-5.564-2.078m7.97-4.868-5.616-2.024m8.023-4.867-5.616-2.024" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="m243.239 121.097 14.228.219-6.9-12.69-7.328 12.471z" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/><path d="m250.522 108.597 6.915 12.716 74.194-42.187-6.915-12.716-74.194 42.187zm-63.398-63.921L164.06 39.88l-13.31 65.565 46.182 9.593 8.568-42.24-18.376-28.122z" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linejoin="round"/><path d="M156.783 93.162c-.381 4.907 2.608 9.483 7.227 11.082.706.22 1.467-.221 1.576-.937l1.63-8.105c.163-.661-.272-1.378-.978-1.488l-7.988-1.654c-.707-.166-1.413.386-1.467 1.102z" fill="#34A853"/><path d="M178.125 95.098c3.521 0 6.375-2.918 6.375-6.519 0-3.6-2.854-6.518-6.375-6.518s-6.375 2.918-6.375 6.518c0 3.6 2.854 6.52 6.375 6.52z" fill="#FBBC05"/><path d="m177.432 106.546-7.235-1.459c-1.478-.302-2.446-1.761-2.141-3.219.306-1.459 1.784-2.415 3.262-2.113l7.235 1.459c1.478.302 2.446 1.76 2.141 3.219-.255 1.459-1.733 2.415-3.262 2.113z" fill="#4285F4"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.html b/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.html index 6567b6c..a51dc56 100644 --- a/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.html +++ b/chrome/browser/resources/signin/sync_confirmation/sync_confirmation_app.html
@@ -5,7 +5,7 @@ --banner-size: auto; --confirmation-description-margin-inline: auto; --content-container-margin-bottom: calc(32px + 2 * var(--footer-margin)); - --content-container-margin-top: 72px; + --content-container-margin-top: 104px; --footer-margin: 40px; --text-font-size: 1.16em; color: var(--cr-primary-text-color); @@ -122,6 +122,7 @@ } #headerContainer { + background-color: var(--theme-frame-color); height: var(--banner-height); position: relative; width: 100%; @@ -192,14 +193,12 @@ } #contentContainer h2 { - font-size: 24px; - font-weight: 500; - line-height: 32px; + font-size: 1.85em; + font-weight: normal; } #confirmationDescription { - font-size: 14px; - line-height: 20px; + font-size: var(--text-font-size); margin-inline: var(--confirmation-description-margin-inline); margin-top: 16px; max-width: 516px;
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc index fc69766..8c1d4b4 100644 --- a/chrome/browser/sessions/session_restore_browsertest.cc +++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -1332,7 +1332,8 @@ tab_strip_model->GetWebContentsAt(2)->GetRenderWidgetHostView()); } -IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoreWebUI) { +// TODO(crbug.com/1325235): Re-enable this test +IN_PROC_BROWSER_TEST_F(SessionRestoreTest, DISABLED_RestoreWebUI) { const GURL webui_url(chrome::kChromeUIOmniboxURL); ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), webui_url)); content::WebContents* old_tab =
diff --git a/chrome/browser/signin/signin_ui_util.cc b/chrome/browser/signin/signin_ui_util.cc index b63327a..6fd7acc 100644 --- a/chrome/browser/signin/signin_ui_util.cc +++ b/chrome/browser/signin/signin_ui_util.cc
@@ -378,9 +378,9 @@ return accounts; } -#if BUILDFLAG(ENABLE_DICE_SUPPORT) +#if !BUILDFLAG(IS_CHROMEOS_ASH) -AccountInfo GetSingleAccountForDicePromos(Profile* profile) { +AccountInfo GetSingleAccountForPromos(Profile* profile) { std::vector<AccountInfo> accounts = GetOrderedAccountsForDisplay( profile, /*restrict_to_accounts_eligible_for_sync=*/true); if (!accounts.empty()) @@ -388,7 +388,7 @@ return AccountInfo(); } -#endif // BUILDFLAG(ENABLE_DICE_SUPPORT) +#endif // !BUILDFLAG(IS_CHROMEOS_ASH) std::u16string GetShortProfileIdentityToDisplay( const ProfileAttributesEntry& profile_attributes_entry,
diff --git a/chrome/browser/signin/signin_ui_util.h b/chrome/browser/signin/signin_ui_util.h index 73f841c..dc2cd41 100644 --- a/chrome/browser/signin/signin_ui_util.h +++ b/chrome/browser/signin/signin_ui_util.h
@@ -90,9 +90,9 @@ Profile* profile, bool restrict_to_accounts_eligible_for_sync); -#if BUILDFLAG(ENABLE_DICE_SUPPORT) -// Returns single account to use in Dice promos. -AccountInfo GetSingleAccountForDicePromos(Profile* profile); +#if !BUILDFLAG(IS_CHROMEOS_ASH) +// Returns single account to use in promos. +AccountInfo GetSingleAccountForPromos(Profile* profile); #endif
diff --git a/chrome/browser/storage/shared_storage_browsertest.cc b/chrome/browser/storage/shared_storage_browsertest.cc index 87627f6..982a5390 100644 --- a/chrome/browser/storage/shared_storage_browsertest.cc +++ b/chrome/browser/storage/shared_storage_browsertest.cc
@@ -184,12 +184,11 @@ "/shared_storage/customizable_module.js", run_function_body_replacement)); - // We allow Shared Storage for `addModule()` and `runOperation()`, but any - // operations nested within the script run by `runOperation()` will have - // preferences applied according to test parameters. When the latter - // disallow Shared Storage, it siumlates the situation where preferences - // are updated to block Shared Storage during the course of a previously - // allowed `runOperation()` call. + // We allow Shared Storage for `addModule()` and `run()`, but any operations + // nested within the script run by `run()` will have preferences applied + // according to test parameters. When the latter disallow Shared Storage, it + // siumlates the situation where preferences are updated to block Shared + // Storage during the course of a previously allowed `run()` call. content::SetBypassIsSharedStorageAllowed(/*allow=*/true); EXPECT_TRUE(content::ExecJs( @@ -214,7 +213,7 @@ {last_script_message, content::GetSharedStorageDisabledMessage()})); content::EvalJsResult result = content::EvalJs(execution_target, R"( - sharedStorage.runOperation('test-operation'); + sharedStorage.run('test-operation'); )"); script_console_observer.Wait(); @@ -291,7 +290,7 @@ content::EvalJsResult run_op_result = content::EvalJs(GetActiveWebContents(), R"( - sharedStorage.runOperation( + sharedStorage.run( 'test-operation', {data: {'customKey': 'customValue'}}); )"); @@ -326,7 +325,7 @@ content::EvalJsResult run_url_op_result = content::EvalJs(GetActiveWebContents(), R"( - sharedStorage.runURLSelectionOperation( + sharedStorage.selectURL( 'test-url-selection-operation', ["fenced_frames/title0.html", "fenced_frames/title1.html", "fenced_frames/title2.html"], {data: {'mockResult': 1}});
diff --git a/chrome/browser/sync/bookmark_sync_service_factory.cc b/chrome/browser/sync/bookmark_sync_service_factory.cc index 897bdd5..7612f5db 100644 --- a/chrome/browser/sync/bookmark_sync_service_factory.cc +++ b/chrome/browser/sync/bookmark_sync_service_factory.cc
@@ -29,7 +29,7 @@ DependsOn(BookmarkUndoServiceFactory::GetInstance()); } -BookmarkSyncServiceFactory::~BookmarkSyncServiceFactory() {} +BookmarkSyncServiceFactory::~BookmarkSyncServiceFactory() = default; KeyedService* BookmarkSyncServiceFactory::BuildServiceInstanceFor( content::BrowserContext* context) const {
diff --git a/chrome/browser/sync/device_info_sync_service_factory.cc b/chrome/browser/sync/device_info_sync_service_factory.cc index c90df89..246a276 100644 --- a/chrome/browser/sync/device_info_sync_service_factory.cc +++ b/chrome/browser/sync/device_info_sync_service_factory.cc
@@ -69,7 +69,7 @@ DependsOn(SyncInvalidationsServiceFactory::GetInstance()); } -DeviceInfoSyncServiceFactory::~DeviceInfoSyncServiceFactory() {} +DeviceInfoSyncServiceFactory::~DeviceInfoSyncServiceFactory() = default; KeyedService* DeviceInfoSyncServiceFactory::BuildServiceInstanceFor( content::BrowserContext* context) const {
diff --git a/chrome/browser/sync/glue/extension_model_type_controller.cc b/chrome/browser/sync/glue/extension_model_type_controller.cc index 6dbc00a..ef50d632 100644 --- a/chrome/browser/sync/glue/extension_model_type_controller.cc +++ b/chrome/browser/sync/glue/extension_model_type_controller.cc
@@ -26,7 +26,7 @@ type == syncer::THEMES); } -ExtensionModelTypeController::~ExtensionModelTypeController() {} +ExtensionModelTypeController::~ExtensionModelTypeController() = default; void ExtensionModelTypeController::LoadModels( const syncer::ConfigureContext& configure_context,
diff --git a/chrome/browser/sync/glue/extension_setting_model_type_controller.cc b/chrome/browser/sync/glue/extension_setting_model_type_controller.cc index bc87dc1..cf46c48 100644 --- a/chrome/browser/sync/glue/extension_setting_model_type_controller.cc +++ b/chrome/browser/sync/glue/extension_setting_model_type_controller.cc
@@ -29,7 +29,8 @@ DCHECK(type == syncer::EXTENSION_SETTINGS || type == syncer::APP_SETTINGS); } -ExtensionSettingModelTypeController::~ExtensionSettingModelTypeController() {} +ExtensionSettingModelTypeController::~ExtensionSettingModelTypeController() = + default; void ExtensionSettingModelTypeController::LoadModels( const syncer::ConfigureContext& configure_context,
diff --git a/chrome/browser/sync/glue/extensions_activity_monitor_unittest.cc b/chrome/browser/sync/glue/extensions_activity_monitor_unittest.cc index 8847501..eab037d2 100644 --- a/chrome/browser/sync/glue/extensions_activity_monitor_unittest.cc +++ b/chrome/browser/sync/glue/extensions_activity_monitor_unittest.cc
@@ -80,7 +80,7 @@ extension2_(MakeExtension("extension2")), id1_(extension1_->id()), id2_(extension2_->id()) {} - ~SyncChromeExtensionsActivityMonitorTest() override {} + ~SyncChromeExtensionsActivityMonitorTest() override = default; private: content::BrowserTaskEnvironment task_environment_;
diff --git a/chrome/browser/sync/glue/synced_tab_delegate_android.cc b/chrome/browser/sync/glue/synced_tab_delegate_android.cc index acb90ef..f464ac405 100644 --- a/chrome/browser/sync/glue/synced_tab_delegate_android.cc +++ b/chrome/browser/sync/glue/synced_tab_delegate_android.cc
@@ -35,7 +35,7 @@ SyncedTabDelegateAndroid::SyncedTabDelegateAndroid(TabAndroid* tab_android) : tab_android_(tab_android) {} -SyncedTabDelegateAndroid::~SyncedTabDelegateAndroid() {} +SyncedTabDelegateAndroid::~SyncedTabDelegateAndroid() = default; SessionID SyncedTabDelegateAndroid::GetWindowId() const { return tab_android_->window_id();
diff --git a/chrome/browser/sync/glue/synced_window_delegate_android.cc b/chrome/browser/sync/glue/synced_window_delegate_android.cc index f33fdcb0..a770203 100644 --- a/chrome/browser/sync/glue/synced_window_delegate_android.cc +++ b/chrome/browser/sync/glue/synced_window_delegate_android.cc
@@ -22,7 +22,7 @@ bool is_tabbed_activity) : tab_model_(tab_model), is_tabbed_activity_(is_tabbed_activity) {} -SyncedWindowDelegateAndroid::~SyncedWindowDelegateAndroid() {} +SyncedWindowDelegateAndroid::~SyncedWindowDelegateAndroid() = default; bool SyncedWindowDelegateAndroid::HasWindow() const { return !tab_model_->IsOffTheRecord();
diff --git a/chrome/browser/sync/glue/synced_window_delegates_getter_android.cc b/chrome/browser/sync/glue/synced_window_delegates_getter_android.cc index a0d0b9f..d35a4b63 100644 --- a/chrome/browser/sync/glue/synced_window_delegates_getter_android.cc +++ b/chrome/browser/sync/glue/synced_window_delegates_getter_android.cc
@@ -12,8 +12,10 @@ namespace browser_sync { -SyncedWindowDelegatesGetterAndroid::SyncedWindowDelegatesGetterAndroid() {} -SyncedWindowDelegatesGetterAndroid::~SyncedWindowDelegatesGetterAndroid() {} +SyncedWindowDelegatesGetterAndroid::SyncedWindowDelegatesGetterAndroid() = + default; +SyncedWindowDelegatesGetterAndroid::~SyncedWindowDelegatesGetterAndroid() = + default; SyncedWindowDelegatesGetterAndroid::SyncedWindowDelegateMap SyncedWindowDelegatesGetterAndroid::GetSyncedWindowDelegates() {
diff --git a/chrome/browser/sync/model_type_store_service_factory.cc b/chrome/browser/sync/model_type_store_service_factory.cc index 9d36f442..541e411 100644 --- a/chrome/browser/sync/model_type_store_service_factory.cc +++ b/chrome/browser/sync/model_type_store_service_factory.cc
@@ -26,7 +26,7 @@ "ModelTypeStoreService", BrowserContextDependencyManager::GetInstance()) {} -ModelTypeStoreServiceFactory::~ModelTypeStoreServiceFactory() {} +ModelTypeStoreServiceFactory::~ModelTypeStoreServiceFactory() = default; KeyedService* ModelTypeStoreServiceFactory::BuildServiceInstanceFor( content::BrowserContext* context) const {
diff --git a/chrome/browser/sync/send_tab_to_self_sync_service_factory.cc b/chrome/browser/sync/send_tab_to_self_sync_service_factory.cc index f3ee0df..86532f47 100644 --- a/chrome/browser/sync/send_tab_to_self_sync_service_factory.cc +++ b/chrome/browser/sync/send_tab_to_self_sync_service_factory.cc
@@ -38,7 +38,7 @@ DependsOn(DeviceInfoSyncServiceFactory::GetInstance()); } -SendTabToSelfSyncServiceFactory::~SendTabToSelfSyncServiceFactory() {} +SendTabToSelfSyncServiceFactory::~SendTabToSelfSyncServiceFactory() = default; KeyedService* SendTabToSelfSyncServiceFactory::BuildServiceInstanceFor( content::BrowserContext* context) const {
diff --git a/chrome/browser/sync/session_sync_service_factory.cc b/chrome/browser/sync/session_sync_service_factory.cc index f70c607..a83f2b6c 100644 --- a/chrome/browser/sync/session_sync_service_factory.cc +++ b/chrome/browser/sync/session_sync_service_factory.cc
@@ -65,7 +65,7 @@ SyncSessionsClientImpl(const SyncSessionsClientImpl&) = delete; SyncSessionsClientImpl& operator=(const SyncSessionsClientImpl&) = delete; - ~SyncSessionsClientImpl() override {} + ~SyncSessionsClientImpl() override = default; // SyncSessionsClient implementation. sync_sessions::SessionSyncPrefs* GetSessionSyncPrefs() override { @@ -152,7 +152,7 @@ DependsOn(sync_sessions::SyncSessionsWebContentsRouterFactory::GetInstance()); } -SessionSyncServiceFactory::~SessionSyncServiceFactory() {} +SessionSyncServiceFactory::~SessionSyncServiceFactory() = default; KeyedService* SessionSyncServiceFactory::BuildServiceInstanceFor( content::BrowserContext* context) const {
diff --git a/chrome/browser/sync/sessions/browser_list_router_helper_unittest.cc b/chrome/browser/sync/sessions/browser_list_router_helper_unittest.cc index 12e0341..ed970b73 100644 --- a/chrome/browser/sync/sessions/browser_list_router_helper_unittest.cc +++ b/chrome/browser/sync/sessions/browser_list_router_helper_unittest.cc
@@ -41,7 +41,7 @@ class BrowserListRouterHelperTest : public BrowserWithTestWindowTest { protected: - ~BrowserListRouterHelperTest() override {} + ~BrowserListRouterHelperTest() override = default; MockLocalSessionEventHandler handler_1; MockLocalSessionEventHandler handler_2;
diff --git a/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc index 77975b8..bbca69e 100644 --- a/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc +++ b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc
@@ -38,7 +38,7 @@ favicon_driver_->AddObserver(this); } -SyncSessionsRouterTabHelper::~SyncSessionsRouterTabHelper() {} +SyncSessionsRouterTabHelper::~SyncSessionsRouterTabHelper() = default; void SyncSessionsRouterTabHelper::DidFinishNavigation( content::NavigationHandle* navigation_handle) {
diff --git a/chrome/browser/sync/sessions/sync_sessions_router_tab_helper_unittest.cc b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper_unittest.cc index 7dd09fb..d8847d33 100644 --- a/chrome/browser/sync/sessions/sync_sessions_router_tab_helper_unittest.cc +++ b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper_unittest.cc
@@ -41,8 +41,8 @@ class SyncSessionsRouterTabHelperTest : public ChromeRenderViewHostTestHarness { public: - SyncSessionsRouterTabHelperTest() : ChromeRenderViewHostTestHarness() {} - ~SyncSessionsRouterTabHelperTest() override {} + SyncSessionsRouterTabHelperTest() = default; + ~SyncSessionsRouterTabHelperTest() override = default; void SetUp() override { ChromeRenderViewHostTestHarness::SetUp();
diff --git a/chrome/browser/sync/sessions/sync_sessions_web_contents_router.cc b/chrome/browser/sync/sessions/sync_sessions_web_contents_router.cc index 2fe4b4758..8f6ed3b3 100644 --- a/chrome/browser/sync/sessions/sync_sessions_web_contents_router.cc +++ b/chrome/browser/sync/sessions/sync_sessions_web_contents_router.cc
@@ -43,7 +43,7 @@ #endif // !BUILDFLAG(IS_ANDROID) } -SyncSessionsWebContentsRouter::~SyncSessionsWebContentsRouter() {} +SyncSessionsWebContentsRouter::~SyncSessionsWebContentsRouter() = default; void SyncSessionsWebContentsRouter::NotifyTabModified( content::WebContents* web_contents,
diff --git a/chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.cc b/chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.cc index 84b2d26..b4bc449 100644 --- a/chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.cc +++ b/chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.cc
@@ -29,7 +29,8 @@ "SyncSessionsWebContentsRouter", BrowserContextDependencyManager::GetInstance()) {} -SyncSessionsWebContentsRouterFactory::~SyncSessionsWebContentsRouterFactory() {} +SyncSessionsWebContentsRouterFactory::~SyncSessionsWebContentsRouterFactory() = + default; KeyedService* SyncSessionsWebContentsRouterFactory::BuildServiceInstanceFor( content::BrowserContext* context) const {
diff --git a/chrome/browser/sync/sessions/sync_sessions_web_contents_router_unittest.cc b/chrome/browser/sync/sessions/sync_sessions_web_contents_router_unittest.cc index cca8270..7e7306f3 100644 --- a/chrome/browser/sync/sessions/sync_sessions_web_contents_router_unittest.cc +++ b/chrome/browser/sync/sessions/sync_sessions_web_contents_router_unittest.cc
@@ -16,8 +16,8 @@ class StartSyncFlareMock { public: - StartSyncFlareMock() {} - ~StartSyncFlareMock() {} + StartSyncFlareMock() = default; + ~StartSyncFlareMock() = default; void StartSyncFlare(syncer::ModelType type) { was_run_ = true; }
diff --git a/chrome/browser/sync/sync_startup_tracker_unittest.cc b/chrome/browser/sync/sync_startup_tracker_unittest.cc index a3af1d7..12aaa2e 100644 --- a/chrome/browser/sync/sync_startup_tracker_unittest.cc +++ b/chrome/browser/sync/sync_startup_tracker_unittest.cc
@@ -21,7 +21,7 @@ class SyncStartupTrackerTest : public testing::Test { public: - SyncStartupTrackerTest() {} + SyncStartupTrackerTest() = default; void SetupNonInitializedPSS() { sync_service_.SetDisableReasons(syncer::SyncService::DisableReasonSet());
diff --git a/chrome/browser/sync/test/integration/autofill_helper.cc b/chrome/browser/sync/test/integration/autofill_helper.cc index d4d6ccce..37e71d305e 100644 --- a/chrome/browser/sync/test/integration/autofill_helper.cc +++ b/chrome/browser/sync/test/integration/autofill_helper.cc
@@ -467,5 +467,5 @@ CheckExitCondition(); } -PersonalDataLoadedObserverMock::PersonalDataLoadedObserverMock() {} -PersonalDataLoadedObserverMock::~PersonalDataLoadedObserverMock() {} +PersonalDataLoadedObserverMock::PersonalDataLoadedObserverMock() = default; +PersonalDataLoadedObserverMock::~PersonalDataLoadedObserverMock() = default;
diff --git a/chrome/browser/sync/test/integration/await_match_status_change_checker.cc b/chrome/browser/sync/test/integration/await_match_status_change_checker.cc index 89dcbe7..cdb6c5bf 100644 --- a/chrome/browser/sync/test/integration/await_match_status_change_checker.cc +++ b/chrome/browser/sync/test/integration/await_match_status_change_checker.cc
@@ -13,7 +13,7 @@ sync_datatype_helper::test()->GetSyncServices()), condition_(condition) {} -AwaitMatchStatusChangeChecker::~AwaitMatchStatusChangeChecker() {} +AwaitMatchStatusChangeChecker::~AwaitMatchStatusChangeChecker() = default; bool AwaitMatchStatusChangeChecker::IsExitConditionSatisfied(std::ostream* os) { return condition_.Run(os);
diff --git a/chrome/browser/sync/test/integration/bookmarks_helper.cc b/chrome/browser/sync/test/integration/bookmarks_helper.cc index caebff8f..0042c94b 100644 --- a/chrome/browser/sync/test/integration/bookmarks_helper.cc +++ b/chrome/browser/sync/test/integration/bookmarks_helper.cc
@@ -240,7 +240,7 @@ // Represents a favicon image and the icon URL associated with it. struct FaviconData { - FaviconData() {} + FaviconData() = default; FaviconData(const gfx::Image& favicon_image, const GURL& favicon_url) : image(favicon_image), icon_url(favicon_url) {} @@ -823,8 +823,7 @@ const int dip_height = 16; std::vector<float> favicon_scales = favicon_base::GetFaviconScales(); gfx::ImageSkia favicon; - for (size_t i = 0; i < favicon_scales.size(); ++i) { - float scale = favicon_scales[i]; + for (float scale : favicon_scales) { int pixel_width = dip_width * scale; int pixel_height = dip_height * scale; SkBitmap bmp; @@ -1085,7 +1084,8 @@ : SingleBookmarkModelStatusChangeChecker(profile_index), matcher_(matcher) {} -SingleBookmarksModelMatcherChecker::~SingleBookmarksModelMatcherChecker() {} +SingleBookmarksModelMatcherChecker::~SingleBookmarksModelMatcherChecker() = + default; bool SingleBookmarksModelMatcherChecker::IsExitConditionSatisfied( std::ostream* os) { @@ -1197,7 +1197,7 @@ return true; } -ServerBookmarksEqualityChecker::~ServerBookmarksEqualityChecker() {} +ServerBookmarksEqualityChecker::~ServerBookmarksEqualityChecker() = default; BookmarksUrlChecker::BookmarksUrlChecker(int profile, const GURL& url, @@ -1222,7 +1222,7 @@ : SingleBookmarksModelMatcherChecker(profile, testing::Contains(HasGuid(guid))) {} -BookmarksGUIDChecker::~BookmarksGUIDChecker() {} +BookmarksGUIDChecker::~BookmarksGUIDChecker() = default; BookmarkModelMatchesFakeServerChecker::BookmarkModelMatchesFakeServerChecker( int profile,
diff --git a/chrome/browser/sync/test/integration/enable_disable_test.cc b/chrome/browser/sync/test/integration/enable_disable_test.cc index 53895f9..4974731 100644 --- a/chrome/browser/sync/test/integration/enable_disable_test.cc +++ b/chrome/browser/sync/test/integration/enable_disable_test.cc
@@ -19,6 +19,7 @@ #include "components/sync/base/user_selectable_type.h" #include "components/sync/driver/glue/sync_transport_data_prefs.h" #include "components/sync/driver/sync_service_impl.h" +#include "components/sync/engine/cycle/entity_change_metric_recording.h" #include "components/sync/test/fake_server/bookmark_entity_builder.h" #include "components/sync/test/fake_server/entity_builder_factory.h" #include "content/public/test/browser_test.h" @@ -403,12 +404,12 @@ ASSERT_TRUE(SetupSync()); ASSERT_TRUE(bookmarks_helper::GetBookmarkModel(0)->IsBookmarked( GURL(kSyncedBookmarkURL))); - EXPECT_EQ( - 0, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.BOOKMARK", - /*REMOTE_NON_INITIAL_UPDATE=*/4)); - EXPECT_EQ( - 0, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.BOOKMARK", - /*REMOTE_INITIAL_UPDATE=*/5)); + EXPECT_EQ(0, histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.BOOKMARK", + syncer::ModelTypeEntityChange::kRemoteNonInitialUpdate)); + EXPECT_EQ(0, histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.BOOKMARK", + syncer::ModelTypeEntityChange::kRemoteInitialUpdate)); } IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, ResetsPrefsIfClearData) {
diff --git a/chrome/browser/sync/test/integration/local_sync_test.cc b/chrome/browser/sync/test/integration/local_sync_test.cc index de7029be..f3134ff 100644 --- a/chrome/browser/sync/test/integration/local_sync_test.cc +++ b/chrome/browser/sync/test/integration/local_sync_test.cc
@@ -51,7 +51,7 @@ EXPECT_TRUE(local_sync_backend_dir_.CreateUniqueTempDir()); } - ~LocalSyncTest() override {} + ~LocalSyncTest() override = default; void SetUpCommandLine(base::CommandLine* command_line) override { // By default on Window OS local sync backend uses roaming profile. It can
diff --git a/chrome/browser/sync/test/integration/migration_test.cc b/chrome/browser/sync/test/integration/migration_test.cc index fab801f..ac8cba5 100644 --- a/chrome/browser/sync/test/integration/migration_test.cc +++ b/chrome/browser/sync/test/integration/migration_test.cc
@@ -73,7 +73,7 @@ MigrationTest(const MigrationTest&) = delete; MigrationTest& operator=(const MigrationTest&) = delete; - ~MigrationTest() override {} + ~MigrationTest() override = default; enum TriggerMethod { MODIFY_PREF, MODIFY_BOOKMARK, TRIGGER_REFRESH }; @@ -180,19 +180,17 @@ } // Phase 1: Trigger the migrations on the server. - for (MigrationList::const_iterator it = migration_list.begin(); - it != migration_list.end(); ++it) { - TriggerMigrationDoneError(*it); + for (const syncer::ModelTypeSet& model_types : migration_list) { + TriggerMigrationDoneError(model_types); } // Phase 2: Trigger each migration individually and wait for it to // complete. (Multiple migrations may be handled by each // migration cycle, but there's no guarantee of that, so we have // to trigger each migration individually.) - for (MigrationList::const_iterator it = migration_list.begin(); - it != migration_list.end(); ++it) { - TriggerMigration(*it, trigger_method); - AwaitMigration(*it); + for (const syncer::ModelTypeSet& model_types : migration_list) { + TriggerMigration(model_types, trigger_method); + AwaitMigration(model_types); } // Phase 3: Wait for all clients to catch up. @@ -212,7 +210,7 @@ MigrationSingleClientTest& operator=(const MigrationSingleClientTest&) = delete; - ~MigrationSingleClientTest() override {} + ~MigrationSingleClientTest() override = default; void RunSingleClientMigrationTest(const MigrationList& migration_list, TriggerMethod trigger_method) { @@ -375,7 +373,7 @@ class MigrationReconfigureTest : public MigrationTwoClientTest { public: - MigrationReconfigureTest() {} + MigrationReconfigureTest() = default; void SetUpCommandLine(base::CommandLine* cl) override { AddTestSwitches(cl); @@ -385,7 +383,7 @@ MigrationReconfigureTest(const MigrationReconfigureTest&) = delete; MigrationReconfigureTest& operator=(const MigrationReconfigureTest&) = delete; - ~MigrationReconfigureTest() override {} + ~MigrationReconfigureTest() override = default; }; } // namespace
diff --git a/chrome/browser/sync/test/integration/passwords_helper.cc b/chrome/browser/sync/test/integration/passwords_helper.cc index f824e02..3ee5297 100644 --- a/chrome/browser/sync/test/integration/passwords_helper.cc +++ b/chrome/browser/sync/test/integration/passwords_helper.cc
@@ -44,7 +44,7 @@ class PasswordStoreConsumerHelper : public password_manager::PasswordStoreConsumer { public: - PasswordStoreConsumerHelper() {} + PasswordStoreConsumerHelper() = default; PasswordStoreConsumerHelper(const PasswordStoreConsumerHelper&) = delete; PasswordStoreConsumerHelper& operator=(const PasswordStoreConsumerHelper&) =
diff --git a/chrome/browser/sync/test/integration/performance/autofill_sync_perf_test.cc b/chrome/browser/sync/test/integration/performance/autofill_sync_perf_test.cc index 81d51af..9748782 100644 --- a/chrome/browser/sync/test/integration/performance/autofill_sync_perf_test.cc +++ b/chrome/browser/sync/test/integration/performance/autofill_sync_perf_test.cc
@@ -69,8 +69,7 @@ class AutofillProfileSyncPerfTest : public SyncTest { public: - AutofillProfileSyncPerfTest() - : SyncTest(TWO_CLIENT), guid_number_(0), name_number_(0) {} + AutofillProfileSyncPerfTest() : SyncTest(TWO_CLIENT) {} AutofillProfileSyncPerfTest(const AutofillProfileSyncPerfTest&) = delete; AutofillProfileSyncPerfTest& operator=(const AutofillProfileSyncPerfTest&) = @@ -98,16 +97,16 @@ // Returns a new unused unique name. const std::string NextName(); - int guid_number_; - int name_number_; + int guid_number_ = 0; + int name_number_ = 0; }; void AutofillProfileSyncPerfTest::AddProfiles(int profile, int num_profiles) { const std::vector<AutofillProfile*>& all_profiles = GetAllAutoFillProfiles(profile); std::vector<AutofillProfile> autofill_profiles; - for (size_t i = 0; i < all_profiles.size(); ++i) { - autofill_profiles.push_back(*all_profiles[i]); + for (AutofillProfile* autofill_profile : all_profiles) { + autofill_profiles.push_back(*autofill_profile); } for (int i = 0; i < num_profiles; ++i) { autofill_profiles.push_back(NextAutofillProfile()); @@ -119,8 +118,8 @@ const std::vector<AutofillProfile*>& all_profiles = GetAllAutoFillProfiles(profile); std::vector<AutofillProfile> autofill_profiles; - for (size_t i = 0; i < all_profiles.size(); ++i) { - autofill_profiles.push_back(*all_profiles[i]); + for (AutofillProfile* autofill_profile : all_profiles) { + autofill_profiles.push_back(*autofill_profile); autofill_profiles.back().SetRawInfo(autofill::NAME_FIRST, base::UTF8ToUTF16(NextName())); } @@ -175,7 +174,7 @@ class AutocompleteSyncPerfTest : public SyncTest { public: - AutocompleteSyncPerfTest() : SyncTest(TWO_CLIENT), name_number_(0) {} + AutocompleteSyncPerfTest() : SyncTest(TWO_CLIENT) {} AutocompleteSyncPerfTest(const AutocompleteSyncPerfTest&) = delete; AutocompleteSyncPerfTest& operator=(const AutocompleteSyncPerfTest&) = delete; @@ -190,7 +189,7 @@ // Returns a new unused unique name. const std::string NextName(); - int name_number_; + int name_number_ = 0; }; void AutocompleteSyncPerfTest::AddKeys(int profile, int num_keys) {
diff --git a/chrome/browser/sync/test/integration/performance/extensions_sync_perf_test.cc b/chrome/browser/sync/test/integration/performance/extensions_sync_perf_test.cc index c8f0fe0..9b5ae0a 100644 --- a/chrome/browser/sync/test/integration/performance/extensions_sync_perf_test.cc +++ b/chrome/browser/sync/test/integration/performance/extensions_sync_perf_test.cc
@@ -45,7 +45,7 @@ class ExtensionsSyncPerfTest : public SyncTest { public: - ExtensionsSyncPerfTest() : SyncTest(TWO_CLIENT), extension_number_(0) {} + ExtensionsSyncPerfTest() : SyncTest(TWO_CLIENT) {} ExtensionsSyncPerfTest(const ExtensionsSyncPerfTest&) = delete; ExtensionsSyncPerfTest& operator=(const ExtensionsSyncPerfTest&) = delete; @@ -63,7 +63,7 @@ int GetExtensionCount(int profile); private: - int extension_number_; + int extension_number_ = 0; }; void ExtensionsSyncPerfTest::AddExtensions(int profile, int num_extensions) {
diff --git a/chrome/browser/sync/test/integration/performance/passwords_sync_perf_test.cc b/chrome/browser/sync/test/integration/performance/passwords_sync_perf_test.cc index 13ed8eb..8f3983c 100644 --- a/chrome/browser/sync/test/integration/performance/passwords_sync_perf_test.cc +++ b/chrome/browser/sync/test/integration/performance/passwords_sync_perf_test.cc
@@ -38,7 +38,7 @@ class PasswordsSyncPerfTest : public SyncTest { public: - PasswordsSyncPerfTest() : SyncTest(TWO_CLIENT), password_number_(0) {} + PasswordsSyncPerfTest() : SyncTest(TWO_CLIENT) {} PasswordsSyncPerfTest(const PasswordsSyncPerfTest&) = delete; PasswordsSyncPerfTest& operator=(const PasswordsSyncPerfTest&) = delete; @@ -59,7 +59,7 @@ // Returns a new unique password value. std::string NextPassword(); - int password_number_; + int password_number_ = 0; }; void PasswordsSyncPerfTest::AddLogins(int profile, int num_logins) {
diff --git a/chrome/browser/sync/test/integration/performance/sessions_sync_perf_test.cc b/chrome/browser/sync/test/integration/performance/sessions_sync_perf_test.cc index 7e056e4..1676563 100644 --- a/chrome/browser/sync/test/integration/performance/sessions_sync_perf_test.cc +++ b/chrome/browser/sync/test/integration/performance/sessions_sync_perf_test.cc
@@ -43,7 +43,7 @@ class SessionsSyncPerfTest : public SyncTest { public: - SessionsSyncPerfTest() : SyncTest(TWO_CLIENT), url_number_(0) {} + SessionsSyncPerfTest() : SyncTest(TWO_CLIENT) {} SessionsSyncPerfTest(const SessionsSyncPerfTest&) = delete; SessionsSyncPerfTest& operator=(const SessionsSyncPerfTest&) = delete; @@ -68,7 +68,7 @@ // Returns a unique URL according to the integer |n|. GURL IntToURL(int n); - int url_number_; + int url_number_ = 0; }; void SessionsSyncPerfTest::AddTabs(int profile, int num_tabs) {
diff --git a/chrome/browser/sync/test/integration/performance/typed_urls_sync_perf_test.cc b/chrome/browser/sync/test/integration/performance/typed_urls_sync_perf_test.cc index b7fd0f4..17c36bd 100644 --- a/chrome/browser/sync/test/integration/performance/typed_urls_sync_perf_test.cc +++ b/chrome/browser/sync/test/integration/performance/typed_urls_sync_perf_test.cc
@@ -48,7 +48,7 @@ class TypedUrlsSyncPerfTest : public SyncTest { public: - TypedUrlsSyncPerfTest() : SyncTest(TWO_CLIENT), url_number_(0) {} + TypedUrlsSyncPerfTest() : SyncTest(TWO_CLIENT) {} TypedUrlsSyncPerfTest(const TypedUrlsSyncPerfTest&) = delete; TypedUrlsSyncPerfTest& operator=(const TypedUrlsSyncPerfTest&) = delete; @@ -72,7 +72,7 @@ // Returns a unique URL according to the integer |n|. GURL IntToURL(int n); - int url_number_; + int url_number_ = 0; }; void TypedUrlsSyncPerfTest::AddURLs(int profile, int num_urls) {
diff --git a/chrome/browser/sync/test/integration/printers_helper.cc b/chrome/browser/sync/test/integration/printers_helper.cc index 2ae59d1..012648e 100644 --- a/chrome/browser/sync/test/integration/printers_helper.cc +++ b/chrome/browser/sync/test/integration/printers_helper.cc
@@ -178,6 +178,6 @@ : AwaitMatchStatusChangeChecker(base::BindRepeating( &printers_helper::AllProfilesContainSamePrinters)) {} -PrintersMatchChecker::~PrintersMatchChecker() {} +PrintersMatchChecker::~PrintersMatchChecker() = default; } // namespace printers_helper
diff --git a/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc b/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc index 30c8480..bd08eb8 100644 --- a/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc +++ b/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc
@@ -106,7 +106,7 @@ : UpdatedProgressMarkerChecker(service), check_exit_condition_cb_(check_exit_condition_cb) {} - ~NestedUpdatedProgressMarkerChecker() override {} + ~NestedUpdatedProgressMarkerChecker() override = default; protected: void CheckExitCondition() override { check_exit_condition_cb_.Run(); } @@ -119,15 +119,15 @@ std::vector<syncer::SyncServiceImpl*> services) : MultiClientStatusChangeChecker(services) { DCHECK_LE(1U, services.size()); - for (size_t i = 0; i < services.size(); ++i) { + for (syncer::SyncServiceImpl* service : services) { checkers_.push_back(std::make_unique<NestedUpdatedProgressMarkerChecker>( - services[i], + service, base::BindRepeating(&QuiesceStatusChangeChecker::CheckExitCondition, base::Unretained(this)))); } } -QuiesceStatusChangeChecker::~QuiesceStatusChangeChecker() {} +QuiesceStatusChangeChecker::~QuiesceStatusChangeChecker() = default; bool QuiesceStatusChangeChecker::IsExitConditionSatisfied(std::ostream* os) { // Check that all progress markers are up to date.
diff --git a/chrome/browser/sync/test/integration/search_engines_helper.cc b/chrome/browser/sync/test/integration/search_engines_helper.cc index 9d262ed..86b3a1f5 100644 --- a/chrome/browser/sync/test/integration/search_engines_helper.cc +++ b/chrome/browser/sync/test/integration/search_engines_helper.cc
@@ -127,17 +127,16 @@ return false; } - for (size_t i = 0; i < verifier_turls.size(); ++i) { - const TemplateURL& verifier_turl = *verifier_turls.at(i); + for (TemplateURL* verifier_turl : verifier_turls) { const TemplateURL* other_turl = - other->GetTemplateURLForKeyword(verifier_turl.keyword()); + other->GetTemplateURLForKeyword(verifier_turl->keyword()); if (!other_turl) { DVLOG(1) << "The other service did not contain a TURL with keyword: " - << verifier_turl.keyword(); + << verifier_turl->keyword(); return false; } - if (!TURLsMatch(verifier_turl, *other_turl)) + if (!TURLsMatch(*verifier_turl, *other_turl)) return false; }
diff --git a/chrome/browser/sync/test/integration/sessions_helper.cc b/chrome/browser/sync/test/integration/sessions_helper.cc index 913abb2..6d72b47 100644 --- a/chrome/browser/sync/test/integration/sessions_helper.cc +++ b/chrome/browser/sync/test/integration/sessions_helper.cc
@@ -259,12 +259,11 @@ std::make_unique<sync_sessions::SyncedSessionWindow>(); new_window->wrapped_window.window_id = SessionID::FromSerializedValue(window.window_id.id()); - for (size_t t = 0; t < window.tabs.size(); ++t) { - const sessions::SessionTab& tab = *window.tabs.at(t); + for (const std::unique_ptr<sessions::SessionTab>& tab : window.tabs) { std::unique_ptr<sessions::SessionTab> new_tab = std::make_unique<sessions::SessionTab>(); - new_tab->navigations.resize(tab.navigations.size()); - base::ranges::copy(tab.navigations, new_tab->navigations.begin()); + new_tab->navigations.resize(tab->navigations.size()); + base::ranges::copy(tab->navigations, new_tab->navigations.begin()); new_window->wrapped_window.tabs.push_back(std::move(new_tab)); } SessionID id = new_window->wrapped_window.window_id;
diff --git a/chrome/browser/sync/test/integration/single_client_autofill_profile_sync_test.cc b/chrome/browser/sync/test/integration/single_client_autofill_profile_sync_test.cc index 7652169..93eb747b 100644 --- a/chrome/browser/sync/test/integration/single_client_autofill_profile_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_autofill_profile_sync_test.cc
@@ -43,7 +43,7 @@ SingleClientAutofillProfileSyncTest& operator=( const SingleClientAutofillProfileSyncTest&) = delete; - ~SingleClientAutofillProfileSyncTest() override {} + ~SingleClientAutofillProfileSyncTest() override = default; }; IN_PROC_BROWSER_TEST_F(SingleClientAutofillProfileSyncTest,
diff --git a/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc b/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc index ff4fc676..00bfb29 100644 --- a/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc
@@ -35,6 +35,7 @@ #include "components/sync/base/model_type.h" #include "components/sync/driver/sync_service_impl.h" #include "components/sync/engine/bookmark_update_preprocessing.h" +#include "components/sync/engine/cycle/entity_change_metric_recording.h" #include "components/sync/engine/loopback_server/loopback_server_entity.h" #include "components/sync/invalidations/interested_data_types_handler.h" #include "components/sync/invalidations/sync_invalidations_service.h" @@ -1095,12 +1096,12 @@ .Wait()); // There should have been one creation and no deletions. - EXPECT_EQ( - 1, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.BOOKMARK", - /*LOCAL_CREATION=*/1)); - EXPECT_EQ( - 0, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.BOOKMARK", - /*LOCAL_DELETION=*/0)); + EXPECT_EQ(1, histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.BOOKMARK", + syncer::ModelTypeEntityChange::kLocalCreation)); + EXPECT_EQ(0, histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.BOOKMARK", + syncer::ModelTypeEntityChange::kLocalDeletion)); } // Android doesn't currently support PRE_ tests, see crbug.com/1117345. @@ -1119,9 +1120,9 @@ ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; ASSERT_EQ(1u, GetBookmarkBarNode(kSingleProfileIndex)->children().size()); - EXPECT_NE( - 0, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.BOOKMARK", - /*REMOTE_INITIAL_UPDATE=*/5)); + EXPECT_NE(0, histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.BOOKMARK", + syncer::ModelTypeEntityChange::kRemoteInitialUpdate)); } IN_PROC_BROWSER_TEST_F(SingleClientBookmarksSyncTest, @@ -1146,9 +1147,9 @@ EXPECT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait()); ASSERT_EQ(1u, GetBookmarkBarNode(kSingleProfileIndex)->children().size()); - EXPECT_EQ( - 0, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.BOOKMARK", - /*REMOTE_INITIAL_UPDATE=*/5)); + EXPECT_EQ(0, histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.BOOKMARK", + syncer::ModelTypeEntityChange::kRemoteInitialUpdate)); } #endif // !BUILDFLAG(IS_ANDROID) @@ -1587,9 +1588,9 @@ // commits are expected despite the fact that the server-side bookmark is a // legacy bookmark without the most recent fields (e.g. GUID), because loading // favicons should not lead to commits unless the favicon itself changed. - EXPECT_EQ( - 0, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.BOOKMARK", - /*LOCAL_UPDATE=*/2)); + EXPECT_EQ(0, histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.BOOKMARK", + syncer::ModelTypeEntityChange::kLocalUpdate)); } #endif // !BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc index 27aad2a..c1921bb 100644 --- a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc
@@ -102,7 +102,7 @@ SingleClientCustomPassphraseSyncTest& operator=( const SingleClientCustomPassphraseSyncTest&) = delete; - ~SingleClientCustomPassphraseSyncTest() override {} + ~SingleClientCustomPassphraseSyncTest() override = default; // Waits until the given set of bookmarks appears on the server, encrypted // according to the server-side Nigori and with the given passphrase.
diff --git a/chrome/browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc b/chrome/browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc index d5005c8..e545345 100644 --- a/chrome/browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc
@@ -79,7 +79,7 @@ SingleClientHistoryDeleteDirectivesSyncTest& operator=( const SingleClientHistoryDeleteDirectivesSyncTest&) = delete; - ~SingleClientHistoryDeleteDirectivesSyncTest() override {} + ~SingleClientHistoryDeleteDirectivesSyncTest() override = default; bool WaitForHistoryDeleteDirectives(size_t num_expected_directives) { return HistoryDeleteDirectivesEqualityChecker(
diff --git a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc index 67f9499..616b83ba 100644 --- a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
@@ -1109,7 +1109,8 @@ GetProfile(0)->GetPrefs())); histogram_tester.ExpectUniqueSample("Sync.TrustedVaultErrorShownOnStartup", - /*sample=*/1, /*expected_count=*/1); + /*sample=*/1, + /*expected_bucket_count=*/1); } IN_PROC_BROWSER_TEST_F( @@ -1154,7 +1155,8 @@ GetProfile(0)->GetPrefs())); histogram_tester.ExpectUniqueSample("Sync.TrustedVaultErrorShownOnStartup", - /*sample=*/0, /*expected_count=*/1); + /*sample=*/0, + /*expected_bucket_count=*/1); } IN_PROC_BROWSER_TEST_F(SingleClientNigoriWithWebApiTest,
diff --git a/chrome/browser/sync/test/integration/single_client_os_preferences_sync_test.cc b/chrome/browser/sync/test/integration/single_client_os_preferences_sync_test.cc index 4047b71..3043124 100644 --- a/chrome/browser/sync/test/integration/single_client_os_preferences_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_os_preferences_sync_test.cc
@@ -41,7 +41,7 @@ ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; // Shelf alignment is a Chrome OS only preference. - ChangeStringPref(/*profile_index=*/0, ash::prefs::kShelfAlignment, + ChangeStringPref(/*index=*/0, ash::prefs::kShelfAlignment, ash::kShelfAlignmentRight); EXPECT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait()); EXPECT_THAT(GetPrefs(/*index=*/0)->GetString(ash::prefs::kShelfAlignment),
diff --git a/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc b/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc index 0b3008b4..ec7c425 100644 --- a/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc
@@ -23,6 +23,7 @@ #include "components/signin/public/identity_manager/identity_test_utils.h" #include "components/sync/base/features.h" #include "components/sync/driver/sync_service_impl.h" +#include "components/sync/engine/cycle/entity_change_metric_recording.h" #include "components/sync/nigori/cryptographer_impl.h" #include "components/sync/test/fake_server/fake_server_nigori_helper.h" #include "content/public/test/browser_test.h" @@ -236,9 +237,9 @@ ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait()); // Upon a local creation, the received update will be seen as reflection and // get counted as incremental update. - EXPECT_EQ( - 1, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.PASSWORD", - /*REMOTE_NON_INITIAL_UPDATE=*/4)); + EXPECT_EQ(1, histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.PASSWORD", + syncer::ModelTypeEntityChange::kRemoteNonInitialUpdate)); } IN_PROC_BROWSER_TEST_F(SingleClientPasswordsSyncTest, @@ -256,12 +257,12 @@ // If that metadata hasn't been properly persisted, the password stored on the // server will be received at the client as an initial update or an // incremental once. - EXPECT_EQ( - 0, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.PASSWORD", - /*REMOTE_INITIAL_UPDATE=*/5)); - EXPECT_EQ( - 0, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.PASSWORD", - /*REMOTE_NON_INITIAL_UPDATE=*/4)); + EXPECT_EQ(0, histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.PASSWORD", + syncer::ModelTypeEntityChange::kRemoteInitialUpdate)); + EXPECT_EQ(0, histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.PASSWORD", + syncer::ModelTypeEntityChange::kRemoteNonInitialUpdate)); } class SingleClientPasswordsWithAccountStorageSyncTest : public SyncTest {
diff --git a/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc b/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc index e2490f5..e09e57e 100644 --- a/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc
@@ -34,7 +34,7 @@ SingleClientPollingSyncTest& operator=(const SingleClientPollingSyncTest&) = delete; - ~SingleClientPollingSyncTest() override {} + ~SingleClientPollingSyncTest() override = default; }; // This test verifies that the poll interval in prefs gets initialized if no
diff --git a/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc b/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc index 7d59ff5e..bf04a788 100644 --- a/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc
@@ -19,6 +19,7 @@ #include "components/prefs/json_pref_store.h" #include "components/prefs/pref_service.h" #include "components/sync/driver/sync_service_impl.h" +#include "components/sync/engine/cycle/entity_change_metric_recording.h" #include "components/sync/protocol/entity_specifics.pb.h" #include "components/sync/protocol/preference_specifics.pb.h" #include "content/public/test/browser_test.h" @@ -132,9 +133,10 @@ base::HistogramTester histogram_tester; ASSERT_TRUE(SetupSync()); - EXPECT_EQ(kNumEntities, histogram_tester.GetBucketCount( - "Sync.ModelTypeEntityChange3.PREFERENCE", - /*REMOTE_INITIAL_UPDATE=*/5)); + EXPECT_EQ(kNumEntities, + histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.PREFERENCE", + syncer::ModelTypeEntityChange::kRemoteInitialUpdate)); } IN_PROC_BROWSER_TEST_F(SingleClientPreferencesSyncTest, @@ -152,7 +154,7 @@ ASSERT_TRUE(SetupSync()); EXPECT_EQ(1, histogram_tester.GetBucketCount( "Sync.ModelTypeEntityChange3.PREFERENCE", - /*REMOTE_INITIAL_UPDATE=*/5)); + syncer::ModelTypeEntityChange::kRemoteInitialUpdate)); } IN_PROC_BROWSER_TEST_F(SingleClientPreferencesSyncTest, @@ -177,7 +179,7 @@ EXPECT_EQ(0, histogram_tester.GetBucketCount( "Sync.ModelTypeEntityChange3.PREFERENCE", - /*REMOTE_INITIAL_UPDATE=*/5)); + syncer::ModelTypeEntityChange::kRemoteInitialUpdate)); } } // namespace
diff --git a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc b/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc index 6c793fec..41a00f65 100644 --- a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc
@@ -55,7 +55,7 @@ SingleClientSecondaryAccountSyncTest& operator=( const SingleClientSecondaryAccountSyncTest&) = delete; - ~SingleClientSecondaryAccountSyncTest() override {} + ~SingleClientSecondaryAccountSyncTest() override = default; void SetUpInProcessBrowserTestFixture() override { test_signin_client_subscription_ =
diff --git a/chrome/browser/sync/test/integration/single_client_send_tab_to_self_sync_test.cc b/chrome/browser/sync/test/integration/single_client_send_tab_to_self_sync_test.cc index 6514351..080c15e6 100644 --- a/chrome/browser/sync/test/integration/single_client_send_tab_to_self_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_send_tab_to_self_sync_test.cc
@@ -39,7 +39,7 @@ SingleClientSendTabToSelfSyncTest& operator=( const SingleClientSendTabToSelfSyncTest&) = delete; - ~SingleClientSendTabToSelfSyncTest() override {} + ~SingleClientSendTabToSelfSyncTest() override = default; void SetUpInProcessBrowserTestFixture() override { SyncTest::SetUpInProcessBrowserTestFixture();
diff --git a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc index b424c4c..e07be7c 100644 --- a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
@@ -38,6 +38,7 @@ #include "components/signin/public/identity_manager/account_info.h" #include "components/signin/public/identity_manager/identity_test_utils.h" #include "components/sync/base/time.h" +#include "components/sync/engine/cycle/entity_change_metric_recording.h" #include "components/sync/protocol/entity_specifics.pb.h" #include "components/sync/protocol/proto_value_conversions.h" #include "components/sync/protocol/session_specifics.pb.h" @@ -238,7 +239,7 @@ SingleClientSessionsSyncTest& operator=(const SingleClientSessionsSyncTest&) = delete; - ~SingleClientSessionsSyncTest() override {} + ~SingleClientSessionsSyncTest() override = default; void ExpectNavigationChain(const std::vector<GURL>& urls) { ScopedWindowMap windows; @@ -434,7 +435,7 @@ // issue another navigation to make sure association logic kicks in. NavigateTab(0, GURL(kURL3)); ASSERT_TRUE(WaitForTabsToLoad(0, {GURL(kURL1), GURL(kURL3)})); - CloseTab(/*index=*/0, /*tab_index=*/1); + CloseTab(/*browser_index=*/0, /*tab_index=*/1); NavigateTab(0, GURL(kURL4)); ASSERT_TRUE( @@ -462,7 +463,7 @@ // addition, a new tab is opened. NavigateTab(0, GURL(kURL3)); ASSERT_TRUE(WaitForTabsToLoad(0, {GURL(kURL1), GURL(kURL3)})); - CloseTab(/*index=*/0, /*tab_index=*/1); + CloseTab(/*browser_index=*/0, /*tab_index=*/1); ASSERT_TRUE(OpenTab(0, GURL(kURL4))); ASSERT_TRUE( @@ -682,9 +683,9 @@ EXPECT_NE(kForeignSessionTag, entity.specifics().session().session_tag()); } - EXPECT_EQ( - 3, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.SESSION", - /*LOCAL_DELETION=*/0)); + EXPECT_EQ(3, histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.SESSION", + syncer::ModelTypeEntityChange::kLocalDeletion)); } IN_PROC_BROWSER_TEST_F(SingleClientSessionsSyncTest, @@ -729,9 +730,9 @@ EXPECT_NE(kForeignSessionTag, entity.specifics().session().session_tag()); } - EXPECT_EQ( - 2, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.SESSION", - /*LOCAL_DELETION=*/0)); + EXPECT_EQ(2, histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.SESSION", + syncer::ModelTypeEntityChange::kLocalDeletion)); } // Regression test for crbug.com/915133 that verifies the browser doesn't crash @@ -874,8 +875,7 @@ class SingleClientSessionsSyncTestWithFaviconTestServer : public SingleClientSessionsSyncTest { public: - SingleClientSessionsSyncTestWithFaviconTestServer() - : SingleClientSessionsSyncTest() {} + SingleClientSessionsSyncTestWithFaviconTestServer() = default; SingleClientSessionsSyncTestWithFaviconTestServer( const SingleClientSessionsSyncTestWithFaviconTestServer&) = delete;
diff --git a/chrome/browser/sync/test/integration/single_client_status_change_checker.cc b/chrome/browser/sync/test/integration/single_client_status_change_checker.cc index 12b1f3b..e7cb3c80 100644 --- a/chrome/browser/sync/test/integration/single_client_status_change_checker.cc +++ b/chrome/browser/sync/test/integration/single_client_status_change_checker.cc
@@ -10,7 +10,7 @@ syncer::SyncServiceImpl* service) : MultiClientStatusChangeChecker({service}) {} -SingleClientStatusChangeChecker::~SingleClientStatusChangeChecker() {} +SingleClientStatusChangeChecker::~SingleClientStatusChangeChecker() = default; syncer::SyncServiceImpl* SingleClientStatusChangeChecker::service() { return services()[0];
diff --git a/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc b/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc index e17b3c54..42ed907c 100644 --- a/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc
@@ -101,14 +101,14 @@ template <class T> class AutofillWebDataServiceConsumer : public WebDataServiceConsumer { public: - AutofillWebDataServiceConsumer() {} + AutofillWebDataServiceConsumer() = default; AutofillWebDataServiceConsumer(const AutofillWebDataServiceConsumer&) = delete; AutofillWebDataServiceConsumer& operator=( const AutofillWebDataServiceConsumer&) = delete; - virtual ~AutofillWebDataServiceConsumer() {} + ~AutofillWebDataServiceConsumer() override = default; void OnWebDataServiceRequestDone( WebDataServiceBase::Handle handle, @@ -199,7 +199,7 @@ SingleClientWalletSyncTest& operator=(const SingleClientWalletSyncTest&) = delete; - ~SingleClientWalletSyncTest() override {} + ~SingleClientWalletSyncTest() override = default; protected: void WaitForOnPersonalDataChanged(autofill::PersonalDataManager* pdm) { @@ -1301,8 +1301,8 @@ histogram_tester_.ExpectBucketCount( "Autofill.WalletAddressConversionType", - /*bucket=*/AutofillMetrics::CONVERTED_ADDRESS_ADDED, - /*count=*/1); + /*sample=*/AutofillMetrics::CONVERTED_ADDRESS_ADDED, + /*expected_count=*/1); } IN_PROC_BROWSER_TEST_F(SingleClientWalletSyncTest, @@ -1332,7 +1332,7 @@ GetFakeServer()->InjectEntity( syncer::PersistentUniqueClientEntity::CreateFromSpecificsForTesting( "non_unique_name", - /*client_tag_hash=*/"address-" + wallet_metadata_specifics->id(), + /*client_tag=*/"address-" + wallet_metadata_specifics->id(), specifics, /*creation_time=*/0, /*last_modified_time=*/0)); @@ -1360,7 +1360,7 @@ SingleClientWalletSecondaryAccountSyncTest& operator=( const SingleClientWalletSecondaryAccountSyncTest&) = delete; - ~SingleClientWalletSecondaryAccountSyncTest() override {} + ~SingleClientWalletSecondaryAccountSyncTest() override = default; void SetUpInProcessBrowserTestFixture() override { test_signin_client_subscription_ =
diff --git a/chrome/browser/sync/test/integration/sync_app_helper.cc b/chrome/browser/sync/test/integration/sync_app_helper.cc index e09b859..5ef2725 100644 --- a/chrome/browser/sync/test/integration/sync_app_helper.cc +++ b/chrome/browser/sync/test/integration/sync_app_helper.cc
@@ -39,7 +39,7 @@ syncer::StringOrdinal app_launch_ordinal; syncer::StringOrdinal page_ordinal; - extensions::LaunchType launch_type; + extensions::LaunchType launch_type = extensions::LAUNCH_TYPE_INVALID; GURL launch_web_url; std::string description; std::string name; @@ -47,9 +47,9 @@ using AppStateMap = std::map<std::string, AppState>; -AppState::AppState() : launch_type(extensions::LAUNCH_TYPE_INVALID) {} +AppState::AppState() = default; -AppState::~AppState() {} +AppState::~AppState() = default; bool AppState::IsValid() const { return page_ordinal.IsValid() && app_launch_ordinal.IsValid(); @@ -221,4 +221,4 @@ SyncAppHelper::SyncAppHelper() : setup_completed_(false) {} -SyncAppHelper::~SyncAppHelper() {} +SyncAppHelper::~SyncAppHelper() = default;
diff --git a/chrome/browser/sync/test/integration/sync_app_list_helper.cc b/chrome/browser/sync/test/integration/sync_app_list_helper.cc index 474cb2e9..068bbcf 100644 --- a/chrome/browser/sync/test/integration/sync_app_list_helper.cc +++ b/chrome/browser/sync/test/integration/sync_app_list_helper.cc
@@ -28,10 +28,9 @@ return instance; } -SyncAppListHelper::SyncAppListHelper() - : test_(nullptr), setup_completed_(false) {} +SyncAppListHelper::SyncAppListHelper() = default; -SyncAppListHelper::~SyncAppListHelper() {} +SyncAppListHelper::~SyncAppListHelper() = default; void SyncAppListHelper::SetupIfNecessary(SyncTest* test) { if (setup_completed_) {
diff --git a/chrome/browser/sync/test/integration/sync_app_list_helper.h b/chrome/browser/sync/test/integration/sync_app_list_helper.h index 40fdde0..c5d9765 100644 --- a/chrome/browser/sync/test/integration/sync_app_list_helper.h +++ b/chrome/browser/sync/test/integration/sync_app_list_helper.h
@@ -63,8 +63,8 @@ ChromeAppListItem* item, const std::string& label); - SyncTest* test_; - bool setup_completed_; + SyncTest* test_ = nullptr; + bool setup_completed_ = false; }; #endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_APP_LIST_HELPER_H_
diff --git a/chrome/browser/sync/test/integration/sync_arc_package_helper.cc b/chrome/browser/sync/test/integration/sync_arc_package_helper.cc index eb9e2df..e9ea2d2a 100644 --- a/chrome/browser/sync/test/integration/sync_arc_package_helper.cc +++ b/chrome/browser/sync/test/integration/sync_arc_package_helper.cc
@@ -51,10 +51,9 @@ return specifics; } -SyncArcPackageHelper::SyncArcPackageHelper() - : test_(nullptr), setup_completed_(false) {} +SyncArcPackageHelper::SyncArcPackageHelper() = default; -SyncArcPackageHelper::~SyncArcPackageHelper() {} +SyncArcPackageHelper::~SyncArcPackageHelper() = default; void SyncArcPackageHelper::SetupTest(SyncTest* test) { if (setup_completed_) {
diff --git a/chrome/browser/sync/test/integration/sync_arc_package_helper.h b/chrome/browser/sync/test/integration/sync_arc_package_helper.h index fed38ab..3eb580a7 100644 --- a/chrome/browser/sync/test/integration/sync_arc_package_helper.h +++ b/chrome/browser/sync/test/integration/sync_arc_package_helper.h
@@ -69,8 +69,8 @@ // informaton as |profile2|. bool ArcPackageDetailsMatch(Profile* profile1, Profile* profile2); - SyncTest* test_; - bool setup_completed_; + SyncTest* test_ = nullptr; + bool setup_completed_ = false; std::unordered_map<Profile*, std::unique_ptr<FakeAppInstance>> instance_map_; };
diff --git a/chrome/browser/sync/test/integration/sync_auth_test.cc b/chrome/browser/sync/test/integration/sync_auth_test.cc index 35606050..4c9ddeb79 100644 --- a/chrome/browser/sync/test/integration/sync_auth_test.cc +++ b/chrome/browser/sync/test/integration/sync_auth_test.cc
@@ -95,12 +95,12 @@ class SyncAuthTest : public SyncTest { public: - SyncAuthTest() : SyncTest(SINGLE_CLIENT), bookmark_index_(0) {} + SyncAuthTest() : SyncTest(SINGLE_CLIENT) {} SyncAuthTest(const SyncAuthTest&) = delete; SyncAuthTest& operator=(const SyncAuthTest&) = delete; - ~SyncAuthTest() override {} + ~SyncAuthTest() override = default; // Helper function that adds a bookmark and waits for either an auth error, or // for the bookmark to be committed. Returns true if it detects an auth @@ -136,7 +136,7 @@ private: int GetNextBookmarkIndex() { return bookmark_index_++; } - int bookmark_index_; + int bookmark_index_ = 0; }; // Verify that sync works with a valid OAuth2 token.
diff --git a/chrome/browser/sync/test/integration/sync_errors_test.cc b/chrome/browser/sync/test/integration/sync_errors_test.cc index b8744ede..0d16d61 100644 --- a/chrome/browser/sync/test/integration/sync_errors_test.cc +++ b/chrome/browser/sync/test/integration/sync_errors_test.cc
@@ -105,7 +105,7 @@ SyncErrorTest(const SyncErrorTest&) = delete; SyncErrorTest& operator=(const SyncErrorTest&) = delete; - ~SyncErrorTest() override {} + ~SyncErrorTest() override = default; }; // Helper class that waits until the sync engine has hit an actionable error. @@ -117,7 +117,7 @@ ActionableErrorChecker(const ActionableErrorChecker&) = delete; ActionableErrorChecker& operator=(const ActionableErrorChecker&) = delete; - ~ActionableErrorChecker() override {} + ~ActionableErrorChecker() override = default; // Checks if an actionable error has been hit. Called repeatedly each time PSS // notifies observers of a state change.
diff --git a/chrome/browser/sync/test/integration/sync_exponential_backoff_test.cc b/chrome/browser/sync/test/integration/sync_exponential_backoff_test.cc index 116cc43d..55a2021 100644 --- a/chrome/browser/sync/test/integration/sync_exponential_backoff_test.cc +++ b/chrome/browser/sync/test/integration/sync_exponential_backoff_test.cc
@@ -28,7 +28,7 @@ SyncExponentialBackoffTest& operator=(const SyncExponentialBackoffTest&) = delete; - ~SyncExponentialBackoffTest() override {} + ~SyncExponentialBackoffTest() override = default; void SetUp() override { // This is needed to avoid spurious notifications initiated by the platform.
diff --git a/chrome/browser/sync/test/integration/sync_extension_helper.cc b/chrome/browser/sync/test/integration/sync_extension_helper.cc index 5ef00118..371b298 100644 --- a/chrome/browser/sync/test/integration/sync_extension_helper.cc +++ b/chrome/browser/sync/test/integration/sync_extension_helper.cc
@@ -46,7 +46,7 @@ SyncExtensionHelper::ExtensionState::ExtensionState() : enabled_state(ENABLED), disable_reasons(0), incognito_enabled(false) {} -SyncExtensionHelper::ExtensionState::~ExtensionState() {} +SyncExtensionHelper::ExtensionState::~ExtensionState() = default; bool SyncExtensionHelper::ExtensionState::Equals( const SyncExtensionHelper::ExtensionState& other) const { @@ -64,7 +64,7 @@ SyncExtensionHelper::SyncExtensionHelper() : setup_completed_(false) {} -SyncExtensionHelper::~SyncExtensionHelper() {} +SyncExtensionHelper::~SyncExtensionHelper() = default; void SyncExtensionHelper::SetupIfNecessary(SyncTest* test) { if (setup_completed_)
diff --git a/chrome/browser/sync/test/integration/themes_helper.cc b/chrome/browser/sync/test/integration/themes_helper.cc index 28a55cb..1837d2f2 100644 --- a/chrome/browser/sync/test/integration/themes_helper.cc +++ b/chrome/browser/sync/test/integration/themes_helper.cc
@@ -102,7 +102,7 @@ weak_ptr_factory_.GetWeakPtr())); } -ThemePendingInstallChecker::~ThemePendingInstallChecker() {} +ThemePendingInstallChecker::~ThemePendingInstallChecker() = default; bool ThemePendingInstallChecker::IsExitConditionSatisfied(std::ostream* os) { *os << "Waiting for pending theme to be '" << theme_ << "'";
diff --git a/chrome/browser/sync/test/integration/two_client_autocomplete_sync_test.cc b/chrome/browser/sync/test/integration/two_client_autocomplete_sync_test.cc index 7823891..9243db5 100644 --- a/chrome/browser/sync/test/integration/two_client_autocomplete_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_autocomplete_sync_test.cc
@@ -25,7 +25,7 @@ TwoClientAutocompleteSyncTest& operator=( const TwoClientAutocompleteSyncTest&) = delete; - ~TwoClientAutocompleteSyncTest() override {} + ~TwoClientAutocompleteSyncTest() override = default; bool TestUsesSelfNotifications() override { return false; } };
diff --git a/chrome/browser/sync/test/integration/two_client_autofill_sync_test.cc b/chrome/browser/sync/test/integration/two_client_autofill_sync_test.cc index 40d45149..6cd79c1 100644 --- a/chrome/browser/sync/test/integration/two_client_autofill_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_autofill_sync_test.cc
@@ -14,6 +14,7 @@ #include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/browser/webdata/autofill_table.h" #include "components/autofill/core/common/autofill_features.h" +#include "components/sync/engine/cycle/entity_change_metric_recording.h" #include "content/public/test/browser_test.h" #include "testing/gtest/include/gtest/gtest.h" @@ -39,17 +40,6 @@ using autofill_helper::SetCreditCards; using autofill_helper::UpdateProfile; -// Copied from data_type_debug_info_emitter.cc. -enum ModelTypeEntityChange { - LOCAL_DELETION = 0, - LOCAL_CREATION = 1, - LOCAL_UPDATE = 2, - REMOTE_DELETION = 3, - REMOTE_NON_INITIAL_UPDATE = 4, - REMOTE_INITIAL_UPDATE = 5, - MODEL_TYPE_ENTITY_CHANGE_COUNT = 6 -}; - class TwoClientAutofillProfileSyncTest : public SyncTest { public: TwoClientAutofillProfileSyncTest() : SyncTest(TWO_CLIENT) {} @@ -104,7 +94,8 @@ // Each of the clients deletes one profile. histograms.ExpectBucketCount("Sync.ModelTypeEntityChange3.AUTOFILL_PROFILE", - LOCAL_DELETION, 2); + syncer::ModelTypeEntityChange::kLocalDeletion, + 2); } IN_PROC_BROWSER_TEST_F(TwoClientAutofillProfileSyncTest, @@ -132,11 +123,14 @@ // back as a non-initial update, for a total of 1 initial and 3 non-initial // updates. histograms.ExpectBucketCount("Sync.ModelTypeEntityChange3.AUTOFILL_PROFILE", - LOCAL_CREATION, 2); - histograms.ExpectBucketCount("Sync.ModelTypeEntityChange3.AUTOFILL_PROFILE", - REMOTE_INITIAL_UPDATE, 1); - histograms.ExpectBucketCount("Sync.ModelTypeEntityChange3.AUTOFILL_PROFILE", - REMOTE_NON_INITIAL_UPDATE, 3); + syncer::ModelTypeEntityChange::kLocalCreation, + 2); + histograms.ExpectBucketCount( + "Sync.ModelTypeEntityChange3.AUTOFILL_PROFILE", + syncer::ModelTypeEntityChange::kRemoteInitialUpdate, 1); + histograms.ExpectBucketCount( + "Sync.ModelTypeEntityChange3.AUTOFILL_PROFILE", + syncer::ModelTypeEntityChange::kRemoteNonInitialUpdate, 3); histograms.ExpectTotalCount("Sync.ModelTypeEntityChange3.AUTOFILL_PROFILE", 6); }
diff --git a/chrome/browser/sync/test/integration/two_client_os_preferences_sync_test.cc b/chrome/browser/sync/test/integration/two_client_os_preferences_sync_test.cc index 687cc943..e91178c 100644 --- a/chrome/browser/sync/test/integration/two_client_os_preferences_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_os_preferences_sync_test.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/sync/test/integration/sync_service_impl_harness.h" #include "chrome/browser/sync/test/integration/sync_settings_categorization_sync_test.h" #include "components/prefs/pref_service.h" +#include "components/sync/engine/cycle/entity_change_metric_recording.h" #include "content/public/test/browser_test.h" #include "testing/gtest/include/gtest/gtest.h" @@ -50,12 +51,12 @@ EXPECT_EQ(0, histogram_tester.GetBucketCount( "Sync.ModelTypeEntityChange3.OS_PREFERENCE", - /*REMOTE_INITIAL_UPDATE=*/5)); + syncer::ModelTypeEntityChange::kRemoteInitialUpdate)); // Client 0 may or may not see its own reflection during the test, but at // least client 1 should have received one update. EXPECT_NE(0, histogram_tester.GetBucketCount( "Sync.ModelTypeEntityChange3.OS_PREFERENCE", - /*REMOTE_NON_INITIAL_UPDATE=*/4)); + syncer::ModelTypeEntityChange::kRemoteNonInitialUpdate)); EXPECT_NE( 0U, histogram_tester
diff --git a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc index 3b744f0..6182cf3 100644 --- a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc
@@ -19,6 +19,7 @@ #include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h" #include "components/password_manager/core/browser/password_store_interface.h" +#include "components/sync/engine/cycle/entity_change_metric_recording.h" #include "components/sync/engine/cycle/sync_cycle_snapshot.h" #include "content/public/test/browser_test.h" @@ -370,9 +371,9 @@ // There should be only one deletion. This is to test the bug // (crbug.com/1046309) where the USS client was local deletions when receiving // remote deletions. - EXPECT_EQ( - 1, histogram_tester.GetBucketCount("Sync.ModelTypeEntityChange3.PASSWORD", - /*LOCAL_DELETION=*/0)); + EXPECT_EQ(1, histogram_tester.GetBucketCount( + "Sync.ModelTypeEntityChange3.PASSWORD", + syncer::ModelTypeEntityChange::kLocalDeletion)); } IN_PROC_BROWSER_TEST_F(TwoClientPasswordsSyncTest,
diff --git a/chrome/browser/sync/test/integration/two_client_preferences_sync_test.cc b/chrome/browser/sync/test/integration/two_client_preferences_sync_test.cc index 8af2355..58cf412 100644 --- a/chrome/browser/sync/test/integration/two_client_preferences_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_preferences_sync_test.cc
@@ -15,6 +15,7 @@ #include "chrome/common/pref_names.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" +#include "components/sync/engine/cycle/entity_change_metric_recording.h" #include "content/public/test/browser_test.h" #include "testing/gmock/include/gmock/gmock.h" @@ -40,7 +41,7 @@ TwoClientPreferencesSyncTest& operator=(const TwoClientPreferencesSyncTest&) = delete; - ~TwoClientPreferencesSyncTest() override {} + ~TwoClientPreferencesSyncTest() override = default; }; IN_PROC_BROWSER_TEST_F(TwoClientPreferencesSyncTest, E2E_ENABLED(Sanity)) { @@ -59,12 +60,12 @@ EXPECT_EQ(0, histogram_tester.GetBucketCount( "Sync.ModelTypeEntityChange3.PREFERENCE", - /*REMOTE_INITIAL_UPDATE=*/5)); + syncer::ModelTypeEntityChange::kRemoteInitialUpdate)); // Client 0 may or may not see its own reflection during the test, but at // least client 1 should have received one update. EXPECT_NE(0, histogram_tester.GetBucketCount( "Sync.ModelTypeEntityChange3.PREFERENCE", - /*REMOTE_NON_INITIAL_UPDATE=*/4)); + syncer::ModelTypeEntityChange::kRemoteNonInitialUpdate)); EXPECT_NE( 0U, histogram_tester
diff --git a/chrome/browser/sync/test/integration/two_client_printers_sync_test.cc b/chrome/browser/sync/test/integration/two_client_printers_sync_test.cc index c3d2b5e..398007f 100644 --- a/chrome/browser/sync/test/integration/two_client_printers_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_printers_sync_test.cc
@@ -42,7 +42,7 @@ TwoClientPrintersSyncTest& operator=(const TwoClientPrintersSyncTest&) = delete; - ~TwoClientPrintersSyncTest() override {} + ~TwoClientPrintersSyncTest() override = default; }; } // namespace
diff --git a/chrome/browser/sync/test/integration/two_client_send_tab_to_self_sync_test.cc b/chrome/browser/sync/test/integration/two_client_send_tab_to_self_sync_test.cc index 852a1b6c5..0bfbd7ae 100644 --- a/chrome/browser/sync/test/integration/two_client_send_tab_to_self_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_send_tab_to_self_sync_test.cc
@@ -39,7 +39,7 @@ TwoClientSendTabToSelfSyncTest& operator=( const TwoClientSendTabToSelfSyncTest&) = delete; - ~TwoClientSendTabToSelfSyncTest() override {} + ~TwoClientSendTabToSelfSyncTest() override = default; }; IN_PROC_BROWSER_TEST_F(TwoClientSendTabToSelfSyncTest,
diff --git a/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc b/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc index 2a169910..578172b 100644 --- a/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc
@@ -50,7 +50,7 @@ TwoClientSessionsSyncTest& operator=(const TwoClientSessionsSyncTest&) = delete; - ~TwoClientSessionsSyncTest() override {} + ~TwoClientSessionsSyncTest() override = default; bool WaitForForeignSessionsToSync(int local_index, int non_local_index) { return ForeignSessionsMatchChecker(non_local_index, local_index).Wait(); @@ -92,7 +92,7 @@ // Close one of the two tabs. We also issue another navigation to make sure // association logic kicks in. - CloseTab(/*index=*/0, /*tab_index=*/1); + CloseTab(/*browser_index=*/0, /*tab_index=*/1); NavigateTab(0, GURL(kURL3)); EXPECT_TRUE(WaitForForeignSessionsToSync(0, 1));
diff --git a/chrome/browser/sync/test/integration/two_client_themes_sync_test.cc b/chrome/browser/sync/test/integration/two_client_themes_sync_test.cc index f57c2df..269578e 100644 --- a/chrome/browser/sync/test/integration/two_client_themes_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_themes_sync_test.cc
@@ -25,7 +25,7 @@ TwoClientThemesSyncTest(const TwoClientThemesSyncTest&) = delete; TwoClientThemesSyncTest& operator=(const TwoClientThemesSyncTest&) = delete; - ~TwoClientThemesSyncTest() override {} + ~TwoClientThemesSyncTest() override = default; }; // Starts with default themes, then sets up sync and uses it to set all
diff --git a/chrome/browser/sync/test/integration/two_client_typed_urls_sync_test.cc b/chrome/browser/sync/test/integration/two_client_typed_urls_sync_test.cc index a350bf1a..302759e 100644 --- a/chrome/browser/sync/test/integration/two_client_typed_urls_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_typed_urls_sync_test.cc
@@ -61,7 +61,7 @@ TwoClientTypedUrlsSyncTest& operator=(const TwoClientTypedUrlsSyncTest&) = delete; - ~TwoClientTypedUrlsSyncTest() override {} + ~TwoClientTypedUrlsSyncTest() override = default; ::testing::AssertionResult CheckClientsEqual() { history::URLRows urls = GetTypedUrlsFromClient(0); @@ -81,8 +81,8 @@ bool CheckNoDuplicateVisits() { for (int i = 0; i < num_clients(); ++i) { history::URLRows urls = GetTypedUrlsFromClient(i); - for (size_t j = 0; j < urls.size(); ++j) { - history::VisitVector visits = GetVisitsFromClient(i, urls[j].id()); + for (const history::URLRow& url : urls) { + history::VisitVector visits = GetVisitsFromClient(i, url.id()); if (!AreVisitsUnique(visits)) return false; } @@ -735,8 +735,8 @@ ASSERT_EQ(2U, urls.size()); // Make sure the imported URL didn't make it over. - for (size_t i = 0; i < urls.size(); ++i) { - ASSERT_NE(imported_url, urls[i].url()); + for (const history::URLRow& url : urls) { + ASSERT_NE(imported_url, url.url()); } } @@ -836,6 +836,6 @@ EXPECT_EQ(count_for_dummy, 1u); histogram_tester.ExpectBucketCount( "Sync.ModelTypeOrphanMetadata.ModelReadyToSync", - /*bucket=*/ModelTypeHistogramValue(syncer::TYPED_URLS), - /*count=*/1); + /*sample=*/ModelTypeHistogramValue(syncer::TYPED_URLS), + /*expected_count=*/1); }
diff --git a/chrome/browser/sync/test/integration/two_client_wallet_sync_test.cc b/chrome/browser/sync/test/integration/two_client_wallet_sync_test.cc index d8385f90..9015cd3c 100644 --- a/chrome/browser/sync/test/integration/two_client_wallet_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_wallet_sync_test.cc
@@ -60,7 +60,7 @@ TwoClientWalletSyncTest(const TwoClientWalletSyncTest&) = delete; TwoClientWalletSyncTest& operator=(const TwoClientWalletSyncTest&) = delete; - ~TwoClientWalletSyncTest() override {} + ~TwoClientWalletSyncTest() override = default; // Needed for AwaitQuiescence(). bool TestUsesSelfNotifications() override { return true; }
diff --git a/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac_win_linux.cc b/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac_win_linux.cc index 40dcc53..69318e0 100644 --- a/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac_win_linux.cc +++ b/chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac_win_linux.cc
@@ -209,16 +209,10 @@ } // TODO(crbug.com/1301414): Mac shims failing to launch on Mac debug and ASAN. -#if BUILDFLAG(IS_MAC) -#define MAYBE_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_46SiteA_7SiteA_12SiteA_34SiteA_24 \ - DISABLED_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_46SiteA_7SiteA_12SiteA_34SiteA_24 -#else -#define MAYBE_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_46SiteA_7SiteA_12SiteA_34SiteA_24 \ - WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_46SiteA_7SiteA_12SiteA_34SiteA_24 -#endif +// TODO(crbug.com/1325429): Flaky. IN_PROC_BROWSER_TEST_F( TwoClientWebAppsIntegrationTestMacWinLinux, - MAYBE_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_46SiteA_7SiteA_12SiteA_34SiteA_24) { + DISABLED_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_40Client2_45SiteA_46SiteA_7SiteA_12SiteA_34SiteA_24) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported.
diff --git a/chrome/browser/sync/test/integration/typed_urls_helper.cc b/chrome/browser/sync/test/integration/typed_urls_helper.cc index 7c84da5..2fb1ac4 100644 --- a/chrome/browser/sync/test/integration/typed_urls_helper.cc +++ b/chrome/browser/sync/test/integration/typed_urls_helper.cc
@@ -47,7 +47,7 @@ void DoneRunOnMainThread() override {} private: - ~FlushHistoryDBQueueTask() override {} + ~FlushHistoryDBQueueTask() override = default; raw_ptr<base::WaitableEvent> wait_event_; }; @@ -68,7 +68,7 @@ void DoneRunOnMainThread() override {} private: - ~GetTypedUrlsTask() override {} + ~GetTypedUrlsTask() override = default; raw_ptr<history::URLRows> rows_; raw_ptr<base::WaitableEvent> wait_event_; @@ -93,7 +93,7 @@ void DoneRunOnMainThread() override {} private: - ~GetUrlTask() override {} + ~GetUrlTask() override = default; GURL url_; raw_ptr<history::URLRow> row_; @@ -119,7 +119,7 @@ void DoneRunOnMainThread() override {} private: - ~GetVisitsTask() override {} + ~GetVisitsTask() override = default; history::URLID id_; raw_ptr<history::VisitVector> visits_; @@ -143,7 +143,7 @@ void DoneRunOnMainThread() override {} private: - ~RemoveVisitsTask() override {} + ~RemoveVisitsTask() override = default; const history::VisitVector& visits_; raw_ptr<base::WaitableEvent> wait_event_; @@ -171,7 +171,7 @@ GetTypedUrlsMetadataTask(syncer::MetadataBatch* metadata_batch, base::WaitableEvent* event) : metadata_batch_(metadata_batch), wait_event_(event) {} - ~GetTypedUrlsMetadataTask() override {} + ~GetTypedUrlsMetadataTask() override = default; bool RunOnDBThread(history::HistoryBackend* backend, history::HistoryDatabase* db) override { @@ -219,7 +219,8 @@ ui::PageTransition transition, history::VisitSource source, const base::Time& timestamp) { - service->AddPage(url, timestamp, /*scope=*/nullptr, /*nav_entry_id=*/1234, + service->AddPage(url, timestamp, /*context_id=*/nullptr, + /*nav_entry_id=*/1234, /*referrer=*/GURL(), history::RedirectList(), transition, source, /*did_replace_entry=*/false, /*floc_allowed=*/false); @@ -477,13 +478,13 @@ const history::URLRows& right) { if (left.size() != right.size()) return false; - for (size_t i = 0; i < left.size(); ++i) { + for (const history::URLRow& left_url_row : left) { // URLs could be out-of-order, so look for a matching URL in the second // array. bool found = false; - for (size_t j = 0; j < right.size(); ++j) { - if (left[i].url() == right[j].url()) { - if (CheckURLRowsAreEqualForTypedURLs(left[i], right[j])) { + for (const history::URLRow& right_url_row : right) { + if (left_url_row.url() == right_url_row.url()) { + if (CheckURLRowsAreEqualForTypedURLs(left_url_row, right_url_row)) { found = true; break; } @@ -511,10 +512,10 @@ bool AreVisitsUnique(const history::VisitVector& visits) { base::Time t = base::Time::FromInternalValue(0); - for (size_t i = 0; i < visits.size(); ++i) { - if (t == visits[i].visit_time) + for (const history::VisitRow& visit : visits) { + if (t == visit.visit_time) return false; - t = visits[i].visit_time; + t = visit.visit_time; } return true; } @@ -625,7 +626,7 @@ index_(index), url_(url) {} -TypedURLChecker::~TypedURLChecker() {} +TypedURLChecker::~TypedURLChecker() = default; bool TypedURLChecker::IsExitConditionSatisfied(std::ostream* os) { *os << "Waiting for data for url '" << url_ << "' to be populated.";
diff --git a/chrome/browser/sync/test/integration/updated_progress_marker_checker.cc b/chrome/browser/sync/test/integration/updated_progress_marker_checker.cc index c92930bc..27500b4 100644 --- a/chrome/browser/sync/test/integration/updated_progress_marker_checker.cc +++ b/chrome/browser/sync/test/integration/updated_progress_marker_checker.cc
@@ -23,7 +23,7 @@ weak_ptr_factory_.GetWeakPtr())); } -UpdatedProgressMarkerChecker::~UpdatedProgressMarkerChecker() {} +UpdatedProgressMarkerChecker::~UpdatedProgressMarkerChecker() = default; bool UpdatedProgressMarkerChecker::IsExitConditionSatisfied(std::ostream* os) { *os << "Waiting for progress markers";
diff --git a/chrome/browser/sync/user_event_service_factory.cc b/chrome/browser/sync/user_event_service_factory.cc index daa5b3e..c5b0557 100644 --- a/chrome/browser/sync/user_event_service_factory.cc +++ b/chrome/browser/sync/user_event_service_factory.cc
@@ -46,7 +46,7 @@ DependsOn(SessionSyncServiceFactory::GetInstance()); } -UserEventServiceFactory::~UserEventServiceFactory() {} +UserEventServiceFactory::~UserEventServiceFactory() = default; KeyedService* UserEventServiceFactory::BuildServiceInstanceFor( content::BrowserContext* context) const {
diff --git a/chrome/browser/task_manager/providers/vm/vm_process_task_provider.cc b/chrome/browser/task_manager/providers/vm/vm_process_task_provider.cc index d056426..5e332c0 100644 --- a/chrome/browser/task_manager/providers/vm/vm_process_task_provider.cc +++ b/chrome/browser/task_manager/providers/vm/vm_process_task_provider.cc
@@ -7,6 +7,7 @@ #include "base/base64.h" #include "base/bind.h" #include "base/containers/flat_set.h" +#include "base/process/process.h" #include "base/process/process_iterator.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" @@ -17,6 +18,7 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/task_manager/providers/vm/crostini_process_task.h" #include "chrome/browser/task_manager/providers/vm/plugin_vm_process_task.h" +#include "chromeos/ash/components/dbus/concierge/concierge_client.h" namespace task_manager { @@ -45,123 +47,8 @@ return base::kNullProcessId; } -// Check for the possible suffixes on VM disk names. The actual name before -// the suffix will be the base64 encoded name of the VM itself. -bool HasValidVmDiskExtension(const std::string& filename) { - constexpr const char* valid_extensions[] = { - ".qcow2", - ".img", - }; - - for (auto* const ext : valid_extensions) { - if (filename.find(ext) != std::string::npos) { - return true; - } - } - return false; -} - -// The argument this is extracting from will look like this: -// /run/daemon-store/crosvm/53d63eda33c610d37b44cde8ed06854a05e9cc84/dGVybWluYQ==.img -// This is the path to a VM disk in the user's cryptohome that's not exposed to -// the user in the Files app, consisting of the path to crosvm's daemon store, -// the user hash, then the base64 encoded VM name with a .qcow2/.img extension. -bool CrostiniExtractVmNameAndOwnerId(const std::string& arg, - std::string* vm_name_out, - std::string* owner_id_out) { - DCHECK(vm_name_out); - DCHECK(owner_id_out); - - // All VM disk images are contained in a subdirectory of this path. - constexpr char kVmDiskRoot[] = "/run/daemon-store"; - - // Skip paths that don't start with the correct prefix to filter out the - // rootfs .img file. - if (!base::StartsWith(arg, kVmDiskRoot, base::CompareCase::SENSITIVE)) { - return false; - } - - if (!HasValidVmDiskExtension(arg)) { - return false; - } - - const base::FilePath vm_disk_path(arg); - // The VM name is the base64 encoded string which is the name of the - // file itself without the extension. - base::Base64Decode(vm_disk_path.RemoveExtension().BaseName().value(), - vm_name_out); - - // The owner ID is the long hex string in there...which is 1 parent up. - // It's safe to call this even if there's not enough parents because the - // DirName of the root is still the root. - *owner_id_out = vm_disk_path.DirName().BaseName().value(); - - return true; -} - -// We are looking for an argument like this: -// /run/daemon-store/pvm/<cryptohome id>/UHZtRGVmYXVsdA==.pvm:/pvm:true -bool PluginVmExtractVmNameAndOwnerId(const std::string& arg, - std::string* vm_name_out, - std::string* owner_id_out) { - DCHECK(vm_name_out); - DCHECK(owner_id_out); - - constexpr char kArgStart[] = "/run/daemon-store/pvm/"; - constexpr char kArgEnd[] = ":/pvm:true"; - - // Skip paths that don't start/end with the expected prefix/suffix. - if (!base::StartsWith(arg, kArgStart, base::CompareCase::SENSITIVE)) - return false; - if (!base::EndsWith(arg, kArgEnd, base::CompareCase::SENSITIVE)) - return false; - - const base::FilePath vm_disk_path( - base::MakeStringPiece(arg.begin(), arg.end() - strlen(kArgEnd))); - - std::vector<std::string> components = vm_disk_path.GetComponents(); - - // Expect /, run, daemon-store, pvm, <owner_id>, vm_name.pvm - if (components.size() != 6) - return false; - - base::FilePath vm_subdir(components[5]); - if (vm_subdir.Extension() != ".pvm") - return false; - - // The VM name is the base64 encoded string which is the name of the - // file itself without the extension. - base::Base64Decode(vm_subdir.RemoveExtension().value(), vm_name_out); - - *owner_id_out = components[4]; - - return true; -} - -// This function attempts to identify if a process corresponds to a -// Crostini or Plugin VM instance by analyzing its command line arguments -// and extract owner ID and VM name from the arguments. -bool ExtractVmNameAndOwnerIdFromCmdLine(const std::vector<std::string>& cmdline, - std::string* vm_name_out, - std::string* owner_id_out, - bool* is_plugin_vm_out) { - DCHECK(vm_name_out); - DCHECK(owner_id_out); - DCHECK(is_plugin_vm_out); - - // Find the arg with the disk file path on it. - for (const auto& arg : cmdline) { - if (CrostiniExtractVmNameAndOwnerId(arg, vm_name_out, owner_id_out)) { - *is_plugin_vm_out = false; - return true; - } - if (PluginVmExtractVmNameAndOwnerId(arg, vm_name_out, owner_id_out)) { - *is_plugin_vm_out = true; - return true; - } - } - - return false; +chromeos::ConciergeClient* GetConciergeClient() { + return chromeos::ConciergeClient::Get(); } } // namespace @@ -204,26 +91,47 @@ return; } + Profile* profile = ProfileManager::GetActiveUserProfile(); + if (profile) { + const std::string active_owner_id = + crostini::CryptohomeIdForProfile(profile); + vm_tools::concierge::ListVmsRequest request; + request.set_owner_id(active_owner_id); + GetConciergeClient()->ListVms( + request, base::BindOnce(&VmProcessTaskProvider::OnListVms, + weak_ptr_factory_.GetWeakPtr(), snapshot)); + } +} + +void VmProcessTaskProvider::OnListVms( + const base::ProcessIterator::ProcessEntries& snapshot, + absl::optional<vm_tools::concierge::ListVmsResponse> response) { std::vector<VmProcessData> vm_process_list; const base::ProcessId vm_init_pid = GetVmInitProcessId(snapshot); - if (vm_init_pid == base::kNullProcessId) { + + if (vm_init_pid == base::kNullProcessId || !response.has_value()) { OnUpdateVmProcessList(vm_process_list); return; } - // Find all of the child processes of vm_concierge, the ones that are the - // crosvm program are the VM processes, we can then extract the name of the - // VM from its command line args. + std::map</*pid=*/int, const vm_tools::concierge::ExtendedVmInfo*> vms; + for (const auto& vm : response.value().vms()) { + vms[vm.vm_info().pid()] = &vm; + } + + // Find all of the child processes of vm_concierge, the ones that are having + // matching namespaced pid in vms are VM processes for (const base::ProcessEntry& entry : snapshot) { if (entry.parent_pid() == vm_init_pid && !entry.cmd_line_args().empty() && entry.cmd_line_args()[0] == kVmProcessName) { - std::string vm_name; - std::string owner_id; - bool is_plugin_vm; - if (ExtractVmNameAndOwnerIdFromCmdLine(entry.cmd_line_args(), &vm_name, - &owner_id, &is_plugin_vm)) { - vm_process_list.emplace_back(vm_name, owner_id, entry.pid(), - is_plugin_vm); + auto nspid = base::Process(entry.pid()).GetPidInNamespace(); + auto vm_entry = vms.find(nspid); + if (vm_entry != vms.end()) { + auto* vm = vm_entry->second; + vm_process_list.emplace_back( + vm->name(), vm->owner_id(), entry.pid(), + vm->vm_info().vm_type() == + vm_tools::concierge::VmInfo_VmType_PLUGIN_VM); } } } @@ -237,6 +145,7 @@ void VmProcessTaskProvider::StopUpdating() { ash::ProcessSnapshotServer::Get()->RemoveObserver(this); + weak_ptr_factory_.InvalidateWeakPtrs(); task_map_.clear(); }
diff --git a/chrome/browser/task_manager/providers/vm/vm_process_task_provider.h b/chrome/browser/task_manager/providers/vm/vm_process_task_provider.h index 2b2bad7..15db74f 100644 --- a/chrome/browser/task_manager/providers/vm/vm_process_task_provider.h +++ b/chrome/browser/task_manager/providers/vm/vm_process_task_provider.h
@@ -14,6 +14,8 @@ #include "chrome/browser/ash/process_snapshot_server.h" #include "chrome/browser/task_manager/providers/task_provider.h" #include "chrome/browser/task_manager/providers/vm/vm_process_task.h" +#include "chromeos/ash/components/dbus/concierge/concierge_service.pb.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace task_manager { @@ -44,12 +46,20 @@ void OnUpdateVmProcessList(const std::vector<VmProcessData>& vm_process_list); + // Called as a response to a ListVms made to the concierge. + void OnListVms(const base::ProcessIterator::ProcessEntries& snapshot, + absl::optional<vm_tools::concierge::ListVmsResponse> response); + // The time at which the most recent process snapshot was received from the // `ash::ProcessSnapshotServer`. base::Time last_process_snapshot_time_; // Map of PIDs to the corresponding Task object for a running VM. base::flat_map<base::ProcessId, std::unique_ptr<VmProcessTask>> task_map_; + + // Always keep this the last member of this class to make sure it's the + // first thing to be destructed. + base::WeakPtrFactory<VmProcessTaskProvider> weak_ptr_factory_{this}; }; } // namespace task_manager
diff --git a/chrome/browser/task_manager/providers/web_contents/tab_contents_tag_browsertest.cc b/chrome/browser/task_manager/providers/web_contents/tab_contents_tag_browsertest.cc index 35c75d3..8ce7ff0 100644 --- a/chrome/browser/task_manager/providers/web_contents/tab_contents_tag_browsertest.cc +++ b/chrome/browser/task_manager/providers/web_contents/tab_contents_tag_browsertest.cc
@@ -25,6 +25,7 @@ #include "content/public/browser/favicon_status.h" #include "content/public/browser/navigation_entry.h" #include "content/public/test/browser_test.h" +#include "content/public/test/fenced_frame_test_util.h" #include "content/public/test/test_utils.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "ui/base/l10n/l10n_util.h" @@ -340,4 +341,49 @@ gfx::Image(task->icon()))); } +class TabContentsTagFencedFrameTest : public TabContentsTagTest { + public: + TabContentsTagFencedFrameTest() = default; + ~TabContentsTagFencedFrameTest() override = default; + + content::WebContents* GetWebContents() { + return browser()->tab_strip_model()->GetActiveWebContents(); + } + + content::test::FencedFrameTestHelper& fenced_frame_test_helper() { + return fenced_frame_helper_; + } + + private: + content::test::FencedFrameTestHelper fenced_frame_helper_; +}; + +// Tests that a fenced frame doesn't update the title of its web contents' task +// via WebContentsTaskProvider::WebContentsEntry. +IN_PROC_BROWSER_TEST_F(TabContentsTagFencedFrameTest, + FencedFrameDoesNotUpdateTitle) { + MockWebContentsTaskManager task_manager; + EXPECT_TRUE(task_manager.tasks().empty()); + task_manager.StartObserving(); + ASSERT_EQ(1U, task_manager.tasks().size()); + + const GURL initial_url = embedded_test_server()->GetURL("/title3.html"); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), initial_url)); + const Task* primary_mainframe_task = task_manager.tasks().front(); + EXPECT_EQ(Task::RENDERER, primary_mainframe_task->GetType()); + EXPECT_EQ(primary_mainframe_task->title(), u"Tab: Title Of More Awesomeness"); + + // Create a fenced frame and load a URL. + const GURL kFencedFrameUrl = + embedded_test_server()->GetURL("/fenced_frames/title2.html"); + content::RenderFrameHost* fenced_frame_host = + fenced_frame_test_helper().CreateFencedFrame( + GetWebContents()->GetMainFrame(), kFencedFrameUrl); + EXPECT_NE(nullptr, fenced_frame_host); + + // The navigation in the fenced frame should not change the title of the + // primary mainframe's task to "Title Of Awesomeness". + EXPECT_EQ(primary_mainframe_task->title(), u"Tab: Title Of More Awesomeness"); +} + } // namespace task_manager
diff --git a/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc b/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc index 49b2b94..fd80a29c 100644 --- a/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc +++ b/chrome/browser/task_manager/providers/web_contents/web_contents_task_provider.cc
@@ -252,10 +252,7 @@ void WebContentsTaskProvider::WebContentsEntry::DidFinishNavigation( content::NavigationHandle* navigation_handle) { - // We only need to update tasks for main frame navigations. - // TODO(https://crbug.com/1218946): With MPArch there may be multiple main - // frames. This caller was converted automatically to the primary main frame - // to preserve its semantics. Follow up to confirm correctness. + // We only need to update tasks for primary main frame navigations. if (!navigation_handle->IsInPrimaryMainFrame()) return;
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 6542482..339ab078 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -11,7 +11,7 @@ import("//build/config/ui.gni") import("//chrome/browser/buildflags.gni") import("//chrome/common/features.gni") -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//chromeos/dbus/config/use_real_dbus_clients.gni") import("//components/feed/features.gni") @@ -3089,14 +3089,15 @@ "//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings", "//chrome/browser/web_applications", "//chrome/services/file_util/public/cpp", + "//chromeos/ash/components/assistant:buildflags", "//chromeos/ash/components/dbus/kerberos:kerberos_proto", "//chromeos/ash/components/dbus/os_install", "//chromeos/ash/components/dbus/pciguard:pciguard", "//chromeos/ash/components/dbus/spaced", "//chromeos/ash/components/dbus/system_clock", "//chromeos/ash/components/dbus/upstart", - "//chromeos/assistant:buildflags", - "//chromeos/components/human_presence", + "//chromeos/ash/components/human_presence", + "//chromeos/ash/resources", "//chromeos/components/local_search_service/public/cpp", "//chromeos/components/local_search_service/public/mojom", "//chromeos/components/onc", @@ -3125,7 +3126,6 @@ "//chromeos/login/login_state", "//chromeos/network", "//chromeos/printing", - "//chromeos/resources:resources_grit", "//chromeos/services/assistant:lib", "//chromeos/services/assistant/public/cpp", "//chromeos/services/assistant/public/mojom", @@ -3466,8 +3466,6 @@ if (enable_dice_support) { sources += [ - "bookmarks/bookmark_bubble_sign_in_delegate.cc", - "bookmarks/bookmark_bubble_sign_in_delegate.h", "passwords/account_storage_auth_helper.cc", "passwords/account_storage_auth_helper.h", "signin/dice_web_signin_interceptor_delegate.cc", @@ -3482,10 +3480,6 @@ "views/profiles/profile_picker_dice_sign_in_provider.h", "views/profiles/profile_picker_dice_sign_in_toolbar.cc", "views/profiles/profile_picker_dice_sign_in_toolbar.h", - "views/sync/dice_bubble_sync_promo_view.cc", - "views/sync/dice_bubble_sync_promo_view.h", - "views/sync/dice_signin_button_view.cc", - "views/sync/dice_signin_button_view.h", "webui/signin/dice_web_signin_intercept_handler.cc", "webui/signin/dice_web_signin_intercept_handler.h", "webui/signin/dice_web_signin_intercept_ui.cc", @@ -5136,6 +5130,8 @@ if (!is_chromeos_ash) { sources += [ + "bookmarks/bookmark_bubble_sign_in_delegate.cc", + "bookmarks/bookmark_bubble_sign_in_delegate.h", "dialogs/outdated_upgrade_bubble.cc", "dialogs/outdated_upgrade_bubble.h", "views/accessibility/accessibility_focus_highlight.cc", @@ -5151,6 +5147,10 @@ "views/relaunch_notification/relaunch_required_dialog_view.cc", "views/relaunch_notification/relaunch_required_dialog_view.h", "views/screen_capture_notification_ui_views.cc", + "views/sync/bubble_sync_promo_signin_button_view.cc", + "views/sync/bubble_sync_promo_signin_button_view.h", + "views/sync/bubble_sync_promo_view.cc", + "views/sync/bubble_sync_promo_view.h", ] }
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb index 49a9c34..3d086a1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
@@ -171,6 +171,7 @@ <translation id="1928696683969751773">Opdaterings</translation> <translation id="19288952978244135">Maak Chrome weer oop.</translation> <translation id="1933845786846280168">Gekose oortjie</translation> +<translation id="193571872656840963">Bewys dank aan hierdie skepper</translation> <translation id="1943432128510653496">Stoor wagwoorde</translation> <translation id="1952172573699511566">Webwerwe sal, indien moontlik, teks in jou voorkeurtaal vertoon.</translation> <translation id="1959679933317802873">Wag tans vir inhoud</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index 4627352..463a565 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -171,6 +171,7 @@ <translation id="1928696683969751773">ዝማኔዎች</translation> <translation id="19288952978244135">Chromeን ዳግም ክፈት።</translation> <translation id="1933845786846280168">የተመረጠው ትር</translation> +<translation id="193571872656840963">ለዚህ ፈጣሪ ምስጋና ያቅርቡ</translation> <translation id="1943432128510653496">የይለፍ ቃላትን አስቀምጥ</translation> <translation id="1952172573699511566">ሲቻል፣ ድር ጣቢያዎች በእርስዎ ተመራጭ ቋንቋ ጽሑፍ ይታያሉ።</translation> <translation id="1959679933317802873">ይዘትን በመጠባበቅ ላይ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb index 6f923a5..4c2c4f6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">تتم حاليًا متابعة <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">محرك البحث</translation> <translation id="1513352483775369820">الإشارات المرجعية وسجلّ الويب</translation> +<translation id="1513814250881909472">يمكنك تفعيل المزامنة للحصول على علامات التبويب من أجهزتك الأخرى.</translation> <translation id="1513858653616922153">حذف كلمة المرور</translation> <translation id="1518421282666914498">رمز تعبيري بتنسيق GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">نشط اليوم</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">للمتابعة، سيشارك <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> اسمك وعنوان بريدك الإلكتروني وصورة ملفك الشخصي مع هذا الموقع الإلكتروني. ويمكنك الاطّلاع على <ph name="BEGIN_LINK1" />سياسة الخصوصية<ph name="END_LINK1" /> لهذا الموقع الإلكتروني.</translation> <translation id="2000419248597011803">يُرسِل بعض ملفات تعريف الارتباط وعمليات البحث من شريط العناوين ومربّع البحث إلى محرِّك البحث التلقائي.</translation> <translation id="200114059308480249">هل تريد تضمين النص المحيط في عمليات البحث على Google؟</translation> +<translation id="2011996512573319870">يمكنك تفعيل المزامنة للحصول على المحتوى الأكثر صلة من Google.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{ملف واحد (#)}zero{# ملف}two{ملفان (#)}few{# ملفات}many{# ملفًا}other{# ملف}}</translation> <translation id="2020309681647789787">سيظهر لك سجلّ التصفّح على جميع الأجهزة التي تتم مزامنة حسابك معها، ما يعني أنه يمكنك متابعة التصفّح من حيث توقفت.</translation> <translation id="2021896219286479412">عناصر التحكم لموقع في وضع ملء الشاشة</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">الاستهلاك الحالي لطاقة البطارية</translation> <translation id="2472163211318554013">تسجيل الدخول للاستفادة إلى أقصى حدّ من Chrome</translation> <translation id="247737702124049222">ميزة أوصاف الصور مفعَّلة.</translation> +<translation id="2481251096908459228">الاطّلاع على قصص مُختارة لك</translation> <translation id="2482878487686419369">الإشعارات</translation> <translation id="2485422356828889247">إزالة التثبيت</translation> <translation id="2494974097748878569">"مساعد Google" على Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{ملف صوتي واحد (#)}zero{# ملف صوتي}two{ملفان صوتيان (#)}few{# ملفات صوتية}many{# ملفًا صوتيًا}other{# ملف صوتي}}</translation> <translation id="265156376773362237">التحميل المُسبق العادي</translation> <translation id="2656405586795711023">تطبيقات الويب</translation> +<translation id="2700802943130197326">يمكنك تفعيل المزامنة للحصول على كلمات المرور والإشارات المرجعية وغيرها الكثير على جميع أجهزتك الأخرى.</translation> <translation id="2702516483241149200">ميزة جديدة: يمكنك مشاركة رابط يؤدي إلى هذا النص.</translation> <translation id="2704606927547763573">تم النسخ</translation> <translation id="2707726405694321444">إعادة تحميل الصفحة</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">قائمة خيارات المشاركة مفتوحة بطول الشاشة.</translation> <translation id="4165986682804962316">إعدادات المواقع الإلكترونية</translation> <translation id="4170011742729630528">الخدمة غير متاحة، أعد المحاولة لاحقًا.</translation> +<translation id="4177222230309051052">الحصول على جميع الإشارات المرجعية</translation> <translation id="4181841719683918333">اللغات</translation> <translation id="4195643157523330669">الفتح في علامة تبويب جديدة</translation> <translation id="4196597275619698563">إنشاء بطاقة</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">لم نتمكّن من العثور على تلك الصفحة. تحقّق من تهجئة الكلمات أو جرِّب البحث على الويب.</translation> <translation id="4988526792673242964">الصفحات</translation> <translation id="5001388021414335527">متابعة هذا الموقع الإلكتروني هنا</translation> +<translation id="500351648694011114">التصفُّح بسهولة أكبر</translation> <translation id="5004416275253351869">عناصر التحكم بالنشاط على Google</translation> <translation id="5005141133360250920">تم حذف الرمز التعبيري للتفاعل.</translation> <translation id="5005498671520578047">نسخ كلمة المرور</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">في انتظار تنزيل آخر…</translation> <translation id="5865733239029070421">يُرسِل إحصاءات الاستخدام وتقارير الأعطال إلى Google تلقائيًا.</translation> <translation id="5869522115854928033">كلمات المرور المحفوظة</translation> +<translation id="5869789175361934029">متابعة من جهاز آخر</translation> <translation id="587735546353481577">لمتابعة موقع إلكتروني، انتقِل إلى الموقع الإلكتروني وافتح قائمة Chrome وانقر على "متابعة".</translation> <translation id="5880748256563468367">الانتقال إلى الخلاصة</translation> <translation id="5884076754568147479">لمساعدتك على إنجاز المهام، ستتلقى Google عناوين URL للمواقع الإلكترونية ومحتواها عند استخدامك "مساعد Google" على تلك المواقع، بالإضافة إلى المعلومات التي يتم إرسالها من خلال "مساعد Google".</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">مشاركة…</translation> <translation id="8912362522468806198">حساب Google</translation> <translation id="8920114477895755567">الانتظار للحصول على تفاصيل الآباء</translation> +<translation id="8921980840204105660">يمكنك تفعيل المزامنة للحصول على الإشارات المرجعية من أجهزتك الأخرى.</translation> <translation id="8922289737868596582">تنزيل الصفحات من الزر "مزيد من الخيارات" لاستخدامها بلا اتصال بالإنترنت</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> جاهز</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index cde988fd5a..6cdf051b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -171,6 +171,7 @@ <translation id="1928696683969751773">Güncəlləşmələr</translation> <translation id="19288952978244135">Chrome'u yenidən açın.</translation> <translation id="1933845786846280168">Seçilmiş Panel</translation> +<translation id="193571872656840963">Bu yaradıcıya təşəkkürü göstərin</translation> <translation id="1943432128510653496">Parolları yadda saxlayın</translation> <translation id="1952172573699511566">Mümkün olduqda veb səhifələr tərcih etdiyiniz dildə mətn göstərəcək.</translation> <translation id="1959679933317802873">Məzmun gözlənilir</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index 4797a69..a7a998b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Вы падпісаны на сайт "<ph name="SITE_NAME" />"</translation> <translation id="1506061864768559482">Пошукавая сістэма</translation> <translation id="1513352483775369820">Закладкі і гісторыя вэб-пошуку</translation> +<translation id="1513814250881909472">Каб укладкі з іншых прылад сталі даступнымі, уключыце сінхранізацыю</translation> <translation id="1513858653616922153">Выдаліць пароль</translation> <translation id="1518421282666914498">Файл GIF з эмоцыяй <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Апошнія дзеянні адбываліся сёння</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Каб працягнуць, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> абагуліць ваша імя, адрас электроннай пошты і відарыс профілю з гэтым сайтам. Азнаёмцеся з <ph name="BEGIN_LINK1" />палітыкай прыватнасці<ph name="END_LINK1" /> сайта.</translation> <translation id="2000419248597011803">Адпраўляе вашай стандартнай пошукавай сістэме некаторыя файлы cookie, а таксама пошукавыя запыты, уведзеныя ў адрасным радку і полі пошуку</translation> <translation id="200114059308480249">Дадаваць кантэкст у пошукавыя запыты Google?</translation> +<translation id="2011996512573319870">Каб атрымліваць найбольш адпаведнае змесціва ад Google, уключыце сінхранізацыю</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# файл}one{# файл}few{# файлы}many{# файлаў}other{# файла}}</translation> <translation id="2020309681647789787">Ваша гісторыя будзе захоўвацца на ўсіх сінхранізаваных прыладах, каб вы заўжды маглі працягнуць рабіць на любой з гэтых прылад тое, што перад гэтым рабілі на іншай.</translation> <translation id="2021896219286479412">Кіраванне сайтам на ўвесь экран</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Цяпер</translation> <translation id="2472163211318554013">Увайдзіце ва ўліковы запіс, каб карыстацца ўсімі магчымасцямі Chrome</translation> <translation id="247737702124049222">Апісанні відарысаў уключаны</translation> +<translation id="2481251096908459228">Гісторыі, падабраныя для вас</translation> <translation id="2482878487686419369">Апавяшчэнні</translation> <translation id="2485422356828889247">Выдаліць</translation> <translation id="2494974097748878569">Памочнік Google у Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# аўдыяфайл}one{# аўдыяфайл}few{# аўдыяфайлы}many{# аўдыяфайлаў}other{# аўдыяфайла}}</translation> <translation id="265156376773362237">Стандартная перадзагрузка</translation> <translation id="2656405586795711023">Вэб-праграмы</translation> +<translation id="2700802943130197326">Каб карыстацца паролямі, закладкамі і іншым змесцівам на ўсіх сваіх прыладах, уключыце сінхранізацыю.</translation> <translation id="2702516483241149200">Навінка: абагульце спасылку, пры выкарыстанні якой старонка прагартаецца гэтага фрагмента тэксту</translation> <translation id="2704606927547763573">Скапіравана</translation> <translation id="2707726405694321444">Абнавіць старонку</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Спіс варыянтаў абагульвання разгорнуты на ўвесь экран.</translation> <translation id="4165986682804962316">Налады сайта</translation> <translation id="4170011742729630528">Сэрвіс недаступны. Паўтарыце спробу пазней.</translation> +<translation id="4177222230309051052">Трымайце ўсе свае закладкі пад рукой</translation> <translation id="4181841719683918333">Мовы</translation> <translation id="4195643157523330669">Адкрыць у новай укладцы</translation> <translation id="4196597275619698563">Стварыць картку</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Не ўдалося знайсці старонку. Праверце правільнасць напісання запыту або паспрабуйце выканаць пошук у інтэрнэце.</translation> <translation id="4988526792673242964">Старонкі</translation> <translation id="5001388021414335527">Падпісацца на сайт можна тут</translation> +<translation id="500351648694011114">Зручнейшы прагляд старонак</translation> <translation id="5004416275253351869">Параметры дзейнасці Google</translation> <translation id="5005141133360250920">Рэакцыя выдалена</translation> <translation id="5005498671520578047">Капіраваць пароль</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Чаканне іншай спампоўкі…</translation> <translation id="5865733239029070421">Аўтаматычна адпраўляе ў Google статыстыку выкарыстання і справаздачы аб збоях</translation> <translation id="5869522115854928033">Захаваныя паролі</translation> +<translation id="5869789175361934029">Працягніце з іншай прылады</translation> <translation id="587735546353481577">Каб падпісацца на сайт, перайдзіце на яго, адкрыйце меню Chrome і націсніце "Падпісацца".</translation> <translation id="5880748256563468367">Перайсці да стужкі</translation> <translation id="5884076754568147479">Каб дапамагаць вам выконваць задачы, Google будзе збіраць URL-адрасы і змесціва сайтаў, на якіх вы выкарыстоўваеце Памочніка, а таксама інфармацыю, якую вы перадаяце праз яго</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Абагуліць…</translation> <translation id="8912362522468806198">Уліковы запіс Google</translation> <translation id="8920114477895755567">Чакаюцца падрабязныя даныя бацькоў.</translation> +<translation id="8921980840204105660">Каб закладкі з іншых прылад сталі даступнымі, уключыце сінхранізацыю</translation> <translation id="8922289737868596582">Спампуйце старонкі з меню кнопкі Дадатковыя параметры, каб праглядаць іх па-за сеткай</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" />: спампавана</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index a695410a..fb5eff6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Следвате <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Търсеща машина</translation> <translation id="1513352483775369820">Отметки и посетени сайтове</translation> +<translation id="1513814250881909472">Включете синхронизирането, за да получите разделите от другите си устройства</translation> <translation id="1513858653616922153">Изтриване на паролата</translation> <translation id="1518421282666914498">Емоция чрез GIF: <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Активно днес</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">За да продължите, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ще сподели с този сайт името, имейл адреса и снимката на потребителския ви профил. Вижте <ph name="BEGIN_LINK1" />декларацията за поверителност<ph name="END_LINK1" /> на сайта.</translation> <translation id="2000419248597011803">Изпраща някои „бисквитки“ и заявките за търсене от адресната лента и полето за търсене до стандартната ви търсеща машина</translation> <translation id="200114059308480249">Да се включи ли съседният текст в търсенията с Google?</translation> +<translation id="2011996512573319870">Включете синхронизирането, за да получавате най-подходящото съдържание от Googlе</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# файл}other{# файла}}</translation> <translation id="2020309681647789787">Историята ви ще бъде достъпна на всичките ви синхронизирани устройства и ще можете да продължите това, което сте правили</translation> <translation id="2021896219286479412">Контроли за сайтове на цял екран</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Ток</translation> <translation id="2472163211318554013">Влезте в профила си, за да се възползвате максимално от Chrome</translation> <translation id="247737702124049222">Функцията за описания на изображенията е включена</translation> +<translation id="2481251096908459228">Преглеждайте истории за вас</translation> <translation id="2482878487686419369">Известия</translation> <translation id="2485422356828889247">Деинсталиране</translation> <translation id="2494974097748878569">Google Асистент в Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# аудиофайл}other{# аудиофайла}}</translation> <translation id="265156376773362237">Стандартно предварит. зареждане</translation> <translation id="2656405586795711023">Уеб приложения</translation> +<translation id="2700802943130197326">Включете синхронизирането, за да получите своите пароли, отметки и др. на всичките си устройства.</translation> <translation id="2702516483241149200">Ново: споделяне на връзка, която превърта до този текст</translation> <translation id="2704606927547763573">Копирано</translation> <translation id="2707726405694321444">Опресняване на страницата</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Списъкът с опции за споделяне е отворен върху целия екран.</translation> <translation id="4165986682804962316">Настройки за сайта</translation> <translation id="4170011742729630528">Няма достъп до услугата. Опитайте отново по-късно.</translation> +<translation id="4177222230309051052">Получете всичките си отметки</translation> <translation id="4181841719683918333">Езици</translation> <translation id="4195643157523330669">Отваряне в нов раздел</translation> <translation id="4196597275619698563">Създаване на карта</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Страницата не е намерена. Проверете изписването или потърсете в мрежата.</translation> <translation id="4988526792673242964">Страници</translation> <translation id="5001388021414335527">Следене на този сайт тук</translation> +<translation id="500351648694011114">Сърфирайте по-лесно</translation> <translation id="5004416275253351869">Контроли за активността в Google</translation> <translation id="5005141133360250920">Реакцията е изтрита</translation> <translation id="5005498671520578047">Копиране на паролата</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Изчаква се друго изтегляне…</translation> <translation id="5865733239029070421">Автоматично изпраща до Google статистически данни за използването на Chrome и сигнали за сривове</translation> <translation id="5869522115854928033">Запазени пароли</translation> +<translation id="5869789175361934029">Продължаване от друго устройство</translation> <translation id="587735546353481577">За да последвате даден сайт, посетете го, отворете менюто на Chrome и докоснете съответната опция.</translation> <translation id="5880748256563468367">Към емисията</translation> <translation id="5884076754568147479">За да ви помага да изпълнявате задачи, Google ще получава URL адресите и съдържанието на сайтовете, в които използвате Асистент, както и данните, които изпращате чрез услугата</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Споделяне…</translation> <translation id="8912362522468806198">Профил в Google</translation> <translation id="8920114477895755567">Изчакват се подробности за родителите.</translation> +<translation id="8921980840204105660">Включете синхронизирането, за да получите отметките от другите си устройства</translation> <translation id="8922289737868596582">Изтеглете страниците чрез бутона „Още опции“, за да ги използвате офлайн</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation> <translation id="892496902842311796">Пакетът за <ph name="LANG" /> е готов</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index ee7c60a..9c95fbd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">আপনি <ph name="SITE_NAME" /> ফলো করছেন</translation> <translation id="1506061864768559482">সার্চ ইঞ্জিন</translation> <translation id="1513352483775369820">বুকমার্কগুলি এবং ওয়েব ইতিহাস</translation> +<translation id="1513814250881909472">আপনার অন্যান্য ডিভাইস থেকে ট্যাব পেতে সিঙ্ক করুন</translation> <translation id="1513858653616922153">পাসওয়ার্ড মুছুন</translation> <translation id="1518421282666914498">আবেগ বোঝানোর জন্য GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">আজ ব্যবহার করা হয়েছে</translation> @@ -170,6 +171,7 @@ <translation id="1928696683969751773">আপডেট</translation> <translation id="19288952978244135">Chrome আবার খুলুন।</translation> <translation id="1933845786846280168">নির্বাচিত ট্যাবগুলি</translation> +<translation id="193571872656840963">এই ক্রিয়েটরকে ধন্যবাদ জানান</translation> <translation id="1943432128510653496">পাসওয়ার্ডগুলি সেভ করুন</translation> <translation id="1952172573699511566">যখন সম্ভব হবে ওয়েবসাইট আপনার পছন্দের ভাষায় টেক্সট দেখাবে।</translation> <translation id="1959679933317802873">কন্টেন্টের জন্য অপেক্ষা করা হচ্ছে</translation> @@ -184,6 +186,7 @@ <translation id="1995884366040846621">চালিয়ে যেতে, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> আপনার নাম, ইমেল আইডি ও প্রোফাইল ছবি এই সাইটের সাথে শেয়ার করবে। এই সাইটের <ph name="BEGIN_LINK1" />গোপনীয়তা নীতি<ph name="END_LINK1" /> দেখুন।</translation> <translation id="2000419248597011803">অ্যাড্রেস বার এবং সার্চ বক্স থেকে সার্চের তথ্য এবং কিছু কুকি আপনার ডিফল্ট সার্চ ইঞ্জিনে পাঠায়</translation> <translation id="200114059308480249">Google searches-এ কোনও কিছু সার্চ করার সময় সার্চের সাথে মেলে এমন টেক্সট অন্তর্ভুক্ত করবেন?</translation> +<translation id="2011996512573319870">Google থেকে সবচেয়ে প্রাসঙ্গিক কন্টেন্ট পেতে সিঙ্ক করুন</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{#টি ফাইল}one{#টি ফাইল}other{#টি ফাইল}}</translation> <translation id="2020309681647789787">আপনার সিঙ্ক করা সব ডিভাইসে ইতিহাস সেভ হবে, যাতে আপনার আগের করা কাজ চালিয়ে যেতে পারেন</translation> <translation id="2021896219286479412">পূর্ণ স্ক্রিন সাইট নিয়ন্ত্রণ</translation> @@ -267,6 +270,7 @@ <translation id="2461822463642141190">বর্তমান</translation> <translation id="2472163211318554013">Chrome থেকে সবচেয়ে বেশি সুবিধা পেতে সাইন-ইন করুন</translation> <translation id="247737702124049222">ছবির বিবরণ চালু করা আছে</translation> +<translation id="2481251096908459228">আপনার জন্য স্টোরি দেখুন</translation> <translation id="2482878487686419369">বিজ্ঞপ্তিগুলি</translation> <translation id="2485422356828889247">আনইনস্টল</translation> <translation id="2494974097748878569">Chrome-এ Google অ্যাসিস্ট্যান্ট</translation> @@ -308,6 +312,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{#টি অডিও ফাইল}one{#টি অডিও ফাইল}other{#টি অডিও ফাইল}}</translation> <translation id="265156376773362237">স্ট্যান্ডার্ড প্রিলোডিং</translation> <translation id="2656405586795711023">ওয়েব অ্যাপ</translation> +<translation id="2700802943130197326">আপনার অন্যান্য সমস্ত ডিভাইসে পাসওয়ার্ড, বুকমার্ক এবং আরও অনেক কিছু পেতে সিঙ্ক করুন।</translation> <translation id="2702516483241149200">নতুন: এই টেক্সট পর্যন্ত স্ক্রোল করতে পারে এমন লিঙ্ক শেয়ার করুন</translation> <translation id="2704606927547763573">প্রতিলিপি করা হয়েছে</translation> <translation id="2707726405694321444">পৃষ্ঠা রিফ্রেশ করুন</translation> @@ -571,6 +576,7 @@ <translation id="4162867837470729563">শেয়ার করার বিকল্পের তালিকা স্ক্রিন জুড়ে আছে।</translation> <translation id="4165986682804962316">সাইটের সেটিংস</translation> <translation id="4170011742729630528">পরিষেবাটি উপলব্ধ নেই, পরে আবার চেষ্টা করুন৷</translation> +<translation id="4177222230309051052">আপনার সমস্ত বুকমার্ক পান</translation> <translation id="4181841719683918333">ভাষাসমূহ</translation> <translation id="4195643157523330669">নতুন ট্যাবে খুলুন</translation> <translation id="4196597275619698563">কার্ড তৈরি করুন</translation> @@ -726,6 +732,7 @@ <translation id="4987271110129728827">এই পৃষ্ঠাটি খুঁজে পাওয়া যাচ্ছে না। আপনার লেখা বানান চেক করুন বা ওয়েব সার্চ করুন।</translation> <translation id="4988526792673242964">পৃষ্ঠাসমূহ</translation> <translation id="5001388021414335527">এই সাইট এখানে ফলো করুন</translation> +<translation id="500351648694011114">আরও সহজে ব্রাউজ করুন</translation> <translation id="5004416275253351869">Google অ্যাক্টিভিটির নিয়ন্ত্রণ</translation> <translation id="5005141133360250920">প্রতিক্রিয়া মুছে ফেলা হয়েছে</translation> <translation id="5005498671520578047">পাসওয়ার্ড কপি করুন</translation> @@ -877,6 +884,7 @@ <translation id="5864419784173784555">অন্য ডাউনলোডের জন্য অপেক্ষা করা হচ্ছে…</translation> <translation id="5865733239029070421">ব্যবহারের পরিসংখ্যান এবং ক্র্যাশ রিপোর্ট নিজে থেকেই Google-কে পাঠায়</translation> <translation id="5869522115854928033">সংরক্ষিত পাসওয়ার্ড</translation> +<translation id="5869789175361934029">অন্য ডিভাইস থেকে চালিয়ে যান</translation> <translation id="587735546353481577">কোনও সাইট ফলো করতে, সাইটে যান, 'Chrome' মেনু খুলুন এবং 'ফলো করুন' বিকল্পে ট্যাপ করুন।</translation> <translation id="5880748256563468367">ফিডে যান</translation> <translation id="5884076754568147479">আপনাকে টাস্কগুলি সম্পূর্ণ করতে সাহায্য করার জন্য, যে যে সাইটে Assistant ব্যবহার করেন সেগুলির কন্টেন্ট ও ইউআরএল, তার সাথে Assistant-এর মাধ্যমে আপনার জমা দেওয়া যেকোনও তথ্য Google-কে পাঠানো হবে</translation> @@ -1450,6 +1458,7 @@ <translation id="8909135823018751308">শেয়ার করুন...</translation> <translation id="8912362522468806198">Google অ্যাকাউন্ট</translation> <translation id="8920114477895755567">অভিভাবকের বিশদ বিবরণের জন্য অপেক্ষা করা হচ্ছে৷</translation> +<translation id="8921980840204105660">আপনার অন্যান্য ডিভাইস থেকে বুকমার্ক পেতে সিঙ্ক করুন</translation> <translation id="8922289737868596582">পৃষ্ঠাগুলি অফলাইনে ব্যবহার করতে সেগুলি আরও বিকল্প বোতাম থেকে ডাউনলোড করুন</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> ভাষা প্রস্তুত</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index e49af622..bbbf67b4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Pratite web lokaciju <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Pretraživač</translation> <translation id="1513352483775369820">Oznake i web historija</translation> +<translation id="1513814250881909472">Sinhronizirajte da preuzmete kartice sa svojih drugih uređaja</translation> <translation id="1513858653616922153">Izbriši lozinku</translation> <translation id="1518421282666914498">GIF emocija <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktivan danas</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Da nastavite, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> će dijeliti vaše ime i prezime, adresu e-pošte, adresu i sliku profila s ovom web lokacijom. Pogledajte <ph name="BEGIN_LINK1" />pravila privatnosti<ph name="END_LINK1" /> web lokacije.</translation> <translation id="2000419248597011803">Šalje neke kolačiće i pretraživanja s trake za adresu i iz okvira za pretraživanje vašem zadanom pretraživaču</translation> <translation id="200114059308480249">Obuhvatiti okružujući tekst u pretraživanjima na Googleu?</translation> +<translation id="2011996512573319870">Sinhronizirajte da preuzmete najrelevantniji sadržaj s Googlea</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# fajl}one{# fajl}few{# fajla}other{# fajlova}}</translation> <translation id="2020309681647789787">Na svim vašim sinhroniziranim uređajima ćete imati historiju, pa možete nastaviti s onim što ste radili</translation> <translation id="2021896219286479412">Kontr. web lok. na cijelom ekr.</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Trenutno</translation> <translation id="2472163211318554013">Prijavite se da iskoristite prednosti Chromea</translation> <translation id="247737702124049222">Opisi slika su uključeni</translation> +<translation id="2481251096908459228">Pogledajte priče za vas</translation> <translation id="2482878487686419369">Obavještenja</translation> <translation id="2485422356828889247">Deinstaliraj</translation> <translation id="2494974097748878569">Google Assistant u Chromeu</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# audio fajl}one{# audio fajl}few{# audio fajla}other{# audio fajlova}}</translation> <translation id="265156376773362237">Standardno predučitavanje</translation> <translation id="2656405586795711023">Web aplikacije</translation> +<translation id="2700802943130197326">Sinhronizirajte da preuzmete lozinke, oznake i drugo na svim svojim uređajima.</translation> <translation id="2702516483241149200">Novo: dijelite link koji kliže do ovog teksta</translation> <translation id="2704606927547763573">Kopirano</translation> <translation id="2707726405694321444">Osvježavanje stranice</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Lista opcija dijeljenja u punoj visini.</translation> <translation id="4165986682804962316">Postavke web-lokacije</translation> <translation id="4170011742729630528">Ova usluge nije dostupna. Pokušajte ponovo kasnije.</translation> +<translation id="4177222230309051052">Preuzmite sve svoje oznake</translation> <translation id="4181841719683918333">Jezici</translation> <translation id="4195643157523330669">Otvori u novoj kartici</translation> <translation id="4196597275619698563">Kreiraj karticu</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Nije moguće pronaći tu stranicu. Provjerite pravopis ili pokušajte pretražiti internet.</translation> <translation id="4988526792673242964">Stranice</translation> <translation id="5001388021414335527">Pratite web lokaciju ovdje</translation> +<translation id="500351648694011114">Jednostavnije pregledajte</translation> <translation id="5004416275253351869">Kontrole aktivnosti na Googleu</translation> <translation id="5005141133360250920">Reakcija je izbrisana</translation> <translation id="5005498671520578047">Kopiranje lozinke</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Čekanje drugog preuzimanja…</translation> <translation id="5865733239029070421">Automatski šalje Googleu statistiku korištenja i izvještaje o padovima aplikacije</translation> <translation id="5869522115854928033">Sačuvane lozinke</translation> +<translation id="5869789175361934029">Nastavite s drugog uređaja</translation> <translation id="587735546353481577">Da pratite web lokaciju, posjetite web lokaciju, otvorite Chrome meni i dodirnite Prati.</translation> <translation id="5880748256563468367">Idi u sažetak sadržaja</translation> <translation id="5884076754568147479">Radi lakšeg završavanja zadataka, Google će primati URL-ove i sadržaj web lokacija na kojima koristite Asistenta, kao i informacije koje pošaljete putem Asistenta</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Dijeljenje…</translation> <translation id="8912362522468806198">Google račun</translation> <translation id="8920114477895755567">Čekanje detalja roditelja.</translation> +<translation id="8921980840204105660">Sinhronizirajte da preuzmete oznake sa svojih drugih uređaja</translation> <translation id="8922289737868596582">Preuzmite stranice pomoću dugmeta Više opcija da ih koristite van mreže</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> je spreman</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index 6dfa643..f9531282 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Sledujete web <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Vyhledávač</translation> <translation id="1513352483775369820">Záložky a webová historie</translation> +<translation id="1513814250881909472">Pokud chcete získat karty ze svých ostatních zařízení, zapněte synchronizaci</translation> <translation id="1513858653616922153">Vymazat heslo</translation> <translation id="1518421282666914498">GIF emoce <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktivní dnes</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Aby bylo možné pokračovat, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> bude s tímto webem sdílet vaše jméno, e-mailovou adresu a profilový obrázek. Zobrazit <ph name="BEGIN_LINK1" />zásady ochrany soukromí<ph name="END_LINK1" /> tohoto webu.</translation> <translation id="2000419248597011803">Odesílá soubory cookie a vyhledávací dotazy z adresního řádku a vyhledávacího pole a několik souborů cookie vašemu výchozímu vyhledávači</translation> <translation id="200114059308480249">Zahrnovat při vyhledávání na Googlu okolní text?</translation> +<translation id="2011996512573319870">Pokud chcete získat nejrelevantnější obsah z Googlu, zapněte synchronizaci</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# soubor}few{# soubory}many{# souboru}other{# souborů}}</translation> <translation id="2020309681647789787">Ve všech synchronizovaných zařízeních budete mít historii, takže budete moci pokračovat v tom, co jste dělali</translation> <translation id="2021896219286479412">Ovládání webu na celé obrazovce</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Aktuální</translation> <translation id="2472163211318554013">Pokud z Chromu chcete získat maximum, přihlaste se</translation> <translation id="247737702124049222">Popisy obrázků jsou zapnuté</translation> +<translation id="2481251096908459228">Čtěte si příběhy pro vás</translation> <translation id="2482878487686419369">Oznámení</translation> <translation id="2485422356828889247">Odinstalovat</translation> <translation id="2494974097748878569">Asistent Google v Chromu</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# zvukový soubor}few{# zvukové soubory}many{# zvukového souboru}other{# zvukových souborů}}</translation> <translation id="265156376773362237">Standardní předběžné načítání</translation> <translation id="2656405586795711023">Webové aplikace</translation> +<translation id="2700802943130197326">Pokud svá hesla, záložky a další položky chcete mít na všech svých zařízeních, zapněte synchronizaci.</translation> <translation id="2702516483241149200">Nové: Sdílení odkazu, který obsah posune na tento text</translation> <translation id="2704606927547763573">Zkopírováno</translation> <translation id="2707726405694321444">Obnovit stránku</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Seznam možností sdílení je otevřený na celou výšku.</translation> <translation id="4165986682804962316">Nastavení webu</translation> <translation id="4170011742729630528">Služba není k dispozici, zkuste to později.</translation> +<translation id="4177222230309051052">Získejte všechny své záložky</translation> <translation id="4181841719683918333">Jazyky</translation> <translation id="4195643157523330669">Otevřít na nové kartě</translation> <translation id="4196597275619698563">Vytvořit kartu</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Stránku nelze najít. Zkontrolujte, zda jste neudělali překlep, nebo ji zkuste vyhledat na webu.</translation> <translation id="4988526792673242964">Stránky</translation> <translation id="5001388021414335527">Zde můžete web sledovat</translation> +<translation id="500351648694011114">Prohlížejte si internet snadněji</translation> <translation id="5004416275253351869">Ovládací prvky aktivity Google</translation> <translation id="5005141133360250920">Reakce byla smazána</translation> <translation id="5005498671520578047">Kopírování hesla</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Čekání na další stahování…</translation> <translation id="5865733239029070421">Automaticky odesílá statistiky o využívání a zprávy o selhání do Googlu</translation> <translation id="5869522115854928033">Uložená hesla</translation> +<translation id="5869789175361934029">Pokračujte z jiného zařízení</translation> <translation id="587735546353481577">Pokud nějaký web chcete sledovat, přejděte na něj, otevřené nabídku Chrome a klepněte na Sledovat.</translation> <translation id="5880748256563468367">Přejít na informační kanál</translation> <translation id="5884076754568147479">Abyste mohli provádět akce, Google bude dostávat adresy URL a obsah webů, ve kterých používáte Asistenta, a informace, které prostřednictvím Asistenta odesíláte</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Sdílet…</translation> <translation id="8912362522468806198">Účet Google</translation> <translation id="8920114477895755567">Čekáme na podrobnosti o rodičích.</translation> +<translation id="8921980840204105660">Pokud chcete získat záložky ze svých ostatních zařízení, zapněte synchronizaci</translation> <translation id="8922289737868596582">Stáhněte si stránky k použití offline pomocí tlačítka Další možnosti</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation> <translation id="892496902842311796">Jazyk <ph name="LANG" /> je připraven</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb index a63ec47..012c95b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Rydych yn dilyn <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Peiriant chwilio</translation> <translation id="1513352483775369820">Nodau tudalen a hanes gwe</translation> +<translation id="1513814250881909472">Cysonwch i gael eich tabiau o'ch dyfeisiau eraill</translation> <translation id="1513858653616922153">Dileu'r cyfrinair</translation> <translation id="1518421282666914498">GIF emosiwn <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Yma heddiw</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">I barhau, bydd <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> yn rhannu eich enw, eich e-bost, eich cyfeiriad, a'ch llun proffil gyda'r wefan. Gweld <ph name="BEGIN_LINK1" />polisi preifatrwydd<ph name="END_LINK1" /> y wefan hon.</translation> <translation id="2000419248597011803">Yn anfon rhai cwcis a chwiliadau o'r bar cyfeiriadau a'r blwch chwilio i'ch peiriant chwilio diofyn</translation> <translation id="200114059308480249">Cynnwys testun o'i amgylch mewn chwiliadau Google?</translation> +<translation id="2011996512573319870">Cysonwch i gael y cynnwys mwyaf perthnasol o Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# Ffeil}zero{# Ffeil}two{# Ffeil}few{# Ffeil}many{# Ffeil}other{# Ffeil}}</translation> <translation id="2020309681647789787">Bydd gennych eich hanes ar eich holl ddyfeisiau sydd wedi'u cysoni, felly gallwch barhau â'r hyn yr oeddech yn ei wneud</translation> <translation id="2021896219286479412">Rheolyddion gwefan sgrîn lawn</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Presennol</translation> <translation id="2472163211318554013">Mewngofnodwch i gael y gorau o Chrome</translation> <translation id="247737702124049222">Mae disgrifiadau lluniau wedi'u troi ymlaen</translation> +<translation id="2481251096908459228">Gweld straeon i chi</translation> <translation id="2482878487686419369">Hysbysiadau</translation> <translation id="2485422356828889247">Dadosod</translation> <translation id="2494974097748878569">Google Assistant yn Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Ffeil sain}zero{# Ffeil sain}two{# Ffeil sain}few{# Ffeil sain}many{# Ffeil sain}other{# Ffeil sain}}</translation> <translation id="265156376773362237">Rhaglwytho safonol</translation> <translation id="2656405586795711023">Apiau gwe</translation> +<translation id="2700802943130197326">Cysonwch i gael eich cyfrineiriau, nodau tudalen a rhagor ar eich holl ddyfeisiau eraill.</translation> <translation id="2702516483241149200">Newydd: gallwch rannu dolen sy'n sgrolio i'r testun hwn</translation> <translation id="2704606927547763573">Copïwyd</translation> <translation id="2707726405694321444">Ail-lwytho'r dudalen</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Rhestr o ddewisiadau rhannu ar uchder llawn.</translation> <translation id="4165986682804962316">Gosodiadau gwefan</translation> <translation id="4170011742729630528">Nid yw'r gwasanaeth ar gael; rhowch gynnig arall arni'n nes ymlaen.</translation> +<translation id="4177222230309051052">Cael eich holl nodau tudalen</translation> <translation id="4181841719683918333">Ieithoedd</translation> <translation id="4195643157523330669">Agor mewn tab newydd</translation> <translation id="4196597275619698563">Creu cerdyn</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Methu â dod o hyd i'r dudalen honno. Gwiriwch eich sillafu neu rhowch gynnig ar chwiliad gwe.</translation> <translation id="4988526792673242964">Tudalennau</translation> <translation id="5001388021414335527">Dilyn y wefan hon yma</translation> +<translation id="500351648694011114">Pori'n haws</translation> <translation id="5004416275253351869">Rheolaethau gweithgarwch Google</translation> <translation id="5005141133360250920">Wedi dileu'r ymateb</translation> <translation id="5005498671520578047">Copïo'r cyfrinair</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Wrthi'n aros am lawrlwythiad arall…</translation> <translation id="5865733239029070421">Yn anfon ystadegau defnydd ac adroddiadau toriadau at Google yn awtomatig</translation> <translation id="5869522115854928033">Cyfrineiriau sydd wedi'u cadw</translation> +<translation id="5869789175361934029">Parhau o ddyfais arall</translation> <translation id="587735546353481577">I ddilyn gwefan, ewch i'r wefan, agorwch ddewislen Chrome, a thapiwch Dilyn.</translation> <translation id="5880748256563468367">Mynd i'r ffrwd</translation> <translation id="5884076754568147479">Er mwyn eich helpu i gwblhau tasgau, bydd Google yn cael URL a chynnwys gwefannau rydych yn defnyddio Assistant arnynt, yn ogystal â gwybodaeth rydych yn ei chyflwyno drwy Assistant</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Rhannu…</translation> <translation id="8912362522468806198">Cyfrif Google</translation> <translation id="8920114477895755567">Wrthi'n aros am fanylion rhieni.</translation> +<translation id="8921980840204105660">Cysonwch i gael eich nodau tudalen o'ch dyfeisiau eraill</translation> <translation id="8922289737868596582">Lawrlwythwch dudalennau o'r botwm Rhagor o ddewisiadau i'w defnyddio all-lein</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Dysgu Rhagor<ph name="END_LINK" /></translation> <translation id="892496902842311796">Mae <ph name="LANG" /> yn barod</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 702e57f..9baeeb0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Du følger <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Søgemaskine</translation> <translation id="1513352483775369820">Bogmærker og webhistorik</translation> +<translation id="1513814250881909472">Synkroniser for at få dine faner fra dine andre enheder</translation> <translation id="1513858653616922153">Slet adgangskoden</translation> <translation id="1518421282666914498">Følelses-gif <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktiv i dag</translation> @@ -170,6 +171,7 @@ <translation id="1928696683969751773">Opdateringer</translation> <translation id="19288952978244135">Åbn Chrome igen.</translation> <translation id="1933845786846280168">Valgt fane</translation> +<translation id="193571872656840963">Tak denne udvikler</translation> <translation id="1943432128510653496">Gem adgangskoder</translation> <translation id="1952172573699511566">Websites viser tekst på dit foretrukne sprog, når det er muligt.</translation> <translation id="1959679933317802873">Venter på indhold</translation> @@ -184,6 +186,7 @@ <translation id="1995884366040846621">For at fortsætte deler <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> dit navn, din mailadresse, og dit profilbillede med dette website. Se dette websites <ph name="BEGIN_LINK1" />privatlivspolitik<ph name="END_LINK1" />.</translation> <translation id="2000419248597011803">Sender visse cookies og søgninger fra adresselinjen og søgefeltet til din standardsøgemaskine</translation> <translation id="200114059308480249">Vil du medtage omgivende tekst i Google-søgninger?</translation> +<translation id="2011996512573319870">Synkroniser for at få det mest relevante indhold fra Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# fil}one{# fil}other{# filer}}</translation> <translation id="2020309681647789787">Din historik er på alle synkroniserede enheder, så du kan fortsætte med det, du var i gang med</translation> <translation id="2021896219286479412">Kontrolelementer på website i fuld skærm</translation> @@ -267,6 +270,7 @@ <translation id="2461822463642141190">Aktuel</translation> <translation id="2472163211318554013">Log ind for at få mest muligt ud af Chrome</translation> <translation id="247737702124049222">Billedbeskrivelser er slået til</translation> +<translation id="2481251096908459228">Se historier til dig</translation> <translation id="2482878487686419369">Notifikationer</translation> <translation id="2485422356828889247">Afinstaller</translation> <translation id="2494974097748878569">Google Assistent i Chrome</translation> @@ -308,6 +312,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# lydfil}one{# lydfil}other{# lydfiler}}</translation> <translation id="265156376773362237">Standardforudindlæsning</translation> <translation id="2656405586795711023">Webapps</translation> +<translation id="2700802943130197326">Synkroniser for at få dine adgangskoder, bogmærker og meget mere på alle dine andre enheder.</translation> <translation id="2702516483241149200">Nyhed: Del et link, der ruller til denne tekst</translation> <translation id="2704606927547763573">Kopieret</translation> <translation id="2707726405694321444">Opdater siden</translation> @@ -569,6 +574,7 @@ <translation id="4162867837470729563">Listen over delingsindstillinger er åbnet i fuld højde.</translation> <translation id="4165986682804962316">Websiteindstillinger</translation> <translation id="4170011742729630528">Tjenesten er ikke tilgængelig. Prøv igen senere.</translation> +<translation id="4177222230309051052">Få alle dine bogmærker</translation> <translation id="4181841719683918333">Sprog</translation> <translation id="4195643157523330669">Åbn på ny fane</translation> <translation id="4196597275619698563">Opret kort</translation> @@ -724,6 +730,7 @@ <translation id="4987271110129728827">Siden kan ikke findes. Tjek stavningen, eller prøv med en websøgning.</translation> <translation id="4988526792673242964">Sider</translation> <translation id="5001388021414335527">Følg dette website her</translation> +<translation id="500351648694011114">Browsing på en nemmere måde</translation> <translation id="5004416275253351869">Aktivitetsadministration på Google</translation> <translation id="5005141133360250920">Reaktionen er slettet</translation> <translation id="5005498671520578047">Kopiér adgangskode</translation> @@ -875,6 +882,7 @@ <translation id="5864419784173784555">Venter på en anden download…</translation> <translation id="5865733239029070421">Sender automatisk brugsstatistikker og nedbrudsrapporter til Google</translation> <translation id="5869522115854928033">Gemte adgangskoder</translation> +<translation id="5869789175361934029">Fortsæt fra en anden enhed</translation> <translation id="587735546353481577">Følg et website ved at gå til websitet, åbne Chrome-menuen og trykke på Følg.</translation> <translation id="5880748256563468367">Gå til feed</translation> <translation id="5884076754568147479">For at hjælpe dig med at udføre opgaver modtager Google webadresser for og indhold på websites, hvor du bruger Assistent, samt oplysninger du indsender via Assistent</translation> @@ -1448,6 +1456,7 @@ <translation id="8909135823018751308">Del…</translation> <translation id="8912362522468806198">Google-konto</translation> <translation id="8920114477895755567">Venter på oplysninger om forældre.</translation> +<translation id="8921980840204105660">Synkroniser for at få dine bogmærker fra dine andre enheder</translation> <translation id="8922289737868596582">Download sider via knappen Flere valgmuligheder for at bruge dem, når du er offline</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> er klar</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index 8fa64fa1..7e41149 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Du folgst „<ph name="SITE_NAME" />“</translation> <translation id="1506061864768559482">Suchmaschine</translation> <translation id="1513352483775369820">Lesezeichen und Webprotokoll</translation> +<translation id="1513814250881909472">Synchronisieren, um deine Tabs von anderen Geräten abzurufen</translation> <translation id="1513858653616922153">Passwort löschen</translation> <translation id="1518421282666914498">Emotion-GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Heute aktiv</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> teilt zum Fortfahren deinen Namen, deine E-Mail-Adresse und dein Profilbild mit dieser Website. Lies die <ph name="BEGIN_LINK1" />Datenschutzerklärung<ph name="END_LINK1" /> dieser Website.</translation> <translation id="2000419248597011803">Suchanfragen, die in die Adressleiste und das Suchfeld eingegeben wurden, sowie einige Cookies werden an deine Standardsuchmaschine gesendet</translation> <translation id="200114059308480249">Umgebenden Text in Google-Suchanfragen einschließen?</translation> +<translation id="2011996512573319870">Synchronisieren, um die relevantesten Inhalte von Google zu erhalten</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# Datei}other{# Dateien}}</translation> <translation id="2020309681647789787">Du siehst deinen Verlauf auf allen synchronisierten Geräten und kannst dort weitermachen, wo du vorher aufgehört hast</translation> <translation id="2021896219286479412">Vollbild-Steuerelemente</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Aktuell</translation> <translation id="2472163211318554013">Wenn du Chrome optimal nutzen möchtest, melde dich an</translation> <translation id="247737702124049222">Bildbeschreibungen sind aktiviert</translation> +<translation id="2481251096908459228">Inhalte für dich ansehen</translation> <translation id="2482878487686419369">Benachrichtigungen</translation> <translation id="2485422356828889247">Deinstallieren</translation> <translation id="2494974097748878569">Google Assistant für Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Audiodatei}other{# Audiodateien}}</translation> <translation id="265156376773362237">Standard-Vorabladen</translation> <translation id="2656405586795711023">Web-Apps</translation> +<translation id="2700802943130197326">Synchronisieren, um Passwörter, Lesezeichen und weitere Elemente auf allen deinen anderen Geräten abzurufen.</translation> <translation id="2702516483241149200">Neu: Link teilen, der direkt zu diesem Text führt</translation> <translation id="2704606927547763573">Kopiert</translation> <translation id="2707726405694321444">Seite aktualisieren</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Die Liste der Freigabeoptionen ist vollständig geöffnet.</translation> <translation id="4165986682804962316">Website-Einstellungen</translation> <translation id="4170011742729630528">Der Dienst ist momentan nicht verfügbar. Bitte versuche es später erneut.</translation> +<translation id="4177222230309051052">Alle deine Lesezeichen abrufen</translation> <translation id="4181841719683918333">Sprachen</translation> <translation id="4195643157523330669">In neuem Tab öffnen</translation> <translation id="4196597275619698563">Karte erstellen</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Diese Seite konnte nicht gefunden werden. Prüfe die Schreibweise oder versuche es mit einer Internetsuche.</translation> <translation id="4988526792673242964">Seiten</translation> <translation id="5001388021414335527">Dieser Website folgen</translation> +<translation id="500351648694011114">Einfacher surfen</translation> <translation id="5004416275253351869">Google-Aktivitätseinstellungen</translation> <translation id="5005141133360250920">Reaktion gelöscht</translation> <translation id="5005498671520578047">Passwort kopieren</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Warten auf weiteren Download…</translation> <translation id="5865733239029070421">Nutzungsstatistiken und Absturzberichte automatisch an Google senden</translation> <translation id="5869522115854928033">Gespeicherte Passwörter</translation> +<translation id="5869789175361934029">Tabs von einem anderen Gerät fortsetzen</translation> <translation id="587735546353481577">Wenn du einer Website folgen möchtest, rufe die Website auf, öffne das Chrome-Menü und tippe auf „Folgen“.</translation> <translation id="5880748256563468367">Zum Feed</translation> <translation id="5884076754568147479">Wenn du in Chrome mit Assistant Aufgaben erledigst, werden die URLs und Inhalte der Websites, auf denen du Assistant verwendest, sowie die Daten, die du über Assistant weitergibst, an Google gesendet</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Teilen...</translation> <translation id="8912362522468806198">Google-Konto</translation> <translation id="8920114477895755567">Warten auf Details zu den Eltern</translation> +<translation id="8921980840204105660">Synchronisieren, um die Lesezeichen von deinen anderen Geräten abzurufen</translation> <translation id="8922289737868596582">Seiten über die Schaltfläche "Weitere Optionen" zur Offline-Ansicht herunterladen</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> ist bereit</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb index 62603b12..0de6d9d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Ακολουθείτε τον ιστότοπο <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Μηχανή αναζήτησης</translation> <translation id="1513352483775369820">Σελιδοδείκτες και ιστορικό ιστού</translation> +<translation id="1513814250881909472">Χρησιμοποιήστε τον συγχρονισμό για να λάβετε τις καρτέλες από τις άλλες συσκευές σας</translation> <translation id="1513858653616922153">Διαγραφή κωδικού πρόσβασης</translation> <translation id="1518421282666914498">GIF συναισθημάτων <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Ενεργή σήμερα</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Για να συνεχίσετε, το <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> θα κοινοποιήσει το όνομα, τη διεύθυνση ηλεκτρονικού ταχυδρομείου και τη φωτογραφία προφίλ σας σε αυτόν τον ιστότοπο. Δείτε την <ph name="BEGIN_LINK1" />πολιτική απορρήτου<ph name="END_LINK1" /> αυτού του ιστοτόπου.</translation> <translation id="2000419248597011803">Στέλνει ορισμένα cookie και αναζητήσεις από τη γραμμή διευθύνσεων και το πλαίσιο αναζήτησης στην προεπιλεγμένη μηχανή αναζήτησης</translation> <translation id="200114059308480249">Συμπερίληψη περιβάλλοντος κειμένου στις αναζητήσεις Google;</translation> +<translation id="2011996512573319870">Χρησιμοποιήστε τον συγχρονισμό για να λάβετε το πιο σχετικό περιεχόμενο από το Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# Αρχείο}other{# Αρχεία}}</translation> <translation id="2020309681647789787">Το ιστορικό σας θα εμφανίζεται σε όλες τις συγχρονισμένες συσκευές, ώστε να μπορείτε να συνεχίζετε ό,τι κάνετε</translation> <translation id="2021896219286479412">Στοιχ. ελέγ. σε πλήρη οθόνη</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Τρέχουσα</translation> <translation id="2472163211318554013">Συνδεθείτε για να αξιοποιήσετε πλήρως το Chrome</translation> <translation id="247737702124049222">Οι περιγραφές εικόνων είναι ενεργοποιημένες</translation> +<translation id="2481251096908459228">Δείτε ιστορίες για εσάς</translation> <translation id="2482878487686419369">Ειδοποιήσεις</translation> <translation id="2485422356828889247">Απεγκατάσταση</translation> <translation id="2494974097748878569">Βοηθός Google στο Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Αρχείο ήχου}other{# Αρχεία ήχου}}</translation> <translation id="265156376773362237">Βασική προφόρτωση</translation> <translation id="2656405586795711023">Εφαρμογές ιστού</translation> +<translation id="2700802943130197326">Χρησιμοποιήστε τον συγχρονισμό για να έχετε τους κωδικούς πρόσβασης, τους σελιδοδείκτες κ.ά. σε όλες τις συσκευές σας.</translation> <translation id="2702516483241149200">Νέο: Κοινοποιήστε έναν σύνδεσμο που κάνει κύλιση σε αυτό το κείμενο</translation> <translation id="2704606927547763573">Αντιγράφ.</translation> <translation id="2707726405694321444">Ανανέωση σελίδας</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Η λίστα επιλογών κοινοποίησης είναι ανοικτή σε πλήρες ύψος.</translation> <translation id="4165986682804962316">Ρυθμίσεις ιστότοπου</translation> <translation id="4170011742729630528">Η υπηρεσία δεν είναι διαθέσιμη. Δοκιμάστε ξανά αργότερα.</translation> +<translation id="4177222230309051052">Λάβετε όλους τους σελιδοδείκτες σας</translation> <translation id="4181841719683918333">Γλώσσες</translation> <translation id="4195643157523330669">Άνοιγμα σε νέα καρτέλα</translation> <translation id="4196597275619698563">Δημιουργία κάρτας</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Δεν είναι δυνατή η εύρεση της σελίδας. Ελέγξτε την ορθογραφία ή δοκιμάστε μια αναζήτηση στον ιστό.</translation> <translation id="4988526792673242964">Σελίδες</translation> <translation id="5001388021414335527">Ακολουθήστε αυτόν τον ιστότοπο εδώ</translation> +<translation id="500351648694011114">Περιηγηθείτε πιο εύκολα</translation> <translation id="5004416275253351869">Στοιχεία ελέγχου δραστηριότητας Google</translation> <translation id="5005141133360250920">Η αντίδραση διαγράφηκε</translation> <translation id="5005498671520578047">Αντιγραφή κωδικού πρόσβασης</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Αναμονή για άλλη λήψη…</translation> <translation id="5865733239029070421">Αποστέλλει αυτόματα στατιστικά στοιχεία χρήσης και αναφορές σφαλμάτων στην Google</translation> <translation id="5869522115854928033">Αποθηκευμένοι κωδικοί πρόσβασης</translation> +<translation id="5869789175361934029">Συνέχεια από άλλη συσκευή</translation> <translation id="587735546353481577">Για να ακολουθήσετε έναν ιστότοπο, μεταβείτε στον ιστότοπο, ανοίξτε το μενού Chrome και πατήστε Παρακολούθηση.</translation> <translation id="5880748256563468367">Μετάβαση στη ροή</translation> <translation id="5884076754568147479">Για να σας βοηθήσει να ολοκληρώνετε τις εργασίες σας, η Google θα λάβει τα URL και το περιεχόμενο των ιστοτόπων στους οποίους χρησιμοποιείτε τον Βοηθό, καθώς και τις πληροφορίες που υποβάλετε μέσω του Βοηθού.</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Κοινοποίηση…</translation> <translation id="8912362522468806198">Λογαριασμός Google</translation> <translation id="8920114477895755567">Αναμονή για λεπτομέρειες γονέων.</translation> +<translation id="8921980840204105660">Χρησιμοποιήστε τον συγχρονισμό για να λάβετε τους σελιδοδείκτες από τις άλλες συσκευές σας</translation> <translation id="8922289737868596582">Κατεβάστε σελίδες από το κουμπί "Περισσότερες επιλογές" για να τις χρησιμοποιήσετε εκτός σύνδεσης</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation> <translation id="892496902842311796">Η γλώσσα <ph name="LANG" /> είναι έτοιμη</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index bcbb589c..4eca0ef 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Sigues a <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Motor de búsqueda</translation> <translation id="1513352483775369820">Favoritos e historial web</translation> +<translation id="1513814250881909472">Utiliza la función de sincronización para acceder a tus pestañas desde otros dispositivos</translation> <translation id="1513858653616922153">Borrar contraseña</translation> <translation id="1518421282666914498">GIF de emoción <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Activo hoy</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Para continuar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> compartirá tu nombre, dirección de correo electrónico y foto de perfil con este sitio. Consulta la <ph name="BEGIN_LINK1" />política de privacidad<ph name="END_LINK1" /> de este sitio.</translation> <translation id="2000419248597011803">Envía algunas cookies y búsquedas de la barra de direcciones y del cuadro de búsqueda a tu motor de búsqueda predeterminado</translation> <translation id="200114059308480249">¿Quieres incluir el texto adyacente en las búsquedas de Google?</translation> +<translation id="2011996512573319870">Utiliza la función de sincronización para obtener contenido relevante de Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# archivo}other{# archivos}}</translation> <translation id="2020309681647789787">Verás tu historial en todos los dispositivos sincronizados, por lo que podrás continuar con tus tareas desde donde sea.</translation> <translation id="2021896219286479412">Controles en pantalla completa</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Actual</translation> <translation id="2472163211318554013">Para aprovechar Chrome al máximo, accede a tu cuenta.</translation> <translation id="247737702124049222">Las descripciones de imágenes están activadas.</translation> +<translation id="2481251096908459228">Descubre historias que te pueden interesar</translation> <translation id="2482878487686419369">Notificaciones</translation> <translation id="2485422356828889247">Desinstalación</translation> <translation id="2494974097748878569">Asistente de Google en Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# archivo de audio}other{# archivos de audio}}</translation> <translation id="265156376773362237">Precarga estándar</translation> <translation id="2656405586795711023">Aplicaciones web</translation> +<translation id="2700802943130197326">Utiliza la función de sincronización para acceder a tus contraseñas, favoritos y más en tus otros dispositivos.</translation> <translation id="2702516483241149200">Nuevo: Comparte un vínculo directo a este texto.</translation> <translation id="2704606927547763573">Copiado</translation> <translation id="2707726405694321444">Actualizar página</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">La lista de opciones para compartir está totalmente abierta.</translation> <translation id="4165986682804962316">Configuración de sitios</translation> <translation id="4170011742729630528">El servicio no se encuentra disponible; vuelve a intentarlo más tarde.</translation> +<translation id="4177222230309051052">Accede a todos tus favoritos</translation> <translation id="4181841719683918333">Idiomas</translation> <translation id="4195643157523330669">Abrir en una pestaña nueva</translation> <translation id="4196597275619698563">Crear tarjeta</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">No se puede encontrar la página. Revisa la ortografía o intenta realizar una búsqueda web.</translation> <translation id="4988526792673242964">Páginas</translation> <translation id="5001388021414335527">Sigue este sitio aquí</translation> +<translation id="500351648694011114">Navega de forma más sencilla</translation> <translation id="5004416275253351869">Controles de actividad de Google</translation> <translation id="5005141133360250920">Se borró la reacción</translation> <translation id="5005498671520578047">Copiar contraseña</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Esperando que finalice otra descarga…</translation> <translation id="5865733239029070421">Envía automáticamente informes de fallos y estadísticas de uso a Google</translation> <translation id="5869522115854928033">Contraseñas almacenadas</translation> +<translation id="5869789175361934029">Continua desde otro dispositivo</translation> <translation id="587735546353481577">Para seguir un sitio, visítalo, abre el menú de Chrome y presiona Seguir.</translation> <translation id="5880748256563468367">Ir al feed</translation> <translation id="5884076754568147479">Para ayudarte a completar tareas, Google recibirá las URL y los contenidos de los sitios en los que uses el Asistente, así como la información que envías a través de este servicio</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Compartir…</translation> <translation id="8912362522468806198">Cuenta de Google</translation> <translation id="8920114477895755567">Esperando los detalles parentales</translation> +<translation id="8921980840204105660">Utiliza la función de sincronización para acceder a tus favoritos desde otros dispositivos</translation> <translation id="8922289737868596582">Descarga páginas desde el botón Más opciones para usarlas sin conexión</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> está listo</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index 995a867b..c8d4042 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Estás siguiendo a <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Buscador</translation> <translation id="1513352483775369820">Historial web y marcadores</translation> +<translation id="1513814250881909472">Sincroniza para recibir las pestañas de tus demás dispositivos</translation> <translation id="1513858653616922153">Eliminar contraseña</translation> <translation id="1518421282666914498">GIF de emoción <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Activo hoy</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Para continuar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> compartirá tu nombre, dirección de correo electrónico e imagen de perfil con este sitio. Consulta la <ph name="BEGIN_LINK1" />política de privacidad<ph name="END_LINK1" /> de este sitio.</translation> <translation id="2000419248597011803">Envía algunas cookies y búsquedas desde la barra de direcciones y el cuadro de búsqueda a tu buscador predeterminado</translation> <translation id="200114059308480249">¿Incluir texto cercano en las búsquedas de Google?</translation> +<translation id="2011996512573319870">Sincroniza para recibir el contenido más relevante de Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# archivo}other{# archivos}}</translation> <translation id="2020309681647789787">Tendrás tu historial en todos tus dispositivos sincronizados y podrás continuar con lo que estabas haciendo</translation> <translation id="2021896219286479412">Controles de pantalla completa</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Actual</translation> <translation id="2472163211318554013">Inicia sesión para sacarle el máximo partido a Chrome</translation> <translation id="247737702124049222">Las descripciones de imágenes están activadas</translation> +<translation id="2481251096908459228">Consulta contenido personalizado</translation> <translation id="2482878487686419369">Notificaciones</translation> <translation id="2485422356828889247">Desinstalar</translation> <translation id="2494974097748878569">Asistente de Google</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# archivo de audio}other{# archivos de audio}}</translation> <translation id="265156376773362237">Precarga estándar</translation> <translation id="2656405586795711023">Aplicaciones web</translation> +<translation id="2700802943130197326">Sincroniza para recibir tus contraseñas, marcadores y más en todos tus demás dispositivos</translation> <translation id="2702516483241149200">Nuevo: Comparte un enlace que vaya directamente a este texto</translation> <translation id="2704606927547763573">Copiado</translation> <translation id="2707726405694321444">Actualizar página</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Lista de opciones para compartir abierta a altura completa.</translation> <translation id="4165986682804962316">Configuración del sitio</translation> <translation id="4170011742729630528">El servicio no está disponible. Vuelve a intentarlo más tarde.</translation> +<translation id="4177222230309051052">Recibe todos tus marcadores</translation> <translation id="4181841719683918333">Idiomas</translation> <translation id="4195643157523330669">Abrir en una pestaña nueva</translation> <translation id="4196597275619698563">Crear tarjeta</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">No se puede encontrar la página. Comprueba que la hayas escrito bien o prueba a hacer una búsqueda web.</translation> <translation id="4988526792673242964">Páginas</translation> <translation id="5001388021414335527">Seguir a este sitio aquí</translation> +<translation id="500351648694011114">Navega más fácilmente</translation> <translation id="5004416275253351869">Controles de actividad de Google</translation> <translation id="5005141133360250920">Reacción eliminada</translation> <translation id="5005498671520578047">Copiar contraseña</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Esperando otra descarga…</translation> <translation id="5865733239029070421">Envía automáticamente estadísticas de uso e informes sobre fallos a Google</translation> <translation id="5869522115854928033">Contraseñas guardadas</translation> +<translation id="5869789175361934029">Continúa donde lo dejaste en otro dispositivo</translation> <translation id="587735546353481577">Para seguir un sitio, visítalo, abre el menú de Chrome y toca Seguir.</translation> <translation id="5880748256563468367">Ir al feed</translation> <translation id="5884076754568147479">Para ayudarte a completar tareas, Google recibirá las URL y los contenidos de los sitios en los que uses el Asistente, así como la información que envíes a través del Asistente.</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Compartir…</translation> <translation id="8912362522468806198">cuenta de Google</translation> <translation id="8920114477895755567">Esperando detalles de los padres.</translation> +<translation id="8921980840204105660">Sincroniza para recibir los marcadores de tus demás dispositivos</translation> <translation id="8922289737868596582">Descarga páginas con el botón con el botón Más opciones para usarlas sin conexión</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="892496902842311796">El <ph name="LANG" /> ya puede usarse</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index edfb74df7..e9d0ba83 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Jälgite saiti <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Otsingumootor</translation> <translation id="1513352483775369820">Järjehoidjad ja veebiajalugu</translation> +<translation id="1513814250881909472">Oma muudest seadmetest vahelehtede hankimiseks sünkroonige</translation> <translation id="1513858653616922153">Kustuta parool</translation> <translation id="1518421282666914498">Emotsiooni GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktiivne täna</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Jätkamiseks jagab <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> selle saidiga teie nime, e-posti aadressi ja profiilipilti. Vaadake selle saidi <ph name="BEGIN_LINK1" />privaatsuseeskirju<ph name="END_LINK1" />.</translation> <translation id="2000419248597011803">Saadab teie vaikeotsingumootorile mõned küpsisefailid ja otsingud teie aadressiribalt ning otsingukastist</translation> <translation id="200114059308480249">Kas kaasata ümbritsev tekst Google'i otsingutesse?</translation> +<translation id="2011996512573319870">Google'ilt kõige asjakohasema sisu hankimiseks sünkroonige</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# fail}other{# faili}}</translation> <translation id="2020309681647789787">Teie ajalugu on saadaval kõigis sünkroonitud seadmetes, et saaksite pooleli jäänud toiminguid jätkata</translation> <translation id="2021896219286479412">Saidi juhtelemendid täisekraanil</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Praegune</translation> <translation id="2472163211318554013">Chrome'i parimal moel kasutamiseks logige sisse</translation> <translation id="247737702124049222">Pildikirjeldused on sisse lülitatud</translation> +<translation id="2481251096908459228">Vaadake teile mõeldud lugusid</translation> <translation id="2482878487686419369">Märguanded</translation> <translation id="2485422356828889247">Desinstalli</translation> <translation id="2494974097748878569">Google'i assistent Chrome'is</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# helifail}other{# helifaili}}</translation> <translation id="265156376773362237">Standardne eellaadimine</translation> <translation id="2656405586795711023">Veebirakendused</translation> +<translation id="2700802943130197326">Kõigist oma muudest seadmetest paroolide, järjehoidjate ja muu hankimiseks sünkroonige</translation> <translation id="2702516483241149200">Uus: jagage linki, millega keritakse selle teksti juurde</translation> <translation id="2704606927547763573">Kopeeritud</translation> <translation id="2707726405694321444">Lehe värskendamine</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Jagamisvalikute loend on avatud täiskõrgusele.</translation> <translation id="4165986682804962316">Saidi seaded</translation> <translation id="4170011742729630528">Teenus pole saadaval, proovige hiljem uuesti.</translation> +<translation id="4177222230309051052">Hankige kõik oma järjehoidjad</translation> <translation id="4181841719683918333">Keeled</translation> <translation id="4195643157523330669">Ava uuel vahelehel</translation> <translation id="4196597275619698563">Loo kaart</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Seda lehte ei leitud. Kontrollige õigekirja või proovige veebiotsingut.</translation> <translation id="4988526792673242964">Leheküljed</translation> <translation id="5001388021414335527">Jälgige seda saiti siin</translation> +<translation id="500351648694011114">Sirvige hõlpsamini</translation> <translation id="5004416275253351869">Google'i kontotegevuste haldus</translation> <translation id="5005141133360250920">Reaktsioon kustutati</translation> <translation id="5005498671520578047">Parooli kopeerimine</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Teise allalaadimise ootamine …</translation> <translation id="5865733239029070421">Google'ile saadetakse automaatselt kasutusstatistikat ja krahhiaruandeid</translation> <translation id="5869522115854928033">Salvestatud paroolid</translation> +<translation id="5869789175361934029">Jätkake sealt, kus muus seadmes pooleli jäite</translation> <translation id="587735546353481577">Saidi jälgimiseks minge saidile, avage Chrome'i menüü ja puudutage nuppu Jälgi.</translation> <translation id="5880748256563468367">Ava voog</translation> <translation id="5884076754568147479">Selleks et aidata teil toiminguid teha, saadetakse Google'ile nende saitide URL-id ja sisu, millel assistenti kasutate, ning teave, mille assistendi kaudu esitate</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Jaga ...</translation> <translation id="8912362522468806198">Google'i konto</translation> <translation id="8920114477895755567">Vanema üksikasjade ootamine.</translation> +<translation id="8921980840204105660">Oma muudest seadmetest järjehoidjate hankimiseks sünkroonige</translation> <translation id="8922289737868596582">Laadige lehed alla nupu Rohkem valikuid abil, et neid võrguühenduseta kasutada</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> on valmis</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb index 82ae217..3efae13 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Hasi zara <ph name="SITE_NAME" /> webguneari jarraitzen</translation> <translation id="1506061864768559482">Bilatzailea</translation> <translation id="1513352483775369820">Laster-markak eta web-historia</translation> +<translation id="1513814250881909472">Sinkronizatu datuak darabiltzazun beste gailuetako fitxak eskuratzeko</translation> <translation id="1513858653616922153">Ezabatu pasahitza</translation> <translation id="1518421282666914498">Aldarte GIFa <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktibo gaur</translation> @@ -170,6 +171,7 @@ <translation id="1928696683969751773">Eguneratzeak</translation> <translation id="19288952978244135">Ireki berriro Chrome.</translation> <translation id="1933845786846280168">Hautatutako fitxa</translation> +<translation id="193571872656840963">Erakutsi esker ona sortzaileari</translation> <translation id="1943432128510653496">Gorde pasahitzak</translation> <translation id="1952172573699511566">Ahal den heinean, webguneek testua hizkuntza hobetsian erakutsiko dute.</translation> <translation id="1959679933317802873">Edukiaren zain</translation> @@ -184,6 +186,7 @@ <translation id="1995884366040846621">Aurrera egiteko, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> hornitzaileak zure izena, helbide elektronikoa eta profileko argazkia partekatuko ditu webgune honekin. Ikusi webgunearen <ph name="BEGIN_LINK1" />pribatutasun-gidalerroak<ph name="END_LINK1" />.</translation> <translation id="2000419248597011803">Helbide-barrako zein bilaketa-koadroko bilaketak eta cookie batzuk bidaltzen ditu bilatzaile lehenetsira</translation> <translation id="200114059308480249">Barne hartu nahi al duzu inguruko testua Google-ko bilaketetan?</translation> +<translation id="2011996512573319870">Sinkronizatu datuak Google-k edukirik egokiena eskain diezazun</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# fitxategi}other{# fitxategi}}</translation> <translation id="2020309681647789787">Sinkronizatutako gailu guztietan ikusi ahalko duzu historia, egiten ari zinenari berrekiteko</translation> <translation id="2021896219286479412">Webgunearen pantaila osoko aukerak</translation> @@ -267,6 +270,7 @@ <translation id="2461822463642141190">Oraingo kontsumoa</translation> <translation id="2472163211318554013">Hasi saioa Chrome-ri etekinik handiena ateratzeko</translation> <translation id="247737702124049222">Aktibatu dira irudien azalpenak</translation> +<translation id="2481251096908459228">Ikusi zuretzako istorioak</translation> <translation id="2482878487686419369">Jakinarazpenak</translation> <translation id="2485422356828889247">Desinstalatu</translation> <translation id="2494974097748878569">Chrome-rako Google-ren Laguntzailea</translation> @@ -308,6 +312,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# audio-fitxategi}other{# audio-fitxategi}}</translation> <translation id="265156376773362237">Aurrez kargatzeko modu arrunta</translation> <translation id="2656405586795711023">Sareko aplikazioak</translation> +<translation id="2700802943130197326">Sinkronizatu datuak darabiltzazun beste gailuetako pasahitzak, laster-markak eta abar eskuratzeko.</translation> <translation id="2702516483241149200">Berria: partekatu testu honetan gora eta behera egiteko esteka bat</translation> <translation id="2704606927547763573">Kopiatuta</translation> <translation id="2707726405694321444">Freskatu orria</translation> @@ -569,6 +574,7 @@ <translation id="4162867837470729563">Ireki da partekatzeko aukeren zerrenda altuera osoan.</translation> <translation id="4165986682804962316">Webgunearen ezarpenak</translation> <translation id="4170011742729630528">Zerbitzua ez dago erabilgarri. Saiatu berriro geroago.</translation> +<translation id="4177222230309051052">Eskuratu laster-marka guztiak</translation> <translation id="4181841719683918333">Hizkuntzak</translation> <translation id="4195643157523330669">Ireki fitxa berri batean</translation> <translation id="4196597275619698563">Sortu txartel bat</translation> @@ -724,6 +730,7 @@ <translation id="4987271110129728827">Ezin da aurkitu orria. Egiaztatu zuzen idatzi duzula edo egin sareko bilaketa bat.</translation> <translation id="4988526792673242964">Orriak</translation> <translation id="5001388021414335527">Jarraitu webguneari hemen</translation> +<translation id="500351648694011114">Arakatu erraztasun handiagoz</translation> <translation id="5004416275253351869">Google-ko jarduerak kontrolatzeko aukerak</translation> <translation id="5005141133360250920">Ezabatu da erreakzioa</translation> <translation id="5005498671520578047">Kopiatu pasahitza</translation> @@ -875,6 +882,7 @@ <translation id="5864419784173784555">Beste deskarga bat amaitzeko zain…</translation> <translation id="5865733239029070421">Erabilera-estatistikak eta hutsegite-txostenak automatikoki bidaltzen dizkio Google-ri</translation> <translation id="5869522115854928033">Gordetako pasahitzak</translation> +<translation id="5869789175361934029">Egin aurrera beste gailu batetik</translation> <translation id="587735546353481577">Webgune bati jarraitzeko, joan bertara, ireki Chrome-ko menua eta sakatu Jarraitu.</translation> <translation id="5880748256563468367">Joan jariora</translation> <translation id="5884076754568147479">Zereginak osatzen laguntzeko, Laguntzailea zerbitzuaren bidez erabiltzen dituzun webguneen URLak eta edukia jasoko ditu Google-k, baita Laguntzailea erabilita bidaltzen duzun informazioa ere</translation> @@ -1448,6 +1456,7 @@ <translation id="8909135823018751308">Partekatu…</translation> <translation id="8912362522468806198">Google-ko kontua</translation> <translation id="8920114477895755567">Gurasoen xehetasunen zain.</translation> +<translation id="8921980840204105660">Sinkronizatu datuak darabiltzazun beste gailuetako laster-markak eskuratzeko</translation> <translation id="8922289737868596582">Sakatu Aukera gehiago botoia orriak deskargatu eta konexiorik gabe erabiltzeko</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation> <translation id="892496902842311796">Prest dago <ph name="LANG" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index 56b0ecb..233a5a9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -171,6 +171,7 @@ <translation id="1928696683969751773">بهروزرسانیها</translation> <translation id="19288952978244135">Chrome را دوباره باز کنید.</translation> <translation id="1933845786846280168">برگه انتخابشده</translation> +<translation id="193571872656840963">قدردانی از این سازنده</translation> <translation id="1943432128510653496">ذخیره گذرواژهها</translation> <translation id="1952172573699511566">درصورت امکان، وبسایتها نوشتار را به زبان ترجیحی شما نمایش میدهند.</translation> <translation id="1959679933317802873">درانتظار محتوا</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index c41064e..26ea114 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Seuraat tätä: <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Hakukone</translation> <translation id="1513352483775369820">Kirjanmerkit ja verkkohistoria</translation> +<translation id="1513814250881909472">Synkronoi välilehdet muilta laitteilta</translation> <translation id="1513858653616922153">Poista salasana</translation> <translation id="1518421282666914498">Tunne-GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktiivinen tänään</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Jos jatkat, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> jakaa nimesi, sähköpostiosoitteesi, osoitteesi ja profiilikuvasi tälle sivustolle. Tutustu sivuston <ph name="BEGIN_LINK1" />tietosuojakäytäntöön<ph name="END_LINK1" />.</translation> <translation id="2000419248597011803">Lähettää joitakin osoitekentän ja hakukentän kautta tehtyjä hakuja sekä joitakin evästeitä oletushakukoneellesi</translation> <translation id="200114059308480249">Sisällytetäänkö ympäröivä teksti Google-hakuihin?</translation> +<translation id="2011996512573319870">Synkronoi saadaksesi osuvinta sisältöä Googlelta</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# tiedosto}other{# tiedostoa}}</translation> <translation id="2020309681647789787">Historia löytyy kaikilta synkronoiduilta laitteilta, joten voit jatkaa samasta kohdasta</translation> <translation id="2021896219286479412">Ohjaimet koko näytön tilassa</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Nykyinen</translation> <translation id="2472163211318554013">Saat eniten irti Chromesta kirjautumalla sisään</translation> <translation id="247737702124049222">Kuvaselitykset ovat päällä</translation> +<translation id="2481251096908459228">Katso sinulle valitut jutut</translation> <translation id="2482878487686419369">Ilmoitukset</translation> <translation id="2485422356828889247">Poista</translation> <translation id="2494974097748878569">Chromen Google Assistant</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# äänitiedosto}other{# äänitiedostoa}}</translation> <translation id="265156376773362237">Vakioesilataus</translation> <translation id="2656405586795711023">Verkkosovellukset</translation> +<translation id="2700802943130197326">Synkronoi salasanat, kirjanmerkit ja muuta kaikilta muilta laitteiltasi.</translation> <translation id="2702516483241149200">Uutta: jaa linkki, joka vie tähän tekstiin</translation> <translation id="2704606927547763573">Kopioitu</translation> <translation id="2707726405694321444">Päivitä sivu</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Jakamisvaihtoehtojen lista koko näytön kokoisena.</translation> <translation id="4165986682804962316">Sivustoasetukset</translation> <translation id="4170011742729630528">Palvelu ei ole käytettävissä. Yritä myöhemmin uudelleen.</translation> +<translation id="4177222230309051052">Hae kaikki kirjanmerkkisi</translation> <translation id="4181841719683918333">Kielet</translation> <translation id="4195643157523330669">Avaa uudelle välilehdelle</translation> <translation id="4196597275619698563">Luo kortti</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Sivua ei löydy. Tarkista oikeinkirjoitus tai kokeile verkkohakua.</translation> <translation id="4988526792673242964">Sivut</translation> <translation id="5001388021414335527">Seuraa sivustoa valitsemalla tämä</translation> +<translation id="500351648694011114">Selaa helpommin</translation> <translation id="5004416275253351869">Google-toimintojen hallinta</translation> <translation id="5005141133360250920">Reaktio poistettu</translation> <translation id="5005498671520578047">Kopioi salasana</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Odottaa toista latausta…</translation> <translation id="5865733239029070421">Lähettää automaattisesti käyttötilastoja ja virheraportteja Googlelle</translation> <translation id="5869522115854928033">Tallennetut salasanat</translation> +<translation id="5869789175361934029">Jatka toisella laitteella</translation> <translation id="587735546353481577">Jos haluat seurata sivustoa, siirry sille, avaa Chrome-valikko ja valitse Seuraa.</translation> <translation id="5880748256563468367">Siirry fiidiin</translation> <translation id="5884076754568147479">Jotta tehtävien hoitaminen sujuisi helpommin, Google saa tiedot niiden sivustojen URL-osoitteista ja sisällöstä, joilla käytät Assistantia, sekä Assistantin kautta lähettämäsi tiedot</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Jaa…</translation> <translation id="8912362522468806198">Google-tilisi avulla</translation> <translation id="8920114477895755567">Odotetaan vanhempien tietoja.</translation> +<translation id="8921980840204105660">Synkronoi kirjanmerkit muilta laitteilta</translation> <translation id="8922289737868596582">Lataa sivuja lisäasetuksien kautta, niin voit käyttää niitä offline-tilassa.</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Lue lisää<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> on valmis</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index 922d8f2d..f5f9dd3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -171,6 +171,7 @@ <translation id="1928696683969751773">Mga Update</translation> <translation id="19288952978244135">Muling buksan ang Chrome.</translation> <translation id="1933845786846280168">Napiling Tab</translation> +<translation id="193571872656840963">Magpakita ng pasasalamat sa creator na ito</translation> <translation id="1943432128510653496">I-save ang mga password</translation> <translation id="1952172573699511566">Magpapakita ang mga website ng text sa iyong gustong wika, kung posible.</translation> <translation id="1959679933317802873">Naghihintay ng content</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb index 4d80870..0307539 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Vous suivez <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Moteur de recherche</translation> <translation id="1513352483775369820">Favoris et historique Web</translation> +<translation id="1513814250881909472">Synchronisez vos données pour ajouter vos onglets de vos autres appareils</translation> <translation id="1513858653616922153">Supprimer le mot de passe</translation> <translation id="1518421282666914498">GIF d'émotion <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Actif aujourd'hui</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Pour continuer, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> partagera votre nom, votre adresse de courriel et votre photo de profil avec ce site. Consultez la <ph name="BEGIN_LINK1" />politique de confidentialité<ph name="END_LINK1" /> de ce site.</translation> <translation id="2000419248597011803">Envoie des témoins et des recherches à partir de la barre d'adresse et du champ de recherche à votre moteur de recherche par défaut</translation> <translation id="200114059308480249">Inclure le texte à proximité dans les recherches Google?</translation> +<translation id="2011996512573319870">Synchronisez vos données pour accéder au contenu le plus pertinent de Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# fichier}one{# fichier}other{# fichiers}}</translation> <translation id="2020309681647789787">Votre historique s'affichera sur tous vos appareils synchronisés, vous pourrez donc reprendre le cours de vos activités</translation> <translation id="2021896219286479412">Contrôles du site en plein écran</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Actuelle</translation> <translation id="2472163211318554013">Connectez-vous pour profiter pleinement de Chrome</translation> <translation id="247737702124049222">Les descriptions d'images sont activées</translation> +<translation id="2481251096908459228">Affichez des histoires personnalisées</translation> <translation id="2482878487686419369">Notifications</translation> <translation id="2485422356828889247">Désinstaller</translation> <translation id="2494974097748878569">Assistant Google dans Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# fichier audio}one{# fichier audio}other{# fichiers audio}}</translation> <translation id="265156376773362237">Préchargement standard</translation> <translation id="2656405586795711023">Applications Web</translation> +<translation id="2700802943130197326">Synchronisez vos données pour ajouter vos mots de passe, vos favoris et plus sur tous vos autres appareils.</translation> <translation id="2702516483241149200">Nouveauté : communiquez un lien qui fait défiler l'écran jusqu'à ce texte</translation> <translation id="2704606927547763573">Copié</translation> <translation id="2707726405694321444">Actualiser la page</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Liste d'options de partage à pleine hauteur.</translation> <translation id="4165986682804962316">Paramètres du site</translation> <translation id="4170011742729630528">Le service n'est pas disponible. Veuillez réessayer plus tard.</translation> +<translation id="4177222230309051052">Ajoutez tous vos favoris</translation> <translation id="4181841719683918333">Langues</translation> <translation id="4195643157523330669">Ouvrir dans un nouvel onglet</translation> <translation id="4196597275619698563">Créer une carte</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Impossible de trouver cette page. Vérifiez votre orthographe ou essayez une recherche sur le Web.</translation> <translation id="4988526792673242964">Pages</translation> <translation id="5001388021414335527">Suivez ce site ici</translation> +<translation id="500351648694011114">Naviguez plus facilement</translation> <translation id="5004416275253351869">Commandes d'activité Google</translation> <translation id="5005141133360250920">Réaction supprimée</translation> <translation id="5005498671520578047">Copier mot de passe</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">En attente d'un autre téléchargement…</translation> <translation id="5865733239029070421">Envoie automatiquement des statistiques d'utilisation et des rapports d'erreur à Google</translation> <translation id="5869522115854928033">Mots de passe enregistrés</translation> +<translation id="5869789175361934029">Continuer à partir d'un autre appareil</translation> <translation id="587735546353481577">Pour suivre un site, accédez à ce dernier, ouvrez le menu Chrome et touchez Suivre.</translation> <translation id="5880748256563468367">Accéder au flux</translation> <translation id="5884076754568147479">Pour vous aider à effectuer des tâches, Google recevra les URL et le contenu des sites avec lesquels vous utilisez l'Assistant, ainsi que l'information que vous envoyez par l'intermédiaire de l'Assistant</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Partager...</translation> <translation id="8912362522468806198">Compte Google</translation> <translation id="8920114477895755567">En attente de détails sur les parents.</translation> +<translation id="8921980840204105660">Synchronisez vos données pour ajouter vos favoris de vos autres appareils</translation> <translation id="8922289737868596582">Téléchargez des pages à partir du bouton Plus d'options pour les utiliser hors connexion</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> est prêt</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb index e08f30c..619b4536 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Vous suivez <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Moteur de recherche</translation> <translation id="1513352483775369820">Favoris et historique Web</translation> +<translation id="1513814250881909472">Activez la synchronisation pour récupérer vos onglets depuis d'autres appareils</translation> <translation id="1513858653616922153">Supprimer le mot de passe</translation> <translation id="1518421282666914498">GIF émotions <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Actif aujourd'hui</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Pour continuer, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> partagera avec ce site vos nom, adresse e-mail et photo de profil. Consultez les <ph name="BEGIN_LINK1" />Règles de confidentialité<ph name="END_LINK1" /> de ce site.</translation> <translation id="2000419248597011803">Envoie des cookies et des recherches effectuées à partir de la barre d'adresse et du champ de recherche à votre moteur de recherche par défaut</translation> <translation id="200114059308480249">Inclure le texte à proximité dans les recherches Google ?</translation> +<translation id="2011996512573319870">Activez la synchronisation pour que Google vous présente le contenu le plus pertinent</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# fichier}one{# fichier}other{# fichiers}}</translation> <translation id="2020309681647789787">Comme vous aurez votre historique sur tous vos appareils synchronisés, vous pourrez continuer vos activités</translation> <translation id="2021896219286479412">Commandes du site en plein écran</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Consommation actuelle</translation> <translation id="2472163211318554013">Connectez-vous pour profiter pleinement de Chrome</translation> <translation id="247737702124049222">Les descriptions d'images sont activées</translation> +<translation id="2481251096908459228">Des stories sur mesure</translation> <translation id="2482878487686419369">Notifications</translation> <translation id="2485422356828889247">Désinstaller</translation> <translation id="2494974097748878569">Assistant Google dans Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# fichier audio}one{# fichier audio}other{# fichiers audio}}</translation> <translation id="265156376773362237">Préchargement standard</translation> <translation id="2656405586795711023">Applications Web</translation> +<translation id="2700802943130197326">Activez la synchronisation pour récupérer vos mots de passe, favoris, et plus encore depuis vos autres appareils.</translation> <translation id="2702516483241149200">Nouveau : partagez un lien vers ce texte</translation> <translation id="2704606927547763573">Copié</translation> <translation id="2707726405694321444">Actualiser la page</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Liste des options de partage ouverte à pleine hauteur.</translation> <translation id="4165986682804962316">Paramètres de site</translation> <translation id="4170011742729630528">Service indisponible. Veuillez réessayer plus tard.</translation> +<translation id="4177222230309051052">Récupérer tous vos favoris</translation> <translation id="4181841719683918333">Langues</translation> <translation id="4195643157523330669">Ouvrir dans un nouvel onglet</translation> <translation id="4196597275619698563">Créer une fiche</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Page introuvable. Vérifiez l'orthographe ou effectuez une recherche sur le Web.</translation> <translation id="4988526792673242964">Pages</translation> <translation id="5001388021414335527">Suivre ce site ici</translation> +<translation id="500351648694011114">Parcourir plus facilement</translation> <translation id="5004416275253351869">Commandes Google relatives à l'activité</translation> <translation id="5005141133360250920">Réaction supprimée</translation> <translation id="5005498671520578047">Copier mot de passe</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">En attente d'un autre téléchargement…</translation> <translation id="5865733239029070421">Envoie automatiquement des statistiques d'utilisation et des rapports d'erreur à Google</translation> <translation id="5869522115854928033">Mots de passe enregistrés</translation> +<translation id="5869789175361934029">Continuer depuis un autre appareil</translation> <translation id="587735546353481577">Pour suivre un site, accédez-y, ouvrez le menu Chrome et appuyez sur "Suivre".</translation> <translation id="5880748256563468367">Accéder au flux</translation> <translation id="5884076754568147479">Pour vous aider à effectuer des tâches, Google recevra les URL et le contenu des sites sur lesquels vous utilisez l'Assistant, ainsi que les informations que vous envoyez via celui-ci</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Partager…</translation> <translation id="8912362522468806198">Compte Google</translation> <translation id="8920114477895755567">En attente des coordonnées des parents…</translation> +<translation id="8921980840204105660">Activez la synchronisation pour récupérer vos favoris depuis d'autres appareils</translation> <translation id="8922289737868596582">Téléchargez des pages pour y accéder hors connexion, à partir du bouton "Plus d'options"</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> est prêt</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index bc04a486..ed78c38 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Estás seguindo <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Motor de busca</translation> <translation id="1513352483775369820">Marcadores e historial web</translation> +<translation id="1513814250881909472">Sincroniza os datos para obter as pestanas dos teus outros dispositivos</translation> <translation id="1513858653616922153">Eliminar contrasinal</translation> <translation id="1518421282666914498">GIF de emoticona (<ph name="CURRENT_DATE_ISO" />)</translation> <translation id="1521774566618522728">Dispositivo activo hoxe</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Para continuar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> compartirá o teu nome, enderezo de correo electrónico e imaxe do perfil con este sitio. Consulta a <ph name="BEGIN_LINK1" />política de privacidade<ph name="END_LINK1" /> deste sitio.</translation> <translation id="2000419248597011803">Envía buscas e cookies da barra de enderezos e da caixa de busca ao motor de busca predeterminado</translation> <translation id="200114059308480249">Queres incluír o texto circundante nas buscas de Google?</translation> +<translation id="2011996512573319870">Sincroniza os datos para obter o contido máis relevante de Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ficheiro}other{# ficheiros}}</translation> <translation id="2020309681647789787">Terás o teu historial en todos os dispositivos sincronizados, de tal xeito que poidas continuar co que estabas facendo</translation> <translation id="2021896219286479412">Controis de pantalla completa</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Actual</translation> <translation id="2472163211318554013">Inicia sesión para sacarlle o máximo partido a Chrome</translation> <translation id="247737702124049222">As descricións das imaxes están activadas</translation> +<translation id="2481251096908459228">Obtén historias relevantes para ti</translation> <translation id="2482878487686419369">Notificacións</translation> <translation id="2485422356828889247">Desinstalar</translation> <translation id="2494974097748878569">Asistente de Google en Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ficheiro de audio}other{# ficheiros de audio}}</translation> <translation id="265156376773362237">Precarga estándar</translation> <translation id="2656405586795711023">Aplicacións web</translation> +<translation id="2700802943130197326">Sincroniza os datos para ter todos os teus contrasinais, marcadores e máis en todos os teus dispositivos.</translation> <translation id="2702516483241149200">Novidade: Comparte unha ligazón que leve directamente a este texto</translation> <translation id="2704606927547763573">Copiada</translation> <translation id="2707726405694321444">Actualiza páxina</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">A lista de opcións para compartir está aberta a pantalla completa.</translation> <translation id="4165986682804962316">Configuración do sitio</translation> <translation id="4170011742729630528">O servizo non está dispoñible. Téntao de novo máis tarde.</translation> +<translation id="4177222230309051052">Obtén todos os teus marcadores</translation> <translation id="4181841719683918333">Idiomas</translation> <translation id="4195643157523330669">Abrir en pestana nova</translation> <translation id="4196597275619698563">Crear tarxeta</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Non se puido atopar esa páxina. Comproba que escribises ben a consulta ou proba a realizar unha busca web.</translation> <translation id="4988526792673242964">Páxinas</translation> <translation id="5001388021414335527">Seguir este sitio aquí</translation> +<translation id="500351648694011114">Navega de xeito máis fácil</translation> <translation id="5004416275253351869">Controis de actividade de Google</translation> <translation id="5005141133360250920">Reacción eliminada</translation> <translation id="5005498671520578047">Copiar contrasinal</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Agardando por outra descarga…</translation> <translation id="5865733239029070421">Envía estatísticas de uso e informes de erros automaticamente a Google</translation> <translation id="5869522115854928033">Contrasinais gardados</translation> +<translation id="5869789175361934029">Continuar desde outro dispositivo</translation> <translation id="587735546353481577">Para seguir un sitio, entra nel, abre o menú de Chrome e toca Seguir.</translation> <translation id="5880748256563468367">Ir ao feed</translation> <translation id="5884076754568147479">Para axudarche a completar tarefas, Google recibirá os URL e os contidos dos sitios nos que uses o Asistente, ademais da información que envíes a través del</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Compartir...</translation> <translation id="8912362522468806198">Conta de Google</translation> <translation id="8920114477895755567">Agardando pola información dos pais.</translation> +<translation id="8921980840204105660">Sincroniza os datos para obter os marcadores dos teus outros dispositivos</translation> <translation id="8922289737868596582">Para ver as páxinas cando non teñas conexión, descárgaas a través do botón Máis opcións</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Máis información<ph name="END_LINK" /></translation> <translation id="892496902842311796">O idioma (<ph name="LANG" />) está listo</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index 0770456..7a00b94 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -171,6 +171,7 @@ <translation id="1928696683969751773">અપડેટ</translation> <translation id="19288952978244135">Chrome ફરીથી ખોલો.</translation> <translation id="1933845786846280168">પસંદ કરેલ ટૅબ</translation> +<translation id="193571872656840963">આ નિર્માતાનો આભાર વ્યક્ત કરો</translation> <translation id="1943432128510653496">પાસવર્ડ સાચવો</translation> <translation id="1952172573699511566">જ્યારે શક્ય હશે, ત્યારે વેબસાઇટ તમારી પસંદગીની ભાષામાં ટેક્સ્ટ બતાવશે.</translation> <translation id="1959679933317802873">તમારું કન્ટેન્ટ લોડ થવાની રાહ જોઈ રહ્યાં છીએ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb index ea842e3..1386d332 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Pratite web-lokaciju <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Tražilica</translation> <translation id="1513352483775369820">Oznake i Google povijest</translation> +<translation id="1513814250881909472">Uključite sinkronizaciju da bi se kartice prikazale na drugim uređajima</translation> <translation id="1513858653616922153">Izbriši zaporku</translation> <translation id="1518421282666914498">GIF emocija <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktivan danas</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Da biste nastavili, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> podijelit će vaše ime, e-adresu i profilnu sliku s ovom web-lokacijom. Pogledajte <ph name="BEGIN_LINK1" />pravila o privatnosti<ph name="END_LINK1" /> ove web-lokacije.</translation> <translation id="2000419248597011803">Zadanoj tražilici šalje neke kolačiće i pretraživanja iz adresne trake i okvira za pretraživanje</translation> <translation id="200114059308480249">Želite li uključiti okolni tekst u Google pretraživanja?</translation> +<translation id="2011996512573319870">Uključite sinkronizaciju za prikaz najrelevantnijeg sadržaja s Googlea</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# datoteka}one{# datoteka}few{# datoteke}other{# datoteka}}</translation> <translation id="2020309681647789787">Vaša će povijest biti na svim vašim sinkroniziranim uređajima kako biste mogli nastaviti ono što radite</translation> <translation id="2021896219286479412">Kontrole web-lokacije na cijelom zaslonu</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Trenutačno</translation> <translation id="2472163211318554013">Prijavite se da biste iskoristili sve prednosti Chromea</translation> <translation id="247737702124049222">Uključeni su opisi slika</translation> +<translation id="2481251096908459228">Pogledajte vijesti prilagođene vama</translation> <translation id="2482878487686419369">Obavijesti</translation> <translation id="2485422356828889247">Deinstaliraj</translation> <translation id="2494974097748878569">Google asistent u Chromeu</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# audiodatoteka}one{# audiodatoteka}few{# audiodatoteke}other{# audiodatoteka}}</translation> <translation id="265156376773362237">Standardno predučitavanje</translation> <translation id="2656405586795711023">Web-aplikacije</translation> +<translation id="2700802943130197326">Uključite sinkronizaciju za prikaz zaporki, oznaka i drugog na svim ostalim uređajima.</translation> <translation id="2702516483241149200">Novo: dijelite vezu koja se pomiče na ovaj tekst</translation> <translation id="2704606927547763573">Kopirano</translation> <translation id="2707726405694321444">Osvježavanje stranice</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Popis opcija za dijeljenje u punoj visini.</translation> <translation id="4165986682804962316">Postavke web-lokacije</translation> <translation id="4170011742729630528">Usluga nije dostupna, pokušajte ponovo kasnije.</translation> +<translation id="4177222230309051052">Pristup svim vašim oznakama</translation> <translation id="4181841719683918333">Jezici</translation> <translation id="4195643157523330669">Otvori na novoj kartici</translation> <translation id="4196597275619698563">Izradi karticu</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Nije moguće pronaći stranicu. Provjerite jeste li točno napisali ili pretražite web.</translation> <translation id="4988526792673242964">Stranice</translation> <translation id="5001388021414335527">Pratite web-lokaciju ovdje</translation> +<translation id="500351648694011114">Jednostavnije pregledavanje</translation> <translation id="5004416275253351869">Kontrole aktivnosti na Googleu</translation> <translation id="5005141133360250920">Reakcija je izbrisana</translation> <translation id="5005498671520578047">Kopiranje zaporke</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Čekanje na još jedno preuzimanje…</translation> <translation id="5865733239029070421">Automatski šalje Googleu statistiku upotrebe i izvješća o rušenju</translation> <translation id="5869522115854928033">Spremljene zaporke</translation> +<translation id="5869789175361934029">Nastavite na drugom uređaju</translation> <translation id="587735546353481577">Da biste pratili web-lokaciju, otvorite je, otvorite izbornik preglednika Chrome i dodirnite Prati.</translation> <translation id="5880748256563468367">Otvori feed</translation> <translation id="5884076754568147479">Da bi vam pomogao sa zadacima, Google će primati URL-ove i sadržaje web-lokacija na kojima upotrebljavate Asistenta, kao i informacije koje šaljete putem Asistenta</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Dijeljenje…</translation> <translation id="8912362522468806198">Google Račun</translation> <translation id="8920114477895755567">Čekaju se pojedinosti o nadređenim jedinicama.</translation> +<translation id="8921980840204105660">Uključite sinkronizaciju da biste svoje oznake imali na drugim uređajima</translation> <translation id="8922289737868596582">Preuzmite stranice za izvanmrežnu upotrebu pomoću gumba Više opcija</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="892496902842311796">Spremno: <ph name="LANG" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index f6f70a7..bf29b5e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Դուք հետևում եք <ph name="SITE_NAME" /> կայքին</translation> <translation id="1506061864768559482">Որոնողական համակարգ</translation> <translation id="1513352483775369820">Էջանիշներ և վեբ պատմություն</translation> +<translation id="1513814250881909472">Կատարեք համաժամացում, որպեսզի ձեր մյուս սարքերի ներդիրները հասանելի դառնան։</translation> <translation id="1513858653616922153">Ջնջել գաղտնաբառը</translation> <translation id="1518421282666914498">Զմայլիկով GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Այսօր ակտիվ է եղել</translation> @@ -170,6 +171,7 @@ <translation id="1928696683969751773">Թարմացումներ</translation> <translation id="19288952978244135">Նորից բացեք Chrome-ը:</translation> <translation id="1933845786846280168">Ընտրված ներդիր</translation> +<translation id="193571872656840963">Շնորհակալություն հայտնել այս հեղինակին</translation> <translation id="1943432128510653496">Պահել գաղտնաբառերը</translation> <translation id="1952172573699511566">Կայքերի տեքստը հնարավորության դեպքում կցուցադրվի ձեր ընտրած լեզվով։</translation> <translation id="1959679933317802873">Բովանդակության սպասում</translation> @@ -184,6 +186,7 @@ <translation id="1995884366040846621">Շարունակելու համար <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ընկերությունը կփոխանցի ձեր անունը, էլ․ հասցեն և պրոֆիլի նկարը այս կայքին։ Ծանոթացեք այս կայքի <ph name="BEGIN_LINK1" />գաղտնիության քաղաքականությանը<ph name="END_LINK1" />։</translation> <translation id="2000419248597011803">Ձեր կանխադրված որոնիչին է ուղարկում հասցեագոտու և որոնման դաշտի հարցումները, ինչպես նաև որոշ քուքիներ</translation> <translation id="200114059308480249">Ներառե՞լ շրջապատող տեքստը Google-ի որոնման հարցումներում</translation> +<translation id="2011996512573319870">Կատարեք համաժամացում, որպեսզի առավել համապատասխան բովանդակություն ստանաք Google-ից։</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ֆայլ}one{# ֆայլ}other{# ֆայլ}}</translation> <translation id="2020309681647789787">Ձեր գործողությունների պատմությունը հասանելի կլինի բոլոր համաժամացված սարքերում, և դուք կկարողանաք շարունակել այն, ինչ անում էիք</translation> <translation id="2021896219286479412">Լիաէկրան ռեժիմի կարգավորումներ</translation> @@ -267,6 +270,7 @@ <translation id="2461822463642141190">Ընթացիկ</translation> <translation id="2472163211318554013">Մտեք հաշիվ՝ Chromе-ի բոլոր գործառույթներից օգտվելու համար</translation> <translation id="247737702124049222">Պատկերների նկարագրությունները միացված են</translation> +<translation id="2481251096908459228">Պատմություններ ձեզ համար</translation> <translation id="2482878487686419369">Ծանուցումներ</translation> <translation id="2485422356828889247">Ապատեղադրել</translation> <translation id="2494974097748878569">Google Օգնականը Chrome-ում</translation> @@ -308,6 +312,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# աուդիո ֆայլ}one{# աուդիո ֆայլ}other{# աուդիո ֆայլ}}</translation> <translation id="265156376773362237">Սովորական նախաբեռնում</translation> <translation id="2656405586795711023">Վեբ հավելվածներ</translation> +<translation id="2700802943130197326">Կատարեք համաժամացում, որպեսզի ձեր գաղտնաբառերը, էջանիշները և այլ տվյալները մյուս բոլոր սարքերում հասանելի դառնան։</translation> <translation id="2702516483241149200">Նորույթ․ կիսվեք հղումով, որն ուղղորդում է դեպի այս տեքստ</translation> <translation id="2704606927547763573">Պատճենվեց</translation> <translation id="2707726405694321444">Թարմացնել էջը</translation> @@ -569,6 +574,7 @@ <translation id="4162867837470729563">Կիսվելու տարբերակների ցանկը բացված է ամբողջությամբ։</translation> <translation id="4165986682804962316">Կայքի կարգավորումներ</translation> <translation id="4170011742729630528">Ծառայությունը մատչելի չէ: Կրկին փորձեք ավելի ուշ:</translation> +<translation id="4177222230309051052">Ձեր բոլոր էջանիշները՝ միշտ ձեռքի տակ</translation> <translation id="4181841719683918333">Լեզուներ</translation> <translation id="4195643157523330669">Բացել նոր ներդիրով</translation> <translation id="4196597275619698563">Ստեղծել քարտ</translation> @@ -724,6 +730,7 @@ <translation id="4987271110129728827">Չի հաջողվում գտնել էջը։ Եթե վստահ եք, որ հարցումը ճիշտ եք մուտքագրել, փորձեք որոնել համացանցում։</translation> <translation id="4988526792673242964">Էջեր</translation> <translation id="5001388021414335527">Հետևեք այս կայքին այստեղ</translation> +<translation id="500351648694011114">Ավելի հարմար դիտարկիչ</translation> <translation id="5004416275253351869">Google-ում գործողությունների հետագծում</translation> <translation id="5005141133360250920">Արձագանքը ջնջվել է</translation> <translation id="5005498671520578047">Պատճենել գաղտնաբառը</translation> @@ -875,6 +882,7 @@ <translation id="5864419784173784555">Նախորդ ներբեռնումն ավարտվում է…</translation> <translation id="5865733239029070421">Ավտոմատ Google-ին է ուղարկում օգտագործման վիճակագրությունը և խափանումների մասին հաշվետվությունները</translation> <translation id="5869522115854928033">Պահված գաղտնաբառեր</translation> +<translation id="5869789175361934029">Շարունակեք այլ սարքից</translation> <translation id="587735546353481577">Կայքին հետևելու համար անցեք այդ կայք, բացեք Chrome-ի ընտրացանկն ու հպեք «Հետևել»։</translation> <translation id="5880748256563468367">Անցնել ֆիդին</translation> <translation id="5884076754568147479">Ձեր աշխատանքը հեշտացնելու համար Google-ը կստանա կայքերի հասցեներն ու բովանդակությունը, որոնցում օգտվում եք Օգնականից, ինչպես նաև տվյալները, որոնք ուղարկում եք Օգնականի միջոցով։</translation> @@ -1448,6 +1456,7 @@ <translation id="8909135823018751308">Կիսվել…</translation> <translation id="8912362522468806198">Google հաշիվ</translation> <translation id="8920114477895755567">Ծնողների տվյալները սպասվում են:</translation> +<translation id="8921980840204105660">Կատարեք համաժամացում, որպեսզի ձեր մյուս սարքերի էջանիշները հասանելի դառնան։</translation> <translation id="8922289737868596582">«Այլ տարբերակներ» կոճակի օգնությամբ ներբեռնեք էջերը՝ անցանց ռեժիմում օգտագործելու համար</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Իմանալ ավելին<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> լեզվի փաթեթը պատրաստ է</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 77b7f37..a744910 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Anda mengikuti <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Mesin telusur</translation> <translation id="1513352483775369820">Bookmark dan histori web</translation> +<translation id="1513814250881909472">Sinkronkan untuk mengakses tab Anda dari perangkat lainnya</translation> <translation id="1513858653616922153">Hapus sandi</translation> <translation id="1518421282666914498">GIF Emotikon <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktif hari ini</translation> @@ -170,6 +171,7 @@ <translation id="1928696683969751773">Update</translation> <translation id="19288952978244135">Buka Chrome lagi.</translation> <translation id="1933845786846280168">Tab yang Dipilih</translation> +<translation id="193571872656840963">Ucapkan terima kasih kepada pembuat ini</translation> <translation id="1943432128510653496">Simpan sandi</translation> <translation id="1952172573699511566">Situs akan menampilkan teks dalam bahasa pilihan Anda, jika memungkinkan.</translation> <translation id="1959679933317802873">Menunggu konten</translation> @@ -184,6 +186,7 @@ <translation id="1995884366040846621">Untuk melanjutkan, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> akan membagikan nama, alamat email, dan foto profil Anda ke situs ini. Lihat <ph name="BEGIN_LINK1" />kebijakan privasi<ph name="END_LINK1" /> situs ini.</translation> <translation id="2000419248597011803">Mengirimkan beberapa cookie dan penelusuran dari kolom URL dan kotak penelusuran ke mesin telusur default</translation> <translation id="200114059308480249">Sertakan teks di sekitar dalam penelusuran Google?</translation> +<translation id="2011996512573319870">Sinkronkan untuk mendapatkan konten paling relevan dari Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# File}other{# File}}</translation> <translation id="2020309681647789787">Histori Anda akan tersedia di semua perangkat yang disinkronkan, sehingga Anda dapat melanjutkan kegiatan Anda</translation> <translation id="2021896219286479412">Kontrol situs layar penuh</translation> @@ -267,6 +270,7 @@ <translation id="2461822463642141190">Arus</translation> <translation id="2472163211318554013">Login untuk mengoptimalkan penggunaan Chrome</translation> <translation id="247737702124049222">Deskripsi gambar aktif</translation> +<translation id="2481251096908459228">Lihat artikel untuk Anda</translation> <translation id="2482878487686419369">Notifikasi</translation> <translation id="2485422356828889247">Uninstal</translation> <translation id="2494974097748878569">Asisten Google di Chrome</translation> @@ -308,6 +312,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# File audio}other{# File audio}}</translation> <translation id="265156376773362237">Pramuat standar</translation> <translation id="2656405586795711023">Aplikasi web</translation> +<translation id="2700802943130197326">Sinkronkan untuk mendapatkan sandi dan bookmark Anda serta data lain di semua perangkat lainnya.</translation> <translation id="2702516483241149200">Baru: bagikan link yang mengarah ke teks ini</translation> <translation id="2704606927547763573">Disalin</translation> <translation id="2707726405694321444">Segarkan halaman</translation> @@ -569,6 +574,7 @@ <translation id="4162867837470729563">Daftar opsi berbagi terbuka sepenuhnya.</translation> <translation id="4165986682804962316">Setelan situs</translation> <translation id="4170011742729630528">Layanan tidak tersedia; coba lagi nanti.</translation> +<translation id="4177222230309051052">Dapatkan semua bookmark Anda</translation> <translation id="4181841719683918333">Bahasa</translation> <translation id="4195643157523330669">Buka di tab baru</translation> <translation id="4196597275619698563">Buat kartu</translation> @@ -724,6 +730,7 @@ <translation id="4987271110129728827">Tidak dapat menemukan halaman tersebut. Periksa ejaan Anda atau coba penelusuran web.</translation> <translation id="4988526792673242964">Halaman</translation> <translation id="5001388021414335527">Ikuti situs ini di sini</translation> +<translation id="500351648694011114">Jelajahi dengan lebih mudah</translation> <translation id="5004416275253351869">Kontrol aktivitas Google</translation> <translation id="5005141133360250920">Reaksi dihapus</translation> <translation id="5005498671520578047">Salin sandi</translation> @@ -875,6 +882,7 @@ <translation id="5864419784173784555">Menunggu proses download lain…</translation> <translation id="5865733239029070421">Secara otomatis mengirimkan statistik penggunaan dan laporan kerusakan ke Google</translation> <translation id="5869522115854928033">Sandi tersimpan</translation> +<translation id="5869789175361934029">Lanjutkan dari perangkat lain</translation> <translation id="587735546353481577">Untuk mengikuti situs, buka situs, buka menu Chrome, dan ketuk Ikuti.</translation> <translation id="5880748256563468367">Buka feed</translation> <translation id="5884076754568147479">Untuk membantu Anda menyelesaikan tugas, Google akan menerima URL dan konten situs tempat Anda menggunakan Asisten, serta informasi yang Anda kirimkan melalui Asisten</translation> @@ -1448,6 +1456,7 @@ <translation id="8909135823018751308">Bagikan...</translation> <translation id="8912362522468806198">Akun Google</translation> <translation id="8920114477895755567">Menunggu detail orang tua.</translation> +<translation id="8921980840204105660">Sinkronkan untuk mendapatkan bookmark Anda dari perangkat lainnya</translation> <translation id="8922289737868596582">Download halaman dari tombol opsi Lainnya untuk menggunakannya secara offline</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Pelajari Lebih Lanjut<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> sudah siap</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb index 852d6984..a33c209 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Þú fylgist með <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Leitarvél</translation> <translation id="1513352483775369820">Bókamerki og vefferill</translation> +<translation id="1513814250881909472">Samstilltu til að sækja flipana þína úr öðrum tækjum</translation> <translation id="1513858653616922153">Eyða aðgangsorði</translation> <translation id="1518421282666914498">Tilfinninga-GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Virkt í dag</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Til að halda áfram mun <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> deila nafni þínu, netfangi og prófílmynd með þessu vefsvæði. Sjá <ph name="BEGIN_LINK1" />persónuverndarstefnu<ph name="END_LINK1" /> vefsvæðisins.</translation> <translation id="2000419248597011803">Sendir sum fótspor og sumar leitir úr veffangastikunni og leitarreitnum í sjálfgefnu leitarvélina þína</translation> <translation id="200114059308480249">Taka með texta umhverfis í Google leitum?</translation> +<translation id="2011996512573319870">Samstilltu til að fá meira viðeigandi efni frá Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# skrá}one{# skrá}other{# skrár}}</translation> <translation id="2020309681647789787">Ferilinn þinn verður í öllum samstilltum tækjum svo að þú getir haldið áfram þar sem frá var horfið</translation> <translation id="2021896219286479412">Stýringar vefsvæðis á öllum skjá</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Núna</translation> <translation id="2472163211318554013">Skráðu þig inn til að fá sem mest út úr Chrome</translation> <translation id="247737702124049222">Kveikt er á lýsingum mynda</translation> +<translation id="2481251096908459228">Sjá sögur fyrir þig</translation> <translation id="2482878487686419369">Tilkynningar</translation> <translation id="2485422356828889247">Fjarlægja</translation> <translation id="2494974097748878569">Google hjálpari í Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# hljóðskrá}one{# hljóðskrá}other{# hljóðskrár}}</translation> <translation id="265156376773362237">Hefðbundin forhleðsla</translation> <translation id="2656405586795711023">Vefforrit</translation> +<translation id="2700802943130197326">Samstilltu til að fá aðgangsorðin þín, bókamerkin og fleira í öllum hinum tækjunum þínum.</translation> <translation id="2702516483241149200">Nýtt: Deildu tengli sem flettir að þessum texta</translation> <translation id="2704606927547763573">Afritað</translation> <translation id="2707726405694321444">Endurnýja síðu</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Listi yfir deilingarvalkosti á öllum skjánum.</translation> <translation id="4165986682804962316">Vefsvæðastillingar</translation> <translation id="4170011742729630528">Þjónustan er ekki aðgengileg; reyndu aftur síðar.</translation> +<translation id="4177222230309051052">Fáðu öll bókamerkin þín</translation> <translation id="4181841719683918333">Tungumál</translation> <translation id="4195643157523330669">Opna í nýjum flipa</translation> <translation id="4196597275619698563">Búa til spjald</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Finn ekki síðuna. Athugaðu stafsetninguna eða prófaðu vefleit.</translation> <translation id="4988526792673242964">Síður</translation> <translation id="5001388021414335527">Fylgja þessu vefsvæði hér</translation> +<translation id="500351648694011114">Auðveldari vefskoðun</translation> <translation id="5004416275253351869">Virknistýringar Google</translation> <translation id="5005141133360250920">Viðbrögðum eytt</translation> <translation id="5005498671520578047">Afrita aðgangsorð</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Bíður eftir öðru niðurhali…</translation> <translation id="5865733239029070421">Sendir sjálfkrafa talnagögn um notkun og tilkynningar um hrun til Google</translation> <translation id="5869522115854928033">Vistuð aðgangsorð</translation> +<translation id="5869789175361934029">Halda áfram í öðru tæki</translation> <translation id="587735546353481577">Til að fylgja vefsvæði skaltu opna vefsvæðið, opna Chrome valmyndina og smella á „Fylgja“.</translation> <translation id="5880748256563468367">Opna straum</translation> <translation id="5884076754568147479">Google fær vefslóðir og innihald vefsvæða þar sem þú notar hjálparann, auk upplýsinga sem þú sendir með hjálparanum, til að hjálpa þér að ljúka við verkefni</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Deila…</translation> <translation id="8912362522468806198">Google reikningur</translation> <translation id="8920114477895755567">Bíður eftir upplýsingum um foreldra.</translation> +<translation id="8921980840204105660">Samstilltu til að sækja bókamerkin þín úr öðrum tækjum</translation> <translation id="8922289737868596582">Náðu í síður með hnappnum „Fleiri valkostir“ til að nota þær án nettengingar</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Nánar<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> er til reiðu</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index f590cb68..f2bb41c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">בחרת לעקוב אחר <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">מנוע חיפוש</translation> <translation id="1513352483775369820">סימניות והיסטוריית אתרים</translation> +<translation id="1513814250881909472">אפשר לבצע סנכרון כדי להציג את הכרטיסיות מהמכשירים האחרים שלך</translation> <translation id="1513858653616922153">מחיקת סיסמה</translation> <translation id="1518421282666914498">GIF של רגש <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">סנכרון אחרון: היום</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">כדי להמשיך, הפרטים הבאים ישותפו על ידי <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> עם האתר הזה: השם, האימייל, הכתובת ותמונת הפרופיל שלך. בקישור הבא ניתן לצפות ב<ph name="BEGIN_LINK1" />מדיניות הפרטיות<ph name="END_LINK1" /> של האתר הזה.</translation> <translation id="2000419248597011803">שליחה של חלק מקובצי ה-Cookie והחיפושים משורת כתובת האתר ומתיבת החיפוש אל מנוע החיפוש שהוגדר כברירת מחדל</translation> <translation id="200114059308480249">לכלול את הטקסט שמסביב בחיפושים ב-Google?</translation> +<translation id="2011996512573319870">אפשר לבצע סנכרון כדי לקבל את התוכן הכי רלוונטי מ-Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{קובץ אחד (#)}two{# קבצים}many{# קבצים}other{# קבצים}}</translation> <translation id="2020309681647789787">תהיה לך גישה להיסטוריה שלך בכל המכשירים המסונכרנים, כך שתהיה לך אפשרות להמשיך מהמקום שבו הפסקת.</translation> <translation id="2021896219286479412">פקדי אתר במסך מלא</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">כרגע</translation> <translation id="2472163211318554013">כדי להפיק את המרב מ-Chrome, עליך להיכנס לחשבון</translation> <translation id="247737702124049222">התכונה 'תיאורי תמונות' מופעלת</translation> +<translation id="2481251096908459228">הצגת סטוריז שרלוונטיים לך</translation> <translation id="2482878487686419369">התראות</translation> <translation id="2485422356828889247">הסרת התקנה</translation> <translation id="2494974097748878569">Google Assistant ב-Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{קובץ אודיו אחד (#)}two{# קובצי אודיו}many{# קובצי אודיו}other{# קובצי אודיו}}</translation> <translation id="265156376773362237">טעינה רגילה מראש</translation> <translation id="2656405586795711023">אפליקציות אינטרנט</translation> +<translation id="2700802943130197326">אפשר לבצע סנכרון כדי לעדכן את הסיסמאות, הסימניות ונתונים נוספים בכל המכשירים האחרים שלך.</translation> <translation id="2702516483241149200">חדש: ניתן לשתף קישור שגולל לטקסט הזה</translation> <translation id="2704606927547763573">הועתק</translation> <translation id="2707726405694321444">רענון הדף</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">רשימת אפשרויות השיתוף נפתחה בגובה מלא.</translation> <translation id="4165986682804962316">הגדרות לאתרים</translation> <translation id="4170011742729630528">השירות אינו זמין. יש לנסות שוב מאוחר יותר.</translation> +<translation id="4177222230309051052">הוספת כל הסימניות</translation> <translation id="4181841719683918333">שפות</translation> <translation id="4195643157523330669">פתיחה בכרטיסייה חדשה</translation> <translation id="4196597275619698563">ליצירת כרטיס</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">לא ניתן למצוא את הדף הזה. צריך לוודא שהאיות נכון או לנסות לבצע חיפוש באינטרנט.</translation> <translation id="4988526792673242964">דפים</translation> <translation id="5001388021414335527">כאן ניתן לעקוב אחר האתר הזה</translation> +<translation id="500351648694011114">גלישה קלה יותר</translation> <translation id="5004416275253351869">בקרת הפעילות בחשבון Google</translation> <translation id="5005141133360250920">התגובה נמחקה</translation> <translation id="5005498671520578047">העתקת הסיסמה</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">בהמתנה להורדה נוספת…</translation> <translation id="5865733239029070421">שליחת דוחות קריסה וסטטיסטיקת שימוש אל Google באופן אוטומטי</translation> <translation id="5869522115854928033">סיסמאות שמורות</translation> +<translation id="5869789175361934029">המשך הפעילות במכשיר אחר</translation> <translation id="587735546353481577">כדי לעקוב אחר אתר כלשהו, עוברים אליו, פותחים את תפריט Chrome ומקישים על 'מעקב'.</translation> <translation id="5880748256563468367">לכניסה אל הפיד</translation> <translation id="5884076754568147479">כדי לעזור לך להשלים משימות, Google תקבל את כתובות ה-URL והתוכן של האתרים שבהם נעשה שימוש ב-Assistant, וכן את המידע שנשלח דרך Assistant</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">שיתוף…</translation> <translation id="8912362522468806198">חשבון Google</translation> <translation id="8920114477895755567">בהמתנה לפרטי ההורים.</translation> +<translation id="8921980840204105660">אפשר לבצע סנכרון כדי להוסיף את הסימניות מהמכשירים האחרים שלך</translation> <translation id="8922289737868596582">כדי להשתמש בדפים במצב אופליין, אפשר להוריד אותם דרך הלחצן 'אפשרויות נוספות'</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> מוכנה לשימוש</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index 232f02a..cfba611 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">თქვენ თვალს ადევნებთ <ph name="SITE_NAME" />-ს</translation> <translation id="1506061864768559482">საძიებო სისტემა</translation> <translation id="1513352483775369820">სანიშნეები და ვებ-ისტორია</translation> +<translation id="1513814250881909472">შეასრულეთ სინქრონიზაცია, თქვენი სხვა მოწყობილობებიდან ჩანართები რომ მიიღოთ</translation> <translation id="1513858653616922153">პაროლის წაშლა</translation> <translation id="1518421282666914498">ემოციის GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">აქტიური იყო დღეს</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">გასაგრძელებლად <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ამ საიტს გაუზიარებს თქვენს სახელს, ელფოსტის მისამართსა და პროფილის სურათს. გაეცანით ამ საიტის <ph name="BEGIN_LINK1" />კონფიდენციალურობის დებულებას<ph name="END_LINK1" />.</translation> <translation id="2000419248597011803">თქვენს ნაგულისხმევ საძიებო სისტემას უგზავნის ზოგიერთ ქუქი-ჩანაწერს და საძიებო მოთხოვნებს მისამართთა ზოლიდან ან საძიებო ველიდან</translation> <translation id="200114059308480249">გსურთ, დაურთოთ გარშემო ტექსტი Google ძიებებს?</translation> +<translation id="2011996512573319870">შეასრულეთ სინქრონიზაცია, Google-ისგან ყველაზე სათანადო კონტენტი რომ მიიღოთ</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ფაილი}other{# ფაილი}}</translation> <translation id="2020309681647789787">ისტორია თქვენს ყველა სინქრონიზებულ მოწყობილობაზე გაქვთ ჩართული, ამიტომ შეგიძლიათ გააგრძელოთ ის, რასაც აკეთებდით</translation> <translation id="2021896219286479412">სრულეკრანიანი რეჟიმის მართვა</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">ამჟამინდელი</translation> <translation id="2472163211318554013">Chrome-ის შესაძლებლობები მაქსიმალურად რომ გამოიყენოთ, შედით სისტემაში</translation> <translation id="247737702124049222">სურათების აღწერილობები ჩართულია</translation> +<translation id="2481251096908459228">გაეცანით თქვენთვის შერჩეულ ამბებს</translation> <translation id="2482878487686419369">შეტყობინებები</translation> <translation id="2485422356828889247">დეინსტალაცია</translation> <translation id="2494974097748878569">Google ასისტენტი Chrome-ში</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# აუდიოფაილი}other{# აუდიოფაილი}}</translation> <translation id="265156376773362237">სტანდარტული წინაწარი ჩატვირთვა</translation> <translation id="2656405586795711023">ვებ-აპები</translation> +<translation id="2700802943130197326">შეასრულეთ სინქრონიზაცია, თქვენი პაროლები, სანიშნეები და სხვა კონტენტი თქვენს ყველა მოწყობილობაზე რომ მიიღოთ.</translation> <translation id="2702516483241149200">სიახლე: გააზიარეთ ბმული, რომელიც ამ ტექსტზე გადავა</translation> <translation id="2704606927547763573">დაკოპირდა</translation> <translation id="2707726405694321444">გვერდის განახლება</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">გაზიარების ვარიანტების სია სრულ სიმაღლეზეა.</translation> <translation id="4165986682804962316">საიტის პარამეტრები</translation> <translation id="4170011742729630528">სერვისი არ არის ხელმისაწვდომი, მოგვიანებით სცადეთ.</translation> +<translation id="4177222230309051052">მიიღეთ თქვენი ყველა სანიშნე</translation> <translation id="4181841719683918333">ენები</translation> <translation id="4195643157523330669">ახალ ჩანართში გახსნა</translation> <translation id="4196597275619698563">ბარათის შექმნა</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">ამ გვერდის პოვნა ვერ ხერხდება. შეამოწმეთ მართლწერა, ან ცადეთ ვებში მოძიება.</translation> <translation id="4988526792673242964">გვერდები</translation> <translation id="5001388021414335527">მიადევნეთ თვალი ამ საიტს აქ</translation> +<translation id="500351648694011114">დაათვალიერეთ ვები უფრო მარტივად</translation> <translation id="5004416275253351869">Google აქტივობის მართვის საშუალებები</translation> <translation id="5005141133360250920">რეაქცია წაიშალა</translation> <translation id="5005498671520578047">პაროლის კოპირება</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">სხვა ჩამოტვირთვის მოლოდინში…</translation> <translation id="5865733239029070421">ავტომატური აგზავნის Google-ში გამოყენების სტატისტიკასა და შეცდომების ანგარიშებს</translation> <translation id="5869522115854928033">შენახული პაროლები</translation> +<translation id="5869789175361934029">სხვა მოწყობილობიდან გაგრძელება</translation> <translation id="587735546353481577">საიტისთვის თვალის მისადევნებლად გადადით საიტზე, გახსენით Chrome-ის მენიუ და შეეხეთ „თვალის მიდევნებას“.</translation> <translation id="5880748256563468367">არხზე გადასვლა</translation> <translation id="5884076754568147479">ამოცანების შესრულებაში დასახმარებლად Google მიიღებს იმ საიტების URL-ებსა და კონტენტს, რომლებზეც ასისტენტს იყენებთ, ასევე, თქვენ მიერ ასისტენტის მეშვეობით გადაგზავნილ ინფორმაციას</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">გაზიარება…</translation> <translation id="8912362522468806198">Google ანგარიში</translation> <translation id="8920114477895755567">ველოდებით მშობლების დეტალებს.</translation> +<translation id="8921980840204105660">შეასრულეთ სინქრონიზაცია, თქვენი სხვა მოწყობილობებიდან სანიშნეები რომ მიიღოთ</translation> <translation id="8922289737868596582">ჩამოტვირთეთ გვერდები ხაზგარეშე რეჟიმში გამოსაყენებლად, „დამატებითი ვარიანტების“ ღილაკის მეშვეობით</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> მზად არის</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index 7d15c73..1a5c5df6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Сіз <ph name="SITE_NAME" /> сайтына жазылғансыз</translation> <translation id="1506061864768559482">Іздеу жүйесі</translation> <translation id="1513352483775369820">Бетбелгілер мен веб-журнал</translation> +<translation id="1513814250881909472">Басқа құрылғылардағы қойындыларды алу үшін синхрондаңыз.</translation> <translation id="1513858653616922153">Құпия сөзді жою</translation> <translation id="1518421282666914498">Эмоциялық GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Бүгін белсенді болды</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Жалғастыру үшін <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> аты-жөніңізді, электрондық мекенжайыңызды және профиль суретіңізді осы сайтпен бөліседі. Бұл сайттың <ph name="BEGIN_LINK1" />Құпиялылық саясатын<ph name="END_LINK1" /> көріңіз.</translation> <translation id="2000419248597011803">Мекенжай жолағына және іздеу өрісіне енгізілген сұрауларды, сонымен қатар кейбір cookie файлдарын әдепкі іздеу жүйесіне жібереді</translation> <translation id="200114059308480249">Google іздеу сұрауларында көбірек мәтін қамтылсын ба?</translation> +<translation id="2011996512573319870">Google-дан ең өзекті мазмұнды алу үшін синхрондаңыз.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# файл}other{# файл}}</translation> <translation id="2020309681647789787">Синхрондалған құрылғыларыңыздың барлығында жеке тарихыңыз болады, сондықтан істеген ісіңізді жалғастыра аласыз.</translation> <translation id="2021896219286479412">Толық экран режимін басқару</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Қазіргі</translation> <translation id="2472163211318554013">Chrome-ды толық қолдану үшін аккаунтқа кіріңіз.</translation> <translation id="247737702124049222">Кескін сипаттамалары қосулы.</translation> +<translation id="2481251096908459228">Сізге арналған жаңалықтарды көріңіз</translation> <translation id="2482878487686419369">Хабарландырулар</translation> <translation id="2485422356828889247">Жою</translation> <translation id="2494974097748878569">Chrome браузеріндегі Google Assistant</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# аудиофайл}other{# аудиофайл}}</translation> <translation id="265156376773362237">Стандартты алдын ала жүктеу</translation> <translation id="2656405586795711023">Веб-қолданбалар</translation> +<translation id="2700802943130197326">Құпия сөздерді, бетбелгілерді және т.б. деректерді барлық басқа құрылғыда алу үшін синхрондаңыз.</translation> <translation id="2702516483241149200">Жаңа: осы мәтінге бағыттайтын сілтемені бөлісу</translation> <translation id="2704606927547763573">Көшірілген</translation> <translation id="2707726405694321444">Бетті жаңарту</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Бөлісу опцияларының тізімі бүкіл экранға жайылды.</translation> <translation id="4165986682804962316">Сайт параметрлері</translation> <translation id="4170011742729630528">Қызмет қолжетімді емес, әрекетті кейінірек қайталаңыз.</translation> +<translation id="4177222230309051052">Барлық бетбелгіні алыңыз</translation> <translation id="4181841719683918333">Тілдер</translation> <translation id="4195643157523330669">Жаңа қойындыда ашу</translation> <translation id="4196597275619698563">Карта жасау</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Бет табылмады. Емлені тексеріңіз немесе интернеттен іздеп көріңіз.</translation> <translation id="4988526792673242964">Беттер</translation> <translation id="5001388021414335527">Сайтқа осында жазылу</translation> +<translation id="500351648694011114">Браузерді пайдалануды оңайлатыңыз</translation> <translation id="5004416275253351869">Google әрекеттерді басқару элементтері</translation> <translation id="5005141133360250920">Эмоция жойылды.</translation> <translation id="5005498671520578047">Құпия сөзді көшіру</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Басқа мазмұн жүктеп алынуда...</translation> <translation id="5865733239029070421">Қолданыс статистикасын және жаңылыс туралы есептерді Google жүйесіне автоматты түрде жібереді</translation> <translation id="5869522115854928033">Сақталған құпия сөздер</translation> +<translation id="5869789175361934029">Басқа құрылғыдан жалғастыру</translation> <translation id="587735546353481577">Сайтқа жазылу үшін оған өтіңіз де, Chrome мәзірін ашып, "Жазылу" түймесін түртіңіз.</translation> <translation id="5880748256563468367">Фидке өту</translation> <translation id="5884076754568147479">Жұмыстарыңызға көмектесу үшін Assistant қызметі қолданылған сайттардың URL мекенжайлары және мазмұны, сонымен қатар Assistant арқылы жіберілген ақпарат Google-ға жіберіледі.</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Бөлісу…</translation> <translation id="8912362522468806198">Google аккаунты</translation> <translation id="8920114477895755567">Ата-аналар туралы толық ақпаратты қажет.</translation> +<translation id="8921980840204105660">Басқа құрылғылардағы бетбелгілерді алу үшін синхрондаңыз.</translation> <translation id="8922289737868596582">Беттерді офлайн пайдалану үшін оларды "Қосымша опциялар" түймесі арқылы жүктеп алыңыз</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> дайын.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb index 14f6ca9..88b15e5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">ನೀವು <ph name="SITE_NAME" /> ಅನ್ನು ಅನುಸರಿಸುತ್ತಿದ್ದೀರಿ</translation> <translation id="1506061864768559482">ಹುಡುಕಾಟ ಇಂಜಿನ್</translation> <translation id="1513352483775369820">ಬುಕ್ಮಾರ್ಕ್ಗಳು ಮತ್ತು ವೆಬ್ ಇತಿಹಾಸ</translation> +<translation id="1513814250881909472">ನಿಮ್ಮ ಇತರ ಸಾಧನಗಳಿಂದ ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳನ್ನು ಪಡೆಯಲು ಸಿಂಕ್ ಮಾಡಿ</translation> <translation id="1513858653616922153">ಪಾಸ್ವರ್ಡ್ ಅಳಿಸಿ</translation> <translation id="1518421282666914498">ಭಾವುಕತೆ GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">ಇಂದು ಸಕ್ರಿಯ</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">ಮುಂದುವರಿಸಲು, ಈ ಸೈಟ್ನ ಜೊತೆಗೆ <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ನಿಮ್ಮ ಹೆಸರು, ಇಮೇಲ್ ವಿಳಾಸ ಮತ್ತು ಪ್ರೊಫೈಲ್ ಚಿತ್ರವನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತದೆ. ಈ ಸೈಟ್ನ <ph name="BEGIN_LINK1" />ಗೌಪ್ಯತೆ ನೀತಿಯನ್ನು<ph name="END_LINK1" /> ನೋಡಿ.</translation> <translation id="2000419248597011803">ಕೆಲವು ಕುಕೀಗಳನ್ನು ಹಾಗೂ ವಿಳಾಸ ಪಟ್ಟಿ ಮತ್ತು ಹುಡುಕಾಟ ಬಾಕ್ಸ್ನಿಂದ ಹುಡುಕಾಟಗಳನ್ನು, ನಿಮ್ಮ ಡಿಫಾಲ್ಟ್ ಹುಡುಕಾಟದ ಎಂಜಿನ್ಗೆ ಕಳುಹಿಸುತ್ತದೆ</translation> <translation id="200114059308480249">Google ಹುಡುಕಾಟಗಳಲ್ಲಿ ಸುತ್ತಮುತ್ತಲಿನ ಪಠ್ಯವನ್ನು ಸೇರಿಸಬೇಕೇ?</translation> +<translation id="2011996512573319870">Google ನಿಂದ ಹೆಚ್ಚು ಸಂಬಂಧಿತ ವಿಷಯವನ್ನು ಪಡೆಯಲು ಸಿಂಕ್ ಮಾಡಿ</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ಫೈಲ್}one{# ಫೈಲ್ಗಳು}other{# ಫೈಲ್ಗಳು}}</translation> <translation id="2020309681647789787">ನಿಮ್ಮ ಎಲ್ಲಾ ಸಿಂಕ್ ಮಾಡಿದ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಇತಿಹಾಸ ಲಭ್ಯವಿರುತ್ತದೆ, ಇದರಿಂದ ನೀವು ಮಾಡುತ್ತಿದ್ದ ಕೆಲಸವನ್ನು ನೀವು ಮುಂದುವರಿಸಬಹುದು</translation> <translation id="2021896219286479412">ಪೂರ್ಣ ಪರದೆ ಸೈಟ್ ನಿಯಂತ್ರಣಗಳು</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">ಪ್ರಸ್ತುತ</translation> <translation id="2472163211318554013">Chrome ನಿಂದ ಹೆಚ್ಚಿನದನ್ನು ಪಡೆಯಲು ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="247737702124049222">ಚಿತ್ರ ವಿವರಣೆಗಳು ಆನ್ ಆಗಿವೆ</translation> +<translation id="2481251096908459228">ನಿಮಗಾಗಿ ಸುದ್ದಿಗಳನ್ನು ನೋಡಿ</translation> <translation id="2482878487686419369">ಸೂಚನೆಗಳು</translation> <translation id="2485422356828889247">ಅನ್ಇನ್ಸ್ಟಾಲ್</translation> <translation id="2494974097748878569">Chrome ನಲ್ಲಿನ Google Assistant</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ಆಡಿಯೋ ಫೈಲ್}one{# ಆಡಿಯೋ ಫೈಲ್ಗಳು}other{# ಆಡಿಯೋ ಫೈಲ್ಗಳು}}</translation> <translation id="265156376773362237">ಪ್ರಮಾಣಿತ ಮುಂಚಿತ ಲೋಡ್ ಮಾಡುವಿಕೆ</translation> <translation id="2656405586795711023">ವೆಬ್ ಆ್ಯಪ್ಗಳು</translation> +<translation id="2700802943130197326">ನಿಮ್ಮ ಎಲ್ಲಾ ಇತರ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳು, ಬುಕ್ಮಾರ್ಕ್ಗಳು ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ಪಡೆಯಲು ಸಿಂಕ್ ಮಾಡಿ.</translation> <translation id="2702516483241149200">ಹೊಸ ವೈಶಿಷ್ಟ್ಯ: ಈ ಪಠ್ಯಕ್ಕೆ ಸ್ಕ್ರಾಲ್ ಆಗುವ ಲಿಂಕ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಿ</translation> <translation id="2704606927547763573">ನಕಲಿಸಲಾಗಿದೆ</translation> <translation id="2707726405694321444">ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">ಹಂಚಿಕೊಳ್ಳುವ ಆಯ್ಕೆಗಳ ಪಟ್ಟಿಯನ್ನು ಸ್ಕ್ರೀನ್ನ ಪೂರ್ಣ ಎತ್ತರದಲ್ಲಿ ತೆರೆಯಲಾಗಿದೆ.</translation> <translation id="4165986682804962316">ಸೈಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="4170011742729630528">ಈ ಸೇವೆಯು ಲಭ್ಯವಿಲ್ಲ; ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> +<translation id="4177222230309051052">ನಿಮ್ಮ ಎಲ್ಲಾ ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ಪಡೆಯಿರಿ</translation> <translation id="4181841719683918333">ಭಾಷೆಗಳು</translation> <translation id="4195643157523330669">ಹೊಸ ಟ್ಯಾಬ್ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation> <translation id="4196597275619698563">ಕಾರ್ಡ್ ರಚಿಸಿ</translation> @@ -723,6 +728,7 @@ <translation id="4987271110129728827">ಆ ಪುಟ ಕಂಡುಬರುತ್ತಿಲ್ಲ. ನಿಮ್ಮ ಕಾಗುಣಿತವನ್ನು ಪರಿಶೀಲಿಸಿ ಅಥವಾ ವೆಬ್ನಲ್ಲಿ ಹುಡುಕಿ ನೋಡಿ.</translation> <translation id="4988526792673242964">ಪುಟಗಳು</translation> <translation id="5001388021414335527">ಇಲ್ಲಿ ಈ ಸೈಟ್ ಅನ್ನು ಫಾಲೋ ಮಾಡಿ</translation> +<translation id="500351648694011114">ಹೆಚ್ಚು ಸುಲಭವಾಗಿ ಬ್ರೌಸ್ ಮಾಡಿ</translation> <translation id="5004416275253351869">Google ಚಟುವಟಿಕೆ ನಿಯಂತ್ರಣಗಳು</translation> <translation id="5005141133360250920">ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಅಳಿಸಲಾಗಿದೆ</translation> <translation id="5005498671520578047">ಪಾಸ್ವರ್ಡ್ ನಕಲಿಸಿ</translation> @@ -874,6 +880,7 @@ <translation id="5864419784173784555">ಇನ್ನೊಂದು ಡೌನ್ಲೋಡ್ಗಾಗಿ ಕಾಯಲಾಗುತ್ತಿದೆ…</translation> <translation id="5865733239029070421">ಬಳಕೆಯ ಅಂಕಿಅಂಶಗಳು ಮತ್ತು ಕ್ರ್ಯಾಶ್ ವರದಿಗಳನ್ನು Google ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುತ್ತದೆ</translation> <translation id="5869522115854928033">ಉಳಿಸಲಾದ ಪಾಸ್ವರ್ಡ್ಗಳು</translation> +<translation id="5869789175361934029">ಬೇರೆ ಸಾಧನದಿಂದ ಮುಂದುವರಿಸಿ</translation> <translation id="587735546353481577">ಸೈಟ್ ಅನ್ನು ಫಾಲೋ ಮಾಡಲು, ಸೈಟ್ಗೆ ಹೋಗಿ, Chrome ಮೆನುವನ್ನು ತೆರೆಯಿರಿ, ಹಾಗೂ ಫಾಲೋ ಮಾಡಿ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ.</translation> <translation id="5880748256563468367">ಫೀಡ್ಗೆ ಹೋಗಿ</translation> <translation id="5884076754568147479">ಕಾರ್ಯಗಳನ್ನು ಪೂರ್ಣಗೊಳಿಸುವುದಕ್ಕೆ ನಿಮಗೆ ಸಹಾಯ ಮಾಡಲು, ನೀವು Assistant ಅನ್ನು ಬಳಸಿದ ಸೈಟ್ಗಳ URL ಗಳು ಮತ್ತು ವಿಷಯಗಳು ಹಾಗೂ Assistant ಮೂಲಕ ನೀವು ಸಲ್ಲಿಸಿದ ಮಾಹಿತಿಯನ್ನು Google ಸ್ವೀಕರಿಸುತ್ತದೆ</translation> @@ -1447,6 +1454,7 @@ <translation id="8909135823018751308">ಹಂಚಿಕೊಳ್ಳು...</translation> <translation id="8912362522468806198">Google ಖಾತೆ</translation> <translation id="8920114477895755567">ಪೋಷಕರ ವಿವರಗಳಿಗಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ.</translation> +<translation id="8921980840204105660">ನಿಮ್ಮ ಇತರ ಸಾಧನಗಳಿಂದ ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ಪಡೆಯಲು ಸಿಂಕ್ ಮಾಡಿ</translation> <translation id="8922289737868596582">ಪುಟಗಳನ್ನು ಆಫ್ಲೈನ್ನಲ್ಲಿ ಬಳಸಲು ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳ ಬಟನ್ ಮೂಲಕ ಡೌನ್ಲೋಡ್ ಮಾಡಿ</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> ಸಿದ್ಧವಾಗಿದೆ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index df8b527..5ba3a947 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">ທ່ານກຳລັງຕິດຕາມ <ph name="SITE_NAME" /> ຢູ່</translation> <translation id="1506061864768559482">ເຄື່ອງຈັກຄົ້ນຫາ</translation> <translation id="1513352483775369820">ບຸກມາກສ໌ ແລະປະຫວັດເວັບ</translation> +<translation id="1513814250881909472">ຊິ້ງຂໍ້ມູນເພື່ອໃຊ້ແຖບຂອງທ່ານຈາກອຸປະກອນອື່ນຂອງທ່ານ</translation> <translation id="1513858653616922153">ລຶບລະຫັດຜ່ານ</translation> <translation id="1518421282666914498">GIF ອີໂມຊັນ <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">ເປີດນຳໃຊ້ມື້ນີ້</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">ເພື່ອສືບຕໍ່, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ຈະແບ່ງປັນຊື່, ທີ່ຢູ່ອີເມວ ແລະ ຮູບໂປຣໄຟລ໌ຂອງທ່ານໃຫ້ກັບເວັບໄຊນີ້. ເບິ່ງ <ph name="BEGIN_LINK1" />ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ<ph name="END_LINK1" /> ຂອງເວັບໄຊນີ້.</translation> <translation id="2000419248597011803">ສົ່ງບາງຄຸກກີ້ ແລະ ການຊອກຫາຈາກແຖບທີ່ຢູ່ ແລະ ກ່ອງຊອກຫາໄປໃຫ້ໂປຣແກຣມຊອກຫາເລີ່ມຕົ້ນຂອງທ່ານ</translation> <translation id="200114059308480249">ຮວມຂໍ້ຄວາມທີ່ຢູ່ອ້ອມຂ້າງໃນການຊອກຫາ Google ບໍ?</translation> +<translation id="2011996512573319870">ຊິ້ງຂໍ້ມູນເພື່ອອ່ານເນື້ອຫາທີ່ກ່ຽວຂ້ອງທີ່ສຸດຈາກ Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ໄຟລ໌}other{# ໄຟລ໌}}</translation> <translation id="2020309681647789787">ທ່ານຈະສາມາດໃຊ້ປະຫວັດຂອງທ່ານໄດ້ຢູ່ອຸປະກອນທີ່ຊິ້ງຂໍ້ມູນແລ້ວທັງໝົດຂອງທ່ານ, ເພື່ອໃຫ້ທ່ານສາມາດສືບຕໍ່ສິ່ງທີ່ທ່ານກຳລັງເຮັດໄດ້</translation> <translation id="2021896219286479412">ການຄວບຄຸມເວັບໄຊແບບເຕັມຈໍ</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">ປັດຈຸບັນ</translation> <translation id="2472163211318554013">ເຂົ້າສູ່ລະບົບເພື່ອໃຊ້ປະໂຫຍດສູງສຸດຈາກ Chrome</translation> <translation id="247737702124049222">ຄຳອະທິບາຍຮູບພາບເປີດຢູ່</translation> +<translation id="2481251096908459228">ອ່ານເນື້ອຫາສຳລັບທ່ານ</translation> <translation id="2482878487686419369">ການແຈ້ງເຕືອນ</translation> <translation id="2485422356828889247">ຖອນຕິດຕັ້ງ</translation> <translation id="2494974097748878569">ຜູ້ຊ່ວຍ Google ໃນ Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ໄຟລ໌ສຽງ}other{# ໄຟລ໌ສຽງ}}</translation> <translation id="265156376773362237">ການໂຫຼດກ່ອນລ່ວງໜ້າແບບມາດຕະຖານ</translation> <translation id="2656405586795711023">ເວັບແອັບ</translation> +<translation id="2700802943130197326">ຊິ້ງຂໍ້ມູນເພື່ອໃຊ້ລະຫັດຜ່ານ, ບຸກມາກ ແລະ ອື່ນໆຂອງທ່ານຢູ່ອຸປະກອນອື່ນຂອງທ່ານທັງໝົດ.</translation> <translation id="2702516483241149200">ໃໝ່: ແບ່ງປັນລິ້ງທີ່ເລື່ອນຫາຂໍ້ຄວາມນີ້</translation> <translation id="2704606927547763573">ອັດສຳເນົາແລ້ວ</translation> <translation id="2707726405694321444">ຣີເຟຣຊຫນ້າ</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">ລາຍຊື່ຂອງຕົວເລືອກການແບ່ງປັນແບບຄວາມສູງແບບເຕັມ.</translation> <translation id="4165986682804962316">ການຕັ້ງຄ່າເວັບໄຊທ໌</translation> <translation id="4170011742729630528">ບໍ່ມີການບໍລິການໃຫ້ຢູ່, ລອງໃໝ່ອີກພາຍຫຼັງ.</translation> +<translation id="4177222230309051052">ໃຊ້ບຸກມາກຂອງທ່ານທັງໝົດ</translation> <translation id="4181841719683918333">ພາສາ</translation> <translation id="4195643157523330669">ເປີດຢູ່ໃນແຖບໃໝ່</translation> <translation id="4196597275619698563">ສ້າງບັດ</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">ບໍ່ສາມາດຊອກເຫັນໜ້ານັ້ນໄດ້. ກະລຸນາກວດສອບການສະກົດຄຳຂອງທ່ານ ຫຼື ລອງຊອກຫາໃນເວັບໄຊ.</translation> <translation id="4988526792673242964">ໜ້າ</translation> <translation id="5001388021414335527">ຕິດຕາມເວັບໄຊນີ້ຢູ່ບ່ອນນີ້</translation> +<translation id="500351648694011114">ທ່ອງເວັບໄດ້ງ່າຍຂຶ້ນ</translation> <translation id="5004416275253351869">ການຄວບຄຸມການເຄື່ອນໄຫວໃນ Google</translation> <translation id="5005141133360250920">ລຶບຣີແອັກຊັນແລ້ວ</translation> <translation id="5005498671520578047">ອັດສຳເນົາລະຫັດຜ່ານ</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">ກຳລັງລໍຖ້າການດາວໂຫຼດອື່ນຢູ່...</translation> <translation id="5865733239029070421">ສົ່ງສະຖິຕິການໃຊ້ ແລະ ລາຍງານການຂັດຂ້ອງໃຫ້ Google ໂດຍອັດຕະໂນມັດ</translation> <translation id="5869522115854928033">ລະຫັດຜ່ານທີ່ບັນທຶກໄວ້</translation> +<translation id="5869789175361934029">ສືບຕໍ່ຈາກອຸປະກອນອື່ນ</translation> <translation id="587735546353481577">ເພື່ອຕິດຕາມເວັບໄຊໃດໜຶ່ງ, ໃຫ້ເຂົ້າໄປຫາເວັບໄຊນັ້ນ, ເປີດເມນູ Chrome ແລ້ວແຕະໃສ່ຕິດຕາມ.</translation> <translation id="5880748256563468367">ໄປຫາຟີດ</translation> <translation id="5884076754568147479">ເພື່ອຊ່ວຍທ່ານເຮັດສຳເລັດໜ້າວຽກ, Google ຈະໄດ້ຮັບ URL ແລະ ເນື້ອຫາຂອງເວັບໄຊທີ່ທ່ານໃຊ້ຜູ້ຊ່ວຍ, ພ້ອມກັບຂໍ້ມູນທີ່ທ່ານສົ່ງຜ່ານຜູ້ຊ່ວຍ</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">ແຊຣ໌...</translation> <translation id="8912362522468806198">ບັນຊີ Google</translation> <translation id="8920114477895755567">ກຳລັງລໍຖ້າລາຍລະອຽດຂອງພໍ່ແມ່.</translation> +<translation id="8921980840204105660">ຊິ້ງຂໍ້ມູນເພື່ອໃຊ້ບຸກມາກຂອງທ່ານຈາກອຸປະກອນອື່ນຂອງທ່ານ</translation> <translation id="8922289737868596582">ດາວໂຫຼດໜ້າເວັບຕ່າງໆຈາກປຸ່ມຕົວເລືອກເພີ່ມເຕີມເພື່ອໃຊ້ພວກມັນແບບອອບລາຍ</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> ພ້ອມແລ້ວ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index 1c7ab1d..abaddb7f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Stebite „<ph name="SITE_NAME" />“</translation> <translation id="1506061864768559482">Paieškos variklis</translation> <translation id="1513352483775369820">Žymių ir žiniatinklio istorija</translation> +<translation id="1513814250881909472">Sinchronizuokite, kad gautumėte skirtukus iš kitų įrenginių</translation> <translation id="1513858653616922153">Ištrinti slaptažodį</translation> <translation id="1518421282666914498">Emocijos GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktyvus šiandien</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Kad būtų galima tęsti, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> bendrins jūsų vardą ir pavardę, el. pašto adresą, adresą ir profilio nuotrauką su šia svetaine. Žr. šios svetainės <ph name="BEGIN_LINK1" />privatumo politiką<ph name="END_LINK1" />.</translation> <translation id="2000419248597011803">Numatytajam paieškos varikliui siunčiami kai kurie slapukai ir į adreso juostą bei paieškos laukelį įvestos paieškos</translation> <translation id="200114059308480249">Įtraukti aplinkinį tekstą į „Google“ paieškas?</translation> +<translation id="2011996512573319870">Sinchronizuokite, kad gautumėte aktualiausią turinį iš „Google“</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# failas}one{# failas}few{# failai}many{# failo}other{# failų}}</translation> <translation id="2020309681647789787">Istorija bus rodoma visuose sinchronizuojamuose įrenginiuose, todėl galėsite tęsti tai, ką darėte</translation> <translation id="2021896219286479412">Viso ekrano svetainės valdikliai</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Dabartinė</translation> <translation id="2472163211318554013">Prisijunkite, kad išnaudotumėte visas „Chrome“ galimybes</translation> <translation id="247737702124049222">Vaizdų aprašai įjungti</translation> +<translation id="2481251096908459228">Žr. jums skirtas istorijas</translation> <translation id="2482878487686419369">Pranešimai</translation> <translation id="2485422356828889247">Pašalinti</translation> <translation id="2494974097748878569">„Google Assistant“ sistemoje</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# garso įrašo failas}one{# garso įrašo failas}few{# garso įrašo failai}many{# garso įrašo failo}other{# garso įrašo failų}}</translation> <translation id="265156376773362237">Įprastas išankstinis įkėlimas</translation> <translation id="2656405586795711023">Žiniatinklio programos</translation> +<translation id="2700802943130197326">Sinchronizuokite, kad gautumėte slaptažodžius, žymes ir kitą turinį visuose kituose įrenginiuose.</translation> <translation id="2702516483241149200">Naujiena: bendrinkite nuorodą, kuria galima slinkti į šį tekstą</translation> <translation id="2704606927547763573">Nukopij.</translation> <translation id="2707726405694321444">Atnaujinti puslapį</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Bendrinimo parinkčių sąrašas per visą ekrano aukštį.</translation> <translation id="4165986682804962316">Svetainės nustatymai</translation> <translation id="4170011742729630528">Paslauga nepasiekiama; vėliau bandykite dar kartą.</translation> +<translation id="4177222230309051052">Gaukite visas žymes</translation> <translation id="4181841719683918333">Kalbos</translation> <translation id="4195643157523330669">Atidaryti naujame skirtuke</translation> <translation id="4196597275619698563">Sukurti kortelę</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Nepavyko rasti šio puslapio. Patikrinkite rašybą arba pabandykite naudoti žiniatinklio paiešką.</translation> <translation id="4988526792673242964">Psl.</translation> <translation id="5001388021414335527">Stebėkite šią svetainę čia</translation> +<translation id="500351648694011114">Naršykite lengviau</translation> <translation id="5004416275253351869">„Google“ veiklos valdikliai</translation> <translation id="5005141133360250920">Reakcija ištrinta</translation> <translation id="5005498671520578047">Kopijuoti slaptažodį</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Laukiama kito atsisiuntimo…</translation> <translation id="5865733239029070421">Automatiškai siunčia naudojimo statistiką ir strigčių ataskaitas „Google“</translation> <translation id="5869522115854928033">Išsaugoti slaptažodžiai</translation> +<translation id="5869789175361934029">Tęsti kitu įrenginiu</translation> <translation id="587735546353481577">Jei norite stebėti svetainę, eikite į svetainę, atidarykite „Chrome“ meniu ir palieskite „Stebėti“.</translation> <translation id="5880748256563468367">Eiti į sklaidos kanalą</translation> <translation id="5884076754568147479">Kad padėtų atlikti užduotis, „Google“ gaus svetainių, kuriose naudojate Padėjėją, URL ir turinį bei informaciją, kurią pateikiate naudodami Padėjėją.</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Bendrinti…</translation> <translation id="8912362522468806198">„Google“ paskyra</translation> <translation id="8920114477895755567">Laukiama išsamios tėvų informacijos.</translation> +<translation id="8921980840204105660">Sinchronizuokite, kad gautumėte žymes iš kitų įrenginių</translation> <translation id="8922289737868596582">Atsisiųskite puslapius spustelėję mygtuką „Daugiau parinkčių“, kad galėtumėte naudoti juos neprisijungę</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> paruošta naudoti</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb index 89fb21de..d2cc8879 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -83,6 +83,7 @@ <translation id="1383876407941801731">Search</translation> <translation id="1384704387250346179">Google Lens-ൽ ചിത്രം വിവർത്തനം ചെയ്യൂ <ph name="BEGIN_NEW" />പുതിയത്<ph name="END_NEW" /></translation> <translation id="1386674309198842382"><ph name="LAST_UPDATED" /> ദിവസം മുമ്പ് സജീവമായിരുന്നു</translation> +<translation id="13931502444227376">തുടരാൻ, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> നിങ്ങളുടെ പേരും ഇമെയിൽ വിലാസവും പ്രൊഫൈൽ ചിത്രവും ഈ സൈറ്റുമായി പങ്കിടും. ഈ സൈറ്റിന്റെ <ph name="BEGIN_LINK1" />സേവന നിബന്ധനകൾ<ph name="END_LINK1" /> കാണുക.</translation> <translation id="1397811292916898096"><ph name="PRODUCT_NAME" /> ഉപയോഗിച്ച് തിരയുക</translation> <translation id="139993653570221430">Chrome ക്രമീകരണത്തിൽ നിങ്ങൾക്ക് എപ്പോൾ വേണമെങ്കിലും നിങ്ങളുടെ തീരുമാനം മാറ്റാനാകും. ട്രയലുകൾ റൺ ചെയ്യുന്നത് നിലവിൽ പരസ്യങ്ങൾ നൽകുന്ന രീതിക്കൊപ്പം ആയതിനാൽ, നിങ്ങൾ ഉടൻ മാറ്റങ്ങളൊന്നും കാണില്ല.</translation> <translation id="1406000523432664303">“ട്രാക്ക് ചെയ്യരുത്”</translation> @@ -145,6 +146,7 @@ <translation id="173522743738009831">സ്വകാര്യതാ സാൻഡ്ബോക്സിനെ കുറിച്ച്</translation> <translation id="1736419249208073774">അടുത്തറിയുക</translation> <translation id="1749561566933687563">നിങ്ങളുടെ ബുക്ക്മാർക്കുകൾ സമന്വയിപ്പിക്കുക</translation> +<translation id="1750259112639922169">ടാബ് ഗ്രൂപ്പ് - <ph name="TAB_COUNT" /> ടാബുകൾ</translation> <translation id="17513872634828108">ഓപ്പൺ ടാബുകൾ</translation> <translation id="1754404134430936718">ടെക്സ്റ്റ് പകർത്തി</translation> <translation id="1779766957982586368">വിന്ഡോ അടയ്ക്കുക</translation> @@ -788,6 +790,7 @@ <translation id="5368227114232678694">ഈ ഉപകരണത്തിൽ സ്വകാര്യമായി ബ്രൗസ് ചെയ്യാൻ, അദൃശ്യ മോഡ് പരീക്ഷിക്കൂ</translation> <translation id="5375577065097716013">Google Lens-ലൂടെ ചിത്രം തിരയൂ <ph name="BEGIN_NEW" />പുതിയവ<ph name="END_NEW" /></translation> <translation id="5376898820269806588">പ്രതികരണം മാറ്റി</translation> +<translation id="5401851137404501592">തുടരാൻ, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> നിങ്ങളുടെ പേരും ഇമെയിൽ വിലാസവും പ്രൊഫൈൽ ചിത്രവും ഈ സൈറ്റുമായി പങ്കിടും.</translation> <translation id="5403644198645076998">ചില സൈറ്റുകളെ മാത്രം അനുവദിക്കുക</translation> <translation id="5409881200985013443"><ph name="CLIENT_NAME" /> എന്നതിൽ <ph name="ONE_TIME_CODE" /> നൽകണോ?</translation> <translation id="5414836363063783498">പരിശോധിച്ചുറപ്പിക്കുന്നു...</translation> @@ -1128,6 +1131,7 @@ <translation id="7177873915659574692">QR കോഡ് സൃഷ്ടിക്കാനാകുന്നില്ല. URL-ൽ <ph name="CHARACTER_LIMIT" /> പ്രതീകങ്ങളിൽ കൂടുതൽ അടങ്ങിയിരിക്കുന്നു.</translation> <translation id="7177959540995930968">Chrome ക്രമീകരണത്തിൽ നിങ്ങൾക്ക് ഈ ഫീച്ചറുകളെ കുറിച്ച് കൂടുതലറിയാനാകും.</translation> <translation id="718226107353899806">നിങ്ങൾക്ക് <ph name="MAX_NUM_REACTIONS" /> പ്രതികരണങ്ങൾ വരെ ചേർക്കാനാകും</translation> +<translation id="7183693674623539380">ടാബ് ഗ്രൂപ്പ് - <ph name="TITLE_OF_GROUP" /></translation> <translation id="7187993566681480880">നിങ്ങൾ സൈൻ ഇൻ ആയിരിക്കുമ്പോൾ Chrome-ൽ നിങ്ങളെ സുരക്ഷിതരാക്കുകയും മറ്റ് Google ആപ്പുകളിൽ നിങ്ങളുടെ സുരക്ഷ മെച്ചപ്പെടുത്താൻ ഉപയോഗിക്കുകയും ചെയ്യും.</translation> <translation id="7191430249889272776">ടാബ് പശ്ചാത്തലത്തിൽ തുറന്നു.</translation> <translation id="7196215469483532480">സ്വകാര്യതാ ഗൈഡിന്റെ വിശദീകരണം മുഴുവൻ ഉയരത്തിൽ തുറന്നു</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index f90378eac..8f7129520 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -83,6 +83,7 @@ <translation id="1383876407941801731">Хайлт</translation> <translation id="1384704387250346179">Google Lens-р зураг орчуул <ph name="BEGIN_NEW" />Шинэ<ph name="END_NEW" /></translation> <translation id="1386674309198842382"><ph name="LAST_UPDATED" /> өдрийн өмнөөс идэвхтэй</translation> +<translation id="13931502444227376">Үргэлжүүлэхийн тулд <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> таны нэр, имэйл хаяг болон профайл зургийг энэ сайттай хуваалцана. Энэ сайтын <ph name="BEGIN_LINK1" />үйлчилгээний нөхцөлийг<ph name="END_LINK1" /> харна уу.</translation> <translation id="1397811292916898096"><ph name="PRODUCT_NAME" />-р хайх</translation> <translation id="139993653570221430">Та Chrome-н тохиргоо хэсэгт хүссэн үедээ бодлоо өөрчлөх боломжтой. Туршилтын хугацаа нь зарыг хүргэдэг одоогийн аргын хамт үргэлжлэх бөгөөд ингэснээр та өөрчлөлтүүдийг тэр даруй харахгүй.</translation> <translation id="1406000523432664303">“Бүү дага”</translation> @@ -145,6 +146,7 @@ <translation id="173522743738009831">Privacy Sandbox-н тухай</translation> <translation id="1736419249208073774">Судлах</translation> <translation id="1749561566933687563">Хавчуургаа синхрончлоорой</translation> +<translation id="1750259112639922169">Табын бүлэг - <ph name="TAB_COUNT" /> таб</translation> <translation id="17513872634828108">Нээлттэй цонх</translation> <translation id="1754404134430936718">Текстийг хуулсан</translation> <translation id="1779766957982586368">Цонхыг хаах</translation> @@ -171,6 +173,7 @@ <translation id="1928696683969751773">Шинэчлэл</translation> <translation id="19288952978244135">Chrome-г дахин нээнэ үү.</translation> <translation id="1933845786846280168">Сонгосон таб</translation> +<translation id="193571872656840963">Энэ зохиогчид талархлаа илэрхийлнэ үү</translation> <translation id="1943432128510653496">Нууц үг хадгалах</translation> <translation id="1952172573699511566">Вебсайт текстийг таны сонгосон хэлээр (хэрэв тухайн хэл боломжтой бол) харуулна.</translation> <translation id="1959679933317802873">Контентыг хүлээж байна</translation> @@ -787,6 +790,7 @@ <translation id="5368227114232678694">Энэ төхөөрөмж дээр нууцлалтайгаар үзэхийн тулд Нууцлалтай горимыг туршина уу</translation> <translation id="5375577065097716013">Google Lens-р зураг хайх <ph name="BEGIN_NEW" />Шинэ<ph name="END_NEW" /></translation> <translation id="5376898820269806588">Хариу үйлдлийг өөрчилсөн</translation> +<translation id="5401851137404501592">Үргэлжүүлэхийн тулд <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> таны нэр, имэйл хаяг болон профайл зургийг энэ сайттай хуваалцана.</translation> <translation id="5403644198645076998">Зөвхөн тодорхой сайтыг зөвшөөрөх</translation> <translation id="5409881200985013443"><ph name="CLIENT_NAME" /> дээр <ph name="ONE_TIME_CODE" />-г илгээх үү?</translation> <translation id="5414836363063783498">Баталгаажуулж байна ...</translation> @@ -1127,6 +1131,7 @@ <translation id="7177873915659574692">QR код үүсгэх боломжгүй. URL <ph name="CHARACTER_LIMIT" />-с олон тэмдэгттэй байна.</translation> <translation id="7177959540995930968">Та эдгээр онцлогийн талаар Chrome-н тохиргоо хэсгээс нэмэлт мэдээлэл авах боломжтой.</translation> <translation id="718226107353899806">Та <ph name="MAX_NUM_REACTIONS" /> хүртэлх хариу үйлдэл нэмж болно.</translation> +<translation id="7183693674623539380">Табын бүлэг - <ph name="TITLE_OF_GROUP" /></translation> <translation id="7187993566681480880">Таныг нэвтэрсэн үед Chrome дээр таны аюулгүй байдлыг хангадаг бөгөөд Google-н бусад апп дахь таны аюулгүй байдлыг сайжруулахын тулд ашиглагдах боломжтой.</translation> <translation id="7191430249889272776">Арын дэвсгэр дээр нээсэн цонх.</translation> <translation id="7196215469483532480">Нууцлалын хөтчийн тайлбарыг бүтэн хэмжээгээр нээсэн</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb index fd4668b..7a188921 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -171,6 +171,7 @@ <translation id="1928696683969751773">अपडेट</translation> <translation id="19288952978244135">Chrome पुन्हा उघडा.</translation> <translation id="1933845786846280168">निवडलेला टॅब</translation> +<translation id="193571872656840963">या निर्मात्याचे आभार माना</translation> <translation id="1943432128510653496">पासवर्ड सेव्ह करा</translation> <translation id="1952172573699511566">वेबसाइट शक्य असताना तुमच्या प्राधान्य असलेल्या भाषेमध्ये मजकूर दाखवेल.</translation> <translation id="1959679933317802873">आशयाची प्रतीक्षा करत आहे</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb index 1e16cca..c4ecc597 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Anda mengikuti <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Enjin carian</translation> <translation id="1513352483775369820">Penanda halaman dan sejarah web</translation> +<translation id="1513814250881909472">Segerakkan untuk mendapatkan tab anda daripada peranti anda yang lain</translation> <translation id="1513858653616922153">Padam kata laluan</translation> <translation id="1518421282666914498">GIF emosi <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktif hari ini</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Untuk meneruskan, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> akan berkongsi nama, alamat e-mel dan gambar profil anda dengan laman ini. Lihat <ph name="BEGIN_LINK1" />dasar privasi<ph name="END_LINK1" /> laman ini.</translation> <translation id="2000419248597011803">Menghantar beberapa kuki dan carian daripada bar alamat dan kotak carian ke enjin carian lalai anda</translation> <translation id="200114059308480249">Sertakan teks sekitar dalam carian Google?</translation> +<translation id="2011996512573319870">Segerakkan untuk mendapatkan kandungan yang paling berkaitan daripada Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# Fail}other{# Fail}}</translation> <translation id="2020309681647789787">Sejarah anda boleh didapati pada semua peranti tersegerak anda, jadi anda boleh meneruskan perkara yang sedang anda lakukan</translation> <translation id="2021896219286479412">Kawalan tapak skrin penuh</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Semasa</translation> <translation id="2472163211318554013">Log masuk untuk memanfaatkan Chrome sepenuhnya</translation> <translation id="247737702124049222">Perihalan imej dihidupkan</translation> +<translation id="2481251096908459228">Lihat cerita untuk anda</translation> <translation id="2482878487686419369">Pemberitahuan</translation> <translation id="2485422356828889247">Nyahpasang</translation> <translation id="2494974097748878569">Google Assistant dalam Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Fail audio}other{# Fail audio}}</translation> <translation id="265156376773362237">Pramuat standard</translation> <translation id="2656405586795711023">Apl web</translation> +<translation id="2700802943130197326">Segerakkan untuk mendapatkan kata laluan, penanda halaman dan pelbagai lagi pada semua peranti anda yang lain.</translation> <translation id="2702516483241149200">Baharu: kongsi pautan yang menatal ke teks ini</translation> <translation id="2704606927547763573">Disalin</translation> <translation id="2707726405694321444">Muat semula halaman</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Senarai pilihan perkongsian pada ketinggian penuh.</translation> <translation id="4165986682804962316">Tetapan tapak</translation> <translation id="4170011742729630528">Perkhidmatan tidak tersedia; cuba lagi kemudian.</translation> +<translation id="4177222230309051052">Dapatkan semua penanda halaman anda</translation> <translation id="4181841719683918333">Bahasa</translation> <translation id="4195643157523330669">Buka dalam tab baharu</translation> <translation id="4196597275619698563">Buat kad</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Tidak menemukan halaman itu. Semak ejaan anda atau cuba carian web.</translation> <translation id="4988526792673242964">Halaman</translation> <translation id="5001388021414335527">Ikuti laman ini di sini</translation> +<translation id="500351648694011114">Semak imbas dengan lebih mudah</translation> <translation id="5004416275253351869">Kawalan aktiviti Google</translation> <translation id="5005141133360250920">Reaksi dipadamkan</translation> <translation id="5005498671520578047">Salin kata laluan</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Menunggu muat turun lain…</translation> <translation id="5865733239029070421">Menghantar perangkaan penggunaan dan laporan ranap sistem secara automatik kepada Google</translation> <translation id="5869522115854928033">Kata laluan disimpan</translation> +<translation id="5869789175361934029">Teruskan daripada peranti lain</translation> <translation id="587735546353481577">Untuk mengikuti laman, pergi ke laman tersebut, buka menu Chrome dan ketik Ikut.</translation> <translation id="5880748256563468367">Pergi ke suapan</translation> <translation id="5884076754568147479">Untuk membantu anda menyelesaikan tugasan, Google akan menerima URL dan kandungan tapak tempat anda menggunakan Assistant, serta maklumat yang anda serahkan melalui Assistant</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Kongsi…</translation> <translation id="8912362522468806198">Akaun Google</translation> <translation id="8920114477895755567">Menunggu butiran ibu bapa.</translation> +<translation id="8921980840204105660">Segerakkan untuk mendapatkan penanda halaman daripada peranti anda yang lain</translation> <translation id="8922289737868596582">Muat turun halaman daripada butang Lagi pilihan untuk digunakan di luar talian</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Ketahui Lebih Lanjut<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> sudah sedia</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index f208cd5..ee3964d5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -171,6 +171,7 @@ <translation id="1928696683969751773">အဆင့်မြှင့်မှုများ</translation> <translation id="19288952978244135">Chrome ပြန်ဖွင့်ပါ။</translation> <translation id="1933845786846280168">ရွေးထားသည့်တဘ်</translation> +<translation id="193571872656840963">ဤဖန်တီးသူကို ကျေးဇူးတင်ကြောင်း ပြသလိုက်ပါ</translation> <translation id="1943432128510653496">စကားဝှက်များကို သိမ်းဆည်းပါ</translation> <translation id="1952172573699511566">ပြနိုင်သည့်အခါတွင် ဝဘ်ဆိုက်များက သင်ပိုမိုနှစ်သက်သည့် ဘာသာစကားဖြင့် စာသားများကို ပြသပါမည်။</translation> <translation id="1959679933317802873">အကြောင်းအရာကို စောင့်နေသည်</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index e8e7bdc..483d9c52 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -171,6 +171,7 @@ <translation id="1928696683969751773">अपडेटहरू</translation> <translation id="19288952978244135">Chrome पुनः खोल्नुहोस्।</translation> <translation id="1933845786846280168">चयन गरिएको ट्याब</translation> +<translation id="193571872656840963">यी निर्मातालाई धन्यवाद व्यक्त गर्नुहोस्</translation> <translation id="1943432128510653496">पासवर्डहरू संग्रह गर्नुहोस्</translation> <translation id="1952172573699511566">सम्भव भए सम्म वेबसाइटहरूले तपाईंको रुचाइएको भाषामा पाठ देखाउनेछ।</translation> <translation id="1959679933317802873">सामग्री लोड गरिँदै छ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index 38e4bb00..714900a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -171,6 +171,7 @@ <translation id="1928696683969751773">Oppdateringer</translation> <translation id="19288952978244135">Åpne Chrome på nytt.</translation> <translation id="1933845786846280168">Valgt fane</translation> +<translation id="193571872656840963">Si takk til denne skaperen</translation> <translation id="1943432128510653496">Lagring av passord</translation> <translation id="1952172573699511566">Nettsteder viser tekst på språket du foretrekker, der dette er mulig.</translation> <translation id="1959679933317802873">Venter på innhold</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index 0f8eab72..87189e2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">ਤੁਸੀਂ <ph name="SITE_NAME" /> ਦਾ ਅਨੁਸਰਣ ਕਰ ਰਹੇ ਹੋ</translation> <translation id="1506061864768559482">ਖੋਜ ਇੰਜਣ</translation> <translation id="1513352483775369820">ਬੁੱਕਮਾਰਕ ਅਤੇ ਵੈੱਬ ਇਤਿਹਾਸ</translation> +<translation id="1513814250881909472">ਆਪਣੇ ਹੋਰ ਡੀਵਾਈਸਾਂ ਤੋਂ ਆਪਣੀਆਂ ਟੈਬਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਸਿੰਕ ਕਰੋ</translation> <translation id="1513858653616922153">ਪਾਸਵਰਡ ਮਿਟਾਓ</translation> <translation id="1518421282666914498">ਭਾਵਨਾਵਾਂ ਵਾਲਾ GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">ਅੱਜ ਕਿਰਿਆਸ਼ੀਲ</translation> @@ -170,6 +171,7 @@ <translation id="1928696683969751773">ਅਪਡੇਟਾਂ</translation> <translation id="19288952978244135">Chrome ਨੂੰ ਮੁੜ-ਖੋਲ੍ਹੋ।</translation> <translation id="1933845786846280168">ਚੁਣੀ ਗਈ ਟੈਬ</translation> +<translation id="193571872656840963">ਇਸ ਰਚਨਾਕਾਰ ਦਾ ਧੰਨਵਾਦ ਕਰੋ</translation> <translation id="1943432128510653496">ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰੋ</translation> <translation id="1952172573699511566">ਜਦੋਂ ਸੰਭਵ ਹੋਵੇ, ਵੈੱਬਸਾਈਟਾਂ ਤੁਹਾਡੀ ਤਰਜੀਹੀ ਭਾਸ਼ਾ ਵਿੱਚ ਲਿਖਤ ਦਿਖਾਉਣਗੀਆਂ।</translation> <translation id="1959679933317802873">ਸਮੱਗਰੀ ਲਈ ਉਡੀਕ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation> @@ -184,6 +186,7 @@ <translation id="1995884366040846621">ਜਾਰੀ ਰੱਖਣ ਲਈ, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ਤੁਹਾਡੇ ਨਾਮ, ਈਮੇਲ ਪਤੇ ਅਤੇ ਪ੍ਰੋਫਾਈਲ ਤਸਵੀਰ ਨੂੰ ਇਸ ਸਾਈਟ ਨਾਲ ਸਾਂਝਾ ਕਰੇਗਾ। ਇਸ ਸਾਈਟ ਦੀ <ph name="BEGIN_LINK1" />ਪਰਦੇਦਾਰੀ ਨੀਤੀ<ph name="END_LINK1" /> ਦੇਖੋ।</translation> <translation id="2000419248597011803">ਪਤਾ ਬਾਰ ਅਤੇ ਖੋਜ ਬਾਕਸ ਤੋਂ ਕੁਝ ਕੁਕੀਜ਼ ਅਤੇ ਖੋਜਾਂ ਤੁਹਾਡੇ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਖੋਜ ਇੰਜਣ ਨੂੰ ਭੇਜਦੀ ਹੈ</translation> <translation id="200114059308480249">ਕੀ Google ਖੋਜਾਂ ਵਿੱਚ ਆਲੇ-ਦੁਆਲੇ ਦੀ ਲਿਖਤ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨਾ ਹੈ?</translation> +<translation id="2011996512573319870">Google ਤੋਂ ਸਭ ਤੋਂ ਢੁਕਵੀਂ ਸਮੱਗਰੀ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਸਿੰਕ ਕਰੋ</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ਫ਼ਾਈਲ}one{# ਫ਼ਾਈਲ}other{# ਫ਼ਾਈਲਾਂ}}</translation> <translation id="2020309681647789787">ਤੁਹਾਡੇ ਸਿੰਕ ਕੀਤੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਤੁਹਾਡਾ ਇਤਿਹਾਸ ਹੋਵੇਗਾ, ਤਾਂ ਜੋ ਤੁਸੀਂ ਜਿਹੜਾ ਕੰਮ ਕਰ ਰਹੇ ਸੀ, ਉਸਨੂੰ ਜਾਰੀ ਰੱਖ ਸਕੋ</translation> <translation id="2021896219286479412">ਪੂਰੀ ਸਕ੍ਰੀਨ ਦੇ ਸਾਈਟ ਕੰਟਰੋਲ</translation> @@ -267,6 +270,7 @@ <translation id="2461822463642141190">ਮੌਜੂਦਾ</translation> <translation id="2472163211318554013">Chrome ਦਾ ਵੱਧ ਤੋਂ ਵੱਧ ਲਾਹਾ ਲੈਣ ਲਈ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> <translation id="247737702124049222">ਚਿੱਤਰ ਦੇ ਵਰਣਨ ਚਾਲੂ ਹਨ</translation> +<translation id="2481251096908459228">ਆਪਣੇ ਲਈ ਕਹਾਣੀਆਂ ਦੇਖੋ</translation> <translation id="2482878487686419369">ਸੂਚਨਾਵਾਂ</translation> <translation id="2485422356828889247">ਅਣਸਥਾਪਤ ਕਰੋ</translation> <translation id="2494974097748878569">Chrome ਵਿੱਚ Google Assistant</translation> @@ -308,6 +312,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ਆਡੀਓ ਫ਼ਾਈਲ}one{# ਆਡੀਓ ਫ਼ਾਈਲ}other{# ਆਡੀਓ ਫ਼ਾਈਲਾਂ}}</translation> <translation id="265156376773362237">ਮਿਆਰੀ ਪ੍ਰੀਲੋਡਿੰਗ</translation> <translation id="2656405586795711023">ਵੈੱਬ ਐਪਾਂ</translation> +<translation id="2700802943130197326">ਆਪਣੇ ਹੋਰ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਆਪਣੇ ਪਾਸਵਰਡ, ਬੁੱਕਮਾਰਕ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਸਿੰਕ ਕਰੋ।</translation> <translation id="2702516483241149200">ਨਵਾਂ: ਇਸ ਲਿਖਤ ਤੱਕ ਸਕ੍ਰੋਲ ਕਰਨ ਵਾਲਾ ਲਿੰਕ ਸਾਂਝਾ ਕਰੋ</translation> <translation id="2704606927547763573">ਕਾਪੀ ਕੀਤਾ</translation> <translation id="2707726405694321444">ਪੰਨੇ ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation> @@ -569,6 +574,7 @@ <translation id="4162867837470729563">ਸਾਂਝਾਕਰਨ ਵਿਕਲਪਾਂ ਦੀ ਸੂਚੀ ਪੂਰੀ ਸਕ੍ਰੀਨ 'ਤੇ ਖੁੱਲ੍ਹੀ ਹੋਈ ਹੈ।</translation> <translation id="4165986682804962316">ਸਾਈਟ ਸੈਟਿੰਗਾਂ</translation> <translation id="4170011742729630528">ਸੇਵਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ; ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> +<translation id="4177222230309051052">ਆਪਣੇ ਸਾਰੇ ਬੁੱਕਮਾਰਕ ਪ੍ਰਾਪਤ ਕਰੋ</translation> <translation id="4181841719683918333">ਭਾਸ਼ਾਵਾਂ</translation> <translation id="4195643157523330669">ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਖੋਲ੍ਹੋ</translation> <translation id="4196597275619698563">ਕਾਰਡ ਬਣਾਓ</translation> @@ -724,6 +730,7 @@ <translation id="4987271110129728827">ਉਹ ਪੰਨਾ ਨਹੀਂ ਮਿਲਿਆ। ਆਪਣੇ ਸ਼ਬਦ-ਜੋੜ ਦੀ ਜਾਂਚ ਕਰੋ ਜਾਂ ਵੈੱਬ ਖੋਜ ਕਰ ਕੇ ਦੇਖੋ।</translation> <translation id="4988526792673242964">ਸਫ਼ੇ</translation> <translation id="5001388021414335527">ਇਸ ਸਾਈਟ ਦਾ ਇੱਥੇ ਅਨੁਸਰਣ ਕਰੋ</translation> +<translation id="500351648694011114">ਜ਼ਿਆਦਾ ਆਸਾਨੀ ਨਾਲ ਬ੍ਰਾਊਜ਼ ਕਰੋ</translation> <translation id="5004416275253351869">Google ਸਰਗਰਮੀ ਕੰਟਰੋਲ</translation> <translation id="5005141133360250920">ਪ੍ਰਤਿਕਿਰਿਆ ਨੂੰ ਮਿਟਾਇਆ ਗਿਆ</translation> <translation id="5005498671520578047">ਪਾਸਵਰਡ ਕਾਪੀ ਕਰੋ</translation> @@ -875,6 +882,7 @@ <translation id="5864419784173784555">ਕਿਸੇ ਹੋਰ ਡਾਊਨਲੋਡ ਵੱਲੋਂ ਨੈੱਟਵਰਕ ਦੀ ਉਡੀਕ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…</translation> <translation id="5865733239029070421">Google ਨੂੰ ਵਰਤੋਂ ਅੰਕੜੇ ਅਤੇ ਕ੍ਰੈਸ਼ ਰਿਪੋਰਟਾਂ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਭੇਜਦੀ ਹੈ</translation> <translation id="5869522115854928033">ਸੁਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡ</translation> +<translation id="5869789175361934029">ਕਿਸੇ ਹੋਰ ਡੀਵਾਈਸ ਤੋਂ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="587735546353481577">ਕਿਸੇ ਸਾਈਟ ਦਾ ਅਨੁਸਰਣ ਕਰਨ ਲਈ, ਸਾਈਟ 'ਤੇ ਜਾਓ, Chrome ਮੀਨੂ ਖੋਲ੍ਹੋ, ਅਤੇ 'ਅਨੁਸਰਣ ਕਰੋ' 'ਤੇ ਟੈਪ ਕਰੋ।</translation> <translation id="5880748256563468367">ਫ਼ੀਡ 'ਤੇ ਜਾਓ</translation> <translation id="5884076754568147479">ਕਾਰਜ ਪੂਰੇ ਕਰਨ ਵਿੱਚ ਤੁਹਾਡੀ ਮਦਦ ਕਰਨ ਲਈ, Google ਨੂੰ ਉਹਨਾਂ ਸਾਈਟਾਂ ਦੇ URL ਅਤੇ ਸਮੱਗਰੀਆਂ ਮਿਲਣਗੀਆਂ ਜਿਨ੍ਹਾਂ 'ਤੇ ਤੁਸੀਂ Assistant ਨੂੰ ਵਰਤਦੇ ਹੋ, ਨਾਲ ਹੀ ਤੁਹਾਡੇ ਵੱਲੋਂ Assistant ਰਾਹੀਂ ਸਪੁਰਦ ਕੀਤੀ ਜਾਣਕਾਰੀ ਵੀ ਮਿਲੇਗੀ</translation> @@ -1448,6 +1456,7 @@ <translation id="8909135823018751308">ਸ਼ੇਅਰ ਕਰੋ…</translation> <translation id="8912362522468806198">Google ਖਾਤਾ</translation> <translation id="8920114477895755567">ਮਾਪਿਆਂ ਦੇ ਵੇਰਵਿਆਂ ਦੀ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੈ।</translation> +<translation id="8921980840204105660">ਆਪਣੇ ਹੋਰ ਡੀਵਾਈਸਾਂ ਤੋਂ ਆਪਣੇ ਬੁੱਕਮਾਰਕ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਸਿੰਕ ਕਰੋ</translation> <translation id="8922289737868596582">ਪੰਨਿਆਂ ਨੂੰ ਆਫ਼ਲਾਈਨ ਵਰਤਣ ਲਈ ਉਹਨਾਂ ਨੂੰ 'ਹੋਰ ਵਿਕਲਪ' ਬਟਨ ਰਾਹੀਂ ਡਾਊਨਲੋਡ ਕਰੋ</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> ਤਿਆਰ ਹੈ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb index c7670eb..aebab18 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Você está seguindo o site <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Mecanismo de pesquisa</translation> <translation id="1513352483775369820">Favoritos e histórico da Web</translation> +<translation id="1513814250881909472">Sincronizar para acessar suas guias de outros dispositivos</translation> <translation id="1513858653616922153">Excluir senha</translation> <translation id="1518421282666914498">GIF de emoticon <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Ativado hoje</translation> @@ -185,6 +186,7 @@ <translation id="1995884366040846621">Para continuar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> vai compartilhar seu nome, endereço de e-mail e foto do perfil com esse site. Consulte a <ph name="BEGIN_LINK1" />Política de Privacidade<ph name="END_LINK1" /> do site.</translation> <translation id="2000419248597011803">Envia alguns cookies e pesquisas da barra de endereço e da caixa de pesquisa para seu mecanismo de pesquisa padrão.</translation> <translation id="200114059308480249">Incluir o texto ao redor nas pesquisas do Google?</translation> +<translation id="2011996512573319870">Sincronizar para acessar o conteúdo mais relevante do Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# arquivo}one{# arquivo}other{# arquivos}}</translation> <translation id="2020309681647789787">Seu histórico será mostrado em todos os dispositivos sincronizados para que você possa continuar o que estava fazendo</translation> <translation id="2021896219286479412">Controles de site em tela cheia</translation> @@ -268,6 +270,7 @@ <translation id="2461822463642141190">Atual</translation> <translation id="2472163211318554013">Faça login para aproveitar o Chrome ao máximo</translation> <translation id="247737702124049222">As descrições de imagens estão ativadas</translation> +<translation id="2481251096908459228">Encontre Stories personalizadas para você</translation> <translation id="2482878487686419369">Notificações</translation> <translation id="2485422356828889247">Desinstalar</translation> <translation id="2494974097748878569">Google Assistente no Chrome</translation> @@ -309,6 +312,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# arquivo de áudio}one{# arquivo de áudio}other{# arquivos de áudio}}</translation> <translation id="265156376773362237">Pré-carregamento padrão</translation> <translation id="2656405586795711023">Apps da Web</translation> +<translation id="2700802943130197326">Sincronizar para acessar suas senhas, favoritos e muito mais em todos os outros dispositivos.</translation> <translation id="2702516483241149200">Novo: compartilhe um link para este texto</translation> <translation id="2704606927547763573">Copiado</translation> <translation id="2707726405694321444">Atualizar página</translation> @@ -570,6 +574,7 @@ <translation id="4162867837470729563">Lista de opções de compartilhamento no tamanho máximo.</translation> <translation id="4165986682804962316">Configurações do site</translation> <translation id="4170011742729630528">O serviço não está disponível. Tente novamente mais tarde.</translation> +<translation id="4177222230309051052">Ter acesso a todos seus favoritos</translation> <translation id="4181841719683918333">Idiomas</translation> <translation id="4195643157523330669">Abrir em uma nova guia</translation> <translation id="4196597275619698563">Criar card</translation> @@ -726,6 +731,7 @@ <translation id="4987271110129728827">Não foi possível encontrar a página. Verifique se há erros de ortografia ou faça uma pesquisa na Web.</translation> <translation id="4988526792673242964">Páginas</translation> <translation id="5001388021414335527">Siga este site</translation> +<translation id="500351648694011114">Navegar com mais facilidade</translation> <translation id="5004416275253351869">Controles de atividade do Google</translation> <translation id="5005141133360250920">Reação excluída</translation> <translation id="5005498671520578047">Copiar senha</translation> @@ -877,6 +883,7 @@ <translation id="5864419784173784555">Aguardando outro download…</translation> <translation id="5865733239029070421">Envia estatísticas de uso e relatórios de erros automaticamente para o Google</translation> <translation id="5869522115854928033">Senhas salvas</translation> +<translation id="5869789175361934029">Continuar de outro dispositivo</translation> <translation id="587735546353481577">Para seguir um site, acesse-o, abra o menu do Google Chrome e toque em "Seguir".</translation> <translation id="5880748256563468367">Acessar o feed</translation> <translation id="5884076754568147479">Para ajudar você com suas tarefas, o Google receberá os URLs e o conteúdo de sites em que você usa o Assistente, bem como as informações que você envia por ele</translation> @@ -1450,6 +1457,7 @@ <translation id="8909135823018751308">Compartilhar...</translation> <translation id="8912362522468806198">Conta do Google</translation> <translation id="8920114477895755567">Aguardando detalhes dos pais.</translation> +<translation id="8921980840204105660">Sincronizar para acessar seus favoritos de outros dispositivos</translation> <translation id="8922289737868596582">Use o botão Mais opções para fazer o download de páginas e acessá-las off-line</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation> <translation id="892496902842311796">O <ph name="LANG" /> está pronto</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb index e9a36c19..34a9fe1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Está a seguir <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Motor de pesquisa</translation> <translation id="1513352483775369820">Marcadores e histórico da Web</translation> +<translation id="1513814250881909472">Sincronize para obter os separadores dos seus outros dispositivos</translation> <translation id="1513858653616922153">Eliminar palavra-passe</translation> <translation id="1518421282666914498">GIF expressivo <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Ativo hoje</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Para continuar, o fornecedor <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> vai partilhar o seu nome, endereço de email e imagem do perfil com este site. Consulte a <ph name="BEGIN_LINK1" />política de privacidade<ph name="END_LINK1" /> deste site.</translation> <translation id="2000419248597011803">Envia alguns cookies e pesquisas da barra de endereço e da caixa de pesquisa para o motor de pesquisa predefinido.</translation> <translation id="200114059308480249">Pretende incluir o texto circundante nas pesquisas no Google?</translation> +<translation id="2011996512573319870">Sincronize para obter o conteúdo mais relevante da Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ficheiro}other{# ficheiros}}</translation> <translation id="2020309681647789787">Terá o seu histórico em todos os dispositivos sincronizados para que possa continuar o que estava a fazer</translation> <translation id="2021896219286479412">Controlos de site em ecrã int.</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Atual</translation> <translation id="2472163211318554013">Inicie sessão para tirar o máximo partido do Chrome</translation> <translation id="247737702124049222">As descrições de imagens estão ativadas.</translation> +<translation id="2481251096908459228">Veja notícias para si</translation> <translation id="2482878487686419369">Notificações</translation> <translation id="2485422356828889247">Desinstalar</translation> <translation id="2494974097748878569">Assistente Google no Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ficheiro de áudio}other{# ficheiros de áudio}}</translation> <translation id="265156376773362237">Pré-carregamento padrão</translation> <translation id="2656405586795711023">Apps para a Web</translation> +<translation id="2700802943130197326">Sincronize para obter os seus marcadores, palavras-passe e muito mais em todos os seus outros dispositivos.</translation> <translation id="2702516483241149200">Novo: partilhe um link que se desloca para este texto</translation> <translation id="2704606927547763573">Copiado</translation> <translation id="2707726405694321444">Atualizar página</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Lista de opções de partilha à altura total.</translation> <translation id="4165986682804962316">Definições de sites</translation> <translation id="4170011742729630528">O serviço não está disponível. Tente novamente mais tarde.</translation> +<translation id="4177222230309051052">Obtenha todos os marcadores</translation> <translation id="4181841719683918333">Idiomas</translation> <translation id="4195643157523330669">Abrir num novo separador</translation> <translation id="4196597275619698563">Criar cartão</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Não é possível encontrar a página. Verifique a ortografia ou experimente pesquisar na Web.</translation> <translation id="4988526792673242964">Páginas </translation> <translation id="5001388021414335527">Seguir este site aqui</translation> +<translation id="500351648694011114">Explore mais facilmente</translation> <translation id="5004416275253351869">Controlos da atividade Google</translation> <translation id="5005141133360250920">Reação eliminada</translation> <translation id="5005498671520578047">Copiar palavra-passe</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">A aguardar por outra transferência…</translation> <translation id="5865733239029070421">Envia automaticamente estatísticas de utilização e relatórios de falhas para a Google.</translation> <translation id="5869522115854928033">Palavras-passe guardadas</translation> +<translation id="5869789175361934029">Continue a partir de outro dispositivo</translation> <translation id="587735546353481577">Para seguir um site, aceda ao site, abra o menu do Chrome e toque em Seguir.</translation> <translation id="5880748256563468367">Aceder ao feed</translation> <translation id="5884076754568147479">Para ajudar a concluir as tarefas, a Google vai receber os URLs e os conteúdos dos sites nos quais utiliza o Assistente, bem como as informações que envia através do mesmo</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Partilhar…</translation> <translation id="8912362522468806198">Conta Google</translation> <translation id="8920114477895755567">A aguardar os detalhes dos pais.</translation> +<translation id="8921980840204105660">Sincronize para obter os marcadores dos seus outros dispositivos</translation> <translation id="8922289737868596582">Descarregue páginas através do botão Mais opções para as utilizar offline.</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation> <translation id="892496902842311796">O idioma <ph name="LANG" /> está pronto</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index fbd16e87..1bfc360 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Вы подписались на сайт "<ph name="SITE_NAME" />"</translation> <translation id="1506061864768559482">Поисковая система</translation> <translation id="1513352483775369820">Закладки и история поиска</translation> +<translation id="1513814250881909472">Чтобы стали доступны вкладки с других устройств, выполните синхронизацию.</translation> <translation id="1513858653616922153">Удалить пароль</translation> <translation id="1518421282666914498">GIF со смайликом <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Последние действия: сегодня</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Чтобы продолжить, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> передаст ваше имя, адрес электронной почты и фото профиля на этот сайт. Ознакомьтесь с его <ph name="BEGIN_LINK1" />политикой конфиденциальности<ph name="END_LINK1" />.</translation> <translation id="2000419248597011803">Отправлять некоторые файлы cookie и поисковые запросы из адресной строки в поисковую систему по умолчанию</translation> <translation id="200114059308480249">Учитывать контекст в поиске Google?</translation> +<translation id="2011996512573319870">Чтобы получать все самое актуальное от Google, выполните синхронизацию.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# файл}one{# файл}few{# файла}many{# файлов}other{# файла}}</translation> <translation id="2020309681647789787">История будет храниться на всех ваших синхронизированных устройствах, поэтому вы легко сможете, например, начать работу на одном устройстве, а продолжить ее на другом.</translation> <translation id="2021896219286479412">Настройки полноэкранного режима</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Расход энергии</translation> <translation id="2472163211318554013">Чтобы пользоваться всеми возможностями Chrome, войдите в аккаунт.</translation> <translation id="247737702124049222">Описания изображений включены.</translation> +<translation id="2481251096908459228">Новости для вас</translation> <translation id="2482878487686419369">Уведомления</translation> <translation id="2485422356828889247">Удалить</translation> <translation id="2494974097748878569">Google Ассистент в Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# аудиофайл}one{# аудиофайл}few{# аудиофайла}many{# аудиофайлов}other{# аудиофайла}}</translation> <translation id="265156376773362237">Стандартная предзагрузка</translation> <translation id="2656405586795711023">Веб-приложения</translation> +<translation id="2700802943130197326">Чтобы на всех других устройствах стали доступны пароли, закладки и другие данные, выполните синхронизацию.</translation> <translation id="2702516483241149200">Теперь можно поделиться ссылкой, которая прокручивает страницу до этого текста.</translation> <translation id="2704606927547763573">Скопировано</translation> <translation id="2707726405694321444">Обновить страницу</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Список способов отправки развернут на весь экран.</translation> <translation id="4165986682804962316">Настройки сайтов</translation> <translation id="4170011742729630528">Сервис недоступен. Повторите попытку позже.</translation> +<translation id="4177222230309051052">Все ваши закладки под рукой</translation> <translation id="4181841719683918333">Языки</translation> <translation id="4195643157523330669">Открыть в новой вкладке</translation> <translation id="4196597275619698563">Создать карточку</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Не удается найти страницу. Проверьте, правильно ли введен запрос, или выполните поиск в интернете.</translation> <translation id="4988526792673242964">Страницы</translation> <translation id="5001388021414335527">Подписаться на этот сайт</translation> +<translation id="500351648694011114">Более удобная работа в браузере</translation> <translation id="5004416275253351869">Отслеживание действий в Google</translation> <translation id="5005141133360250920">Отклик удален</translation> <translation id="5005498671520578047">Копировать пароль</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Завершение предыдущего скачивания…</translation> <translation id="5865733239029070421">Автоматически отправлять в Google статистику использования и отчеты о сбоях</translation> <translation id="5869522115854928033">Сайты с сохраненными паролями</translation> +<translation id="5869789175361934029">Продолжайте на другом устройстве</translation> <translation id="587735546353481577">Чтобы подписаться на сайт, откройте его, перейдите в меню Google Chrome и нажмите "Подписаться".</translation> <translation id="5880748256563468367">Перейти к ленте</translation> <translation id="5884076754568147479">Выполнять действия в Chrome с помощью Ассистента: отправлять в Google контент и URL сайтов, а также информацию, сообщаемую Ассистенту</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Поделиться...</translation> <translation id="8912362522468806198">Аккаунт Google</translation> <translation id="8920114477895755567">Недостаточно данных о родителях.</translation> +<translation id="8921980840204105660">Чтобы стали доступны закладки с других устройств, выполните синхронизацию.</translation> <translation id="8922289737868596582">Скачивайте страницы через меню кнопки "Ещё" и открывайте их без подключения к Интернету</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" />: языковой пакет готов.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index d119027..a9be412 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">ඔබ <ph name="SITE_NAME" /> අනුගමනය කරයි</translation> <translation id="1506061864768559482">සෙවුම් යන්ත්රය</translation> <translation id="1513352483775369820">පිටුසන් සහ වෙබ් ඉතිහාසය</translation> +<translation id="1513814250881909472">ඔබගේ අනෙකුත් උපාංගවලින් ඔබගේ ටැබ් ලබා ගැනීමට සමමුහුර්ත කරන්න</translation> <translation id="1513858653616922153">මුරපදය මකන්න</translation> <translation id="1518421282666914498">හැඟීම් GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">අද ක්රියාත්මකයි</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">ඉදිරියට යාමට, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ඔබගේ නම, ඉ-තැපැල් ලිපිනය සහ පැතිකඩ පින්තූරය මෙම අඩවිය සමග බෙදා ගනු ඇත. මෙම අඩවියෙහි <ph name="BEGIN_LINK1" />පෞද්ගලිකත්ව ප්රතිපත්තිය<ph name="END_LINK1" /> බලන්න.</translation> <translation id="2000419248597011803">ලිපින තීරුවේ සහ සෙවීම් පෙට්ටියේ ඇතැම් කුකී සහ සෙවීම් ඔබගේ පෙරනිමි සෙවීම් එන්ජිමට යවයි</translation> <translation id="200114059308480249">Google සෙවීම් තුළ අවට පෙළ ඇතුළත් කරන්නද?</translation> +<translation id="2011996512573319870">Google වෙතින් වඩාත්ම අදාළ අන්තර්ගත ලබා ගැනීමට සමමුහුර්ත කරන්න</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ගොනුවක්}one{ගොනු #ක්}other{ගොනු #ක්}}</translation> <translation id="2020309681647789787">ඔබට ඔබගේ සමමුහුර්ත කළ උපාංග සියල්ලෙහි ඔබගේ ඉතිහාසය ඇත, එම නිසා ඔබට ඔබ කරමින් සිටි දේ දිගටම කරගෙන යා හැකිය</translation> <translation id="2021896219286479412">පූර්ණ තිර අඩවි පාලන</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">වත්මන්</translation> <translation id="2472163211318554013">Chrome වෙතින් උපරිම ප්රයෝජන ලබා ගැනීමට පුරන්න</translation> <translation id="247737702124049222">රූප විස්තර ක්රියාත්මකයි</translation> +<translation id="2481251096908459228">ඔබ සඳහා කතන්දර බලන්න</translation> <translation id="2482878487686419369">දැනුම්දීම්</translation> <translation id="2485422356828889247">අස්ථාපනය</translation> <translation id="2494974097748878569">Chrome හි Google සහායක</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ශ්රව්ය ගොනුවක්}one{ශ්රව්ය ගොනු #ක්}other{ශ්රව්ය ගොනු #ක්}}</translation> <translation id="265156376773362237">සම්මත පූර්ව පූරණය</translation> <translation id="2656405586795711023">වෙබ් යෙදුම්</translation> +<translation id="2700802943130197326">ඔබගේ අනෙකුත් සියලුම උපාංගවල ඔබගේ මුරපද, පිටුසන් සහ තවත් දේ ලබා ගැනීමට සමමුහුර්ත කරන්න.</translation> <translation id="2702516483241149200">නව: මෙම පෙළට අනුචලනය වන සබැඳියක් බෙදා ගන්න</translation> <translation id="2704606927547763573">පිටපත් කරන ලදි</translation> <translation id="2707726405694321444">පිටුව නැවුම් කරන්න</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">පූර්ණ උසකදී බෙදා ගැනීමේ විකල්ප ලැයිස්තුව.</translation> <translation id="4165986682804962316">අඩවි සැකසුම්</translation> <translation id="4170011742729630528">සේවාව නොපවතී: නැවත උත්සාහ කරන්න.</translation> +<translation id="4177222230309051052">ඔබගේ සියලු පිටුසන් ලබා ගන්න</translation> <translation id="4181841719683918333">භාෂා</translation> <translation id="4195643157523330669">නව ටැබයක විවෘත කරන්න</translation> <translation id="4196597275619698563">කාඩ්පත තනන්න</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">එම පිටුව සොයා ගත නොහැකිය. ඔබගේ අක්ෂර වින්යාසය පරීක්ෂා කරන්න හෝ වෙබ් සෙවීමක් උත්සාහ කරන්න.</translation> <translation id="4988526792673242964">පිටු</translation> <translation id="5001388021414335527">මෙම අඩවිය මෙහිදී අනුගමනය කරන්න</translation> +<translation id="500351648694011114">වඩාත් පහසුවෙන් බ්රවුස් කරන්න</translation> <translation id="5004416275253351869">Google ක්රියාකාරකම් පාලන</translation> <translation id="5005141133360250920">ප්රතික්රියාව මකන ලදි</translation> <translation id="5005498671520578047">මුරපදය පිටපත් කරන්න</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">වෙනත් බාගැනීමක් සඳහා රැඳෙමින්…</translation> <translation id="5865733239029070421">භාවිතා සංඛ්යාල්ඛන සහ සහ බිඳ වැටීම් වාර්තා ස්වයංක්රියව Google වෙත යවයි</translation> <translation id="5869522115854928033">සුරැකි රහස්වචන</translation> +<translation id="5869789175361934029">වෙනත් උපාංගයකින් කරගෙන යන්න</translation> <translation id="587735546353481577">අඩවියක් අනුගමනය කිරීමට, අඩවියට ගොස්, Chrome මෙනුව විවෘත කර, අනුගමනය කරන්න තට්ටු කරන්න.</translation> <translation id="5880748256563468367">සංග්රහය වෙත යන්න</translation> <translation id="5884076754568147479">ඔබට කාර්ය භාර සම්පූර්ණ කිරීමට උදවු කිරීමට, Google විසින් URL සහ ඔබේ සහකරු භාවිත කරන වෙබ් අඩවිවල අන්තර්ගතය මෙන්ම ඔබ සහකරු හරහා ඉදිරිපත් කරන තොරතුරු ලබා ගැනේ</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">බෙදාගන්න…</translation> <translation id="8912362522468806198">Google ගිණුම</translation> <translation id="8920114477895755567">මාපියන්ගේ විස්තර සඳහා පොරොත්තු වෙමින්</translation> +<translation id="8921980840204105660">ඔබගේ අනෙකුත් උපාංගවලින් ඔබගේ පිටුසන් ලබා ගැනීමට සමමුහුර්ත කරන්න</translation> <translation id="8922289737868596582">නොබැඳිව භාවිතා කිරීම සඳහා තවත් විකල්ප බොත්තමෙන් පිටු බාගන්න</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />තව දැන ගන්න<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> සූදානම්ය</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index 80924fc..bd97a0c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Spremljate spletno mesto <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Iskalnik</translation> <translation id="1513352483775369820">Zaznamki in spletna zgodovina</translation> +<translation id="1513814250881909472">S sinhronizacijo si zagotovite zavihke iz drugih naprav.</translation> <translation id="1513858653616922153">Izbris gesla</translation> <translation id="1518421282666914498">GIF za čustveni simbol <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktivno danes</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Če želite nadaljevati, bo ponudnik <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> delil vaše ime, e-poštni naslov in profilno sliko s tem spletnim mestom. Oglejte si <ph name="BEGIN_LINK1" />pravilnik o zasebnosti<ph name="END_LINK1" /> tega spletnega mesta.</translation> <translation id="2000419248597011803">Pošilja nekatere piškotke in iskanja iz naslovne vrstice ter iskalnega polja privzetemu iskalniku</translation> <translation id="200114059308480249">Želite vključiti sobesedilo v iskanja v Googlu?</translation> +<translation id="2011996512573319870">S sinhronizacijo si zagotovite najustreznejšo vsebino iz Googla.</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# datoteka}one{# datoteka}two{# datoteki}few{# datoteke}other{# datotek}}</translation> <translation id="2020309681647789787">Zgodovino si boste lahko ogledali v vseh sinhroniziranih napravah, da boste lahko nadaljevali, kar ste počeli.</translation> <translation id="2021896219286479412">Kontrol. za mesto v celo. načinu</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Trenutno</translation> <translation id="2472163211318554013">Prijavite se, če želite čim bolje izkoristiti Chrome</translation> <translation id="247737702124049222">Opisi slik so vklopljeni</translation> +<translation id="2481251096908459228">Ogled zgodb za vas</translation> <translation id="2482878487686419369">Obvestila</translation> <translation id="2485422356828889247">Odmeščanje</translation> <translation id="2494974097748878569">Pomočnik Google v Chromu</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# zvočna datoteka}one{# zvočna datoteka}two{# zvočni datoteki}few{# zvočne datoteke}other{# zvočnih datotek}}</translation> <translation id="265156376773362237">Standardno vnaprejšnje nalaganje</translation> <translation id="2656405586795711023">Spletni programi</translation> +<translation id="2700802943130197326">S sinhronizacijo si zagotovite gesla, zaznamke in drugo iz vseh drugih naprav.</translation> <translation id="2702516483241149200">Novo: Delite povezavo, ki se pomakne do tega besedila.</translation> <translation id="2704606927547763573">Kopirano</translation> <translation id="2707726405694321444">Osveži stran</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Seznam možnosti deljenja z drugimi je odprt pri polni višini.</translation> <translation id="4165986682804962316">Nastavitve spletnega mesta</translation> <translation id="4170011742729630528">Storitev ni na voljo; poskusite znova pozneje.</translation> +<translation id="4177222230309051052">Zagotovitev vseh zaznamkov</translation> <translation id="4181841719683918333">Jeziki</translation> <translation id="4195643157523330669">Odpri v novem zavihku</translation> <translation id="4196597275619698563">Ustvari kartico</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Te strani ni mogoče najti. Preverite črkovanje ali poskusite spletno iskanje.</translation> <translation id="4988526792673242964">Strani</translation> <translation id="5001388021414335527">Spremljajte to spletno mesto tukaj</translation> +<translation id="500351648694011114">Preprostejše brskanje</translation> <translation id="5004416275253351869">Googlovi kontrolniki za dejavnost</translation> <translation id="5005141133360250920">Odziv je bil izbrisan</translation> <translation id="5005498671520578047">Kopiranje gesla</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Čakanje na drug prenos …</translation> <translation id="5865733239029070421">Samodejno pošilja statistične podatke o uporabi in poročila o zrušitvah Googlu</translation> <translation id="5869522115854928033">Shranjena gesla</translation> +<translation id="5869789175361934029">Nadaljevanje iz druge naprave</translation> <translation id="587735546353481577">Če želite spremljati spletno mesto, odprite spletno mesto, nato odprite Chromov meni in se dotaknite možnosti za spremljanje.</translation> <translation id="5880748256563468367">Na vir</translation> <translation id="5884076754568147479">Zaradi zagotavljanja pomoči pri dokončanju opravil bo Google prejel URL-je in vsebino spletnih mest, na katerih uporabljate Pomočnika, ter podatke, ki jih pošljete prek Pomočnika.</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Skupna raba …</translation> <translation id="8912362522468806198">Račun Google</translation> <translation id="8920114477895755567">Čakanje na podrobnosti o staršu.</translation> +<translation id="8921980840204105660">S sinhronizacijo si zagotovite zaznamke iz drugih naprav.</translation> <translation id="8922289737868596582">Prenos strani za uporabo brez povezave z gumbom »Več možnosti«</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation> <translation id="892496902842311796">Jezik <ph name="LANG" /> je pripravljen.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index db624e3..8c35994 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Po ndjek <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Motori i kërkimit</translation> <translation id="1513352483775369820">Faqeshënuesit dhe historiku i uebit</translation> +<translation id="1513814250881909472">Sinkronizoje për të marrë skedat nga pajisjet e tua të tjera</translation> <translation id="1513858653616922153">Fshi fjalëkalimin</translation> <translation id="1518421282666914498">GIF emocioni <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktiv sot</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Për të vazhduar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> do të ndajë emrin, adresën e email-it dhe fotografinë tënde të profilit me këtë sajt. Shiko <ph name="BEGIN_LINK1" />politikën e privatësisë<ph name="END_LINK1" /> të këtij sajti.</translation> <translation id="2000419248597011803">Dërgon disa kuki dhe kërkime nga shiriti i adresës dhe kutia e kërkimit te motori yt i parazgjedhur i kërkimit</translation> <translation id="200114059308480249">Të përfshihet teksti përreth në kërkimet e Google?</translation> +<translation id="2011996512573319870">Sinkronizoje për të marrë përmbajtjet më të përshtatshme nga Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# skedar}other{# skedarë}}</translation> <translation id="2020309681647789787">Do të kesh historikun në të gjitha pajisjet e sinkronizuara, në mënyrë që të vazhdosh atë që po bëje</translation> <translation id="2021896219286479412">Kontrollet e sajtit në ekranin e plotë</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Rryma</translation> <translation id="2472163211318554013">Identifikohu për të përfituar sa më shumë nga Chrome</translation> <translation id="247737702124049222">Përshkrimet e imazheve janë aktive</translation> +<translation id="2481251096908459228">Shiko historitë për ty</translation> <translation id="2482878487686419369">Njoftimet</translation> <translation id="2485422356828889247">Çinstalo</translation> <translation id="2494974097748878569">"Asistenti i Google" në Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# skedar audio}other{# skedarë audio}}</translation> <translation id="265156376773362237">Ngarkimi paraprak standard</translation> <translation id="2656405586795711023">Aplikacionet e uebit</translation> +<translation id="2700802943130197326">Sinkronizoje për të marrë fjalëkalimet, faqeshënuesit etj. nga të gjitha pajisjet e tua të tjera.</translation> <translation id="2702516483241149200">E re: Ndaj një lidhje që të drejton te ky tekst</translation> <translation id="2704606927547763573">Kopjuar</translation> <translation id="2707726405694321444">Rifresko faqen</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Listë e opsioneve të shpërndarjes në lartësi të plotë.</translation> <translation id="4165986682804962316">Cilësimet e sajtit</translation> <translation id="4170011742729630528">Shërbimi nuk ofrohet. Provo përsëri më vonë.</translation> +<translation id="4177222230309051052">Merr të gjithë faqeshënuesit e tu</translation> <translation id="4181841719683918333">Gjuhët</translation> <translation id="4195643157523330669">Hape në një skedë të re</translation> <translation id="4196597275619698563">Krijo kartën</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Faqja nuk mund të gjendet. Kontrollo drejtshkrimin ose provo të kërkosh në ueb.</translation> <translation id="4988526792673242964">Faqet</translation> <translation id="5001388021414335527">Ndiqe këtë sajt këtu</translation> +<translation id="500351648694011114">Shfleto me më shumë lehtësi</translation> <translation id="5004416275253351869">Kontrollet e aktivitetit të Google</translation> <translation id="5005141133360250920">Reagimi u fshi</translation> <translation id="5005498671520578047">Kopjo fjalëkalimin</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Në pritje të një shkarkimi tjetër…</translation> <translation id="5865733239029070421">Dërgon automatikisht te Google statistika të përdorimit dhe raportet e ndërprerjeve aksidentale</translation> <translation id="5869522115854928033">Fjalëkalimet e ruajtura</translation> +<translation id="5869789175361934029">Vazhdo nga një pajisje tjetër</translation> <translation id="587735546353481577">Për të ndjekur një sajt, shko te sajti, hap menynë e Chrome dhe trokit te Ndiq.</translation> <translation id="5880748256563468367">Shko te furnizimi</translation> <translation id="5884076754568147479">Për të të ndihmuar të përfundosh detyrat, Google do të marrë URL-të dhe përmbajtjet e sajteve ku ti përdor "Asistentin", si dhe informacionet që dërgon nëpërmjet "Asistentit"</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Ndaj…</translation> <translation id="8912362522468806198">Llogaria e Google</translation> <translation id="8920114477895755567">Po pret detajet e prindërve.</translation> +<translation id="8921980840204105660">Sinkronizoje për të marrë faqeshënuesit nga pajisjet e tua të tjera</translation> <translation id="8922289737868596582">Shkarko faqet nga butoni "Më shumë opsione" për t'i përdorur ato jashtë linje</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> është gati</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb index 5db2956..199abae 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Pratite <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Pretraživač</translation> <translation id="1513352483775369820">Obeleživači i veb-istorija</translation> +<translation id="1513814250881909472">Sinhronizujte podatke da bi vam bile dostupne kartice sa drugih uređaja</translation> <translation id="1513858653616922153">Izbriši lozinku</translation> <translation id="1518421282666914498">GIF za emocije <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktivan je danas</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Da biste nastavili, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> će deliti vaše ime, imejl adresu i sliku profila sa ovim sajtom. Pogledajte <ph name="BEGIN_LINK1" />politiku privatnosti<ph name="END_LINK1" /> ovog sajta.</translation> <translation id="2000419248597011803">Podrazumevanom pretraživaču šalje neke kolačiće i pretrage iz trake za adresu i okvira za pretragu</translation> <translation id="200114059308480249">Želite da uvrstite okolni tekst u Google pretrage?</translation> +<translation id="2011996512573319870">Sinhronizujte podatke da biste dobili najrelevantniji sadržaj od Google-a</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# datoteka}one{# datoteka}few{# datoteke}other{# datoteka}}</translation> <translation id="2020309681647789787">Imaćete istoriju na svim sinhronizovanim uređajima, pa možete da nastavite ono što ste radili</translation> <translation id="2021896219286479412">Kontrole sajta na celom ekranu</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Aktuelno</translation> <translation id="2472163211318554013">Prijavite se da biste iskoristili Chrome na najbolji način</translation> <translation id="247737702124049222">Opisi slika su uključeni</translation> +<translation id="2481251096908459228">Pogledajte priče za vas</translation> <translation id="2482878487686419369">Obaveštenja</translation> <translation id="2485422356828889247">Deinstaliraj</translation> <translation id="2494974097748878569">Google pomoćnik u Chrome-u</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# audio datoteka}one{# audio datoteka}few{# audio datoteke}other{# audio datoteka}}</translation> <translation id="265156376773362237">Standardno predučitavanje</translation> <translation id="2656405586795711023">Veb-aplikacije</translation> +<translation id="2700802943130197326">Sinhronizujte podatke da biste preuzeli lozinke, obeleživače i drugo na svim uređajima.</translation> <translation id="2702516483241149200">Novo: Delite link koji skroluje do ovog teksta</translation> <translation id="2704606927547763573">Kopirano</translation> <translation id="2707726405694321444">Osveži stranicu</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Lista opcija za deljenje je otvorena na celom ekranu.</translation> <translation id="4165986682804962316">Podešavanja sajta</translation> <translation id="4170011742729630528">Usluga nije dostupna. Probajte ponovo kasnije.</translation> +<translation id="4177222230309051052">Preuzmite sve obeleživače</translation> <translation id="4181841719683918333">Jezici</translation> <translation id="4195643157523330669">Otvori na novoj kartici</translation> <translation id="4196597275619698563">Napravi karticu</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Nismo uspeli da pronađemo tu stranicu. Proverite pravopis ili probajte veb-pretragu.</translation> <translation id="4988526792673242964">Stranice</translation> <translation id="5001388021414335527">Pratite ovaj sajt ovde</translation> +<translation id="500351648694011114">Pregledajte jednostavnije</translation> <translation id="5004416275253351869">Google kontrole aktivnosti</translation> <translation id="5005141133360250920">Reakcija je izbrisana</translation> <translation id="5005498671520578047">Kopiranje lozinke</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Čeka se drugo preuzimanje...</translation> <translation id="5865733239029070421">Automatski šalje Google-u statistiku korišćenja i izveštaje o otkazivanju</translation> <translation id="5869522115854928033">Sačuvane lozinke</translation> +<translation id="5869789175361934029">Nastavite sa drugog uređaja</translation> <translation id="587735546353481577">Da biste pratili sajt, idite na njega, otvorite Chrome meni i dodirnite Prati.</translation> <translation id="5880748256563468367">Idi na fid</translation> <translation id="5884076754568147479">Da bi vam pomogao u obavljanju zadataka, Google će dobijati URL-ove i sadržaj sajtova na kojima koristite Pomoćnik, kao i informacije koje pošaljete preko Pomoćnika</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Deli...</translation> <translation id="8912362522468806198">Google naloga</translation> <translation id="8920114477895755567">Čekaju se detalji roditelja.</translation> +<translation id="8921980840204105660">Sinhronizujte podatke da biste preuzeli obeleživače sa drugih uređaja</translation> <translation id="8922289737868596582">Preuzmite stranice pomoću dugmeta Još opcija da biste ih koristili oflajn</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="892496902842311796">Jezik <ph name="LANG" /> je spreman</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index 7c55c196..7aa9e9f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Пратите <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Претраживач</translation> <translation id="1513352483775369820">Обележивачи и веб-историја</translation> +<translation id="1513814250881909472">Синхронизујте податке да би вам биле доступне картице са других уређаја</translation> <translation id="1513858653616922153">Избриши лозинку</translation> <translation id="1518421282666914498">GIF за емоције <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Активан је данас</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Да бисте наставили, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ће делити ваше име, имејл адресу и слику профила са овим сајтом. Погледајте <ph name="BEGIN_LINK1" />политику приватности<ph name="END_LINK1" /> овог сајта.</translation> <translation id="2000419248597011803">Подразумеваном претраживачу шаље неке колачиће и претраге из траке за адресу и оквира за претрагу</translation> <translation id="200114059308480249">Желите да уврстите околни текст у Google претраге?</translation> +<translation id="2011996512573319870">Синхронизујте податке да бисте добили најрелевантнији садржај од Google-а</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# датотека}one{# датотека}few{# датотеке}other{# датотека}}</translation> <translation id="2020309681647789787">Имаћете историју на свим синхронизованим уређајима, па можете да наставите оно што сте радили</translation> <translation id="2021896219286479412">Контроле сајта на целом екрану</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Актуелно</translation> <translation id="2472163211318554013">Пријавите се да бисте искористили Chrome на најбољи начин</translation> <translation id="247737702124049222">Описи слика су укључени</translation> +<translation id="2481251096908459228">Погледајте приче за вас</translation> <translation id="2482878487686419369">Обавештења</translation> <translation id="2485422356828889247">Деинсталирај</translation> <translation id="2494974097748878569">Google помоћник у Chrome-у</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# аудио датотека}one{# аудио датотека}few{# аудио датотеке}other{# аудио датотека}}</translation> <translation id="265156376773362237">Стандардно предучитавање</translation> <translation id="2656405586795711023">Веб-апликације</translation> +<translation id="2700802943130197326">Синхронизујте податке да бисте преузели лозинке, обележиваче и друго на свим уређајима.</translation> <translation id="2702516483241149200">Ново: Делите линк који скролује до овог текста</translation> <translation id="2704606927547763573">Копирано</translation> <translation id="2707726405694321444">Освежи страницу</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Листа опција за дељење је отворена на целом екрану.</translation> <translation id="4165986682804962316">Подешавања сајта</translation> <translation id="4170011742729630528">Услуга није доступна. Пробајте поново касније.</translation> +<translation id="4177222230309051052">Преузмите све обележиваче</translation> <translation id="4181841719683918333">Језици</translation> <translation id="4195643157523330669">Отвори на новој картици</translation> <translation id="4196597275619698563">Направи картицу</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Нисмо успели да пронађемо ту страницу. Проверите правопис или пробајте веб-претрагу.</translation> <translation id="4988526792673242964">Странице</translation> <translation id="5001388021414335527">Пратите овај сајт овде</translation> +<translation id="500351648694011114">Прегледајте једноставније</translation> <translation id="5004416275253351869">Google контроле активности</translation> <translation id="5005141133360250920">Реакција је избрисана</translation> <translation id="5005498671520578047">Копирање лозинке</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Чека се друго преузимање...</translation> <translation id="5865733239029070421">Аутоматски шаље Google-у статистику коришћења и извештаје о отказивању</translation> <translation id="5869522115854928033">Сачуване лозинке</translation> +<translation id="5869789175361934029">Наставите са другог уређаја</translation> <translation id="587735546353481577">Да бисте пратили сајт, идите на њега, отворите Chrome мени и додирните Прати.</translation> <translation id="5880748256563468367">Иди на фид</translation> <translation id="5884076754568147479">Да би вам помогао у обављању задатака, Google ће добијати URL-ове и садржај сајтова на којима користите Помоћник, као и информације које пошаљете преко Помоћника</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Дели...</translation> <translation id="8912362522468806198">Google налога</translation> <translation id="8920114477895755567">Чекају се детаљи родитеља.</translation> +<translation id="8921980840204105660">Синхронизујте податке да бисте преузели обележиваче са других уређаја</translation> <translation id="8922289737868596582">Преузмите странице помоћу дугмета Још опција да бисте их користили офлајн</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation> <translation id="892496902842311796">Језик <ph name="LANG" /> је спреман</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index d0fd5aa..3f05f27b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Du följer <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Sökmotor</translation> <translation id="1513352483775369820">Bokmärken och webbhistorik</translation> +<translation id="1513814250881909472">Synkronisera om du få tillgång till flikar från dina andra enheter</translation> <translation id="1513858653616922153">Radera lösenord</translation> <translation id="1518421282666914498">GIF-uttryckssymbol <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Aktiv idag</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> delar ditt namn, din e-postadress, din adress och din profilbild med den här webbplatsen om du fortsätter. Läs webbplatsens <ph name="BEGIN_LINK1" />integritetspolicy<ph name="END_LINK1" />.</translation> <translation id="2000419248597011803">Skickar vissa cookies och sökningar från adressfältet och sökrutan till standardsökmotorn</translation> <translation id="200114059308480249">Vill du inkludera omgivande text i sökningar på Google?</translation> +<translation id="2011996512573319870">Synkronisera om du vill få det mest relevanta innehållet från Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# fil}other{# filer}}</translation> <translation id="2020309681647789787">Historiken visas på alla synkroniserade enheter, så att du kan fortsätta där du slutade</translation> <translation id="2021896219286479412">Helskärmskontroller på webbsidan</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Nuvarande</translation> <translation id="2472163211318554013">Logga in så att du får ut mesta möjliga av Chrome</translation> <translation id="247737702124049222">Bildbeskrivningar har aktiverats</translation> +<translation id="2481251096908459228">Se artiklar för dig</translation> <translation id="2482878487686419369">Aviseringar</translation> <translation id="2485422356828889247">Avinstallera</translation> <translation id="2494974097748878569">Google-assistenten i Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ljudfil}other{# ljudfiler}}</translation> <translation id="265156376773362237">Standardförinläsning</translation> <translation id="2656405586795711023">Webbappar</translation> +<translation id="2700802943130197326">Synkronisera om du vill få tillgång till lösenord, bokmärken med mera på alla dina andra enheter.</translation> <translation id="2702516483241149200">Nyhet: dela en länk som scrollar fram till den här texten</translation> <translation id="2704606927547763573">Kopierat</translation> <translation id="2707726405694321444">Uppdatera sidan</translation> @@ -570,6 +574,7 @@ <translation id="4162867837470729563">Lista över delningsalternativ har öppnats över hela skärmen.</translation> <translation id="4165986682804962316">Webbplatsinställningar</translation> <translation id="4170011742729630528">Tjänsten är inte tillgänglig, försök igen senare.</translation> +<translation id="4177222230309051052">Få tillgång till alla dina bokmärken</translation> <translation id="4181841719683918333">Språk</translation> <translation id="4195643157523330669">Öppna i ny flik</translation> <translation id="4196597275619698563">Skapa kort</translation> @@ -725,6 +730,7 @@ <translation id="4987271110129728827">Sidan hittades inte. Kontrollera stavningen eller testa att söka på webben.</translation> <translation id="4988526792673242964">Sidor</translation> <translation id="5001388021414335527">Följ denna webbplats här</translation> +<translation id="500351648694011114">Surfa enklare</translation> <translation id="5004416275253351869">Googles aktivitetsinställningar</translation> <translation id="5005141133360250920">Reaktionen har tagits bort</translation> <translation id="5005498671520578047">Kopiera lösenord</translation> @@ -876,6 +882,7 @@ <translation id="5864419784173784555">Väntar på nästa nedladdning …</translation> <translation id="5865733239029070421">Skickar användningsstatistik och felrapporter till Google automatiskt</translation> <translation id="5869522115854928033">Sparade lösenord</translation> +<translation id="5869789175361934029">Fortsätt på en annan enhet</translation> <translation id="587735546353481577">Om du vill följa en webbplats besöker du den, öppnar Chrome-menyn och trycker på Följ.</translation> <translation id="5880748256563468367">Visa flödet</translation> <translation id="5884076754568147479">Innehållet på en webbplats där du använder Google Assistent, dess webbadress samt information som du skickar via assistenten överförs till Google så att du kan få uppgifterna utförda</translation> @@ -1449,6 +1456,7 @@ <translation id="8909135823018751308">Dela …</translation> <translation id="8912362522468806198">Google-konto</translation> <translation id="8920114477895755567">Väntar på föräldrauppgifter.</translation> +<translation id="8921980840204105660">Synkronisera om du vill få tillgång till bokmärken från dina andra enheter</translation> <translation id="8922289737868596582">Ladda ned sidor via knappen Fler alternativ så att du kan använda dem offline</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> är redo</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index 79084da..e8d1aa42 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Unafuatilia <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Mtambo wa utafutaji</translation> <translation id="1513352483775369820">Alamisho na historia ya wavuti</translation> +<translation id="1513814250881909472">Sawazisha ili upate vichupo vyako kutoka kwenye vifaa vyako vingine</translation> <translation id="1513858653616922153">Futa nenosiri</translation> <translation id="1518421282666914498">GIF ya hisia <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Ameitumia leo</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Ili uendelee, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> itashiriki jina, anwani ya barua pepe, pamoja na picha yako ya wasifu na tovuti hii. Angalia <ph name="BEGIN_LINK1" />sera ya faragha<ph name="END_LINK1" /> ya tovuti hii.</translation> <translation id="2000419248597011803">Hutuma baadhi ya vidakuzi na utafutaji kutoka kwenye sehemu ya anwani na kisanduku cha kutafutia kwenye mtambo wako chaguomsingi wa kutafuta</translation> <translation id="200114059308480249">Ungependa kujumuisha maandishi yaliyo karibu na maneno uliyoyachagua katika utafutaji kwenye Google?</translation> +<translation id="2011996512573319870">Sawazisha ili upate maudhui yanayokufaa zaidi kutoka Google</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{Faili #}other{Faili #}}</translation> <translation id="2020309681647789787">Utapata historia yako kwenye vifaa vyako vyote vilivyosawazishwa, ili uweze kuendeleza ulichokuwa ukifanya</translation> <translation id="2021896219286479412">Vidhibiti vya tovuti vya skrini nzima</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Ya sasa</translation> <translation id="2472163211318554013">Ingia katika akaunti ili unufaike zaidi kutokana na Chrome</translation> <translation id="247737702124049222">Kipengele cha maelezo ya picha kimewashwa</translation> +<translation id="2481251096908459228">Angalia taarifa kwa ajili yako</translation> <translation id="2482878487686419369">Arifa</translation> <translation id="2485422356828889247">Ondoa</translation> <translation id="2494974097748878569">Mratibu wa Google katika Chrome</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{Faili # ya sauti}other{Faili # za sauti}}</translation> <translation id="265156376773362237">Upakiaji mapema wa kawaida</translation> <translation id="2656405586795711023">Programu za wavuti</translation> +<translation id="2700802943130197326">Sawazisha ili upate manenosiri yako, alamisho na mengine zaidi kwenye vifaa vyako vyote.</translation> <translation id="2702516483241149200">Mpya: shiriki kiungo kinachoenda kwenye maandishi haya</translation> <translation id="2704606927547763573">Imenakiliwa</translation> <translation id="2707726405694321444">Onyesha upya ukurasa</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Orodha ya chaguo za kushiriki imefunguliwa kwenye skrini nzima.</translation> <translation id="4165986682804962316">Mipangilio ya tovuti</translation> <translation id="4170011742729630528">Huduma haipatikani; jaribu tena baadaye.</translation> +<translation id="4177222230309051052">Pata alamisho zako zote</translation> <translation id="4181841719683918333">Lugha</translation> <translation id="4195643157523330669">Fungua katika kichupo kipya</translation> <translation id="4196597275619698563">Weka kadi</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Imeshindwa kupata ukurasa huo. Kagua tahajia zako au jaribu kutafuta kwenye wavuti.</translation> <translation id="4988526792673242964">Kurasa</translation> <translation id="5001388021414335527">Fuatilia tovuti hii hapa</translation> +<translation id="500351648694011114">Vinjari kwa urahisi zaidi</translation> <translation id="5004416275253351869">Vidhibiti vya shughuli za Google</translation> <translation id="5005141133360250920">Maoni yamefutwa</translation> <translation id="5005498671520578047">Nakili nenosiri</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Inasubiri kipakuliwa kingine…</translation> <translation id="5865733239029070421">Hutuma kiotomatiki takwimu za matumizi na ripoti za programu kuacha kufanya kazi kwa Google</translation> <translation id="5869522115854928033">Manenosiri yaliyohifadhiwa</translation> +<translation id="5869789175361934029">Endelea kutoka kwenye kifaa kingine</translation> <translation id="587735546353481577">Ili uweze kufuatilia tovuti, nenda kwenye tovuti hiyo, fungua menyu ya Chrome kisha uguse Fuatilia.</translation> <translation id="5880748256563468367">Nenda kwenye mipasho</translation> <translation id="5884076754568147479">Ili tukusaidie ukamilishe majukumu, Google itapokea URL na maudhui ya tovuti ambako unatumia programu ya Mratibu na pia maelezo unayotuma kupitia programu ya Mratibu</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Shiriki...</translation> <translation id="8912362522468806198">Akaunti ya Google</translation> <translation id="8920114477895755567">Tunasubiri maelezo ya wazazi.</translation> +<translation id="8921980840204105660">Sawazisha ili upate alamisho zako kutoka kwenye vifaa vyako vingine</translation> <translation id="8922289737868596582">Pakua kurasa kwenye kitufe cha Chaguo zaidi ili uzitumie nje ya mtandao</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Pata Maelezo Zaidi<ph name="END_LINK" /></translation> <translation id="892496902842311796">Lugha ya <ph name="LANG" /> iko tayari</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb index 81fd7b6..a12857dde 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -171,6 +171,7 @@ <translation id="1928696683969751773">అప్డేట్లు</translation> <translation id="19288952978244135">Chromeను మళ్లీ తెరవండి.</translation> <translation id="1933845786846280168">ఎంచుకున్న ట్యాబ్</translation> +<translation id="193571872656840963">ఈ క్రియేటర్కు "థ్యాంక్స్" అనే ప్రతిస్పందనను చూపు</translation> <translation id="1943432128510653496">పాస్వర్డ్లను సేవ్ చేయండి</translation> <translation id="1952172573699511566">వీలైనప్పుడు వెబ్సైట్లు, మీ ప్రాధాన్య భాషలో వచనాన్ని చూపుతాయి.</translation> <translation id="1959679933317802873">కంటెంట్ కోసం వేచి ఉంది</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index f407210e..f2fc750 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -83,6 +83,7 @@ <translation id="1383876407941801731">ค้นหา</translation> <translation id="1384704387250346179">แปลรูปภาพด้วย Google Lens <ph name="BEGIN_NEW" />ใหม่<ph name="END_NEW" /></translation> <translation id="1386674309198842382">ใช้งานเมื่อ <ph name="LAST_UPDATED" /> วันที่ผ่านมา</translation> +<translation id="13931502444227376">หากต้องการดำเนินการต่อ <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> จะแชร์ชื่อ อีเมล และรูปโปรไฟล์ของคุณกับเว็บไซต์นี้ ดู<ph name="BEGIN_LINK1" />ข้อกำหนดในการให้บริการ<ph name="END_LINK1" />ของเว็บไซต์นี้</translation> <translation id="1397811292916898096">ค้นหาด้วย <ph name="PRODUCT_NAME" /></translation> <translation id="139993653570221430">คุณเปลี่ยนใจได้ทุกเมื่อในการตั้งค่า Chrome การทดลองใช้จะทำงานพร้อมกับวิธีแสดงโฆษณาปัจจุบัน คุณจึงจะไม่เห็นการเปลี่ยนแปลงโดยทันที</translation> <translation id="1406000523432664303">“ไม่ติดตาม”</translation> @@ -145,6 +146,7 @@ <translation id="173522743738009831">เกี่ยวกับ Privacy Sandbox</translation> <translation id="1736419249208073774">สำรวจ</translation> <translation id="1749561566933687563">ซิงค์บุ๊กมาร์กของคุณ</translation> +<translation id="1750259112639922169">กลุ่มแท็บ - <ph name="TAB_COUNT" /> แท็บ</translation> <translation id="17513872634828108">แท็บที่เปิดอยู่</translation> <translation id="1754404134430936718">คัดลอกข้อความแล้ว</translation> <translation id="1779766957982586368">ปิดหน้าต่าง</translation> @@ -788,6 +790,7 @@ <translation id="5368227114232678694">ลองใช้โหมดไม่ระบุตัวตนเพื่อท่องเว็บอย่างเป็นส่วนตัวในอุปกรณ์นี้</translation> <translation id="5375577065097716013">ค้นหาภาพด้วย Google Lens <ph name="BEGIN_NEW" />ใหม่<ph name="END_NEW" /></translation> <translation id="5376898820269806588">เปลี่ยนความรู้สึกแล้ว</translation> +<translation id="5401851137404501592">หากต้องการดำเนินการต่อ <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> จะแชร์ชื่อ อีเมล และรูปโปรไฟล์ของคุณกับเว็บไซต์นี้</translation> <translation id="5403644198645076998">อนุญาตเฉพาะบางไซต์</translation> <translation id="5409881200985013443">ส่ง <ph name="ONE_TIME_CODE" /> ใน <ph name="CLIENT_NAME" /> ไหม</translation> <translation id="5414836363063783498">กำลังยืนยัน…</translation> @@ -1128,6 +1131,7 @@ <translation id="7177873915659574692">สร้างคิวอาร์โค้ดไม่ได้ URL มีจำนวนอักขระมากกว่า <ph name="CHARACTER_LIMIT" /> ตัว</translation> <translation id="7177959540995930968">คุณดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์เหล่านี้ได้ในการตั้งค่า Chrome</translation> <translation id="718226107353899806">คุณเพิ่มความรู้สึกได้สูงสุด <ph name="MAX_NUM_REACTIONS" /> รายการ</translation> +<translation id="7183693674623539380">กลุ่มแท็บ - <ph name="TITLE_OF_GROUP" /></translation> <translation id="7187993566681480880">รักษาความปลอดภัยของคุณใน Chrome และอาจใช้เพื่อปรับปรุงความปลอดภัยในแอปอื่นๆ ของ Google เมื่อลงชื่อเข้าใช้</translation> <translation id="7191430249889272776">แท็บเปิดในพื้นหลัง</translation> <translation id="7196215469483532480">คำอธิบายคู่มือความเป็นส่วนตัวเปิดแบบเต็มหน้า</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index 9f8c2aa..cfc5145 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723"><ph name="SITE_NAME" /> kaynağını takip ediyorsunuz</translation> <translation id="1506061864768559482">Arama motoru</translation> <translation id="1513352483775369820">Yer işaretleri ve web geçmişi</translation> +<translation id="1513814250881909472">Diğer cihazlarınızdaki sekmelerinize ulaşmak için senkronize edin</translation> <translation id="1513858653616922153">Şifreyi sil</translation> <translation id="1518421282666914498">İfade GIF'i <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Son etkin olduğu zaman:</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />, devam etmek için adınızı, e-posta adresinizi ve profil resminizi bu siteyle paylaşacaktır. Bu sitenin <ph name="BEGIN_LINK1" />gizlilik politikasına<ph name="END_LINK1" /> bakın.</translation> <translation id="2000419248597011803">Adres çubuğundan ve arama kutusundan bazı çerezleri ve aramaları varsayılan arama motorunuza gönderir</translation> <translation id="200114059308480249">Seçilen kelimenin etrafındaki metin Google aramalarına dahil edilsin mi?</translation> +<translation id="2011996512573319870">Google'daki en alakalı içeriğe ulaşmak için senkronize edin</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# Dosya}other{# Dosya}}</translation> <translation id="2020309681647789787">Geçmiş bilgilerinizi senkronize edilmiş tüm cihazlarınızda bulabileceksiniz. Bu şekilde, son bıraktığınız yerden devam edebilirsiniz</translation> <translation id="2021896219286479412">Tam ekran site kontrolleri</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Mevcut güç tüketimi</translation> <translation id="2472163211318554013">Chrome'dan en iyi şekilde yararlanmak için oturum açın</translation> <translation id="247737702124049222">Resim açıklamaları açık</translation> +<translation id="2481251096908459228">Size özel hikayeleri görün</translation> <translation id="2482878487686419369">Bildirimler</translation> <translation id="2485422356828889247">Kaldır</translation> <translation id="2494974097748878569">Chrome'da Google Asistan</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# Ses dosyası}other{# Ses dosyası}}</translation> <translation id="265156376773362237">Standart önceden yükleme</translation> <translation id="2656405586795711023">Web uygulamaları</translation> +<translation id="2700802943130197326">Şifrelerinize, yer işaretlerinize ve daha fazlasına tüm cihazlarınızdan ulaşmak için senkronize edin</translation> <translation id="2702516483241149200">Yeni: bu metne kaydıran bir bağlantı paylaşın</translation> <translation id="2704606927547763573">Kopyalandı</translation> <translation id="2707726405694321444">Sayfayı yenile</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Paylaşım seçenekleri listesi tam ekranda açıldı.</translation> <translation id="4165986682804962316">Site ayarları</translation> <translation id="4170011742729630528">Hizmet kullanılamıyor, daha sonra tekrar deneyin.</translation> +<translation id="4177222230309051052">Tüm yer işaretlerinize ulaşın</translation> <translation id="4181841719683918333">Diller</translation> <translation id="4195643157523330669">Yeni sekmede aç</translation> <translation id="4196597275619698563">Kart oluştur</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Sayfa bulunamadı. Yazımınızı kontrol edin veya web araması yapmayı deneyin.</translation> <translation id="4988526792673242964">Sayfalar</translation> <translation id="5001388021414335527">Siteyi buradan takip edin</translation> +<translation id="500351648694011114">Daha kolay göz atın</translation> <translation id="5004416275253351869">Google etkinlik kontrolleri</translation> <translation id="5005141133360250920">Tepki silindi</translation> <translation id="5005498671520578047">Şifreyi kopyalayın</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Başka bir indirme işlemi bekleniyor…</translation> <translation id="5865733239029070421">Kullanım istatistiklerini ve kilitlenme raporlarını Google'a otomatik olarak gönderir</translation> <translation id="5869522115854928033">Kayıtlı şifreler</translation> +<translation id="5869789175361934029">Başka bir cihazdan devam edin</translation> <translation id="587735546353481577">Bir siteyi takip etmek için siteye gidin, Chrome menüsünü açıp Takip et'e dokunun.</translation> <translation id="5880748256563468367">Feed'e git</translation> <translation id="5884076754568147479">Google, görevleri tamamlamanıza yardımcı olmak için Asistan'ı kullandığınız sitelerin URL'lerinin ve içeriklerinin yanı sıra Asistan aracılığıyla gönderdiğiniz bilgileri alır</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Paylaş…</translation> <translation id="8912362522468806198">Google Hesabı</translation> <translation id="8920114477895755567">Ebeveyn ayrıntıları bekleniyor.</translation> +<translation id="8921980840204105660">Diğer cihazlarınızdaki yer işaretlerinize ulaşmak için senkronize edin</translation> <translation id="8922289737868596582">Çevrimdışı olarak kullanmak istediğiniz sayfaları Diğer seçenekler düğmesini kullanarak indirin</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Daha Fazla Bilgi<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> hazır</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index 6513077..5fa247e7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -171,6 +171,7 @@ <translation id="1928696683969751773">اپ ڈيٹس</translation> <translation id="19288952978244135">Chrome دوبارہ کھولیں۔</translation> <translation id="1933845786846280168">منتخب ٹیب</translation> +<translation id="193571872656840963">اس تخلیق کار کا شکر ادا کریں</translation> <translation id="1943432128510653496">پاس ورڈز محفوظ کریں</translation> <translation id="1952172573699511566">جب ممکن ہوگا، تو ویب سائٹس آپ کی پسندیدہ زبان میں متن دکھائیں گی۔</translation> <translation id="1959679933317802873">مواد کے منتظر</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb index e83e50d..7db78ac 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723"><ph name="SITE_NAME" /> tasmasiga obuna boʻlgansiz</translation> <translation id="1506061864768559482">Qidiruv tizimi</translation> <translation id="1513352483775369820">Xatcho‘plar va qidiruv tarixi</translation> +<translation id="1513814250881909472">Boshqa qurilmalardan varaqlarni olish uchun sinxronlang</translation> <translation id="1513858653616922153">Parolni o‘chirish</translation> <translation id="1518421282666914498">Emoji GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Bugun onlayn edi</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">Davom etish uchun <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ism, email manzil va profil rasmingizni bu sayt bilan ulashadi. Bu saytning <ph name="BEGIN_LINK1" />maxfiylik siyosati<ph name="END_LINK1" /> bilan tanishing.</translation> <translation id="2000419248597011803">Manzillar qatori va qidiruv oynasida kiritilgan so‘rovlar va ba’zi cookie ma’lumotlarni standart qidiruv tizimiga yuboradi</translation> <translation id="200114059308480249">Google qidiruvlariga qamrovli matn kiritilsinmi?</translation> +<translation id="2011996512573319870">Google eng kerakli kontentni olish uchun sinxronlang</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# ta fayl}other{# ta fayl}}</translation> <translation id="2020309681647789787">Brauzer tarixingiz barcha qurilmalaringizda sinxronlanadi va ishni qolgan joyingizdan davom ettira olasiz</translation> <translation id="2021896219286479412">To‘liq ekranli rejim sozlamalari</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">Ayni vaqtda</translation> <translation id="2472163211318554013">Chromening barcha imkoniyatlaridan foydalanish uchun hisobga kiring</translation> <translation id="247737702124049222">Rasmlar tavsifi yoniq</translation> +<translation id="2481251096908459228">Siz uchun maxsus yangiliklar</translation> <translation id="2482878487686419369">Bildirishnomalar</translation> <translation id="2485422356828889247">O‘chirib tashlash</translation> <translation id="2494974097748878569">Chrome ichidagi Google Assistent</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ta audio fayl}other{# ta audio fayl}}</translation> <translation id="265156376773362237">Standart oldindan yuklash</translation> <translation id="2656405586795711023">Veb-ilovalar</translation> +<translation id="2700802943130197326">Barcha boshqa qurilmalaringizdagi parol va xatchoʻp kabilarni olish uchun sinxronlang</translation> <translation id="2702516483241149200">Yangi: bu matnga varaqlaydigan havolani ulashing</translation> <translation id="2704606927547763573">Nusxa olindi</translation> <translation id="2707726405694321444">Sahifani yangilash</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">Ruxsat parametrlari roʻyxatini toʻliq hajmda ochilgan.</translation> <translation id="4165986682804962316">Sayt sozlamalari</translation> <translation id="4170011742729630528">Xizmat ish faoliyatida emas. Keyinroq qaytadan urinib ko‘ring.</translation> +<translation id="4177222230309051052">Barcha xatchoʻplarni oling</translation> <translation id="4181841719683918333">Tillar</translation> <translation id="4195643157523330669">Yangi varaqda ochish</translation> <translation id="4196597275619698563">Karta yaratish</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">Bunday sahifa topilmadi. Manzilning xatosiz kiritilganini tekshiring yoki Internetdan qidiring.</translation> <translation id="4988526792673242964">Sahifalar</translation> <translation id="5001388021414335527">Bu saytni shu yerda kuzatish</translation> +<translation id="500351648694011114">Yanada oson koʻring</translation> <translation id="5004416275253351869">Google hisobidagi harakatlarni kuzatish</translation> <translation id="5005141133360250920">Munosabat olindi</translation> <translation id="5005498671520578047">Parolni nusxalash</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">Oldingi yuklanma yakuni kutilmoqda…</translation> <translation id="5865733239029070421">Foydalanish statistikasi va ishdan chiqish hisobotlari avtomatik tarzda Google serverlariga yuborilsin</translation> <translation id="5869522115854928033">Saqlab olingan parollar</translation> +<translation id="5869789175361934029">Ishni boshqa qurilmada davom ettirish</translation> <translation id="587735546353481577">Saytni kuzatish uchun uni oching va Chrome menyusi orqali kuzatish tugmasini bosing.</translation> <translation id="5880748256563468367">Tasmani ochish</translation> <translation id="5884076754568147479">Google internetda ishlashingizni osonlashtirish uchun Assistent orqali kirilgan saytlarning URL manzillari va kontentlarini, shuningdek, soʻrovlarni ham oladi</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">Ulashish…</translation> <translation id="8912362522468806198">Google hisobi</translation> <translation id="8920114477895755567">Ota-ona haqidagi ma’lumotlar yetarli emas</translation> +<translation id="8921980840204105660">Boshqa qurilmalardan bukmarklarni olish uchun sinxronlang</translation> <translation id="8922289737868596582">Saytlarni oflayn ko‘rish uchun “Boshqa parametrlar” tugmasidan foydalanib, yuklab oling</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Batafsil<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> tayyor</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb index 3a5423d..1591680 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">Bạn đang theo dõi <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">Công cụ tìm kiếm</translation> <translation id="1513352483775369820">Dấu trang và lịch sử web</translation> +<translation id="1513814250881909472">Đồng bộ hoá để lấy thẻ từ thiết bị khác</translation> <translation id="1513858653616922153">Xóa mật khẩu</translation> <translation id="1518421282666914498">GIF biểu tượng cảm xúc <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">Hoạt động hôm nay</translation> @@ -170,6 +171,7 @@ <translation id="1928696683969751773">Bản cập nhật</translation> <translation id="19288952978244135">Mở lại Chrome.</translation> <translation id="1933845786846280168">Thẻ được chọn</translation> +<translation id="193571872656840963">Cảm ơn nhà sáng tạo này</translation> <translation id="1943432128510653496">Lưu mật khẩu</translation> <translation id="1952172573699511566">Các trang web sẽ hiển thị văn bản bằng ngôn ngữ ưu tiên của bạn khi có thể.</translation> <translation id="1959679933317802873">Đang chờ nội dung</translation> @@ -184,6 +186,7 @@ <translation id="1995884366040846621">Để tiếp tục, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> sẽ chia sẻ tên, địa chỉ email và ảnh hồ sơ của bạn với trang web này. Xem <ph name="BEGIN_LINK1" />chính sách quyền riêng tư<ph name="END_LINK1" /> của trang web này</translation> <translation id="2000419248597011803">Gửi một số cookie và nội dung tìm kiếm từ thanh địa chỉ cũng như hộp tìm kiếm tới công cụ tìm kiếm mặc định</translation> <translation id="200114059308480249">Bao gồm văn bản xung quanh trong các lượt tìm kiếm của Google?</translation> +<translation id="2011996512573319870">Đồng bộ hoá để nhận nội dung phù hợp nhất do Google cung cấp</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# tệp}other{# tệp}}</translation> <translation id="2020309681647789787">Bạn sẽ thấy nhật ký duyệt web trên tất cả thiết bị đã đồng bộ hoá của mình, để bạn có thể tiếp tục thực hiện những việc bạn đang làm</translation> <translation id="2021896219286479412">Kiểm soát trang toàn màn hình</translation> @@ -267,6 +270,7 @@ <translation id="2461822463642141190">Hiện tại</translation> <translation id="2472163211318554013">Đăng nhập để khai thác tối đa Chrome</translation> <translation id="247737702124049222">Tính năng mô tả hình ảnh đang bật</translation> +<translation id="2481251096908459228">Xem tin bài dành cho bạn</translation> <translation id="2482878487686419369">Thông báo</translation> <translation id="2485422356828889247">Gỡ cài đặt</translation> <translation id="2494974097748878569">Trợ lý Google trong Chrome</translation> @@ -308,6 +312,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# tệp âm thanh}other{# tệp âm thanh}}</translation> <translation id="265156376773362237">Tải trước tiêu chuẩn</translation> <translation id="2656405586795711023">Ứng dụng web</translation> +<translation id="2700802943130197326">Đồng bộ hoá để lấy mật khẩu, dấu trang và nội dung khác trên tất cả thiết bị khác của bạn.</translation> <translation id="2702516483241149200">Mới: chia sẻ một đường liên kết dẫn tới văn bản này</translation> <translation id="2704606927547763573">Đã sao chép</translation> <translation id="2707726405694321444">Làm mới trang</translation> @@ -569,6 +574,7 @@ <translation id="4162867837470729563">Danh sách các lựa chọn chia sẻ được mở trên toàn màn hình.</translation> <translation id="4165986682804962316">Cài đặt trang web</translation> <translation id="4170011742729630528">Dịch vụ không khả dụng; thử lại sau.</translation> +<translation id="4177222230309051052">Lấy tất cả dấu trang</translation> <translation id="4181841719683918333">Ngôn ngữ</translation> <translation id="4195643157523330669">Mở trong thẻ mới</translation> <translation id="4196597275619698563">Tạo thẻ</translation> @@ -724,6 +730,7 @@ <translation id="4987271110129728827">Không tìm được trang đó. Hãy kiểm tra lỗi chính tả hoặc thử tìm kiếm trên web.</translation> <translation id="4988526792673242964">Trang</translation> <translation id="5001388021414335527">Theo dõi trang web này tại đây</translation> +<translation id="500351648694011114">Duyệt xem dễ dàng hơn</translation> <translation id="5004416275253351869">Kiểm soát hoạt động trên Google</translation> <translation id="5005141133360250920">Đã xoá phản ứng</translation> <translation id="5005498671520578047">Sao chép mật khẩu</translation> @@ -875,6 +882,7 @@ <translation id="5864419784173784555">Đang chờ đến lần tải xuống tiếp theo…</translation> <translation id="5865733239029070421">Tự động gửi số liệu thống kê sử dụng và báo cáo sự cố cho Google</translation> <translation id="5869522115854928033">Mật khẩu đã lưu</translation> +<translation id="5869789175361934029">Tiếp tục từ thiết bị khác</translation> <translation id="587735546353481577">Để theo dõi một trang web, hãy truy cập vào trang web đó, mở trình đơn Chrome rồi nhấn vào Theo dõi.</translation> <translation id="5880748256563468367">Chuyển đến nguồn cấp dữ liệu</translation> <translation id="5884076754568147479">Để giúp bạn hoàn thành những việc cần làm, Google sẽ nhận URL và nội dung của các trang web mà bạn sử dụng Trợ lý, cũng như thông tin bạn gửi qua Trợ lý</translation> @@ -1448,6 +1456,7 @@ <translation id="8909135823018751308">Chia sẻ...</translation> <translation id="8912362522468806198">Tài khoản Google</translation> <translation id="8920114477895755567">Đang đợi thông tin chi tiết của phụ huynh.</translation> +<translation id="8921980840204105660">Đồng bộ hoá để lấy dấu trang từ thiết bị khác</translation> <translation id="8922289737868596582">Tải trang xuống từ nút Thêm tùy chọn để sử dụng ngoại tuyến</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" /> đã sẵn sàng</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index 272318bd9..ba11236 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">您已关注 <ph name="SITE_NAME" /></translation> <translation id="1506061864768559482">搜索引擎</translation> <translation id="1513352483775369820">书签和网络历史记录</translation> +<translation id="1513814250881909472">同步即可查看您在其他设备上打开的标签页</translation> <translation id="1513858653616922153">删除密码</translation> <translation id="1518421282666914498">表情符号 GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">今天曾有活动</translation> @@ -184,6 +185,7 @@ <translation id="1995884366040846621">如果您继续操作,<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> 便会将您的姓名、电子邮件地址和个人资料照片提供给此网站。不妨看看此网站的<ph name="BEGIN_LINK1" />隐私权政策<ph name="END_LINK1" />。</translation> <translation id="2000419248597011803">将一些 Cookie 以及地址栏和搜索框中的搜索字词发送给您的默认搜索引擎</translation> <translation id="200114059308480249">将上下文内容纳入到 Google 搜索查询中?</translation> +<translation id="2011996512573319870">同步即可获取 Google 提供的与您最相关的内容</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# 个文件}other{# 个文件}}</translation> <translation id="2020309681647789787">您将能够在所有已同步的设备上查看您的历史记录,以继续执行先前未完成的操作</translation> <translation id="2021896219286479412">全屏网站控件</translation> @@ -267,6 +269,7 @@ <translation id="2461822463642141190">电流</translation> <translation id="2472163211318554013">登录即可充分利用 Chrome</translation> <translation id="247737702124049222">“图片说明”功能已开启</translation> +<translation id="2481251096908459228">查看为您推荐的报道</translation> <translation id="2482878487686419369">通知</translation> <translation id="2485422356828889247">卸载</translation> <translation id="2494974097748878569">Chrome 中的 Google 助理</translation> @@ -308,6 +311,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# 个音频文件}other{# 个音频文件}}</translation> <translation id="265156376773362237">标准预加载</translation> <translation id="2656405586795711023">Web 应用</translation> +<translation id="2700802943130197326">同步即可获取您在所有其他设备上保存的密码、书签和其他设置。</translation> <translation id="2702516483241149200">新功能:可分享能够定位到此文本的链接</translation> <translation id="2704606927547763573">已复制</translation> <translation id="2707726405694321444">刷新网页</translation> @@ -569,6 +573,7 @@ <translation id="4162867837470729563">分享选项列表已全屏打开。</translation> <translation id="4165986682804962316">网站设置</translation> <translation id="4170011742729630528">此服务目前无法使用,请稍后再试。</translation> +<translation id="4177222230309051052">获取您的所有书签</translation> <translation id="4181841719683918333">语言</translation> <translation id="4195643157523330669">在新标签页中打开</translation> <translation id="4196597275619698563">创建卡片</translation> @@ -724,6 +729,7 @@ <translation id="4987271110129728827">找不到这个页面。请检查拼写,或尝试进行网页搜索。</translation> <translation id="4988526792673242964">页面</translation> <translation id="5001388021414335527">点击此处关注此网站</translation> +<translation id="500351648694011114">更轻松地浏览</translation> <translation id="5004416275253351869">Google 活动控件</translation> <translation id="5005141133360250920">已删除回应</translation> <translation id="5005498671520578047">复制密码</translation> @@ -875,6 +881,7 @@ <translation id="5864419784173784555">正在等待完成另一项下载…</translation> <translation id="5865733239029070421">自动将使用情况统计信息和崩溃报告发送至 Google</translation> <translation id="5869522115854928033">已保存的密码</translation> +<translation id="5869789175361934029">在此设备上继续浏览另一设备上的标签页</translation> <translation id="587735546353481577">若要关注某个网站,请转到该网站,打开 Chrome 菜单,然后点按“关注”。</translation> <translation id="5880748256563468367">转到 Feed</translation> <translation id="5884076754568147479">为了帮助您执行各种操作,Google 将会收到您使用 Google 助理时所在网站的网址和内容,以及您通过 Google 助理提交的信息</translation> @@ -1448,6 +1455,7 @@ <translation id="8909135823018751308">分享…</translation> <translation id="8912362522468806198">Google 帐号</translation> <translation id="8920114477895755567">正在等待获取家长的详细信息。</translation> +<translation id="8921980840204105660">同步即可获取您在其他设备上保存的书签</translation> <translation id="8922289737868596582">通过“更多选项”按钮下载网页以供离线查看</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation> <translation id="892496902842311796">可以使用<ph name="LANG" />了</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index 8c413a8..8069fd1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -106,6 +106,7 @@ <translation id="1493287004536771723">你正在追蹤「<ph name="SITE_NAME" />」</translation> <translation id="1506061864768559482">搜尋引擎</translation> <translation id="1513352483775369820">書籤與網頁記錄</translation> +<translation id="1513814250881909472">進行同步處理,取得你在其他裝置上的分頁</translation> <translation id="1513858653616922153">刪除密碼</translation> <translation id="1518421282666914498">表情符號 GIF <ph name="CURRENT_DATE_ISO" /></translation> <translation id="1521774566618522728">上次使用時間:今天</translation> @@ -183,6 +184,7 @@ <translation id="1995884366040846621">如要繼續,<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> 會將你的姓名、電子郵件地址和個人資料相片提供給這個網站。查看這個網站的《<ph name="BEGIN_LINK1" />隱私權政策<ph name="END_LINK1" />》。</translation> <translation id="2000419248597011803">將網址列和搜尋框中的部分 Cookie 和搜尋字詞傳送給你的預設搜尋引擎</translation> <translation id="200114059308480249">要在使用 Google 搜尋時納入前後文嗎?</translation> +<translation id="2011996512573319870">進行同步處理,取得 Google 提供的最相關內容</translation> <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# 個檔案}other{# 個檔案}}</translation> <translation id="2020309681647789787">你可以在所有已同步的裝置上查看歷史記錄,繼續執行先前的任何工作</translation> <translation id="2021896219286479412">全螢幕網站控制</translation> @@ -266,6 +268,7 @@ <translation id="2461822463642141190">電流</translation> <translation id="2472163211318554013">登入以充分運用 Chrome 的各項功能</translation> <translation id="247737702124049222">圖片說明功能已開啟</translation> +<translation id="2481251096908459228">查看為你推薦的報導</translation> <translation id="2482878487686419369">通知</translation> <translation id="2485422356828889247">解除安裝</translation> <translation id="2494974097748878569">Chrome 版 Google 助理</translation> @@ -307,6 +310,7 @@ <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# 個音訊檔案}other{# 個音訊檔案}}</translation> <translation id="265156376773362237">標準預先載入模式</translation> <translation id="2656405586795711023">網頁應用程式</translation> +<translation id="2700802943130197326">進行同步處理,取得你在其他裝置上的密碼、書籤和其他資料。</translation> <translation id="2702516483241149200">新功能:分享可跳至這段文字的連結</translation> <translation id="2704606927547763573">已複製</translation> <translation id="2707726405694321444">重新整理頁面</translation> @@ -568,6 +572,7 @@ <translation id="4162867837470729563">分享選項清單已開啟,顯示於整個畫面。</translation> <translation id="4165986682804962316">網站設定</translation> <translation id="4170011742729630528">服務無法使用,請稍後再試。</translation> +<translation id="4177222230309051052">取得所有書籤</translation> <translation id="4181841719683918333">語言</translation> <translation id="4195643157523330669">在新分頁中開啟</translation> <translation id="4196597275619698563">建立卡片</translation> @@ -723,6 +728,7 @@ <translation id="4987271110129728827">找不到該頁面。請檢查錯別字或嘗試執行網頁搜尋。</translation> <translation id="4988526792673242964">網頁</translation> <translation id="5001388021414335527">在這裡追蹤這個網站</translation> +<translation id="500351648694011114">瀏覽更輕鬆</translation> <translation id="5004416275253351869">Google 活動控制項</translation> <translation id="5005141133360250920">已刪除回應</translation> <translation id="5005498671520578047">複製密碼</translation> @@ -874,6 +880,7 @@ <translation id="5864419784173784555">正在等待其他下載程序完成…</translation> <translation id="5865733239029070421">自動將使用統計資料和當機報告傳送給 Google</translation> <translation id="5869522115854928033">已儲存的密碼</translation> +<translation id="5869789175361934029">透過其他裝置繼續瀏覽</translation> <translation id="587735546353481577">如要追蹤網站,只要前往該網站並開啟 Chrome 選單,然後輕觸 [追蹤] 即可。</translation> <translation id="5880748256563468367">前往動態饋給</translation> <translation id="5884076754568147479">為協助你完成工作,系統會將你使用 Google 助理時所在網站的網址與互動的內容,以及你透過 Google 助理提交的資訊,一併傳送給 Google。</translation> @@ -1445,6 +1452,7 @@ <translation id="8909135823018751308">分享…</translation> <translation id="8912362522468806198">Google 帳戶</translation> <translation id="8920114477895755567">尚未取得家長詳細資料。</translation> +<translation id="8921980840204105660">進行同步處理,取得你在其他裝置上的書籤</translation> <translation id="8922289737868596582">透過「更多選項」按鈕下載網頁,以便離線存取</translation> <translation id="8924575305646776101"><ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="892496902842311796"><ph name="LANG" />套件已下載完成</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index 84c0c19..b214d5cc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -171,6 +171,7 @@ <translation id="1928696683969751773">Izibuyekezo</translation> <translation id="19288952978244135">Phinda uvule i-Chrome.</translation> <translation id="1933845786846280168">Ithebhu ekhethiwe</translation> +<translation id="193571872656840963">Bonisa ukubonga kulo msunguli</translation> <translation id="1943432128510653496">Londoloza amaphasi</translation> <translation id="1952172573699511566">Amawebhusayithi azobonisa umbhalo ngolwimi lwakho oluthandayo, uma kwenzeka.</translation> <translation id="1959679933317802873">Ilinde okuqukethwe</translation>
diff --git a/chrome/browser/ui/ash/ambient/OWNERS b/chrome/browser/ui/ash/ambient/OWNERS index dd0c97af..574ed11 100644 --- a/chrome/browser/ui/ash/ambient/OWNERS +++ b/chrome/browser/ui/ash/ambient/OWNERS
@@ -1 +1 @@ -file://chromeos/assistant/OWNERS +file://chromeos/ash/components/assistant/OWNERS
diff --git a/chrome/browser/ui/ash/assistant/DIR_METADATA b/chrome/browser/ui/ash/assistant/DIR_METADATA index cfb0c371..5ba0efa 100644 --- a/chrome/browser/ui/ash/assistant/DIR_METADATA +++ b/chrome/browser/ui/ash/assistant/DIR_METADATA
@@ -1 +1 @@ -mixins: "//chromeos/assistant/COMMON_METADATA" +mixins: "//chromeos/ash/components/assistant/COMMON_METADATA"
diff --git a/chrome/browser/ui/ash/assistant/OWNERS b/chrome/browser/ui/ash/assistant/OWNERS index dd0c97af..574ed11 100644 --- a/chrome/browser/ui/ash/assistant/OWNERS +++ b/chrome/browser/ui/ash/assistant/OWNERS
@@ -1 +1 @@ -file://chromeos/assistant/OWNERS +file://chromeos/ash/components/assistant/OWNERS
diff --git a/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.h b/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.h index 27c746e..dae2e5e 100644 --- a/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.h +++ b/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.h
@@ -11,7 +11,7 @@ #include "ash/public/cpp/assistant/assistant_state.h" #include "base/scoped_observation.h" #include "chrome/browser/ui/ash/assistant/device_actions.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/services/assistant/public/cpp/assistant_browser_delegate.h" #include "chromeos/services/assistant/service.h" #include "components/session_manager/core/session_manager_observer.h"
diff --git a/chrome/browser/ui/ash/assistant/assistant_browsertest.cc b/chrome/browser/ui/ash/assistant/assistant_browsertest.cc index 30607f4a..2b67e3b58 100644 --- a/chrome/browser/ui/ash/assistant/assistant_browsertest.cc +++ b/chrome/browser/ui/ash/assistant/assistant_browsertest.cc
@@ -13,7 +13,7 @@ #include "base/time/time.h" #include "chrome/browser/ui/ash/assistant/assistant_test_mixin.h" #include "chrome/test/base/mixin_based_in_process_browser_test.h" -#include "chromeos/assistant/test_support/expect_utils.h" +#include "chromeos/ash/components/assistant/test_support/expect_utils.h" #include "chromeos/dbus/power_manager/backlight.pb.h" #include "chromeos/services/assistant/public/cpp/features.h" #include "chromeos/services/assistant/public/cpp/switches.h" @@ -44,7 +44,7 @@ } // namespace -using chromeos::assistant::test::ExpectResult; +using ::ash::assistant::test::ExpectResult; class AssistantBrowserTest : public MixinBasedInProcessBrowserTest { public:
diff --git a/chrome/browser/ui/ash/assistant/assistant_setup.cc b/chrome/browser/ui/ash/assistant/assistant_setup.cc index fe84c3af..74d324a8 100644 --- a/chrome/browser/ui/ash/assistant/assistant_setup.cc +++ b/chrome/browser/ui/ash/assistant/assistant_setup.cc
@@ -17,7 +17,7 @@ #include "chrome/browser/ui/settings_window_manager_chromeos.h" #include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.h" #include "chrome/common/webui_url_constants.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/services/assistant/public/cpp/assistant_prefs.h" #include "chromeos/services/assistant/public/cpp/assistant_service.h" #include "chromeos/services/assistant/public/proto/settings_ui.pb.h"
diff --git a/chrome/browser/ui/ash/session_controller_client_impl.cc b/chrome/browser/ui/ash/session_controller_client_impl.cc index 3f69c7f..3b0439beb 100644 --- a/chrome/browser/ui/ash/session_controller_client_impl.cc +++ b/chrome/browser/ui/ash/session_controller_client_impl.cc
@@ -38,7 +38,7 @@ #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/managed_ui.h" #include "chrome/common/pref_names.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/dbus/session_manager/session_manager_client.h" #include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index fe7fafc5..b2d070ac 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -232,7 +232,7 @@ #include "third_party/blink/public/mojom/frame/blocked_navigation_types.mojom.h" #include "third_party/blink/public/mojom/frame/frame.mojom.h" #include "third_party/blink/public/mojom/frame/fullscreen.mojom.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "third_party/blink/public/mojom/window_features/window_features.mojom.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/window_open_disposition.h"
diff --git a/chrome/browser/ui/passwords/bubble_controllers/move_to_account_store_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/move_to_account_store_bubble_controller.cc index 5b8bf3a..84ae495 100644 --- a/chrome/browser/ui/passwords/bubble_controllers/move_to_account_store_bubble_controller.cc +++ b/chrome/browser/ui/passwords/bubble_controllers/move_to_account_store_bubble_controller.cc
@@ -91,8 +91,8 @@ profiles::GetPlaceholderAvatarIconResourceID()); } return profiles::GetSizedAvatarIcon(account_icon, - /*is_rectangle=*/true, /*width=*/size, - /*height=*/size, profiles::SHAPE_CIRCLE); + /*width=*/size, /*height=*/size, + profiles::SHAPE_CIRCLE); } void MoveToAccountStoreBubbleController::ReportInteractions() {
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc index edacf00..bac3020 100644 --- a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc +++ b/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc
@@ -333,10 +333,8 @@ account_icon = ui::ResourceBundle::GetSharedInstance().GetImageNamed( profiles::GetPlaceholderAvatarIconResourceID()); } - return ui::ImageModel::FromImage( - profiles::GetSizedAvatarIcon(account_icon, - /*is_rectangle=*/true, icon_size_dip, - icon_size_dip, profiles::SHAPE_CIRCLE)); + return ui::ImageModel::FromImage(profiles::GetSizedAvatarIcon( + account_icon, icon_size_dip, icon_size_dip, profiles::SHAPE_CIRCLE)); } bool SaveUpdateBubbleController::DidAuthForAccountStoreOptInFail() const {
diff --git a/chrome/browser/ui/sync/browser_synced_tab_delegate.cc b/chrome/browser/ui/sync/browser_synced_tab_delegate.cc index 154932ed..883149f 100644 --- a/chrome/browser/ui/sync/browser_synced_tab_delegate.cc +++ b/chrome/browser/ui/sync/browser_synced_tab_delegate.cc
@@ -13,7 +13,7 @@ SetWebContents(web_contents); } -BrowserSyncedTabDelegate::~BrowserSyncedTabDelegate() {} +BrowserSyncedTabDelegate::~BrowserSyncedTabDelegate() = default; SessionID BrowserSyncedTabDelegate::GetWindowId() const { return sessions::SessionTabHelper::FromWebContents(web_contents())
diff --git a/chrome/browser/ui/sync/browser_synced_window_delegate.cc b/chrome/browser/ui/sync/browser_synced_window_delegate.cc index a6e3d0b..07800b3 100644 --- a/chrome/browser/ui/sync/browser_synced_window_delegate.cc +++ b/chrome/browser/ui/sync/browser_synced_window_delegate.cc
@@ -14,7 +14,7 @@ BrowserSyncedWindowDelegate::BrowserSyncedWindowDelegate(Browser* browser) : browser_(browser) {} -BrowserSyncedWindowDelegate::~BrowserSyncedWindowDelegate() {} +BrowserSyncedWindowDelegate::~BrowserSyncedWindowDelegate() = default; bool BrowserSyncedWindowDelegate::IsTabPinned( const sync_sessions::SyncedTabDelegate* tab) const {
diff --git a/chrome/browser/ui/sync/browser_synced_window_delegates_getter.cc b/chrome/browser/ui/sync/browser_synced_window_delegates_getter.cc index c07095db..3a36043 100644 --- a/chrome/browser/ui/sync/browser_synced_window_delegates_getter.cc +++ b/chrome/browser/ui/sync/browser_synced_window_delegates_getter.cc
@@ -15,7 +15,8 @@ BrowserSyncedWindowDelegatesGetter::BrowserSyncedWindowDelegatesGetter( Profile* profile) : profile_(profile) {} -BrowserSyncedWindowDelegatesGetter::~BrowserSyncedWindowDelegatesGetter() {} +BrowserSyncedWindowDelegatesGetter::~BrowserSyncedWindowDelegatesGetter() = + default; BrowserSyncedWindowDelegatesGetter::SyncedWindowDelegateMap BrowserSyncedWindowDelegatesGetter::GetSyncedWindowDelegates() {
diff --git a/chrome/browser/ui/sync/one_click_signin_links_delegate_impl.cc b/chrome/browser/ui/sync/one_click_signin_links_delegate_impl.cc index faaff83b..05803f85 100644 --- a/chrome/browser/ui/sync/one_click_signin_links_delegate_impl.cc +++ b/chrome/browser/ui/sync/one_click_signin_links_delegate_impl.cc
@@ -13,7 +13,7 @@ Browser* browser) : browser_(browser) {} -OneClickSigninLinksDelegateImpl::~OneClickSigninLinksDelegateImpl() {} +OneClickSigninLinksDelegateImpl::~OneClickSigninLinksDelegateImpl() = default; void OneClickSigninLinksDelegateImpl::OnLearnMoreLinkClicked(bool is_dialog) { NavigateParams params(browser_, GURL(chrome::kChromeSyncLearnMoreURL),
diff --git a/chrome/browser/ui/sync/profile_signin_confirmation_helper.cc b/chrome/browser/ui/sync/profile_signin_confirmation_helper.cc index c1740c7..5b9ef6f 100644 --- a/chrome/browser/ui/sync/profile_signin_confirmation_helper.cc +++ b/chrome/browser/ui/sync/profile_signin_confirmation_helper.cc
@@ -95,6 +95,7 @@ helper->CheckHasTypedURLs(); } -ProfileSigninConfirmationDelegate::~ProfileSigninConfirmationDelegate() {} +ProfileSigninConfirmationDelegate::~ProfileSigninConfirmationDelegate() = + default; } // namespace ui
diff --git a/chrome/browser/ui/sync/sync_promo_ui_unittest.cc b/chrome/browser/ui/sync/sync_promo_ui_unittest.cc index 2df9b583..a6bcdcf 100644 --- a/chrome/browser/ui/sync/sync_promo_ui_unittest.cc +++ b/chrome/browser/ui/sync/sync_promo_ui_unittest.cc
@@ -19,7 +19,7 @@ class SyncPromoUITest : public testing::Test { public: - SyncPromoUITest() {} + SyncPromoUITest() = default; SyncPromoUITest(const SyncPromoUITest&) = delete; SyncPromoUITest& operator=(const SyncPromoUITest&) = delete;
diff --git a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc index 5528c8b..f1e0ce7 100644 --- a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc +++ b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate.cc
@@ -53,7 +53,7 @@ TabContentsSyncedTabDelegate::TabContentsSyncedTabDelegate() : web_contents_(nullptr) {} -TabContentsSyncedTabDelegate::~TabContentsSyncedTabDelegate() {} +TabContentsSyncedTabDelegate::~TabContentsSyncedTabDelegate() = default; bool TabContentsSyncedTabDelegate::IsBeingDestroyed() const { return web_contents_->IsBeingDestroyed();
diff --git a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate_unittest.cc b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate_unittest.cc index 72e152e..86287670 100644 --- a/chrome/browser/ui/sync/tab_contents_synced_tab_delegate_unittest.cc +++ b/chrome/browser/ui/sync/tab_contents_synced_tab_delegate_unittest.cc
@@ -21,7 +21,7 @@ SetWebContents(web_contents); } - ~TestSyncedTabDelegate() override {} + ~TestSyncedTabDelegate() override = default; SessionID GetWindowId() const override { return SessionID::InvalidValue(); } SessionID GetSessionId() const override { return SessionID::InvalidValue(); }
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc index 1ec240d7..24c25d24 100644 --- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc +++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc
@@ -93,9 +93,10 @@ return ui::SHOW_STATE_FULLSCREEN; } - // Use kPreMinimizedShowStateKey in case a window is minimized/hidden. + // Use kRestoreShowStateKey to get the window restore show state in case a + // window is minimized/hidden. ui::WindowShowState restore_state = widget()->GetNativeWindow()->GetProperty( - aura::client::kPreMinimizedShowStateKey); + aura::client::kRestoreShowStateKey); return GetRestorableState(restore_state); }
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc index edaa9657..82a7dab 100644 --- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc +++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc
@@ -183,9 +183,10 @@ ui::WindowShowState ChromeNativeAppWindowViewsAuraAsh::GetRestoredState() const { - // Use kPreMinimizedShowStateKey in case a window is minimized/hidden. + // Use kRestoreShowStateKey to get the window restore show state in case a + // window is minimized/hidden. ui::WindowShowState restore_state = - GetNativeWindow()->GetProperty(aura::client::kPreMinimizedShowStateKey); + GetNativeWindow()->GetProperty(aura::client::kRestoreShowStateKey); bool is_fullscreen = false; if (GetNativeWindow()->GetProperty(ash::kRestoreBoundsOverrideKey)) { @@ -205,8 +206,7 @@ // Restore windows which were previously in immersive fullscreen to their // pre-fullscreen state. Restoring the window to a different fullscreen // type makes for a bad experience. - return GetNativeWindow()->GetProperty( - aura::client::kPreFullscreenShowStateKey); + return GetNativeWindow()->GetProperty(aura::client::kRestoreShowStateKey); } return ui::SHOW_STATE_FULLSCREEN; }
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc index 4bef580..57c94ef 100644 --- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc +++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc
@@ -203,12 +203,12 @@ ASSERT_TRUE(window()); app_window_->OSFullscreen(); - EXPECT_EQ(ui::SHOW_STATE_DEFAULT, window()->GetRestoredState()); + EXPECT_EQ(ui::SHOW_STATE_NORMAL, window()->GetRestoredState()); ash::ShellTestApi().SetTabletModeEnabledForTest(true); EXPECT_TRUE(window()->IsFullscreen()); - EXPECT_EQ(ui::SHOW_STATE_DEFAULT, window()->GetRestoredState()); + EXPECT_EQ(ui::SHOW_STATE_NORMAL, window()->GetRestoredState()); ash::ShellTestApi().SetTabletModeEnabledForTest(false); - EXPECT_EQ(ui::SHOW_STATE_DEFAULT, window()->GetRestoredState()); + EXPECT_EQ(ui::SHOW_STATE_NORMAL, window()->GetRestoredState()); CloseAppWindow(app_window_); } @@ -255,12 +255,12 @@ // fullscreen. EXPECT_FALSE(window()->IsFullscreen()); app_window_->OSFullscreen(); - EXPECT_EQ(ui::SHOW_STATE_DEFAULT, window()->GetRestoredState()); + EXPECT_EQ(ui::SHOW_STATE_NORMAL, window()->GetRestoredState()); EXPECT_TRUE(window()->IsFullscreen()); EXPECT_TRUE(IsImmersiveActive()); ash::ShellTestApi().SetTabletModeEnabledForTest(true); EXPECT_TRUE(window()->IsFullscreen()); - EXPECT_EQ(ui::SHOW_STATE_DEFAULT, window()->GetRestoredState()); + EXPECT_EQ(ui::SHOW_STATE_NORMAL, window()->GetRestoredState()); window()->Restore(); // Restoring a window inside tablet mode should deactivate fullscreen, but not
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc index c3f0332..dc669ed 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
@@ -90,9 +90,6 @@ #include "ui/views/widget/widget.h" #include "ui/views/window/non_client_view.h" #include "url/url_constants.h" -#if BUILDFLAG(ENABLE_DICE_SUPPORT) -#include "chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h" -#endif #if BUILDFLAG(IS_CHROMEOS_ASH) #include "ash/services/multidevice_setup/public/cpp/prefs.h" @@ -136,7 +133,7 @@ class SaveCardBubbleViewsFullFormBrowserTest : public SyncTest, - public AutofillManager::ObserverForTest, + public AutofillManager::Observer, public CreditCardSaveManager::ObserverForTest, public SaveCardBubbleControllerImpl::ObserverForTest { protected: @@ -221,7 +218,7 @@ ContentAutofillDriver::GetForRenderFrameHost( GetActiveWebContents()->GetMainFrame()) ->autofill_manager(); - autofill_manager->SetEventObserverForTesting(this); + autofill_manager->AddObserver(this); // Set up the fake geolocation data. geolocation_overrider_ = @@ -229,7 +226,7 @@ kFakeGeolocationLatitude, kFakeGeolocationLongitude); } - // AutofillManager::ObserverForTest: + // AutofillManager::Observer void OnFormParsed() override { if (event_waiter_) event_waiter_->OnEvent(DialogEvent::DYNAMIC_FORM_PARSED);
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc index a139b33..eb00a4d 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
@@ -26,8 +26,8 @@ #include "ui/base/models/dialog_model.h" #include "ui/views/bubble/bubble_dialog_model_host.h" -#if BUILDFLAG(ENABLE_DICE_SUPPORT) -#include "chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h" +#if !BUILDFLAG(IS_CHROMEOS_ASH) +#include "chrome/browser/ui/views/sync/bubble_sync_promo_view.h" #endif using base::UserMetricsAction; @@ -167,7 +167,7 @@ bool already_bookmarked) { if (bookmark_bubble_) return; -#if BUILDFLAG(ENABLE_DICE_SUPPORT) +#if !BUILDFLAG(IS_CHROMEOS_ASH) BubbleSyncPromoDelegate* const delegate_ptr = delegate.get(); #endif // !BUILDFLAG(IS_CHROMEOS_ASH) bookmarks::BookmarkModel* bookmark_model = @@ -196,7 +196,7 @@ l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_REMOVE_BOOKMARK), ui::DialogModelButton::Params().AddAccelerator( ui::Accelerator(ui::VKEY_R, ui::EF_ALT_DOWN))) - .AddDialogExtraButton( + .AddExtraButton( base::BindRepeating(&BookmarkBubbleDelegate::OnEditButton, base::Unretained(bubble_delegate)), l10n_util::GetStringUTF16(IDS_BOOKMARK_BUBBLE_OPTIONS), @@ -230,13 +230,13 @@ if (highlighted_button) bubble->SetHighlightedButton(highlighted_button); -#if BUILDFLAG(ENABLE_DICE_SUPPORT) +#if !BUILDFLAG(IS_CHROMEOS_ASH) if (SyncPromoUI::ShouldShowSyncPromo(profile)) { // TODO(pbos): Consider adding model support for footnotes so that this does // not need to be tied to views. // TODO(pbos): Consider updating ::SetFootnoteView so that it can resize the // widget to account for it. - bubble->SetFootnoteView(std::make_unique<DiceBubbleSyncPromoView>( + bubble->SetFootnoteView(std::make_unique<BubbleSyncPromoView>( profile, delegate_ptr, signin_metrics::AccessPoint::ACCESS_POINT_BOOKMARK_BUBBLE, IDS_BOOKMARK_DICE_PROMO_SYNC_MESSAGE,
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_browsertest.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_browsertest.cc index 329a4533..a0e64722 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_browsertest.cc
@@ -32,16 +32,16 @@ // DialogBrowserTest: void ShowUi(const std::string& name) override { -#if !BUILDFLAG(IS_CHROMEOS) +#if !BUILDFLAG(IS_CHROMEOS_ASH) signin::IdentityManager* identity_manager = IdentityManagerFactory::GetForProfile(browser()->profile()); - if (name == "bookmark_details") { - signin::ClearPrimaryAccount(identity_manager); - } else { - constexpr char kTestUserEmail[] = "testuser@gtest.com"; - signin::MakePrimaryAccountAvailable(identity_manager, kTestUserEmail, - signin::ConsentLevel::kSync); - } + + signin::ConsentLevel consent_level = (name == "bookmark_details_synced_off") + ? signin::ConsentLevel::kSignin + : signin::ConsentLevel::kSync; + constexpr char kTestUserEmail[] = "testuser@gtest.com"; + signin::MakePrimaryAccountAvailable(identity_manager, kTestUserEmail, + consent_level); #endif const GURL url = GURL("https://www.google.com"); @@ -57,15 +57,15 @@ } }; -// ChromeOS is always signed in. -#if !BUILDFLAG(IS_CHROMEOS) +// Ash always has sync ON +#if !BUILDFLAG(IS_CHROMEOS_ASH) IN_PROC_BROWSER_TEST_F(BookmarkBubbleViewBrowserTest, - InvokeUi_bookmark_details) { + InvokeUi_bookmark_details_synced_off) { ShowAndVerifyUi(); } #endif IN_PROC_BROWSER_TEST_F(BookmarkBubbleViewBrowserTest, - InvokeUi_bookmark_details_signed_in) { + InvokeUi_bookmark_details_synced_on) { ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_unittest.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_unittest.cc index 2cc8742..bb610f8 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_unittest.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view_unittest.cc
@@ -105,8 +105,6 @@ BookmarkBubbleView::bookmark_bubble()->GetFootnoteViewForTesting()); } -// TODO(https://crbug.com/1260291): Add support for Lacros. -#if !BUILDFLAG(IS_CHROMEOS_LACROS) // Verifies that the sync promo is displayed for a user that is not signed in. TEST_F(BookmarkBubbleViewTest, SyncPromoNotSignedIn) { CreateBubbleView(); @@ -118,4 +116,3 @@ EXPECT_TRUE(footnote); #endif } -#endif // !BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/ui/views/crostini/crostini_expired_container_warning_view.cc b/chrome/browser/ui/views/crostini/crostini_expired_container_warning_view.cc index cb574728..9cc0a521 100644 --- a/chrome/browser/ui/views/crostini/crostini_expired_container_warning_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_expired_container_warning_view.cc
@@ -20,17 +20,14 @@ } // namespace -void CrostiniExpiredContainerWarningView::Show( - Profile* profile, - std::vector<base::OnceClosure> callbacks) { +void CrostiniExpiredContainerWarningView::Show(Profile* profile, + base::OnceClosure callback) { if (g_crostini_expired_container_warning_view) { - for (auto&& callback : callbacks) { - g_crostini_expired_container_warning_view->callbacks_.push_back( - std::move(callback)); - } + g_crostini_expired_container_warning_view->callbacks_.push_back( + std::move(callback)); } else { g_crostini_expired_container_warning_view = - new CrostiniExpiredContainerWarningView(profile, std::move(callbacks)); + new CrostiniExpiredContainerWarningView(profile, std::move(callback)); CreateDialogWidget(g_crostini_expired_container_warning_view, nullptr, nullptr); } @@ -41,10 +38,10 @@ CrostiniExpiredContainerWarningView::CrostiniExpiredContainerWarningView( Profile* profile, - std::vector<base::OnceClosure> callbacks) - : profile_(profile), - callbacks_(std::move(callbacks)), - weak_ptr_factory_(this) { + base::OnceClosure callback) + : profile_(profile), weak_ptr_factory_(this) { + callbacks_.push_back(std::move(callback)); + // Make the dialog modal to force the user to make a decision. SetModalType(ui::MODAL_TYPE_SYSTEM);
diff --git a/chrome/browser/ui/views/crostini/crostini_expired_container_warning_view.h b/chrome/browser/ui/views/crostini/crostini_expired_container_warning_view.h index a728ae8..573c53d 100644 --- a/chrome/browser/ui/views/crostini/crostini_expired_container_warning_view.h +++ b/chrome/browser/ui/views/crostini/crostini_expired_container_warning_view.h
@@ -21,11 +21,11 @@ public: METADATA_HEADER(CrostiniExpiredContainerWarningView); - static void Show(Profile* profile, std::vector<base::OnceClosure> callbacks); + static void Show(Profile* profile, base::OnceClosure callback); private: CrostiniExpiredContainerWarningView(Profile* profile, - std::vector<base::OnceClosure> callbacks); + base::OnceClosure callback); ~CrostiniExpiredContainerWarningView() override; Profile* const profile_; // Not owned.
diff --git a/chrome/browser/ui/views/download/bubble/OWNERS b/chrome/browser/ui/views/download/bubble/OWNERS new file mode 100644 index 0000000..826d32a --- /dev/null +++ b/chrome/browser/ui/views/download/bubble/OWNERS
@@ -0,0 +1,2 @@ +bhatiarohit@google.com +xinghuilu@chromium.org \ No newline at end of file
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_security_view.cc b/chrome/browser/ui/views/download/bubble/download_bubble_security_view.cc index 30bebc4..99477a63 100644 --- a/chrome/browser/ui/views/download/bubble/download_bubble_security_view.cc +++ b/chrome/browser/ui/views/download/bubble/download_bubble_security_view.cc
@@ -219,6 +219,10 @@ if (ui_info.subpage_buttons.size() > 0) { first_button_ = GetButtonForCommand(ui_info.subpage_buttons[0].command); + first_button_->SetCallback(base::BindRepeating( + &DownloadBubbleSecurityView::ProcessButtonClick, base::Unretained(this), + ui_info.subpage_buttons[0].command, + /*is_first_button=*/true)); first_button_->SetText(ui_info.subpage_buttons[0].label); first_button_->SetProminent(ui_info.subpage_buttons[0].is_prominent); first_button_->SetEnabledTextColors(GetColorProvider()->GetColor( @@ -229,6 +233,10 @@ if (ui_info.subpage_buttons.size() > 1) { views::MdTextButton* second_button = GetButtonForCommand(ui_info.subpage_buttons[1].command); + second_button->SetCallback(base::BindRepeating( + &DownloadBubbleSecurityView::ProcessButtonClick, base::Unretained(this), + ui_info.subpage_buttons[1].command, + /*is_first_button=*/false)); second_button->SetText(ui_info.subpage_buttons[1].label); second_button->SetVisible(true); second_button->SetProminent(ui_info.subpage_buttons[1].is_prominent); @@ -263,17 +271,14 @@ gfx::Insets::VH(0, ChromeLayoutProvider::Get()->GetDistanceMetric( views::DISTANCE_RELATED_CONTROL_HORIZONTAL)); - auto add_button_for_command = [button_row, button_margin, - this](DownloadCommands::Command command) { - auto* button = - button_row->AddChildView(std::make_unique<views::MdTextButton>( - base::BindRepeating(&DownloadBubbleSecurityView::ProcessButtonClick, - base::Unretained(this), command, - /*is_first_button=*/true), - std::u16string())); - button->SetProperty(views::kMarginsKey, button_margin); - return button; - }; + auto add_button_for_command = + [button_row, button_margin](DownloadCommands::Command command) { + auto* button = + button_row->AddChildView(std::make_unique<views::MdTextButton>( + views::Button::PressedCallback(), std::u16string())); + button->SetProperty(views::kMarginsKey, button_margin); + return button; + }; // The buttons come in this order KEEP, DISCARD, BYPASS_DEEP_SCANNING, // DEEP_SCAN. Reorder buttons in runtime if required.
diff --git a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc index 1cf01d7..13d5f362 100644 --- a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc +++ b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc
@@ -86,7 +86,8 @@ int diameter = 2 * kProgressRingRadius; gfx::RectF ring_bounds(x, y, /*width=*/diameter, /*height=*/diameter); - if (icon_info.icon_state == download::DownloadIconState::kDeepScanning) { + if (icon_info.icon_state == download::DownloadIconState::kDeepScanning || + !progress_info.progress_certain) { if (!scanning_animation_.is_animating()) { scanning_animation_.Reset(); scanning_animation_.Show();
diff --git a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc index 65bc3c1..33d4d59 100644 --- a/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc +++ b/chrome/browser/ui/views/extensions/extension_installed_bubble_view.cc
@@ -40,8 +40,8 @@ #include "ui/views/controls/link.h" #include "ui/views/layout/box_layout.h" -#if BUILDFLAG(ENABLE_DICE_SUPPORT) -#include "chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h" +#if !BUILDFLAG(IS_CHROMEOS_ASH) +#include "chrome/browser/ui/views/sync/bubble_sync_promo_view.h" #endif namespace { @@ -80,11 +80,11 @@ return reference_view; } -#if BUILDFLAG(ENABLE_DICE_SUPPORT) +#if !BUILDFLAG(IS_CHROMEOS_ASH) std::unique_ptr<views::View> CreateSigninPromoView( Profile* profile, BubbleSyncPromoDelegate* delegate) { - return std::make_unique<DiceBubbleSyncPromoView>( + return std::make_unique<BubbleSyncPromoView>( profile, delegate, signin_metrics::AccessPoint::ACCESS_POINT_EXTENSION_INSTALL_BUBBLE, IDS_EXTENSION_INSTALLED_DICE_PROMO_SYNC_MESSAGE, @@ -170,8 +170,7 @@ model_(std::move(model)) { SetButtons(ui::DIALOG_BUTTON_NONE); if (model_->show_sign_in_promo()) { -#if BUILDFLAG(ENABLE_DICE_SUPPORT) - // Promo view requires DICE, so show it only if DICE support is enabled. +#if !BUILDFLAG(IS_CHROMEOS_ASH) SetFootnoteView(CreateSigninPromoView(browser->profile(), this)); #endif }
diff --git a/chrome/browser/ui/views/passwords/move_to_account_store_bubble_view.cc b/chrome/browser/ui/views/passwords/move_to_account_store_bubble_view.cc index 721ba99..1d94d53 100644 --- a/chrome/browser/ui/views/passwords/move_to_account_store_bubble_view.cc +++ b/chrome/browser/ui/views/passwords/move_to_account_store_bubble_view.cc
@@ -166,8 +166,8 @@ gfx::Image rounded_badge = profiles::GetSizedAvatarIcon( gfx::Image(GetBadge()), - /*is_rectangle=*/true, /*width=*/gfx::kFaviconSize, - /*height=*/gfx::kFaviconSize, profiles::SHAPE_CIRCLE); + /*width=*/gfx::kFaviconSize, /*height=*/gfx::kFaviconSize, + profiles::SHAPE_CIRCLE); gfx::ImageSkia rounded_badge_with_background_and_border = gfx::CanvasImageSource::MakeImageSkia<BackgroundBorderAdderImageSource>(
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc index 6b3366aa..65b2c01f 100644 --- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc +++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
@@ -324,7 +324,7 @@ case State::kSyncPaused: case State::kNormal: return ui::ImageModel::FromImage(profiles::GetSizedAvatarIcon( - delegate_->GetProfileAvatarImage(gaia_account_image, icon_size), true, + delegate_->GetProfileAvatarImage(gaia_account_image, icon_size), icon_size, icon_size, profiles::SHAPE_CIRCLE)); } NOTREACHED();
diff --git a/chrome/browser/ui/views/profiles/badged_profile_photo.cc b/chrome/browser/ui/views/profiles/badged_profile_photo.cc index ac6a13e..7b17252e 100644 --- a/chrome/browser/ui/views/profiles/badged_profile_photo.cc +++ b/chrome/browser/ui/views/profiles/badged_profile_photo.cc
@@ -120,7 +120,7 @@ // Create and add image view for profile icon. gfx::Image profile_photo_circular = profiles::GetSizedAvatarIcon( - profile_photo, true, kImageSize, kImageSize, profiles::SHAPE_CIRCLE); + profile_photo, kImageSize, kImageSize, profiles::SHAPE_CIRCLE); views::ImageView* profile_photo_view = badge_type == BADGE_TYPE_NONE ? new views::ImageView() : new CustomImageView();
diff --git a/chrome/browser/ui/views/profiles/profile_indicator_icon.cc b/chrome/browser/ui/views/profiles/profile_indicator_icon.cc index 7e77812..b689633 100644 --- a/chrome/browser/ui/views/profiles/profile_indicator_icon.cc +++ b/chrome/browser/ui/views/profiles/profile_indicator_icon.cc
@@ -21,9 +21,9 @@ if (old_height_ != height() || modified_icon_.isNull()) { old_height_ = height(); - modified_icon_ = *profiles::GetAvatarIconForTitleBar(base_icon_, false, - width(), height()) - .ToImageSkia(); + modified_icon_ = + *profiles::GetAvatarIconForTitleBar(base_icon_, width(), height()) + .ToImageSkia(); } // Scale the image to fit the width of the button.
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc index fa2b003a..4c2f944 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
@@ -62,7 +62,6 @@ #if !BUILDFLAG(IS_CHROMEOS_ASH) #include "chrome/browser/ui/views/profiles/profile_menu_view.h" -#include "chrome/browser/ui/views/sync/dice_signin_button_view.h" #endif namespace {
diff --git a/chrome/browser/ui/views/sync/bubble_sync_promo_signin_button_view.cc b/chrome/browser/ui/views/sync/bubble_sync_promo_signin_button_view.cc new file mode 100644 index 0000000..e855016 --- /dev/null +++ b/chrome/browser/ui/views/sync/bubble_sync_promo_signin_button_view.cc
@@ -0,0 +1,74 @@ +// 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. + +#include "chrome/browser/ui/views/sync/bubble_sync_promo_signin_button_view.h" + +#include <memory> +#include <string> + +#include "base/strings/utf_string_conversions.h" +#include "chrome/app/vector_icons/vector_icons.h" +#include "chrome/browser/profiles/profile_avatar_icon_util.h" +#include "chrome/browser/ui/views/hover_button.h" +#include "chrome/browser/ui/views/profiles/badged_profile_photo.h" +#include "chrome/grit/generated_resources.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/gfx/canvas.h" +#include "ui/views/border.h" +#include "ui/views/controls/button/md_text_button.h" +#include "ui/views/layout/box_layout.h" + +BubbleSyncPromoSigninButtonView::BubbleSyncPromoSigninButtonView( + views::Button::PressedCallback callback, + bool prominent) + : account_(absl::nullopt) { + views::Builder<BubbleSyncPromoSigninButtonView>(this) + .SetUseDefaultFillLayout(true) + .AddChild( + // Regular MD text button when there is no account. + views::Builder<views::MdTextButton>() + .SetCallback(std::move(callback)) + .SetText( + l10n_util::GetStringUTF16(IDS_PROFILES_DICE_SIGNIN_BUTTON)) + .SetProminent(prominent)) + .BuildChildren(); +} + +BubbleSyncPromoSigninButtonView::BubbleSyncPromoSigninButtonView( + const AccountInfo& account, + const gfx::Image& account_icon, + views::Button::PressedCallback callback, + bool use_account_name_as_title) + : account_(account) { + DCHECK(!account_icon.IsEmpty()); + auto card_title = + use_account_name_as_title + ? base::UTF8ToUTF16(account.full_name) + : l10n_util::GetStringUTF16(IDS_PROFILES_DICE_NOT_SYNCING_TITLE); + + views::Builder<BubbleSyncPromoSigninButtonView>(this) + .SetLayoutManager(std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kVertical, gfx::Insets(), 16)) + .AddChildren( + views::Builder<HoverButton>( + std::make_unique<HoverButton>( + views::Button::PressedCallback(), + std::make_unique<BadgedProfilePhoto>( + BadgedProfilePhoto::BADGE_TYPE_SYNC_OFF, account_icon), + card_title, base::ASCIIToUTF16(account_->email))) + .SetBorder(std::unique_ptr<views::Border>(nullptr)) + .SetEnabled(false), + views::Builder<views::MdTextButton>() + .SetCallback(std::move(callback)) + .SetText( + l10n_util::GetStringUTF16(IDS_PROFILES_DICE_SIGNIN_BUTTON)) + .SetProminent(true)) + .BuildChildren(); +} + +BubbleSyncPromoSigninButtonView::~BubbleSyncPromoSigninButtonView() = default; + +BEGIN_METADATA(BubbleSyncPromoSigninButtonView, views::View) +END_METADATA
diff --git a/chrome/browser/ui/views/sync/bubble_sync_promo_signin_button_view.h b/chrome/browser/ui/views/sync/bubble_sync_promo_signin_button_view.h new file mode 100644 index 0000000..e97f1da --- /dev/null +++ b/chrome/browser/ui/views/sync/bubble_sync_promo_signin_button_view.h
@@ -0,0 +1,54 @@ +// 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 CHROME_BROWSER_UI_VIEWS_SYNC_BUBBLE_SYNC_PROMO_SIGNIN_BUTTON_VIEW_H_ +#define CHROME_BROWSER_UI_VIEWS_SYNC_BUBBLE_SYNC_PROMO_SIGNIN_BUTTON_VIEW_H_ + +#include "base/memory/raw_ptr.h" +#include "chrome/browser/ui/views/hover_button.h" +#include "components/signin/public/identity_manager/account_info.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/base/metadata/metadata_header_macros.h" +#include "ui/views/controls/button/label_button.h" +#include "ui/views/metadata/view_factory.h" +#include "ui/views/view.h" + +// Sign-in button view used by Sync promos that presents the +// account information (avatar image and email) and allows the user to +// sign in to Chrome or to enable sync. +class BubbleSyncPromoSigninButtonView : public views::View { + public: + METADATA_HEADER(BubbleSyncPromoSigninButtonView); + // Create a non-personalized sign-in button. + // |callback| is called every time the user interacts with this button. + // The button is prominent by default but can be made non-prominent by setting + // |prominent| to false. + explicit BubbleSyncPromoSigninButtonView( + views::Button::PressedCallback callback, + bool prominent = true); + + // Creates a sign-in button personalized with the data from |account|. + // |callback| is called every time the user interacts with this button. + BubbleSyncPromoSigninButtonView(const AccountInfo& account_info, + const gfx::Image& account_icon, + views::Button::PressedCallback callback, + bool use_account_name_as_title = false); + BubbleSyncPromoSigninButtonView(const BubbleSyncPromoSigninButtonView&) = + delete; + BubbleSyncPromoSigninButtonView& operator=( + const BubbleSyncPromoSigninButtonView&) = delete; + ~BubbleSyncPromoSigninButtonView() override; + + absl::optional<AccountInfo> account() const { return account_; } + + private: + const absl::optional<AccountInfo> account_; +}; + +BEGIN_VIEW_BUILDER(, BubbleSyncPromoSigninButtonView, views::View) +END_VIEW_BUILDER + +DEFINE_VIEW_BUILDER(, BubbleSyncPromoSigninButtonView) + +#endif // CHROME_BROWSER_UI_VIEWS_SYNC_BUBBLE_SYNC_PROMO_SIGNIN_BUTTON_VIEW_H_
diff --git a/chrome/browser/ui/views/sync/bubble_sync_promo_view.cc b/chrome/browser/ui/views/sync/bubble_sync_promo_view.cc new file mode 100644 index 0000000..87aae0b --- /dev/null +++ b/chrome/browser/ui/views/sync/bubble_sync_promo_view.cc
@@ -0,0 +1,90 @@ +// 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. + +#include "chrome/browser/ui/views/sync/bubble_sync_promo_view.h" + +#include <utility> + +#include "base/bind.h" +#include "base/check.h" +#include "base/notreached.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_avatar_icon_util.h" +#include "chrome/browser/signin/account_consistency_mode_manager.h" +#include "chrome/browser/signin/signin_ui_util.h" +#include "chrome/browser/ui/views/chrome_layout_provider.h" +#include "chrome/browser/ui/views/chrome_typography.h" +#include "chrome/browser/ui/views/sync/bubble_sync_promo_signin_button_view.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/views/controls/label.h" +#include "ui/views/layout/box_layout.h" + +BubbleSyncPromoView::BubbleSyncPromoView( + Profile* profile, + BubbleSyncPromoDelegate* delegate, + signin_metrics::AccessPoint access_point, + int accounts_promo_message_resource_id, + bool signin_button_prominent, + int text_style) + : delegate_(delegate) { + DCHECK(!profile->IsGuestSession()); + AccountInfo account; + // Signin promos can be shown in incognito, they use an empty account list. + if (!profile->IsOffTheRecord()) + account = signin_ui_util::GetSingleAccountForPromos(profile); + + // Always show the accounts promo message for now. + const int title_resource_id = accounts_promo_message_resource_id; + + std::unique_ptr<views::BoxLayout> layout = std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kVertical, gfx::Insets(), + ChromeLayoutProvider::Get() + ->GetDialogInsetsForContentType(views::DialogContentType::kText, + views::DialogContentType::kText) + .bottom()); + SetLayoutManager(std::move(layout)); + + if (title_resource_id) { + std::u16string title_text = l10n_util::GetStringUTF16(title_resource_id); + views::Label* title = new views::Label( + title_text, views::style::CONTEXT_DIALOG_BODY_TEXT, text_style); + title->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); + title->SetMultiLine(true); + AddChildView(title); + } + + views::Button::PressedCallback callback = base::BindRepeating( + &BubbleSyncPromoView::EnableSync, base::Unretained(this)); + + if (account.IsEmpty()) { + signin_button_view_ = + AddChildView(std::make_unique<BubbleSyncPromoSigninButtonView>( + std::move(callback), signin_button_prominent)); + } else { + gfx::Image account_icon = account.account_image; + if (account_icon.IsEmpty()) { + account_icon = ui::ResourceBundle::GetSharedInstance().GetImageNamed( + profiles::GetPlaceholderAvatarIconResourceID()); + } + signin_button_view_ = + AddChildView(std::make_unique<BubbleSyncPromoSigninButtonView>( + account, account_icon, std::move(callback), + /*use_account_name_as_title=*/true)); + } + signin_metrics::RecordSigninImpressionUserActionForAccessPoint(access_point); + signin_metrics::RecordSigninImpressionWithAccountUserActionForAccessPoint( + access_point, !account.IsEmpty() /* with_account */); +} + +BubbleSyncPromoView::~BubbleSyncPromoView() = default; + +void BubbleSyncPromoView::EnableSync() { + absl::optional<AccountInfo> account = signin_button_view_->account(); + delegate_->OnEnableSync(account.value_or(AccountInfo())); +} + +BEGIN_METADATA(BubbleSyncPromoView, views::View) +END_METADATA
diff --git a/chrome/browser/ui/views/sync/bubble_sync_promo_view.h b/chrome/browser/ui/views/sync/bubble_sync_promo_view.h new file mode 100644 index 0000000..d27c88e --- /dev/null +++ b/chrome/browser/ui/views/sync/bubble_sync_promo_view.h
@@ -0,0 +1,57 @@ +// 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 CHROME_BROWSER_UI_VIEWS_SYNC_BUBBLE_SYNC_PROMO_VIEW_H_ +#define CHROME_BROWSER_UI_VIEWS_SYNC_BUBBLE_SYNC_PROMO_VIEW_H_ + +#include "base/memory/raw_ptr.h" +#include "chrome/browser/ui/sync/bubble_sync_promo_delegate.h" +#include "components/signin/public/base/signin_metrics.h" +#include "ui/base/metadata/metadata_header_macros.h" +#include "ui/views/style/typography.h" +#include "ui/views/view.h" + +class Profile; +class BubbleSyncPromoSigninButtonView; + +// A personalized sync promo used when Desktop Identity Consistency is enabled. +// Its display a message informing the user the benefits of enabling sync and +// a button that allows the user to enable sync. +// The button has 2 different displays: +// * If Chrome has no accounts, then the promo button is a MD button allowing +// the user to sign in to Chrome. +// * If Chrome has at least one account, then the promo button is personalized +// with the user full name and avatar icon and allows the user to enable sync. +class BubbleSyncPromoView : public views::View { + public: + METADATA_HEADER(BubbleSyncPromoView); + // Creates a personalized sync promo view. + // |delegate| is not owned by BubbleSyncPromoView. + // The promo message is set to |accounts_promo_message_resource_id| when + // Chrome has at least one account. + // If |signin_button_prominent| is false and a non-personalized signin button + // is shown, the button is set to non-prominent. Otherwise the button remains + // prominent. + // The promo message is set in a font given by |text_style|. It is defaulted + // to a primary style font. + BubbleSyncPromoView(Profile* profile, + BubbleSyncPromoDelegate* delegate, + signin_metrics::AccessPoint access_point, + int accounts_promo_message_resource_id = 0, + bool signin_button_prominent = true, + int text_style = views::style::STYLE_PRIMARY); + BubbleSyncPromoView(const BubbleSyncPromoView&) = delete; + BubbleSyncPromoView& operator=(const BubbleSyncPromoView&) = delete; + ~BubbleSyncPromoView() override; + + private: + // Used to enable sync in the DiceAccountsMenu and when |signin_button_| is + // pressed. + void EnableSync(); + + // Delegate, to handle clicks on the sign-in buttons. + raw_ptr<BubbleSyncPromoDelegate> delegate_; + raw_ptr<BubbleSyncPromoSigninButtonView> signin_button_view_ = nullptr; +}; +#endif // CHROME_BROWSER_UI_VIEWS_SYNC_BUBBLE_SYNC_PROMO_VIEW_H_
diff --git a/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.cc b/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.cc deleted file mode 100644 index db068826..0000000 --- a/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.cc +++ /dev/null
@@ -1,92 +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. - -#include "chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h" - -#include <utility> - -#include "base/bind.h" -#include "base/check.h" -#include "base/notreached.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/profiles/profile_avatar_icon_util.h" -#include "chrome/browser/signin/account_consistency_mode_manager.h" -#include "chrome/browser/signin/signin_ui_util.h" -#include "chrome/browser/ui/views/chrome_layout_provider.h" -#include "chrome/browser/ui/views/chrome_typography.h" -#include "chrome/browser/ui/views/sync/dice_signin_button_view.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/base/resource/resource_bundle.h" -#include "ui/views/controls/label.h" -#include "ui/views/layout/box_layout.h" - -DiceBubbleSyncPromoView::DiceBubbleSyncPromoView( - Profile* profile, - BubbleSyncPromoDelegate* delegate, - signin_metrics::AccessPoint access_point, - int accounts_promo_message_resource_id, - bool signin_button_prominent, - int text_style) - : delegate_(delegate) { - DCHECK(!profile->IsGuestSession()); - AccountInfo account; - // Signin promos can be shown in incognito, they use an empty account list. - if (!profile->IsOffTheRecord()) - account = signin_ui_util::GetSingleAccountForDicePromos(profile); - - // Always show the accounts promo message for now. - const int title_resource_id = accounts_promo_message_resource_id; - - std::unique_ptr<views::BoxLayout> layout = std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kVertical, gfx::Insets(), - ChromeLayoutProvider::Get() - ->GetDialogInsetsForContentType(views::DialogContentType::kText, - views::DialogContentType::kText) - .bottom()); - SetLayoutManager(std::move(layout)); - - if (title_resource_id) { - std::u16string title_text = l10n_util::GetStringUTF16(title_resource_id); - views::Label* title = new views::Label( - title_text, views::style::CONTEXT_DIALOG_BODY_TEXT, text_style); - title->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); - title->SetMultiLine(true); - AddChildView(title); - } - - views::Button::PressedCallback callback = base::BindRepeating( - &DiceBubbleSyncPromoView::EnableSync, base::Unretained(this)); - - if (account.IsEmpty()) { - signin_button_view_ = AddChildView(std::make_unique<DiceSigninButtonView>( - std::move(callback), signin_button_prominent)); - } else { - gfx::Image account_icon = account.account_image; - if (account_icon.IsEmpty()) { - account_icon = ui::ResourceBundle::GetSharedInstance().GetImageNamed( - profiles::GetPlaceholderAvatarIconResourceID()); - } - signin_button_view_ = AddChildView(std::make_unique<DiceSigninButtonView>( - account, account_icon, std::move(callback), - /*use_account_name_as_title=*/true)); - } - signin_metrics::RecordSigninImpressionUserActionForAccessPoint(access_point); - signin_metrics::RecordSigninImpressionWithAccountUserActionForAccessPoint( - access_point, !account.IsEmpty() /* with_account */); -} - -DiceBubbleSyncPromoView::~DiceBubbleSyncPromoView() = default; - -views::View* DiceBubbleSyncPromoView::GetSigninButtonForTesting() { - return signin_button_view_ ? signin_button_view_->signin_button() : nullptr; -} - -void DiceBubbleSyncPromoView::EnableSync() { - absl::optional<AccountInfo> account = signin_button_view_->account(); - delegate_->OnEnableSync(account.value_or(AccountInfo())); -} - -BEGIN_METADATA(DiceBubbleSyncPromoView, views::View) -END_METADATA
diff --git a/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h b/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h deleted file mode 100644 index 68ad606..0000000 --- a/chrome/browser/ui/views/sync/dice_bubble_sync_promo_view.h +++ /dev/null
@@ -1,60 +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 CHROME_BROWSER_UI_VIEWS_SYNC_DICE_BUBBLE_SYNC_PROMO_VIEW_H_ -#define CHROME_BROWSER_UI_VIEWS_SYNC_DICE_BUBBLE_SYNC_PROMO_VIEW_H_ - -#include "base/memory/raw_ptr.h" -#include "chrome/browser/ui/sync/bubble_sync_promo_delegate.h" -#include "components/signin/public/base/signin_metrics.h" -#include "ui/base/metadata/metadata_header_macros.h" -#include "ui/views/style/typography.h" -#include "ui/views/view.h" - -class Profile; -class DiceSigninButtonView; - -// A personalized sync promo used when Desktop Identity Consistency is enabled. -// Its display a message informing the user the benefits of enabling sync and -// a button that allows the user to enable sync. -// The button has 2 different displays: -// * If Chrome has no accounts, then the promo button is a MD button allowing -// the user to sign in to Chrome. -// * If Chrome has at least one account, then the promo button is personalized -// with the user full name and avatar icon and allows the user to enable sync. -class DiceBubbleSyncPromoView : public views::View { - public: - METADATA_HEADER(DiceBubbleSyncPromoView); - // Creates a personalized sync promo view. - // |delegate| is not owned by DiceBubbleSyncPromoView. - // The promo message is set to |accounts_promo_message_resource_id| when - // Chrome has at least one account. - // If |signin_button_prominent| is false and a non-personalized signin button - // is shown, the button is set to non-prominent. Otherwise the button remains - // prominent. - // The promo message is set in a font given by |text_style|. It is defaulted - // to a primary style font. - DiceBubbleSyncPromoView(Profile* profile, - BubbleSyncPromoDelegate* delegate, - signin_metrics::AccessPoint access_point, - int accounts_promo_message_resource_id = 0, - bool signin_button_prominent = true, - int text_style = views::style::STYLE_PRIMARY); - DiceBubbleSyncPromoView(const DiceBubbleSyncPromoView&) = delete; - DiceBubbleSyncPromoView& operator=(const DiceBubbleSyncPromoView&) = delete; - ~DiceBubbleSyncPromoView() override; - - // Returns the sign-in button. - views::View* GetSigninButtonForTesting(); - - private: - // Used to enable sync in the DiceAccountsMenu and when |signin_button_| is - // pressed. - void EnableSync(); - - // Delegate, to handle clicks on the sign-in buttons. - raw_ptr<BubbleSyncPromoDelegate> delegate_; - raw_ptr<DiceSigninButtonView> signin_button_view_ = nullptr; -}; -#endif // CHROME_BROWSER_UI_VIEWS_SYNC_DICE_BUBBLE_SYNC_PROMO_VIEW_H_
diff --git a/chrome/browser/ui/views/sync/dice_signin_button_view.cc b/chrome/browser/ui/views/sync/dice_signin_button_view.cc deleted file mode 100644 index 8a4f29ad..0000000 --- a/chrome/browser/ui/views/sync/dice_signin_button_view.cc +++ /dev/null
@@ -1,74 +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. - -#include "chrome/browser/ui/views/sync/dice_signin_button_view.h" - -#include <memory> -#include <string> - -#include "base/strings/utf_string_conversions.h" -#include "chrome/app/vector_icons/vector_icons.h" -#include "chrome/browser/profiles/profile_avatar_icon_util.h" -#include "chrome/browser/ui/views/hover_button.h" -#include "chrome/browser/ui/views/profiles/badged_profile_photo.h" -#include "chrome/grit/generated_resources.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/gfx/canvas.h" -#include "ui/views/border.h" -#include "ui/views/controls/button/md_text_button.h" -#include "ui/views/layout/box_layout.h" - -DiceSigninButtonView::DiceSigninButtonView( - views::Button::PressedCallback callback, - bool prominent) - : account_(absl::nullopt) { - views::Builder<DiceSigninButtonView>(this) - .SetUseDefaultFillLayout(true) - .AddChild( - // Regular MD text button when there is no account. - views::Builder<views::MdTextButton>() - .SetCallback(std::move(callback)) - .SetText( - l10n_util::GetStringUTF16(IDS_PROFILES_DICE_SIGNIN_BUTTON)) - .SetProminent(prominent)) - .BuildChildren(); -} - -DiceSigninButtonView::DiceSigninButtonView( - const AccountInfo& account, - const gfx::Image& account_icon, - views::Button::PressedCallback callback, - bool use_account_name_as_title) - : account_(account) { - DCHECK(!account_icon.IsEmpty()); - auto card_title = - use_account_name_as_title - ? base::UTF8ToUTF16(account.full_name) - : l10n_util::GetStringUTF16(IDS_PROFILES_DICE_NOT_SYNCING_TITLE); - - views::Builder<DiceSigninButtonView>(this) - .SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kVertical, gfx::Insets(), 16)) - .AddChildren( - views::Builder<HoverButton>( - std::make_unique<HoverButton>( - views::Button::PressedCallback(), - std::make_unique<BadgedProfilePhoto>( - BadgedProfilePhoto::BADGE_TYPE_SYNC_OFF, account_icon), - card_title, base::ASCIIToUTF16(account_->email))) - .SetBorder(std::unique_ptr<views::Border>(nullptr)) - .SetEnabled(false), - views::Builder<views::MdTextButton>() - .SetCallback(std::move(callback)) - .SetText( - l10n_util::GetStringUTF16(IDS_PROFILES_DICE_SIGNIN_BUTTON)) - .SetProminent(true)) - .BuildChildren(); -} - -DiceSigninButtonView::~DiceSigninButtonView() = default; - -BEGIN_METADATA(DiceSigninButtonView, views::View) -END_METADATA
diff --git a/chrome/browser/ui/views/sync/dice_signin_button_view.h b/chrome/browser/ui/views/sync/dice_signin_button_view.h deleted file mode 100644 index 1351df5..0000000 --- a/chrome/browser/ui/views/sync/dice_signin_button_view.h +++ /dev/null
@@ -1,57 +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 CHROME_BROWSER_UI_VIEWS_SYNC_DICE_SIGNIN_BUTTON_VIEW_H_ -#define CHROME_BROWSER_UI_VIEWS_SYNC_DICE_SIGNIN_BUTTON_VIEW_H_ - -#include "base/memory/raw_ptr.h" -#include "chrome/browser/ui/views/hover_button.h" -#include "components/signin/public/identity_manager/account_info.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "ui/base/metadata/metadata_header_macros.h" -#include "ui/views/controls/button/label_button.h" -#include "ui/views/metadata/view_factory.h" -#include "ui/views/view.h" - -// Sign-in button view used for Desktop Identity Consistency that presents the -// account information (avatar image and email) and allows the user to -// sign in to Chrome or to enable sync. -// -// The button also presents on the right hand side a drown-down arrow button -// that the user can interact with. -class DiceSigninButtonView : public views::View { - public: - METADATA_HEADER(DiceSigninButtonView); - // Create a non-personalized sign-in button. - // |callback| is called every time the user interacts with this button. - // The button is prominent by default but can be made non-prominent by setting - // |prominent| to false. - explicit DiceSigninButtonView(views::Button::PressedCallback callback, - bool prominent = true); - - // Creates a sign-in button personalized with the data from |account|. - // |callback| is called every time the user interacts with this button. - DiceSigninButtonView(const AccountInfo& account_info, - const gfx::Image& account_icon, - views::Button::PressedCallback callback, - bool use_account_name_as_title = false); - DiceSigninButtonView(const DiceSigninButtonView&) = delete; - DiceSigninButtonView& operator=(const DiceSigninButtonView&) = delete; - ~DiceSigninButtonView() override; - - views::LabelButton* signin_button() const { return signin_button_; } - absl::optional<AccountInfo> account() const { return account_; } - - private: - raw_ptr<views::LabelButton> signin_button_ = nullptr; - - const absl::optional<AccountInfo> account_; -}; - -BEGIN_VIEW_BUILDER(, DiceSigninButtonView, views::View) -END_VIEW_BUILDER - -DEFINE_VIEW_BUILDER(, DiceSigninButtonView) - -#endif // CHROME_BROWSER_UI_VIEWS_SYNC_DICE_SIGNIN_BUTTON_VIEW_H_
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.cc b/chrome/browser/ui/views/toolbar/toolbar_view.cc index b5ba130e..c7e1bf3 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_view.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_view.cc
@@ -525,8 +525,7 @@ GetPageActionIconView(PageActionIconType::kBookmarkStar); std::unique_ptr<BubbleSyncPromoDelegate> delegate; -#if BUILDFLAG(ENABLE_DICE_SUPPORT) - // BookmarkBubbleSignInDelegate requires DICE. +#if !BUILDFLAG(IS_CHROMEOS_ASH) delegate = std::make_unique<BookmarkBubbleSignInDelegate>(browser_); #endif BookmarkBubbleView::ShowBubble(anchor_view, bookmark_star_icon, observer,
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc index 4373c49d..fb7f87f4 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc
@@ -200,9 +200,10 @@ helper_.CheckWindowCreated(); } +// TODO(crbug.com/1323445): Flaky. IN_PROC_BROWSER_TEST_F( WebAppIntegrationBrowserTest, - WebAppIntegration_30SiteA_24_12SiteA_7SiteA_32SiteA_7SiteA_12SiteA_34SiteA_24) { + DISABLED_WebAppIntegration_30SiteA_24_12SiteA_7SiteA_32SiteA_7SiteA_12SiteA_34SiteA_24) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported.
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc index cb4891a6..9f91f75 100644 --- a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc +++ b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
@@ -420,8 +420,7 @@ letter, kDesiredAvatarSize)); } else { avatar = ui::ImageModel::FromImage(profiles::GetSizedAvatarIcon( - image, /*is_rectangle=*/true, kDesiredAvatarSize, kDesiredAvatarSize, - profiles::SHAPE_CIRCLE)); + image, kDesiredAvatarSize, kDesiredAvatarSize, profiles::SHAPE_CIRCLE)); } image_view->SetImage(avatar); }
diff --git a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc index 7e321bbd..ed1eb96a 100644 --- a/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc +++ b/chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.cc
@@ -19,15 +19,11 @@ // static int AccountSelectionView::GetBrandIconMinimumSize() { - // TODO(crbug.com/1311482): check that this hardcoded value makes sense even - // on high-dpi desktops. return 20; } // static int AccountSelectionView::GetBrandIconIdealSize() { - // TODO(crbug.com/1311482): check that this hardcoded value makes sense even - // on high-dpi desktops. return 20; }
diff --git a/chrome/browser/ui/web_applications/web_app_dark_mode_browsertest.cc b/chrome/browser/ui/web_applications/web_app_dark_mode_browsertest.cc index cecbbcd7..dc523ed 100644 --- a/chrome/browser/ui/web_applications/web_app_dark_mode_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_dark_mode_browsertest.cc
@@ -17,7 +17,7 @@ #include "content/public/test/browser_test.h" #include "content/public/test/url_loader_interceptor.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/native_theme/native_theme.h"
diff --git a/chrome/browser/ui/web_applications/web_app_handle_links_browsertest.cc b/chrome/browser/ui/web_applications/web_app_handle_links_browsertest.cc index f003812..7269591 100644 --- a/chrome/browser/ui/web_applications/web_app_handle_links_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_handle_links_browsertest.cc
@@ -18,7 +18,7 @@ #include "content/public/test/test_navigation_observer.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/mojom/manifest/handle_links.mojom.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" namespace web_app {
diff --git a/chrome/browser/ui/web_applications/web_app_link_capturing_browsertest.cc b/chrome/browser/ui/web_applications/web_app_link_capturing_browsertest.cc index 818e75d..00a4fcb 100644 --- a/chrome/browser/ui/web_applications/web_app_link_capturing_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_link_capturing_browsertest.cc
@@ -36,7 +36,7 @@ #include "content/public/test/test_utils.h" #include "content/public/test/url_loader_interceptor.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" using content::RenderFrameHost; using content::WebContents;
diff --git a/chrome/browser/ui/web_applications/web_app_protocol_handling_browsertest.cc b/chrome/browser/ui/web_applications/web_app_protocol_handling_browsertest.cc index d78c0bd..f8b95d4 100644 --- a/chrome/browser/ui/web_applications/web_app_protocol_handling_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_protocol_handling_browsertest.cc
@@ -19,7 +19,7 @@ #include "components/services/app_service/public/cpp/protocol_handler_info.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_navigation_observer.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" namespace {
diff --git a/chrome/browser/ui/web_applications/web_app_url_handling_browsertest.cc b/chrome/browser/ui/web_applications/web_app_url_handling_browsertest.cc index 76b7c49a..b34a529 100644 --- a/chrome/browser/ui/web_applications/web_app_url_handling_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_url_handling_browsertest.cc
@@ -19,7 +19,7 @@ #include "content/public/test/browser_test.h" #include "content/public/test/test_navigation_observer.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" namespace web_app {
diff --git a/chrome/browser/ui/web_applications/web_app_window_controls_overlay_browsertest.cc b/chrome/browser/ui/web_applications/web_app_window_controls_overlay_browsertest.cc index ec67fd4..b9e8a56 100644 --- a/chrome/browser/ui/web_applications/web_app_window_controls_overlay_browsertest.cc +++ b/chrome/browser/ui/web_applications/web_app_window_controls_overlay_browsertest.cc
@@ -14,7 +14,7 @@ #include "content/public/common/content_features.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_navigation_observer.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" namespace {
diff --git a/chrome/browser/ui/webid/account_selection_view.h b/chrome/browser/ui/webid/account_selection_view.h index d3e3dfb..a64a28b 100644 --- a/chrome/browser/ui/webid/account_selection_view.h +++ b/chrome/browser/ui/webid/account_selection_view.h
@@ -39,7 +39,11 @@ }; static std::unique_ptr<AccountSelectionView> Create(Delegate* delegate); + + // Returns the brand icon minimum size in dip. static int GetBrandIconMinimumSize(); + + // Returns the brand icon ideal size in dip. static int GetBrandIconIdealSize(); explicit AccountSelectionView(Delegate* delegate) : delegate_(delegate) {}
diff --git a/chrome/browser/ui/webui/apc_internals/OWNERS b/chrome/browser/ui/webui/apc_internals/OWNERS index 1725378..0472f1f0 100644 --- a/chrome/browser/ui/webui/apc_internals/OWNERS +++ b/chrome/browser/ui/webui/apc_internals/OWNERS
@@ -1 +1,2 @@ +jkeitel@google.com vizcay@google.com
diff --git a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc index e7c0f0c4..a8999ebb 100644 --- a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc +++ b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_ui.cc
@@ -27,7 +27,7 @@ #include "chrome/grit/assistant_optin_resources_map.h" #include "chrome/grit/browser_resources.h" #include "chrome/grit/oobe_conditional_resources.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/services/assistant/public/cpp/assistant_prefs.h" #include "chromeos/services/assistant/public/cpp/features.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ui/webui/chromeos/human_presence_internals_ui.cc b/chrome/browser/ui/webui/chromeos/human_presence_internals_ui.cc index 725b827d..e0299598 100644 --- a/chrome/browser/ui/webui/chromeos/human_presence_internals_ui.cc +++ b/chrome/browser/ui/webui/chromeos/human_presence_internals_ui.cc
@@ -13,11 +13,11 @@ #include "base/values.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/url_constants.h" -#include "chromeos/components/human_presence/human_presence_configuration.h" -#include "chromeos/components/human_presence/human_presence_internals.h" +#include "chromeos/ash/components/human_presence/human_presence_configuration.h" +#include "chromeos/ash/components/human_presence/human_presence_internals.h" +#include "chromeos/ash/grit/ash_resources.h" #include "chromeos/dbus/hps/hps_service.pb.h" #include "chromeos/dbus/human_presence/human_presence_dbus_client.h" -#include "chromeos/grit/chromeos_resources.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_controller.h" #include "content/public/browser/web_ui_data_source.h" @@ -45,8 +45,8 @@ void OnJavascriptDisallowed() override; // chromeos::HumanPresenceDBusClient::Observer implementation. - void OnHpsSenseChanged(hps::HpsResult state) override; - void OnHpsNotifyChanged(hps::HpsResult state) override; + void OnHpsSenseChanged(const hps::HpsResultProto&) override; + void OnHpsNotifyChanged(const hps::HpsResultProto&) override; void OnRestart() override; void OnShutdown() override; @@ -60,8 +60,8 @@ void QuerySnoopingProtection(const base::Value::List& args); void OnConnected(bool connected); - void OnLockOnLeaveResult(absl::optional<hps::HpsResult>); - void OnSnoopingProtectionResult(absl::optional<hps::HpsResult>); + void OnLockOnLeaveResult(absl::optional<hps::HpsResultProto>); + void OnSnoopingProtectionResult(absl::optional<hps::HpsResultProto>); base::ScopedObservation<chromeos::HumanPresenceDBusClient, chromeos::HumanPresenceDBusClient::Observer> @@ -79,20 +79,22 @@ ~HumanPresenceInternalsUIMessageHandler() = default; void HumanPresenceInternalsUIMessageHandler::OnHpsSenseChanged( - hps::HpsResult state) { + const hps::HpsResultProto& state) { OnLockOnLeaveResult(state); } void HumanPresenceInternalsUIMessageHandler::OnHpsNotifyChanged( - hps::HpsResult state) { + const hps::HpsResultProto& state) { OnSnoopingProtectionResult(state); } void HumanPresenceInternalsUIMessageHandler::OnLockOnLeaveResult( - absl::optional<hps::HpsResult> state) { + absl::optional<hps::HpsResultProto> state) { base::DictionaryValue value; if (state.has_value()) { - value.SetInteger("state", *state); + value.SetInteger("state", state->value()); + value.SetInteger("inference_result", state->inference_result()); + value.SetInteger("inference_result_valid", state->inference_result_valid()); } else { value.SetBoolean("disabled", true); } @@ -100,10 +102,12 @@ } void HumanPresenceInternalsUIMessageHandler::OnSnoopingProtectionResult( - absl::optional<hps::HpsResult> state) { + absl::optional<hps::HpsResultProto> state) { base::DictionaryValue value; if (state.has_value()) { - value.SetInteger("state", *state); + value.SetInteger("state", state->value()); + value.SetInteger("inference_result", state->inference_result()); + value.SetInteger("inference_result_valid", state->inference_result_valid()); } else { value.SetBoolean("disabled", true); } @@ -145,6 +149,7 @@ return; } hps::FeatureConfig config(*hps::GetEnableLockOnLeaveConfig()); + config.set_report_raw_results(true); chromeos::HumanPresenceDBusClient::Get()->EnableHpsSense(config); } @@ -171,6 +176,7 @@ return; } hps::FeatureConfig config(*hps::GetEnableSnoopingProtectionConfig()); + config.set_report_raw_results(true); chromeos::HumanPresenceDBusClient::Get()->EnableHpsNotify(config); }
diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc index d5e595a3..0766a32 100644 --- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
@@ -197,10 +197,6 @@ CallJS("cr.ui.Oobe.showOobeUI", show); } -void CoreOobeHandler::SetLoginUserCount(int user_count) { - CallJS("cr.ui.Oobe.setLoginUserCount", user_count); -} - void CoreOobeHandler::ForwardAccelerator(std::string accelerator_name) { CallJS("cr.ui.Oobe.handleAccelerator", accelerator_name); }
diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h index cf906fe..1ca392f1 100644 --- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h
@@ -81,9 +81,6 @@ // Show or hide OOBE UI. void ShowOobeUI(bool show); - // Notify WebUI of the user count on the views login screen. - void SetLoginUserCount(int user_count); - // Forwards an accelerator value to cr.ui.Oobe.handleAccelerator. void ForwardAccelerator(std::string accelerator_name);
diff --git a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc index 6f180504..6d8d69063 100644 --- a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.cc
@@ -5,7 +5,9 @@ #include "chrome/browser/ui/webui/chromeos/login/error_screen_handler.h" #include "base/time/time.h" +#include "base/values.h" #include "chrome/browser/ash/login/screens/error_screen.h" +#include "chrome/browser/ash/login/ui/login_display_host.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "components/login/localized_values_builder.h" @@ -31,7 +33,11 @@ show_on_init_ = true; return; } - ShowInWebUI(); + + base::Value::Dict data; + data.Set("hasUserPods", ash::LoginDisplayHost::default_host()->HasUserPods()); + ShowInWebUI(std::move(data)); + if (screen_) screen_->DoShow(); showing_ = true;
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index 5f4cc24..88f3aeed 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -796,10 +796,6 @@ oobe_display_chooser_->TryToPlaceUiOnTouchDisplay(); } -void OobeUI::SetLoginUserCount(int user_count) { - core_handler_->SetLoginUserCount(user_count); -} - void OobeUI::OnSystemTrayBubbleShown() { if (current_screen_ == WelcomeView::kScreenId) GetHandler<WelcomeScreenHandler>()->CancelChromeVoxHintIdleDetection();
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h index ec724f0..4ccf5be 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
@@ -116,9 +116,6 @@ // Re-evaluate OOBE display placement. void OnDisplayConfigurationChanged(); - // Notify WebUI of the user count on the views login screen. - void SetLoginUserCount(int user_count); - void OnSystemTrayBubbleShown(); // Find a *View instance provided by a given *Handler type.
diff --git a/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc b/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc index 3e31f04..72612cf6 100644 --- a/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc
@@ -23,7 +23,7 @@ #include "chrome/browser/ash/login/wizard_controller.h" #include "chrome/browser/ash/policy/enrollment/enrollment_requisition_manager.h" #include "chrome/browser/ui/ash/login_screen_client_impl.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "components/account_id/account_id.h" namespace chromeos {
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc index c80a0ae..2779fbc8 100644 --- a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc +++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
@@ -33,6 +33,7 @@ #include "printing/print_job_constants.h" #include "printing/pwg_raster_settings.h" #include "services/device/public/mojom/usb_device.mojom.h" +#include "third_party/abseil-cpp/absl/types/optional.h" using extensions::DevicePermissionsManager; using extensions::DictionaryBuilder; @@ -81,21 +82,19 @@ extension->id().c_str(), device.guid.c_str()); } -bool ParseProvisionalUsbPrinterId(const std::string& printer_id, - std::string* extension_id, - std::string* device_guid) { +struct ProvisionalUsbPrinter { + std::string extension_id; + std::string device_guid; +}; + +absl::optional<ProvisionalUsbPrinter> ParseProvisionalUsbPrinterId( + const std::string& printer_id) { std::vector<std::string> components = base::SplitString( printer_id, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); - - if (components.size() != 3) - return false; - - if (components[0] != kProvisionalUsbLabel) - return false; - - *extension_id = components[1]; - *device_guid = components[2]; - return true; + if (components.size() != 3 || components[0] != kProvisionalUsbLabel) + return absl::nullopt; + return ProvisionalUsbPrinter{.extension_id = std::move(components[1]), + .device_guid = std::move(components[2])}; } extensions::PrinterProviderAPI* GetPrinterProviderAPI(Profile* profile) { @@ -206,18 +205,16 @@ void ExtensionPrinterHandler::StartGrantPrinterAccess( const std::string& printer_id, GetPrinterInfoCallback callback) { - std::string extension_id; - std::string device_guid; - if (!ParseProvisionalUsbPrinterId(printer_id, &extension_id, &device_guid)) { + absl::optional<ProvisionalUsbPrinter> printer = + ParseProvisionalUsbPrinterId(printer_id); + if (!printer.has_value()) { std::move(callback).Run(base::DictionaryValue()); return; } - UsbDeviceManager* usb_manager = UsbDeviceManager::Get(profile_); - DCHECK(usb_manager); - const device::mojom::UsbDeviceInfo* device = - usb_manager->GetDeviceInfo(device_guid); + UsbDeviceManager::Get(profile_)->GetDeviceInfo( + printer.value().device_guid); if (!device) { std::move(callback).Run(base::DictionaryValue()); return; @@ -225,10 +222,10 @@ DevicePermissionsManager* permissions_manager = DevicePermissionsManager::Get(profile_); - permissions_manager->AllowUsbDevice(extension_id, *device); + permissions_manager->AllowUsbDevice(printer.value().extension_id, *device); GetPrinterProviderAPI(profile_)->DispatchGetUsbPrinterInfoRequested( - extension_id, *device, + printer.value().extension_id, *device, base::BindOnce(&ExtensionPrinterHandler::WrapGetPrinterInfoCallback, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); }
diff --git a/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc b/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc index 623afc76..5445d1a 100644 --- a/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc +++ b/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
@@ -148,6 +148,13 @@ } media.SaveTo(&description); + // DPI value should match PrintingContext::UsePdfSettings(). + cloud_devices::printer::DpiCapability dpi; + dpi.AddDefaultOption( + cloud_devices::printer::Dpi(kDefaultPdfDpi, kDefaultPdfDpi), + /*is_default=*/true); + dpi.SaveTo(&description); + return std::move(description).ToValue(); }
diff --git a/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc index 0749238..b111026 100644 --- a/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc +++ b/chrome/browser/ui/webui/print_preview/pdf_printer_handler_unittest.cc
@@ -43,6 +43,13 @@ } ] }, + "dpi": { + "option": [ { + "horizontal_dpi": 300, + "is_default": true, + "vertical_dpi": 300 + } ] + }, "media_size":{ "option":[ {
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc index e46cf046..43a5875 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc
@@ -4,6 +4,7 @@ #include <memory> +#include "base/strings/string_number_conversions.h" #include "base/test/values_test_util.h" #include "chrome/browser/ui/webui/print_preview/print_preview_utils.h" #include "testing/gtest/include/gtest/gtest.h" @@ -26,101 +27,96 @@ const char kValue[] = "value"; const char kVendorCapability[] = "vendor_capability"; -base::DictionaryValue GetCapabilitiesFull() { - base::DictionaryValue printer; +base::Value::Dict GetCapabilitiesFull() { + base::Value::Dict printer; - base::Value::ListStorage list_media; - list_media.push_back(base::Value("Letter")); - list_media.push_back(base::Value("A4")); - printer.SetKey(kMediaSizes, base::Value(list_media)); + base::Value::List list_media; + list_media.Append("Letter"); + list_media.Append("A4"); + printer.Set(kMediaSizes, std::move(list_media)); - base::Value::ListStorage list_dpi; - list_dpi.push_back(base::Value(300)); - list_dpi.push_back(base::Value(600)); + base::Value::List list_dpi; + list_dpi.Append(300); + list_dpi.Append(600); - base::Value options(base::Value::Type::DICTIONARY); - options.SetKey(kOptionKey, base::Value(list_dpi)); - printer.SetKey(kDpi, std::move(options)); + base::Value::Dict options; + options.Set(kOptionKey, std::move(list_dpi)); + printer.Set(kDpi, std::move(options)); - printer.SetKey(kCollate, base::Value(true)); + printer.Set(kCollate, true); - base::Value::ListStorage pages_per_sheet; + base::Value::List pages_per_sheet; for (int i = 1; i <= 8; i *= 2) { - base::Value option(base::Value::Type::DICTIONARY); - option.SetKey(kDisplayName, base::Value(std::to_string(i))); - option.SetKey(kValue, base::Value(i)); + base::Value::Dict option; + option.Set(kDisplayName, base::NumberToString(i)); + option.Set(kValue, i); if (i == 1) - option.SetKey(kIsDefault, base::Value(true)); - pages_per_sheet.push_back(std::move(option)); + option.Set(kIsDefault, true); + pages_per_sheet.Append(std::move(option)); } - base::Value pages_per_sheet_option(base::Value::Type::DICTIONARY); - pages_per_sheet_option.SetKey(kOptionKey, base::Value(pages_per_sheet)); - base::Value pages_per_sheet_capability(base::Value::Type::DICTIONARY); - pages_per_sheet_capability.SetKey(kDisplayName, base::Value(kPagesPerSheet)); - pages_per_sheet_capability.SetKey(kId, base::Value(kPagesPerSheet)); - pages_per_sheet_capability.SetKey(kTypeKey, base::Value(kSelectString)); - pages_per_sheet_capability.SetKey(kSelectCapKey, - std::move(pages_per_sheet_option)); + base::Value::Dict pages_per_sheet_option; + pages_per_sheet_option.Set(kOptionKey, std::move(pages_per_sheet)); + base::Value::Dict pages_per_sheet_capability; + pages_per_sheet_capability.Set(kDisplayName, kPagesPerSheet); + pages_per_sheet_capability.Set(kId, kPagesPerSheet); + pages_per_sheet_capability.Set(kTypeKey, kSelectString); + pages_per_sheet_capability.Set(kSelectCapKey, + std::move(pages_per_sheet_option)); - base::Value::ListStorage paper_types; - base::Value option1(base::Value::Type::DICTIONARY); - option1.SetKey(kDisplayName, base::Value("Plain")); - option1.SetKey(kValue, base::Value("Plain")); - option1.SetKey(kIsDefault, base::Value(true)); - base::Value option2(base::Value::Type::DICTIONARY); - option2.SetKey(kDisplayName, base::Value("Photo")); - option2.SetKey(kValue, base::Value("Photo")); - paper_types.push_back(std::move(option1)); - paper_types.push_back(std::move(option2)); - base::Value paper_type_option(base::Value::Type::DICTIONARY); - paper_type_option.SetKey(kOptionKey, base::Value(paper_types)); - base::Value paper_type_capability(base::Value::Type::DICTIONARY); - paper_type_capability.SetKey(kDisplayName, base::Value(kPaperType)); - paper_type_capability.SetKey(kId, base::Value(kPaperType)); - paper_type_capability.SetKey(kTypeKey, base::Value(kSelectString)); - paper_type_capability.SetKey(kSelectCapKey, std::move(paper_type_option)); + base::Value::List paper_types; + base::Value::Dict option1; + option1.Set(kDisplayName, "Plain"); + option1.Set(kValue, "Plain"); + option1.Set(kIsDefault, true); + base::Value::Dict option2; + option2.Set(kDisplayName, "Photo"); + option2.Set(kValue, "Photo"); + paper_types.Append(std::move(option1)); + paper_types.Append(std::move(option2)); + base::Value::Dict paper_type_option; + paper_type_option.Set(kOptionKey, std::move(paper_types)); + base::Value::Dict paper_type_capability; + paper_type_capability.Set(kDisplayName, kPaperType); + paper_type_capability.Set(kId, kPaperType); + paper_type_capability.Set(kTypeKey, kSelectString); + paper_type_capability.Set(kSelectCapKey, std::move(paper_type_option)); - base::Value::ListStorage vendor_capabilities; - vendor_capabilities.push_back(std::move(pages_per_sheet_capability)); - vendor_capabilities.push_back(std::move(paper_type_capability)); - printer.SetKey(kVendorCapability, base::Value(vendor_capabilities)); + base::Value::List vendor_capabilities; + vendor_capabilities.Append(std::move(pages_per_sheet_capability)); + vendor_capabilities.Append(std::move(paper_type_capability)); + printer.Set(kVendorCapability, std::move(vendor_capabilities)); return printer; } -base::Value ValidList(const base::Value* list) { - auto out_list = list->Clone(); - out_list.EraseListValueIf([](const base::Value& v) { return v.is_none(); }); +base::Value::List ValidList(const base::Value::List* list) { + base::Value::List out_list = list->Clone(); + out_list.EraseIf([](const base::Value& v) { return v.is_none(); }); return out_list; } -bool HasValidEntry(const base::Value* list) { - return list && !list->GetListDeprecated().empty() && - !ValidList(list).GetListDeprecated().empty(); +bool HasValidEntry(const base::Value::List* list) { + return list && !list->empty() && !ValidList(list).empty(); } -void CompareStringKeys(const base::Value& expected, - const base::Value& actual, +void CompareStringKeys(const base::Value::Dict& expected, + const base::Value::Dict& actual, base::StringPiece key) { - EXPECT_EQ(*(expected.FindKeyOfType(key, base::Value::Type::STRING)), - *(actual.FindKeyOfType(key, base::Value::Type::STRING))); + EXPECT_EQ(*expected.FindString(key), *actual.FindString(key)); } -void ValidateList(const base::Value* list_out, const base::Value* input_list) { - auto input_list_valid = ValidList(input_list); - ASSERT_EQ(list_out->GetListDeprecated().size(), - input_list_valid.GetListDeprecated().size()); - for (size_t index = 0; index < list_out->GetListDeprecated().size(); - index++) { - EXPECT_EQ(list_out->GetListDeprecated()[index], - input_list_valid.GetListDeprecated()[index]); +void ValidateList(const base::Value::List* list_out, + const base::Value::List* input_list) { + base::Value::List input_list_valid = ValidList(input_list); + ASSERT_EQ(list_out->size(), input_list_valid.size()); + for (size_t i = 0; i < list_out->size(); ++i) { + EXPECT_EQ((*list_out)[i], input_list_valid[i]); } } -void ValidateMedia(const base::Value* printer_out, - const base::Value* expected_list) { - const base::Value* media_out = - printer_out->FindKeyOfType(kMediaSizes, base::Value::Type::LIST); +void ValidateMedia(const base::Value::Dict* printer_out, + const base::Value::List* expected_list) { + const base::Value::List* media_out = printer_out->FindList(kMediaSizes); if (!HasValidEntry(expected_list)) { EXPECT_FALSE(media_out); return; @@ -128,37 +124,34 @@ ValidateList(media_out, expected_list); } -void ValidateDpi(const base::Value* printer_out, - const base::Value* expected_dpi) { - const base::Value* dpi_option_out = - printer_out->FindKeyOfType(kDpi, base::Value::Type::DICTIONARY); +void ValidateDpi(const base::Value::Dict* printer_out, + const base::Value::Dict* expected_dpi) { + const base::Value::Dict* dpi_option_out = printer_out->FindDict(kDpi); if (!expected_dpi) { EXPECT_FALSE(dpi_option_out); return; } - const base::Value* dpi_list = - expected_dpi->FindKeyOfType(kOptionKey, base::Value::Type::LIST); + const base::Value::List* dpi_list = expected_dpi->FindList(kOptionKey); if (!HasValidEntry(dpi_list)) { EXPECT_FALSE(dpi_option_out); return; } ASSERT_TRUE(dpi_option_out); - const base::Value* dpi_list_out = - dpi_option_out->FindKeyOfType(kOptionKey, base::Value::Type::LIST); + const base::Value::List* dpi_list_out = dpi_option_out->FindList(kOptionKey); ASSERT_TRUE(dpi_list_out); ValidateList(dpi_list_out, dpi_list); } -void ValidateCollate(const base::Value* printer_out) { - const base::Value* collate_out = - printer_out->FindKeyOfType(kCollate, base::Value::Type::BOOLEAN); - ASSERT_TRUE(collate_out); +void ValidateCollate(const base::Value::Dict* printer_out) { + absl::optional<bool> collate_out = printer_out->FindBool(kCollate); + ASSERT_TRUE(collate_out.has_value()); + EXPECT_TRUE(collate_out.value()); } -void ValidateVendorCaps(const base::Value* printer_out, - const base::Value* input_vendor_caps) { - const base::Value* vendor_capability_out = - printer_out->FindKeyOfType(kVendorCapability, base::Value::Type::LIST); +void ValidateVendorCaps(const base::Value::Dict* printer_out, + const base::Value::List* input_vendor_caps) { + const base::Value::List* vendor_capability_out = + printer_out->FindList(kVendorCapability); if (!HasValidEntry(input_vendor_caps)) { ASSERT_FALSE(vendor_capability_out); return; @@ -166,177 +159,170 @@ ASSERT_TRUE(vendor_capability_out); size_t index = 0; - base::Value::ConstListView output_list = - vendor_capability_out->GetListDeprecated(); - for (const auto& input_entry : input_vendor_caps->GetListDeprecated()) { + for (const auto& input_entry : *input_vendor_caps) { + const auto& input_entry_dict = input_entry.GetDict(); if (!HasValidEntry( - input_entry - .FindKeyOfType(kSelectCapKey, base::Value::Type::DICTIONARY) - ->FindKeyOfType(kOptionKey, base::Value::Type::LIST))) { + input_entry_dict.FindDict(kSelectCapKey)->FindList(kOptionKey))) { continue; } - CompareStringKeys(input_entry, output_list[index], kDisplayName); - CompareStringKeys(input_entry, output_list[index], kId); - CompareStringKeys(input_entry, output_list[index], kTypeKey); - const base::Value* select_cap = output_list[index].FindKeyOfType( - kSelectCapKey, base::Value::Type::DICTIONARY); + const auto& current_vendor_capability_out = + (*vendor_capability_out)[index].GetDict(); + CompareStringKeys(input_entry_dict, current_vendor_capability_out, + kDisplayName); + CompareStringKeys(input_entry_dict, current_vendor_capability_out, kId); + CompareStringKeys(input_entry_dict, current_vendor_capability_out, + kTypeKey); + const base::Value::Dict* select_cap = + current_vendor_capability_out.FindDict(kSelectCapKey); ASSERT_TRUE(select_cap); - const base::Value* list = - select_cap->FindKeyOfType(kOptionKey, base::Value::Type::LIST); + const base::Value::List* list = select_cap->FindList(kOptionKey); ASSERT_TRUE(list); ValidateList( - list, - input_entry.FindKeyOfType(kSelectCapKey, base::Value::Type::DICTIONARY) - ->FindKeyOfType(kOptionKey, base::Value::Type::LIST)); + list, input_entry_dict.FindDict(kSelectCapKey)->FindList(kOptionKey)); index++; } } void ValidatePrinter(const base::Value* cdd_out, - const base::DictionaryValue& printer) { - const base::Value* printer_out = - cdd_out->FindKeyOfType(kPrinter, base::Value::Type::DICTIONARY); + const base::Value::Dict& printer) { + const base::Value::Dict* printer_out = cdd_out->GetDict().FindDict(kPrinter); ASSERT_TRUE(printer_out); - const base::Value* media = - printer.FindKeyOfType(kMediaSizes, base::Value::Type::LIST); + const base::Value::List* media = printer.FindList(kMediaSizes); ValidateMedia(printer_out, media); - const base::Value* dpi_dict = - printer.FindKeyOfType(kDpi, base::Value::Type::DICTIONARY); + const base::Value::Dict* dpi_dict = printer.FindDict(kDpi); ValidateDpi(printer_out, dpi_dict); ValidateCollate(printer_out); - const base::Value* capabilities_list = - printer.FindKeyOfType(kVendorCapability, base::Value::Type::LIST); + const base::Value::List* capabilities_list = + printer.FindList(kVendorCapability); ValidateVendorCaps(printer_out, capabilities_list); } +bool GetDpiResetToDefault(base::Value cdd) { + const base::Value::Dict* printer = cdd.GetDict().FindDict(kPrinter); + const base::Value::Dict* dpi = printer->FindDict(kDpi); + absl::optional<bool> reset_to_default = dpi->FindBool(kResetToDefault); + if (!reset_to_default.has_value()) { + ADD_FAILURE(); + return false; + } + return reset_to_default.value(); +} + } // namespace using PrintPreviewUtilsTest = testing::Test; TEST_F(PrintPreviewUtilsTest, FullCddPassthrough) { - base::DictionaryValue printer = GetCapabilitiesFull(); - base::DictionaryValue cdd; - cdd.SetKey(kPrinter, printer.Clone()); - auto cdd_out = ValidateCddForPrintPreview(std::move(cdd)); + base::Value::Dict printer = GetCapabilitiesFull(); + base::Value::Dict cdd; + cdd.Set(kPrinter, printer.Clone()); + auto cdd_out = ValidateCddForPrintPreview(base::Value(std::move(cdd))); ValidatePrinter(&cdd_out, printer); } TEST_F(PrintPreviewUtilsTest, FilterBadList) { - base::DictionaryValue printer = GetCapabilitiesFull(); - printer.RemoveKey(kMediaSizes); - base::Value::ListStorage list_media; - list_media.push_back(base::Value()); - list_media.push_back(base::Value()); - printer.SetKey(kMediaSizes, base::Value(list_media)); - base::DictionaryValue cdd; - cdd.SetKey(kPrinter, printer.Clone()); - auto cdd_out = ValidateCddForPrintPreview(std::move(cdd)); + base::Value::Dict printer = GetCapabilitiesFull(); + printer.Remove(kMediaSizes); + base::Value::List list_media; + list_media.Append(base::Value()); + list_media.Append(base::Value()); + printer.Set(kMediaSizes, std::move(list_media)); + base::Value::Dict cdd; + cdd.Set(kPrinter, printer.Clone()); + auto cdd_out = ValidateCddForPrintPreview(base::Value(std::move(cdd))); ValidatePrinter(&cdd_out, printer); } TEST_F(PrintPreviewUtilsTest, FilterBadOptionOneElement) { - base::DictionaryValue printer = GetCapabilitiesFull(); - printer.RemoveKey(kDpi); - base::Value options(base::Value::Type::DICTIONARY); - base::Value::ListStorage list_dpi; - list_dpi.push_back(base::Value()); - list_dpi.push_back(base::Value(600)); - options.SetKey(kOptionKey, base::Value(list_dpi)); - printer.SetKey(kDpi, std::move(options)); - base::DictionaryValue cdd; - cdd.SetKey(kPrinter, printer.Clone()); - auto cdd_out = ValidateCddForPrintPreview(std::move(cdd)); + base::Value::Dict printer = GetCapabilitiesFull(); + printer.Remove(kDpi); + base::Value::Dict options; + base::Value::List list_dpi; + list_dpi.Append(base::Value()); + list_dpi.Append(600); + options.Set(kOptionKey, std::move(list_dpi)); + printer.Set(kDpi, std::move(options)); + base::Value::Dict cdd; + cdd.Set(kPrinter, printer.Clone()); + auto cdd_out = ValidateCddForPrintPreview(base::Value(std::move(cdd))); ValidatePrinter(&cdd_out, printer); } TEST_F(PrintPreviewUtilsTest, FilterBadOptionAllElement) { - base::DictionaryValue printer = GetCapabilitiesFull(); - printer.RemoveKey(kDpi); - base::Value options(base::Value::Type::DICTIONARY); - base::Value::ListStorage list_dpi; - list_dpi.push_back(base::Value()); - list_dpi.push_back(base::Value()); - options.SetKey(kOptionKey, base::Value(list_dpi)); - printer.SetKey(kDpi, std::move(options)); - base::DictionaryValue cdd; - cdd.SetKey(kPrinter, printer.Clone()); - auto cdd_out = ValidateCddForPrintPreview(std::move(cdd)); + base::Value::Dict printer = GetCapabilitiesFull(); + printer.Remove(kDpi); + base::Value::Dict options; + base::Value::List list_dpi; + list_dpi.Append(base::Value()); + list_dpi.Append(base::Value()); + options.Set(kOptionKey, std::move(list_dpi)); + printer.Set(kDpi, std::move(options)); + base::Value::Dict cdd; + cdd.Set(kPrinter, printer.Clone()); + auto cdd_out = ValidateCddForPrintPreview(base::Value(std::move(cdd))); ValidatePrinter(&cdd_out, printer); } TEST_F(PrintPreviewUtilsTest, FilterBadVendorCapabilityAllElement) { - base::DictionaryValue printer = GetCapabilitiesFull(); - base::Value* select_cap_0 = - printer.FindKeyOfType(kVendorCapability, base::Value::Type::LIST) - ->GetListDeprecated()[0] - .FindKeyOfType(kSelectCapKey, base::Value::Type::DICTIONARY); - select_cap_0->RemoveKey(kOptionKey); - base::Value::ListStorage option_list; - option_list.push_back(base::Value()); - option_list.push_back(base::Value()); - select_cap_0->SetKey(kOptionKey, base::Value(option_list)); - base::DictionaryValue cdd; - cdd.SetKey(kPrinter, printer.Clone()); - auto cdd_out = ValidateCddForPrintPreview(std::move(cdd)); + base::Value::Dict printer = GetCapabilitiesFull(); + base::Value::Dict* select_cap_0 = + (*printer.FindList(kVendorCapability))[0].GetDict().FindDict( + kSelectCapKey); + select_cap_0->Remove(kOptionKey); + base::Value::List option_list; + option_list.Append(base::Value()); + option_list.Append(base::Value()); + select_cap_0->Set(kOptionKey, std::move(option_list)); + base::Value::Dict cdd; + cdd.Set(kPrinter, printer.Clone()); + auto cdd_out = ValidateCddForPrintPreview(base::Value(std::move(cdd))); ValidatePrinter(&cdd_out, printer); } TEST_F(PrintPreviewUtilsTest, FilterBadVendorCapabilityOneElement) { - base::DictionaryValue printer = GetCapabilitiesFull(); - base::Value* vendor_dictionary = - printer.FindKeyOfType(kVendorCapability, base::Value::Type::LIST) - ->GetListDeprecated()[0] - .FindKeyOfType(kSelectCapKey, base::Value::Type::DICTIONARY); - vendor_dictionary->RemoveKey(kOptionKey); - base::Value::ListStorage pages_per_sheet; + base::Value::Dict printer = GetCapabilitiesFull(); + base::Value::Dict* vendor_dictionary = + (*printer.FindList(kVendorCapability))[0].GetDict().FindDict( + kSelectCapKey); + vendor_dictionary->Remove(kOptionKey); + base::Value::List pages_per_sheet; for (int i = 1; i <= 8; i *= 2) { if (i == 2) { - pages_per_sheet.push_back(base::Value()); + pages_per_sheet.Append(base::Value()); continue; } - base::Value option(base::Value::Type::DICTIONARY); - option.SetKey(kDisplayName, base::Value(std::to_string(i))); - option.SetKey(kValue, base::Value(i)); + base::Value::Dict option; + option.Set(kDisplayName, base::NumberToString(i)); + option.Set(kValue, i); if (i == 1) - option.SetKey(kIsDefault, base::Value(true)); - pages_per_sheet.push_back(std::move(option)); + option.Set(kIsDefault, true); + pages_per_sheet.Append(std::move(option)); } - vendor_dictionary->SetKey(kOptionKey, base::Value(pages_per_sheet)); + vendor_dictionary->Set(kOptionKey, std::move(pages_per_sheet)); - base::DictionaryValue cdd; - cdd.SetKey(kPrinter, printer.Clone()); - auto cdd_out = ValidateCddForPrintPreview(std::move(cdd)); + base::Value::Dict cdd; + cdd.Set(kPrinter, printer.Clone()); + auto cdd_out = ValidateCddForPrintPreview(base::Value(std::move(cdd))); ValidatePrinter(&cdd_out, printer); } -bool GetDpiResetToDefault(base::Value cdd) { - base::Value* printer = - cdd.FindKeyOfType(kPrinter, base::Value::Type::DICTIONARY); - base::Value* dpi = - printer->FindKeyOfType(kDpi, base::Value::Type::DICTIONARY); - absl::optional<bool> reset_to_default = dpi->FindBoolKey(kResetToDefault); - EXPECT_TRUE(reset_to_default); - return *reset_to_default; -} - TEST_F(PrintPreviewUtilsTest, CddResetToDefault) { - base::DictionaryValue printer = GetCapabilitiesFull(); - base::Value* dpi_dict = - printer.FindKeyOfType(kDpi, base::Value::Type::DICTIONARY); + base::Value::Dict printer = GetCapabilitiesFull(); + base::Value::Dict* dpi_dict = printer.FindDict(kDpi); - base::DictionaryValue cdd; - dpi_dict->SetKey(kResetToDefault, base::Value(true)); - cdd.SetKey(kPrinter, printer.Clone()); - auto cdd_out = ValidateCddForPrintPreview(cdd.Clone()); + base::Value::Dict cdd; + dpi_dict->Set(kResetToDefault, true); + cdd.Set(kPrinter, printer.Clone()); + auto cdd_out = ValidateCddForPrintPreview(base::Value(cdd.Clone())); ValidatePrinter(&cdd_out, printer); EXPECT_TRUE(GetDpiResetToDefault(std::move(cdd_out))); - dpi_dict->SetKey(kResetToDefault, base::Value(false)); - cdd.SetKey(kPrinter, printer.Clone()); - cdd_out = ValidateCddForPrintPreview(std::move(cdd)); + dpi_dict->Set(kResetToDefault, false); + cdd.Set(kPrinter, printer.Clone()); + cdd_out = ValidateCddForPrintPreview(base::Value(std::move(cdd))); ValidatePrinter(&cdd_out, printer); EXPECT_FALSE(GetDpiResetToDefault(std::move(cdd_out))); }
diff --git a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc index 8527c9c..1786fbe3 100644 --- a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc
@@ -468,6 +468,8 @@ IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_NOTIFICATION_ITEM_SUMMARY}, {"multidevicePermissionsSetupAppsSummary", IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_APPS_ITEM_SUMMARY}, + {"multidevicePermissionsSetupInstructions", + IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_INSTRUCTIONS}, {"multidevicePermissionsSetupOperationsInstructions", IDS_SETTINGS_MULTIDEVICE_PERMISSIONS_SETUP_DIALOG_OPERATION_INSTRUCTIONS}, {"multidevicePermissionsSetupCompletedSummary",
diff --git a/chrome/browser/ui/webui/settings/profile_info_handler.cc b/chrome/browser/ui/webui/settings/profile_info_handler.cc index b24f176b8..ab9a7c7 100644 --- a/chrome/browser/ui/webui/settings/profile_info_handler.cc +++ b/chrome/browser/ui/webui/settings/profile_info_handler.cc
@@ -160,7 +160,7 @@ // work here, sends less over IPC, and is more stable with returned results. int kAvatarIconSize = 40.f * web_ui()->GetDeviceScaleFactor(); gfx::Image icon = profiles::GetSizedAvatarIcon( - entry->GetAvatarIcon(), true, kAvatarIconSize, kAvatarIconSize); + entry->GetAvatarIcon(), kAvatarIconSize, kAvatarIconSize); icon_url = webui::GetBitmapDataUrl(icon.AsBitmap()); } #endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc b/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc index 57b9efc..511e797 100644 --- a/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc +++ b/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc
@@ -168,7 +168,7 @@ // Add the GAIA picture to the beginning of the list if it is available. const gfx::Image* icon = entry->GetGAIAPicture(); if (icon) { - gfx::Image avatar_icon = profiles::GetAvatarIconForWebUI(*icon, true); + gfx::Image avatar_icon = profiles::GetAvatarIconForWebUI(*icon); auto gaia_picture_info = profiles::GetAvatarIconAndLabelDict( /*url=*/webui::GetBitmapDataUrl(avatar_icon.AsBitmap()), /*label=*/
diff --git a/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc b/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc index 97db949..e37f68fd 100644 --- a/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc
@@ -138,10 +138,9 @@ const gfx::Image* avatar_icon = entry()->GetGAIAPicture(); ASSERT_TRUE(avatar_icon); - EXPECT_EQ( - *icon.FindStringKey("url"), - webui::GetBitmapDataUrl( - profiles::GetAvatarIconForWebUI(*avatar_icon, true).AsBitmap())); + EXPECT_EQ(*icon.FindStringKey("url"), + webui::GetBitmapDataUrl( + profiles::GetAvatarIconForWebUI(*avatar_icon).AsBitmap())); EXPECT_TRUE(!icon.FindStringKey("label")->empty()); EXPECT_EQ(*icon.FindBoolPath("selected"), gaia_selected); }
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc index 6c82863..82d40ea 100644 --- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc +++ b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc
@@ -355,7 +355,7 @@ return webui::GetBitmapDataUrl( profiles::GetSizedAvatarIcon( icon.value_or(GetProfileEntry()->GetAvatarIcon(avatar_icon_size)), - true, avatar_icon_size, avatar_icon_size) + avatar_icon_size, avatar_icon_size) .AsBitmap()); }
diff --git a/chrome/browser/ui/webui/signin/profile_customization_handler.cc b/chrome/browser/ui/webui/signin/profile_customization_handler.cc index e3eb6ec..989cd92 100644 --- a/chrome/browser/ui/webui/signin/profile_customization_handler.cc +++ b/chrome/browser/ui/webui/signin/profile_customization_handler.cc
@@ -123,7 +123,7 @@ entry->GetProfileThemeColors().profile_highlight_color)); const int avatar_icon_size = kAvatarSize * web_ui()->GetDeviceScaleFactor(); gfx::Image icon = - profiles::GetSizedAvatarIcon(entry->GetAvatarIcon(avatar_icon_size), true, + profiles::GetSizedAvatarIcon(entry->GetAvatarIcon(avatar_icon_size), avatar_icon_size, avatar_icon_size); dict.SetStringKey("pictureUrl", webui::GetBitmapDataUrl(icon.AsBitmap())); dict.SetBoolKey("isManaged",
diff --git a/chrome/browser/ui/webui/signin/profile_picker_handler.cc b/chrome/browser/ui/webui/signin/profile_picker_handler.cc index 1972c76..e92d378 100644 --- a/chrome/browser/ui/webui/signin/profile_picker_handler.cc +++ b/chrome/browser/ui/webui/signin/profile_picker_handler.cc
@@ -209,7 +209,7 @@ profile_entry.SetBoolKey("isManaged", AccountInfo::IsManaged(entry->GetHostedDomain())); gfx::Image icon = - profiles::GetSizedAvatarIcon(entry->GetAvatarIcon(avatar_icon_size), true, + profiles::GetSizedAvatarIcon(entry->GetAvatarIcon(avatar_icon_size), avatar_icon_size, avatar_icon_size); std::string icon_url = webui::GetBitmapDataUrl(icon.AsBitmap()); profile_entry.SetStringKey("avatarIcon", icon_url);
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc b/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc index 5a35a1b..a3f0211 100644 --- a/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc +++ b/chrome/browser/ui/webui/signin/sync_confirmation_ui.cc
@@ -116,8 +116,6 @@ title_id = IDS_SYNC_CONFIRMATION_TITLE_LACROS; info_title_id = IDS_SYNC_CONFIRMATION_SYNC_INFO_TITLE_LACROS; confirm_label_id = IDS_DONE; - } else { - title_id = IDS_SYNC_CONFIRMATION_TITLE_LACROS_NON_FORCED; } #endif AddStringResource(source, "syncConfirmationTitle", title_id);
diff --git a/chrome/browser/ui/webui/sync_internals/sync_internals_ui.cc b/chrome/browser/ui/webui/sync_internals/sync_internals_ui.cc index b04f5c1..b98a48e6 100644 --- a/chrome/browser/ui/webui/sync_internals/sync_internals_ui.cc +++ b/chrome/browser/ui/webui/sync_internals/sync_internals_ui.cc
@@ -48,4 +48,4 @@ web_ui->AddMessageHandler(std::make_unique<SyncInternalsMessageHandler>()); } -SyncInternalsUI::~SyncInternalsUI() {} +SyncInternalsUI::~SyncInternalsUI() = default;
diff --git a/chrome/browser/url_param_filter/url_param_filter_classification.proto b/chrome/browser/url_param_filter/url_param_filter_classification.proto index a1da65b0..3aa8a2be 100644 --- a/chrome/browser/url_param_filter/url_param_filter_classification.proto +++ b/chrome/browser/url_param_filter/url_param_filter_classification.proto
@@ -26,7 +26,7 @@ optional string site = 1; // eTLD+1, required optional SiteRole site_role = 2; // required repeated FilterParameter parameters = 3; - repeated UseCase use_cases = 4; + repeated UseCase use_cases = 4 [packed = true]; } message FilterClassifications {
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn index ff5047e9..9b11dc2d 100644 --- a/chrome/browser/web_applications/BUILD.gn +++ b/chrome/browser/web_applications/BUILD.gn
@@ -14,6 +14,10 @@ source_set("web_applications") { sources = [ + # TODO(crbug.com/1321984): Move system_web_app_delegate.cc/h and + # system_web_app_types.cc/h to /ash/system_web_apps/types/ + "../ash/system_web_apps/types/system_web_app_delegate_map.cc", + "../ash/system_web_apps/types/system_web_app_delegate_map.h", "app_registrar_observer.h", "commands/callback_command.cc", "commands/callback_command.h", @@ -175,6 +179,8 @@ "web_app_sync_install_delegate.h", "web_app_system_web_app_data.cc", "web_app_system_web_app_data.h", + "web_app_system_web_app_delegate_map_utils.cc", + "web_app_system_web_app_delegate_map_utils.h", "web_app_tab_helper.cc", "web_app_tab_helper.h", "web_app_translation_manager.cc", @@ -599,6 +605,10 @@ ] } + if (is_chromeos_lacros) { + deps += [ "//chromeos/startup:startup" ] + } + if (is_win) { deps += [ "//chrome/browser/web_applications/chrome_pwa_launcher:unit_tests",
diff --git a/chrome/browser/web_applications/extensions/web_app_policy_manager_unittest.cc b/chrome/browser/web_applications/extensions/web_app_policy_manager_unittest.cc index 4759d1d..aa640d9 100644 --- a/chrome/browser/web_applications/extensions/web_app_policy_manager_unittest.cc +++ b/chrome/browser/web_applications/extensions/web_app_policy_manager_unittest.cc
@@ -381,10 +381,11 @@ return true; })); - policy_manager().SetSubsystems( - &externally_managed_app_manager(), &app_registrar(), - &controller().sync_bridge(), &system_app_manager(), - &controller().os_integration_manager()); + policy_manager().SetSubsystems(&externally_managed_app_manager(), + &app_registrar(), + &controller().sync_bridge(), + &system_app_manager().system_app_delegates(), + &controller().os_integration_manager()); controller().Init(); }
diff --git a/chrome/browser/web_applications/externally_managed_app_manager_impl.cc b/chrome/browser/web_applications/externally_managed_app_manager_impl.cc index 10479e05..a074168 100644 --- a/chrome/browser/web_applications/externally_managed_app_manager_impl.cc +++ b/chrome/browser/web_applications/externally_managed_app_manager_impl.cc
@@ -100,6 +100,7 @@ pending_registrations_.clear(); current_registration_.reset(); pending_installs_.clear(); + url_loader_.reset(); // `current_install_` keeps a pointer to `web_contents_` so destroy it before // releasing the WebContents. current_install_.reset();
diff --git a/chrome/browser/web_applications/manifest_update_manager.cc b/chrome/browser/web_applications/manifest_update_manager.cc index f5f5d08..0850a76 100644 --- a/chrome/browser/web_applications/manifest_update_manager.cc +++ b/chrome/browser/web_applications/manifest_update_manager.cc
@@ -9,8 +9,8 @@ #include "base/metrics/histogram_functions.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/web_applications/os_integration/os_integration_manager.h" -#include "chrome/browser/web_applications/system_web_apps/system_web_app_manager.h" #include "chrome/browser/web_applications/web_app_constants.h" +#include "chrome/browser/web_applications/web_app_system_web_app_delegate_map_utils.h" #include "chrome/common/chrome_features.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings_types.h" @@ -31,7 +31,7 @@ WebAppIconManager* icon_manager, WebAppUiManager* ui_manager, WebAppInstallFinalizer* install_finalizer, - SystemWebAppManager* system_web_app_manager, + const ash::SystemWebAppDelegateMap* system_web_apps_delegate_map, OsIntegrationManager* os_integration_manager, WebAppSyncBridge* sync_bridge) { install_manager_ = install_manager; @@ -39,7 +39,7 @@ icon_manager_ = icon_manager; ui_manager_ = ui_manager; install_finalizer_ = install_finalizer; - system_web_app_manager_ = system_web_app_manager; + system_web_apps_delegate_map_ = system_web_apps_delegate_map; os_integration_manager_ = os_integration_manager; sync_bridge_ = sync_bridge; } @@ -70,7 +70,7 @@ return; } - if (system_web_app_manager_->IsSystemWebApp(app_id)) { + if (IsSystemWebApp(*registrar_, *system_web_apps_delegate_map_, app_id)) { NotifyResult(url, app_id, ManifestUpdateResult::kAppIsSystemWebApp); return; }
diff --git a/chrome/browser/web_applications/manifest_update_manager.h b/chrome/browser/web_applications/manifest_update_manager.h index b2f7f79..6ae3d67 100644 --- a/chrome/browser/web_applications/manifest_update_manager.h +++ b/chrome/browser/web_applications/manifest_update_manager.h
@@ -12,6 +12,7 @@ #include "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "base/time/time.h" +#include "chrome/browser/ash/system_web_apps/types/system_web_app_delegate_map.h" #include "chrome/browser/web_applications/app_registrar_observer.h" #include "chrome/browser/web_applications/manifest_update_task.h" #include "chrome/browser/web_applications/web_app_id.h" @@ -29,7 +30,6 @@ class WebAppUiManager; class WebAppInstallFinalizer; class OsIntegrationManager; -class SystemWebAppManager; class WebAppSyncBridge; // Checks for updates to a web app's manifest and triggers a reinstall if the @@ -48,14 +48,15 @@ ManifestUpdateManager(); ~ManifestUpdateManager() override; - void SetSubsystems(WebAppInstallManager* install_manager, - WebAppRegistrar* registrar, - WebAppIconManager* icon_manager, - WebAppUiManager* ui_manager, - WebAppInstallFinalizer* install_finalizer, - SystemWebAppManager* system_web_app_manager, - OsIntegrationManager* os_integration_manager, - WebAppSyncBridge* sync_bridge); + void SetSubsystems( + WebAppInstallManager* install_manager, + WebAppRegistrar* registrar, + WebAppIconManager* icon_manager, + WebAppUiManager* ui_manager, + WebAppInstallFinalizer* install_finalizer, + const ash::SystemWebAppDelegateMap* system_web_apps_delegate_map, + OsIntegrationManager* os_integration_manager, + WebAppSyncBridge* sync_bridge); void Start(); void Shutdown(); @@ -96,7 +97,8 @@ raw_ptr<WebAppIconManager> icon_manager_ = nullptr; raw_ptr<WebAppUiManager> ui_manager_ = nullptr; raw_ptr<WebAppInstallFinalizer> install_finalizer_ = nullptr; - raw_ptr<SystemWebAppManager> system_web_app_manager_ = nullptr; + raw_ptr<const ash::SystemWebAppDelegateMap> system_web_apps_delegate_map_ = + nullptr; raw_ptr<OsIntegrationManager> os_integration_manager_ = nullptr; raw_ptr<WebAppSyncBridge> sync_bridge_ = nullptr; raw_ptr<WebAppInstallManager> install_manager_ = nullptr;
diff --git a/chrome/browser/web_applications/policy/web_app_policy_manager.cc b/chrome/browser/web_applications/policy/web_app_policy_manager.cc index ed94f6e..1de8ef9 100644 --- a/chrome/browser/web_applications/policy/web_app_policy_manager.cc +++ b/chrome/browser/web_applications/policy/web_app_policy_manager.cc
@@ -23,7 +23,6 @@ #include "chrome/browser/web_applications/os_integration/os_integration_manager.h" #include "chrome/browser/web_applications/policy/pre_redirection_url_observer.h" #include "chrome/browser/web_applications/policy/web_app_policy_constants.h" -#include "chrome/browser/web_applications/system_web_apps/system_web_app_manager.h" #include "chrome/browser/web_applications/user_display_mode.h" #include "chrome/browser/web_applications/web_app_helpers.h" #include "chrome/browser/web_applications/web_app_id.h" @@ -32,6 +31,7 @@ #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/browser/web_applications/web_app_registrar.h" #include "chrome/browser/web_applications/web_app_sync_bridge.h" +#include "chrome/browser/web_applications/web_app_system_web_app_delegate_map_utils.h" #include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "components/pref_registry/pref_registry_syncable.h" @@ -78,7 +78,7 @@ ExternallyManagedAppManager* externally_managed_app_manager, WebAppRegistrar* app_registrar, WebAppSyncBridge* sync_bridge, - SystemWebAppManager* web_app_manager, + const ash::SystemWebAppDelegateMap* system_web_apps_delegate_map, OsIntegrationManager* os_integration_manager) { DCHECK(externally_managed_app_manager); DCHECK(app_registrar); @@ -88,7 +88,7 @@ externally_managed_app_manager_ = externally_managed_app_manager; app_registrar_ = app_registrar; sync_bridge_ = sync_bridge; - web_app_manager_ = web_app_manager; + system_web_apps_delegate_map_ = system_web_apps_delegate_map; os_integration_manager_ = os_integration_manager; } @@ -637,9 +637,9 @@ } } - for (const auto& app_type : disabled_system_apps_) { - absl::optional<AppId> app_id = - web_app_manager_->GetAppIdForSystemApp(app_type); + for (const SystemAppType& app_type : disabled_system_apps_) { + absl::optional<AppId> app_id = GetAppIdForSystemApp( + *app_registrar_, *system_web_apps_delegate_map_, app_type); if (app_id.has_value()) { disabled_web_apps_.insert(app_id.value()); }
diff --git a/chrome/browser/web_applications/policy/web_app_policy_manager.h b/chrome/browser/web_applications/policy/web_app_policy_manager.h index 7b44e71f..af62ad91 100644 --- a/chrome/browser/web_applications/policy/web_app_policy_manager.h +++ b/chrome/browser/web_applications/policy/web_app_policy_manager.h
@@ -11,6 +11,7 @@ #include "base/memory/weak_ptr.h" #include "base/values.h" #include "build/chromeos_buildflags.h" +#include "chrome/browser/ash/system_web_apps/types/system_web_app_delegate_map.h" #include "chrome/browser/web_applications/externally_installed_web_app_prefs.h" #include "chrome/browser/web_applications/externally_managed_app_manager.h" #include "components/prefs/pref_change_registrar.h" @@ -32,7 +33,6 @@ namespace web_app { class WebAppSyncBridge; -class SystemWebAppManager; class OsIntegrationManager; // Policy installation allows enterprise admins to control and manage @@ -57,7 +57,7 @@ ExternallyManagedAppManager* externally_managed_app_manager, WebAppRegistrar* app_registrar, WebAppSyncBridge* sync_bridge, - SystemWebAppManager* web_app_manager, + const ash::SystemWebAppDelegateMap* system_web_apps_delegate_map, OsIntegrationManager* os_integration_manager); void Start(); @@ -160,7 +160,8 @@ nullptr; raw_ptr<WebAppRegistrar> app_registrar_ = nullptr; raw_ptr<WebAppSyncBridge> sync_bridge_ = nullptr; - raw_ptr<SystemWebAppManager> web_app_manager_ = nullptr; + raw_ptr<const ash::SystemWebAppDelegateMap> system_web_apps_delegate_map_ = + nullptr; raw_ptr<OsIntegrationManager> os_integration_manager_ = nullptr; PrefChangeRegistrar pref_change_registrar_;
diff --git a/chrome/browser/web_applications/preinstalled_web_app_utils_unittest.cc b/chrome/browser/web_applications/preinstalled_web_app_utils_unittest.cc index b5b359d..2326a98 100644 --- a/chrome/browser/web_applications/preinstalled_web_app_utils_unittest.cc +++ b/chrome/browser/web_applications/preinstalled_web_app_utils_unittest.cc
@@ -20,6 +20,11 @@ #include "base/command_line.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS_LACROS) +#include "chromeos/crosapi/mojom/crosapi.mojom.h" +#include "chromeos/startup/browser_init_params.h" +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) + namespace web_app { class PreinstalledWebAppUtilsTest : public testing::Test { @@ -79,7 +84,7 @@ // ParseConfig() is also tested by PreinstalledWebAppManagerTest. -#if BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS) namespace { @@ -99,8 +104,16 @@ public: PreinstalledWebAppUtilsTabletTest() { if (GetParam()) { +#if BUILDFLAG(IS_CHROMEOS_ASH) base::CommandLine::ForCurrentProcess()->AppendSwitch( ash::switches::kEnableTabletFormFactor); +#else + auto init_params = crosapi::mojom::BrowserInitParams::New(); + init_params->device_properties = crosapi::mojom::DeviceProperties::New(); + init_params->device_properties->is_tablet_form_factor = true; + chromeos::BrowserInitParams::SetInitParamsForTests( + std::move(init_params)); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) } } ~PreinstalledWebAppUtilsTabletTest() override = default; @@ -141,8 +154,16 @@ public: PreinstalledWebAppUtilsArcTest() { if (GetParam()) { +#if BUILDFLAG(IS_CHROMEOS_ASH) base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( ash::switches::kArcAvailability, "officially-supported"); +#else + auto init_params = crosapi::mojom::BrowserInitParams::New(); + init_params->device_properties = crosapi::mojom::DeviceProperties::New(); + init_params->device_properties->is_arc_available = true; + chromeos::BrowserInitParams::SetInitParamsForTests( + std::move(init_params)); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) } } ~PreinstalledWebAppUtilsArcTest() override = default; @@ -177,7 +198,7 @@ ::testing::Values(true, false), BoolParamToString); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) +#endif // BUILDFLAG(IS_CHROMEOS) // TODO(crbug.com/1119710): Loading icon.png is flaky on Windows. #if BUILDFLAG(IS_WIN)
diff --git a/chrome/browser/web_applications/system_web_apps/system_web_app_manager.cc b/chrome/browser/web_applications/system_web_apps/system_web_app_manager.cc index 2a4d1c2..04acadc 100644 --- a/chrome/browser/web_applications/system_web_apps/system_web_app_manager.cc +++ b/chrome/browser/web_applications/system_web_apps/system_web_app_manager.cc
@@ -34,6 +34,7 @@ #include "chrome/browser/web_applications/web_app_install_utils.h" #include "chrome/browser/web_applications/web_app_registrar.h" #include "chrome/browser/web_applications/web_app_sync_bridge.h" +#include "chrome/browser/web_applications/web_app_system_web_app_delegate_map_utils.h" #include "chrome/browser/web_applications/web_app_ui_manager.h" #include "chrome/browser/web_applications/web_app_utils.h" #include "chrome/common/chrome_features.h" @@ -106,9 +107,9 @@ // bailing out. const int kInstallFailureAttempts = 3; -SystemAppDelegateMap CreateSystemWebApps(Profile* profile) { - std::vector<std::unique_ptr<SystemWebAppDelegate>> info_vec; +ash::SystemWebAppDelegateMap CreateSystemWebApps(Profile* profile) { #if BUILDFLAG(IS_CHROMEOS_ASH) + std::vector<std::unique_ptr<SystemWebAppDelegate>> info_vec; // TODO(crbug.com/1051229): Currently unused, will be hooked up // post-migration. We're making delegates for everything, and will then use // them in place of SystemAppInfos. @@ -144,11 +145,13 @@ info_vec.push_back(std::make_unique<SampleSystemAppDelegate>(profile)); #endif // !defined(OFFICIAL_BUILD) - SystemAppDelegateMap delegate_map; + ash::SystemWebAppDelegateMap delegate_map; for (auto& info : info_vec) { if (info->IsAppEnabled() || base::FeatureList::IsEnabled(features::kEnableAllSystemWebApps)) { - delegate_map.emplace(info->GetType(), std::move(info)); + // Gets `type` before std::move(). + SystemAppType type = info->GetType(); + delegate_map.emplace(type, std::move(info)); } } return delegate_map; @@ -163,11 +166,9 @@ } ExternalInstallOptions CreateInstallOptionsForSystemApp( - const SystemAppType app_type, - + const SystemAppType type, const SystemWebAppDelegate& delegate, bool force_update, - bool is_disabled) { DCHECK(delegate.GetInstallUrl().scheme() == content::kChromeUIScheme || delegate.GetInstallUrl().scheme() == @@ -192,7 +193,7 @@ install_options.force_reinstall = force_update; install_options.uninstall_and_replace = delegate.GetAppIdsToUninstallAndReplace(); - install_options.system_app_type = app_type; + install_options.system_app_type = type; install_options.handles_file_open_intents = delegate.ShouldHandleFileOpenIntents(); @@ -247,15 +248,8 @@ } } -bool SystemWebAppManager::IsAppEnabled(SystemAppType type) { - if (base::FeatureList::IsEnabled(features::kEnableAllSystemWebApps)) - return true; - - auto it = system_app_delegates_.find(type); - if (it == system_app_delegates_.end()) - return false; - - return it->second->IsAppEnabled(); +bool SystemWebAppManager::IsAppEnabled(SystemAppType type) const { + return ash::IsSystemWebAppEnabled(system_app_delegates_, type); } void SystemWebAppManager::Shutdown() { @@ -344,43 +338,20 @@ } absl::optional<AppId> SystemWebAppManager::GetAppIdForSystemApp( - SystemAppType id) const { - auto app_url_it = system_app_delegates_.find(id); - if (app_url_it == system_app_delegates_.end()) - return absl::optional<AppId>(); - - return registrar_->LookupExternalAppId(app_url_it->second->GetInstallUrl()); + SystemAppType type) const { + return web_app::GetAppIdForSystemApp(*registrar_, system_app_delegates_, + type); } absl::optional<SystemAppType> SystemWebAppManager::GetSystemAppTypeForAppId( const AppId& app_id) const { - const WebApp* web_app = registrar_->GetAppById(app_id); - if (!web_app || !web_app->client_data().system_web_app_data.has_value()) { - return absl::nullopt; - } - - // The registered system apps can change from previous runs (e.g. flipping a - // SWA flag). The registry isn't up-to-date until SWA finishes installing, so - // we could have a invalid type (for current session) during SWA install. - // - // This check ensures we return a type that is safe for other methods (avoids - // crashing when looking up that type). - SystemAppType proto_type = - web_app->client_data().system_web_app_data->system_app_type; - if (system_app_delegates_.contains(proto_type)) { - return proto_type; - } - - return absl::nullopt; + return web_app::GetSystemAppTypeForAppId(*registrar_, system_app_delegates_, + app_id); } const SystemWebAppDelegate* SystemWebAppManager::GetSystemApp( SystemAppType type) const { - auto it = system_app_delegates_.find(type); - if (it == system_app_delegates_.end()) - return nullptr; - - return it->second.get(); + return ash::GetSystemWebApp(system_app_delegates_, type); } std::vector<AppId> SystemWebAppManager::GetAppIds() const { @@ -396,7 +367,7 @@ } bool SystemWebAppManager::IsSystemWebApp(const AppId& app_id) const { - return GetSystemAppTypeForAppId(app_id).has_value(); + return web_app::IsSystemWebApp(*registrar_, system_app_delegates_, app_id); } const std::vector<std::string>* SystemWebAppManager::GetEnabledOriginTrials( @@ -447,11 +418,12 @@ if (!type.has_value()) return absl::nullopt; - const auto it = system_app_delegates_.find(type); - if (it == system_app_delegates_.end()) + const web_app::SystemWebAppDelegate* delegate = + ash::GetSystemWebApp(system_app_delegates_, type.value()); + if (!delegate) return absl::nullopt; - if (!it->second->ShouldCaptureNavigations()) + if (!delegate->ShouldCaptureNavigations()) return absl::nullopt; // TODO(crbug://1051229): Expand ShouldCaptureNavigation to take a GURL, and @@ -471,8 +443,7 @@ } void SystemWebAppManager::SetSystemAppsForTesting( - base::flat_map<SystemAppType, std::unique_ptr<SystemWebAppDelegate>> - system_apps) { + ash::SystemWebAppDelegateMap system_apps) { system_app_delegates_ = std::move(system_apps); }
diff --git a/chrome/browser/web_applications/system_web_apps/system_web_app_manager.h b/chrome/browser/web_applications/system_web_apps/system_web_app_manager.h index 1ae42ffe..eb9a099b 100644 --- a/chrome/browser/web_applications/system_web_apps/system_web_app_manager.h +++ b/chrome/browser/web_applications/system_web_apps/system_web_app_manager.h
@@ -16,6 +16,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/one_shot_event.h" +#include "chrome/browser/ash/system_web_apps/types/system_web_app_delegate_map.h" #include "chrome/browser/web_applications/externally_managed_app_manager.h" #include "chrome/browser/web_applications/system_web_apps/system_web_app_background_task.h" #include "chrome/browser/web_applications/system_web_apps/system_web_app_delegate.h" @@ -50,9 +51,6 @@ class WebAppSyncBridge; class WebAppPolicyManager; -using SystemAppDelegateMap = - base::flat_map<SystemAppType, std::unique_ptr<SystemWebAppDelegate>>; - // Installs, uninstalls, and updates System Web Apps. // System Web Apps are built-in, highly-privileged Web Apps for Chrome OS. They // have access to more APIs and are part of the Chrome OS image. @@ -72,7 +70,7 @@ "Webapp.SystemApps.FreshInstallDuration"; // Returns whether the given app type is enabled. - bool IsAppEnabled(SystemAppType type); + bool IsAppEnabled(SystemAppType type) const; explicit SystemWebAppManager(Profile* profile); SystemWebAppManager(const SystemWebAppManager&) = delete; @@ -128,7 +126,9 @@ // Returns a map of registered system app types and infos, these apps will be // installed on the system. - const SystemAppDelegateMap& GetRegisteredSystemAppsForTesting() const; + // TODO(crbug.com/1321984): Delete this accessor in favor of + // system_app_delegates(). + const ash::SystemWebAppDelegateMap& GetRegisteredSystemAppsForTesting() const; const base::OneShotEvent& on_apps_synchronized() const { return *on_apps_synchronized_; @@ -140,9 +140,15 @@ return *on_tasks_started_; } + // Returns a map of registered system app types and infos, these apps will be + // installed on the system. + const ash::SystemWebAppDelegateMap& system_app_delegates() const { + return system_app_delegates_; + } + // This call will override default System Apps configuration. You should call // Start() after this call to install |system_apps|. - void SetSystemAppsForTesting(SystemAppDelegateMap system_apps); + void SetSystemAppsForTesting(ash::SystemWebAppDelegateMap system_apps); // Overrides the update policy. If AlwaysReinstallSystemWebApps feature is // enabled, this method does nothing, and system apps will be reinstalled. @@ -204,7 +210,7 @@ UpdatePolicy update_policy_; - SystemAppDelegateMap system_app_delegates_; + ash::SystemWebAppDelegateMap system_app_delegates_; const raw_ptr<PrefService> pref_service_;
diff --git a/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_unittest.cc b/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_unittest.cc index f772753..275a19d 100644 --- a/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_unittest.cc +++ b/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_unittest.cc
@@ -175,7 +175,8 @@ web_app_policy_manager().SetSubsystems( &externally_managed_app_manager(), &controller().registrar(), - &controller().sync_bridge(), &system_web_app_manager(), + &controller().sync_bridge(), + &system_web_app_manager().system_app_delegates(), &controller().os_integration_manager()); system_web_app_manager().SetSubsystems(
diff --git a/chrome/browser/web_applications/web_app_data_retriever.cc b/chrome/browser/web_applications/web_app_data_retriever.cc index e0e2d18..b99df64 100644 --- a/chrome/browser/web_applications/web_app_data_retriever.cc +++ b/chrome/browser/web_applications/web_app_data_retriever.cc
@@ -213,7 +213,7 @@ void WebAppDataRetriever::CallCallbackOnError() { Observe(nullptr); DCHECK(ShouldStopRetrieval()); - + icon_downloader_.reset(); fallback_install_info_.reset(); // Call a callback as a tail call. The callback may destroy |this|.
diff --git a/chrome/browser/web_applications/web_app_icon_downloader.cc b/chrome/browser/web_applications/web_app_icon_downloader.cc index ab72d2c..7af8d5a 100644 --- a/chrome/browser/web_applications/web_app_icon_downloader.cc +++ b/chrome/browser/web_applications/web_app_icon_downloader.cc
@@ -22,7 +22,9 @@ WebAppIconDownloaderCallback callback) : content::WebContentsObserver(web_contents), extra_favicon_urls_(std::move(extra_favicon_urls)), - callback_(std::move(callback)) {} + callback_(std::move(callback)) { + DCHECK(web_contents); +} WebAppIconDownloader::~WebAppIconDownloader() = default;
diff --git a/chrome/browser/web_applications/web_app_install_manager.cc b/chrome/browser/web_applications/web_app_install_manager.cc index 7380445..dee12515 100644 --- a/chrome/browser/web_applications/web_app_install_manager.cc +++ b/chrome/browser/web_applications/web_app_install_manager.cc
@@ -83,6 +83,7 @@ TaskQueue empty; task_queue_.swap(empty); } + url_loader_.reset(); web_contents_.reset(); } @@ -329,7 +330,7 @@ // The install task or web contents getting destroyed indicates we could be // shutting down; don't enqueue another task. if (code == webapps::InstallResultCode::kWebContentsDestroyed || - code == webapps::InstallResultCode::kInstallTaskDestroyed) { + code == webapps::InstallResultCode::kInstallTaskDestroyed || !started_) { return; }
diff --git a/chrome/browser/web_applications/web_app_provider.cc b/chrome/browser/web_applications/web_app_provider.cc index f1963b4..dedb2fc0 100644 --- a/chrome/browser/web_applications/web_app_provider.cc +++ b/chrome/browser/web_applications/web_app_provider.cc
@@ -313,8 +313,8 @@ manifest_update_manager_->SetSubsystems( install_manager_.get(), registrar_.get(), icon_manager_.get(), ui_manager_.get(), install_finalizer_.get(), - system_web_app_manager_.get(), os_integration_manager_.get(), - sync_bridge_.get()); + &system_web_app_manager_->system_app_delegates(), + os_integration_manager_.get(), sync_bridge_.get()); externally_managed_app_manager_->SetSubsystems( registrar_.get(), ui_manager_.get(), install_finalizer_.get(), command_manager_.get(), sync_bridge_.get()); @@ -324,10 +324,10 @@ system_web_app_manager_->SetSubsystems( externally_managed_app_manager_.get(), registrar_.get(), sync_bridge_.get(), ui_manager_.get(), web_app_policy_manager_.get()); - web_app_policy_manager_->SetSubsystems(externally_managed_app_manager_.get(), - registrar_.get(), sync_bridge_.get(), - system_web_app_manager_.get(), - os_integration_manager_.get()); + web_app_policy_manager_->SetSubsystems( + externally_managed_app_manager_.get(), registrar_.get(), + sync_bridge_.get(), &system_web_app_manager_->system_app_delegates(), + os_integration_manager_.get()); registrar_->SetSubsystems(web_app_policy_manager_.get(), translation_manager_.get()); ui_manager_->SetSubsystems(sync_bridge_.get(), os_integration_manager_.get());
diff --git a/chrome/browser/web_applications/web_app_provider.h b/chrome/browser/web_applications/web_app_provider.h index 727f3787..853384b 100644 --- a/chrome/browser/web_applications/web_app_provider.h +++ b/chrome/browser/web_applications/web_app_provider.h
@@ -182,6 +182,8 @@ std::unique_ptr<WebAppInstallFinalizer> install_finalizer_; std::unique_ptr<ManifestUpdateManager> manifest_update_manager_; std::unique_ptr<ExternallyManagedAppManager> externally_managed_app_manager_; + // TODO(crbug.com/1321984): Extract system web app manager as + // chrome/browser/ash/ keyed service. std::unique_ptr<SystemWebAppManager> system_web_app_manager_; std::unique_ptr<WebAppAudioFocusIdMap> audio_focus_id_map_; std::unique_ptr<WebAppInstallManager> install_manager_;
diff --git a/chrome/browser/web_applications/web_app_system_web_app_delegate_map_utils.cc b/chrome/browser/web_applications/web_app_system_web_app_delegate_map_utils.cc new file mode 100644 index 0000000..a05a1104 --- /dev/null +++ b/chrome/browser/web_applications/web_app_system_web_app_delegate_map_utils.cc
@@ -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. + +#include "chrome/browser/web_applications/web_app_system_web_app_delegate_map_utils.h" + +#include "chrome/browser/web_applications/web_app.h" +#include "chrome/browser/web_applications/web_app_registrar.h" +#include "url/gurl.h" + +namespace web_app { + +absl::optional<AppId> GetAppIdForSystemApp( + const WebAppRegistrar& registrar, + const ash::SystemWebAppDelegateMap& delegates, + SystemAppType type) { + const web_app::SystemWebAppDelegate* delegate = + ash::GetSystemWebApp(delegates, type); + if (!delegate) + return absl::nullopt; + + absl::optional<GURL> app_install_url = delegate->GetInstallUrl(); + if (!app_install_url.has_value()) + return absl::nullopt; + + return registrar.LookupExternalAppId(app_install_url.value()); +} + +absl::optional<SystemAppType> GetSystemAppTypeForAppId( + const WebAppRegistrar& registrar, + const ash::SystemWebAppDelegateMap& delegates, + const AppId& app_id) { + const WebApp* web_app = registrar.GetAppById(app_id); + if (!web_app || !web_app->client_data().system_web_app_data.has_value()) { + return absl::nullopt; + } + + // The registered system apps can change from previous runs (e.g. flipping a + // SWA flag). The registry isn't up-to-date until SWA finishes installing, so + // we could have a invalid type (for current session) during SWA install. + // + // This check ensures we return a type that is safe for other methods (avoids + // crashing when looking up that type). + SystemAppType proto_type = + web_app->client_data().system_web_app_data->system_app_type; + if (delegates.contains(proto_type)) { + return proto_type; + } + + return absl::nullopt; +} + +bool IsSystemWebApp(const WebAppRegistrar& registrar, + const ash::SystemWebAppDelegateMap& delegates, + const AppId& app_id) { + return GetSystemAppTypeForAppId(registrar, delegates, app_id).has_value(); +} + +} // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_system_web_app_delegate_map_utils.h b/chrome/browser/web_applications/web_app_system_web_app_delegate_map_utils.h new file mode 100644 index 0000000..58a51b86 --- /dev/null +++ b/chrome/browser/web_applications/web_app_system_web_app_delegate_map_utils.h
@@ -0,0 +1,35 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_SYSTEM_WEB_APP_DELEGATE_MAP_UTILS_H_ +#define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_SYSTEM_WEB_APP_DELEGATE_MAP_UTILS_H_ + +#include "chrome/browser/ash/system_web_apps/types/system_web_app_delegate_map.h" +#include "chrome/browser/web_applications/system_web_apps/system_web_app_types.h" +#include "chrome/browser/web_applications/web_app_id.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace web_app { + +class WebAppRegistrar; + +// Returns the app id for the given System App |type|. +absl::optional<AppId> GetAppIdForSystemApp( + const WebAppRegistrar& registrar, + const ash::SystemWebAppDelegateMap& delegates, + SystemAppType type); + +// Returns the System App Type for the given |app_id|. +absl::optional<SystemAppType> GetSystemAppTypeForAppId( + const WebAppRegistrar& registrar, + const ash::SystemWebAppDelegateMap& delegates, + const AppId& app_id); + +// Returns whether |app_id| points to an installed System App. +bool IsSystemWebApp(const WebAppRegistrar& registrar, + const ash::SystemWebAppDelegateMap& delegates, + const AppId& app_id); + +} // namespace web_app + +#endif // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_SYSTEM_WEB_APP_DELEGATE_MAP_UTILS_H_
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 346fcc9..391cf8f 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1652442381-bb7324569419cd735172d0e0b351e2491f3503ca.profdata +chrome-linux-main-1652680457-b0ca8e5380c1380d221a4dac9056209f2d49e67b.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 12ec31b4..da23d5b3 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1652464682-5ecdd110e879d229eee247e64d4213b40e74c27d.profdata +chrome-mac-arm-main-1652680457-69cdc3dded96405b89a19a99a53002844942255d.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index c91b71ba..4f1a4de 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1652442381-47dcb26bea012b433cadc439b0681dd713c838b9.profdata +chrome-mac-main-1652680457-bee6eda9ab1111e76f5b3530d7feed46e21d9b09.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 95250de..04dbb51 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1652453684-a7059ff1eda7587d6c49a6b3e4ccedcbe7f14ba0.profdata +chrome-win32-main-1652691487-cbe161054c850bd0ce357d4bcd17c5e8ebf83ccf.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 352d237..6250b16 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1652453684-1eea911d70ef4a430156b279252fff352ef296cc.profdata +chrome-win64-main-1652691487-95b7c3bd84f1735a4c5b19b16d4883af78508977.profdata
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn index 85f63e86..d218489 100644 --- a/chrome/common/BUILD.gn +++ b/chrome/common/BUILD.gn
@@ -107,6 +107,10 @@ # Use a static library here because many test binaries depend on this but don't # require many files from it. This makes linking more efficient. static_library("common_lib") { + visibility = [ + ":*", + "//chrome/common/win:eventlog_messages", + ] sources = [ "all_messages.h", "child_process_host_flags.h",
diff --git a/chrome/common/chromeos/extensions/chromeos_system_extensions_manifest_handler.cc b/chrome/common/chromeos/extensions/chromeos_system_extensions_manifest_handler.cc index 6396752d..f1ff3d6 100644 --- a/chrome/common/chromeos/extensions/chromeos_system_extensions_manifest_handler.cc +++ b/chrome/common/chromeos/extensions/chromeos_system_extensions_manifest_handler.cc
@@ -5,6 +5,7 @@ #include "chrome/common/chromeos/extensions/chromeos_system_extensions_manifest_handler.h" #include "base/strings/utf_string_conversions.h" +#include "base/values.h" #include "chrome/common/chromeos/extensions/chromeos_system_extension_info.h" #include "chrome/common/chromeos/extensions/chromeos_system_extensions_manifest_constants.h" #include "extensions/common/extension.h" @@ -19,28 +20,32 @@ using extensions::mojom::APIPermissionID; bool VerifyExternallyConnectableDefinition(extensions::Extension* extension) { - const base::DictionaryValue* externally_connectable = nullptr; + const base::Value* externally_connectable_value = nullptr; // chromeos_system_extension's 'externally_connectable' must exist. if (!extension->manifest()->GetDictionary( extensions::manifest_keys::kExternallyConnectable, - &externally_connectable)) + &externally_connectable_value)) return false; + const auto* externally_connectable_dict = + externally_connectable_value->GetIfDict(); + // chromeos_system_extension's 'externally_connectable' can only specify // "matches". - if (externally_connectable->DictSize() != 1 || - !externally_connectable->FindKey("matches")) + if (!externally_connectable_dict || + externally_connectable_dict->size() != 1 || + !externally_connectable_dict->Find("matches")) return false; - auto matches_list = - externally_connectable->FindKey("matches")->GetListDeprecated(); - if (matches_list.size() != 1) + const auto* matches_list = + externally_connectable_dict->Find("matches")->GetIfList(); + if (!matches_list || matches_list->size() != 1) return false; const auto& extension_info = GetChromeOSExtensionInfoForId(extension->id()); // Verifies allowlisted origins. - return matches_list.front().GetString() == extension_info.pwa_origin; + return matches_list->front().GetString() == extension_info.pwa_origin; } } // namespace @@ -51,7 +56,7 @@ bool ChromeOSSystemExtensionHandler::Parse(extensions::Extension* extension, std::u16string* error) { - const base::DictionaryValue* system_extension_dict = nullptr; + const base::Value* system_extension_dict = nullptr; if (!extension->manifest()->GetDictionary( extensions::manifest_keys::kChromeOSSystemExtension, &system_extension_dict)) {
diff --git a/chrome/common/extensions/api/_api_features.json b/chrome/common/extensions/api/_api_features.json index 4fe6bba..a5c29fda 100644 --- a/chrome/common/extensions/api/_api_features.json +++ b/chrome/common/extensions/api/_api_features.json
@@ -287,17 +287,13 @@ "dependencies": ["permission:cryptotokenPrivate"], "contexts": ["blessed_extension"] }, - "dashboardPrivate": [{ - "channel": "stable", - "contexts": ["blessed_web_page", "web_page"], - "matches": ["https://chrome.google.com/webstore/*"] - }, { + "dashboardPrivate": { "channel": "stable", "contexts": ["blessed_extension"], "allowlist": [ "B44D08FD98F1523ED5837D78D0A606EA9D6206E5" // Web Store ] - }], + }, "debugger": { "dependencies": ["permission:debugger"], "contexts": ["blessed_extension"],
diff --git a/chrome/common/extensions/api/accessibility_private.json b/chrome/common/extensions/api/accessibility_private.json index ccc577eed..8460998c 100644 --- a/chrome/common/extensions/api/accessibility_private.json +++ b/chrome/common/extensions/api/accessibility_private.json
@@ -246,7 +246,7 @@ { "id": "SetNativeChromeVoxResponse", "type": "string", - "enum": [ "success", "talkbackNotInstalled", "windowNotFound", "failure" ], + "enum": [ "success", "talkbackNotInstalled", "windowNotFound", "failure" , "needDeprecationConfirmation" ], "description": "Response code for onNativeChromeVoxArcSupportResult" }, {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 25b8b1da..f4e9b8d 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -20,7 +20,7 @@ import("//chrome/common/features.gni") import("//chrome/test/base/js2gtest.gni") import("//chrome/test/include_js_tests.gni") -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//components/captive_portal/core/features.gni") import("//components/exo/buildflags.gni") @@ -97,6 +97,8 @@ testonly = true sources = [ + "../browser/autofill/autofill_uitest_util.cc", + "../browser/autofill/autofill_uitest_util.h", "../browser/autofill/automated_tests/cache_replayer.cc", "../browser/autofill/automated_tests/cache_replayer.h", "../browser/notifications/notification_display_service_tester.cc", @@ -607,8 +609,6 @@ if (toolkit_views) { public_deps += [ "//ui/views:test_support" ] sources += [ - "../browser/autofill/autofill_uitest_util.cc", - "../browser/autofill/autofill_uitest_util.h", "../browser/password_manager/password_manager_uitest_util.cc", "../browser/password_manager/password_manager_uitest_util.h", "../browser/ui/chooser_bubble_testapi.h", @@ -831,8 +831,6 @@ "../browser/android/customtabs/custom_tabs_browsertest.cc", "../browser/android/webapk/webapk_icon_hasher_browsertest.cc", "../browser/autofill/android/save_update_address_profile_flow_manager_browsertest.cc", - "../browser/autofill/autofill_uitest_util.cc", - "../browser/autofill/autofill_uitest_util.h", "../browser/browsing_data/access_context_audit_browsertest.cc", "../browser/browsing_data/browsing_data_remover_browsertest_base.cc", "../browser/browsing_data/browsing_data_remover_browsertest_base.h", @@ -2629,7 +2627,7 @@ "//ash/webui/system_extensions_internals_ui:browser_tests_js", "//chrome/browser/resources/gaia_auth_host:browser_tests", "//chrome/test/data/webui:browser_tests_js_mojo_lite_webui", - "//chromeos/components/human_presence:browser_tests_js", + "//chromeos/ash/components/human_presence:browser_tests_js", ] data_deps += [ "//chrome/test/data/webui:browser_tests_js_webui" ] @@ -3955,8 +3953,8 @@ "//ash/assistant/ui", "//ash/assistant/ui:constants", "//chrome/browser/ui/ash/assistant/test_support", + "//chromeos/ash/components/assistant/test_support", "//chromeos/assistant/internal:libassistant", - "//chromeos/assistant/test_support", ] data += [ "//chromeos/assistant/internal/test_data/" ] @@ -4055,6 +4053,7 @@ "//chrome/services/keymaster/public/mojom", "//chrome/services/wilco_dtc_supportd/public/mojom", "//chromeos:test_support", + "//chromeos/ash/components/assistant:buildflags", "//chromeos/ash/components/dbus/authpolicy", "//chromeos/ash/components/dbus/biod", "//chromeos/ash/components/dbus/biod:biod_proto", @@ -4067,7 +4066,6 @@ "//chromeos/ash/components/dbus/system_proxy", "//chromeos/ash/components/dbus/system_proxy:system_proxy_proto", "//chromeos/ash/components/dbus/upstart", - "//chromeos/assistant:buildflags", "//chromeos/components/onc:test_support", "//chromeos/components/quick_answers/public/cpp:cpp", "//chromeos/components/remote_apps/mojom:mojom", @@ -6268,6 +6266,7 @@ "../browser/apps/intent_helper/intent_picker_internal_unittest.cc", "../browser/apps/intent_helper/page_transition_util_unittest.cc", "../browser/autofill_assistant/password_change/apc_client_impl_unittest.cc", + "../browser/autofill_assistant/password_change/apc_onboarding_coordinator_impl_unittest.cc", "../browser/browser_commands_unittest.cc", "../browser/browsing_data/chrome_browsing_data_lifetime_manager_unittest.cc", "../browser/cart/cart_discount_fetcher_unittest.cc", @@ -7186,10 +7185,10 @@ "//chrome/services/sharing/nearby/platform:unit_tests", "//chrome/services/sharing/public/cpp", "//chrome/services/sharing/public/cpp:unit_tests", + "//chromeos/ash/components/assistant:buildflags", "//chromeos/ash/components/dbus/cicerone", "//chromeos/ash/components/dbus/concierge", "//chromeos/ash/components/dbus/seneschal", - "//chromeos/assistant:buildflags", "//chromeos/components/feature_usage:feature_usage", "//chromeos/components/onc", "//chromeos/components/quick_answers:quick_answers",
diff --git a/chrome/test/base/browser_tests_main.cc b/chrome/test/base/browser_tests_main.cc index 5ae45179..e16c5ad 100644 --- a/chrome/test/base/browser_tests_main.cc +++ b/chrome/test/base/browser_tests_main.cc
@@ -64,15 +64,18 @@ #if BUILDFLAG(IS_FUCHSIA) // Running in headless mode frees the test suite from depending on // a graphical compositor. - // TODO(crbug.com/1292100): Switch to Flatland ozone platform. + // TODO(crbug.com/1318197): Remove this extra logic once tests are run in + // non-headless mode. See also crbug.com/1292100. command_line->AppendSwitch(switches::kHeadless); command_line->AppendSwitchNative(switches::kOzonePlatform, switches::kHeadless); // The default headless resolution (1x1) doesn't allow web contents to be - // visible. That cause tests that simulate mouse clicks to fail. + // visible. That cause tests that simulate mouse clicks to fail. The size also + // needs to accommodate some dialog tests where the window needs to be larger + // than the dialog. command_line->AppendSwitchNative(switches::kOzoneOverrideScreenSize, - "800,600"); + "800,800"); #endif ChromeTestSuiteRunner runner;
diff --git a/chrome/test/base/web_feature_histogram_tester.h b/chrome/test/base/web_feature_histogram_tester.h index c7bae56..ab5abca4 100644 --- a/chrome/test/base/web_feature_histogram_tester.h +++ b/chrome/test/base/web_feature_histogram_tester.h
@@ -9,7 +9,7 @@ #include <vector> #include "base/test/metrics/histogram_tester.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" // Returns a map containing the given `features` as keys, all mapping to zero. std::map<blink::mojom::WebFeature, int> AllZeroFeatureCounts(
diff --git a/chrome/test/data/chromeos/file_manager/tera.zip b/chrome/test/data/chromeos/file_manager/tera.zip new file mode 100644 index 0000000..18919a1 --- /dev/null +++ b/chrome/test/data/chromeos/file_manager/tera.zip Binary files differ
diff --git a/chrome/test/data/preload/iframe.html b/chrome/test/data/preload/iframe.html index 4793781..febe396 100644 --- a/chrome/test/data/preload/iframe.html +++ b/chrome/test/data/preload/iframe.html
@@ -2,8 +2,6 @@ <head> </head> <body> - <a id="iframe_anchor" href="https://www.fakesearch.com/"> - <div style='padding: 0px; width: 400px; height: 400px;'></div> - </a> - </body> -</html> + <a id="iframe_anchor" href="https://www.fakesearch.com/"></a> + </body> +</html> \ No newline at end of file
diff --git a/chrome/test/data/preload/iframe_anchor.html b/chrome/test/data/preload/iframe_anchor.html index c471646..1de28d5 100644 --- a/chrome/test/data/preload/iframe_anchor.html +++ b/chrome/test/data/preload/iframe_anchor.html
@@ -2,6 +2,6 @@ <head> </head> <body> - <iframe id="iframe1" height="400" width="400" src="iframe.html"></iframe> + <iframe id="iframe1" src="iframe.html"></iframe> </body> -</html> +</html> \ No newline at end of file
diff --git a/chrome/test/data/shared_storage/customizable_module.js b/chrome/test/data/shared_storage/customizable_module.js index 81f5dca1..e0993fa 100644 --- a/chrome/test/data/shared_storage/customizable_module.js +++ b/chrome/test/data/shared_storage/customizable_module.js
@@ -10,6 +10,6 @@ } } -registerOperation("test-operation", TestOperation); +register("test-operation", TestOperation); console.log('Finish executing customizable_module.js')
diff --git a/chrome/test/data/shared_storage/simple_module.js b/chrome/test/data/shared_storage/simple_module.js index c3a5e8cb..97b6739 100644 --- a/chrome/test/data/shared_storage/simple_module.js +++ b/chrome/test/data/shared_storage/simple_module.js
@@ -27,8 +27,7 @@ } } -registerOperation("test-operation", TestOperation); -registerURLSelectionOperation( - "test-url-selection-operation", TestURLSelectionOperation); +register("test-operation", TestOperation); +register("test-url-selection-operation", TestURLSelectionOperation); console.log('Finish executing simple_module.js')
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui_test_2.js b/chrome/test/data/webui/settings/chromeos/os_settings_ui_test_2.js index 531942d..d781479c 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_ui_test_2.js +++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui_test_2.js
@@ -12,15 +12,7 @@ import {FakeNearbyShareSettings} from '../../nearby_share/shared/fake_nearby_share_settings.m.js'; import {FakeUserActionRecorder} from './fake_user_action_recorder.js'; - -/** - * Checks whether a given element is visible to the user. - * @param {!Element} element - * @returns {boolean} - */ -function isVisible(element) { - return !!(element && element.getBoundingClientRect().width > 0); -} +import {isVisible} from './test_util.js'; suite('os-settings-ui', () => { let ui; @@ -210,6 +202,21 @@ assertEquals(aboutSection, aboutPage.shadowRoot.activeElement); }); + test( + 'Detailed build info page is directly navigable and renders', + async () => { + const router = Router.getInstance(); + router.navigateTo(routes.DETAILED_BUILD_INFO); + + const settingsMain = ui.shadowRoot.querySelector('os-settings-main'); + const aboutPage = + settingsMain.shadowRoot.querySelector('os-settings-about-page'); + const detailedBuildInfoPage = + aboutPage.shadowRoot.querySelector('settings-detailed-build-info'); + await waitBeforeNextRender(detailedBuildInfoPage); + assertTrue(isVisible(detailedBuildInfoPage)); + }); + test('userActionRouteChange', function() { assertEquals(userActionRecorder.navigationCount, 0); Router.getInstance().navigateTo(routes.BASIC);
diff --git a/chrome/test/data/webui/settings/chromeos/test_util.js b/chrome/test/data/webui/settings/chromeos/test_util.js new file mode 100644 index 0000000..cb936c7 --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/test_util.js
@@ -0,0 +1,15 @@ +// 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. + +/** + * Returns whether the element both exists and is visible. + * @param {?Element} element + * @return {boolean} + */ +export function isVisible(element) { + // offsetWidth and offsetHeight reflect more ways that an element could be + // hidden, compared to checking the hidden attribute directly. + return !!element && element.getBoundingClientRect().width > 0 && + element.getBoundingClientRect().height > 0; +}
diff --git a/chrome/test/data/webui/signin/enterprise_profile_welcome_test.ts b/chrome/test/data/webui/signin/enterprise_profile_welcome_test.ts index 2f07593..97abe80b 100644 --- a/chrome/test/data/webui/signin/enterprise_profile_welcome_test.ts +++ b/chrome/test/data/webui/signin/enterprise_profile_welcome_test.ts
@@ -49,6 +49,16 @@ assertEquals(expectedUrl, img.src); } + /** + * Checks that the expected header color is displayed. + */ + function checkHeaderColor(expectedColor: string) { + assertTrue(isChildVisible(app, '#headerContainer')); + const headerElement = app.shadowRoot!.querySelector('#headerContainer')!; + assertEquals( + expectedColor, getComputedStyle(headerElement).backgroundColor); + } + test('proceed', async function() { assertTrue(isChildVisible(app, '#proceedButton')); app.$.proceedButton.click(); @@ -119,6 +129,7 @@ checkTextValues('title', 'subtitle', 'enterprise_info', 'proceed_label'); checkImageUrl(AVATAR_URL_1); assertFalse(isChildVisible(app, '.work-badge')); + checkHeaderColor('rgb(255, 0, 0)'); // Update the values. webUIListenerCallback('on-profile-info-changed', { @@ -138,5 +149,6 @@ checkImageUrl(AVATAR_URL_2); assertTrue(isChildVisible(app, '.work-badge')); assertFalse(isChildVisible(app, '#cancelButton')); + checkHeaderColor('rgb(0, 255, 0)'); }); });
diff --git a/chrome/test/data/webui/signin/sync_confirmation_test.ts b/chrome/test/data/webui/signin/sync_confirmation_test.ts index 6929f8b..5eac09a 100644 --- a/chrome/test/data/webui/signin/sync_confirmation_test.ts +++ b/chrome/test/data/webui/signin/sync_confirmation_test.ts
@@ -15,6 +15,15 @@ [true, false].forEach(isNewDesignEnabled => { const suiteDesignSuffix = isNewDesignEnabled ? 'NewDesign' : 'OldDesign'; + // Sync forced comes with different strings but these come from the UI class + // so loadTimeData.overrideValues() does not help here.s + const STANDARD_TITLE = 'Turn on sync?'; + const STANDARD_CONSENT_DESCRIPTION_TEXT = [ + STANDARD_TITLE, + 'Sync your bookmarks, passwords, history, and more on all your devices', + 'Google may use your history to personalize Search and other Google ' + + 'services', + ]; const STANDARD_CONSENT_CONFIRMATION = 'Yes, I\'m in'; [true, false].forEach(syncForcedEnabled => { @@ -60,6 +69,11 @@ // Tests that no DCHECKS are thrown during initialization of the UI. test('LoadPage', function() { + assertEquals( + STANDARD_TITLE, + app.shadowRoot!.querySelector('#syncConfirmationHeading')! + .textContent!.trim()); + const cancelButton = app.shadowRoot!.querySelector( isNewDesignEnabled ? '#notNowButton' : '#cancelButton') as @@ -126,7 +140,11 @@ // Confirm button. test('recordConsentOnConfirm', async function() { app.shadowRoot!.querySelector<HTMLElement>('#confirmButton')!.click(); - const [_, confirmation] = await browserProxy.whenCalled('confirm'); + const [description, confirmation] = + await browserProxy.whenCalled('confirm'); + assertEquals( + JSON.stringify(STANDARD_CONSENT_DESCRIPTION_TEXT), + JSON.stringify(description)); assertEquals(STANDARD_CONSENT_CONFIRMATION, confirmation); }); @@ -135,8 +153,11 @@ test('recordConsentOnSettingsLink', async function() { app.shadowRoot!.querySelector<HTMLElement>( '#settingsButton')!.click(); - const [_, confirmation] = + const [description, confirmation] = await browserProxy.whenCalled('goToSettings'); + assertEquals( + JSON.stringify(STANDARD_CONSENT_DESCRIPTION_TEXT), + JSON.stringify(description)); // 'Sync settings' is recorded for new design but this is passed from // the UI class so overriding loadTimeData does not help here. assertEquals('Settings', confirmation);
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn index f59b1571..9a5788a 100644 --- a/chrome/utility/BUILD.gn +++ b/chrome/utility/BUILD.gn
@@ -7,7 +7,7 @@ import("//build/config/sysroot.gni") import("//chrome/common/features.gni") import("//chrome/services/speech/buildflags/buildflags.gni") -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") import("//components/services/screen_ai/buildflags/features.gni") import("//crypto/features.gni") import("//extensions/buildflags/buildflags.gni") @@ -178,7 +178,7 @@ "//ash/services/recording", "//chrome/services/file_util", "//chrome/services/sharing", - "//chromeos/assistant:buildflags", + "//chromeos/ash/components/assistant:buildflags", "//chromeos/components/local_search_service:local_search_service", "//chromeos/components/local_search_service/public/mojom", "//chromeos/services/tts",
diff --git a/chrome/utility/DEPS b/chrome/utility/DEPS index ae19ae0..7608256 100644 --- a/chrome/utility/DEPS +++ b/chrome/utility/DEPS
@@ -28,7 +28,7 @@ "+chrome/services/util_win/util_win_impl.h", "+chrome/services/util_win/processor_metrics.h", "+chrome/services/util_win/public/mojom", - "+chromeos/assistant/buildflags.h", + "+chromeos/ash/components/assistant/buildflags.h", "+chromeos/components/local_search_service/local_search_service.h", "+chromeos/components/local_search_service/public/mojom", "+chromeos/components/quick_answers/public",
diff --git a/chrome/utility/services.cc b/chrome/utility/services.cc index e7cb4c6..4450f88 100644 --- a/chrome/utility/services.cc +++ b/chrome/utility/services.cc
@@ -114,7 +114,7 @@ #include "ash/services/quick_pair/quick_pair_service.h" #include "ash/services/recording/recording_service.h" #include "chrome/services/sharing/sharing_impl.h" -#include "chromeos/assistant/buildflags.h" // nogncheck +#include "chromeos/ash/components/assistant/buildflags.h" // nogncheck #include "chromeos/components/local_search_service/local_search_service.h" #include "chromeos/components/local_search_service/public/mojom/local_search_service.mojom.h" #include "chromeos/services/tts/public/mojom/tts_service.mojom.h"
diff --git a/chromecast/base/BUILD.gn b/chromecast/base/BUILD.gn index 90bb235..53dcc761 100644 --- a/chromecast/base/BUILD.gn +++ b/chromecast/base/BUILD.gn
@@ -385,8 +385,10 @@ "$java_test_dir/org/chromium/chromecast/base/ControllerTest.java", "$java_test_dir/org/chromium/chromecast/base/ItertoolsTest.java", "$java_test_dir/org/chromium/chromecast/base/ObservableAfterTest.java", + "$java_test_dir/org/chromium/chromecast/base/ObservableAlarmTest.java", "$java_test_dir/org/chromium/chromecast/base/ObservableAndTest.java", "$java_test_dir/org/chromium/chromecast/base/ObservableAndThenTest.java", + "$java_test_dir/org/chromium/chromecast/base/ObservableDelayTest.java", "$java_test_dir/org/chromium/chromecast/base/ObservableFilterTest.java", "$java_test_dir/org/chromium/chromecast/base/ObservableFlatMapTest.java", "$java_test_dir/org/chromium/chromecast/base/ObservableMapTest.java", @@ -405,6 +407,7 @@ "//base:jni_java", "//build/android:build_java", "//third_party/hamcrest:hamcrest_java", + "//third_party/mockito:mockito_java", ] } }
diff --git a/chromecast/base/java/src/org/chromium/chromecast/base/Observable.java b/chromecast/base/java/src/org/chromium/chromecast/base/Observable.java index 8914cbfb..1dc6003 100644 --- a/chromecast/base/java/src/org/chromium/chromecast/base/Observable.java +++ b/chromecast/base/java/src/org/chromium/chromecast/base/Observable.java
@@ -166,4 +166,49 @@ })::close); }); } + + /** + * An abstraction over posting a delayed task. Implementations should run the posted Runnable + * after a certain amount of time has elapsed, preferably on the same thread that posted the + * Runnable. + */ + public interface Scheduler { + void postDelayed(Runnable runnable, long delay); + } + + /** + * Return an Observable that activates a given amount of time (in milliseconds) after it is + * subscribed to. + * + * Note that the alarm countdown starts when subscribed, not when the Observable is constructed. + * Therefore, if there are multiple observers, each will have its own timer. + * + * If you use an alarm as the argument to an `.and()` operator, for example, a unique timer will + * start for each activation of the left-hand side of the `.and()` call. + * + * The Scheduler is responsible for executing a Runnable after the given delay has elapsed, + * preferably on the same thread that invoked its postDelayed() method, unless the observers of + * this Observable are thread-safe. + */ + public static Observable<?> alarm(Scheduler scheduler, long ms) { + return make(observer -> { + Controller<Unit> activation = new Controller<>(); + scheduler.postDelayed(() -> activation.set(Unit.unit()), ms); + return activation.subscribe(observer); + }); + } + + /** + * An Observable that delays any activations by the given amount of time. + * + * If the activation is revoked before the given amount of time elapses, the activation is + * effectively "canceled" from the perspective of observers. + * + * The Scheduler is responsible for executing a Runnable after the given delay has elapsed, + * preferably on the same thread that invoked its postDelayed() method, unless the observers of + * this Observable are thread-safe. + */ + public final Observable<T> delay(Scheduler scheduler, long ms) { + return flatMap(t -> alarm(scheduler, ms).map(x -> t)); + } }
diff --git a/chromecast/base/java/test/org/chromium/chromecast/base/ObservableAlarmTest.java b/chromecast/base/java/test/org/chromium/chromecast/base/ObservableAlarmTest.java new file mode 100644 index 0000000..d3a641a --- /dev/null +++ b/chromecast/base/java/test/org/chromium/chromecast/base/ObservableAlarmTest.java
@@ -0,0 +1,82 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chromecast.base; + +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyLong; +import static org.mockito.Mockito.eq; +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 org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.BlockJUnit4ClassRunner; +import org.mockito.ArgumentCaptor; + +import org.chromium.chromecast.base.Observable.Scheduler; + +/** + * Tests for Observable#alarm(). + */ +@RunWith(BlockJUnit4ClassRunner.class) +public class ObservableAlarmTest { + @Test + public void testAlarmDoesNotStartWithoutBeingSubscribedTo() { + Scheduler scheduler = mock(Scheduler.class); + Observable<?> a = Observable.alarm(scheduler, 100L); + verify(scheduler, never()).postDelayed(any(), anyLong()); + } + + @Test + public void testAlarmStartsForEachObserver() { + Scheduler scheduler = mock(Scheduler.class); + Observable<?> a = Observable.alarm(scheduler, 100L); + ReactiveRecorder recorder1 = ReactiveRecorder.record(a); + ReactiveRecorder recorder2 = ReactiveRecorder.record(a); + recorder1.verify().end(); + recorder2.verify().end(); + verify(scheduler, times(2)).postDelayed(any(), eq(100L)); + } + + @Test + public void testPostedRunnableResolvesCallback() { + Scheduler scheduler = mock(Scheduler.class); + ArgumentCaptor<Runnable> taskCaptor = ArgumentCaptor.forClass(Runnable.class); + Observable<?> a = Observable.alarm(scheduler, 100L); + ReactiveRecorder recorder = ReactiveRecorder.record(a); + verify(scheduler).postDelayed(taskCaptor.capture(), eq(100L)); + Runnable delayedTask = taskCaptor.getValue(); + delayedTask.run(); + recorder.verify().opened(Unit.unit()).end(); + } + + @Test + public void testDoesNotNotifyObserverAfterUnsubscribe() { + Scheduler scheduler = mock(Scheduler.class); + ArgumentCaptor<Runnable> taskCaptor = ArgumentCaptor.forClass(Runnable.class); + Observable<?> a = Observable.alarm(scheduler, 100L); + ReactiveRecorder recorder = ReactiveRecorder.record(a); + verify(scheduler).postDelayed(taskCaptor.capture(), eq(100L)); + Runnable delayedTask = taskCaptor.getValue(); + recorder.unsubscribe(); + delayedTask.run(); + recorder.verify().end(); + } + + @Test + public void testNotifiesObserverAsynchronouslyWhenDelayIsZero() { + Scheduler scheduler = mock(Scheduler.class); + ArgumentCaptor<Runnable> taskCaptor = ArgumentCaptor.forClass(Runnable.class); + Observable<?> a = Observable.alarm(scheduler, 0L); + ReactiveRecorder recorder = ReactiveRecorder.record(a); + verify(scheduler).postDelayed(taskCaptor.capture(), eq(0L)); + recorder.verify().end(); + Runnable delayedTask = taskCaptor.getValue(); + delayedTask.run(); + recorder.verify().opened(Unit.unit()).end(); + } +}
diff --git a/chromecast/base/java/test/org/chromium/chromecast/base/ObservableDelayTest.java b/chromecast/base/java/test/org/chromium/chromecast/base/ObservableDelayTest.java new file mode 100644 index 0000000..bff17b56 --- /dev/null +++ b/chromecast/base/java/test/org/chromium/chromecast/base/ObservableDelayTest.java
@@ -0,0 +1,146 @@ +// 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.chromecast.base; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.BlockJUnit4ClassRunner; + +import java.util.Map; +import java.util.TreeMap; + +/** + * Tests for Observable#delay(). + */ +@RunWith(BlockJUnit4ClassRunner.class) +public class ObservableDelayTest { + // Helper function that inserts the key-value pair into a Map if the key isn't already in the + // Map, or updates the value for the key by applying the combinator to the current value and the + // new value if the key is already in the Map. This lets you turn a Map into a sort of MultiMap, + // as long as you supply a monoidal combinator for the Map's value type. + private static <K, V> void updateValue(Map<K, V> map, K key, V value, + BiFunction<? super V, ? super V, ? extends V> combinator) { + V current = map.get(key); + map.put(key, current == null ? value : combinator.apply(current, value)); + } + + private static class FakeScheduler implements Observable.Scheduler { + private long mCurrentTime; + private final TreeMap<Long, Runnable> mTasks = new TreeMap<>(); + + @Override + public void postDelayed(Runnable runnable, long delay) { + // Allow multiple tasks to be posted with the same delay by combining any + // already-inserted Runnables with the newly-posted Runnable. + updateValue(mTasks, mCurrentTime + delay, runnable, (a, b) -> () -> { + a.run(); + b.run(); + }); + } + + public void fastForwardBy(long ms) { + // Query for tasks that are scheduled for after the current time (exclusive), and before + // what the current time will be after the given delay (inclusive). By making the start + // time exclusive, we avoid running already-run tasks, while by making the end time + // inclusive, we ensure fastForwardBy(n) runs tasks that were posted with a delay of n. + mTasks.subMap(mCurrentTime, false, mCurrentTime + ms, true) + .values() + .forEach(Runnable::run); + mCurrentTime += ms; + } + } + + @Test + public void testDelayController() { + FakeScheduler scheduler = new FakeScheduler(); + Controller<String> a = new Controller<>(); + a.set("a"); + ReactiveRecorder recorder = ReactiveRecorder.record(a.delay(scheduler, 100)); + recorder.verify().end(); + scheduler.fastForwardBy(100); + recorder.verify().opened("a").end(); + } + + @Test + public void testDoesNotNotifyBeforeDelayElapses() { + FakeScheduler scheduler = new FakeScheduler(); + Controller<String> a = new Controller<>(); + a.set("a"); + ReactiveRecorder recorder = ReactiveRecorder.record(a.delay(scheduler, 100)); + recorder.verify().end(); + scheduler.fastForwardBy(99); + recorder.verify().end(); + } + + @Test + public void testDoesNotNotifyIfUnsubscribe() { + FakeScheduler scheduler = new FakeScheduler(); + Controller<String> a = new Controller<>(); + a.set("a"); + ReactiveRecorder recorder = ReactiveRecorder.record(a.delay(scheduler, 100)); + recorder.unsubscribe(); + scheduler.fastForwardBy(100); + recorder.verify().end(); + } + + @Test + public void testAccumulateDelay() { + FakeScheduler scheduler = new FakeScheduler(); + Controller<String> a = new Controller<>(); + a.set("a"); + ReactiveRecorder recorder = ReactiveRecorder.record(a.delay(scheduler, 100)); + scheduler.fastForwardBy(50); + recorder.verify().end(); + scheduler.fastForwardBy(50); + recorder.verify().opened("a").end(); + } + + @Test + public void testDelayInt() { + FakeScheduler scheduler = new FakeScheduler(); + ReactiveRecorder recorder = + ReactiveRecorder.record(Observable.just(10).delay(scheduler, 100)); + scheduler.fastForwardBy(50); + recorder.verify().end(); + scheduler.fastForwardBy(50); + recorder.verify().opened(10).end(); + } + + @Test + public void testDelayEmpty() { + FakeScheduler scheduler = new FakeScheduler(); + ReactiveRecorder recorder = + ReactiveRecorder.record(Observable.empty().delay(scheduler, 100)); + scheduler.fastForwardBy(100); + recorder.verify().end(); + } + + @Test + public void testDelayHigherCardinalityObservable() { + FakeScheduler scheduler = new FakeScheduler(); + Observable<Integer> src = Observable.make(observer + -> Scopes.combine(observer.open(10), observer.open(20), observer.open(30))); + ReactiveRecorder recorder = ReactiveRecorder.record(src.delay(scheduler, 100)); + recorder.verify().end(); + scheduler.fastForwardBy(100); + recorder.verify().opened(10).opened(20).opened(30).end(); + recorder.unsubscribe(); + recorder.verify().closed(30).closed(20).closed(10).end(); + } + + @Test + public void testNewActivationResetsDelay() { + FakeScheduler scheduler = new FakeScheduler(); + Controller<String> a = new Controller<>(); + a.set("a"); + ReactiveRecorder recorder = ReactiveRecorder.record(a.delay(scheduler, 100)); + scheduler.fastForwardBy(50); + a.set("b"); + scheduler.fastForwardBy(50); + recorder.verify().end(); + scheduler.fastForwardBy(50); + recorder.verify().opened("b").end(); + } +}
diff --git a/chromecast/browser/android/BUILD.gn b/chromecast/browser/android/BUILD.gn index f9a2765b..52d4eb4 100644 --- a/chromecast/browser/android/BUILD.gn +++ b/chromecast/browser/android/BUILD.gn
@@ -129,6 +129,7 @@ java_src_dir = "//chromecast/browser/android/apk/src" sources = [ "$java_src_dir/org/chromium/chromecast/shell/AsyncTaskRunner.java", + "$java_src_dir/org/chromium/chromecast/shell/HandlerScheduler.java", "$java_src_dir/org/chromium/chromecast/shell/LocalBroadcastReceiverScope.java", ] deps = [ @@ -259,6 +260,7 @@ "junit/src/org/chromium/chromecast/shell/CastWebContentsServiceTest.java", "junit/src/org/chromium/chromecast/shell/CastWebContentsSurfaceHelperTest.java", "junit/src/org/chromium/chromecast/shell/ElidedLogcatProviderUnitTest.java", + "junit/src/org/chromium/chromecast/shell/HandlerSchedulerTest.java", "junit/src/org/chromium/chromecast/shell/LocalBroadcastReceiverScopeTest.java", "junit/src/org/chromium/chromecast/shell/LogcatElisionUnitTest.java", ]
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/HandlerScheduler.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/HandlerScheduler.java new file mode 100644 index 0000000..2613554 --- /dev/null +++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/HandlerScheduler.java
@@ -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. + +package org.chromium.chromecast.shell; + +import android.os.Handler; +import android.os.Looper; + +import org.chromium.chromecast.base.Observable.Scheduler; + +/** + * A thin adapter layer that allows using Android Handlers with Observable methods like alarm() and + * delay(). + * + * Example: + * + * Observable<Client> clients = ...; + * Subscription sub = clients.delay(HandlerScheduler.onCurrentThread(), 200).subscribe(client -> { + * // This code is only invoked 200 ms after |clients| is actually activated. + * ... + * }); + */ +public class HandlerScheduler { + public static Scheduler fromHandler(Handler handler) { + return handler::postDelayed; + } + + public static Scheduler onCurrentThread() { + return fromHandler(new Handler(Looper.myLooper())); + } +} \ No newline at end of file
diff --git a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/HandlerSchedulerTest.java b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/HandlerSchedulerTest.java new file mode 100644 index 0000000..18f31ca3 --- /dev/null +++ b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/HandlerSchedulerTest.java
@@ -0,0 +1,75 @@ +// 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.chromecast.shell; + +import static org.junit.Assert.assertEquals; + +import android.os.Handler; +import android.os.Looper; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Shadows; +import org.robolectric.annotation.Config; +import org.robolectric.annotation.LooperMode; +import org.robolectric.shadows.ShadowLooper; + +import org.chromium.chromecast.base.Box; +import org.chromium.chromecast.base.Observable.Scheduler; +import org.chromium.testing.local.LocalRobolectricTestRunner; + +/** + * Tests for HandlerScheduler. + */ +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +@LooperMode(LooperMode.Mode.LEGACY) +public class HandlerSchedulerTest { + @Test + public void testInjectedHandler() { + Looper looper = Looper.getMainLooper(); + Handler handler = new Handler(looper); + Scheduler scheduler = HandlerScheduler.fromHandler(handler); + Box<Integer> box = new Box<>(0); + scheduler.postDelayed(() -> ++box.value, 100); + assertEquals(0, (int) box.value); + ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); + assertEquals(1, (int) box.value); + scheduler.postDelayed(() -> ++box.value, 100); + ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); + assertEquals(2, (int) box.value); + } + + @Test + public void testOnCurrentThread() { + Scheduler scheduler = HandlerScheduler.onCurrentThread(); + Box<Integer> box = new Box<>(0); + scheduler.postDelayed(() -> ++box.value, 100); + assertEquals(0, (int) box.value); + ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); + assertEquals(1, (int) box.value); + scheduler.postDelayed(() -> ++box.value, 100); + ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); + assertEquals(2, (int) box.value); + } + + @Test + public void testDelayInterval() { + ShadowLooper shadowLooper = Shadows.shadowOf(Looper.getMainLooper()); + org.robolectric.util.Scheduler robolectricScheduler = shadowLooper.getScheduler(); + Scheduler scheduler = HandlerScheduler.onCurrentThread(); + Box<Integer> box = new Box<>(0); + scheduler.postDelayed(() -> ++box.value, 100); + robolectricScheduler.advanceBy(50); + assertEquals(0, (int) box.value); + robolectricScheduler.advanceBy(50); + assertEquals(1, (int) box.value); + scheduler.postDelayed(() -> ++box.value, 100); + robolectricScheduler.advanceBy(50); + assertEquals(1, (int) box.value); + robolectricScheduler.advanceBy(50); + assertEquals(2, (int) box.value); + } +}
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index a0b9946..10a2df57 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -14803.0.0 \ No newline at end of file +14829.0.0 \ No newline at end of file
diff --git a/chromeos/ash/components/BUILD.gn b/chromeos/ash/components/BUILD.gn index cab6ed6..bee3a48 100644 --- a/chromeos/ash/components/BUILD.gn +++ b/chromeos/ash/components/BUILD.gn
@@ -10,5 +10,8 @@ # component and add a reference here. source_set("unit_tests") { testonly = true - deps = [ "//chromeos/ash/components/dbus:unit_tests" ] + deps = [ + "//chromeos/ash/components/dbus:unit_tests", + "//chromeos/ash/components/human_presence:unit_tests", + ] }
diff --git a/chromeos/assistant/.gitignore b/chromeos/ash/components/assistant/.gitignore similarity index 100% rename from chromeos/assistant/.gitignore rename to chromeos/ash/components/assistant/.gitignore
diff --git a/chromeos/ash/components/assistant/BUILD.gn b/chromeos/ash/components/assistant/BUILD.gn new file mode 100644 index 0000000..63b765a --- /dev/null +++ b/chromeos/ash/components/assistant/BUILD.gn
@@ -0,0 +1,21 @@ +# 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. + +import("//ash/ambient/resources/resources.gni") +import("//build/buildflag_header.gni") +import("//build/config/chromeos/ui_mode.gni") +import("//chromeos/ash/components/assistant/ambient.gni") +import("//chromeos/ash/components/assistant/assistant.gni") + +assert(is_chromeos_ash, "Non Chrome OS builds cannot depend on //chromeos/ash") + +buildflag_header("buildflags") { + header = "buildflags.h" + + flags = [ + "ENABLE_CROS_LIBASSISTANT=$enable_cros_libassistant", + "ENABLE_CROS_AMBIENT_MODE_BACKEND=$enable_cros_ambient_mode_backend", + "HAS_ASH_AMBIENT_ANIMATION_RESOURCES=$include_ash_ambient_animation_resources", + ] +}
diff --git a/chromeos/assistant/COMMON_METADATA b/chromeos/ash/components/assistant/COMMON_METADATA similarity index 100% rename from chromeos/assistant/COMMON_METADATA rename to chromeos/ash/components/assistant/COMMON_METADATA
diff --git a/chromeos/assistant/DEPS b/chromeos/ash/components/assistant/DEPS similarity index 100% rename from chromeos/assistant/DEPS rename to chromeos/ash/components/assistant/DEPS
diff --git a/chromeos/ash/components/assistant/DIR_METADATA b/chromeos/ash/components/assistant/DIR_METADATA new file mode 100644 index 0000000..5ba0efa --- /dev/null +++ b/chromeos/ash/components/assistant/DIR_METADATA
@@ -0,0 +1 @@ +mixins: "//chromeos/ash/components/assistant/COMMON_METADATA"
diff --git a/chromeos/ash/components/assistant/OWNERS b/chromeos/ash/components/assistant/OWNERS new file mode 100644 index 0000000..e69808e --- /dev/null +++ b/chromeos/ash/components/assistant/OWNERS
@@ -0,0 +1,3 @@ +updowndota@chromium.org +wutao@chromium.org +xiaohuic@chromium.org
diff --git a/chromeos/assistant/ambient.gni b/chromeos/ash/components/assistant/ambient.gni similarity index 100% rename from chromeos/assistant/ambient.gni rename to chromeos/ash/components/assistant/ambient.gni
diff --git a/chromeos/ash/components/assistant/assistant.gni b/chromeos/ash/components/assistant/assistant.gni new file mode 100644 index 0000000..5f4150e --- /dev/null +++ b/chromeos/ash/components/assistant/assistant.gni
@@ -0,0 +1,19 @@ +import("//build/config/chrome_build.gni") +import("//build/config/chromeos/ui_mode.gni") + +declare_args() { + # Enable assistant implementation based on libassistant. + enable_cros_libassistant = is_chromeos_ash && is_chrome_branded + + # Enable a fake microphone, which can replay audio files as microphone input. + # See chromeos/ash/components/assistant/tools/send-audio.sh + enable_fake_assistant_microphone = false +} + +declare_args() { + # Enable Assistant integration tests using LibAssistant and a fake S3 server. + # This requires libassistant.so to support grpc communication with the S3 + # server, which increases the library size, which is why we introduced this + # flag to disable them in the release builds. + enable_assistant_integration_tests = enable_cros_libassistant +}
diff --git a/chromeos/ash/components/assistant/test_support/BUILD.gn b/chromeos/ash/components/assistant/test_support/BUILD.gn new file mode 100644 index 0000000..dd26553 --- /dev/null +++ b/chromeos/ash/components/assistant/test_support/BUILD.gn
@@ -0,0 +1,14 @@ +import("//build/config/chromeos/ui_mode.gni") + +assert(is_chromeos_ash, "Non Chrome OS builds cannot depend on //chromeos/ash") + +static_library("test_support") { + testonly = true + sources = [ "expect_utils.h" ] + deps = [ + "//base", + "//base/test:test_support", + "//testing/gmock", + "//testing/gtest", + ] +}
diff --git a/chromeos/ash/components/assistant/test_support/expect_utils.h b/chromeos/ash/components/assistant/test_support/expect_utils.h new file mode 100644 index 0000000..a38d997d --- /dev/null +++ b/chromeos/ash/components/assistant/test_support/expect_utils.h
@@ -0,0 +1,75 @@ +// 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. + +#ifndef CHROMEOS_ASH_COMPONENTS_ASSISTANT_TEST_SUPPORT_EXPECT_UTILS_H_ +#define CHROMEOS_ASH_COMPONENTS_ASSISTANT_TEST_SUPPORT_EXPECT_UTILS_H_ + +#include "base/callback_forward.h" +#include "base/run_loop.h" +#include "base/threading/sequenced_task_runner_handle.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash { +namespace assistant { +namespace test { + +namespace { + +template <typename T> +void CheckResult(base::OnceClosure quit, + T expected_value, + base::RepeatingCallback<T()> value_callback) { + if (expected_value == value_callback.Run()) { + std::move(quit).Run(); + return; + } + + // Check again in the future + base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, + base::BindOnce(CheckResult<T>, std::move(quit), expected_value, + value_callback), + base::Milliseconds(10)); +} + +} // namespace + +// Check if the |expected_value| is equal to the result of running +// |value_callback|. This method will block and continuously try the +// comparison above until it succeeds, or timeout. +template <typename T> +void ExpectResult(T expected_value, + base::RepeatingCallback<T()> value_callback, + const std::string& tag = std::string()) { + // Wait until we're ready or we hit the default task environment timeout. + base::RunLoop run_loop; + CheckResult(run_loop.QuitClosure(), expected_value, value_callback); + + EXPECT_NO_FATAL_FAILURE(run_loop.Run()) + << (tag.empty() ? tag : tag + ": ") + << "Failed waiting for expected result.\n" + << "Expected \"" << expected_value << "\"\n" + << "Got \"" << value_callback.Run() << "\""; +} + +#define WAIT_FOR_CALL(mock_obj, call) \ + { \ + base::RunLoop run_loop; \ + EXPECT_CALL(mock_obj, call).WillOnce([quit = run_loop.QuitClosure()]() { \ + std::move(quit).Run(); \ + }); \ + EXPECT_NO_FATAL_FAILURE(run_loop.Run()) \ + << #mock_obj << "::" << #call << " is NOT called."; \ + } + +} // namespace test +} // namespace assistant +} // namespace ash + +// TODO(https://crbug.com/1164001): remove when the migration is finished. +namespace chromeos::assistant::test { +using ::ash::assistant::test::ExpectResult; +} + +#endif // CHROMEOS_ASH_COMPONENTS_ASSISTANT_TEST_SUPPORT_EXPECT_UTILS_H_
diff --git a/chromeos/assistant/tools/send-audio.sh b/chromeos/ash/components/assistant/tools/send-audio.sh similarity index 100% rename from chromeos/assistant/tools/send-audio.sh rename to chromeos/ash/components/assistant/tools/send-audio.sh
diff --git a/chromeos/components/human_presence/BUILD.gn b/chromeos/ash/components/human_presence/BUILD.gn similarity index 100% rename from chromeos/components/human_presence/BUILD.gn rename to chromeos/ash/components/human_presence/BUILD.gn
diff --git a/chromeos/components/human_presence/OWNERS b/chromeos/ash/components/human_presence/OWNERS similarity index 100% rename from chromeos/components/human_presence/OWNERS rename to chromeos/ash/components/human_presence/OWNERS
diff --git a/chromeos/ash/components/human_presence/human_presence_configuration.cc b/chromeos/ash/components/human_presence/human_presence_configuration.cc new file mode 100644 index 0000000..034e981 --- /dev/null +++ b/chromeos/ash/components/human_presence/human_presence_configuration.cc
@@ -0,0 +1,226 @@ +// 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. + +#include "chromeos/ash/components/human_presence/human_presence_configuration.h" + +#include "ash/constants/ash_features.h" +#include "base/logging.h" +#include "base/metrics/field_trial_params.h" +#include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" +#include "base/time/time.h" +#include "chromeos/dbus/hps/hps_service.pb.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace hps { +namespace { + +// Default minimum amount of time for which a positive snooper presence will be +// reported. +constexpr base::TimeDelta kSnoopingProtectionPositiveWindowDefault = + base::Seconds(4); + +// Default quick dim delay to configure power_manager. +constexpr base::TimeDelta kQuickDimDelayDefault = base::Seconds(10); + +// Default quick lock delay to configure power_manager. +constexpr base::TimeDelta kQuickLockDelayDefault = base::Seconds(130); + +// Default value determines whether send feedback to configure power_manager. +constexpr int kShouldSendFeedbackIfUndimmed = false; + +// Returns either the integer parameter with the given name, or nullopt if the +// parameter can't be found or parsed. +absl::optional<int> GetIntParam(const base::FieldTrialParams& params, + const std::string& feature_name, + const std::string& param_name) { + const std::string full_param_name = + base::StrCat({feature_name, "_", param_name}); + const auto it = params.find(full_param_name); + if (it == params.end()) + return absl::nullopt; + + int result; + if (!base::StringToInt(it->second, &result)) + return absl::nullopt; + + return result; +} + +// The config to use when no parameters are specified. We need to ensure that +// that empty params induce a working config (as required for, e.g., a +// chrome:://flags entry). +hps::FeatureConfig GetDefaultSnoopingProtectionConfig() { + hps::FeatureConfig config; + + // Just apply a threshold to the last-seen inference. + auto& filter_config = *config.mutable_consecutive_results_filter_config(); + filter_config.set_positive_count_threshold(1); + filter_config.set_negative_count_threshold(1); + filter_config.set_uncertain_count_threshold(1); + filter_config.set_positive_score_threshold(0); + filter_config.set_negative_score_threshold(0); + + return config; +} + +hps::FeatureConfig GetDefaultLockOnLeaveConfig() { + hps::FeatureConfig config; + auto& filter_config = *config.mutable_consecutive_results_filter_config(); + // Any positive result will undim the screen. + filter_config.set_positive_count_threshold(1); + // Only dim if at least two consecutive negative result. + filter_config.set_negative_count_threshold(2); + // UNKNOWN will not undim, but it will block quick dim, so it should also be + // fired with confidence. + filter_config.set_uncertain_count_threshold(2); + filter_config.set_positive_score_threshold(0); + filter_config.set_negative_score_threshold(0); + return config; +} + +// This function constructs a FeatureConfig proto from feature parameters. +// The FeatureConfig contains one type of FilterConfig that will be used for +// enabling a human presence feature. +// +// If empty parameters are provided, a reasonable default is used. +// +// More details can be found at: +// src/platform2/hps/daemon/filters/filter_factory.h +absl::optional<hps::FeatureConfig> ConstructFilterConfigFromFeatureParams( + const base::Feature& feature, + const hps::FeatureConfig& default_value) { + // Load current params map for the feature. + base::FieldTrialParams params; + base::GetFieldTrialParamsByFeature(feature, ¶ms); + + // Returns default if no params is set. + if (params.empty()) { + return default_value; + } + + const std::string& feature_name = feature.name; + + const absl::optional<int> filter_config_case = + GetIntParam(params, feature_name, "filter_config_case"); + if (!filter_config_case.has_value()) { + LOG(ERROR) << "Filter config error: missing param filter_config_case for " + << feature_name; + return absl::nullopt; + } + + switch (*filter_config_case) { + case hps::FeatureConfig::kBasicFilterConfig: { + hps::FeatureConfig config; + config.mutable_basic_filter_config(); + return config; + } + + case hps::FeatureConfig::kConsecutiveResultsFilterConfig: { + const absl::optional<int> positive_count_threshold = + GetIntParam(params, feature_name, "positive_count_threshold"); + const absl::optional<int> negative_count_threshold = + GetIntParam(params, feature_name, "negative_count_threshold"); + const absl::optional<int> uncertain_count_threshold = + GetIntParam(params, feature_name, "uncertain_count_threshold"); + const absl::optional<int> positive_score_threshold = + GetIntParam(params, feature_name, "positive_score_threshold"); + const absl::optional<int> negative_score_threshold = + GetIntParam(params, feature_name, "negative_score_threshold"); + + if (!positive_count_threshold.has_value() || + !negative_count_threshold.has_value() || + !uncertain_count_threshold.has_value() || + !positive_score_threshold.has_value() || + !negative_score_threshold.has_value()) { + LOG(ERROR) << "Filter config error: missing params for " + "ConsecutiveResultsFilterConfig for " + << feature_name; + return absl::nullopt; + } + + hps::FeatureConfig config; + auto& filter_config = *config.mutable_consecutive_results_filter_config(); + filter_config.set_positive_count_threshold(*positive_count_threshold); + filter_config.set_negative_count_threshold(*negative_count_threshold); + filter_config.set_uncertain_count_threshold(*uncertain_count_threshold); + filter_config.set_positive_score_threshold(*positive_score_threshold); + filter_config.set_negative_score_threshold(*negative_score_threshold); + return config; + } + + case hps::FeatureConfig::kAverageFilterConfig: { + const absl::optional<int> average_window_size = + GetIntParam(params, feature_name, "average_window_size"); + const absl::optional<int> positive_score_threshold = + GetIntParam(params, feature_name, "positive_score_threshold"); + const absl::optional<int> negative_score_threshold = + GetIntParam(params, feature_name, "negative_score_threshold"); + const absl::optional<int> default_uncertain_score = + GetIntParam(params, feature_name, "default_uncertain_score"); + + if (!average_window_size.has_value() || + !positive_score_threshold.has_value() || + !negative_score_threshold.has_value() || + !default_uncertain_score.has_value()) { + LOG(ERROR) << "Filter config error: missing params for " + "AverageFilterConfig for " + << feature_name; + return absl::nullopt; + } + + hps::FeatureConfig config; + auto& filter_config = *config.mutable_average_filter_config(); + filter_config.set_average_window_size(*average_window_size); + filter_config.set_positive_score_threshold(*positive_score_threshold); + filter_config.set_negative_score_threshold(*negative_score_threshold); + filter_config.set_default_uncertain_score(*default_uncertain_score); + return config; + } + + default: + return absl::nullopt; + } +} + +} // namespace + +absl::optional<hps::FeatureConfig> GetEnableLockOnLeaveConfig() { + return ConstructFilterConfigFromFeatureParams(ash::features::kQuickDim, + GetDefaultLockOnLeaveConfig()); +} + +absl::optional<hps::FeatureConfig> GetEnableSnoopingProtectionConfig() { + return ConstructFilterConfigFromFeatureParams( + ash::features::kSnoopingProtection, GetDefaultSnoopingProtectionConfig()); +} + +base::TimeDelta GetQuickDimDelay() { + const int quick_dim_ms = base::GetFieldTrialParamByFeatureAsInt( + ash::features::kQuickDim, "QuickDim_quick_dim_ms", + kQuickDimDelayDefault.InMilliseconds()); + return base::Milliseconds(quick_dim_ms); +} + +base::TimeDelta GetQuickLockDelay() { + const int quick_lock_ms = base::GetFieldTrialParamByFeatureAsInt( + ash::features::kQuickDim, "QuickDim_quick_lock_ms", + kQuickLockDelayDefault.InMilliseconds()); + return base::Milliseconds(quick_lock_ms); +} + +bool GetQuickDimFeedbackEnabled() { + return base::GetFieldTrialParamByFeatureAsBool( + ash::features::kQuickDim, "QuickDim_send_feedback_if_undimmed", + kShouldSendFeedbackIfUndimmed); +} + +base::TimeDelta GetSnoopingProtectionPositiveWindow() { + const int pos_window_ms = base::GetFieldTrialParamByFeatureAsInt( + ash::features::kSnoopingProtection, "SnoopingProtection_pos_window_ms", + kSnoopingProtectionPositiveWindowDefault.InMilliseconds()); + return base::Milliseconds(pos_window_ms); +} + +} // namespace hps
diff --git a/chromeos/ash/components/human_presence/human_presence_configuration.h b/chromeos/ash/components/human_presence/human_presence_configuration.h new file mode 100644 index 0000000..5ea65a01 --- /dev/null +++ b/chromeos/ash/components/human_presence/human_presence_configuration.h
@@ -0,0 +1,46 @@ +// 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. + +#ifndef CHROMEOS_ASH_COMPONENTS_HUMAN_PRESENCE_HUMAN_PRESENCE_CONFIGURATION_H_ +#define CHROMEOS_ASH_COMPONENTS_HUMAN_PRESENCE_HUMAN_PRESENCE_CONFIGURATION_H_ + +#include "base/component_export.h" +#include "base/time/time.h" +#include "chromeos/dbus/hps/hps_service.pb.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace base { +class TimeDelta; +} // namespace base + +namespace hps { + +// Gets FeatureConfig for enabling LockOnLeave from Finch. +// Returns nullopt if feature is not enabled or can't be parsed correctly. +COMPONENT_EXPORT(HPS) +absl::optional<hps::FeatureConfig> GetEnableLockOnLeaveConfig(); + +// Gets FeatureConfig for enabling SnoopingProtection from Finch. +// Returns nullopt if feature is not enabled or can't be parsed correctly. +COMPONENT_EXPORT(HPS) +absl::optional<hps::FeatureConfig> GetEnableSnoopingProtectionConfig(); + +// Gets quick dim delay to configure power_manager. +COMPONENT_EXPORT(HPS) base::TimeDelta GetQuickDimDelay(); + +// Gets quick lock delay to configure power_manager. +COMPONENT_EXPORT(HPS) base::TimeDelta GetQuickLockDelay(); + +// If true, quick dim functionality should be temporarily disabled when a quick +// dim is undimmed within a short period of time. +// Used to configure power_manager. +COMPONENT_EXPORT(HPS) bool GetQuickDimFeedbackEnabled(); + +// Gets the window following a positive signal in which snooping protection +// should continue to report snooper presence. +COMPONENT_EXPORT(HPS) base::TimeDelta GetSnoopingProtectionPositiveWindow(); + +} // namespace hps + +#endif // CHROMEOS_ASH_COMPONENTS_HUMAN_PRESENCE_HUMAN_PRESENCE_CONFIGURATION_H_
diff --git a/chromeos/ash/components/human_presence/human_presence_configuration_unittest.cc b/chromeos/ash/components/human_presence/human_presence_configuration_unittest.cc new file mode 100644 index 0000000..d6b4b40 --- /dev/null +++ b/chromeos/ash/components/human_presence/human_presence_configuration_unittest.cc
@@ -0,0 +1,187 @@ +// 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. + +#include "chromeos/ash/components/human_presence/human_presence_configuration.h" + +#include "ash/constants/ash_features.h" +#include "base/test/scoped_feature_list.h" +#include "chromeos/dbus/hps/hps_service.pb.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 hps { + +// Expect two protos to be equal if they are serialized into the same strings. +MATCHER_P(ProtoEquals, expected_message, "") { + std::string expected_serialized, actual_serialized; + expected_message.SerializeToString(&expected_serialized); + arg.SerializeToString(&actual_serialized); + return expected_serialized == actual_serialized; +} + +TEST(HumanPresenceFeatureConfigTest, EmptyParamsValid) { + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + {ash::features::kQuickDim, ash::features::kSnoopingProtection}, + {} /* disabled_features */); + + EXPECT_EQ(GetEnableLockOnLeaveConfig()->filter_config_case(), + hps::FeatureConfig::kConsecutiveResultsFilterConfig); + EXPECT_EQ(GetEnableSnoopingProtectionConfig()->filter_config_case(), + hps::FeatureConfig::kConsecutiveResultsFilterConfig); +} + +TEST(HumanPresenceFeatureConfigTest, + ReturnNullIfTypeIsNotRecognizableLockOnLeave) { + const base::FieldTrialParams params = {{"QuickDim_filter_config_case", "0"}}; + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeaturesAndParameters( + {{ash::features::kQuickDim, params}}, {}); + + EXPECT_FALSE(GetEnableLockOnLeaveConfig().has_value()); +} + +TEST(HumanPresenceFeatureConfigTest, + ReturnNullIfTypeIsNotRecognizableSnoopingProtection) { + const base::FieldTrialParams params = { + {"SnoopingProtection_filter_config_case", "0"}}; + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeaturesAndParameters( + {{ash::features::kSnoopingProtection, params}}, {}); + + EXPECT_FALSE(GetEnableSnoopingProtectionConfig().has_value()); +} + +TEST(HumanPresenceFeatureConfigTest, VerifyBasicFilterConfigLockOnLeave) { + const std::map<std::string, std::string> params = { + {"QuickDim_filter_config_case", "1"}}; + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeaturesAndParameters( + {{ash::features::kQuickDim, params}}, {}); + + hps::FeatureConfig expected_config; + expected_config.mutable_basic_filter_config(); + + EXPECT_THAT(GetEnableLockOnLeaveConfig().value(), + ProtoEquals(expected_config)); +} + +TEST(HumanPresenceFeatureConfigTest, + VerifyBasicFilterConfigSnoopingProtection) { + const std::map<std::string, std::string> params = { + {"SnoopingProtection_filter_config_case", "1"}}; + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeaturesAndParameters( + {{ash::features::kSnoopingProtection, params}}, {}); + + hps::FeatureConfig expected_config; + expected_config.mutable_basic_filter_config(); + + EXPECT_THAT(GetEnableSnoopingProtectionConfig().value(), + ProtoEquals(expected_config)); +} + +TEST(HumanPresenceFeatureConfigTest, + VerifyConsecutiveResultsFilterConfigLockOnLeave) { + const std::map<std::string, std::string> params = { + {"QuickDim_filter_config_case", "2"}, + {"QuickDim_positive_count_threshold", "3"}, + {"QuickDim_negative_count_threshold", "4"}, + {"QuickDim_uncertain_count_threshold", "5"}, + {"QuickDim_positive_score_threshold", "7"}, + {"QuickDim_negative_score_threshold", "6"}, + }; + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeaturesAndParameters( + {{ash::features::kQuickDim, params}}, {}); + + hps::FeatureConfig expected_config; + auto& consecutive_results_filter_config = + *expected_config.mutable_consecutive_results_filter_config(); + consecutive_results_filter_config.set_positive_count_threshold(3); + consecutive_results_filter_config.set_negative_count_threshold(4); + consecutive_results_filter_config.set_uncertain_count_threshold(5); + consecutive_results_filter_config.set_positive_score_threshold(7); + consecutive_results_filter_config.set_negative_score_threshold(6); + + const auto lock_on_leave = GetEnableLockOnLeaveConfig(); + EXPECT_THAT(*lock_on_leave, ProtoEquals(expected_config)); +} + +TEST(HumanPresenceFeatureConfigTest, + VerifyConsecutiveResultsFilterConfigSnoopingProtection) { + const std::map<std::string, std::string> params = { + {"SnoopingProtection_filter_config_case", "2"}, + {"SnoopingProtection_positive_count_threshold", "3"}, + {"SnoopingProtection_negative_count_threshold", "4"}, + {"SnoopingProtection_uncertain_count_threshold", "5"}, + {"SnoopingProtection_positive_score_threshold", "7"}, + {"SnoopingProtection_negative_score_threshold", "6"}, + }; + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeaturesAndParameters( + {{ash::features::kSnoopingProtection, params}}, {}); + + hps::FeatureConfig expected_config; + auto& consecutive_results_filter_config = + *expected_config.mutable_consecutive_results_filter_config(); + consecutive_results_filter_config.set_positive_count_threshold(3); + consecutive_results_filter_config.set_negative_count_threshold(4); + consecutive_results_filter_config.set_uncertain_count_threshold(5); + consecutive_results_filter_config.set_positive_score_threshold(7); + consecutive_results_filter_config.set_negative_score_threshold(6); + + const auto snooping_protection_config = GetEnableSnoopingProtectionConfig(); + EXPECT_THAT(*snooping_protection_config, ProtoEquals(expected_config)); +} + +TEST(HumanPresenceFeatureConfigTest, VerifyAverageFilterConfigLockOnLeave) { + const std::map<std::string, std::string> params = { + {"QuickDim_filter_config_case", "3"}, + {"QuickDim_average_window_size", "4"}, + {"QuickDim_positive_score_threshold", "5"}, + {"QuickDim_negative_score_threshold", "6"}, + {"QuickDim_default_uncertain_score", "7"}}; + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeaturesAndParameters( + {{ash::features::kQuickDim, params}}, {}); + + hps::FeatureConfig expected_config; + auto& average_filter_config = + *expected_config.mutable_average_filter_config(); + average_filter_config.set_average_window_size(4); + average_filter_config.set_positive_score_threshold(5); + average_filter_config.set_negative_score_threshold(6); + average_filter_config.set_default_uncertain_score(7); + + const auto lock_on_leave = GetEnableLockOnLeaveConfig(); + EXPECT_THAT(*lock_on_leave, ProtoEquals(expected_config)); +} + +TEST(HumanPresenceFeatureConfigTest, + VerifyAverageFilterConfigSnoopingProtection) { + const std::map<std::string, std::string> params = { + {"SnoopingProtection_filter_config_case", "3"}, + {"SnoopingProtection_average_window_size", "4"}, + {"SnoopingProtection_positive_score_threshold", "5"}, + {"SnoopingProtection_negative_score_threshold", "6"}, + {"SnoopingProtection_default_uncertain_score", "7"}}; + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeaturesAndParameters( + {{ash::features::kSnoopingProtection, params}}, {}); + + hps::FeatureConfig expected_config; + auto& average_filter_config = + *expected_config.mutable_average_filter_config(); + average_filter_config.set_average_window_size(4); + average_filter_config.set_positive_score_threshold(5); + average_filter_config.set_negative_score_threshold(6); + average_filter_config.set_default_uncertain_score(7); + + const auto snooping_protection_config = GetEnableSnoopingProtectionConfig(); + EXPECT_THAT(*snooping_protection_config, ProtoEquals(expected_config)); +} + +} // namespace hps
diff --git a/chromeos/ash/components/human_presence/human_presence_internals.cc b/chromeos/ash/components/human_presence/human_presence_internals.cc new file mode 100644 index 0000000..68e5926 --- /dev/null +++ b/chromeos/ash/components/human_presence/human_presence_internals.cc
@@ -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. + +#include "chromeos/ash/components/human_presence/human_presence_internals.h" + +namespace hps { + +// Resource paths. +const char kHumanPresenceInternalsCSS[] = "human_presence_internals.css"; +const char kHumanPresenceInternalsJS[] = "human_presence_internals.js"; +const char kHumanPresenceInternalsIcon[] = "human_presence_internals_icon.svg"; + +// Message handlers. +const char kHumanPresenceInternalsConnectCmd[] = "connect"; +const char kHumanPresenceInternalsEnableLockOnLeaveCmd[] = "enable_sense"; +const char kHumanPresenceInternalsDisableLockOnLeaveCmd[] = "disable_sense"; +const char kHumanPresenceInternalsQueryLockOnLeaveCmd[] = "query_sense"; +const char kHumanPresenceInternalsEnableSnoopingProtectionCmd[] = + "enable_notify"; +const char kHumanPresenceInternalsDisableSnoopingProtectionCmd[] = + "disable_notify"; +const char kHumanPresenceInternalsQuerySnoopingProtectionCmd[] = "query_notify"; + +// Events. +const char kHumanPresenceInternalsConnectedEvent[] = "connected"; +const char kHumanPresenceInternalsLockOnLeaveChangedEvent[] = "sense_changed"; +const char kHumanPresenceInternalsSnoopingProtectionChangedEvent[] = + "notify_changed"; +const char kHumanPresenceInternalsEnableErrorEvent[] = "enable_error"; + +} // namespace hps
diff --git a/chromeos/ash/components/human_presence/human_presence_internals.h b/chromeos/ash/components/human_presence/human_presence_internals.h new file mode 100644 index 0000000..f153077 --- /dev/null +++ b/chromeos/ash/components/human_presence/human_presence_internals.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 CHROMEOS_ASH_COMPONENTS_HUMAN_PRESENCE_HUMAN_PRESENCE_INTERNALS_H_ +#define CHROMEOS_ASH_COMPONENTS_HUMAN_PRESENCE_HUMAN_PRESENCE_INTERNALS_H_ + +namespace hps { + +// Resource paths. +extern const char kHumanPresenceInternalsCSS[]; +extern const char kHumanPresenceInternalsJS[]; +extern const char kHumanPresenceInternalsIcon[]; + +// Message handlers. +extern const char kHumanPresenceInternalsConnectCmd[]; +extern const char kHumanPresenceInternalsEnableLockOnLeaveCmd[]; +extern const char kHumanPresenceInternalsDisableLockOnLeaveCmd[]; +extern const char kHumanPresenceInternalsQueryLockOnLeaveCmd[]; +extern const char kHumanPresenceInternalsEnableSnoopingProtectionCmd[]; +extern const char kHumanPresenceInternalsDisableSnoopingProtectionCmd[]; +extern const char kHumanPresenceInternalsQuerySnoopingProtectionCmd[]; + +// Events. +extern const char kHumanPresenceInternalsConnectedEvent[]; +extern const char kHumanPresenceInternalsLockOnLeaveChangedEvent[]; +extern const char kHumanPresenceInternalsSnoopingProtectionChangedEvent[]; +extern const char kHumanPresenceInternalsEnableErrorEvent[]; + +} // namespace hps + +#endif // CHROMEOS_ASH_COMPONENTS_HUMAN_PRESENCE_HUMAN_PRESENCE_INTERNALS_H_
diff --git a/chromeos/ash/components/human_presence/resources/human_presence_internals.css b/chromeos/ash/components/human_presence/resources/human_presence_internals.css new file mode 100644 index 0000000..88039530 --- /dev/null +++ b/chromeos/ash/components/human_presence/resources/human_presence_internals.css
@@ -0,0 +1,133 @@ +/* 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. */ + +html { + background: var(--md-background-color); + color: var(--cros-color-primary); +} + +h1 { + color: var(--cros-color-prominent); + margin: 0; + padding: 0; +} + +h2 { + margin-top: 0; +} + +.flexbar { + display: flex; + flex-direction: row; + align-items: flex-start; + margin: 5px 0px; +} + +.flexbar button { + padding: 0px 4px; +} + +#connection-error, #enable-error { + background-color: rgba(var(--cros-color-warning-rgb), 0.25); + border-left: solid 2px var(--cros-color-warning); + margin: 32px; + padding: 16px; +} + +#sense-state, #notify-state { + display: flex; + justify-content: center; + align-items: center; + font-variant-caps: small-caps; + font-weight: bold; + text-shadow: 2px 2px 4px rgb(0, 0, 0, .3); + color: var(--cros-color-primary); + width: 64px; + height: 64px; + outline: solid 2px var(--cros-color-primary-inverted); + border-radius: 4px; + margin-right: 32px; + margin-bottom: 32px; +} + +.feature-panel { + background-color: var(--cros-bg-color-elevation-5); + border-top: solid 4px var(--cros-color-prominent-inverted); + margin-right: 16px; + padding: 16px; + min-width: 544px; +} + +.spacer { + flex-grow: 1; +} + +.history { + width: 512px; + min-height: 32px; + display: flex; + flex-direction: row; + justify-content: end; + outline: solid 2px var(--cros-color-primary-inverted); + border-radius: 4px; +} + +.history span { + display: inline-block; + box-sizing: border-box; + width: 4px; + height: 32px; + border-left: solid 1px rgb(0, 0, 0, .1); +} + +.positive { + background: var(--google-green-300); +} + +.negative { + background: var(--google-red-300); +} + +@media (prefers-color-scheme: dark) { + .positive { + background: var(--google-green-600); + } + + .negative { + background: var(--google-red-600); + } +} + +.unknown, .history, .disabled { + background: repeating-linear-gradient( + 45deg, + var(--cros-color-primary-inverted), + var(--cros-color-primary-inverted) 4px, + rgba(var(--cros-color-primary-inverted-rgb), .5) 4px, + rgba(var(--cros-color-primary-inverted-rgb), .5) 8px + ); + background-attachment: fixed; + color: var(--cros-color-disabled) !important; +} + +.inference-history { + height: 128px; + background: none; + align-items: end; +} + +.inference-history span { + background: var(--cros-color-prominent-inverted); +} + +.inference-history span.invalid { + background: var(--cros-color-primary-inverted); +} + +#sense-inference-result, #notify-inference-result { + align-self: end; + margin-left: .5em; + margin-bottom: .5em; + font-variant-numeric: tabular-nums; +} \ No newline at end of file
diff --git a/chromeos/ash/components/human_presence/resources/human_presence_internals.html b/chromeos/ash/components/human_presence/resources/human_presence_internals.html new file mode 100644 index 0000000..a3b9a91 --- /dev/null +++ b/chromeos/ash/components/human_presence/resources/human_presence_internals.html
@@ -0,0 +1,66 @@ +<!doctype html> +<html dir="ltr" lang="en"> +<head> + <meta charset="utf-8"> + <title>HPS Internals</title> + <meta name="viewport" content="width=device-width"> + <link rel="icon" href="human_presence_internals_icon.svg"> + <link rel="import" href="chrome://resources/html/polymer.html"> + <link rel="stylesheet" href="chrome://resources/css/md_colors.css"> + <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> + <link rel="stylesheet" href="chrome://resources/chromeos/colors/cros_styles.css"> + <link rel="stylesheet" href="human_presence_internals.css"> + <script type="module" src="human_presence_internals.js"></script> +</head> + +<body id="root"> +<h1>HPS Internals</h1> + +<div id="connection-error" style="display: none"> + Unable to connect to HPS. Are the screen privacy settings enabled? +</div> + +<div id="enable-error" style="display: none"> + Failed to enable feature. +</div> + +<div class="flexbar"> +<div class="feature-panel"> + <h2>👤 Sense feature</h2> + <div class="flexbar"> + <div class="flexbar"> + <button id="enable-sense">Enable</button> + <button id="disable-sense">Disable</button> + </div> + <div class="spacer"></div> + <div id="sense-state" class="unknown"></div> + </div> + <div class="history" id="sense-history"></div> + <h3>Inference score</h3> + <div class="flexbar"> + <div class="history inference-history" id="sense-inference-history"></div> + <div id="sense-inference-result"></div> + </div> +</div> + +<div class="feature-panel"> + <h2>👥 Notify feature</h2> + <div class="flexbar"> + <div class="flexbar"> + <button id="enable-notify">Enable</button> + <button id="disable-notify">Disable</button> + </div> + <div class="spacer"></div> + <div id="notify-state" class="unknown"></div> + </div> + <div class="history" id="notify-history"></div> + <h3>Inference score</h3> + <div class="flexbar"> + <div class="history inference-history" id="notify-inference-history"></div> + <div id="notify-inference-result"></div> + </div> +</div> +</div> + +</body> +</html>
diff --git a/chromeos/ash/components/human_presence/resources/human_presence_internals.ts b/chromeos/ash/components/human_presence/resources/human_presence_internals.ts new file mode 100644 index 0000000..7951eff --- /dev/null +++ b/chromeos/ash/components/human_presence/resources/human_presence_internals.ts
@@ -0,0 +1,213 @@ +// 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 './strings.m.js'; +import {addWebUIListener} from 'chrome://resources/js/cr.m.js'; +import {$} from 'chrome://resources/js/util.m.js'; + +const POLL_INTERVAL_MS = 500; // Matches hpsd polling rate. +const MAX_HISTORY = 512 / 4; + +enum HpsResult { + DISABLED = -1, + UNKNOWN = 0, + NEGATIVE = 1, + POSITIVE = 2, +}; + +interface ConnectionState { + connected: boolean; +}; + +interface IncomingHpsResult { + state?: number; + disabled?: boolean; + inference_result?: number; + inference_result_valid?: boolean; +}; + +interface HpsResultState { + result: HpsResult; + inference_result?: number; + inference_result_valid?: boolean; +}; + +let g_senseState: HpsResultState = {result: HpsResult.DISABLED}; +let g_notifyState: HpsResultState = {result: HpsResult.DISABLED}; +let g_pollTimer: number|undefined = undefined; + +function hpsResultToString(result: HpsResult) { + switch (result) { + case HpsResult.DISABLED: + return 'disabled'; + case HpsResult.UNKNOWN: + return 'unknown'; + case HpsResult.NEGATIVE: + return 'negative'; + case HpsResult.POSITIVE: + return 'positive'; + } +} + +function hpsResultToClass(result: HpsResult) { + // For now we reuse the display strings for class names, but if the UI is ever + // translated, this should be adapted. + return hpsResultToString(result); +} + +function enableButton(selector: string, enabled: boolean) { + ($(selector) as HTMLButtonElement).disabled = !enabled; +} + +function onConnected(state: ConnectionState) { + const connected = state.connected; + onSenseChanged({disabled: true}); + onNotifyChanged({disabled: true}); + enableButton('enable-sense', false); + enableButton('disable-sense', false); + enableButton('enable-notify', false); + enableButton('disable-notify', false); + $('connection-error').style.display = connected ? 'none' : 'block'; + if (connected) { + // Query the state of each feature to see if they are enabled or not. + chrome.send('query_sense'); + chrome.send('query_notify'); + } + updatePolling(); +} + +function onEnableError() { + $('enable-error').style.display = 'block'; +} + +function onSenseChanged(value: IncomingHpsResult) { + if (value.disabled) { + enableButton('enable-sense', true); + enableButton('disable-sense', false); + g_senseState = {result: HpsResult.DISABLED}; + } else { + enableButton('enable-sense', false); + enableButton('disable-sense', true); + g_senseState = { + result: value.state!, + inference_result: value.inference_result!, + inference_result_valid: value.inference_result_valid! + }; + } + $('sense-state').textContent = hpsResultToString(g_senseState.result); + $('sense-state').className = hpsResultToClass(g_senseState.result); + updatePolling(); +} + +function onNotifyChanged(value: IncomingHpsResult) { + if (value.disabled) { + enableButton('enable-notify', true); + enableButton('disable-notify', false); + g_notifyState = {result: HpsResult.DISABLED}; + } else { + enableButton('enable-notify', false); + enableButton('disable-notify', true); + g_notifyState = { + result: value.state!, + inference_result: value.inference_result!, + inference_result_valid: value.inference_result_valid! + }; + } + $('notify-state').textContent = hpsResultToString(g_notifyState.result); + $('notify-state').className = hpsResultToClass(g_notifyState.result); + updatePolling(); +} + +function initialize() { + addWebUIListener('connected', onConnected); + addWebUIListener('sense_changed', onSenseChanged); + addWebUIListener('notify_changed', onNotifyChanged); + addWebUIListener('enable_error', onEnableError); + $('enable-sense').onclick = enableSense; + $('disable-sense').onclick = disableSense; + $('enable-notify').onclick = enableNotify; + $('disable-notify').onclick = disableNotify; + onConnected({connected: false}); + chrome.send('connect'); +} + +function enableSense() { + $('enable-error').style.display = 'none'; + chrome.send('enable_sense'); +} + +function disableSense() { + chrome.send('disable_sense'); + // Query the feature state immediately after toggling it off to make sure the + // UI always reflects the latest state. This is needed because hpsd sends an + // UNKNOWN result whenever a feature is turned off. + chrome.send('query_sense'); +} + +function enableNotify() { + $('enable-error').style.display = 'none'; + chrome.send('enable_notify'); +} + +function disableNotify() { + chrome.send('disable_notify'); + // Query the feature state immediately after toggling it off to make sure the + // UI always reflects the latest state. This is needed because hpsd sends an + // UNKNOWN result whenever a feature is turned off. + chrome.send('query_notify'); +} + +function updatePolling() { + const shouldPoll = + g_notifyState.result !== HpsResult.DISABLED || + g_senseState.result !== HpsResult.DISABLED; + if (shouldPoll && g_pollTimer === undefined) { + g_pollTimer = setInterval(recordSample, POLL_INTERVAL_MS); + recordSample(); + } else if (!shouldPoll && g_pollTimer !== undefined) { + clearInterval(g_pollTimer); + g_pollTimer = undefined; + } + $('root').dispatchEvent(new CustomEvent('state-updated-for-test')); +} + +function pruneSamples(container: HTMLElement) { + while (container.childElementCount > MAX_HISTORY) { + container.firstChild!.remove(); + } +} + +function recordSampleForFeature(state: HpsResultState, featureName: String) { + if (state.result === undefined) + return; + let sample = document.createElement('span'); + sample.className = hpsResultToClass(state.result); + $(`${featureName}-history`).appendChild(sample); + + sample = document.createElement('span'); + let height = '64px'; + if (state.inference_result !== undefined) { + let score = state.inference_result!; + height = Math.max(0, Math.min(128, Math.floor(score / 2) + 64)) + 'px'; + $(`${featureName}-inference-result`).textContent = score.toString(); + } else { + $(`${featureName}-inference-result`).textContent = "—"; + } + if (!state.inference_result_valid) { + sample.classList.add("invalid"); + } + sample.style.height = height; + $(`${featureName}-inference-result`).style.height = height; + $(`${featureName}-inference-history`).appendChild(sample); + + pruneSamples($(`${featureName}-history`)); + pruneSamples($(`${featureName}-inference-history`)); +} + +function recordSample() { + recordSampleForFeature(g_senseState, 'sense'); + recordSampleForFeature(g_notifyState, 'notify'); +} + +document.addEventListener('DOMContentLoaded', initialize);
diff --git a/chromeos/components/human_presence/resources/human_presence_internals_icon.svg b/chromeos/ash/components/human_presence/resources/human_presence_internals_icon.svg similarity index 100% rename from chromeos/components/human_presence/resources/human_presence_internals_icon.svg rename to chromeos/ash/components/human_presence/resources/human_presence_internals_icon.svg
diff --git a/chromeos/ash/components/human_presence/test/human_presence_internals_browsertest.js b/chromeos/ash/components/human_presence/test/human_presence_internals_browsertest.js new file mode 100644 index 0000000..defa5f58 --- /dev/null +++ b/chromeos/ash/components/human_presence/test/human_presence_internals_browsertest.js
@@ -0,0 +1,74 @@ +// 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. + +/** + * @fileoverview Test suite for chrome://hps-internals/ + */ + +GEN('#include "content/public/test/browser_test.h"'); +GEN('#include "chromeos/dbus/human_presence/fake_human_presence_dbus_client.h"'); +GEN('#include "chromeos/dbus/human_presence/human_presence_dbus_client.h"'); + +const HOST_ORIGIN = 'chrome://hps-internals'; + +// TODO:(crbug.com/1262025): We should avoid using `var`. +// +// js2gtest fixtures require var here (https://crbug.com/1033337). +// eslint-disable-next-line no-var +var HumanPresenceInternalsUIBrowserTest = class extends testing.Test { + /** @override */ + get browsePreload() { + return HOST_ORIGIN; + } + + /** @override */ + get isAsync() { + return true; + } + + /** @override */ + testGenPreamble() { + GEN(` + chromeos::HumanPresenceDBusClient::InitializeFake(); + chromeos::FakeHumanPresenceDBusClient::Get()->Reset(); + chromeos::FakeHumanPresenceDBusClient::Get()-> + set_hps_service_is_available(true); + hps::HpsResultProto result_proto; + result_proto.set_value(hps::HpsResult::POSITIVE); + chromeos::FakeHumanPresenceDBusClient::Get()->set_hps_sense_result( + result_proto); + result_proto.set_value(hps::HpsResult::NEGATIVE); + chromeos::FakeHumanPresenceDBusClient::Get()->set_hps_notify_result( + result_proto); + `); + } +}; + +// Tests that chrome://hps-internals loads successfully. +TEST_F( + 'HumanPresenceInternalsUIBrowserTest', 'HasChromeSchemeURL', async () => { + assertEquals(document.location.origin, HOST_ORIGIN); + testDone(); + }); + +// Tests that the UI reflects the state of HPS. +TEST_F('HumanPresenceInternalsUIBrowserTest', 'StateSynchronized', async () => { + document.querySelector('#root').addEventListener( + 'state-updated-for-test', () => { + const senseState = document.querySelector('#sense-state').textContent; + const notifyState = document.querySelector('#notify-state').textContent; + // Wait until both features become enabled. + if (senseState === 'disabled' || notifyState === 'disabled') + return; + assertEquals(senseState, 'positive'); + assertEquals(notifyState, 'negative'); + assertTrue(document.querySelector('#enable-sense').disabled); + assertTrue(document.querySelector('#enable-notify').disabled); + assertFalse(document.querySelector('#disable-sense').disabled); + assertFalse(document.querySelector('#disable-notify').disabled); + testDone(); + }); + // Enable a feature to trigger the UI state to update. + document.querySelector('#enable-notify').click(); +});
diff --git a/chromeos/ash/resources/BUILD.gn b/chromeos/ash/resources/BUILD.gn index 3f4346df..568912ac 100644 --- a/chromeos/ash/resources/BUILD.gn +++ b/chromeos/ash/resources/BUILD.gn
@@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/config/chromeos/ui_mode.gni") +import("//chromeos/ash/components/assistant/assistant.gni") import("//tools/grit/grit_rule.gni") assert(is_chromeos_ash) @@ -18,6 +19,8 @@ ] output_dir = "$root_gen_dir/chromeos/ash" + defines = [ "enable_cros_libassistant=$enable_cros_libassistant" ] + grit_flags = [ "-E", "mojom_root=" + rebase_path(root_gen_dir, root_build_dir), @@ -28,5 +31,6 @@ "//ash/services/cellular_setup/public/mojom:mojom_js", "//ash/services/device_sync/public/mojom:mojom_js", "//ash/services/multidevice_setup/public/mojom:mojom_js", + "//chromeos/ash/components/human_presence:human_presence_internals_ts", ] }
diff --git a/chromeos/ash/resources/ash_resources.grd b/chromeos/ash/resources/ash_resources.grd index be9f30d..bfbc3ca 100644 --- a/chromeos/ash/resources/ash_resources.grd +++ b/chromeos/ash/resources/ash_resources.grd
@@ -13,7 +13,11 @@ <release seq="1"> <includes> <part file="cellular_resources.grdp" /> + <part file="human_presence_resources.grdp" /> <part file="multidevice_resources.grdp" /> + <if expr="enable_cros_libassistant"> + <part file="assistant_resources.grdp" /> + </if> </includes> </release> </grit>
diff --git a/chromeos/ash/resources/assistant_resources.grdp b/chromeos/ash/resources/assistant_resources.grdp new file mode 100644 index 0000000..bde76ff5 --- /dev/null +++ b/chromeos/ash/resources/assistant_resources.grdp
@@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<grit-part> + <!-- Resources for Google Assistant. --> + <include name="IDR_ASSISTANT_SPEECH_RECOGNITION_ERROR" file="../../assistant/internal/resources/sounds/en_hol_err_speech_recognition_error.opus" type="BINDATA" /> + <include name="IDR_ASSISTANT_NO_INTERNET_ERROR" file="../../assistant/internal/resources/sounds/en_hol_err_no_internet.opus" type="BINDATA" /> +</grit-part>
diff --git a/chromeos/ash/resources/human_presence_resources.grdp b/chromeos/ash/resources/human_presence_resources.grdp new file mode 100644 index 0000000..87ddd62ad --- /dev/null +++ b/chromeos/ash/resources/human_presence_resources.grdp
@@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<grit-part> + <include name="IDR_HUMAN_PRESENCE_INTERNALS_HTML" file="../components/human_presence/resources/human_presence_internals.html" type="BINDATA" /> + <include name="IDR_HUMAN_PRESENCE_INTERNALS_CSS" file="../components/human_presence/resources/human_presence_internals.css" type="BINDATA" /> + <include name="IDR_HUMAN_PRESENCE_INTERNALS_ICON" file="../components/human_presence/resources/human_presence_internals_icon.svg" type="BINDATA" /> + <include name="IDR_HUMAN_PRESENCE_INTERNALS_JS" + file="${root_gen_dir}/chromeos/ash/components/human_presence/resources/human_presence_internals.js" + resource_path="chromeos/ash/components/human_presence/resources/human_presence_internals.js" + use_base_dir="false" + type="BINDATA" /> +</grit-part>
diff --git a/chromeos/assistant/BUILD.gn b/chromeos/assistant/BUILD.gn deleted file mode 100644 index 4a35552b..0000000 --- a/chromeos/assistant/BUILD.gn +++ /dev/null
@@ -1,18 +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. - -import("//ash/ambient/resources/resources.gni") -import("//build/buildflag_header.gni") -import("//chromeos/assistant/ambient.gni") -import("//chromeos/assistant/assistant.gni") - -buildflag_header("buildflags") { - header = "buildflags.h" - - flags = [ - "ENABLE_CROS_LIBASSISTANT=$enable_cros_libassistant", - "ENABLE_CROS_AMBIENT_MODE_BACKEND=$enable_cros_ambient_mode_backend", - "HAS_ASH_AMBIENT_ANIMATION_RESOURCES=$include_ash_ambient_animation_resources", - ] -}
diff --git a/chromeos/assistant/DIR_METADATA b/chromeos/assistant/DIR_METADATA index cfb0c371..5ba0efa 100644 --- a/chromeos/assistant/DIR_METADATA +++ b/chromeos/assistant/DIR_METADATA
@@ -1 +1 @@ -mixins: "//chromeos/assistant/COMMON_METADATA" +mixins: "//chromeos/ash/components/assistant/COMMON_METADATA"
diff --git a/chromeos/assistant/OWNERS b/chromeos/assistant/OWNERS index e69808e..574ed11 100644 --- a/chromeos/assistant/OWNERS +++ b/chromeos/assistant/OWNERS
@@ -1,3 +1 @@ -updowndota@chromium.org -wutao@chromium.org -xiaohuic@chromium.org +file://chromeos/ash/components/assistant/OWNERS
diff --git a/chromeos/assistant/assistant.gni b/chromeos/assistant/assistant.gni index 0f462c2..36befee 100644 --- a/chromeos/assistant/assistant.gni +++ b/chromeos/assistant/assistant.gni
@@ -1,19 +1,7 @@ -import("//build/config/chrome_build.gni") -import("//build/config/chromeos/ui_mode.gni") +# TODO(https://crbug.com/1164001): Do not edit this file. Please edit +# //chromeos/ash/components/assistant/assistant.gni instead. +# This file is temporary during the migartion of assistant directories to ash. +# We keep it until internal assistant codes are changed to use the new path +# //chromeos/ash/components/assistant instead of //chromeos/assistant. -declare_args() { - # Enable assistant implementation based on libassistant. - enable_cros_libassistant = is_chromeos_ash && is_chrome_branded - - # Enable a fake microphone, which can replay audio files as microphone input. - # See chromeos/assistant/tools/send-audio.sh - enable_fake_assistant_microphone = false -} - -declare_args() { - # Enable Assistant integration tests using LibAssistant and a fake S3 server. - # This requires libassistant.so to support grpc communication with the S3 - # server, which increases the library size, which is why we introduced this - # flag to disable them in the release builds. - enable_assistant_integration_tests = enable_cros_libassistant -} +import("//chromeos/ash/components/assistant/assistant.gni")
diff --git a/chromeos/assistant/test_support/BUILD.gn b/chromeos/assistant/test_support/BUILD.gn deleted file mode 100644 index a31514eb..0000000 --- a/chromeos/assistant/test_support/BUILD.gn +++ /dev/null
@@ -1,10 +0,0 @@ -static_library("test_support") { - testonly = true - sources = [ "expect_utils.h" ] - deps = [ - "//base", - "//base/test:test_support", - "//testing/gmock", - "//testing/gtest", - ] -}
diff --git a/chromeos/assistant/test_support/expect_utils.h b/chromeos/assistant/test_support/expect_utils.h deleted file mode 100644 index b935f2b..0000000 --- a/chromeos/assistant/test_support/expect_utils.h +++ /dev/null
@@ -1,70 +0,0 @@ -// 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. - -#ifndef CHROMEOS_ASSISTANT_TEST_SUPPORT_EXPECT_UTILS_H_ -#define CHROMEOS_ASSISTANT_TEST_SUPPORT_EXPECT_UTILS_H_ - -#include "base/callback_forward.h" -#include "base/run_loop.h" -#include "base/threading/sequenced_task_runner_handle.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromeos { -namespace assistant { -namespace test { - -namespace { - -template <typename T> -void CheckResult(base::OnceClosure quit, - T expected_value, - base::RepeatingCallback<T()> value_callback) { - if (expected_value == value_callback.Run()) { - std::move(quit).Run(); - return; - } - - // Check again in the future - base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, - base::BindOnce(CheckResult<T>, std::move(quit), expected_value, - value_callback), - base::Milliseconds(10)); -} - -} // namespace - -// Check if the |expected_value| is equal to the result of running -// |value_callback|. This method will block and continuously try the -// comparison above until it succeeds, or timeout. -template <typename T> -void ExpectResult(T expected_value, - base::RepeatingCallback<T()> value_callback, - const std::string& tag = std::string()) { - // Wait until we're ready or we hit the default task environment timeout. - base::RunLoop run_loop; - CheckResult(run_loop.QuitClosure(), expected_value, value_callback); - - EXPECT_NO_FATAL_FAILURE(run_loop.Run()) - << (tag.empty() ? tag : tag + ": ") - << "Failed waiting for expected result.\n" - << "Expected \"" << expected_value << "\"\n" - << "Got \"" << value_callback.Run() << "\""; -} - -#define WAIT_FOR_CALL(mock_obj, call) \ - { \ - base::RunLoop run_loop; \ - EXPECT_CALL(mock_obj, call).WillOnce([quit = run_loop.QuitClosure()]() { \ - std::move(quit).Run(); \ - }); \ - EXPECT_NO_FATAL_FAILURE(run_loop.Run()) \ - << #mock_obj << "::" << #call << " is NOT called."; \ - } - -} // namespace test -} // namespace assistant -} // namespace chromeos - -#endif // CHROMEOS_ASSISTANT_TEST_SUPPORT_EXPECT_UTILS_H_
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index 3b9a372c..3737a59 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -2711,8 +2711,8 @@ Loading state... may last ~10 seconds </message> <!-- Common buttons --> - <message name="IDS_SHIMLESS_RMA_CANCEL_BUTTON" desc="Button used to cancel RMA finalization, when allowed."> - Cancel + <message name="IDS_SHIMLESS_RMA_EXIT_BUTTON" desc="Button used to exit RMA finalization, when allowed."> + Exit </message> <message name="IDS_SHIMLESS_RMA_BACK_BUTTON" desc="Button used to go back to the previous step of RMA finalization, when allowed."> Back @@ -2726,6 +2726,9 @@ <message name="IDS_SHIMLESS_RMA_OK_BUTTON" desc="Default text for OK button used to acknowledge and close dialogs."> OK </message> + <message name="IDS_SHIMLESS_RMA_CANCEL_BUTTON" desc="Button used to cancel and close dialogs."> + Cancel + </message> <message name="IDS_SHIMLESS_RMA_RETRY_BUTTON" desc="Default text for Retry button used to retry an action."> Retry </message>
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CANCEL_BUTTON.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CANCEL_BUTTON.png.sha1 index b4cb0385..7c4cd41 100644 --- a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CANCEL_BUTTON.png.sha1 +++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CANCEL_BUTTON.png.sha1
@@ -1 +1 @@ -74fde7f3338570b6e3964813435bc36de9db43d0 \ No newline at end of file +4cb6875785580c579cba71ffd076e39d1a18829e \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_EXIT_BUTTON.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_EXIT_BUTTON.png.sha1 new file mode 100644 index 0000000..508dfd4 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_EXIT_BUTTON.png.sha1
@@ -0,0 +1 @@ +b02d76fefb9806d682ffdeb620ef46eb8437c5f9 \ No newline at end of file
diff --git a/chromeos/components/BUILD.gn b/chromeos/components/BUILD.gn index b10ad6ca..9f2ee86b9b 100644 --- a/chromeos/components/BUILD.gn +++ b/chromeos/components/BUILD.gn
@@ -23,7 +23,6 @@ "//build:chromeos_buildflags", "//chromeos/components/cdm_factory_daemon:unit_tests", "//chromeos/components/feature_usage:unit_tests", - "//chromeos/components/human_presence:unit_tests", "//chromeos/components/local_search_service:unit_tests", "//chromeos/components/local_search_service/public/mojom:unit_tests", "//chromeos/components/mojo_bootstrap:unit_tests",
diff --git a/chromeos/components/human_presence/human_presence_configuration.cc b/chromeos/components/human_presence/human_presence_configuration.cc deleted file mode 100644 index d067ff77..0000000 --- a/chromeos/components/human_presence/human_presence_configuration.cc +++ /dev/null
@@ -1,226 +0,0 @@ -// 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. - -#include "chromeos/components/human_presence/human_presence_configuration.h" - -#include "ash/constants/ash_features.h" -#include "base/logging.h" -#include "base/metrics/field_trial_params.h" -#include "base/strings/strcat.h" -#include "base/strings/string_number_conversions.h" -#include "base/time/time.h" -#include "chromeos/dbus/hps/hps_service.pb.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace hps { -namespace { - -// Default minimum amount of time for which a positive snooper presence will be -// reported. -constexpr base::TimeDelta kSnoopingProtectionPositiveWindowDefault = - base::Seconds(4); - -// Default quick dim delay to configure power_manager. -constexpr base::TimeDelta kQuickDimDelayDefault = base::Seconds(10); - -// Default quick lock delay to configure power_manager. -constexpr base::TimeDelta kQuickLockDelayDefault = base::Seconds(130); - -// Default value determines whether send feedback to configure power_manager. -constexpr int kShouldSendFeedbackIfUndimmed = false; - -// Returns either the integer parameter with the given name, or nullopt if the -// parameter can't be found or parsed. -absl::optional<int> GetIntParam(const base::FieldTrialParams& params, - const std::string& feature_name, - const std::string& param_name) { - const std::string full_param_name = - base::StrCat({feature_name, "_", param_name}); - const auto it = params.find(full_param_name); - if (it == params.end()) - return absl::nullopt; - - int result; - if (!base::StringToInt(it->second, &result)) - return absl::nullopt; - - return result; -} - -// The config to use when no parameters are specified. We need to ensure that -// that empty params induce a working config (as required for, e.g., a -// chrome:://flags entry). -hps::FeatureConfig GetDefaultSnoopingProtectionConfig() { - hps::FeatureConfig config; - - // Just apply a threshold to the last-seen inference. - auto& filter_config = *config.mutable_consecutive_results_filter_config(); - filter_config.set_positive_count_threshold(1); - filter_config.set_negative_count_threshold(1); - filter_config.set_uncertain_count_threshold(1); - filter_config.set_positive_score_threshold(0); - filter_config.set_negative_score_threshold(0); - - return config; -} - -hps::FeatureConfig GetDefaultLockOnLeaveConfig() { - hps::FeatureConfig config; - auto& filter_config = *config.mutable_consecutive_results_filter_config(); - // Any positive result will undim the screen. - filter_config.set_positive_count_threshold(1); - // Only dim if at least two consecutive negative result. - filter_config.set_negative_count_threshold(2); - // UNKNOWN will not undim, but it will block quick dim, so it should also be - // fired with confidence. - filter_config.set_uncertain_count_threshold(2); - filter_config.set_positive_score_threshold(0); - filter_config.set_negative_score_threshold(0); - return config; -} - -// This function constructs a FeatureConfig proto from feature parameters. -// The FeatureConfig contains one type of FilterConfig that will be used for -// enabling a human presence feature. -// -// If empty parameters are provided, a reasonable default is used. -// -// More details can be found at: -// src/platform2/hps/daemon/filters/filter_factory.h -absl::optional<hps::FeatureConfig> ConstructFilterConfigFromFeatureParams( - const base::Feature& feature, - const hps::FeatureConfig& default_value) { - // Load current params map for the feature. - base::FieldTrialParams params; - base::GetFieldTrialParamsByFeature(feature, ¶ms); - - // Returns default if no params is set. - if (params.empty()) { - return default_value; - } - - const std::string& feature_name = feature.name; - - const absl::optional<int> filter_config_case = - GetIntParam(params, feature_name, "filter_config_case"); - if (!filter_config_case.has_value()) { - LOG(ERROR) << "Filter config error: missing param filter_config_case for " - << feature_name; - return absl::nullopt; - } - - switch (*filter_config_case) { - case hps::FeatureConfig::kBasicFilterConfig: { - hps::FeatureConfig config; - config.mutable_basic_filter_config(); - return config; - } - - case hps::FeatureConfig::kConsecutiveResultsFilterConfig: { - const absl::optional<int> positive_count_threshold = - GetIntParam(params, feature_name, "positive_count_threshold"); - const absl::optional<int> negative_count_threshold = - GetIntParam(params, feature_name, "negative_count_threshold"); - const absl::optional<int> uncertain_count_threshold = - GetIntParam(params, feature_name, "uncertain_count_threshold"); - const absl::optional<int> positive_score_threshold = - GetIntParam(params, feature_name, "positive_score_threshold"); - const absl::optional<int> negative_score_threshold = - GetIntParam(params, feature_name, "negative_score_threshold"); - - if (!positive_count_threshold.has_value() || - !negative_count_threshold.has_value() || - !uncertain_count_threshold.has_value() || - !positive_score_threshold.has_value() || - !negative_score_threshold.has_value()) { - LOG(ERROR) << "Filter config error: missing params for " - "ConsecutiveResultsFilterConfig for " - << feature_name; - return absl::nullopt; - } - - hps::FeatureConfig config; - auto& filter_config = *config.mutable_consecutive_results_filter_config(); - filter_config.set_positive_count_threshold(*positive_count_threshold); - filter_config.set_negative_count_threshold(*negative_count_threshold); - filter_config.set_uncertain_count_threshold(*uncertain_count_threshold); - filter_config.set_positive_score_threshold(*positive_score_threshold); - filter_config.set_negative_score_threshold(*negative_score_threshold); - return config; - } - - case hps::FeatureConfig::kAverageFilterConfig: { - const absl::optional<int> average_window_size = - GetIntParam(params, feature_name, "average_window_size"); - const absl::optional<int> positive_score_threshold = - GetIntParam(params, feature_name, "positive_score_threshold"); - const absl::optional<int> negative_score_threshold = - GetIntParam(params, feature_name, "negative_score_threshold"); - const absl::optional<int> default_uncertain_score = - GetIntParam(params, feature_name, "default_uncertain_score"); - - if (!average_window_size.has_value() || - !positive_score_threshold.has_value() || - !negative_score_threshold.has_value() || - !default_uncertain_score.has_value()) { - LOG(ERROR) << "Filter config error: missing params for " - "AverageFilterConfig for " - << feature_name; - return absl::nullopt; - } - - hps::FeatureConfig config; - auto& filter_config = *config.mutable_average_filter_config(); - filter_config.set_average_window_size(*average_window_size); - filter_config.set_positive_score_threshold(*positive_score_threshold); - filter_config.set_negative_score_threshold(*negative_score_threshold); - filter_config.set_default_uncertain_score(*default_uncertain_score); - return config; - } - - default: - return absl::nullopt; - } -} - -} // namespace - -absl::optional<hps::FeatureConfig> GetEnableLockOnLeaveConfig() { - return ConstructFilterConfigFromFeatureParams(ash::features::kQuickDim, - GetDefaultLockOnLeaveConfig()); -} - -absl::optional<hps::FeatureConfig> GetEnableSnoopingProtectionConfig() { - return ConstructFilterConfigFromFeatureParams( - ash::features::kSnoopingProtection, GetDefaultSnoopingProtectionConfig()); -} - -base::TimeDelta GetQuickDimDelay() { - const int quick_dim_ms = base::GetFieldTrialParamByFeatureAsInt( - ash::features::kQuickDim, "QuickDim_quick_dim_ms", - kQuickDimDelayDefault.InMilliseconds()); - return base::Milliseconds(quick_dim_ms); -} - -base::TimeDelta GetQuickLockDelay() { - const int quick_lock_ms = base::GetFieldTrialParamByFeatureAsInt( - ash::features::kQuickDim, "QuickDim_quick_lock_ms", - kQuickLockDelayDefault.InMilliseconds()); - return base::Milliseconds(quick_lock_ms); -} - -bool GetQuickDimFeedbackEnabled() { - return base::GetFieldTrialParamByFeatureAsBool( - ash::features::kQuickDim, "QuickDim_send_feedback_if_undimmed", - kShouldSendFeedbackIfUndimmed); -} - -base::TimeDelta GetSnoopingProtectionPositiveWindow() { - const int pos_window_ms = base::GetFieldTrialParamByFeatureAsInt( - ash::features::kSnoopingProtection, "SnoopingProtection_pos_window_ms", - kSnoopingProtectionPositiveWindowDefault.InMilliseconds()); - return base::Milliseconds(pos_window_ms); -} - -} // namespace hps
diff --git a/chromeos/components/human_presence/human_presence_configuration.h b/chromeos/components/human_presence/human_presence_configuration.h deleted file mode 100644 index 6cf8b15..0000000 --- a/chromeos/components/human_presence/human_presence_configuration.h +++ /dev/null
@@ -1,46 +0,0 @@ -// 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. - -#ifndef CHROMEOS_COMPONENTS_HUMAN_PRESENCE_HUMAN_PRESENCE_CONFIGURATION_H_ -#define CHROMEOS_COMPONENTS_HUMAN_PRESENCE_HUMAN_PRESENCE_CONFIGURATION_H_ - -#include "base/component_export.h" -#include "base/time/time.h" -#include "chromeos/dbus/hps/hps_service.pb.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace base { -class TimeDelta; -} // namespace base - -namespace hps { - -// Gets FeatureConfig for enabling LockOnLeave from Finch. -// Returns nullopt if feature is not enabled or can't be parsed correctly. -COMPONENT_EXPORT(HPS) -absl::optional<hps::FeatureConfig> GetEnableLockOnLeaveConfig(); - -// Gets FeatureConfig for enabling SnoopingProtection from Finch. -// Returns nullopt if feature is not enabled or can't be parsed correctly. -COMPONENT_EXPORT(HPS) -absl::optional<hps::FeatureConfig> GetEnableSnoopingProtectionConfig(); - -// Gets quick dim delay to configure power_manager. -COMPONENT_EXPORT(HPS) base::TimeDelta GetQuickDimDelay(); - -// Gets quick lock delay to configure power_manager. -COMPONENT_EXPORT(HPS) base::TimeDelta GetQuickLockDelay(); - -// If true, quick dim functionality should be temporarily disabled when a quick -// dim is undimmed within a short period of time. -// Used to configure power_manager. -COMPONENT_EXPORT(HPS) bool GetQuickDimFeedbackEnabled(); - -// Gets the window following a positive signal in which snooping protection -// should continue to report snooper presence. -COMPONENT_EXPORT(HPS) base::TimeDelta GetSnoopingProtectionPositiveWindow(); - -} // namespace hps - -#endif // CHROMEOS_COMPONENTS_HUMAN_PRESENCE_HUMAN_PRESENCE_CONFIGURATION_H_
diff --git a/chromeos/components/human_presence/human_presence_configuration_unittest.cc b/chromeos/components/human_presence/human_presence_configuration_unittest.cc deleted file mode 100644 index 3c371f0b..0000000 --- a/chromeos/components/human_presence/human_presence_configuration_unittest.cc +++ /dev/null
@@ -1,187 +0,0 @@ -// 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. - -#include "chromeos/components/human_presence/human_presence_configuration.h" - -#include "ash/constants/ash_features.h" -#include "base/test/scoped_feature_list.h" -#include "chromeos/dbus/hps/hps_service.pb.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 hps { - -// Expect two protos to be equal if they are serialized into the same strings. -MATCHER_P(ProtoEquals, expected_message, "") { - std::string expected_serialized, actual_serialized; - expected_message.SerializeToString(&expected_serialized); - arg.SerializeToString(&actual_serialized); - return expected_serialized == actual_serialized; -} - -TEST(HumanPresenceFeatureConfigTest, EmptyParamsValid) { - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeatures( - {ash::features::kQuickDim, ash::features::kSnoopingProtection}, - {} /* disabled_features */); - - EXPECT_EQ(GetEnableLockOnLeaveConfig()->filter_config_case(), - hps::FeatureConfig::kConsecutiveResultsFilterConfig); - EXPECT_EQ(GetEnableSnoopingProtectionConfig()->filter_config_case(), - hps::FeatureConfig::kConsecutiveResultsFilterConfig); -} - -TEST(HumanPresenceFeatureConfigTest, - ReturnNullIfTypeIsNotRecognizableLockOnLeave) { - const base::FieldTrialParams params = {{"QuickDim_filter_config_case", "0"}}; - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeaturesAndParameters( - {{ash::features::kQuickDim, params}}, {}); - - EXPECT_FALSE(GetEnableLockOnLeaveConfig().has_value()); -} - -TEST(HumanPresenceFeatureConfigTest, - ReturnNullIfTypeIsNotRecognizableSnoopingProtection) { - const base::FieldTrialParams params = { - {"SnoopingProtection_filter_config_case", "0"}}; - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeaturesAndParameters( - {{ash::features::kSnoopingProtection, params}}, {}); - - EXPECT_FALSE(GetEnableSnoopingProtectionConfig().has_value()); -} - -TEST(HumanPresenceFeatureConfigTest, VerifyBasicFilterConfigLockOnLeave) { - const std::map<std::string, std::string> params = { - {"QuickDim_filter_config_case", "1"}}; - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeaturesAndParameters( - {{ash::features::kQuickDim, params}}, {}); - - hps::FeatureConfig expected_config; - expected_config.mutable_basic_filter_config(); - - EXPECT_THAT(GetEnableLockOnLeaveConfig().value(), - ProtoEquals(expected_config)); -} - -TEST(HumanPresenceFeatureConfigTest, - VerifyBasicFilterConfigSnoopingProtection) { - const std::map<std::string, std::string> params = { - {"SnoopingProtection_filter_config_case", "1"}}; - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeaturesAndParameters( - {{ash::features::kSnoopingProtection, params}}, {}); - - hps::FeatureConfig expected_config; - expected_config.mutable_basic_filter_config(); - - EXPECT_THAT(GetEnableSnoopingProtectionConfig().value(), - ProtoEquals(expected_config)); -} - -TEST(HumanPresenceFeatureConfigTest, - VerifyConsecutiveResultsFilterConfigLockOnLeave) { - const std::map<std::string, std::string> params = { - {"QuickDim_filter_config_case", "2"}, - {"QuickDim_positive_count_threshold", "3"}, - {"QuickDim_negative_count_threshold", "4"}, - {"QuickDim_uncertain_count_threshold", "5"}, - {"QuickDim_positive_score_threshold", "7"}, - {"QuickDim_negative_score_threshold", "6"}, - }; - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeaturesAndParameters( - {{ash::features::kQuickDim, params}}, {}); - - hps::FeatureConfig expected_config; - auto& consecutive_results_filter_config = - *expected_config.mutable_consecutive_results_filter_config(); - consecutive_results_filter_config.set_positive_count_threshold(3); - consecutive_results_filter_config.set_negative_count_threshold(4); - consecutive_results_filter_config.set_uncertain_count_threshold(5); - consecutive_results_filter_config.set_positive_score_threshold(7); - consecutive_results_filter_config.set_negative_score_threshold(6); - - const auto lock_on_leave = GetEnableLockOnLeaveConfig(); - EXPECT_THAT(*lock_on_leave, ProtoEquals(expected_config)); -} - -TEST(HumanPresenceFeatureConfigTest, - VerifyConsecutiveResultsFilterConfigSnoopingProtection) { - const std::map<std::string, std::string> params = { - {"SnoopingProtection_filter_config_case", "2"}, - {"SnoopingProtection_positive_count_threshold", "3"}, - {"SnoopingProtection_negative_count_threshold", "4"}, - {"SnoopingProtection_uncertain_count_threshold", "5"}, - {"SnoopingProtection_positive_score_threshold", "7"}, - {"SnoopingProtection_negative_score_threshold", "6"}, - }; - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeaturesAndParameters( - {{ash::features::kSnoopingProtection, params}}, {}); - - hps::FeatureConfig expected_config; - auto& consecutive_results_filter_config = - *expected_config.mutable_consecutive_results_filter_config(); - consecutive_results_filter_config.set_positive_count_threshold(3); - consecutive_results_filter_config.set_negative_count_threshold(4); - consecutive_results_filter_config.set_uncertain_count_threshold(5); - consecutive_results_filter_config.set_positive_score_threshold(7); - consecutive_results_filter_config.set_negative_score_threshold(6); - - const auto snooping_protection_config = GetEnableSnoopingProtectionConfig(); - EXPECT_THAT(*snooping_protection_config, ProtoEquals(expected_config)); -} - -TEST(HumanPresenceFeatureConfigTest, VerifyAverageFilterConfigLockOnLeave) { - const std::map<std::string, std::string> params = { - {"QuickDim_filter_config_case", "3"}, - {"QuickDim_average_window_size", "4"}, - {"QuickDim_positive_score_threshold", "5"}, - {"QuickDim_negative_score_threshold", "6"}, - {"QuickDim_default_uncertain_score", "7"}}; - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeaturesAndParameters( - {{ash::features::kQuickDim, params}}, {}); - - hps::FeatureConfig expected_config; - auto& average_filter_config = - *expected_config.mutable_average_filter_config(); - average_filter_config.set_average_window_size(4); - average_filter_config.set_positive_score_threshold(5); - average_filter_config.set_negative_score_threshold(6); - average_filter_config.set_default_uncertain_score(7); - - const auto lock_on_leave = GetEnableLockOnLeaveConfig(); - EXPECT_THAT(*lock_on_leave, ProtoEquals(expected_config)); -} - -TEST(HumanPresenceFeatureConfigTest, - VerifyAverageFilterConfigSnoopingProtection) { - const std::map<std::string, std::string> params = { - {"SnoopingProtection_filter_config_case", "3"}, - {"SnoopingProtection_average_window_size", "4"}, - {"SnoopingProtection_positive_score_threshold", "5"}, - {"SnoopingProtection_negative_score_threshold", "6"}, - {"SnoopingProtection_default_uncertain_score", "7"}}; - base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeaturesAndParameters( - {{ash::features::kSnoopingProtection, params}}, {}); - - hps::FeatureConfig expected_config; - auto& average_filter_config = - *expected_config.mutable_average_filter_config(); - average_filter_config.set_average_window_size(4); - average_filter_config.set_positive_score_threshold(5); - average_filter_config.set_negative_score_threshold(6); - average_filter_config.set_default_uncertain_score(7); - - const auto snooping_protection_config = GetEnableSnoopingProtectionConfig(); - EXPECT_THAT(*snooping_protection_config, ProtoEquals(expected_config)); -} - -} // namespace hps
diff --git a/chromeos/components/human_presence/human_presence_internals.cc b/chromeos/components/human_presence/human_presence_internals.cc deleted file mode 100644 index 3a3d69c1..0000000 --- a/chromeos/components/human_presence/human_presence_internals.cc +++ /dev/null
@@ -1,32 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/components/human_presence/human_presence_internals.h" - -namespace hps { - -// Resource paths. -const char kHumanPresenceInternalsCSS[] = "human_presence_internals.css"; -const char kHumanPresenceInternalsJS[] = "human_presence_internals.js"; -const char kHumanPresenceInternalsIcon[] = "human_presence_internals_icon.svg"; - -// Message handlers. -const char kHumanPresenceInternalsConnectCmd[] = "connect"; -const char kHumanPresenceInternalsEnableLockOnLeaveCmd[] = "enable_sense"; -const char kHumanPresenceInternalsDisableLockOnLeaveCmd[] = "disable_sense"; -const char kHumanPresenceInternalsQueryLockOnLeaveCmd[] = "query_sense"; -const char kHumanPresenceInternalsEnableSnoopingProtectionCmd[] = - "enable_notify"; -const char kHumanPresenceInternalsDisableSnoopingProtectionCmd[] = - "disable_notify"; -const char kHumanPresenceInternalsQuerySnoopingProtectionCmd[] = "query_notify"; - -// Events. -const char kHumanPresenceInternalsConnectedEvent[] = "connected"; -const char kHumanPresenceInternalsLockOnLeaveChangedEvent[] = "sense_changed"; -const char kHumanPresenceInternalsSnoopingProtectionChangedEvent[] = - "notify_changed"; -const char kHumanPresenceInternalsEnableErrorEvent[] = "enable_error"; - -} // namespace hps
diff --git a/chromeos/components/human_presence/human_presence_internals.h b/chromeos/components/human_presence/human_presence_internals.h deleted file mode 100644 index 09a69eb7..0000000 --- a/chromeos/components/human_presence/human_presence_internals.h +++ /dev/null
@@ -1,32 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMEOS_COMPONENTS_HUMAN_PRESENCE_HUMAN_PRESENCE_INTERNALS_H_ -#define CHROMEOS_COMPONENTS_HUMAN_PRESENCE_HUMAN_PRESENCE_INTERNALS_H_ - -namespace hps { - -// Resource paths. -extern const char kHumanPresenceInternalsCSS[]; -extern const char kHumanPresenceInternalsJS[]; -extern const char kHumanPresenceInternalsIcon[]; - -// Message handlers. -extern const char kHumanPresenceInternalsConnectCmd[]; -extern const char kHumanPresenceInternalsEnableLockOnLeaveCmd[]; -extern const char kHumanPresenceInternalsDisableLockOnLeaveCmd[]; -extern const char kHumanPresenceInternalsQueryLockOnLeaveCmd[]; -extern const char kHumanPresenceInternalsEnableSnoopingProtectionCmd[]; -extern const char kHumanPresenceInternalsDisableSnoopingProtectionCmd[]; -extern const char kHumanPresenceInternalsQuerySnoopingProtectionCmd[]; - -// Events. -extern const char kHumanPresenceInternalsConnectedEvent[]; -extern const char kHumanPresenceInternalsLockOnLeaveChangedEvent[]; -extern const char kHumanPresenceInternalsSnoopingProtectionChangedEvent[]; -extern const char kHumanPresenceInternalsEnableErrorEvent[]; - -} // namespace hps - -#endif // CHROMEOS_COMPONENTS_HUMAN_PRESENCE_HUMAN_PRESENCE_INTERNALS_H_
diff --git a/chromeos/components/human_presence/resources/human_presence_internals.css b/chromeos/components/human_presence/resources/human_presence_internals.css deleted file mode 100644 index bd3980f5..0000000 --- a/chromeos/components/human_presence/resources/human_presence_internals.css +++ /dev/null
@@ -1,110 +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. */ - -html { - background: var(--md-background-color); - color: var(--cros-color-primary); -} - -h1 { - color: var(--cros-color-prominent); - margin: 0; - padding: 0; -} - -h2 { - margin-top: 0; -} - -.flexbar { - display: flex; - flex-direction: row; - align-items: flex-start; - margin: 5px 0px; -} - -.flexbar button { - padding: 0px 4px; -} - -#connection-error, #enable-error { - background-color: rgba(var(--cros-color-warning-rgb), 0.25); - border-left: solid 2px var(--cros-color-warning); - margin: 32px; - padding: 16px; -} - -#sense-state, #notify-state { - display: flex; - justify-content: center; - align-items: center; - font-variant-caps: small-caps; - font-weight: bold; - text-shadow: 2px 2px 4px rgb(0, 0, 0, .3); - color: var(--cros-color-primary); - width: 64px; - height: 64px; - outline: solid 2px var(--cros-color-primary-inverted); - border-radius: 4px; -} - -.feature-panel { - background-color: var(--cros-bg-color-elevation-5); - border-top: solid 4px var(--cros-color-prominent-inverted); - margin-right: 16px; - padding: 16px; -} - -.spacer { - flex-grow: 1; -} - -.history { - min-width: 512px; - min-height: 32px; - display: flex; - flex-direction: row; - justify-content: end; - outline: solid 2px var(--cros-color-primary-inverted); - border-radius: 4px; - margin-top: 32px; -} - -.history span { - display: inline-block; - box-sizing: border-box; - width: 4px; - height: 32px; - border-left: solid 1px rgb(0, 0, 0, .1); -} - -.positive { - background: var(--google-green-300); -} - -.negative { - background: var(--google-red-300); -} - -@media (prefers-color-scheme: dark) { - .positive { - background: var(--google-green-600); - } - - .negative { - background: var(--google-red-600); - } -} - -.unknown, .history, .disabled { - background: repeating-linear-gradient( - 45deg, - var(--cros-color-primary-inverted), - var(--cros-color-primary-inverted) 4px, - rgba(var(--cros-color-primary-inverted-rgb), .5) 4px, - rgba(var(--cros-color-primary-inverted-rgb), .5) 8px - ); - background-attachment: fixed; - color: var(--cros-color-disabled) !important; -} \ No newline at end of file
diff --git a/chromeos/components/human_presence/resources/human_presence_internals.html b/chromeos/components/human_presence/resources/human_presence_internals.html deleted file mode 100644 index a40c18f..0000000 --- a/chromeos/components/human_presence/resources/human_presence_internals.html +++ /dev/null
@@ -1,56 +0,0 @@ -<!doctype html> -<html dir="ltr" lang="en"> -<head> - <meta charset="utf-8"> - <title>HPS Internals</title> - <meta name="viewport" content="width=device-width"> - <link rel="icon" href="human_presence_internals_icon.svg"> - <link rel="import" href="chrome://resources/html/polymer.html"> - <link rel="stylesheet" href="chrome://resources/css/md_colors.css"> - <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> - <link rel="stylesheet" href="chrome://resources/chromeos/colors/cros_styles.css"> - <link rel="stylesheet" href="human_presence_internals.css"> - <script type="module" src="human_presence_internals.js"></script> -</head> - -<body id="root"> -<h1>HPS Internals</h1> - -<div id="connection-error" style="display: none"> - Unable to connect to HPS. Are the screen privacy settings enabled? -</div> - -<div id="enable-error" style="display: none"> - Failed to enable feature. -</div> - -<div class="flexbar"> -<div class="feature-panel"> - <h2>👤 Sense feature</h2> - <div class="flexbar"> - <div class="flexbar"> - <button id="enable-sense">Enable</button> - <button id="disable-sense">Disable</button> - </div> - <div class="spacer"></div> - <div id="sense-state" class="unknown"></div> - </div> - <div class="history" id="sense-history"></div> -</div> - -<div class="feature-panel"> - <h2>👥 Notify feature</h2> - <div class="flexbar"> - <div class="flexbar"> - <button id="enable-notify">Enable</button> - <button id="disable-notify">Disable</button> - </div> - <div class="spacer"></div> - <div id="notify-state" class="unknown"></div> - </div> - <div class="history" id="notify-history"></div> -</div> -</div> - -</body> -</html>
diff --git a/chromeos/components/human_presence/resources/human_presence_internals.ts b/chromeos/components/human_presence/resources/human_presence_internals.ts deleted file mode 100644 index 794c874..0000000 --- a/chromeos/components/human_presence/resources/human_presence_internals.ts +++ /dev/null
@@ -1,180 +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. - -import './strings.m.js'; -import {addWebUIListener} from 'chrome://resources/js/cr.m.js'; -import {$} from 'chrome://resources/js/util.m.js'; - -const POLL_INTERVAL_MS = 500; // Matches hpsd polling rate. -const MAX_HISTORY = 512 / 4; - -enum HpsResult { - DISABLED = -1, - UNKNOWN = 0, - NEGATIVE = 1, - POSITIVE = 2, -}; - -interface ConnectionState { - connected: boolean; -}; - -interface HpsResultState { - state?: number; - disabled?: boolean; -}; - -let g_senseState = HpsResult.DISABLED; -let g_notifyState = HpsResult.DISABLED; -let g_pollTimer: number|undefined = undefined; - -function hpsResultToString(result: HpsResult) { - switch (result) { - case HpsResult.DISABLED: - return 'disabled'; - case HpsResult.UNKNOWN: - return 'unknown'; - case HpsResult.NEGATIVE: - return 'negative'; - case HpsResult.POSITIVE: - return 'positive'; - } -} - -function hpsResultToClass(result: HpsResult) { - // For now we reuse the display strings for class names, but if the UI is ever - // translated, this should be adapted. - return hpsResultToString(result); -} - -function enableButton(selector: string, enabled: boolean) { - ($(selector) as HTMLButtonElement).disabled = !enabled; -} - -function onConnected(state: ConnectionState) { - const connected = state.connected; - onSenseChanged({disabled: true}); - onNotifyChanged({disabled: true}); - enableButton('enable-sense', false); - enableButton('disable-sense', false); - enableButton('enable-notify', false); - enableButton('disable-notify', false); - $('connection-error').style.display = connected ? 'none' : 'block'; - if (connected) { - // Query the state of each feature to see if they are enabled or not. - chrome.send('query_sense'); - chrome.send('query_notify'); - } - updatePolling(); -} - -function onEnableError() { - $('enable-error').style.display = 'block'; -} - -function onSenseChanged(value: HpsResultState) { - if (value.disabled) { - enableButton('enable-sense', true); - enableButton('disable-sense', false); - g_senseState = HpsResult.DISABLED; - } else { - enableButton('enable-sense', false); - enableButton('disable-sense', true); - g_senseState = value.state!; - } - $('sense-state').textContent = hpsResultToString(g_senseState); - $('sense-state').className = hpsResultToClass(g_senseState); - updatePolling(); -} - -function onNotifyChanged(value: HpsResultState) { - if (value.disabled) { - enableButton('enable-notify', true); - enableButton('disable-notify', false); - g_notifyState = HpsResult.DISABLED; - } else { - enableButton('enable-notify', false); - enableButton('disable-notify', true); - g_notifyState = value.state!; - } - $('notify-state').textContent = hpsResultToString(g_notifyState); - $('notify-state').className = hpsResultToClass(g_notifyState); - updatePolling(); -} - -function initialize() { - addWebUIListener('connected', onConnected); - addWebUIListener('sense_changed', onSenseChanged); - addWebUIListener('notify_changed', onNotifyChanged); - addWebUIListener('enable_error', onEnableError); - $('enable-sense').onclick = enableSense; - $('disable-sense').onclick = disableSense; - $('enable-notify').onclick = enableNotify; - $('disable-notify').onclick = disableNotify; - onConnected({connected: false}); - chrome.send('connect'); -} - -function enableSense() { - $('enable-error').style.display = 'none'; - chrome.send('enable_sense'); -} - -function disableSense() { - chrome.send('disable_sense'); - // Query the feature state immediately after toggling it off to make sure the - // UI always reflects the latest state. This is needed because hpsd sends an - // UNKNOWN result whenever a feature is turned off. - chrome.send('query_sense'); -} - -function enableNotify() { - $('enable-error').style.display = 'none'; - chrome.send('enable_notify'); -} - -function disableNotify() { - chrome.send('disable_notify'); - // Query the feature state immediately after toggling it off to make sure the - // UI always reflects the latest state. This is needed because hpsd sends an - // UNKNOWN result whenever a feature is turned off. - chrome.send('query_notify'); -} - -function updatePolling() { - const shouldPoll = - g_notifyState !== HpsResult.DISABLED || - g_senseState !== HpsResult.DISABLED; - if (shouldPoll && g_pollTimer === undefined) { - g_pollTimer = setInterval(recordSample, POLL_INTERVAL_MS); - recordSample(); - } else if (!shouldPoll && g_pollTimer !== undefined) { - clearInterval(g_pollTimer); - g_pollTimer = undefined; - } - $('root').dispatchEvent(new CustomEvent('state-updated-for-test')); -} - -function pruneSamples(container: HTMLElement) { - while (container.childElementCount > MAX_HISTORY) { - container.firstChild!.remove(); - } -} - -function recordSample() { - if (g_senseState !== undefined) { - let sample = document.createElement('span'); - sample.className = hpsResultToClass(g_senseState); - $('sense-history').appendChild(sample); - pruneSamples($('sense-history')); - } - if (g_notifyState !== undefined) { - let sample = document.createElement('span'); - sample.className = hpsResultToClass(g_notifyState); - $('notify-history').appendChild(sample); - pruneSamples($('notify-history')); - } -} - -document.addEventListener('DOMContentLoaded', initialize);
diff --git a/chromeos/components/human_presence/test/human_presence_internals_browsertest.js b/chromeos/components/human_presence/test/human_presence_internals_browsertest.js deleted file mode 100644 index 018a4b1..0000000 --- a/chromeos/components/human_presence/test/human_presence_internals_browsertest.js +++ /dev/null
@@ -1,70 +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. - -/** - * @fileoverview Test suite for chrome://hps-internals/ - */ - -GEN('#include "content/public/test/browser_test.h"'); -GEN('#include "chromeos/dbus/human_presence/fake_human_presence_dbus_client.h"'); -GEN('#include "chromeos/dbus/human_presence/human_presence_dbus_client.h"'); - -const HOST_ORIGIN = 'chrome://hps-internals'; - -// TODO:(crbug.com/1262025): We should avoid using `var`. -// -// js2gtest fixtures require var here (https://crbug.com/1033337). -// eslint-disable-next-line no-var -var HumanPresenceInternalsUIBrowserTest = class extends testing.Test { - /** @override */ - get browsePreload() { - return HOST_ORIGIN; - } - - /** @override */ - get isAsync() { - return true; - } - - /** @override */ - testGenPreamble() { - GEN(` - chromeos::HumanPresenceDBusClient::InitializeFake(); - chromeos::FakeHumanPresenceDBusClient::Get()->Reset(); - chromeos::FakeHumanPresenceDBusClient::Get()-> - set_hps_service_is_available(true); - chromeos::FakeHumanPresenceDBusClient::Get()->set_hps_sense_result( - hps::HpsResult::POSITIVE); - chromeos::FakeHumanPresenceDBusClient::Get()->set_hps_notify_result( - hps::HpsResult::NEGATIVE);`); - } -}; - -// Tests that chrome://hps-internals loads successfully. -TEST_F( - 'HumanPresenceInternalsUIBrowserTest', 'HasChromeSchemeURL', async () => { - assertEquals(document.location.origin, HOST_ORIGIN); - testDone(); - }); - -// Tests that the UI reflects the state of HPS. -TEST_F('HumanPresenceInternalsUIBrowserTest', 'StateSynchronized', async () => { - document.querySelector('#root').addEventListener( - 'state-updated-for-test', () => { - const senseState = document.querySelector('#sense-state').textContent; - const notifyState = document.querySelector('#notify-state').textContent; - // Wait until both features become enabled. - if (senseState === 'disabled' || notifyState === 'disabled') - return; - assertEquals(senseState, 'positive'); - assertEquals(notifyState, 'negative'); - assertTrue(document.querySelector('#enable-sense').disabled); - assertTrue(document.querySelector('#enable-notify').disabled); - assertFalse(document.querySelector('#disable-sense').disabled); - assertFalse(document.querySelector('#disable-notify').disabled); - testDone(); - }); - // Enable a feature to trigger the UI state to update. - document.querySelector('#enable-notify').click(); -});
diff --git a/chromeos/components/mojo_service_manager/BUILD.gn b/chromeos/components/mojo_service_manager/BUILD.gn index 5ba6344..ec1dbfb 100644 --- a/chromeos/components/mojo_service_manager/BUILD.gn +++ b/chromeos/components/mojo_service_manager/BUILD.gn
@@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//chromeos/features.gni") + assert(is_chromeos, "Non-ChromeOS builds cannot depend on //chromeos") component("mojo_service_manager") { @@ -11,8 +13,16 @@ ] deps = [ "//base", + "//chromeos:features", "//mojo/public/cpp/bindings", ] public_deps = [ "//chromeos/components/mojo_service_manager/mojom" ] defines = [ "IS_CHROMEOS_MOJO_SERVICE_MANAGER_IMPL" ] + + if (!use_real_chromeos_services) { + sources += [ + "fake_mojo_service_manager.cc", + "fake_mojo_service_manager.h", + ] + } }
diff --git a/chromeos/components/mojo_service_manager/fake_mojo_service_manager.cc b/chromeos/components/mojo_service_manager/fake_mojo_service_manager.cc new file mode 100644 index 0000000..e3ad3cc2 --- /dev/null +++ b/chromeos/components/mojo_service_manager/fake_mojo_service_manager.cc
@@ -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. + +#include "chromeos/components/mojo_service_manager/fake_mojo_service_manager.h" + +#include "base/notreached.h" + +namespace chromeos::mojo_service_manager { + +FakeMojoServiceManager::FakeMojoServiceManager() : receiver_(this) {} + +FakeMojoServiceManager::~FakeMojoServiceManager() {} + +mojo::PendingRemote<mojom::ServiceManager> +FakeMojoServiceManager::BindNewPipeAndPassRemote() { + return receiver_.BindNewPipeAndPassRemote(); +} + +void FakeMojoServiceManager::Register( + const std::string& service_name, + mojo::PendingRemote<mojom::ServiceProvider> service_provider) { + NOTIMPLEMENTED(); +} + +void FakeMojoServiceManager::Request(const std::string& service_name, + absl::optional<base::TimeDelta> timeout, + mojo::ScopedMessagePipeHandle receiver) { + NOTIMPLEMENTED(); +} + +void FakeMojoServiceManager::Query(const std::string& service_name, + QueryCallback callback) { + NOTIMPLEMENTED(); +} + +void FakeMojoServiceManager::AddServiceObserver( + mojo::PendingRemote<mojom::ServiceObserver> observer) { + NOTIMPLEMENTED(); +} + +} // namespace chromeos::mojo_service_manager
diff --git a/chromeos/components/mojo_service_manager/fake_mojo_service_manager.h b/chromeos/components/mojo_service_manager/fake_mojo_service_manager.h new file mode 100644 index 0000000..d7a1841 --- /dev/null +++ b/chromeos/components/mojo_service_manager/fake_mojo_service_manager.h
@@ -0,0 +1,45 @@ +// 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_COMPONENTS_MOJO_SERVICE_MANAGER_FAKE_MOJO_SERVICE_MANAGER_H_ +#define CHROMEOS_COMPONENTS_MOJO_SERVICE_MANAGER_FAKE_MOJO_SERVICE_MANAGER_H_ + +#include "base/component_export.h" +#include "chromeos/components/mojo_service_manager/mojom/mojo_service_manager.mojom.h" +#include "mojo/public/cpp/bindings/remote.h" + +namespace chromeos::mojo_service_manager { + +// Provides fake implementation of the service manager for testing. This sets +// a fake mojo remote to the |Connection|. +class COMPONENT_EXPORT(CHROMEOS_MOJO_SERVICE_MANAGER) FakeMojoServiceManager + : public mojom::ServiceManager { + public: + FakeMojoServiceManager(); + FakeMojoServiceManager(FakeMojoServiceManager&) = delete; + FakeMojoServiceManager& operator=(FakeMojoServiceManager&) = delete; + ~FakeMojoServiceManager() override; + + // Binds a new pipe and pass the pending remote. + mojo::PendingRemote<mojom::ServiceManager> BindNewPipeAndPassRemote(); + + private: + // mojom::ServiceManager overrides. + void Register( + const std::string& service_name, + mojo::PendingRemote<mojom::ServiceProvider> service_provider) override; + void Request(const std::string& service_name, + absl::optional<base::TimeDelta> timeout, + mojo::ScopedMessagePipeHandle receiver) override; + void Query(const std::string& service_name, QueryCallback callback) override; + void AddServiceObserver( + mojo::PendingRemote<mojom::ServiceObserver> observer) override; + + // The receiver object to provide the fake service manager. + mojo::Receiver<mojom::ServiceManager> receiver_; +}; + +} // namespace chromeos::mojo_service_manager + +#endif // CHROMEOS_COMPONENTS_MOJO_SERVICE_MANAGER_FAKE_MOJO_SERVICE_MANAGER_H_
diff --git a/chromeos/components/mojo_service_manager/mojom/BUILD.gn b/chromeos/components/mojo_service_manager/mojom/BUILD.gn deleted file mode 100644 index 9c038a0..0000000 --- a/chromeos/components/mojo_service_manager/mojom/BUILD.gn +++ /dev/null
@@ -1,13 +0,0 @@ -# Copyright 2022 The Chromium OS 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("//mojo/public/tools/bindings/mojom.gni") - -mojom("mojom") { - sources = [ "mojo_service_manager.mojom" ] - public_deps = [ "//mojo/public/mojom/base" ] - - component_output_prefix = "chromeos_mojo_service_manager" - component_macro_prefix = "CHROMEOS_MOJO_SERVICE_MANAGER" -}
diff --git a/chromeos/components/mojo_service_manager/mojom/OWNERS b/chromeos/components/mojo_service_manager/mojom/OWNERS deleted file mode 100644 index c4a2530..0000000 --- a/chromeos/components/mojo_service_manager/mojom/OWNERS +++ /dev/null
@@ -1,6 +0,0 @@ -per-file *.mojom=set noparent -per-file *.mojom=file://ipc/SECURITY_OWNERS -per-file *.mojom=file://chromeos/SECURITY_OWNERS -per-file *_mojom_traits*.*=set noparent -per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS -per-file *_mojom_traits*.*=file://chromeos/SECURITY_OWNERS
diff --git a/chromeos/components/mojo_service_manager/mojom/mojo_service_manager.mojom b/chromeos/components/mojo_service_manager/mojom/mojo_service_manager.mojom deleted file mode 100644 index 0bf932d..0000000 --- a/chromeos/components/mojo_service_manager/mojom/mojo_service_manager.mojom +++ /dev/null
@@ -1,163 +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. - -// API exposed by the ChromeOS mojo service manager. - -// NOTE: This mojom should be kept in sync with the copy in ChromeOS's repo in -// src/platform2/mojo_service_manager/lib/mojom/service_manager.mojom - -module chromeos.mojo_service_manager.mojom; - -import "mojo/public/mojom/base/time.mojom"; - -// Manages services provided by processes running on the system. -// The argument |service_name| should match the regex ([a-zA-Z0-9._\-]+). -// -// Next MinVersion: 1 -// Next Method ID: 4 -interface ServiceManager { - // Registers a service to the service manager. Callers should set disconnect - // handler on another end of |service_provider| to handle errors. - Register@0(string service_name, - pending_remote<ServiceProvider> service_provider); - - // Requests a service from the service manager. The |receiver| will be bound - // to the service. In the case that the service is not registered, if - // |timeout| is null, the |receiver| will be bound after the service is - // available. If |timeout| is not null and the |receiver| cannot be bound - // after |timeout|, it will be reset. Callers should set disconnect handler on - // another end of |receiver| to handle errors. - Request@1(string service_name, mojo_base.mojom.TimeDelta? timeout, - handle<message_pipe> receiver); - - // Queries the state of a service. - Query@2(string service_name) => (ErrorOrServiceState result); - - // Registers an observer to observe the state of services. The observer can - // only receive the events related to the services which the callers are - // allowed to request. Callers should set disconnect handler on another end of - // |observer| to handle errors. - AddServiceObserver@3(pending_remote<ServiceObserver> observer); -}; - -// Provides services to other processes. Provider processes implement this and -// register it to the service manager. -// -// Next MinVersion: 1 -// Next Method ID: 1 -interface ServiceProvider { - // Requests to bind the |receiver| to the corresponding mojo interface. The - // |client_identity| can be used to identify the requester processes. - // Note: the implementations can reset |receiver| to return errors. They - // should use the error codes defined in |ErrorCode| enum when returning - // errors. - Request@0(ProcessIdentity client_identity, - handle<message_pipe> receiver); -}; - -// Observes the service events. Requester processes implement this and register -// it to the service manager. -// -// Next MinVersion: 1 -// Next Method ID: 1 -interface ServiceObserver { - // Is called when service events occur. - OnServiceEvent@0(ServiceEvent event); -}; - -// The identity information about a process. -// -// Next MinVersion: 1 -// Next Field ID: 4 -struct ProcessIdentity { - // The SELinux security context. - string security_context@0; - // The process id. - uint32 pid@1; - // The user / group id. - uint32 uid@2; - uint32 gid@3; -}; - -// The result of ServiceManager::Query. -// -// Next MinVersion: 1 -union ErrorOrServiceState { - // The result if succeeds. - ServiceState state; - // The error if fails. - Error error; -}; - -// The state of a service. -// -// Next MinVersion: 1 -// Next Field ID: 2 -struct ServiceState { - // The service is registered or not. - bool is_registered@0; - // The identity of the owner of the service. This is omitted if the service - // is not registered. - ProcessIdentity? owner@1; -}; - -// The event about a service. -// -// Next MinVersion: 1 -// Next Field ID: 3 -struct ServiceEvent { - [Extensible] - enum Type { - // The default value for forward compatibility. All the unknown value will - // be mapped to this. - [Default] kUnknown, - // The service is registered. - kRegistered, - // The service is not registered. - kUnRegistered, - }; - - Type type@0; - // The name of the service which triggers the event. - string service_name@1; - // The dispatcher of the event. It is the process which registered or - // unregistered the service. - ProcessIdentity dispatcher@2; -}; - -// A generic error type for functions to return error. -// -// Next MinVersion: 1 -// Next Field ID: 2 -struct Error { - ErrorCode code@0; - string message@1; -}; - -// The error code for |struct Error| and the disconnect handlers. This is used -// in the disconnect reason of all the mojo handles (namely, message pipe, -// receiver and remote) which are sent to |ServiceManager|. -// Note that in the disconnect handlers, this is casted to |uint32| and has no -// guarantee that the value can be casted back to this. Always check if the -// value is between 1 and |ErrorCode::kMaxValue| before casting it. -// -// NextMinVersion: 1 -[Extensible] -enum ErrorCode { - // The default value for forward compatibility. In struct |Error|, all the - // unknown value will be mapped to this. - // In disconnect handlers, if the handle is reset without a reason, the error - // code is 0. So this enum starts from 1 to be distinguish from that. - [Default] kUnknown = 1, - // Timeout is reached. - kTimeout, - // The caller is not permit to perform the operation. - kPermissionDenied, - // The service has already been registered. - kServiceHasBeenRegistered, - // The service cannot be found. - kServiceNotFound, - // Unexpected os error. - kUnexpectedOsError, -};
diff --git a/chromeos/crosapi/mojom/BUILD.gn b/chromeos/crosapi/mojom/BUILD.gn index c2708d6d..cd433fc 100644 --- a/chromeos/crosapi/mojom/BUILD.gn +++ b/chromeos/crosapi/mojom/BUILD.gn
@@ -34,6 +34,7 @@ "feedback.mojom", "field_trial.mojom", "file_manager.mojom", + "file_system_provider.mojom", "force_installed_tracker.mojom", "geolocation.mojom", "holding_space_service.mojom",
diff --git a/chromeos/crosapi/mojom/file_system_provider.mojom b/chromeos/crosapi/mojom/file_system_provider.mojom new file mode 100644 index 0000000..080bf44 --- /dev/null +++ b/chromeos/crosapi/mojom/file_system_provider.mojom
@@ -0,0 +1,147 @@ +// 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 crosapi.mojom; + +import "mojo/public/mojom/base/file_path.mojom"; + +// A file system is uniquely identified by an opaque string (consisting of at +// least the extension id + profile unique identifier) and a file_system_id. +[Stable] +struct FileSystemId { + // At a minimum, identifies the extension. May also need to identify profiles + // in the future. + string provider@0; + + // A unique id (for a particular |provider|) provided by the extension. + string id@1; +}; + +// Provides immutable metadata about a file system. +[Stable] +struct FileSystemMetadata { + // The identifier of the file system. + FileSystemId file_system_id@0; + + // A human-readable name for the file system. + string display_name@1; + + // Whether the file system supports operations which may change contents of + // the file system (such as creating, deleting or writing to files). + bool writable@2; + + // The maximum number of files that can be opened at once. If 0, then not + // limited. + uint32 opened_files_limit@3; + + // Whether the file system supports the tag field for observing directories. + bool supports_notify@4; +}; + +// Files can be opened either for reading or writing. +[Stable, Extensible] +enum OpenFileMode { + [Default] kRead, + kWrite, +}; + +[Stable] +struct OpenedFile { + // A request ID to be be used by consecutive read/write and close requests. + int64 open_request_id@0; + + // The path of the opened file. While it seems like it would make sense to use + // a base::Path, both the extension API and the ash FileSystemProvider API + // pass strings. + string file_path@1; + + // Whether the file was opened for reading or writing. + OpenFileMode mode@2; +}; + +// Represents a watcher. +[Stable] +struct FSPWatcher { + // The path of the entry being observed. + mojo_base.mojom.FilePath entry_path@0; + + // Whether watching should include all child entries recursively. It can be + // true for directories only. + bool recursive@1; + + // Tag used by the last notification for the watcher. + string last_tag@2; +}; + +[Stable] +struct FileSystemInfo { + // Fixed metadata about the file system. + FileSystemMetadata metadata@0; + + // List of currently opened files. + array<OpenedFile> opened_files@1; + + // List of watchers. + array<FSPWatcher> watchers@2; +}; + +[Stable, Extensible] +enum FSPChangeType { + [Default] kChanged, + kDeleted +}; + +[Stable] +struct FSPChange { + FSPChangeType type@0; + mojo_base.mojom.FilePath path@1; +}; + +// Implemented by Lacros. +[Stable, Uuid="8cbcf151-c189-4fe9-90ff-892c7f5637a9"] +interface FileSystemProvider { +// TODO(https://crbug.com/1314397): Add methods. +}; + +// Implemented by Ash. Extensions in Lacros can register themselves as file +// system providers. As the underlying system in Ash already supports +// multiplexing, we refrain from introducing a second layer of multiplexing at +// the crosapi layer. Lacros registers itself as a FileSystemProvider at +// startup. Extensions will call the "mount" method to make themselves known to +// Ash. At that point, Ash will send operations via FileSystemProvider, which +// Lacros will fulfill by calling methods in FileSystemProviderService. This +// creates a state machine with state spread between Ash and Lacros. This is +// dispreferred but unfortunately impossible to avoid given the design of the +// fileSystemProvider extension API. +[Stable, Uuid="82db93f7-e0a5-4a9c-a09f-db92f9e45348"] +interface FileSystemProviderService { + // File system providers use this interface to receive operation requests. + RegisterFileSystemProvider@0(pending_remote<FileSystemProvider> provider); + + // Makes a filesystem provided by an extension visible to the operating system + // and other consumers. + Mount@1(FileSystemMetadata metadata, bool persistent) => (string error); + + // Makes a filesystem provided by an extension unavailable. + Unmount@2(FileSystemId file_system_id) => (string error); + + // Returns all file systems mounted by the extension. + GetAll@3(string provider) => (array<FileSystemInfo> infos); + + // Returns information about a file system with the passed file_system_id. + Get@4(FileSystemId file_system_id) => (FileSystemInfo? info); + + // Called by the extension to notify watchers of changes. + // |file_system_id| is the identifier of the file system related to this + // change. + // |watcher| gives information about the path being observed, including the + // tag. + // |type| provides information about the observed entry. + // |changes| provides information about the observed directory. + // Note: for backwards compatibility with the existing extension API, both + // |type| and |changes| are necessary even though they appear mutually + // exclusive. + Notify@5(FileSystemId file_system_id, FSPWatcher watcher, + FSPChangeType type, array<FSPChange> changes) => (string error); +};
diff --git a/chromeos/dbus/human_presence/fake_human_presence_dbus_client.h b/chromeos/dbus/human_presence/fake_human_presence_dbus_client.h index 712bbd3..17bcb058 100644 --- a/chromeos/dbus/human_presence/fake_human_presence_dbus_client.h +++ b/chromeos/dbus/human_presence/fake_human_presence_dbus_client.h
@@ -40,10 +40,10 @@ // Methods for co-ordinating GetResultHpsNotify calls in tests. - void set_hps_notify_result(absl::optional<hps::HpsResult> result) { + void set_hps_notify_result(absl::optional<hps::HpsResultProto> result) { hps_notify_result_ = result; } - void set_hps_sense_result(absl::optional<hps::HpsResult> result) { + void set_hps_sense_result(absl::optional<hps::HpsResultProto> result) { hps_sense_result_ = result; } @@ -73,8 +73,8 @@ void Reset(); private: - absl::optional<hps::HpsResult> hps_notify_result_; - absl::optional<hps::HpsResult> hps_sense_result_; + absl::optional<hps::HpsResultProto> hps_notify_result_; + absl::optional<hps::HpsResultProto> hps_sense_result_; int hps_notify_count_ = 0; int hps_sense_count_ = 0; int enable_hps_notify_count_ = 0;
diff --git a/chromeos/dbus/human_presence/human_presence_dbus_client.cc b/chromeos/dbus/human_presence/human_presence_dbus_client.cc index af39ac2..3f895134 100644 --- a/chromeos/dbus/human_presence/human_presence_dbus_client.cc +++ b/chromeos/dbus/human_presence/human_presence_dbus_client.cc
@@ -25,7 +25,7 @@ HumanPresenceDBusClient* g_instance = nullptr; // Extracts result data out of a DBus response. -absl::optional<hps::HpsResult> UnwrapHpsResult(dbus::Response* response) { +absl::optional<hps::HpsResultProto> UnwrapHpsResult(dbus::Response* response) { if (response == nullptr) { return absl::nullopt; } @@ -37,7 +37,7 @@ return absl::nullopt; } - return result.value(); + return result; } class HumanPresenceDBusClientImpl : public HumanPresenceDBusClient { @@ -88,7 +88,7 @@ // Notify observers of state change. for (auto& observer : observers_) { - observer.OnHpsSenseChanged(result.value()); + observer.OnHpsSenseChanged(result); } } @@ -103,7 +103,7 @@ // Notify observers of state change. for (auto& observer : observers_) { - observer.OnHpsNotifyChanged(result.value()); + observer.OnHpsNotifyChanged(result); } }
diff --git a/chromeos/dbus/human_presence/human_presence_dbus_client.h b/chromeos/dbus/human_presence/human_presence_dbus_client.h index d3b497c..912ccecb8 100644 --- a/chromeos/dbus/human_presence/human_presence_dbus_client.h +++ b/chromeos/dbus/human_presence/human_presence_dbus_client.h
@@ -30,11 +30,11 @@ ~Observer() override; // Called when the presence of a user starts or stops being detected. - virtual void OnHpsSenseChanged(hps::HpsResult state) = 0; + virtual void OnHpsSenseChanged(const hps::HpsResultProto&) = 0; // Called when the presence of a "snooper" looking over the user's shoulder // starts or stops being detected. - virtual void OnHpsNotifyChanged(hps::HpsResult state) = 0; + virtual void OnHpsNotifyChanged(const hps::HpsResultProto&) = 0; // Called when the service starts or restarts. virtual void OnRestart() = 0; @@ -44,7 +44,7 @@ }; using GetResultCallback = - base::OnceCallback<void(absl::optional<hps::HpsResult>)>; + base::OnceCallback<void(absl::optional<hps::HpsResultProto>)>; HumanPresenceDBusClient(const HumanPresenceDBusClient&) = delete; HumanPresenceDBusClient& operator=(const HumanPresenceDBusClient&) = delete;
diff --git a/chromeos/dbus/shill/fake_shill_manager_client.cc b/chromeos/dbus/shill/fake_shill_manager_client.cc index c2b4a79..f340e7f0 100644 --- a/chromeos/dbus/shill/fake_shill_manager_client.cc +++ b/chromeos/dbus/shill/fake_shill_manager_client.cc
@@ -557,6 +557,11 @@ if (AppendIfNotPresent( GetListProperty(shill::kUninitializedTechnologiesProperty), base::Value(type))) { + if (GetListProperty(shill::kEnabledTechnologiesProperty) + ->EraseListValue(base::Value(type))) { + CallNotifyObserversPropertyChanged(shill::kEnabledTechnologiesProperty); + } + CallNotifyObserversPropertyChanged( shill::kUninitializedTechnologiesProperty); } @@ -597,6 +602,21 @@ CallNotifyObserversPropertyChanged(shill::kProhibitedTechnologiesProperty); } +void FakeShillManagerClient::SetTechnologyEnabled(const std::string& type, + base::OnceClosure callback, + bool enabled) { + base::ListValue* enabled_list = + GetListProperty(shill::kEnabledTechnologiesProperty); + if (enabled) + AppendIfNotPresent(enabled_list, base::Value(type)); + else + enabled_list->EraseListValue(base::Value(type)); + CallNotifyObserversPropertyChanged(shill::kEnabledTechnologiesProperty); + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(callback)); + // May affect available services. + SortManagerServices(true); +} + void FakeShillManagerClient::AddGeoNetwork(const std::string& technology, const base::Value& network) { base::Value* list_value = @@ -1146,21 +1166,6 @@ return false; } -void FakeShillManagerClient::SetTechnologyEnabled(const std::string& type, - base::OnceClosure callback, - bool enabled) { - base::ListValue* enabled_list = - GetListProperty(shill::kEnabledTechnologiesProperty); - if (enabled) - AppendIfNotPresent(enabled_list, base::Value(type)); - else - enabled_list->EraseListValue(base::Value(type)); - CallNotifyObserversPropertyChanged(shill::kEnabledTechnologiesProperty); - base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(callback)); - // May affect available services. - SortManagerServices(true); -} - base::Value FakeShillManagerClient::GetEnabledServiceList() const { base::Value new_service_list(base::Value::Type::LIST); const base::Value* service_list =
diff --git a/chromeos/dbus/shill/fake_shill_manager_client.h b/chromeos/dbus/shill/fake_shill_manager_client.h index cecac2c..e755660 100644 --- a/chromeos/dbus/shill/fake_shill_manager_client.h +++ b/chromeos/dbus/shill/fake_shill_manager_client.h
@@ -88,6 +88,9 @@ bool initializing) override; void SetTechnologyProhibited(const std::string& type, bool prohibited) override; + void SetTechnologyEnabled(const std::string& type, + base::OnceClosure callback, + bool enabled) override; void AddGeoNetwork(const std::string& technology, const base::Value& network) override; void AddProfile(const std::string& profile_path) override; @@ -125,9 +128,6 @@ void NotifyObserversPropertyChanged(const std::string& property); base::ListValue* GetListProperty(const std::string& property); bool TechnologyEnabled(const std::string& type) const; - void SetTechnologyEnabled(const std::string& type, - base::OnceClosure callback, - bool enabled); void ScanCompleted(const std::string& device_path); // Parses the command line for Shill stub switches and sets initial states.
diff --git a/chromeos/dbus/shill/shill_manager_client.h b/chromeos/dbus/shill/shill_manager_client.h index 5ef61a3..a3d40d94 100644 --- a/chromeos/dbus/shill/shill_manager_client.h +++ b/chromeos/dbus/shill/shill_manager_client.h
@@ -57,6 +57,9 @@ bool initializing) = 0; virtual void SetTechnologyProhibited(const std::string& type, bool prohibited) = 0; + virtual void SetTechnologyEnabled(const std::string& type, + base::OnceClosure callback, + bool enabled) = 0; // |network| must be a dictionary describing a Shill network configuration // which will be appended to the results returned from // GetNetworksForGeolocation().
diff --git a/chromeos/memory/userspace_swap/userspace_swap.cc b/chromeos/memory/userspace_swap/userspace_swap.cc index 488f55e37..41221c4 100644 --- a/chromeos/memory/userspace_swap/userspace_swap.cc +++ b/chromeos/memory/userspace_swap/userspace_swap.cc
@@ -492,20 +492,19 @@ uint32_t superpages_remaining = max_superpages >= 0 ? max_superpages : UINT32_MAX; - auto* pool_manager = base::internal::AddressPoolManager::GetInstance(); - DCHECK(pool_manager); + auto& pool_manager = base::internal::AddressPoolManager::GetInstance(); for (base::internal::pool_handle ph : {base::internal::PartitionAddressSpace::GetRegularPool(), base::internal::PartitionAddressSpace::GetBRPPool()}) { - uintptr_t pool_base = pool_manager->GetPoolBaseAddress(ph); + uintptr_t pool_base = pool_manager.GetPoolBaseAddress(ph); DCHECK(pool_base); uintptr_t current_area = 0; uint64_t current_area_length = 0; std::bitset<partition_alloc::kMaxSuperPagesInPool> alloc_bitset; - pool_manager->GetPoolUsedSuperPages(ph, alloc_bitset); + pool_manager.GetPoolUsedSuperPages(ph, alloc_bitset); for (size_t i = 0; i < alloc_bitset.size() && superpages_remaining; ++i) { if (alloc_bitset.test(i)) {
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt index 84203e4..44bc4cbe 100644 --- a/chromeos/profiles/atom.afdo.newest.txt +++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-atom-103-5005.22-1651484731-benchmark-103.0.5045.0-r1-redacted.afdo.xz +chromeos-chrome-amd64-atom-103-5037.0-1652089622-benchmark-103.0.5060.6-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt index 076a71b..15163c2 100644 --- a/chromeos/profiles/bigcore.afdo.newest.txt +++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-bigcore-103-5005.20-1651490602-benchmark-103.0.5045.0-r1-redacted.afdo.xz +chromeos-chrome-amd64-bigcore-103-5035.0-1652090645-benchmark-103.0.5060.6-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt index ab4517e..32671298 100644 --- a/chromeos/profiles/orderfile.newest.txt +++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@ -chromeos-chrome-orderfile-field-103-5005.22-1651484731-benchmark-103.0.5042.0-r1.orderfile.xz +chromeos-chrome-orderfile-field-103-5037.0-1652089622-benchmark-103.0.5060.4-r1.orderfile.xz
diff --git a/chromeos/resources/BUILD.gn b/chromeos/resources/BUILD.gn index a521cfff..f7f5687 100644 --- a/chromeos/resources/BUILD.gn +++ b/chromeos/resources/BUILD.gn
@@ -2,7 +2,6 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//chromeos/assistant/assistant.gni") import("//tools/grit/grit_rule.gni") assert(is_chromeos, "Non-ChromeOS builds cannot depend on //chromeos") @@ -18,15 +17,12 @@ ] output_dir = "$root_gen_dir/chromeos" - defines = [ "enable_cros_libassistant=$enable_cros_libassistant" ] - grit_flags = [ "-E", "mojom_root=" + rebase_path(root_gen_dir, root_build_dir), ] deps = [ - "//chromeos/components/human_presence:human_presence_internals_ts", "//chromeos/language/public/mojom:mojom_js", "//chromeos/services/bluetooth_config/public/mojom:mojom_js",
diff --git a/chromeos/resources/assistant_resources.grdp b/chromeos/resources/assistant_resources.grdp deleted file mode 100644 index d72b97b..0000000 --- a/chromeos/resources/assistant_resources.grdp +++ /dev/null
@@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<grit-part> - <!-- Resources for Google Assistant. --> - <include name="IDR_ASSISTANT_SPEECH_RECOGNITION_ERROR" file="../assistant/internal/resources/sounds/en_hol_err_speech_recognition_error.opus" type="BINDATA" /> - <include name="IDR_ASSISTANT_NO_INTERNET_ERROR" file="../assistant/internal/resources/sounds/en_hol_err_no_internet.opus" type="BINDATA" /> -</grit-part>
diff --git a/chromeos/resources/chromeos_resources.grd b/chromeos/resources/chromeos_resources.grd index 082c3d9..4ab026e 100644 --- a/chromeos/resources/chromeos_resources.grd +++ b/chromeos/resources/chromeos_resources.grd
@@ -14,11 +14,7 @@ <includes> <part file="cros_bluetooth_config_resources.grdp" /> <part file="cros_network_config_resources.grdp" /> - <part file="human_presence_resources.grdp" /> <part file="network_health_resources.grdp" /> - <if expr="enable_cros_libassistant"> - <part file="assistant_resources.grdp" /> - </if> </includes> </release> </grit>
diff --git a/chromeos/resources/human_presence_resources.grdp b/chromeos/resources/human_presence_resources.grdp deleted file mode 100644 index 88679041..0000000 --- a/chromeos/resources/human_presence_resources.grdp +++ /dev/null
@@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<grit-part> - <include name="IDR_HUMAN_PRESENCE_INTERNALS_HTML" file="../components/human_presence/resources/human_presence_internals.html" type="BINDATA" /> - <include name="IDR_HUMAN_PRESENCE_INTERNALS_CSS" file="../components/human_presence/resources/human_presence_internals.css" type="BINDATA" /> - <include name="IDR_HUMAN_PRESENCE_INTERNALS_ICON" file="../components/human_presence/resources/human_presence_internals_icon.svg" type="BINDATA" /> - <include name="IDR_HUMAN_PRESENCE_INTERNALS_JS" - file="${root_gen_dir}/chromeos/components/human_presence/resources/human_presence_internals.js" - resource_path="chromeos/components/human_presence/resources/human_presence_internals.js" - use_base_dir="false" - type="BINDATA" /> -</grit-part>
diff --git a/chromeos/services/BUILD.gn b/chromeos/services/BUILD.gn index ca872f20..48f3f3ac 100644 --- a/chromeos/services/BUILD.gn +++ b/chromeos/services/BUILD.gn
@@ -3,7 +3,7 @@ # found in the LICENSE file. import("//build/config/ui.gni") -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//testing/test.gni")
diff --git a/chromeos/services/assistant/BUILD.gn b/chromeos/services/assistant/BUILD.gn index 5f7f9ea..7d75e7b 100644 --- a/chromeos/services/assistant/BUILD.gn +++ b/chromeos/services/assistant/BUILD.gn
@@ -4,7 +4,7 @@ import("//build/buildflag_header.gni") import("//build/config/chromeos/ui_mode.gni") -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") assert(is_chromeos_ash) @@ -58,7 +58,7 @@ "//ash/components/audio", "//ash/constants", "//base", - "//chromeos/assistant:buildflags", + "//chromeos/ash/components/assistant:buildflags", "//chromeos/dbus", "//chromeos/dbus/dlcservice:dlcservice", "//chromeos/dbus/dlcservice:dlcservice_proto", @@ -104,8 +104,8 @@ "//ash/public/cpp/assistant/test_support", "//base", "//base/test:test_support", - "//chromeos/assistant:buildflags", - "//chromeos/assistant/test_support", + "//chromeos/ash/components/assistant:buildflags", + "//chromeos/ash/components/assistant/test_support", "//chromeos/dbus:test_support", "//chromeos/dbus/audio", "//chromeos/dbus/power", @@ -166,7 +166,7 @@ deps = [ ":lib", "//base", - "//chromeos/assistant:buildflags", + "//chromeos/ash/components/assistant:buildflags", "//chromeos/services/assistant/public/cpp", "//chromeos/services/assistant/public/mojom", "//chromeos/services/assistant/public/proto",
diff --git a/chromeos/services/assistant/DEPS b/chromeos/services/assistant/DEPS index 27461088..13ac512 100644 --- a/chromeos/services/assistant/DEPS +++ b/chromeos/services/assistant/DEPS
@@ -1,7 +1,7 @@ include_rules = [ "+ash/components/audio", "+ash/public", - "+chromeos/assistant", + "+chromeos/ash/components/assistant", "+chromeos/grit/chromeos_strings.h", "+components/signin", "+google_apis/gaia",
diff --git a/chromeos/services/assistant/DIR_METADATA b/chromeos/services/assistant/DIR_METADATA index cfb0c371..5ba0efa 100644 --- a/chromeos/services/assistant/DIR_METADATA +++ b/chromeos/services/assistant/DIR_METADATA
@@ -1 +1 @@ -mixins: "//chromeos/assistant/COMMON_METADATA" +mixins: "//chromeos/ash/components/assistant/COMMON_METADATA"
diff --git a/chromeos/services/assistant/OWNERS b/chromeos/services/assistant/OWNERS index dd0c97af..574ed11 100644 --- a/chromeos/services/assistant/OWNERS +++ b/chromeos/services/assistant/OWNERS
@@ -1 +1 @@ -file://chromeos/assistant/OWNERS +file://chromeos/ash/components/assistant/OWNERS
diff --git a/chromeos/services/assistant/assistant_manager_service_impl_unittest.cc b/chromeos/services/assistant/assistant_manager_service_impl_unittest.cc index edebea8..64948ed 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl_unittest.cc +++ b/chromeos/services/assistant/assistant_manager_service_impl_unittest.cc
@@ -15,7 +15,7 @@ #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/values.h" -#include "chromeos/assistant/test_support/expect_utils.h" +#include "chromeos/ash/components/assistant/test_support/expect_utils.h" #include "chromeos/dbus/power/fake_power_manager_client.h" #include "chromeos/services/assistant/assistant_manager_service.h" #include "chromeos/services/assistant/libassistant_service_host.h"
diff --git a/chromeos/services/assistant/audio_decoder/BUILD.gn b/chromeos/services/assistant/audio_decoder/BUILD.gn index bbb0fb5b..adfd4462 100644 --- a/chromeos/services/assistant/audio_decoder/BUILD.gn +++ b/chromeos/services/assistant/audio_decoder/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") assert(enable_cros_libassistant)
diff --git a/chromeos/services/assistant/libassistant_service_host_impl.cc b/chromeos/services/assistant/libassistant_service_host_impl.cc index c86f434..b252730 100644 --- a/chromeos/services/assistant/libassistant_service_host_impl.cc +++ b/chromeos/services/assistant/libassistant_service_host_impl.cc
@@ -7,7 +7,7 @@ #include "base/check.h" #include "base/sequence_checker.h" #include "build/buildflag.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #include "chromeos/services/assistant/public/cpp/assistant_browser_delegate.h"
diff --git a/chromeos/services/assistant/libassistant_service_host_impl.h b/chromeos/services/assistant/libassistant_service_host_impl.h index 864e52e..b190455 100644 --- a/chromeos/services/assistant/libassistant_service_host_impl.h +++ b/chromeos/services/assistant/libassistant_service_host_impl.h
@@ -9,7 +9,7 @@ #include "base/thread_annotations.h" #include "build/buildflag.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/services/assistant/libassistant_service_host.h" namespace chromeos {
diff --git a/chromeos/services/assistant/public/cpp/BUILD.gn b/chromeos/services/assistant/public/cpp/BUILD.gn index cb5a420..97d613c 100644 --- a/chromeos/services/assistant/public/cpp/BUILD.gn +++ b/chromeos/services/assistant/public/cpp/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") # C++ headers and sources that can be used outside assistant. component("cpp") { @@ -45,7 +45,7 @@ ] deps = [ - "//chromeos/assistant:buildflags", + "//chromeos/ash/components/assistant:buildflags", "//components/prefs", ]
diff --git a/chromeos/services/assistant/public/cpp/assistant_browser_delegate.h b/chromeos/services/assistant/public/cpp/assistant_browser_delegate.h index 3e59657..7856424 100644 --- a/chromeos/services/assistant/public/cpp/assistant_browser_delegate.h +++ b/chromeos/services/assistant/public/cpp/assistant_browser_delegate.h
@@ -7,7 +7,7 @@ #include "ash/public/mojom/assistant_volume_control.mojom.h" #include "base/component_export.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/services/assistant/public/cpp/assistant_enums.h" #include "chromeos/services/assistant/public/mojom/assistant_audio_decoder.mojom.h" #include "chromeos/services/libassistant/public/cpp/assistant_notification.h"
diff --git a/chromeos/services/assistant/public/cpp/features.cc b/chromeos/services/assistant/public/cpp/features.cc index 9043732ae..e65ca39 100644 --- a/chromeos/services/assistant/public/cpp/features.cc +++ b/chromeos/services/assistant/public/cpp/features.cc
@@ -7,7 +7,7 @@ #include "ash/constants/ash_features.h" #include "base/feature_list.h" #include "build/buildflag.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #include "chromeos/assistant/internal/buildflags.h"
diff --git a/chromeos/services/assistant/public/shared/BUILD.gn b/chromeos/services/assistant/public/shared/BUILD.gn index b4b767c4..a64f19b 100644 --- a/chromeos/services/assistant/public/shared/BUILD.gn +++ b/chromeos/services/assistant/public/shared/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//chromeos/assistant/assistant.gni") +import("//build/config/chrome_build.gni") # C++ headers and sources that can be shared by assistant internal and # external directories.
diff --git a/chromeos/services/assistant/test_support/scoped_assistant_browser_delegate.h b/chromeos/services/assistant/test_support/scoped_assistant_browser_delegate.h index 689756f..cd5553e 100644 --- a/chromeos/services/assistant/test_support/scoped_assistant_browser_delegate.h +++ b/chromeos/services/assistant/test_support/scoped_assistant_browser_delegate.h
@@ -5,7 +5,7 @@ #ifndef CHROMEOS_SERVICES_ASSISTANT_TEST_SUPPORT_SCOPED_ASSISTANT_BROWSER_DELEGATE_H_ #define CHROMEOS_SERVICES_ASSISTANT_TEST_SUPPORT_SCOPED_ASSISTANT_BROWSER_DELEGATE_H_ -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/services/assistant/public/cpp/assistant_browser_delegate.h" #include "chromeos/services/assistant/public/cpp/assistant_service.h" #include "mojo/public/cpp/bindings/pending_remote.h"
diff --git a/chromeos/services/libassistant/BUILD.gn b/chromeos/services/libassistant/BUILD.gn index deee603..2f20d8d 100644 --- a/chromeos/services/libassistant/BUILD.gn +++ b/chromeos/services/libassistant/BUILD.gn
@@ -3,7 +3,7 @@ # found in the LICENSE file. import("//build/buildflag_header.gni") -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") assert(enable_cros_libassistant) @@ -125,7 +125,8 @@ "./grpc/external_services:grpc_services_initializer", "./grpc/external_services:grpc_services_observer", "//build/util:chromium_git_revision", - "//chromeos/assistant:buildflags", + "//chromeos/ash/components/assistant:buildflags", + "//chromeos/ash/resources", "//chromeos/assistant/internal", "//chromeos/assistant/internal:buildflags", "//chromeos/assistant/internal:libassistant", @@ -135,7 +136,6 @@ "//chromeos/dbus", "//chromeos/dbus/power", "//chromeos/dbus/util:util", - "//chromeos/resources:resources_grit", "//chromeos/services/assistant/public/cpp", "//chromeos/services/assistant/public/proto", "//chromeos/services/libassistant/public/mojom", @@ -256,11 +256,11 @@ ":test_support", "//base", "//base/test:test_support", + "//chromeos/ash/components/assistant/test_support:test_support", "//chromeos/assistant/internal", "//chromeos/assistant/internal:libassistant_shared_headers", "//chromeos/assistant/internal:support", "//chromeos/assistant/internal:test_support", - "//chromeos/assistant/test_support:test_support", "//chromeos/dbus/power", "//chromeos/services/assistant/public/cpp", "//chromeos/services/libassistant/grpc:assistant_client",
diff --git a/chromeos/services/libassistant/OWNERS b/chromeos/services/libassistant/OWNERS index 4b987816..1d47cb4 100644 --- a/chromeos/services/libassistant/OWNERS +++ b/chromeos/services/libassistant/OWNERS
@@ -1,3 +1,3 @@ -file://chromeos/assistant/OWNERS +file://chromeos/ash/components/assistant/OWNERS per-file libassistant_sandbox_hook.*=file://sandbox/linux/OWNERS
diff --git a/chromeos/services/libassistant/audio/fake_input_device.h b/chromeos/services/libassistant/audio/fake_input_device.h index 819e1fbd..10e4a09c 100644 --- a/chromeos/services/libassistant/audio/fake_input_device.h +++ b/chromeos/services/libassistant/audio/fake_input_device.h
@@ -15,8 +15,8 @@ namespace libassistant { // Create a fake input device. When asked to record input, it will read the -// input from an audio file generated by the chromeos/assistant/send-audio.sh -// script. +// input from an audio file generated by the +// chromeos/ash/components/assistant/send-audio.sh script. scoped_refptr<media::AudioCapturerSource> CreateFakeInputDevice(); } // namespace libassistant
diff --git a/chromeos/services/libassistant/conversation_controller_unittest.cc b/chromeos/services/libassistant/conversation_controller_unittest.cc index 6fcc419..fbf8b120 100644 --- a/chromeos/services/libassistant/conversation_controller_unittest.cc +++ b/chromeos/services/libassistant/conversation_controller_unittest.cc
@@ -5,7 +5,7 @@ #include "chromeos/services/libassistant/conversation_controller.h" #include "base/run_loop.h" #include "base/test/task_environment.h" -#include "chromeos/assistant/test_support/expect_utils.h" +#include "chromeos/ash/components/assistant/test_support/expect_utils.h" #include "chromeos/services/libassistant/test_support/fake_assistant_client.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromeos/services/libassistant/display_controller_unittest.cc b/chromeos/services/libassistant/display_controller_unittest.cc index 77c97bb..5d8e3b49 100644 --- a/chromeos/services/libassistant/display_controller_unittest.cc +++ b/chromeos/services/libassistant/display_controller_unittest.cc
@@ -5,7 +5,7 @@ #include "chromeos/services/libassistant/display_controller.h" #include "base/run_loop.h" #include "base/test/task_environment.h" -#include "chromeos/assistant/test_support/expect_utils.h" +#include "chromeos/ash/components/assistant/test_support/expect_utils.h" #include "chromeos/services/libassistant/grpc/assistant_client.h" #include "chromeos/services/libassistant/public/mojom/speech_recognition_observer.mojom.h" #include "chromeos/services/libassistant/test_support/fake_assistant_client.h"
diff --git a/chromeos/services/libassistant/file_provider_impl.cc b/chromeos/services/libassistant/file_provider_impl.cc index d7fd133..5c00579 100644 --- a/chromeos/services/libassistant/file_provider_impl.cc +++ b/chromeos/services/libassistant/file_provider_impl.cc
@@ -5,7 +5,7 @@ #include "chromeos/services/libassistant/file_provider_impl.h" #include "base/files/file_util.h" -#include "chromeos/grit/chromeos_resources.h" +#include "chromeos/ash/grit/ash_resources.h" #include "chromeos/services/libassistant/util.h" #include "ui/base/resource/resource_bundle.h"
diff --git a/chromeos/services/libassistant/public/mojom/BUILD.gn b/chromeos/services/libassistant/public/mojom/BUILD.gn index f4479996..b5005f4 100644 --- a/chromeos/services/libassistant/public/mojom/BUILD.gn +++ b/chromeos/services/libassistant/public/mojom/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") import("//mojo/public/tools/bindings/mojom.gni") mojom("mojom") {
diff --git a/chromeos/services/libassistant/util.cc b/chromeos/services/libassistant/util.cc index 1be0267..a669ea7d 100644 --- a/chromeos/services/libassistant/util.cc +++ b/chromeos/services/libassistant/util.cc
@@ -12,7 +12,7 @@ #include "base/system/sys_info.h" #include "base/values.h" #include "build/util/chromium_git_revision.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/assistant/internal/internal_constants.h" #include "chromeos/assistant/internal/internal_util.h" #include "chromeos/assistant/internal/util_headers.h"
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb index 5f5b3777..9db45681 100644 --- a/chromeos/strings/chromeos_strings_ar.xtb +++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">الشبكة الظاهرية الخاصة (VPN) في Android</translation> <translation id="131461803491198646">الشبكة الرئيسية، بلا تجوال</translation> <translation id="1327977588028644528">المدخل</translation> +<translation id="1328223165223065150">لون الخلفية</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">الملاءمة مع منطقة المسح الضوئي</translation> <translation id="1367951781824006909">اختيار ملف</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">مصدر الصورة</translation> <translation id="1451536289672181509">الجهاز هو لوحة مفاتيح.</translation> <translation id="1459693405370120464">الطقس</translation> +<translation id="1459784442280469416">الحفظ على محرّك أقراص USB</translation> <translation id="1468664791493211953">العروض</translation> <translation id="1476467821656042872">يدير <ph name="MANAGER" /> هذا الجهاز، وقد يتمكَّن من مراقبة نشاطك.</translation> <translation id="1478594628797167447">الماسح الضوئي</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732">يدير <ph name="MANAGER" /> هذا المستخدم، ويمكنه إدارة الإعدادات ومراقبة نشاط المستخدم عن بُعد.</translation> <translation id="150962533380566081">PUK غير صالح.</translation> <translation id="1510238584712386396">مشغِّل التطبيقات</translation> +<translation id="1512982610995527443">سيتم إيقاف الجهاز في غضون 5 ثوانٍ.</translation> +<translation id="1522984060396982789">تمت عملية الإصلاح بنجاح. يمكنك إيقاف الجهاز أو تنفيذ بعض الإجراءات الإضافية.</translation> <translation id="152892567002884378">رفع مستوى الصوت</translation> <translation id="1555130319947370107">أزرق</translation> <translation id="155865706765934889">لوحة اللمس</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">مراجعة الأجهزة</translation> <translation id="1905710495812624430">تم تجاوز الحد الأقصى لعدد المحاولات المسموح بها.</translation> <translation id="1908234395526491708">تعذَّر طلب بروتوكول UDP.</translation> +<translation id="1932611479324127242">فصل التيار عن البطارية</translation> <translation id="1947737735496445907">تمت الطباعة</translation> <translation id="1951012854035635156">المساعد</translation> <translation id="1977994649430373166">صورة الملف الشخصي في حساب Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">التحليق عاليًا</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> صورة</translation> +<translation id="2154739667870063220">إعادة التشغيل</translation> <translation id="2157959690810728433">تم وضع الاختبار في قائمة الانتظار.</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: إعادة المحاولة</translation> <translation id="2161394479394250669">إلغاء مهمة الطباعة</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">مفتاح التبديل بين تنسيقات لوحة المفاتيح</translation> <translation id="225692081236532131">حالة التفعيل</translation> <translation id="2271469253353559191">الجدول الزمني للوضع المُعتِم</translation> +<translation id="2275586345903859204">اكتملت عملية الإصلاح</translation> <translation id="2287186687001756809">لا تتوفّر صور. لإضافة صور، انتقِل إلى <ph name="LINK" />.</translation> <translation id="2307344026739914387">استخدام مفتاحَي التشفير الحاليين</translation> <translation id="2320295602967756579">تفعيل المظهر الفاتح</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">تفعيل وضع الألوان الداكنة</translation> <translation id="2740531572673183784">حسنًا</translation> <translation id="2751739896257479635">مصادقة المرحلة الثانية عبر EAP</translation> +<translation id="2756652381241102009">تشغيل عمليات التشخيص</translation> <translation id="2783010256799387990">تم الاجتياز</translation> <translation id="2789486458103222910">حسنًا</translation> <translation id="2805756323405976993">التطبيقات</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">جارٍ الاتصال...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">جارٍ إعادة تشغيل <ph name="DEVICE_NAME" />.</translation> +<translation id="4415951057168511744">الصورة الرمزية الحالية</translation> <translation id="4425149324548788773">ملفاتي</translation> <translation id="4428374560396076622">شبكة<ph name="NETWORK_NAME" /> متوقّفة</translation> <translation id="4429881212383817840">ستنتهي صلاحية تذكرة Kerberos قريبًا</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">وصول أحد الوالدين</translation> <translation id="473775607612524610">تحديث</translation> <translation id="4744944742468440486">معلومات ذات صلة باختيارك</translation> +<translation id="4751272708893364980">الاطّلاع على سجلّات RMA</translation> <translation id="4773299976671772492">متوقفة</translation> <translation id="4774530504324923332">يجب أن يكون لديك مفتاح أمان يستخدم الإجراء RSU و"ماسح ضوئي لرمز الاستجابة السريعة" وجهاز آخر متصل بالإنترنت.</translation> <translation id="4782311465517282004">يمكنك الحصول على تعريفات أو ترجمات للنصوص أو تحويل الوحدات من خلال النقر بزر الماوس الأيمن على النص أو النقر عليه مع الاستمرار.</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">شبكة Wi-Fi غير آمنة.</translation> <translation id="5376354385557966694">الوضع الفاتح التلقائي</translation> <translation id="537872351913703572">سيتم نقل الجهاز إلى مستخدم آخر أو إلى مؤسسة أخرى.</translation> +<translation id="5389224261615877010">قوس قزح</translation> <translation id="5395600419410242651">محو جميع البيانات</translation> <translation id="5400907029458559844">جارٍ توصيل الجهاز</translation> <translation id="5401938042319910061">تشغيل جميع سلاسل الإجراءات</translation> +<translation id="5406131354638931058">يمكنك فصل التيار عن بطاريات الأجهزة التي يتم شحنها أو تخزينها.</translation> <translation id="5423849171846380976">نشطة</translation> <translation id="5430931332414098647">التوصيل الفوري</translation> <translation id="5431318178759467895">بالألوان</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">لم يتم العثور على الملف.</translation> <translation id="5939518447894949180">إعادة الضبط</translation> <translation id="594552776027197022">إنشاء مفتاحَي تشفير عشوائيين</translation> +<translation id="5951259522948394825">عليك التأكد من أنّ جميع العناصر في مكانها المناسب والاطّلاع على تقرير التشخيص.</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">خلفية تلقائية</translation> <translation id="6017514345406065928">أخضر</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">اختيار <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">سجلّات RMA</translation> <translation id="8206859287963243715">خلوي</translation> <translation id="8208861521865154048">المزايا</translation> <translation id="8217675307824400706">الاتصال بالإنترنت</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">الوضع المُعتِم التلقائي</translation> <translation id="8461329675984532579">اسم مقدم الخدمة الرئيسي</translation> <translation id="8467104829907989997">جارٍ معايرة المكوِّنات...</translation> +<translation id="8474030592808010086">يُرجى فصل الجهاز عن مصدر الطاقة لفصل التيار عن البطارية.</translation> <translation id="8475690821716466388">شبكة Wi-Fi مؤمَّنة باستخدام بروتوكول WEP PSK ضعيف.</translation> <translation id="8477551185774834963">وقت استجابة "نظام أسماء النطاقات" أعلى بقليل من الحدّ الأقصى المسموح به.</translation> <translation id="8483248364096924578">عنوان IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">قوة الإشارة</translation> <translation id="8910721771319628100">وقت استجابة الشبكة التلقائية أعلى من الحدّ الأقصى.</translation> <translation id="8918637186205009138">جهاز <ph name="DEVICE_TYPE" /> الخاص بـ <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">إليك المشاكل التي تم حلّها.</translation> <translation id="8919837981463578619">تعذَّرت الطباعة - دُرج الورق غير متوفّر</translation> <translation id="8923267550422472772">إعادة الضبط في يوم محدَّد من الشهر</translation> <translation id="8928727111548978589">تعذَّرت الطباعة - نفد الورق</translation>
diff --git a/chromeos/strings/chromeos_strings_be.xtb b/chromeos/strings/chromeos_strings_be.xtb index acefd98..15741e9 100644 --- a/chromeos/strings/chromeos_strings_be.xtb +++ b/chromeos/strings/chromeos_strings_be.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Хатняя сетка, не ў роўмінгу</translation> <translation id="1327977588028644528">Шлюз</translation> +<translation id="1328223165223065150">Колер шпалер</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Дапасаваць да вобласці сканіравання</translation> <translation id="1367951781824006909">Выбраць файл</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Крыніца відарыса</translation> <translation id="1451536289672181509">Гэта клавіятура.</translation> <translation id="1459693405370120464">Надвор'е</translation> +<translation id="1459784442280469416">Захаваць на USB-дыску</translation> <translation id="1468664791493211953">Прапановы</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> кіруе гэтай прыладай і можа адсочваць вашы дзеянні.</translation> <translation id="1478594628797167447">Сканер</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> можа кіраваць наладамі гэтага карыстальніка і адсочваць яго дзеянні.</translation> <translation id="150962533380566081">Няправільны PUK-код.</translation> <translation id="1510238584712386396">Панэль запуску</translation> +<translation id="1512982610995527443">Прылада завершыць працу праз 5 секунд</translation> +<translation id="1522984060396982789">Рамонт выкананы. Можна завяршыць працу прылады або выканаць іншыя дзеянні.</translation> <translation id="152892567002884378">Павялічыць гучнасць</translation> <translation id="1555130319947370107">Сіні</translation> <translation id="155865706765934889">Сэнсарная панэль</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Версія апаратнага забеспячэння</translation> <translation id="1905710495812624430">Перавышана максімальная колькасць спроб.</translation> <translation id="1908234395526491708">Збоі запытаў UDP</translation> +<translation id="1932611479324127242">Выключыць акумулятар</translation> <translation id="1947737735496445907">Надрукавана</translation> <translation id="1951012854035635156">Памочнік</translation> <translation id="1977994649430373166">Відарыс профілю Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Плывучы міма</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> фота</translation> +<translation id="2154739667870063220">Перазагрузіць</translation> <translation id="2157959690810728433">У ЧАРЗЕ</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Паўтарыць спробу</translation> <translation id="2161394479394250669">Скасаваць заданне друку</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Пераключэнне раскладкі</translation> <translation id="225692081236532131">Стан актывацыі</translation> <translation id="2271469253353559191">Расклад уключэння цёмнага рэжыму</translation> +<translation id="2275586345903859204">Рамонт завершаны</translation> <translation id="2287186687001756809">Відарыс недаступны. Дадаць фота можна з сайта <ph name="LINK" /></translation> <translation id="2307344026739914387">Выкарыстанне бягучай пары ключоў</translation> <translation id="2320295602967756579">Уключыць светлую тэму</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Уключыць рэжым цёмных колераў</translation> <translation id="2740531572673183784">OK</translation> <translation id="2751739896257479635">Фаза 2 аўтэнтыфікацыі EAP</translation> +<translation id="2756652381241102009">Запусціць дыягностыку</translation> <translation id="2783010256799387990">ПРОЙДЗЕНА</translation> <translation id="2789486458103222910">OK</translation> <translation id="2805756323405976993">Праграмы</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Падключэнне...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Ідзе перазапуск прылады "<ph name="DEVICE_NAME" />"</translation> +<translation id="4415951057168511744">Бягучы аватар</translation> <translation id="4425149324548788773">Мой Дыск</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" />: выключана</translation> <translation id="4429881212383817840">Дзеянне білета Kerberos хутка скончыцца</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Бацькоўскі доступ</translation> <translation id="473775607612524610">Абнавіць</translation> <translation id="4744944742468440486">Інфармацыя, звязаная з вылучаным вамі фрагментам</translation> +<translation id="4751272708893364980">Паказаць журналы RMA</translation> <translation id="4773299976671772492">Спынена</translation> <translation id="4774530504324923332">Вам патрэбны будзе ключ бяспекі з падтрымкай RSU, сканер QR-кодаў і другая прылада, падключаная да інтэрнэту</translation> <translation id="4782311465517282004">Атрымлівайце азначэнні, пераклады або пераводзьце адзінкі вымярэння: для гэтага вам трэба дакрануцца да тэксту і ўтрымліваць палец або націснуць на тэкст правай кнопкай мышы.</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Сетка Wi-Fi не абаронена</translation> <translation id="5376354385557966694">Аўтаматычнае ўключэнне светлага рэжыму</translation> <translation id="537872351913703572">Прылада будзе перададзена іншаму карыстальніку або арганізацыі</translation> +<translation id="5389224261615877010">Вясёлка</translation> <translation id="5395600419410242651">Сцерці ўсе даныя</translation> <translation id="5400907029458559844">Прылада падключаецца.</translation> <translation id="5401938042319910061">Запусціць усе паслядоўнасці дзеянняў</translation> +<translation id="5406131354638931058">Выключайце акумулятар, калі прылады трэба транспартаваць або адправіць на захоўванне</translation> <translation id="5423849171846380976">Уключана</translation> <translation id="5430931332414098647">Імгненны рэжым мадэма</translation> <translation id="5431318178759467895">Колер</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Файл не знойдзены</translation> <translation id="5939518447894949180">Скінуць</translation> <translation id="594552776027197022">Стварэнне выпадковай пары ключоў</translation> +<translation id="5951259522948394825">Праверце, ці ўсё на сваім месцы, і праглядзіце справаздачу па дыягностыцы</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Стандартныя шпалеры</translation> <translation id="6017514345406065928">Зялёны</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Выбраць <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Журналы RMA</translation> <translation id="8206859287963243715">Мабільная сетка</translation> <translation id="8208861521865154048">Бонусы</translation> <translation id="8217675307824400706">Устанавіце падключэнне</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Аўтаматычнае ўключэнне цёмнага рэжыму</translation> <translation id="8461329675984532579">Назва аператара</translation> <translation id="8467104829907989997">Ідзе калібраванне кампанентаў…</translation> +<translation id="8474030592808010086">Каб выключыць акумулятар, адключыце прыладу ад сеткі</translation> <translation id="8475690821716466388">Сетка Wi-Fi абаронена слабым пратаколам WEP PSK</translation> <translation id="8477551185774834963">Затрымка DNS крыху перавышае дапушчальнае парогавае значэнне</translation> <translation id="8483248364096924578">IP-адрас</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Сіла сігналу</translation> <translation id="8910721771319628100">Затрымка ў стандартнай сетцы перавышае парогавае значэнне</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />: <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">Паказаць, што было выпраўлена</translation> <translation id="8919837981463578619">Збой: няма латка</translation> <translation id="8923267550422472772">Дзень месяца для скіду</translation> <translation id="8928727111548978589">Збой: скончылася папера</translation>
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb index e82c26e..ac7a695 100644 --- a/chromeos/strings/chromeos_strings_bg.xtb +++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">VPN за Android</translation> <translation id="131461803491198646">Собствената мрежа, не роуминг</translation> <translation id="1327977588028644528">Шлюз</translation> +<translation id="1328223165223065150">Цвят на тапета</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Уеднаквяване с областта за сканиране</translation> <translation id="1367951781824006909">Избор на файл</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Източник на изображението</translation> <translation id="1451536289672181509">Устройството е клавиатура.</translation> <translation id="1459693405370120464">Времето</translation> +<translation id="1459784442280469416">Запазване в USB памет</translation> <translation id="1468664791493211953">Оферти</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> управлява това устройство и може да е в състояние да наблюдава активността ви.</translation> <translation id="1478594628797167447">Скенер</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> управлява този потребител и може отдалечено да контролира настройките и да наблюдава потребителската активност.</translation> <translation id="150962533380566081">Невалиден PUK код.</translation> <translation id="1510238584712386396">Стартов панел</translation> +<translation id="1512982610995527443">Устройството ще се изключи след 5 секунди</translation> +<translation id="1522984060396982789">Ремонтът бе успешен. Можете да изключите устройството или да предприемете допълнителни действия.</translation> <translation id="152892567002884378">Увеличаване на силата на звука</translation> <translation id="1555130319947370107">синьо</translation> <translation id="155865706765934889">Сензорен панел</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Версия на хардуера</translation> <translation id="1905710495812624430">Максималният брой опити е надвишен.</translation> <translation id="1908234395526491708">Неуспешни заявки през UDP</translation> +<translation id="1932611479324127242">Прекъсване на захранването от батерията</translation> <translation id="1947737735496445907">Отпечатано</translation> <translation id="1951012854035635156">Асистент</translation> <translation id="1977994649430373166">Снимка на потребителския профил в Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">По течението</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> снимки</translation> +<translation id="2154739667870063220">Рестартиране</translation> <translation id="2157959690810728433">В ОПАШКАТА</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Нов опит</translation> <translation id="2161394479394250669">Анулиране на заданието за отпечатване</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Превключване на подредбата</translation> <translation id="225692081236532131">Състояние на активирането</translation> <translation id="2271469253353559191">График за тъмния режим</translation> +<translation id="2275586345903859204">Ремонтът приключи</translation> <translation id="2287186687001756809">Няма налично изображение. За да добавите снимки, отворете <ph name="LINK" /></translation> <translation id="2307344026739914387">Използване на текущата двойка ключове</translation> <translation id="2320295602967756579">Активиране на светлата тема</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Активиране на режима за тъмни цветове</translation> <translation id="2740531572673183784">OK</translation> <translation id="2751739896257479635">Удостоверяване във фаза 2 през EAP</translation> +<translation id="2756652381241102009">Стартиране на диагностиката</translation> <translation id="2783010256799387990">УСПЕШНО</translation> <translation id="2789486458103222910">OK</translation> <translation id="2805756323405976993">Приложения</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Свързване...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> се рестартира</translation> +<translation id="4415951057168511744">Текущ аватар</translation> <translation id="4425149324548788773">Моят диск</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> е изключена</translation> <translation id="4429881212383817840">Пропускът за Kerberos изтича скоро</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Достъп на родител</translation> <translation id="473775607612524610">Актуализиране</translation> <translation id="4744944742468440486">Информация за избраното от вас</translation> +<translation id="4751272708893364980">Преглед на регистрационните файлове от RMA</translation> <translation id="4773299976671772492">Спряно</translation> <translation id="4774530504324923332">Ще ви трябва ключ за сигурност с активирано отключване на сървъра за RMA, скенер за QR кодове и второ устройство с връзка с интернет.</translation> <translation id="4782311465517282004">Получавайте определения, преводи или преобразувани мерни единици, когато докоснете и задържите текст или кликнете върху него с десния бутон</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Wi-Fi мрежата не е сигурна</translation> <translation id="5376354385557966694">Автоматичен светъл режим</translation> <translation id="537872351913703572">Устройството преминава в друг потребител или организация</translation> +<translation id="5389224261615877010">Дъга</translation> <translation id="5395600419410242651">Изтриване на всички данни</translation> <translation id="5400907029458559844">Устройството установява връзка.</translation> <translation id="5401938042319910061">Стартиране на всички процедури</translation> +<translation id="5406131354638931058">Прекъсването на захранването от батерията е полезно за устройства, които ще се изпращат или съхраняват</translation> <translation id="5423849171846380976">Активиран</translation> <translation id="5430931332414098647">Незабавен тетъринг</translation> <translation id="5431318178759467895">Цветно</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Файлът не бе намерен</translation> <translation id="5939518447894949180">Нулиране</translation> <translation id="594552776027197022">Генериране на произволна двойка ключове</translation> +<translation id="5951259522948394825">Потвърдете, че всичко е на правилното място, и прегледайте диагностичния отчет</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Тапет по подразбиране</translation> <translation id="6017514345406065928">зелено</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Избиране на <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Регистрационни файлове от RMA</translation> <translation id="8206859287963243715">Клетъчно</translation> <translation id="8208861521865154048">Предимства</translation> <translation id="8217675307824400706">Установяване на връзка</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Автоматичен тъмен режим</translation> <translation id="8461329675984532579">Име на собствения доставчик</translation> <translation id="8467104829907989997">Компонентите се калибрират…</translation> +<translation id="8474030592808010086">Изключете устройството от електрическата мрежа, за да прекъснете захранването от батерията</translation> <translation id="8475690821716466388">Wi-Fi мрежата е защитена със слабия протокол WEP PSK</translation> <translation id="8477551185774834963">Забавянето на DNS е малко над допустимия праг</translation> <translation id="8483248364096924578">IP адрес</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Сила на сигнала</translation> <translation id="8910721771319628100">Забавянето на основната мрежа е над прага</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> на <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Вижте какво е ремонтирано</translation> <translation id="8919837981463578619">Неуспешно – липсваща тава</translation> <translation id="8923267550422472772">Ден от месеца за нулиране</translation> <translation id="8928727111548978589">Неуспешно – няма хартия</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb index c60e6f2..527d325 100644 --- a/chromeos/strings/chromeos_strings_bn.xtb +++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">হোম নেটওয়ার্ক, রোমিং নয়</translation> <translation id="1327977588028644528">গেটওয়ে</translation> +<translation id="1328223165223065150">ওয়ালপেপারের রঙ</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">স্ক্যান করতে ক্ষেত্রটি ফিট করান</translation> <translation id="1367951781824006909">একটি ফাইল বেছে নিন</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">ছবির সোর্স</translation> <translation id="1451536289672181509">ডিভাইস একটি কীবোর্ড।</translation> <translation id="1459693405370120464">আবহাওয়া</translation> +<translation id="1459784442280469416">ইউএসবিতে সেভ করুন</translation> <translation id="1468664791493211953">অফার</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> এই ডিভাইস ম্যানেজ করে এবং তার ফলে হয়ত সে আপনার অ্যাক্টিভিটি মনিটর করতে পারে।</translation> <translation id="1478594628797167447">স্ক্যানার</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> এই ব্যবহারকারীকে ম্যানেজ করে এবং তার ফলে এটি হয়ত অন্য জায়গা থেকে সেটিংস ম্যানেজ করতে এবং ব্যবহারকারীর অ্যাক্টিভিটির উপর নজর রাখতে পারে।</translation> <translation id="150962533380566081">ভুল PUK।</translation> <translation id="1510238584712386396">লঞ্চার</translation> +<translation id="1512982610995527443">ডিভাইসটি ৫ সেকেন্ডের মধ্যে বন্ধ হয়ে যাবে</translation> +<translation id="1522984060396982789">রিপেয়ার করা হয়ে গেছে। আপনি ডিভাইসটি বন্ধ করতে পারেন বা কিছু অতিরিক্ত পদক্ষেপ নিতে পারেন।</translation> <translation id="152892567002884378">ভলিউম বাড়ান</translation> <translation id="1555130319947370107">নীল</translation> <translation id="155865706765934889">টাচপ্যাড</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">হার্ডওয়্যার পুনর্বিবেচনাগুলি</translation> <translation id="1905710495812624430">সর্বোচ্চ অনুমোদিত প্রচেষ্টা ছাড়িয়ে গেছে।</translation> <translation id="1908234395526491708">UDP-এর অনুরোধ করা যায়নি</translation> +<translation id="1932611479324127242">ব্যাটারি কাটঅফ</translation> <translation id="1947737735496445907">প্রিন্ট করা হয়েছে</translation> <translation id="1951012854035635156">Assistant</translation> <translation id="1977994649430373166">Google প্রোফাইল ফটো</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">ব্রাউজ করা চালিয়ে যান</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" />টি ফটো</translation> +<translation id="2154739667870063220">রিবুট করুন</translation> <translation id="2157959690810728433">সারিতে আছে</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: আবার চেষ্টা করুন</translation> <translation id="2161394479394250669">প্রিন্ট জবটি বাতিল করা হয়েছে</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">লেআউট সুইচ করার বোতাম</translation> <translation id="225692081236532131">সক্রিয়করণ স্থিতি</translation> <translation id="2271469253353559191">'ডার্ক মোড'-এর শিডিউল</translation> +<translation id="2275586345903859204">রিপেয়ার হয়ে গেছে</translation> <translation id="2287186687001756809">কোনও ছবি নেই। ছবি যোগ করতে, <ph name="LINK" /> লিঙ্কে যান</translation> <translation id="2307344026739914387">বর্তমান কী পেয়ার ব্যবহার করুন</translation> <translation id="2320295602967756579">হালকা থিম চালু করুন</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">'ডার্ক কালার' মোড চালু করুন</translation> <translation id="2740531572673183784">ঠিক আছে</translation> <translation id="2751739896257479635">EAP ফেজ ২ যাচাইকরণ</translation> +<translation id="2756652381241102009">ডায়গনিস্টিক চালান</translation> <translation id="2783010256799387990">পাস করেছে</translation> <translation id="2789486458103222910">ঠিক আছে</translation> <translation id="2805756323405976993">অ্যাপ্স</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">সংযুক্ত হচ্ছে...</translation> <translation id="4382484599443659549">পিডিএফ</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> রিস্টার্ট করা হচ্ছে</translation> +<translation id="4415951057168511744">বর্তমান অবতার</translation> <translation id="4425149324548788773">আমার ড্রাইভ</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> বন্ধ আছে</translation> <translation id="4429881212383817840">Kerberos টিকিটের মেয়াদ শীঘ্রই শেষ হয়ে যাবে</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">অভিভাবকীয় অ্যাক্সেস</translation> <translation id="473775607612524610">আপডেট করুন</translation> <translation id="4744944742468440486">আপনার বেছে নেওয়া কন্টেন্টের ব্যাপারে তথ্য</translation> +<translation id="4751272708893364980">RMA লগ দেখুন</translation> <translation id="4773299976671772492">থামানো হয়েছে</translation> <translation id="4774530504324923332">আপনার একটি RSU-চালু করা নিরাপত্তা কী, একটি QR কোড স্ক্যানার এবং ইন্টারনেট কানেকশন সহ একটি দ্বিতীয় ডিভাইসের প্রয়োজন হবে</translation> <translation id="4782311465517282004">আপনি ডানদিকের বোতামে ক্লিক করলে বা টেক্সট প্রেস করে ধরে থাকলে, সংজ্ঞা, অনুবাদ বা ইউনিট কনভার্সন পাবেন</translation> @@ -450,9 +460,11 @@ <translation id="5372659122375744710">ওয়াই-ফাই নেটওয়ার্ক সুরক্ষিত নয়</translation> <translation id="5376354385557966694">অটোমেটিক 'লাইট মোড'</translation> <translation id="537872351913703572">ডিভাইসটি অন্য ব্যবহারকারী বা প্রতিষ্ঠানের কাছে থাকবে</translation> +<translation id="5389224261615877010">রামধনু</translation> <translation id="5395600419410242651">সব ডেটা মুছুন</translation> <translation id="5400907029458559844">ডিভাইস কানেক্ট করা হচ্ছে।</translation> <translation id="5401938042319910061">সমস্ত রুটিন চালান</translation> +<translation id="5406131354638931058">ডিভাইস পাঠানো বা স্টোর করার জন্য ব্যাটারি কাটঅফ পারফর্ম করুন</translation> <translation id="5423849171846380976">সক্রিয় হয়েছে</translation> <translation id="5430931332414098647">ঝটপট টিথারিং</translation> <translation id="5431318178759467895">রঙ</translation> @@ -505,6 +517,7 @@ <translation id="5931523347251946569">ফাইল পাওয়া যায়নি</translation> <translation id="5939518447894949180">রিসেট করুন</translation> <translation id="594552776027197022">র্যান্ডম কী পেয়ার জেনারেট করুন</translation> +<translation id="5951259522948394825">সবকিছু সঠিক জায়গায় আছে তা নিশ্চিত করুন এবং ডায়াগনস্টিক রিপোর্ট দেখুন</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">ডিফল্ট ওয়ালপেপার</translation> <translation id="6017514345406065928">সবুজ</translation> @@ -725,6 +738,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> বেছে নিন</translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA লগ</translation> <translation id="8206859287963243715">সেলুলার</translation> <translation id="8208861521865154048">বিশেষ সুবিধা</translation> <translation id="8217675307824400706">কানেক্ট হন</translation> @@ -758,6 +772,7 @@ <translation id="8456761643544401578">অটোমেটিক 'ডার্ক মোড'</translation> <translation id="8461329675984532579">হোম পরিষেবা প্রদানকারীর নাম</translation> <translation id="8467104829907989997">কম্পোনেন্ট ক্যালিব্রেট করা...</translation> +<translation id="8474030592808010086">ব্যাটারি কাটঅফ করতে ডিভাইসটি আনপ্লাগ করুন</translation> <translation id="8475690821716466388">দুর্বল WEP PSK প্রোটোকল ব্যবহার করে ওয়াই-ফাই নেটওয়ার্ক সুরক্ষিত করা হয়েছে</translation> <translation id="8477551185774834963">যতদূর পর্যন্ত লেটেন্সির ঊর্ধ্বসীমা অনুমোদন করা যায়, ডিএনএস লেটেন্সি তার চেয়ে বেশি</translation> <translation id="8483248364096924578">আইপি অ্যাড্রেস</translation> @@ -803,6 +818,7 @@ <translation id="8898840733695078011">সংকেতের ক্ষমতা</translation> <translation id="8910721771319628100">নেটওয়ার্ক লেটেন্সির যে ঊর্ধসীমা রয়েছে, তার চেয়ে ডিফল্ট নেটওয়ার্ক গেটওয়ের লেটেন্সি বেশি</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />-এর <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">কী সংশোধন করা হয়েছে দেখুন</translation> <translation id="8919837981463578619">প্রিন্ট করা যায়নি - ট্রে পাওয়া যাচ্ছে না</translation> <translation id="8923267550422472772">রিসেট করার জন্য মাসের দিন</translation> <translation id="8928727111548978589">প্রিন্ট করা যায়নি - কাগজ শেষ হয়ে গেছে</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb index ac11159..78a51d9 100644 --- a/chromeos/strings/chromeos_strings_bs.xtb +++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Matična mreža, bez roaminga</translation> <translation id="1327977588028644528">Pristupnik</translation> +<translation id="1328223165223065150">Boja pozadinske slike</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Prilagodi području za skeniranje</translation> <translation id="1367951781824006909">Odaberite fajl</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Izvor slike</translation> <translation id="1451536289672181509">Uređaj je tastatura.</translation> <translation id="1459693405370120464">Vrijeme</translation> +<translation id="1459784442280469416">Sačuvaj na USB</translation> <translation id="1468664791493211953">Ponude</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> upravlja ovim uređajem i moguće je da može pratiti vaše aktivnosti.</translation> <translation id="1478594628797167447">Skener</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> upravlja ovim korisnikom i može udaljeno upravljati postavkama i pratiti aktivnost korisnika.</translation> <translation id="150962533380566081">Nevažeći PUK.</translation> <translation id="1510238584712386396">Pokretač</translation> +<translation id="1512982610995527443">Uređaj će se isključiti za 5 s</translation> +<translation id="1522984060396982789">Popravak je bio uspješan. Možete isključiti uređaj ili izvršiti dodatne radnje.</translation> <translation id="152892567002884378">Pojačavanje zvuka</translation> <translation id="1555130319947370107">Plava</translation> <translation id="155865706765934889">Dodirna podloga</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Revizija hardvera</translation> <translation id="1905710495812624430">Prekoračen je maksimalan broj dozvoljenih pokušaja.</translation> <translation id="1908234395526491708">Greške UDP zahtjeva</translation> +<translation id="1932611479324127242">Isključivanje baterije</translation> <translation id="1947737735496445907">Odštampano</translation> <translation id="1951012854035635156">Asistent</translation> <translation id="1977994649430373166">Fotografija Google profila</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Lebdite</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059">Broj fotografija: <ph name="NUMBER" /></translation> +<translation id="2154739667870063220">Ponovo pokreni</translation> <translation id="2157959690810728433">NA ČEKANJU</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Pokušaj ponovo</translation> <translation id="2161394479394250669">Otkaži zadatak štampanja</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Prekidač za raspored</translation> <translation id="225692081236532131">Status aktivacije</translation> <translation id="2271469253353559191">Raspored tamnog načina rada</translation> +<translation id="2275586345903859204">Popravak je završen</translation> <translation id="2287186687001756809">Nema dostupne slike. Da dodate fotografije, idite na <ph name="LINK" /></translation> <translation id="2307344026739914387">Koristi trenutni par ključeva</translation> <translation id="2320295602967756579">Omogući svijetlu temu</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Omogućavanje načina rada u tamnoj boji</translation> <translation id="2740531572673183784">Uredu</translation> <translation id="2751739896257479635">EAP faza 2 autentifikacije</translation> +<translation id="2756652381241102009">Pokreni dijagnostiku</translation> <translation id="2783010256799387990">USPJEŠNO</translation> <translation id="2789486458103222910">Uredu</translation> <translation id="2805756323405976993">Aplikacije</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Povezivanje…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Ponovno pokretanje uređaja <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Trenutni avatar</translation> <translation id="4425149324548788773">Moj disk</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> mreža je isključena</translation> <translation id="4429881212383817840">Kerberos tiket uskoro ističe</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Pristup roditelja</translation> <translation id="473775607612524610">Ažuriraj</translation> <translation id="4744944742468440486">Informacije u vezi s vašim odabirom</translation> +<translation id="4751272708893364980">Prikaži RMA zapisnike</translation> <translation id="4773299976671772492">Zaustavljeno</translation> <translation id="4774530504324923332">Trebat će vam sigurnosni ključ koji je omogućio RSU, skener QR kôda i drugi uređaj s internetskom vezom</translation> <translation id="4782311465517282004">Dobijte definicije, prijevode ili pretvaranje jedinica kada kliknete desnim klikom na tekst ili ga dodirnete i zadržite</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">WiFi mreža nije sigurna</translation> <translation id="5376354385557966694">Automatski svijetli način rada</translation> <translation id="537872351913703572">Uređaj će preći na različitog korisnika ili organizaciju</translation> +<translation id="5389224261615877010">Duga</translation> <translation id="5395600419410242651">Potpuno izbriši sve podatke</translation> <translation id="5400907029458559844">Uređaj se povezuje.</translation> <translation id="5401938042319910061">Pokreni sve rutine</translation> +<translation id="5406131354638931058">Isključite bateriju na uređajima koji se otpremaju ili skladište</translation> <translation id="5423849171846380976">Aktivirano</translation> <translation id="5430931332414098647">Trenutno dijeljenje internetske veze</translation> <translation id="5431318178759467895">Boja</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Fajl nije pronađen</translation> <translation id="5939518447894949180">Ponovno postavi</translation> <translation id="594552776027197022">Generiraj nasumično odabrani par ključeva</translation> +<translation id="5951259522948394825">Potvrdite je li sve na svom mjestu i pregledajte dijagnostički izvještaj</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Zadana pozadinska slika</translation> <translation id="6017514345406065928">Zelena</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Odaberite <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA zapisnici</translation> <translation id="8206859287963243715">Mobitel</translation> <translation id="8208861521865154048">Privilegije</translation> <translation id="8217675307824400706">Povežite se</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Automatski tamni način rada</translation> <translation id="8461329675984532579">Naziv mobilnog operatera</translation> <translation id="8467104829907989997">Kalibriranje komponenti...</translation> +<translation id="8474030592808010086">Iskopčajte uređaj da isključite bateriju</translation> <translation id="8475690821716466388">WiFi mreža je zaštićena slabim protokolom WEP PSK</translation> <translation id="8477551185774834963">Latentnost DNS-a je malo iznad dozvoljenog praga</translation> <translation id="8483248364096924578">IP adresa</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Jačina signala</translation> <translation id="8910721771319628100">Zadana mreža je iznad praga latentnosti</translation> <translation id="8918637186205009138">Uređaj <ph name="DEVICE_TYPE" /> koji koristi <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Pogledajte šta je ispravljeno</translation> <translation id="8919837981463578619">Nije uspjelo – nedostaje ladica</translation> <translation id="8923267550422472772">Dan u mjesecu za poništavanje</translation> <translation id="8928727111548978589">Nije uspjelo – nema papira</translation>
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb index 774ff2d..d625c50 100644 --- a/chromeos/strings/chromeos_strings_cs.xtb +++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Domácí síť, bez roamingu</translation> <translation id="1327977588028644528">Brána</translation> +<translation id="1328223165223065150">Barva tapety</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Přizpůsobit skenované oblasti</translation> <translation id="1367951781824006909">Vybrat soubor</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Zdroj obrázku</translation> <translation id="1451536289672181509">Zařízení je klávesnice.</translation> <translation id="1459693405370120464">Počasí</translation> +<translation id="1459784442280469416">Uložit na USB</translation> <translation id="1468664791493211953">Nabídky</translation> <translation id="1476467821656042872">Toto zařízení je spravováno doménou <ph name="MANAGER" />, která také může sledovat vaši aktivitu.</translation> <translation id="1478594628797167447">Skener</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732">Tohoto uživatele spravuje doména <ph name="MANAGER" />, která také může vzdáleně spravovat nastavení a sledovat jeho aktivitu.</translation> <translation id="150962533380566081">Neplatný kód PUK.</translation> <translation id="1510238584712386396">Spouštěč</translation> +<translation id="1512982610995527443">Zařízení se za 5 sekund vypne</translation> +<translation id="1522984060396982789">Oprava byla úspěšná. Zařízení můžete vypnout nebo provést nějaké další akce.</translation> <translation id="152892567002884378">Zvýšit hlasitost</translation> <translation id="1555130319947370107">Modrá</translation> <translation id="155865706765934889">Touchpad</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Revize hardwaru</translation> <translation id="1905710495812624430">Byl překročen maximální povolený počet pokusů.</translation> <translation id="1908234395526491708">Selhání požadavků UDP</translation> +<translation id="1932611479324127242">Úplné odpojení baterie</translation> <translation id="1947737735496445907">Vytištěno</translation> <translation id="1951012854035635156">Asistent</translation> <translation id="1977994649430373166">Profilová fotka Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Album</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" /> %</translation> <translation id="2152882202543497059">Počet fotek: <ph name="NUMBER" /></translation> +<translation id="2154739667870063220">Restartovat</translation> <translation id="2157959690810728433">VE FRONTĚ</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Zkusit znovu</translation> <translation id="2161394479394250669">Zrušit tiskovou úlohu</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Přepnout rozvržení</translation> <translation id="225692081236532131">Stav aktivace</translation> <translation id="2271469253353559191">Plán tmavého režimu</translation> +<translation id="2275586345903859204">Oprava je hotová</translation> <translation id="2287186687001756809">Žádné snímky. Fotky můžete přidat na adrese <ph name="LINK" />.</translation> <translation id="2307344026739914387">Použít aktuální dvojici klíčů</translation> <translation id="2320295602967756579">Aktivovat světlý motiv</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Zapnout režim tmavých barev</translation> <translation id="2740531572673183784">OK</translation> <translation id="2751739896257479635">Ověření EAP Phase 2</translation> +<translation id="2756652381241102009">Spustit diagnostiku</translation> <translation id="2783010256799387990">V POŘÁDKU</translation> <translation id="2789486458103222910">OK</translation> <translation id="2805756323405976993">Aplikace</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Připojování...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> se restartuje</translation> +<translation id="4415951057168511744">Aktuální avatar</translation> <translation id="4425149324548788773">Můj disk</translation> <translation id="4428374560396076622">Síť <ph name="NETWORK_NAME" /> je vypnutá</translation> <translation id="4429881212383817840">Platnost lístku Kerberos brzy vyprší</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Rodičovský přístup</translation> <translation id="473775607612524610">Aktualizovat</translation> <translation id="4744944742468440486">Informace související s vaším výběrem</translation> +<translation id="4751272708893364980">Zobrazit protokoly RMA</translation> <translation id="4773299976671772492">Zastaveno</translation> <translation id="4774530504324923332">Budete potřebovat bezpečnostní klíč s podporou RSU, skener QR kódů a druhé zařízení s připojením k internetu</translation> <translation id="4782311465517282004">Když podržíte text nebo na něj kliknete pravým tlačítkem, mohou se zobrazit definice, překlad nebo převod jednotek</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Síť Wi-Fi není zabezpečena</translation> <translation id="5376354385557966694">Automatický světlý režim</translation> <translation id="537872351913703572">Zařízení přejde pod jiného uživatele nebo organizaci</translation> +<translation id="5389224261615877010">Duha</translation> <translation id="5395600419410242651">Vymazat všechna data</translation> <translation id="5400907029458559844">Zařízení se připojuje.</translation> <translation id="5401938042319910061">Spustit všechny rutiny</translation> +<translation id="5406131354638931058">Úplné odpojení baterie proveďte u zařízení, která někam posíláte nebo která budou uskladněna</translation> <translation id="5423849171846380976">Aktivováno</translation> <translation id="5430931332414098647">Dynamický tethering</translation> <translation id="5431318178759467895">Barevně</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Soubor nebyl nalezen</translation> <translation id="5939518447894949180">Resetovat</translation> <translation id="594552776027197022">Vygenerovat náhodnou dvojici klíčů</translation> +<translation id="5951259522948394825">Ověřte si, zda je vše na správném místě, a prohlédněte si diagnostickou zprávu</translation> <translation id="5972388717451707488">Modul aktualizací</translation> <translation id="5984145644188835034">Výchozí tapeta</translation> <translation id="6017514345406065928">Zelená</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Vybrat možnost <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Protokoly RMA</translation> <translation id="8206859287963243715">Mobil</translation> <translation id="8208861521865154048">Výhody</translation> <translation id="8217675307824400706">Připojte se</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Automatický tmavý režim</translation> <translation id="8461329675984532579">Název domácího poskytovatele</translation> <translation id="8467104829907989997">Kalibrace komponent…</translation> +<translation id="8474030592808010086">Pokud chcete provést úplné odpojení baterie, odpojte zařízení</translation> <translation id="8475690821716466388">Síť Wi-Fi je zabezpečena slabým protokolem WEP PSK</translation> <translation id="8477551185774834963">DNS má latenci mírně nad prahovou hodnotou</translation> <translation id="8483248364096924578">IP adresa</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Síla signálu</translation> <translation id="8910721771319628100">Výchozí síť má latenci nad prahovou hodnotou</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />: <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">Podívejte se, co bylo opraveno</translation> <translation id="8919837981463578619">Tisk selhal – chybí zásobník</translation> <translation id="8923267550422472772">Den v měsíci pro resetování</translation> <translation id="8928727111548978589">Tisk selhal – došel papír</translation>
diff --git a/chromeos/strings/chromeos_strings_cy.xtb b/chromeos/strings/chromeos_strings_cy.xtb index ff026e0..b46d055 100644 --- a/chromeos/strings/chromeos_strings_cy.xtb +++ b/chromeos/strings/chromeos_strings_cy.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">VPN Android</translation> <translation id="131461803491198646">Rhwydwaith cartref, ddim yn trawsrwydweithio</translation> <translation id="1327977588028644528">Porth</translation> +<translation id="1328223165223065150">Lliw papur wal</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Ffitio i'r ardal sganio</translation> <translation id="1367951781824006909">Dewis ffeil</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Ffynhonnell y llun</translation> <translation id="1451536289672181509">Mae'r ddyfais yn fysellfwrdd.</translation> <translation id="1459693405370120464">Tywydd</translation> +<translation id="1459784442280469416">Cadw i USB</translation> <translation id="1468664791493211953">Cynigion</translation> <translation id="1476467821656042872">Mae <ph name="MANAGER" /> yn rheoli'r ddyfais hon ac mae'n bosib y bydd yn gallu monitro'ch gweithgarwch.</translation> <translation id="1478594628797167447">Sganiwr</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732">Mae <ph name="MANAGER" /> yn rheoli'r defnyddiwr hwn ac mae'n bosib y bydd yn rheoli gosodiadau o bell ac yn monitro gweithgarwch y defnyddiwr.</translation> <translation id="150962533380566081">PUK annilys.</translation> <translation id="1510238584712386396">Lansiwr</translation> +<translation id="1512982610995527443">Bydd y ddyfais yn cau mewn 5 eiliad</translation> +<translation id="1522984060396982789">Roedd eich atgyweiriad yn llwyddiannus. Gallwch ddiffodd y ddyfais neu gymryd rhai camau ychwanegol.</translation> <translation id="152892567002884378">Codi'r sain</translation> <translation id="1555130319947370107">Glas</translation> <translation id="155865706765934889">Pad cyffwrdd</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Adolygu caledwedd</translation> <translation id="1905710495812624430">Wedi mynd y tu hwnt i'r ymgeisiau uchaf a ganiateir.</translation> <translation id="1908234395526491708">Methiannau ceisiadau UDP</translation> +<translation id="1932611479324127242">Toriad batri</translation> <translation id="1947737735496445907">Argraffwyd</translation> <translation id="1951012854035635156">Assistant</translation> <translation id="1977994649430373166">Llun proffil Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Arnofio heibio</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> o luniau</translation> +<translation id="2154739667870063220">Ailgychwyn</translation> <translation id="2157959690810728433">MEWN CIW</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Rhoi cynnig arall arni</translation> <translation id="2161394479394250669">Canslo'r dasg argraffu</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Switsh cynllun</translation> <translation id="225692081236532131">Statws gweithredu</translation> <translation id="2271469253353559191">Amserlen Modd tywyll</translation> +<translation id="2275586345903859204">Wedi cwblhau atgyweirio</translation> <translation id="2287186687001756809">Nid oes unrhyw lun ar gael. I ychwanegu lluniau, ewch i <ph name="LINK" /></translation> <translation id="2307344026739914387">Defnyddio'r pâr o allweddi presennol</translation> <translation id="2320295602967756579">Galluogi'r themau olau</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Galluogi'r modd lliw tywyll</translation> <translation id="2740531572673183784">Iawn</translation> <translation id="2751739896257479635">Dilysiad Cam 2 EAP</translation> +<translation id="2756652381241102009">Rhedeg y Ddiagnosteg</translation> <translation id="2783010256799387990">PASIWYD</translation> <translation id="2789486458103222910">Iawn</translation> <translation id="2805756323405976993">Apiau</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Yn cysylltu...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Wrthi'n ailgychwyn <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Rhithffurf</translation> <translation id="4425149324548788773">My Drive</translation> <translation id="4428374560396076622">Mae <ph name="NETWORK_NAME" /> wedi'i ddiffodd</translation> <translation id="4429881212383817840">Mae tocyn Kerberos yn darfod yn fuan</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Mynediad rhieni</translation> <translation id="473775607612524610">Diweddaru</translation> <translation id="4744944742468440486">Gwybodaeth yn ymwneud â'ch dewis</translation> +<translation id="4751272708893364980">Gweler logiau RMA</translation> <translation id="4773299976671772492">Wedi stopio</translation> <translation id="4774530504324923332">Bydd angen allwedd ddiogelwch sydd â RSU wedi'i alluogi, sganiwr codau QR ac ail ddyfais gyda chysylltiad rhyngrwyd</translation> <translation id="4782311465517282004">Cael diffiniadau, cyfieithiadau, neu drosiadau uned pan fyddwch yn de-glicio neu'n cyffwrdd a dal testun</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Nid yw'r rhwydwaith Wi-Fi yn ddiogel</translation> <translation id="5376354385557966694">Modd golau awtomatig</translation> <translation id="537872351913703572">Bydd y ddyfais yn mynd i ddefnyddiwr neu sefydliad gwahanol</translation> +<translation id="5389224261615877010">Enfys</translation> <translation id="5395600419410242651">Dileu'r holl ddata</translation> <translation id="5400907029458559844">Mae'r ddyfais yn cysylltu.</translation> <translation id="5401938042319910061">Rhedeg Pob Arfer</translation> +<translation id="5406131354638931058">Perfformiwch doriad batri ar gyfer dyfeisiau sy'n cael eu cludo neu eu storio</translation> <translation id="5423849171846380976">Wedi gweithredu</translation> <translation id="5430931332414098647">Rhannu Cysylltiad Sydyn</translation> <translation id="5431318178759467895">Lliw</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Ni chanfuwyd y ffeil</translation> <translation id="5939518447894949180">Ailosod</translation> <translation id="594552776027197022">Cynhyrchu pâr o allweddi ar hap</translation> +<translation id="5951259522948394825">Cadarnhewch fod popeth yn y lle iawn a gweler yr adroddiad diagnosteg</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Papur Wal Diofyn</translation> <translation id="6017514345406065928">Gwyrdd</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Dewiswch <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Logiau RMA</translation> <translation id="8206859287963243715">Symudol</translation> <translation id="8208861521865154048">Manteision</translation> <translation id="8217675307824400706">Cysylltu</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Modd tywyll awtomatig</translation> <translation id="8461329675984532579">Enw'r darparwr hafan</translation> <translation id="8467104829907989997">Wrthi'n calibradu cydrannau...</translation> +<translation id="8474030592808010086">Datgysylltwch y ddyfais i gyflawni toriad batri</translation> <translation id="8475690821716466388">Diogelir y rhwydwaith Wi-Fi gyda'r protocol gwan WEP PSK</translation> <translation id="8477551185774834963">Mae cuddni DNS ychydig yn uwch na'r trothwy a ganiateir</translation> <translation id="8483248364096924578">Cyfeiriad IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Cryfder signal</translation> <translation id="8910721771319628100">Mae'r rhwydwaith diofyn yn uwch na'r trothwy cuddni</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Gweld beth sydd wedi'i drwsio</translation> <translation id="8919837981463578619">Wedi methu - Mae hambwrdd ar goll</translation> <translation id="8923267550422472772">Diwrnod y mis ar gyfer ailosod</translation> <translation id="8928727111548978589">Wedi methu - Allan o bapur</translation>
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb index e964a83a..8e72d879 100644 --- a/chromeos/strings/chromeos_strings_da.xtb +++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">VPN for Android</translation> <translation id="131461803491198646">Hjemmenetværk, uden roaming</translation> <translation id="1327977588028644528">Gateway</translation> +<translation id="1328223165223065150">Baggrundsfarve</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Tilpas til scanningsområdet</translation> <translation id="1367951781824006909">Vælg en fil</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Billedkilde</translation> <translation id="1451536289672181509">Enheden er et tastatur.</translation> <translation id="1459693405370120464">Vejr</translation> +<translation id="1459784442280469416">Gem på USB</translation> <translation id="1468664791493211953">Tilbud</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> administrerer din enhed og kan muligvis overvåge din aktivitet.</translation> <translation id="1478594628797167447">Scanner</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> administrerer denne bruger, og vedkommende kan administrere indstillinger og overvåge brugeraktivitet via fjernadgang.</translation> <translation id="150962533380566081">Ugyldig PUK-kode.</translation> <translation id="1510238584712386396">Appliste</translation> +<translation id="1512982610995527443">Enheden slukker om 5 sekunder</translation> +<translation id="1522984060396982789">Din reparation er gennemført. Du kan slukke enheden eller foretage yderligere handlinger.</translation> <translation id="152892567002884378">Lydstyrke op</translation> <translation id="1555130319947370107">Blå</translation> <translation id="155865706765934889">Touchplade</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Hardwarerevision</translation> <translation id="1905710495812624430">Det maksimale antal forsøg er overskredet.</translation> <translation id="1908234395526491708">Mislykkede UDP-anmodninger</translation> +<translation id="1932611479324127242">Deaktivering af batteri</translation> <translation id="1947737735496445907">Udskrevet</translation> <translation id="1951012854035635156">Assistent</translation> <translation id="1977994649430373166">Google-profilbillede</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Float on by</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" /> %</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> billeder</translation> +<translation id="2154739667870063220">Genstart</translation> <translation id="2157959690810728433">SAT I KØ</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Prøv igen</translation> <translation id="2161394479394250669">Annuller udskriftsjob</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Layoutskift</translation> <translation id="225692081236532131">Aktiveringsstatus</translation> <translation id="2271469253353559191">Tidsplan for mørk tilstand</translation> +<translation id="2275586345903859204">Reparationen er gennemført</translation> <translation id="2287186687001756809">Der er ingen tilgængelige billeder. Du kan tilføje billeder ved at gå til <ph name="LINK" /></translation> <translation id="2307344026739914387">Brug aktuelt nøglepar</translation> <translation id="2320295602967756579">Aktivér Lyst tema</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Aktivér tilstanden med mørke farver</translation> <translation id="2740531572673183784">OK</translation> <translation id="2751739896257479635">EAP fase 2-godkendelse</translation> +<translation id="2756652381241102009">Kør diagnosticering</translation> <translation id="2783010256799387990">GENNEMFØRT</translation> <translation id="2789486458103222910">OK</translation> <translation id="2805756323405976993">Apps</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Tilslutter...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Genstarter <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Aktuel avatar</translation> <translation id="4425149324548788773">Mit drev</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> er deaktiveret</translation> <translation id="4429881212383817840">Din Kerberos-billet er ved at udløbe</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Forældreadgang</translation> <translation id="473775607612524610">Opdater</translation> <translation id="4744944742468440486">Oplysninger relateret til det, du har markeret</translation> +<translation id="4751272708893364980">Se logs over godkendelse af varereturnering</translation> <translation id="4773299976671772492">Stoppet</translation> <translation id="4774530504324923332">Du skal bruge en RSU-kompatibel sikkerhedsnøgle, en QR-kodescanner og en anden enhed med en internetforbindelse</translation> <translation id="4782311465517282004">Få definitioner, oversættelser eller enhedsomregninger, når du højreklikker på eller holder tekst nede</translation> @@ -450,9 +460,11 @@ <translation id="5372659122375744710">Wi-Fi-netværket er ikke sikkert</translation> <translation id="5376354385557966694">Automatisk lys tilstand</translation> <translation id="537872351913703572">Enheden overdrages til en anden bruger eller organisation</translation> +<translation id="5389224261615877010">Regnbue</translation> <translation id="5395600419410242651">Ryd alle data</translation> <translation id="5400907029458559844">Enheden opretter forbindelse.</translation> <translation id="5401938042319910061">Kør alle rutiner</translation> +<translation id="5406131354638931058">Deaktiver batteriet for enheder, der afsendes eller opbevares</translation> <translation id="5423849171846380976">Aktiveret</translation> <translation id="5430931332414098647">Øjeblikkelig netdeling</translation> <translation id="5431318178759467895">Farve</translation> @@ -505,6 +517,7 @@ <translation id="5931523347251946569">Filen blev ikke fundet</translation> <translation id="5939518447894949180">Nulstil</translation> <translation id="594552776027197022">Generér vilkårligt nøglepar</translation> +<translation id="5951259522948394825">Bekræft, at alt sidder, som det skal, og se diagnosticeringsrapporten</translation> <translation id="5972388717451707488">Opdater maskine</translation> <translation id="5984145644188835034">Standardbaggrund</translation> <translation id="6017514345406065928">Grøn</translation> @@ -725,6 +738,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Vælg <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Logs over godkendelse af varereturnering</translation> <translation id="8206859287963243715">Mobil</translation> <translation id="8208861521865154048">Fordele</translation> <translation id="8217675307824400706">Få forbindelse</translation> @@ -758,6 +772,7 @@ <translation id="8456761643544401578">Automatisk mørk tilstand</translation> <translation id="8461329675984532579">Navn på udbyder til hjem</translation> <translation id="8467104829907989997">Kalibrerer komponenter...</translation> +<translation id="8474030592808010086">Tag strømkablet ud af din enhed for at deaktivere batteriet</translation> <translation id="8475690821716466388">Wi-Fi-netværket er beskyttet med den svage protokol WEP PSK</translation> <translation id="8477551185774834963">DNS-forsinkelsen er en smule højere end den tilladte grænse</translation> <translation id="8483248364096924578">IP-adresse</translation> @@ -803,6 +818,7 @@ <translation id="8898840733695078011">Signalstyrke</translation> <translation id="8910721771319628100">Standardnetværket overstiger grænsen for forsinkelse</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> tilhørende <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Se, hvilke problemer der er blevet løst</translation> <translation id="8919837981463578619">Handlingen mislykkedes – Bakke mangler</translation> <translation id="8923267550422472772">Dag i måneden, hvor der nulstilles</translation> <translation id="8928727111548978589">Handlingen mislykkedes – Papirbakken er tom</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb index 22111b5..77b17a0 100644 --- a/chromeos/strings/chromeos_strings_de.xtb +++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Heimnetzwerk, kein Roaming</translation> <translation id="1327977588028644528">Gateway</translation> +<translation id="1328223165223065150">Hintergrundfarbe</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">An Scanbereich anpassen</translation> <translation id="1367951781824006909">Datei auswählen</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Bildquelle</translation> <translation id="1451536289672181509">Das Gerät ist eine Tastatur.</translation> <translation id="1459693405370120464">Wetter</translation> +<translation id="1459784442280469416">Auf USB speichern</translation> <translation id="1468664791493211953">Angebote</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> verwaltet dieses Gerät und kann möglicherweise deine Aktivitäten überwachen.</translation> <translation id="1478594628797167447">Scanner</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> verwaltet diesen Nutzer und kann per Remotezugriff Einstellungen ändern und die Nutzeraktivität überwachen.</translation> <translation id="150962533380566081">Ungültiger PUK.</translation> <translation id="1510238584712386396">Launcher</translation> +<translation id="1512982610995527443">Gerät wird in 5 Sekunden heruntergefahren</translation> +<translation id="1522984060396982789">Deine Reparatur war erfolgreich. Du kannst das Gerät herunterfahren oder weitere Aktionen ausführen.</translation> <translation id="152892567002884378">Lauter</translation> <translation id="1555130319947370107">Blau</translation> <translation id="155865706765934889">Touchpad</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Hardware-Version</translation> <translation id="1905710495812624430">Die maximal zulässige Anzahl an Versuchen wurde überschritten.</translation> <translation id="1908234395526491708">Fehlgeschlagene UDP-Anfragen</translation> +<translation id="1932611479324127242">Akku abschalten</translation> <translation id="1947737735496445907">Gedruckt</translation> <translation id="1951012854035635156">Assistant</translation> <translation id="1977994649430373166">Google-Profilfoto</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Einfach treiben lassen</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" /> %</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> Fotos</translation> +<translation id="2154739667870063220">Neu starten</translation> <translation id="2157959690810728433">IN WARTESCHLANGE</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Wiederholen</translation> <translation id="2161394479394250669">Druckauftrag abbrechen</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Layout</translation> <translation id="225692081236532131">Aktivierungsstatus</translation> <translation id="2271469253353559191">Zeitplan für dunklen Modus</translation> +<translation id="2275586345903859204">Reparatur abgeschlossen</translation> <translation id="2287186687001756809">Kein Bild verfügbar. Du kannst Fotos unter <ph name="LINK" /> hinzufügen.</translation> <translation id="2307344026739914387">Aktuelles Schlüsselpaar verwenden</translation> <translation id="2320295602967756579">Helles Design aktivieren</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Dunklen Farbmodus aktivieren</translation> <translation id="2740531572673183784">Ok</translation> <translation id="2751739896257479635">EAP-Phase 2-Authentifizierung</translation> +<translation id="2756652381241102009">Diagnose ausführen</translation> <translation id="2783010256799387990">BESTANDEN</translation> <translation id="2789486458103222910">Ok</translation> <translation id="2805756323405976993">Apps</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Verbindung...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">„<ph name="DEVICE_NAME" />“ wird neu gestartet</translation> +<translation id="4415951057168511744">Aktueller Avatar</translation> <translation id="4425149324548788773">Meine Ablage</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> ist deaktiviert</translation> <translation id="4429881212383817840">Kerberos-Ticket läuft bald ab</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Elternzugang</translation> <translation id="473775607612524610">Aktualisieren</translation> <translation id="4744944742468440486">Informationen in Bezug auf deine Auswahl</translation> +<translation id="4751272708893364980">RMA-Protokolle ansehen</translation> <translation id="4773299976671772492">Angehalten</translation> <translation id="4774530504324923332">Du benötigst einen RSU-fähigen Sicherheitsschlüssel, einen QR-Code-Scanner und ein zweites Gerät mit einer Internetverbindung</translation> <translation id="4782311465517282004">Du kannst Definitionen oder Übersetzungen anzeigen oder Einheiten umrechnen lassen, indem du Text gedrückt hältst oder mit der rechten Maustaste darauf klickst</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">WLAN ist nicht sicher</translation> <translation id="5376354385557966694">Automatischer heller Modus</translation> <translation id="537872351913703572">Gerät wird an einen anderen Nutzer oder eine andere Organisation übergeben</translation> +<translation id="5389224261615877010">Regenbogen</translation> <translation id="5395600419410242651">Alle Daten löschen</translation> <translation id="5400907029458559844">Das Gerät wird verbunden.</translation> <translation id="5401938042319910061">Alle Abläufe ausführen</translation> +<translation id="5406131354638931058">Akku abschalten für Geräte, die versendet oder gelagert werden</translation> <translation id="5423849171846380976">Aktiviert</translation> <translation id="5430931332414098647">Instant Tethering</translation> <translation id="5431318178759467895">Farbe</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Datei nicht gefunden</translation> <translation id="5939518447894949180">Zurücksetzen</translation> <translation id="594552776027197022">Zufälliges Schlüsselpaar generieren</translation> +<translation id="5951259522948394825">Korrekte Platzierung aller Elemente bestätigen und Diagnosebericht anzeigen</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Standardhintergrund</translation> <translation id="6017514345406065928">Grün</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTE-Advanced</translation> <translation id="8143951647992294073">"<ph name="TOPIC_SOURCE" /> – <ph name="TOPIC_SOURCE_DESC" />" auswählen</translation> <translation id="8179976553408161302">Eingabetaste</translation> +<translation id="819552138404104974">RMA-Protokolle</translation> <translation id="8206859287963243715">Mobil</translation> <translation id="8208861521865154048">Vorteile</translation> <translation id="8217675307824400706">Verbindung herstellen</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Automatischer dunkler Modus</translation> <translation id="8461329675984532579">Name des Homepageanbieters</translation> <translation id="8467104829907989997">Komponenten werden kalibriert...</translation> +<translation id="8474030592808010086">Kabel des Geräts herausziehen, um den Akku abzuschalten</translation> <translation id="8475690821716466388">Das WLAN ist mit dem schwachen Protokoll WEP PSK gesichert</translation> <translation id="8477551185774834963">Die DNS-Latenz liegt etwas über dem zulässigen Grenzwert</translation> <translation id="8483248364096924578">IP-Adresse</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Signalstärke</translation> <translation id="8910721771319628100">Das Standardnetzwerk hat den Latenzgrenzwert überschritten</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> von <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Ansehen, was korrigiert wurde</translation> <translation id="8919837981463578619">Fehlgeschlagen – Fach fehlt</translation> <translation id="8923267550422472772">Tag des Monats zum Zurücksetzen</translation> <translation id="8928727111548978589">Fehlgeschlagen – Kein Papier</translation>
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb index 211127c..62056b9 100644 --- a/chromeos/strings/chromeos_strings_el.xtb +++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Εγχώριο δίκτυο, χωρίς περιαγωγή </translation> <translation id="1327977588028644528">Πύλη</translation> +<translation id="1328223165223065150">Χρώμα ταπετσαρίας</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Προσαρμογή στην περιοχή σάρωσης</translation> <translation id="1367951781824006909">Επιλογή αρχείου</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Προέλευση εικόνας</translation> <translation id="1451536289672181509">Η συσκευή είναι πληκτρολόγιο.</translation> <translation id="1459693405370120464">Καιρός</translation> +<translation id="1459784442280469416">Αποθήκευση σε USB</translation> <translation id="1468664791493211953">Προσφορές</translation> <translation id="1476467821656042872">Ο τομέας <ph name="MANAGER" /> διαχειρίζεται αυτήν τη συσκευή και μπορεί να έχει τη δυνατότητα να παρακολουθεί τη δραστηριότητά σας.</translation> <translation id="1478594628797167447">Σαρωτής</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732">Ο τομέας <ph name="MANAGER" /> διαχειρίζεται αυτόν τον χρήστη και ενδέχεται να διαχειρίζεται απομακρυσμένα τις ρυθμίσεις και να παρακολουθεί τη δραστηριότητα του χρήστη.</translation> <translation id="150962533380566081">Μη έγκυρος κωδικός PUK.</translation> <translation id="1510238584712386396">Λειτουργία εκκίνησης</translation> +<translation id="1512982610995527443">Η λειτουργία της συσκευής θα τερματιστεί σε 5 δευτερόλεπτα</translation> +<translation id="1522984060396982789">Η επισκευή ήταν επιτυχής. Μπορείτε να τερματίσετε τη λειτουργία της συσκευής ή να κάνετε κάποιες πρόσθετες ενέργειες.</translation> <translation id="152892567002884378">Αύξηση έντασης ήχου</translation> <translation id="1555130319947370107">Μπλε</translation> <translation id="155865706765934889">Επιφάνεια Αφής</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Έκδοση υλικού</translation> <translation id="1905710495812624430">Έγινε υπέρβαση του μέγιστου αριθμού επιτρεπόμενων προσπαθειών.</translation> <translation id="1908234395526491708">Σφάλματα αιτήματος UDP</translation> +<translation id="1932611479324127242">Αποκοπή τάσης μπαταρίας</translation> <translation id="1947737735496445907">Εκτυπώθηκε</translation> <translation id="1951012854035635156">Βοηθός</translation> <translation id="1977994649430373166">Φωτογραφία προφίλ Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Ακολουθήστε το ρεύμα</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> φωτογραφίες</translation> +<translation id="2154739667870063220">Επανεκκίνηση</translation> <translation id="2157959690810728433">ΣΤΗΝ ΟΥΡΑ</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Επανάληψη</translation> <translation id="2161394479394250669">Ακύρωση εργασίας εκτύπωσης</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Εναλλαγή διάταξης</translation> <translation id="225692081236532131">Κατάσταση ενεργοποίησης</translation> <translation id="2271469253353559191">Πρόγραμμα λειτουργίας χαμηλού φωτισμού</translation> +<translation id="2275586345903859204">Η επισκευή ολοκληρώθηκε</translation> <translation id="2287186687001756809">Δεν υπάρχει διαθέσιμη εικόνα. Για προσθήκη φωτογραφιών, μεταβείτε στη διεύθυνση <ph name="LINK" /></translation> <translation id="2307344026739914387">Χρήση τρέχοντος ζεύγους κλειδιών</translation> <translation id="2320295602967756579">Ενεργοποίηση φωτεινού θέματος</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Ενεργοποίηση λειτουργίας σκοτεινού χρώματος</translation> <translation id="2740531572673183784">ΟK</translation> <translation id="2751739896257479635">2η φάση ελέγχου ταυτότητας EAP:</translation> +<translation id="2756652381241102009">Εκτέλεση διαγνωστικών</translation> <translation id="2783010256799387990">ΕΠΙΤΥΧΗΣ ΟΛΟΚΛΗΡΩΣΗ</translation> <translation id="2789486458103222910">OK</translation> <translation id="2805756323405976993">Εφαρμογές </translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Σύνδεση…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Επανεκκίνηση <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Τρέχον avatar</translation> <translation id="4425149324548788773">Το Drive μου</translation> <translation id="4428374560396076622">Το δίκτυο <ph name="NETWORK_NAME" /> είναι εκτός λειτουργίας.</translation> <translation id="4429881212383817840">Το εισιτήριο Kerberos θα λήξει σύντομα</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Γονική πρόσβαση</translation> <translation id="473775607612524610">Ενημέρωση</translation> <translation id="4744944742468440486">Πληροφορίες που σχετίζονται με την επιλογή σας</translation> +<translation id="4751272708893364980">Εμφάνιση αρχείων καταγραφής για εξουσιοδότηση επιστροφής εμπορικών προϊόντων (RMA)</translation> <translation id="4773299976671772492">Διακόπηκε</translation> <translation id="4774530504324923332">Θα χρειαστείτε ένα κλειδί ασφαλείας με δυνατότητα RSU, μια εφαρμογή σάρωσης κωδικών QR και μια δεύτερη συσκευή με σύνδεση στο διαδίκτυο</translation> <translation id="4782311465517282004">Λάβετε ορισμούς, μεταφράσεις ή μετατροπές μονάδων κάνοντας δεξί κλικ ή αγγίζοντας παρατεταμένα κείμενο.</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Το δίκτυο Wi-Fi δεν είναι ασφαλές.</translation> <translation id="5376354385557966694">Αυτόματη φωτεινή λειτουργία</translation> <translation id="537872351913703572">Η συσκευή θα μεταβιβαστεί σε διαφορετικό χρήστη ή οργανισμό</translation> +<translation id="5389224261615877010">Ουράνιο τόξο</translation> <translation id="5395600419410242651">Διαγραφή όλων των δεδομένων</translation> <translation id="5400907029458559844">Η συσκευή συνδέεται.</translation> <translation id="5401938042319910061">Εκτέλεση όλων των ρουτινών</translation> +<translation id="5406131354638931058">Εκτελέστε αποκοπή τάσης μπαταρίας για συσκευές που αποστέλλονται ή αποθηκεύονται</translation> <translation id="5423849171846380976">Ενεργοποιημένο</translation> <translation id="5430931332414098647">Άμεση σύνδεση</translation> <translation id="5431318178759467895">Χρώμα</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Το αρχείο δεν βρέθηκε</translation> <translation id="5939518447894949180">Επαναφορά</translation> <translation id="594552776027197022">Δημιουργία τυχαίου ζεύγους κλειδιών</translation> +<translation id="5951259522948394825">Βεβαιωθείτε ότι όλα είναι στη σωστή θέση και δείτε την αναφορά διαγνωστικών στοιχείων</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Προεπιλεγμένη ταπετσαρία</translation> <translation id="6017514345406065928">Πράσινο</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Επιλέξτε <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Αρχεία καταγραφής για εξουσιοδότηση επιστροφής εμπορικών προϊόντων (RMA)</translation> <translation id="8206859287963243715">Κινητό</translation> <translation id="8208861521865154048">Προνόμια</translation> <translation id="8217675307824400706">Συνδεθείτε</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Αυτόματη λειτουργία χαμηλού φωτισμού</translation> <translation id="8461329675984532579">Όνομα παρόχου αρχικής σελίδας</translation> <translation id="8467104829907989997">Βαθμονόμηση στοιχείων…</translation> +<translation id="8474030592808010086">Αποσυνδέστε τη συσκευή για εκτέλεση της αποκοπής τάσης μπαταρίας</translation> <translation id="8475690821716466388">Η ασφάλεια του δικτύου Wi-Fi βασίζεται σε ένα αδύναμο πρωτόκολλο WEP PSK.</translation> <translation id="8477551185774834963">Ο λανθάνων χρόνος DNS έχει υπερβεί ελαφρώς το επιτρεπόμενο ελάχιστο όριο.</translation> <translation id="8483248364096924578">Διεύθυνση IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Ισχύς σήματος</translation> <translation id="8910721771319628100">Ο λανθάνων χρόνος του προεπιλεγμένου δικτύου έχει υπερβεί το ελάχιστο όριο.</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> του/της <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Δείτε τι διορθώθηκε</translation> <translation id="8919837981463578619">Σφάλμα - Λείπει δίσκος</translation> <translation id="8923267550422472772">Ημέρα του μήνα για επαναφορά</translation> <translation id="8928727111548978589">Σφάλμα - Τελείωσε το χαρτί</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb index 8985b22..cf926df 100644 --- a/chromeos/strings/chromeos_strings_en-GB.xtb +++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -32,6 +32,7 @@ <translation id="1270369111467284986">Captive portal suspected</translation> <translation id="1290331692326790741">Weak signal</translation> <translation id="1301069673413256657">GSM</translation> +<translation id="1308067967278144752">Turn on write-protect</translation> <translation id="1308754910631152188">Updating (<ph name="PERCENTAGE_VALUE" />% complete)</translation> <translation id="1310380015393971138">No <ph name="NETWORK_NAME" /> network available</translation> <translation id="131421566576084655">Date of last data reset is unavailable</translation> @@ -442,6 +443,7 @@ <translation id="5166918508782100047">Quick Answers settings</translation> <translation id="5168185087976003268">Battery health</translation> <translation id="5170568018924773124">Show in folder</translation> +<translation id="5179530508336824319">Enable write-protect to continue to the next screen. Go to the device manufacturer's support page for instructions.</translation> <translation id="5190187232518914472">Relive your favourite memories. To add or edit albums, go to <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation> <translation id="5212543919916444558">I can't find anything on your screen that I can help with. Try tapping the mic to ask me anything.</translation>
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb index 1c87911..9298955 100644 --- a/chromeos/strings/chromeos_strings_es-419.xtb +++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">VPN de Android</translation> <translation id="131461803491198646">Red local, no en modo roaming</translation> <translation id="1327977588028644528">Puerta de enlace</translation> +<translation id="1328223165223065150">Color del fondo de pantalla</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Ajustar al área de escaneo</translation> <translation id="1367951781824006909">Selecciona un archivo</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Fuente de la imagen</translation> <translation id="1451536289672181509">El dispositivo es un teclado.</translation> <translation id="1459693405370120464">Clima</translation> +<translation id="1459784442280469416">Guardar en USB</translation> <translation id="1468664791493211953">Ofertas</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> administra este dispositivo y es posible que pueda supervisar tu actividad.</translation> <translation id="1478594628797167447">Escáner</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> administra a este usuario y es posible que administre la configuración y supervise la actividad del usuario de forma remota.</translation> <translation id="150962533380566081">PUK no válida.</translation> <translation id="1510238584712386396">Selector</translation> +<translation id="1512982610995527443">El dispositivo se apagará en 5 segundos</translation> +<translation id="1522984060396982789">Se realizó correctamente la reparación. Puedes apagar el dispositivo o realizar acciones adicionales.</translation> <translation id="152892567002884378">Subir el volumen</translation> <translation id="1555130319947370107">Azul</translation> <translation id="155865706765934889">Panel táctil</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Revisión de hardware</translation> <translation id="1905710495812624430">Se superó la cantidad máxima de intentos permitidos.</translation> <translation id="1908234395526491708">Fallos de solicitudes de UDP</translation> +<translation id="1932611479324127242">Corte de batería</translation> <translation id="1947737735496445907">Impreso</translation> <translation id="1951012854035635156">Asistente</translation> <translation id="1977994649430373166">Foto de perfil de Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Sigue flotando</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> fotos</translation> +<translation id="2154739667870063220">Reiniciar</translation> <translation id="2157959690810728433">EN COLA</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Volver a intentar</translation> <translation id="2161394479394250669">Cancelar el trabajo de impresión</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Cambiar diseño</translation> <translation id="225692081236532131">Estado de activación</translation> <translation id="2271469253353559191">Programación del modo oscuro</translation> +<translation id="2275586345903859204">Se completó la reparación</translation> <translation id="2287186687001756809">No hay imágenes disponibles. Para agregar fotos, ve a <ph name="LINK" />.</translation> <translation id="2307344026739914387">Usar el par de claves actual</translation> <translation id="2320295602967756579">Habilitar el tema claro</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Habilitar el modo de color oscuro</translation> <translation id="2740531572673183784">Aceptar</translation> <translation id="2751739896257479635">Autenticación de fase 2 EAP</translation> +<translation id="2756652381241102009">Ejecutar Diagnóstico</translation> <translation id="2783010256799387990">APROBADO</translation> <translation id="2789486458103222910">Aceptar</translation> <translation id="2805756323405976993">Aplicaciones</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Conectando…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Reiniciando <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Avatar actual</translation> <translation id="4425149324548788773">Mi unidad</translation> <translation id="4428374560396076622">La red <ph name="NETWORK_NAME" /> está desactivada</translation> <translation id="4429881212383817840">El ticket de Kerberos caducará pronto</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Acceso parental</translation> <translation id="473775607612524610">Actualizar</translation> <translation id="4744944742468440486">Información sobre el texto seleccionado</translation> +<translation id="4751272708893364980">Ver los registros de ADP</translation> <translation id="4773299976671772492">Detenida</translation> <translation id="4774530504324923332">Necesitarás una llave de seguridad habilitada para RSU, un escáner de código QR y otro dispositivo con conexión a Internet</translation> <translation id="4782311465517282004">Obtén definiciones, traducciones o conversión de unidades cuando haces clic con el botón derecho en texto o lo mantienes presionado.</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">la red Wi-Fi no es segura</translation> <translation id="5376354385557966694">Modo claro automático</translation> <translation id="537872351913703572">El dispositivo cambiará de organización o usuario</translation> +<translation id="5389224261615877010">Arcoíris</translation> <translation id="5395600419410242651">Borrar todos los datos</translation> <translation id="5400907029458559844">El dispositivo se está conectando.</translation> <translation id="5401938042319910061">Ejecutar todas las rutinas</translation> +<translation id="5406131354638931058">Realizar el corte de batería para dispositivos que se envían o se almacenan</translation> <translation id="5423849171846380976">Activado</translation> <translation id="5430931332414098647">Conexión instantánea mediante dispositivo móvil</translation> <translation id="5431318178759467895">Color</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">No se encontró el archivo</translation> <translation id="5939518447894949180">Restablecer</translation> <translation id="594552776027197022">Generar un par de llaves aleatorio</translation> +<translation id="5951259522948394825">Confirmar que todo está en orden y ver el informe de diagnóstico</translation> <translation id="5972388717451707488">Actualizar motor</translation> <translation id="5984145644188835034">Fondo de pantalla predeterminado</translation> <translation id="6017514345406065928">Verde</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Seleccionar <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Intro</translation> +<translation id="819552138404104974">Registros de ADP</translation> <translation id="8206859287963243715">Celular</translation> <translation id="8208861521865154048">Beneficios</translation> <translation id="8217675307824400706">Conéctate</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Modo oscuro automático</translation> <translation id="8461329675984532579">Nombre del proveedor de origen</translation> <translation id="8467104829907989997">Calibrando los componentes…</translation> +<translation id="8474030592808010086">Desenchufar el dispositivo para realizar el corte de batería</translation> <translation id="8475690821716466388">la red Wi-Fi está protegida con el protocolo de PSK WEP (poco seguro)</translation> <translation id="8477551185774834963">la latencia de DNS supera ligeramente el umbral permitido</translation> <translation id="8483248364096924578">Dirección IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Intensidad de la señal</translation> <translation id="8910721771319628100">la red predeterminada supera el umbral de latencia</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Descubre qué se corrigió</translation> <translation id="8919837981463578619">Error: Falta la bandeja</translation> <translation id="8923267550422472772">Día del mes para el restablecimiento</translation> <translation id="8928727111548978589">Error: No hay papel</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb index c8d0cbd..a8482cd3 100644 --- a/chromeos/strings/chromeos_strings_es.xtb +++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">VPN de Android</translation> <translation id="131461803491198646">Red doméstica, sin roaming</translation> <translation id="1327977588028644528">Pasarela</translation> +<translation id="1328223165223065150">Color del fondo de pantalla</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Ajustar al área de escaneado</translation> <translation id="1367951781824006909">Selecciona un archivo</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Fuente de la imagen</translation> <translation id="1451536289672181509">El dispositivo es un teclado.</translation> <translation id="1459693405370120464">Información meteorológica</translation> +<translation id="1459784442280469416">Guardar en USB</translation> <translation id="1468664791493211953">Ofertas</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> gestiona este dispositivo y es posible que monitorice tu actividad.</translation> <translation id="1478594628797167447">Escáner</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> gestiona a este usuario y es posible que gestione sus ajustes y supervise su actividad de forma remota.</translation> <translation id="150962533380566081">El PUK no es válido.</translation> <translation id="1510238584712386396">Menú de aplicaciones</translation> +<translation id="1512982610995527443">El dispositivo se apagará en 5 segundos</translation> +<translation id="1522984060396982789">La reparación se ha completado correctamente. Puedes apagar el dispositivo o llevar a cabo algunas acciones adicionales.</translation> <translation id="152892567002884378">Subir el volumen</translation> <translation id="1555130319947370107">Azul</translation> <translation id="155865706765934889">Panel táctil</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Revisión de hardware</translation> <translation id="1905710495812624430">Se ha superado el máximo de intentos permitidos.</translation> <translation id="1908234395526491708">Errores de solicitud UDP</translation> +<translation id="1932611479324127242">Desconexión de batería</translation> <translation id="1947737735496445907">Impreso</translation> <translation id="1951012854035635156">Asistente</translation> <translation id="1977994649430373166">Foto de perfil de Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Flotando</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" /> %</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> fotos</translation> +<translation id="2154739667870063220">Reiniciar</translation> <translation id="2157959690810728433">EN COLA</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Reintentar</translation> <translation id="2161394479394250669">Cancelar trabajo de impresión</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Cambiar diseño</translation> <translation id="225692081236532131">Estado de la activación</translation> <translation id="2271469253353559191">Horario del modo Oscuro</translation> +<translation id="2275586345903859204">La reparación se ha completado</translation> <translation id="2287186687001756809">No hay imágenes disponibles. Para añadir fotos, accede a <ph name="LINK" /></translation> <translation id="2307344026739914387">Usar par de claves actual</translation> <translation id="2320295602967756579">Habilitar tema claro</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Habilitar modo de color oscuro</translation> <translation id="2740531572673183784">Aceptar</translation> <translation id="2751739896257479635">Autenticación de fase 2 EAP</translation> +<translation id="2756652381241102009">Realizar diagnóstico</translation> <translation id="2783010256799387990">SUPERADA</translation> <translation id="2789486458103222910">Aceptar</translation> <translation id="2805756323405976993">Aplicaciones</translation> @@ -265,7 +273,7 @@ <translation id="3678765385266369662">Selecciona cómo quieres desactivar la protección contra escritura</translation> <translation id="3689839747745352263">Prueba <ph name="TEST_NAME" /></translation> <translation id="370665806235115550">Cargando...</translation> -<translation id="3708186454126126312">Conectado anteriormente</translation> +<translation id="3708186454126126312">Conectados anteriormente</translation> <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> reseñas)</translation> <translation id="3748026146096797577">No conectado</translation> <translation id="3749289110408117711">Nombre del archivo</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Conectando...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Reiniciando <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Avatar actual</translation> <translation id="4425149324548788773">Mi unidad</translation> <translation id="4428374560396076622">Red <ph name="NETWORK_NAME" /> desactivada</translation> <translation id="4429881212383817840">El ticket de Kerberos caducará pronto</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Acceso parental</translation> <translation id="473775607612524610">Actualizar</translation> <translation id="4744944742468440486">Información relacionada con tu selección</translation> +<translation id="4751272708893364980">Ver registros de autorización de devolución de mercancía</translation> <translation id="4773299976671772492">Detenido</translation> <translation id="4774530504324923332">Necesitarás una clave de seguridad con RSU habilitado, un escáner de códigos QR y otro dispositivo con una conexión a Internet</translation> <translation id="4782311465517282004">Consulta definiciones, traducciones o conversiones de unidades haciendo clic con el botón derecho en un texto o manteniéndolo pulsado</translation> @@ -450,9 +460,11 @@ <translation id="5372659122375744710">La red Wi-Fi no es segura</translation> <translation id="5376354385557966694">Modo Claro automático</translation> <translation id="537872351913703572">El dispositivo lo utilizará otro usuario u otra organización</translation> +<translation id="5389224261615877010">Arcoíris</translation> <translation id="5395600419410242651">Borrar todos los datos</translation> <translation id="5400907029458559844">El dispositivo se está conectando.</translation> <translation id="5401938042319910061">Ejecutar todas las rutinas</translation> +<translation id="5406131354638931058">Realiza una desconexión de batería en los dispositivos que vayas a enviar o almacenar</translation> <translation id="5423849171846380976">Activado</translation> <translation id="5430931332414098647">Conexión compartida instantánea</translation> <translation id="5431318178759467895">Color</translation> @@ -505,6 +517,7 @@ <translation id="5931523347251946569">Archivo no encontrado</translation> <translation id="5939518447894949180">Restablecer</translation> <translation id="594552776027197022">Generar par de claves aleatorio</translation> +<translation id="5951259522948394825">Comprueba que todo esté en su sitio y consulta el informe de diagnóstico</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Fondo de pantalla predeterminado</translation> <translation id="6017514345406065928">Verde</translation> @@ -725,6 +738,7 @@ <translation id="8138405288920084977">LTE Advanced</translation> <translation id="8143951647992294073">Seleccionar <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Intro</translation> +<translation id="819552138404104974">Registros de autorización de devolución de mercancía</translation> <translation id="8206859287963243715">Móvil</translation> <translation id="8208861521865154048">Ventajas</translation> <translation id="8217675307824400706">Conéctate</translation> @@ -758,6 +772,7 @@ <translation id="8456761643544401578">Modo Oscuro automático</translation> <translation id="8461329675984532579">Nombre del proveedor inicial</translation> <translation id="8467104829907989997">Calibrando componentes...</translation> +<translation id="8474030592808010086">Retira el cable de alimentación del dispositivo para realizar una desconexión de batería</translation> <translation id="8475690821716466388">La red Wi-Fi está protegida con un protocolo poco seguro WEP PSK</translation> <translation id="8477551185774834963">La latencia DNS supera ligeramente el umbral permitido</translation> <translation id="8483248364096924578">Dirección IP</translation> @@ -803,6 +818,7 @@ <translation id="8898840733695078011">Intensidad de la señal</translation> <translation id="8910721771319628100">La red predeterminada supera el umbral de latencia</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Consulta qué se ha arreglado</translation> <translation id="8919837981463578619">No se ha podido imprimir - Falta una bandeja</translation> <translation id="8923267550422472772">Día del mes en el que se reiniciará</translation> <translation id="8928727111548978589">No se ha podido imprimir - Sin papel</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb index 2d7b04d..e516ce1 100644 --- a/chromeos/strings/chromeos_strings_et.xtb +++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Androidi VPN</translation> <translation id="131461803491198646">Koduvõrk, mitte rändlus</translation> <translation id="1327977588028644528">Lüüs</translation> +<translation id="1328223165223065150">Taustapildi värv</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Sobita skannitava alaga</translation> <translation id="1367951781824006909">Vali fail</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Pildi allikas</translation> <translation id="1451536289672181509">Seade on klaviatuur.</translation> <translation id="1459693405370120464">Ilm</translation> +<translation id="1459784442280469416">Salvesta USB-le</translation> <translation id="1468664791493211953">Pakkumised</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> haldab seda seadet ja saab võib-olla jälgida teie tegevusi.</translation> <translation id="1478594628797167447">Skanner</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732">Seda kasutajat haldab domeen <ph name="MANAGER" />, mis võib eemalt hallata seadeid ja jälgida kasutaja tegevusi.</translation> <translation id="150962533380566081">Vale PUK-kood.</translation> <translation id="1510238584712386396">Käivitaja</translation> +<translation id="1512982610995527443">Seade lülitub 5 sekundi pärast välja</translation> +<translation id="1522984060396982789">Parandamine õnnestus. Saate seadme välja lülitada või teha veel täiendavaid toiminguid.</translation> <translation id="152892567002884378">Helitugevuse suurendamine</translation> <translation id="1555130319947370107">Sinine</translation> <translation id="155865706765934889">Puuteplaat</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Riistvara redaktsioon</translation> <translation id="1905710495812624430">Katsete maksimaalne arv on ületatud.</translation> <translation id="1908234395526491708">UDP-taotluste vead</translation> +<translation id="1932611479324127242">Aku ühenduse katkestamine</translation> <translation id="1947737735496445907">Prinditud</translation> <translation id="1951012854035635156">Assistent</translation> <translation id="1977994649430373166">Google'i profiilifoto</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Liueldes mööda</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> fotot</translation> +<translation id="2154739667870063220">Taaskäivita</translation> <translation id="2157959690810728433">JÄRJEKORRAS</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: proovige uuesti</translation> <translation id="2161394479394250669">Tühista prinditöö</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Paigutuse lüliti</translation> <translation id="225692081236532131">Aktiveerimise olek</translation> <translation id="2271469253353559191">Tumeda režiimi ajakava</translation> +<translation id="2275586345903859204">Parandus on lõpule viidud</translation> <translation id="2287186687001756809">Pilte pole saadaval. Fotode lisamiseks minge saidile <ph name="LINK" /></translation> <translation id="2307344026739914387">Kasuta praegust võtmepaari</translation> <translation id="2320295602967756579">Heleda teema lubamine</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Luba tume värvirežiim</translation> <translation id="2740531572673183784">Ok</translation> <translation id="2751739896257479635">EAP 2. etapi autentimine</translation> +<translation id="2756652381241102009">Käita diagnostika</translation> <translation id="2783010256799387990">LÄBITUD</translation> <translation id="2789486458103222910">Selge</translation> <translation id="2805756323405976993">Rakendused</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Ühendamine ...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Seadme <ph name="DEVICE_NAME" /> taaskäivitamine</translation> +<translation id="4415951057168511744">Praegune avatar</translation> <translation id="4425149324548788773">Minu ketas</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> on välja lülitatud</translation> <translation id="4429881212383817840">Kerberose pilet aegub peagi</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Vanema juurdepääs</translation> <translation id="473775607612524610">Värskenda</translation> <translation id="4744944742468440486">Teie valikuga seotud teave</translation> +<translation id="4751272708893364980">Kuva RMA logid</translation> <translation id="4773299976671772492">Peatatud</translation> <translation id="4774530504324923332">Vajate RSU-toega turvavõtit, QR-koodi skannerit ja teist seadet, milles on internetiühendus</translation> <translation id="4782311465517282004">Hankige tekstil paremklõpsates või seda pikalt puudutades definitsioone, tõlkeid või ühikute teisendusi.</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">WiFi-võrk pole turvaline</translation> <translation id="5376354385557966694">Automaatne hele režiim</translation> <translation id="537872351913703572">Seade antakse teisele kasutajale või organisatsioonile</translation> +<translation id="5389224261615877010">Vikerkaar</translation> <translation id="5395600419410242651">Kustuta kõik andmed</translation> <translation id="5400907029458559844">Seadet ühendatakse.</translation> <translation id="5401938042319910061">Käita kõiki rutiine</translation> +<translation id="5406131354638931058">Katkestage tarnitavate või ladustatavate seadmete aku ühendus</translation> <translation id="5423849171846380976">Aktiveeritud</translation> <translation id="5430931332414098647">Automaatne jagamine</translation> <translation id="5431318178759467895">Värv</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Faili ei leitud</translation> <translation id="5939518447894949180">Lähtesta</translation> <translation id="594552776027197022">Loo juhuslik võtmepaar</translation> +<translation id="5951259522948394825">Veenduge, et kõik oleks õigesti, ja vaadake diagnostikaaruannet</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Vaiketaustapilt</translation> <translation id="6017514345406065928">Roheline</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Vali „<ph name="TOPIC_SOURCE" /> – <ph name="TOPIC_SOURCE_DESC" />”</translation> <translation id="8179976553408161302">Sisestusklahv</translation> +<translation id="819552138404104974">RMA logid</translation> <translation id="8206859287963243715">Mobiil</translation> <translation id="8208861521865154048">Hüved</translation> <translation id="8217675307824400706">Looge ühendus</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Automaatne tume režiim</translation> <translation id="8461329675984532579">Koduteenuse pakkuja nimi</translation> <translation id="8467104829907989997">Komponentide kalibreerimine …</translation> +<translation id="8474030592808010086">Eemaldage seade, et aku ühendus katkestada</translation> <translation id="8475690821716466388">WiFi-võrk on kaitstud nõrga protokolliga (WEP PSK)</translation> <translation id="8477551185774834963">DNS-i latentsusaeg ületab veidi lubatud piiri</translation> <translation id="8483248364096924578">IP-aadress</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Signaali tugevus</translation> <translation id="8910721771319628100">Vaikevõrk ületab latentsusaja piiri</translation> <translation id="8918637186205009138">Kasutaja <ph name="GIVEN_NAME" /> <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">Vaadake, mis parandati</translation> <translation id="8919837981463578619">Ebaõnnestus – salv puudub</translation> <translation id="8923267550422472772">Lähtestamise kuupäev</translation> <translation id="8928727111548978589">Ebaõnnestus – paber on otsas</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb index b435ba7..7c886e91 100644 --- a/chromeos/strings/chromeos_strings_eu.xtb +++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN sarea</translation> <translation id="131461803491198646">Tokiko sarea, ez ibiltaritza</translation> <translation id="1327977588028644528">Atebidea</translation> +<translation id="1328223165223065150">Horma-paperaren kolorea</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Egokitu eskanea daitekeen eremura</translation> <translation id="1367951781824006909">Aukeratu fitxategi bat</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Irudiaren iturburua</translation> <translation id="1451536289672181509">Gailua teklatu bat da.</translation> <translation id="1459693405370120464">Eguraldia</translation> +<translation id="1459784442280469416">Gorde USB bidezko unitate batean</translation> <translation id="1468664791493211953">Eskaintzak</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> domeinuak kudeatzen du gailu hau, eta baliteke zure jardueren jarraipena egin ahal izatea.</translation> <translation id="1478594628797167447">Eskanerra</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> domeinuak kudeatzen du erabiltzaile hau, eta baliteke urrunetik haren ezarpenak kudeatzea eta jarduerak gainbegiratzea.</translation> <translation id="150962533380566081">PUK kodeak ez du balio.</translation> <translation id="1510238584712386396">Abiarazlea</translation> +<translation id="1512982610995527443">Gailua bost segundo barru itzaliko da</translation> +<translation id="1522984060396982789">Konpondu dira arazoak. Gailua itzali egin dezakezu, edo beste ekintza batzuk egin.</translation> <translation id="152892567002884378">Igo bolumena</translation> <translation id="1555130319947370107">Urdina</translation> <translation id="155865706765934889">Ukipen-teklatua</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Hardwarearen berrikuspena</translation> <translation id="1905710495812624430">Saiakera-muga gainditu da.</translation> <translation id="1908234395526491708">UDP bidezko eskaeren hutsegiteak</translation> +<translation id="1932611479324127242">Barneko bateria itzaltzeko prozesua</translation> <translation id="1947737735496445907">Inprimatuta</translation> <translation id="1951012854035635156">Laguntzailea</translation> <translation id="1977994649430373166">Google-ko profileko argazkia</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Flotatu airean</translation> <translation id="2141644705054017895">% <ph name="PERCENTAGE_VALUE" /></translation> <translation id="2152882202543497059"><ph name="NUMBER" /> argazki</translation> +<translation id="2154739667870063220">Berrabiarazi</translation> <translation id="2157959690810728433">ILARAN</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Saiatu berriro</translation> <translation id="2161394479394250669">Utzi bertan behera inprimatze-lana</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Diseinua aldatzeko etengailua</translation> <translation id="225692081236532131">Aktibazioaren egoera</translation> <translation id="2271469253353559191">Modu ilunaren programazioa</translation> +<translation id="2275586345903859204">Konpondu dira arazoak</translation> <translation id="2287186687001756809">Ez dago irudirik. Argazkiak gehitzeko, joan <ph name="LINK" /> helbidera.</translation> <translation id="2307344026739914387">Erabili une honetako gako parea</translation> <translation id="2320295602967756579">Gaitu gai iluna</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Gaitu kolore ilunaren modua</translation> <translation id="2740531572673183784">Ados</translation> <translation id="2751739896257479635">EAP 2. fasearen autentifikazioa</translation> +<translation id="2756652381241102009">Exekutatu diagnostiko-txostena</translation> <translation id="2783010256799387990">GAINDITUTA</translation> <translation id="2789486458103222910">Ados</translation> <translation id="2805756323405976993">Aplikazioak</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Konektatzen…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> berrabiarazten</translation> +<translation id="4415951057168511744">Oraingo abatarra</translation> <translation id="4425149324548788773">Nire unitatea</translation> <translation id="4428374560396076622">Desaktibatuta dago <ph name="NETWORK_NAME" /></translation> <translation id="4429881212383817840">Laster iraungiko da Kerberos-eko zerbitzu-eskaera</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Gurasoen sarbidea</translation> <translation id="473775607612524610">Eguneratu</translation> <translation id="4744944742468440486">Zure hautapenarekin erlazionatutako informazioa</translation> +<translation id="4751272708893364980">Ikusi salgaiak itzultzeko baimenarekin erlazionatutako erregistroak</translation> <translation id="4773299976671772492">Gelditu egin da</translation> <translation id="4774530504324923332">RSUa gaituta daukan segurtasun-giltza bat, QR kodeen eskaner bat eta Internetera konektatuta dagoen beste gailu bat beharko dituzu</translation> <translation id="4782311465517282004">Eskuratu definizioak, itzulpenak edo unitate-bihurketak testua eskuineko botoiarekin sakatzean edo sakatuta edukitzean</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Wifi-sarea ez da segurua</translation> <translation id="5376354385557966694">Gai argi automatikoa</translation> <translation id="537872351913703572">Beste erabiltzaile edo erakunde batek erabiliko du gailua</translation> +<translation id="5389224261615877010">Ostadarra</translation> <translation id="5395600419410242651">Ezabatu datu guztiak</translation> <translation id="5400907029458559844">Gailua konektatzen ari da.</translation> <translation id="5401938042319910061">Exekutatu errutina guztiak</translation> +<translation id="5406131354638931058">Itzali bidaliko edo gordeko diren gailuen barneko bateria</translation> <translation id="5423849171846380976">Aktibatuta</translation> <translation id="5430931332414098647">Konexioa bizkor partekatzeko eginbidea</translation> <translation id="5431318178759467895">Kolorez</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Ez da aurkitu fitxategia</translation> <translation id="5939518447894949180">Berrezarri</translation> <translation id="594552776027197022">Sortu ausazko gako pare bat</translation> +<translation id="5951259522948394825">Berretsi dena ongi dagoela eta ikusi diagnostiko-txostena</translation> <translation id="5972388717451707488">Eguneratu motorra</translation> <translation id="5984145644188835034">Horma-paper lehenetsia</translation> <translation id="6017514345406065928">Berdea</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Hautatu <ph name="TOPIC_SOURCE" /> zerbitzuko <ph name="TOPIC_SOURCE_DESC" /> aukera</translation> <translation id="8179976553408161302">Sartu</translation> +<translation id="819552138404104974">Salgaiak itzultzeko baimenarekin erlazionatutako erregistroak</translation> <translation id="8206859287963243715">Konexio mugikorra</translation> <translation id="8208861521865154048">Abantailak</translation> <translation id="8217675307824400706">Konektatu</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Gai ilun automatikoa</translation> <translation id="8461329675984532579">Hasierako hornitzailearen izena</translation> <translation id="8467104829907989997">Osagaiak kalibratzen…</translation> +<translation id="8474030592808010086">Bateria ateratzeko, itzali barneko bateria</translation> <translation id="8475690821716466388">WEP PSK protokolo ahulak babesten du wifi-sarea</translation> <translation id="8477551185774834963">DNSaren latentzia onartzen den atalasetik apur bat gorago dago</translation> <translation id="8483248364096924578">IP helbidea</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Seinalearen indarra</translation> <translation id="8910721771319628100">Sare lehenetsia latentziaren atalasetik gora dago</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> erabiltzailearen <ph name="DEVICE_TYPE" /> gailua</translation> +<translation id="8919792139048574232">Ikusi zer konpondu den</translation> <translation id="8919837981463578619">Hutsegitea - Erretilua falta da</translation> <translation id="8923267550422472772">Hilabeteko zein egunetan berrezarri behar den</translation> <translation id="8928727111548978589">Hutsegitea - Ez dago paperik</translation>
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb index 8ec0a33..977a037 100644 --- a/chromeos/strings/chromeos_strings_fi.xtb +++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Kotiverkko, ei roaming-tilassa </translation> <translation id="1327977588028644528">Yhdyskäytävä</translation> +<translation id="1328223165223065150">Taustakuvan väri</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Sovita skannattavalle alueelle</translation> <translation id="1367951781824006909">Valitse tiedosto</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Kuvan lähde</translation> <translation id="1451536289672181509">Laite on näppäimistö.</translation> <translation id="1459693405370120464">Sää</translation> +<translation id="1459784442280469416">Tallenna USB:lle</translation> <translation id="1468664791493211953">Tarjoukset</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> ylläpitää tätä laitetta ja voi ehkä seurata toimintaasi.</translation> <translation id="1478594628797167447">Skanneri</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> ylläpitää tätä käyttäjää ja voi muuttaa asetuksia ja seurata käyttäjän toimia etänä.</translation> <translation id="150962533380566081">Virheellinen PUK-koodi</translation> <translation id="1510238584712386396">Käynnistysohjelma</translation> +<translation id="1512982610995527443">Laite sammuu 5 sekunnin kuluttua</translation> +<translation id="1522984060396982789">Korjaus onnistui. Voit sammuttaa laitteen tai suorittaa muita toimintoja.</translation> <translation id="152892567002884378">Lisää äänenvoimakkuutta</translation> <translation id="1555130319947370107">Sininen</translation> <translation id="155865706765934889">Kosketuslevy</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Laitteistoversio</translation> <translation id="1905710495812624430">Yritysten enimmäismäärä ylitettiin.</translation> <translation id="1908234395526491708">Epäonnistuneita UDP-pyyntöjä</translation> +<translation id="1932611479324127242">Akun sammutus</translation> <translation id="1947737735496445907">Tulostettu</translation> <translation id="1951012854035635156">Assistant</translation> <translation id="1977994649430373166">Google-profiilikuva</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Kelluen eteenpäin</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" /> %</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> kuvaa</translation> +<translation id="2154739667870063220">Käynnistä uudelleen</translation> <translation id="2157959690810728433">JONOSSA</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Yritä uudelleen</translation> <translation id="2161394479394250669">Peru tulostustyö</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Asettelun valitsin</translation> <translation id="225692081236532131">Aktivoinnin tila</translation> <translation id="2271469253353559191">Tumman tilan aikataulu</translation> +<translation id="2275586345903859204">Korjaus on valmis</translation> <translation id="2287186687001756809">Kuvia ei saatavilla. Jos haluat lisätä kuvia, avaa <ph name="LINK" /></translation> <translation id="2307344026739914387">Käytä tämänhetkistä avainparia</translation> <translation id="2320295602967756579">Ota vaalea teema käyttöön</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Ota tumma väritila käyttöön</translation> <translation id="2740531572673183784">OK</translation> <translation id="2751739896257479635">EAPin 2. vaiheen todennus</translation> +<translation id="2756652381241102009">Suorita diagnostiikka</translation> <translation id="2783010256799387990">ONNISTUI</translation> <translation id="2789486458103222910">OK</translation> <translation id="2805756323405976993">Sovellukset</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Yhdistetään…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> käynnistetään uudelleen</translation> +<translation id="4415951057168511744">Nykyinen avatar</translation> <translation id="4425149324548788773">Oma Drive</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> ei ole päällä</translation> <translation id="4429881212383817840">Kerberos-tukipyyntö vanhenee pian</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Avaus vanhemmille</translation> <translation id="473775607612524610">Päivitä</translation> <translation id="4744944742468440486">Valintaasi liittyviä tietoja</translation> +<translation id="4751272708893364980">Näytä RMA-lokit</translation> <translation id="4773299976671772492">Keskeytetty</translation> <translation id="4774530504324923332">Tarvitset RSU-käyttöisen suojausavaimen, QR-koodiskannerin ja toisen laitteen, joka on yhteydessä internetiin</translation> <translation id="4782311465517282004">Voit nähdä määritelmiä, käännöksiä tai yksikkömuunnoksia klikkaamalla tekstiä kakkospainikkeella tai koskettamalla sitä pitkään</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Wi-Fi-verkko ei ole suojattu</translation> <translation id="5376354385557966694">Automaattinen vaalea tila</translation> <translation id="537872351913703572">Laitteen omistaja vaihtuu</translation> +<translation id="5389224261615877010">Sateenkaari</translation> <translation id="5395600419410242651">Poista kaikki data</translation> <translation id="5400907029458559844">Laite muodostaa yhteyttä.</translation> <translation id="5401938042319910061">Suorita kaikki ohjelmat</translation> +<translation id="5406131354638931058">Suorita akun sammutus laitteille, jotka toimitetaan tai varastoidaan</translation> <translation id="5423849171846380976">Aktivoitu</translation> <translation id="5430931332414098647">Yhteyden pikajakaminen</translation> <translation id="5431318178759467895">Väri</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Tiedostoa ei löydy</translation> <translation id="5939518447894949180">Tyhjennä</translation> <translation id="594552776027197022">Luo satunnainen avainpari</translation> +<translation id="5951259522948394825">Varmista, että kaikki on paikoillaan ja katso diagnostinen raportti</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Oletustaustakuva</translation> <translation id="6017514345406065928">Vihreä</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Valitse <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA-lokit</translation> <translation id="8206859287963243715">Matkapuhelin</translation> <translation id="8208861521865154048">Edut</translation> <translation id="8217675307824400706">Muodosta yhteys</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Automaattinen tumma tila</translation> <translation id="8461329675984532579">Kotiverkon palveluntarjoajan nimi</translation> <translation id="8467104829907989997">Komponentteja kalibroidaan…</translation> +<translation id="8474030592808010086">Irrota laite, jotta akku sammuu</translation> <translation id="8475690821716466388">Wi-Fi-verkko on suojattu heikolla WEP PSK -protokollalla</translation> <translation id="8477551185774834963">DNS-viive hieman yli sallitun rajan</translation> <translation id="8483248364096924578">IP-osoite</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Signaalin vahvuus</translation> <translation id="8910721771319628100">Oletusverkko yli viiverajan</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> (<ph name="GIVEN_NAME" />)</translation> +<translation id="8919792139048574232">Katso, mitä on korjattu</translation> <translation id="8919837981463578619">Epäonnistui – Lokero puuttuu</translation> <translation id="8923267550422472772">Nollaamispäivä</translation> <translation id="8928727111548978589">Epäonnistui – Paperi loppu</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb index 9cf98cb9..1e693670 100644 --- a/chromeos/strings/chromeos_strings_fr-CA.xtb +++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">RPV Android</translation> <translation id="131461803491198646">Réseau domestique, sans itinérance</translation> <translation id="1327977588028644528">Passerelle</translation> +<translation id="1328223165223065150">Couleur du fond d'écran</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Ajuster à la zone de numérisation</translation> <translation id="1367951781824006909">Choisir un fichier</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Source de l'image</translation> <translation id="1451536289672181509">L'appareil est un clavier.</translation> <translation id="1459693405370120464">Météo</translation> +<translation id="1459784442280469416">Enregistrer sur une clé USB</translation> <translation id="1468664791493211953">Offres</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> gère cet appareil et pourrait surveiller votre activité sur celui-ci.</translation> <translation id="1478594628797167447">Numériseur</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> gère cet utilisateur et peut gérer ses paramètres et faire le suivi de son activité à distance.</translation> <translation id="150962533380566081">Clé PUK non valide.</translation> <translation id="1510238584712386396">Lanceur</translation> +<translation id="1512982610995527443">L'appareil s'éteindra au bout de cinq secondes</translation> +<translation id="1522984060396982789">Votre réparation a réussi. Vous pouvez éteindre l'appareil ou prendre d'autres mesures.</translation> <translation id="152892567002884378">Augmenter le volume</translation> <translation id="1555130319947370107">Bleu</translation> <translation id="155865706765934889">Pavé tactile</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Révision du matériel</translation> <translation id="1905710495812624430">Nombre maximal autorisé de tentatives atteint.</translation> <translation id="1908234395526491708">Échecs des demandes UDP</translation> +<translation id="1932611479324127242">Déconnexion de la pile</translation> <translation id="1947737735496445907">Imprimée</translation> <translation id="1951012854035635156">Assistant</translation> <translation id="1977994649430373166">Photo de profil Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Vol en images</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" /> %</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> photos</translation> +<translation id="2154739667870063220">Redémarrer</translation> <translation id="2157959690810728433">PLACÉ EN FILE D'ATTENTE</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" /> : réessayer</translation> <translation id="2161394479394250669">Annuler la tâche d'impression</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Commutateur de la disposition du clavier</translation> <translation id="225692081236532131">État de l'activation</translation> <translation id="2271469253353559191">Programmation du mode sombre</translation> +<translation id="2275586345903859204">La réparation est terminée</translation> <translation id="2287186687001756809">Aucune image proposée. Pour ajouter des photos, accédez au site <ph name="LINK" /></translation> <translation id="2307344026739914387">Utiliser la biclé actuelle</translation> <translation id="2320295602967756579">Activer le thème clair</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Activer le mode Couleur sombre</translation> <translation id="2740531572673183784">OK</translation> <translation id="2751739896257479635">Authentification EAP phase 2</translation> +<translation id="2756652381241102009">Exécuter les diagnostics</translation> <translation id="2783010256799387990">TEST RÉUSSI</translation> <translation id="2789486458103222910">OK</translation> <translation id="2805756323405976993">Applications</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Connexion...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Redémarrage de <ph name="DEVICE_NAME" /> en cours…</translation> +<translation id="4415951057168511744">Avatar actuel</translation> <translation id="4425149324548788773">Mon disque</translation> <translation id="4428374560396076622">Le réseau <ph name="NETWORK_NAME" /> est désactivé</translation> <translation id="4429881212383817840">Le ticket Kerberos expire bientôt</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Accès parental</translation> <translation id="473775607612524610">Mise à jour</translation> <translation id="4744944742468440486">Renseignements concernant votre sélection</translation> +<translation id="4751272708893364980">Afficher les journaux ARM</translation> <translation id="4773299976671772492">Arrêté</translation> <translation id="4774530504324923332">Vous aurez besoin d'une clé de sécurité activée par les UBR, d'un lecteur de code QR ainsi que d'un deuxième appareil avec une connexion Internet</translation> <translation id="4782311465517282004">Obtenez des définitions, des traductions ou des conversions d'unités lorsque vous faites un clic droit ou que vous maintenez le doigt sur le texte</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Le réseau Wi-Fi n'est pas sécurisé</translation> <translation id="5376354385557966694">Mode clair automatique</translation> <translation id="537872351913703572">L'appareil appartiendra à un autre utilisateur ou à une autre organisation</translation> +<translation id="5389224261615877010">Arc-en-ciel</translation> <translation id="5395600419410242651">Effacer toutes les données</translation> <translation id="5400907029458559844">L'appareil se connecte.</translation> <translation id="5401938042319910061">Exécuter toutes les routines</translation> +<translation id="5406131354638931058">Effectuez la déconnexion de la pile pour les appareils à expédier ou à stocker</translation> <translation id="5423849171846380976">Activé</translation> <translation id="5430931332414098647">Partage de connexion instantané</translation> <translation id="5431318178759467895">Couleur</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Fichier introuvable</translation> <translation id="5939518447894949180">Recommencer</translation> <translation id="594552776027197022">Générer une biclé aléatoire</translation> +<translation id="5951259522948394825">Confirmez que tout est à sa place et consultez le rapport de diagnostics</translation> <translation id="5972388717451707488">Mettre à jour le moteur</translation> <translation id="5984145644188835034">Fond d'écran par défaut</translation> <translation id="6017514345406065928">Vert</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Sélectionner <ph name="TOPIC_SOURCE" /> (<ph name="TOPIC_SOURCE_DESC" />)</translation> <translation id="8179976553408161302">Entrée</translation> +<translation id="819552138404104974">Journaux ARM</translation> <translation id="8206859287963243715">Cellulaire</translation> <translation id="8208861521865154048">Avantages</translation> <translation id="8217675307824400706">Se connecter</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Mode sombre automatique</translation> <translation id="8461329675984532579">Nom du propriétaire</translation> <translation id="8467104829907989997">Calibrage des composants en cours…</translation> +<translation id="8474030592808010086">Débranchez l'appareil pour effectuer la déconnexion de la pile</translation> <translation id="8475690821716466388">Le réseau Wi-Fi est sécurisé par un protocole faible : WEP PSK</translation> <translation id="8477551185774834963">La latence du DNS dépasse un peu le seuil acceptable</translation> <translation id="8483248364096924578">Adresse IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Intensité du signal</translation> <translation id="8910721771319628100">Le seuil de latence du réseau par défaut est trop élevé</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Affichez les éléments qui ont été réparés</translation> <translation id="8919837981463578619">Échec : bac manquant</translation> <translation id="8923267550422472772">Jour du mois pour la réinitialisation</translation> <translation id="8928727111548978589">Échec : à court de papier</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb index 61751a3d..62caecc 100644 --- a/chromeos/strings/chromeos_strings_fr.xtb +++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">VPN Android</translation> <translation id="131461803491198646">Réseau domestique, sans itinérance</translation> <translation id="1327977588028644528">Passerelle</translation> +<translation id="1328223165223065150">Couleur du fond d'écran</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Ajuster à la zone de numérisation</translation> <translation id="1367951781824006909">Choisir un fichier</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Source de l'image</translation> <translation id="1451536289672181509">L'appareil est un clavier.</translation> <translation id="1459693405370120464">Météo</translation> +<translation id="1459784442280469416">Enregistrer sur une clé USB</translation> <translation id="1468664791493211953">Offres</translation> <translation id="1476467821656042872">Il est possible que <ph name="MANAGER" />, qui gère cet appareil, puisse surveiller votre activité.</translation> <translation id="1478594628797167447">Scanner</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> gère cet utilisateur dont il peut modifier les paramètres et surveiller l'activité à distance.</translation> <translation id="150962533380566081">Clé PUK incorrecte.</translation> <translation id="1510238584712386396">Lanceur d'applications</translation> +<translation id="1512982610995527443">L'appareil s'éteindra dans cinq secondes</translation> +<translation id="1522984060396982789">Votre réparation a bien abouti. Vous pouvez éteindre l'appareil ou effectuer d'autres actions.</translation> <translation id="152892567002884378">Augmenter le volume</translation> <translation id="1555130319947370107">Bleu</translation> <translation id="155865706765934889">Pavé tactile</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Version du matériel</translation> <translation id="1905710495812624430">Vous avez atteint le nombre maximal autorisé de tentatives.</translation> <translation id="1908234395526491708">Échec de la requête UDP</translation> +<translation id="1932611479324127242">Désactiver la batterie</translation> <translation id="1947737735496445907">Impression terminée</translation> <translation id="1951012854035635156">Assistant</translation> <translation id="1977994649430373166">Photo du profil Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Animation flottante</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" /> %</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> photos</translation> +<translation id="2154739667870063220">Redémarrer</translation> <translation id="2157959690810728433">Test ajouté à la file d'attente</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" /> : Réessayez</translation> <translation id="2161394479394250669">Annuler la tâche d'impression</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Changer de disposition</translation> <translation id="225692081236532131">État d'activation</translation> <translation id="2271469253353559191">Programmation du mode sombre</translation> +<translation id="2275586345903859204">La réparation est terminée</translation> <translation id="2287186687001756809">Aucune image disponible. Pour ajouter des photos, accédez à <ph name="LINK" /></translation> <translation id="2307344026739914387">Utiliser la paire de clés actuelle</translation> <translation id="2320295602967756579">Activer le thème clair</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Activer le mode couleur sombre</translation> <translation id="2740531572673183784">OK</translation> <translation id="2751739896257479635">Authentification EAP phase 2</translation> +<translation id="2756652381241102009">Exécuter le diagnostic</translation> <translation id="2783010256799387990">RÉUSSI</translation> <translation id="2789486458103222910">OK</translation> <translation id="2805756323405976993">Applications</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Connexion</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> : redémarrage…</translation> +<translation id="4415951057168511744">Avatar actuel</translation> <translation id="4425149324548788773">Mon Drive</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> désactivé</translation> <translation id="4429881212383817840">Le ticket Kerberos arrive bientôt à expiration</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Accès parental</translation> <translation id="473775607612524610">Mettre à jour</translation> <translation id="4744944742468440486">Informations sur le texte sélectionné</translation> +<translation id="4751272708893364980">Voir les journaux ARM</translation> <translation id="4773299976671772492">Interrompu</translation> <translation id="4774530504324923332">Vous aurez besoin d'une clé de sécurité compatible RSU (RMA Server Unlock ou "déverrouillage du serveur RMA"), d'un lecteur de code QR et d'un deuxième appareil avec une connexion Internet</translation> <translation id="4782311465517282004">Obtenez des définitions, des traductions ou des conversions d'unités lorsque vous effectuez un clic droit ou appuyez de manière prolongée sur du texte</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Réseau Wi-Fi non sécurisé</translation> <translation id="5376354385557966694">Mode clair automatique</translation> <translation id="537872351913703572">L'appareil sera transféré à un autre utilisateur ou à une autre organisation</translation> +<translation id="5389224261615877010">Arc-en-ciel</translation> <translation id="5395600419410242651">Effacer toutes les données</translation> <translation id="5400907029458559844">L'appareil se connecte.</translation> <translation id="5401938042319910061">Exécuter toutes les routines</translation> +<translation id="5406131354638931058">Désactivez la batterie des appareils expédiés ou stockés</translation> <translation id="5423849171846380976">Activé</translation> <translation id="5430931332414098647">Partage de connexion instantané</translation> <translation id="5431318178759467895">Couleur</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Fichier introuvable</translation> <translation id="5939518447894949180">Réinitialiser</translation> <translation id="594552776027197022">Générer une paire de clés aléatoire</translation> +<translation id="5951259522948394825">Vérifiez que tout est au bon endroit et consultez le rapport de diagnostic</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Fond d'écran par défaut</translation> <translation id="6017514345406065928">Vert</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTE Advanced</translation> <translation id="8143951647992294073">Sélectionnez <ph name="TOPIC_SOURCE" /> - <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Entrée</translation> +<translation id="819552138404104974">Journaux RMA</translation> <translation id="8206859287963243715">Mobile</translation> <translation id="8208861521865154048">Avantages</translation> <translation id="8217675307824400706">Se connecter</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Mode sombre automatique</translation> <translation id="8461329675984532579">Nom du fournisseur personnel</translation> <translation id="8467104829907989997">Calibrage des composants…</translation> +<translation id="8474030592808010086">Débranchez l'appareil pour désactiver la batterie</translation> <translation id="8475690821716466388">Le réseau Wi-Fi est protégé par le protocole peu sécurisé WEP PSK</translation> <translation id="8477551185774834963">Seuil de latence autorisé légèrement dépassé par le DNS</translation> <translation id="8483248364096924578">Adresse IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Intensité du signal</translation> <translation id="8910721771319628100">Seuil de latence dépassé pour le réseau par défaut</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Consultez les problèmes résolus</translation> <translation id="8919837981463578619">Échec – Bac à papier manquant</translation> <translation id="8923267550422472772">Jour du mois de la réinitialisation</translation> <translation id="8928727111548978589">Échec – À court de papier</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb index bac96e4..578afaf 100644 --- a/chromeos/strings/chromeos_strings_gl.xtb +++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">VPN de Android</translation> <translation id="131461803491198646">Rede doméstica, sen itinerancia</translation> <translation id="1327977588028644528">Pasarela</translation> +<translation id="1328223165223065150">Cor do fondo de pantalla</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Axustar á zona de escaneo</translation> <translation id="1367951781824006909">Selecciona un ficheiro</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Fonte da imaxe</translation> <translation id="1451536289672181509">O dispositivo é un teclado.</translation> <translation id="1459693405370120464">O tempo</translation> +<translation id="1459784442280469416">Gardar na unidade USB</translation> <translation id="1468664791493211953">Ofertas</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> xestiona este dispositivo e pode supervisar a túa actividade.</translation> <translation id="1478594628797167447">Escáner</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> xestiona este usuario, e pode axustar a súa configuración e supervisar a súa actividade de forma remota.</translation> <translation id="150962533380566081">O PUK non é válido.</translation> <translation id="1510238584712386396">Menú de aplicacións</translation> +<translation id="1512982610995527443">O dispositivo apagarase dentro de 5 segundos</translation> +<translation id="1522984060396982789">Reparouse correctamente. Podes apagar o dispositivo ou tomar medidas adicionais.</translation> <translation id="152892567002884378">Sube o volume</translation> <translation id="1555130319947370107">Azul</translation> <translation id="155865706765934889">Panel táctil</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Revisión do hardware</translation> <translation id="1905710495812624430">Superouse o número máximo de intentos.</translation> <translation id="1908234395526491708">Erros nas solicitudes de UDP</translation> +<translation id="1932611479324127242">Desconectar batería</translation> <translation id="1947737735496445907">Impreso</translation> <translation id="1951012854035635156">Asistente</translation> <translation id="1977994649430373166">Foto do perfil de Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Flotación</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" /> %</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> fotos</translation> +<translation id="2154739667870063220">Reiniciar</translation> <translation id="2157959690810728433">EN COLA</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: tentar de novo</translation> <translation id="2161394479394250669">Cancelar traballo de impresión</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Alternar entre deseños</translation> <translation id="225692081236532131">Estado de activación</translation> <translation id="2271469253353559191">Modo escuro programado</translation> +<translation id="2275586345903859204">Completouse a reparación</translation> <translation id="2287186687001756809">Non hai ningunha imaxe dispoñible. Para engadir fotos, vai a <ph name="LINK" /></translation> <translation id="2307344026739914387">Usar par de claves actual</translation> <translation id="2320295602967756579">Activar tema claro</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Activar modo de cores escuras</translation> <translation id="2740531572673183784">Aceptar</translation> <translation id="2751739896257479635">Autenticación de fase 2 de EAP</translation> +<translation id="2756652381241102009">Executar diagnóstico</translation> <translation id="2783010256799387990">PROBA SUPERADA</translation> <translation id="2789486458103222910">Aceptar</translation> <translation id="2805756323405976993">Aplicacións</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Conectando...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Reiniciando dispositivo (<ph name="DEVICE_NAME" />)</translation> +<translation id="4415951057168511744">Avatar actual</translation> <translation id="4425149324548788773">A miña unidade</translation> <translation id="4428374560396076622">A rede <ph name="NETWORK_NAME" /> está desactivada</translation> <translation id="4429881212383817840">O tícket de Kerberos caduca pronto</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Acceso parental</translation> <translation id="473775607612524610">Actualizar</translation> <translation id="4744944742468440486">Información relacionada coa túa selección</translation> +<translation id="4751272708893364980">Ver rexistros de autorización de devolución de mercadoría</translation> <translation id="4773299976671772492">Detido</translation> <translation id="4774530504324923332">Vas precisar unha chave de seguranza co RSU activado, un escáner de códigos QR e outro dispositivo con conexión a Internet</translation> <translation id="4782311465517282004">Obtén definicións, traducións ou conversións de unidades cando fagas clic co botón dereito sobre un texto ou o manteñas premido</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">A rede wifi non é segura</translation> <translation id="5376354385557966694">Modo claro automático</translation> <translation id="537872351913703572">O dispositivo utilizarao un usuario ou unha organización diferente</translation> +<translation id="5389224261615877010">Arco da vella</translation> <translation id="5395600419410242651">Borrar todos os datos</translation> <translation id="5400907029458559844">O dispositivo estase conectando.</translation> <translation id="5401938042319910061">Executar todas as rutinas</translation> +<translation id="5406131354638931058">Desconecta a batería dos dispositivos que se van enviar ou almacenar</translation> <translation id="5423849171846380976">Activado</translation> <translation id="5430931332414098647">Conexión compartida instantánea</translation> <translation id="5431318178759467895">Cor</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Non se encontrou o ficheiro</translation> <translation id="5939518447894949180">Restablecer</translation> <translation id="594552776027197022">Xerar par de claves aleatorio</translation> +<translation id="5951259522948394825">Confirma que todo está correcto e consulta o informe de diagnóstico</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Fondo de pantalla predeterminado</translation> <translation id="6017514345406065928">Verde</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Seleccionar <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Intro</translation> +<translation id="819552138404104974">Rexistros de autorización de devolución de mercadoría</translation> <translation id="8206859287963243715">Móbil</translation> <translation id="8208861521865154048">Vantaxes</translation> <translation id="8217675307824400706">Conéctate</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Modo escuro automático</translation> <translation id="8461329675984532579">Nome do fornecedor de orixe</translation> <translation id="8467104829907989997">Calibrando compoñentes…</translation> +<translation id="8474030592808010086">Desenchufa o dispositivo para desconectar a batería</translation> <translation id="8475690821716466388">A rede wifi está protexida co protocolo WEP PSK, que non é moi seguro</translation> <translation id="8477551185774834963">A latencia do DNS supera lixeiramente o límite permitido</translation> <translation id="8483248364096924578">Enderezo IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Intensidade do sinal</translation> <translation id="8910721771319628100">A rede predeterminada supera o límite de latencia</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Consulta o que se corrixiu</translation> <translation id="8919837981463578619">Produciuse un erro: falta a bandexa</translation> <translation id="8923267550422472772">Día do mes no que debe restablecerse o uso de datos</translation> <translation id="8928727111548978589">Produciuse un erro: a impresora quedou sen papel</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index 1fc31c9..1c37555 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Matična mreža, bez roaminga</translation> <translation id="1327977588028644528">Pristupnik</translation> +<translation id="1328223165223065150">Boja pozadine</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Prilagodi području skeniranja</translation> <translation id="1367951781824006909">Odaberite datoteku</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Izvor slike</translation> <translation id="1451536289672181509">Uređaj je tipkovnica.</translation> <translation id="1459693405370120464">Vrijeme</translation> +<translation id="1459784442280469416">Spremi na USB</translation> <translation id="1468664791493211953">Ponude</translation> <translation id="1476467821656042872">Uređajem upravlja <ph name="MANAGER" /> i taj upravitelj možda može nadzirati vašu aktivnost.</translation> <translation id="1478594628797167447">Skener</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> upravlja ovim korisnikom i možda može daljinski upravljati postavkama i nadzirati aktivnost korisnika.</translation> <translation id="150962533380566081">PUK nije važeći.</translation> <translation id="1510238584712386396">Pokretač</translation> +<translation id="1512982610995527443">Uređaj će se isključiti za pet sekundi</translation> +<translation id="1522984060396982789">Popravak je uspio. Možete isključiti uređaj ili poduzeti dodatne mjere.</translation> <translation id="152892567002884378">Pojačavanje glasnoće</translation> <translation id="1555130319947370107">Plava</translation> <translation id="155865706765934889">Dodirna površina</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Hardverska revizija</translation> <translation id="1905710495812624430">Premašen je maksimalan dopušteni broj pokušaja.</translation> <translation id="1908234395526491708">Neuspješni UDP zahtjevi</translation> +<translation id="1932611479324127242">Isključi bateriju</translation> <translation id="1947737735496445907">Ispisano</translation> <translation id="1951012854035635156">Asistent</translation> <translation id="1977994649430373166">Fotografija Google profila</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Lelujanje</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059">Broj fotografija: <ph name="NUMBER" /></translation> +<translation id="2154739667870063220">Ponovo pokreni</translation> <translation id="2157959690810728433">NA ČEKANJU</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Pokušaj ponovo</translation> <translation id="2161394479394250669">Otkaži zadatak ispisa</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Prekidač rasporeda</translation> <translation id="225692081236532131">Status aktivacije</translation> <translation id="2271469253353559191">Raspored tamnog načina</translation> +<translation id="2275586345903859204">Dovršen je popravak</translation> <translation id="2287186687001756809">Slika nije dostupna. Da biste dodali fotografije, posjetite <ph name="LINK" /></translation> <translation id="2307344026739914387">Upotrijebi trenutačni par ključeva</translation> <translation id="2320295602967756579">Omogućivanje svijetle teme</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Omogućite način tamne boje</translation> <translation id="2740531572673183784">U redu</translation> <translation id="2751739896257479635">2. faza autentifikacije za EAP</translation> +<translation id="2756652381241102009">Pokrenite dijagnostiku</translation> <translation id="2783010256799387990">USPJEŠNO</translation> <translation id="2789486458103222910">U redu</translation> <translation id="2805756323405976993">Aplikacije</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Povezivanje...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Ponovno pokretanje: <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Trenutačni avatar</translation> <translation id="4425149324548788773">Moj disk</translation> <translation id="4428374560396076622">Isključena je <ph name="NETWORK_NAME" /> mreža</translation> <translation id="4429881212383817840">Kerberosov tiket uskoro istječe</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Roditeljski pristup</translation> <translation id="473775607612524610">Ažuriraj</translation> <translation id="4744944742468440486">Informacije o vašem odabiru</translation> +<translation id="4751272708893364980">Prikaži RMA zapisnike</translation> <translation id="4773299976671772492">Zaustavljeno</translation> <translation id="4774530504324923332">Trebat će vam sigurnosni ključ omogućen za RSU, čitač QR koda i drugi uređaj s internetskom vezom</translation> <translation id="4782311465517282004">Pronađite definicije, prijevode ili pretvorbe jedinica kada tekst kliknete desnom tipkom ili ga dodirnete i držite</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Wi-Fi mreža nije sigurna</translation> <translation id="5376354385557966694">Automatski svijetli način</translation> <translation id="537872351913703572">Uređaj će se vratiti drugom korisniku ili organizaciji</translation> +<translation id="5389224261615877010">Duga</translation> <translation id="5395600419410242651">Izbriši sve podatke</translation> <translation id="5400907029458559844">Uređaj se povezuje.</translation> <translation id="5401938042319910061">Pokreni sve rutine</translation> +<translation id="5406131354638931058">Izvršite isključivanje baterije za uređaje koji se otpremaju ili pohranjuju</translation> <translation id="5423849171846380976">Aktivirano</translation> <translation id="5430931332414098647">Automatsko modemsko povezivanje</translation> <translation id="5431318178759467895">Boja</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Datoteka nije pronađena</translation> <translation id="5939518447894949180">Ponovno postavi</translation> <translation id="594552776027197022">Generiraj nasumični par ključeva</translation> +<translation id="5951259522948394825">Potvrdite da se sve nalazi na ispravnom mjestu i pregledajte izvješće o dijagnostici</translation> <translation id="5972388717451707488">Ažuriraj alat</translation> <translation id="5984145644188835034">Zadana pozadina</translation> <translation id="6017514345406065928">Zelena</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Odaberite <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA zapisnici</translation> <translation id="8206859287963243715">Mobitel</translation> <translation id="8208861521865154048">Pogodnosti</translation> <translation id="8217675307824400706">Povežite se</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Automatski tamni način</translation> <translation id="8461329675984532579">Naziv davatelja usluge kućne mreže</translation> <translation id="8467104829907989997">Kalibriranje komponenti...</translation> +<translation id="8474030592808010086">Isključite uređaj da biste izvršili isključivanje baterije</translation> <translation id="8475690821716466388">Wi-Fi mreža zaštićena je slabim protokolom WEP PSK</translation> <translation id="8477551185774834963">Latencija DNS-a malo iznad dopuštenog praga</translation> <translation id="8483248364096924578">IP adresa</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Jakost signala</translation> <translation id="8910721771319628100">Zadana mreža iznad praga latencije</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> – <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">Pogledajte što je popravljeno</translation> <translation id="8919837981463578619">Nije uspjelo – nema ladice</translation> <translation id="8923267550422472772">Dan u mjesecu za poništavanje</translation> <translation id="8928727111548978589">Nije uspjelo – nema papira</translation>
diff --git a/chromeos/strings/chromeos_strings_hy.xtb b/chromeos/strings/chromeos_strings_hy.xtb index 1d9e427..52171ce 100644 --- a/chromeos/strings/chromeos_strings_hy.xtb +++ b/chromeos/strings/chromeos_strings_hy.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Տնային ցանց, առանց ռոումինգի</translation> <translation id="1327977588028644528">Անցուղի</translation> +<translation id="1328223165223065150">Պաստառի գույն</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Տեղավորել սկանավորվող հատվածում</translation> <translation id="1367951781824006909">Ընտրել ֆայլ</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Պատկերի աղբյուրը</translation> <translation id="1451536289672181509">Սարքը ստեղնաշար է։</translation> <translation id="1459693405370120464">Եղանակ</translation> +<translation id="1459784442280469416">Պահել USB կրիչի վրա</translation> <translation id="1468664791493211953">Առաջարկներ</translation> <translation id="1476467821656042872">Այս սարքը կառավարվում է <ph name="MANAGER" />-ի կողմից, և վերջինս կարող է տեսնել ձեր գործողությունները։</translation> <translation id="1478594628797167447">Սկաներ</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732">Այս օգտատերը կառավարվում է <ph name="MANAGER" />-ի կողմից, և վերջինս նաև կարող է հեռակա կառավարել կարգավորումներն ու վերահսկել օգտատիրոջ գործողությունները։</translation> <translation id="150962533380566081">Անվավեր PUK:</translation> <translation id="1510238584712386396">Գործարկիչ</translation> +<translation id="1512982610995527443">Սարքը 5 վայրկյանից կանջատվի</translation> +<translation id="1522984060396982789">Նորոգումն ավարտված է։ Դուք կարող անջատել սարքը կամ կատարել լրացուցիչ գործողություններ։</translation> <translation id="152892567002884378">Բարձրացնել ձայնը</translation> <translation id="1555130319947370107">Կապույտ</translation> <translation id="155865706765934889">Հպահարթակ</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Սարքի տարբերակը</translation> <translation id="1905710495812624430">Փորձերի առավելագույն թույլատրելի քանակը սպառվել է:</translation> <translation id="1908234395526491708">Ձախողված UDP հարցումներ</translation> +<translation id="1932611479324127242">Անջատել մարտկոցը</translation> <translation id="1947737735496445907">Տպված է</translation> <translation id="1951012854035635156">Օգնական</translation> <translation id="1977994649430373166">Google պրոֆիլի լուսանկար</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Տատանումներ</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> լուսանկար</translation> +<translation id="2154739667870063220">Վերաբեռնել</translation> <translation id="2157959690810728433">ՀԵՐԹԱԳՐՎԱԾ Է</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />՝ նորից փորձել</translation> <translation id="2161394479394250669">Չեղարկել տպման առաջադրանքը</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Դասավորության փոխանջատիչ</translation> <translation id="225692081236532131">Ակտիվացման կարգավիճակը</translation> <translation id="2271469253353559191">Մուգ ռեժիմի ժամանակացույց</translation> +<translation id="2275586345903859204">Վերանորոգումն ավարտված է</translation> <translation id="2287186687001756809">Ոչ մի պատկեր չկա։ Լուսանկարներ ավելացնելու համար անցեք <ph name="LINK" />։</translation> <translation id="2307344026739914387">Օգտագործել ընթացիկ բանալիների զույգը</translation> <translation id="2320295602967756579">Միացնել բաց թեման</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Միացնել մուգ գույների ռեժիմը</translation> <translation id="2740531572673183784">Եղավ</translation> <translation id="2751739896257479635">EAP նույնականացման փուլ 2</translation> +<translation id="2756652381241102009">Գործարկել դիագնոստիկան</translation> <translation id="2783010256799387990">ԱՆՑԱԾ Է</translation> <translation id="2789486458103222910">Եղավ</translation> <translation id="2805756323405976993">Հավելվածներ</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Միացում…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> սարքը վերագործարկվում է</translation> +<translation id="4415951057168511744">Ընթացիկ ավատարը</translation> <translation id="4425149324548788773">Իմ դրայվը</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" />-ն անջատված է</translation> <translation id="4429881212383817840">Kerberos տոմսի գործողության ժամկետը շուտով կսպառվի</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Ծնողի մուտք</translation> <translation id="473775607612524610">Թարմացնել</translation> <translation id="4744944742468440486">Տեղեկություններ ձեր ընտրության վերաբերյալ</translation> +<translation id="4751272708893364980">Տեսնել RMA մատյանները</translation> <translation id="4773299976671772492">Դադարեցված է</translation> <translation id="4774530504324923332">Ձեզ անհրաժեշտ է RSU աջակցող անվտանգության բանալի, QR կոդերի սկաներ և երկրորդ սարք՝ ինտերնետ կապով</translation> <translation id="4782311465517282004">Ստացեք սահմանումներ, թարգմանություններ կամ չափման միավորների փոխարկումներ՝ տեքստի վրա մկնիկի աջ կոճակը սեղմելով կամ տեքստին հպել և պահելով։</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Wi-Fi ցանցն անվտանգ չէ</translation> <translation id="5376354385557966694">Ավտոմատ բաց ռեժիմ</translation> <translation id="537872351913703572">Սարքը կփոխանցվի այլ օգտատիրոջ կամ կազմակերպության</translation> +<translation id="5389224261615877010">Ծիածան</translation> <translation id="5395600419410242651">Ջնջել բոլոր տվյալները</translation> <translation id="5400907029458559844">Սարքը միանում է։</translation> <translation id="5401938042319910061">Գործարկել բոլոր հերթականությունները</translation> +<translation id="5406131354638931058">Անջատել առաքվող կամ պահեստավորվող սարքերի մարտկոցները</translation> <translation id="5423849171846380976">Ակտիվացված է</translation> <translation id="5430931332414098647">Անկթարթային մուտքի կետ</translation> <translation id="5431318178759467895">Գունավոր</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Ֆայլը չի գտնվել</translation> <translation id="5939518447894949180">Վերակայել</translation> <translation id="594552776027197022">Ստեղծել պատահական բանալիների զույգ</translation> +<translation id="5951259522948394825">Թույլ է տալիս համոզվել, որ ամեն ինչ կարգին է, և դիտել դիագնոստիկայի հաշվետվությունը։</translation> <translation id="5972388717451707488">UpdateEngine</translation> <translation id="5984145644188835034">Կանխադրված պաստառ</translation> <translation id="6017514345406065928">Կանաչ</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Ընտրել «<ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" />» տարբերակը</translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA մատյաններ</translation> <translation id="8206859287963243715">Բջջային</translation> <translation id="8208861521865154048">Բոնուսներ</translation> <translation id="8217675307824400706">Միացեք ցանցին</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Ավոտմատ մուգ ռեժիմ</translation> <translation id="8461329675984532579">Տան ծառայությունների մատակարարի անունը</translation> <translation id="8467104829907989997">Բաղադրիչների չափաբերում…</translation> +<translation id="8474030592808010086">Մարտկոցն անջատելու համար սարքն անջատեք հոսանքից։</translation> <translation id="8475690821716466388">Wi-Fi ցանցը պաշտպանված է WEP PSK թույլ հաղորդակարգով</translation> <translation id="8477551185774834963">DNS-ի հապաղումը փոքր առավելություն ունի թույլատրելի սահմանափակման նկատմամբ</translation> <translation id="8483248364096924578">IP հասցե</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Ազդանշանի հզորությունը</translation> <translation id="8910721771319628100">Կանխադրված ցանցը հապաղման սահմանափակման նկատմամբ առավելություն ունի</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> (<ph name="GIVEN_NAME" />)</translation> +<translation id="8919792139048574232">Թույլ է տալիս տեսնել շտկումները</translation> <translation id="8919837981463578619">Չհաջողվեց տպել – Դարակը բացակայում է</translation> <translation id="8923267550422472772">Ամսվա օրը, երբ տեղեկությունները պետք է զրոյացվեն</translation> <translation id="8928727111548978589">Չհաջողվեց տպել – Թուղթը սպառվել է</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb index dab7ef2..e1886db 100644 --- a/chromeos/strings/chromeos_strings_id.xtb +++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">VPN Android</translation> <translation id="131461803491198646">Jaringan asal, tidak dalam jelajah</translation> <translation id="1327977588028644528">Gerbang</translation> +<translation id="1328223165223065150">Warna wallpaper</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Sesuaikan dengan area pindai</translation> <translation id="1367951781824006909">Pilih file</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Sumber gambar</translation> <translation id="1451536289672181509">Perangkat adalah keyboard.</translation> <translation id="1459693405370120464">Cuaca</translation> +<translation id="1459784442280469416">Simpan ke USB</translation> <translation id="1468664791493211953">Penawaran</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> akan mengelola perangkat ini dan mungkin dapat memantau aktivitas Anda.</translation> <translation id="1478594628797167447">Pemindai</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> akan mengelola pengguna ini serta mungkin dapat mengelola setelan dan memantau aktivitas pengguna dari jarak jauh.</translation> <translation id="150962533380566081">PUK tidak valid.</translation> <translation id="1510238584712386396">Peluncur</translation> +<translation id="1512982610995527443">Perangkat akan dimatikan dalam 5 detik</translation> +<translation id="1522984060396982789">Perbaikan Anda berhasil. Anda dapat mematikan perangkat atau melakukan beberapa tindakan tambahan.</translation> <translation id="152892567002884378">Mengeraskan volume</translation> <translation id="1555130319947370107">Biru</translation> <translation id="155865706765934889">Touchpad</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Revisi hardware</translation> <translation id="1905710495812624430">Melebihi batas percobaan maksimum yang diizinkan.</translation> <translation id="1908234395526491708">Kegagalan permintaan UDP</translation> +<translation id="1932611479324127242">Penonaktifan baterai internal</translation> <translation id="1947737735496445907">Tercetak</translation> <translation id="1951012854035635156">Asisten</translation> <translation id="1977994649430373166">Foto profil Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Bergerak mengambang</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> foto</translation> +<translation id="2154739667870063220">Mulai ulang</translation> <translation id="2157959690810728433">DALAM ANTREAN</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Coba lagi</translation> <translation id="2161394479394250669">Batalkan tugas pencetakan</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Beralih tata letak</translation> <translation id="225692081236532131">Status aktivasi</translation> <translation id="2271469253353559191">Jadwal mode gelap</translation> +<translation id="2275586345903859204">Perbaikan selesai</translation> <translation id="2287186687001756809">Foto tidak tersedia. Untuk menambahkan foto, buka <ph name="LINK" /></translation> <translation id="2307344026739914387">Gunakan pasangan kunci saat ini</translation> <translation id="2320295602967756579">Aktifkan tema terang</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Aktifkan mode warna gelap</translation> <translation id="2740531572673183784">Oke</translation> <translation id="2751739896257479635">Autentikasi tahap 2 EAP</translation> +<translation id="2756652381241102009">Jalankan Diagnosis</translation> <translation id="2783010256799387990">LULUS</translation> <translation id="2789486458103222910">Oke</translation> <translation id="2805756323405976993">Apl</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Menghubungkan...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Memulai ulang <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Avatar Saat Ini</translation> <translation id="4425149324548788773">Drive Saya</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> nonaktif</translation> <translation id="4429881212383817840">Masa berlaku tiket Kerberos segera berakhir</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Akses orang tua</translation> <translation id="473775607612524610">Perbarui</translation> <translation id="4744944742468440486">Info terkait pilihan Anda</translation> +<translation id="4751272708893364980">Lihat log RMA</translation> <translation id="4773299976671772492">Dihentikan</translation> <translation id="4774530504324923332">Anda memerlukan kunci keamanan berkemampuan RSU, pemindai kode QR, dan perangkat kedua dengan koneksi internet</translation> <translation id="4782311465517282004">Dapatkan definisi, terjemahan, atau konversi unit saat Anda mengklik kanan atau menyentuh lama teks</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Jaringan Wi-Fi tidak aman</translation> <translation id="5376354385557966694">Mode terang otomatis</translation> <translation id="537872351913703572">Perangkat akan digunakan oleh organisasi atau pengguna yang berbeda</translation> +<translation id="5389224261615877010">Pelangi</translation> <translation id="5395600419410242651">Hapus semua data</translation> <translation id="5400907029458559844">Perangkat sedang menghubungkan.</translation> <translation id="5401938042319910061">Jalankan Semua Rutinitas</translation> +<translation id="5406131354638931058">Menonaktifkan baterai internal untuk perangkat yang dikirim atau disimpan</translation> <translation id="5423849171846380976">Diaktifkan</translation> <translation id="5430931332414098647">Tethering Instan</translation> <translation id="5431318178759467895">Warna</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">File tidak ditemukan</translation> <translation id="5939518447894949180">Reset</translation> <translation id="594552776027197022">Buat pasangan kunci acak</translation> +<translation id="5951259522948394825">Mengonfirmasi bahwa semuanya sudah tepat dan melihat laporan diagnostik</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Wallpaper Default</translation> <translation id="6017514345406065928">Hijau</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Pilih <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Log RMA</translation> <translation id="8206859287963243715">Seluler</translation> <translation id="8208861521865154048">Keuntungan</translation> <translation id="8217675307824400706">Hubungkan</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Mode gelap otomatis</translation> <translation id="8461329675984532579">Nama penyedia rumah</translation> <translation id="8467104829907989997">Mengalibrasikan komponen ...</translation> +<translation id="8474030592808010086">Cabut perangkat dari sumber listrik untuk menonaktifkan baterai internal</translation> <translation id="8475690821716466388">Jaringan Wi-Fi diamankan dengan protokol WEP PSK yang lemah</translation> <translation id="8477551185774834963">Latensi DNS sedikit melebihi ambang batas yang diizinkan</translation> <translation id="8483248364096924578">Alamat IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Kekuatan sinyal</translation> <translation id="8910721771319628100">Jaringan default melebihi ambang batas latensi</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Melihat apa saja yang telah diperbaiki</translation> <translation id="8919837981463578619">Gagal - Tidak ada baki</translation> <translation id="8923267550422472772">Tanggal reset</translation> <translation id="8928727111548978589">Gagal - Kertas habis</translation>
diff --git a/chromeos/strings/chromeos_strings_is.xtb b/chromeos/strings/chromeos_strings_is.xtb index 0c6ece18..10ff9e9 100644 --- a/chromeos/strings/chromeos_strings_is.xtb +++ b/chromeos/strings/chromeos_strings_is.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Heimanet, ekki í reiki</translation> <translation id="1327977588028644528">Gátt</translation> +<translation id="1328223165223065150">Veggfóðurslitur</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Laga að skönnunarsvæði</translation> <translation id="1367951781824006909">Velja skrá</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Uppruni myndar</translation> <translation id="1451536289672181509">Tækið er lyklaborð.</translation> <translation id="1459693405370120464">Veður</translation> +<translation id="1459784442280469416">Vista á USB</translation> <translation id="1468664791493211953">Tilboð</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> hefur umsjón með þessu tæki og getur hugsanlega fylgst með því sem þú gerir.</translation> <translation id="1478594628797167447">Skanni</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> hefur umsjón með þessum notanda og getur stjórnað stillingum og skoðað notendavirkni með fjartengingu.</translation> <translation id="150962533380566081">Ógilt PUK-númer.</translation> <translation id="1510238584712386396">Ræsiforrit</translation> +<translation id="1512982610995527443">Tækið slekkur á sér eftir 5 sekúndur</translation> +<translation id="1522984060396982789">Viðgerðin heppnaðist. Þú getur slökkt á tækinu eða gripið til annarra aðgerða.</translation> <translation id="152892567002884378">Hækka hljóð</translation> <translation id="1555130319947370107">Blár</translation> <translation id="155865706765934889">Snertiflötur</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Útgáfa vélbúnaðar</translation> <translation id="1905710495812624430">Farið var yfir hámarksfjölda tilrauna.</translation> <translation id="1908234395526491708">UDP-beiðnir mistókust</translation> +<translation id="1932611479324127242">Slökkva á rafhlöðunni</translation> <translation id="1947737735496445907">Prentað</translation> <translation id="1951012854035635156">Aðstoðarmaður</translation> <translation id="1977994649430373166">Google prófílmynd</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Fljótum hjá</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> myndir</translation> +<translation id="2154739667870063220">Endurræsa</translation> <translation id="2157959690810728433">Í BIÐRÖÐ</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Reyna aftur</translation> <translation id="2161394479394250669">Hætta við prentverk</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Uppsetningarrofi</translation> <translation id="225692081236532131">Virkjunarstaða</translation> <translation id="2271469253353559191">Áætlun dökkrar stillingar</translation> +<translation id="2275586345903859204">Viðgerð er lokið</translation> <translation id="2287186687001756809">Engin mynd tiltæk. Opnaðu <ph name="LINK" /> til að bæta við myndum</translation> <translation id="2307344026739914387">Nota núverandi lyklasett</translation> <translation id="2320295602967756579">Virkja ljóst þema</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Kveikja á dökkri litastillingu</translation> <translation id="2740531572673183784">Í lagi</translation> <translation id="2751739896257479635">Annars stigs EAP-auðkenning</translation> +<translation id="2756652381241102009">Keyra greiningu</translation> <translation id="2783010256799387990">STÓÐST</translation> <translation id="2789486458103222910">Í lagi</translation> <translation id="2805756323405976993">Forrit</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Tengist...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Endurræsir <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Núverandi notandamynd</translation> <translation id="4425149324548788773">Drifið mitt</translation> <translation id="4428374560396076622">Slökkt er á <ph name="NETWORK_NAME" /></translation> <translation id="4429881212383817840">Kerberos-miði rennur út fljótlega</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Foreldraaðgangur</translation> <translation id="473775607612524610">Uppfæra</translation> <translation id="4744944742468440486">Upplýsingar sem tengjast vali þínu</translation> +<translation id="4751272708893364980">Sjá skrár yfir heimildir fyrir vöruskilum</translation> <translation id="4773299976671772492">Stöðvað</translation> <translation id="4774530504324923332">Þú þarft öryggislykil sem studdur er af RSU, QR-kóðaskanna og annað nettengt tæki</translation> <translation id="4782311465517282004">Fáðu skilgreiningar, þýðingar eða umreikninga mæligilda þegar þú hægrismellir eða heldur texta inni</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Wi-Fi net er ekki öruggt</translation> <translation id="5376354385557966694">Sjálfvirk ljós stilling</translation> <translation id="537872351913703572">Tækið verður afhent öðrum notanda eða öðru fyrirtæki</translation> +<translation id="5389224261615877010">Regnbogi</translation> <translation id="5395600419410242651">Eyða öllum gögnum</translation> <translation id="5400907029458559844">Tækið er að tengjast.</translation> <translation id="5401938042319910061">Keyra allar rútínur</translation> +<translation id="5406131354638931058">Slökktu á rafhlöðu tækja sem á að flytja eða geyma</translation> <translation id="5423849171846380976">Virkjuð</translation> <translation id="5430931332414098647">Skynditjóðrun</translation> <translation id="5431318178759467895">Í lit</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Skráin fannst ekki</translation> <translation id="5939518447894949180">Endurstilla</translation> <translation id="594552776027197022">Búa til handahófsvalið lyklasett</translation> +<translation id="5951259522948394825">Staðfestu að allt sé á sínum stað og skoðaðu greiningarskýrsluna</translation> <translation id="5972388717451707488">Uppfæra vél</translation> <translation id="5984145644188835034">Sjálfgefið veggfóður</translation> <translation id="6017514345406065928">Grænn</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Velja <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Skrár yfir heimildir fyrir vöruskilum</translation> <translation id="8206859287963243715">Farsímakerfi</translation> <translation id="8208861521865154048">Fríðindi</translation> <translation id="8217675307824400706">Kominn tími til að tengjast</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Sjálfvirk dökk stilling</translation> <translation id="8461329675984532579">Heiti heimaveitu</translation> <translation id="8467104829907989997">Kvarðar íhluti...</translation> +<translation id="8474030592808010086">Taktu tækið úr sambandi til að slökkva á rafhlöðunni</translation> <translation id="8475690821716466388">Wi-Fi netið er varið með veikum samskiptareglum, WEP PSK</translation> <translation id="8477551185774834963">DNS-biðtími er aðeins yfir leyfðum þröskuldi</translation> <translation id="8483248364096924578">IP-tala</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Sendistyrkur</translation> <translation id="8910721771319628100">Sjálfgefið net er yfir biðþröskuldi</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> – <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">Sjá hvað hefur verið lagfært</translation> <translation id="8919837981463578619">Mistókst – bakka vantar</translation> <translation id="8923267550422472772">Mánaðardagur fyrir endurstillingu</translation> <translation id="8928727111548978589">Mistókst – pappír vantar</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index 6ceceedf3..264b842 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">רשת ביתית, לא בנדידה</translation> <translation id="1327977588028644528">שער</translation> +<translation id="1328223165223065150">צבע הטפט</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">התאמה לאזור הסריקה</translation> <translation id="1367951781824006909">בחירת קובץ</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">מקור התמונה</translation> <translation id="1451536289672181509">המכשיר הוא מקלדת.</translation> <translation id="1459693405370120464">מזג אוויר</translation> +<translation id="1459784442280469416">שמירה בכונן USB</translation> <translation id="1468664791493211953">מבצעים</translation> <translation id="1476467821656042872">הניהול של המכשיר הזה נעשה מהדומיין <ph name="MANAGER" /> וייתכן שאפשר יהיה לעקוב ממנו אחר הפעילות שלך.</translation> <translation id="1478594628797167447">סורק</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732">המשתמש הזה מנוהל על ידי <ph name="MANAGER" />. הדומיין הזה עשוי לנהל מרחוק את ההגדרות ולעקוב אחר פעילות המשתמש.</translation> <translation id="150962533380566081">PUK לא חוקי.</translation> <translation id="1510238584712386396">מרכז האפליקציות</translation> +<translation id="1512982610995527443">המכשיר ייכבה בעוד 5 שניות</translation> +<translation id="1522984060396982789">התיקון הושלם. אפשר לכבות את המכשיר או לבצע פעולות נוספות.</translation> <translation id="152892567002884378">הגברת עוצמת הקול</translation> <translation id="1555130319947370107">כחול</translation> <translation id="155865706765934889">לוח מגע</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">שכתוב חומרה</translation> <translation id="1905710495812624430">חריגה ממספר הניסיונות המרבי המותר.</translation> <translation id="1908234395526491708">בקשות UDP נכשלו</translation> +<translation id="1932611479324127242">ניתוק הסוללה</translation> <translation id="1947737735496445907">הודפסה</translation> <translation id="1951012854035635156">Assistant</translation> <translation id="1977994649430373166">תמונת הפרופיל ב-Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">צפים ונהנים</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> תמונות</translation> +<translation id="2154739667870063220">הפעלה מחדש</translation> <translation id="2157959690810728433">נמצאת בתור</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: ניסיון נוסף</translation> <translation id="2161394479394250669">ביטול משימת ההדפסה</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">מתג הפריסה</translation> <translation id="225692081236532131">סטטוס הפעלה</translation> <translation id="2271469253353559191">תזמון מצב כהה</translation> +<translation id="2275586345903859204">התיקון הסתיים</translation> <translation id="2287186687001756809">אין תמונה זמינה. כדי להוסיף תמונה, צריך לעבור אל <ph name="LINK" /></translation> <translation id="2307344026739914387">שימוש בזוג המפתחות הנוכחי</translation> <translation id="2320295602967756579">הפעלת העיצוב הבהיר</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">הפעלה של מצב כהה</translation> <translation id="2740531572673183784">אישור</translation> <translation id="2751739896257479635">אימות שלב 2 של EAP</translation> +<translation id="2756652381241102009">ביצוע אבחון</translation> <translation id="2783010256799387990">ציון 'עובר'</translation> <translation id="2789486458103222910">אישור</translation> <translation id="2805756323405976993">אפליקציות</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">התחברות...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">מתבצעת הפעלה מחדש של <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">הדמות הנוכחית</translation> <translation id="4425149324548788773">האחסון שלי</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> מושבת</translation> <translation id="4429881212383817840">התוקף של כרטיס Kerberos עומד לפוג בקרוב</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">גישת הורים</translation> <translation id="473775607612524610">עדכון</translation> <translation id="4744944742468440486">מידע בקשר לבחירה שלך</translation> +<translation id="4751272708893364980">הצגת יומני RMA</translation> <translation id="4773299976671772492">הופסק</translation> <translation id="4774530504324923332">יהיה צורך במפתח אבטחה עם תמיכה ב-RSU, סורק קודי QR ומכשיר נוסף עם חיבור לאינטרנט</translation> <translation id="4782311465517282004">בלחיצה ימנית או בלחיצה ארוכה על טקסט, יוצגו הגדרות, תרגומים או המרת יחידות</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">רשת ה-Wi-Fi לא מאובטחת</translation> <translation id="5376354385557966694">מצב בהיר אוטומטי</translation> <translation id="537872351913703572">המכשיר יועבר למשתמש או לארגון אחר</translation> +<translation id="5389224261615877010">קשת</translation> <translation id="5395600419410242651">מחיקת כל הנתונים</translation> <translation id="5400907029458559844">המכשיר בתהליך התחברות.</translation> <translation id="5401938042319910061">הרצה של כל התרחישים</translation> +<translation id="5406131354638931058">כדאי לבצע ניתוק לסוללה במכשירים שנשלחים או מאוחסנים</translation> <translation id="5423849171846380976">מופעל</translation> <translation id="5430931332414098647">שיתוף אינטרנט מיידי בין ניידים</translation> <translation id="5431318178759467895">צבע</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">הקובץ לא נמצא</translation> <translation id="5939518447894949180">איפוס</translation> <translation id="594552776027197022">יצירת זוג מפתחות רנדומלי</translation> +<translation id="5951259522948394825">בדיקה שהכול תקין והצגה של דוח האבחון</translation> <translation id="5972388717451707488">עדכון המנוע</translation> <translation id="5984145644188835034">הטפט המוגדר כברירת מחדל</translation> <translation id="6017514345406065928">ירוק</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">בחירת <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">יומני RMA</translation> <translation id="8206859287963243715">סלולארי</translation> <translation id="8208861521865154048">הטבות</translation> <translation id="8217675307824400706">התחברות</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">מצב כהה אוטומטי</translation> <translation id="8461329675984532579">שם ספק ביתי</translation> <translation id="8467104829907989997">מתבצע כיול רכיבים…</translation> +<translation id="8474030592808010086">יש לנתק את הכבל מהמכשיר כדי לבצע ניתוק לסוללה</translation> <translation id="8475690821716466388">רשת ה-Wi-Fi מאובטחת בפרוטוקול WEP PSK חלש</translation> <translation id="8477551185774834963">זמן האחזור של ה-DNS חורג מעט מהסף המותר</translation> <translation id="8483248364096924578">כתובת IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">עוצמת אות</translation> <translation id="8910721771319628100">רשת ברירת המחדל חורגת מסף זמן האחזור</translation> <translation id="8918637186205009138">ה-<ph name="DEVICE_TYPE" /> של <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">הצגת התיקונים שבוצעו</translation> <translation id="8919837981463578619">נכשלה – המגש לא נמצא</translation> <translation id="8923267550422472772">היום בחודש לאיפוס</translation> <translation id="8928727111548978589">נכשלה – הנייר נגמר</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb index 481cc39..f9ed0b0 100644 --- a/chromeos/strings/chromeos_strings_ka.xtb +++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">სახლის ქსელი, როუმინგის გარეშე</translation> <translation id="1327977588028644528">შლიუზი</translation> +<translation id="1328223165223065150">ფონის ფერი</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">სკანირებად არეზე მორგება</translation> <translation id="1367951781824006909">აირჩიეთ ფაილი</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">სურათის წყარო</translation> <translation id="1451536289672181509">მოწყობილობა არის კლავიატურა.</translation> <translation id="1459693405370120464">ამინდი</translation> +<translation id="1459784442280469416">USB-ში შენახვა</translation> <translation id="1468664791493211953">შემოთავაზებები</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> მართავს ამ მოწყობილობას და შეუძლია თქვენი აქტივობის მონიტორინგი.</translation> <translation id="1478594628797167447">სკანერი</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732">ამ მომხმარებელს მართავს <ph name="MANAGER" />, რომელსაც შეუძლია პარამეტრების დისტანციურად მართვა და მომხმარებლის აქტივობის მონიტორინგი.</translation> <translation id="150962533380566081">PUK კოდი არასწორია.</translation> <translation id="1510238584712386396">გამშვები</translation> +<translation id="1512982610995527443">მოწყობილობა გამოირთვება 5 წამში</translation> +<translation id="1522984060396982789">შეკეთება წარმატებით დასრულდა. შეგიძლიათ გამორთოთ მოწყობილობა ან დამატებითი ზომები მიიღოთ.</translation> <translation id="152892567002884378">ხმის აწევა</translation> <translation id="1555130319947370107">ლურჯი</translation> <translation id="155865706765934889">Touchpad</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">აპარატურის ვერსია</translation> <translation id="1905710495812624430">გადაჭარბებულია მცდელობათა მაქსიმალური რაოდენობა.</translation> <translation id="1908234395526491708">წარუმატებელი UDP მოთხოვნები</translation> +<translation id="1932611479324127242">ბარატერის გათიშვის პროცედურა</translation> <translation id="1947737735496445907">დაბეჭდილი</translation> <translation id="1951012854035635156">ასისტენტი</translation> <translation id="1977994649430373166">Google პროფილის ფოტო</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">ლივლივი</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> ფოტო</translation> +<translation id="2154739667870063220">გადატვირთვა</translation> <translation id="2157959690810728433">რიგშია</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: ხელახლა ცდა</translation> <translation id="2161394479394250669">ბეჭდვის დავალების გაუქმება</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">განლაგების გადართვა</translation> <translation id="225692081236532131">აქტივაციის სტატუსი</translation> <translation id="2271469253353559191">მუქი რეჟიმის განრიგი</translation> +<translation id="2275586345903859204">შეკეთება დასრულდა</translation> <translation id="2287186687001756809">სურათი მიუწვდომელია. ფოტოების დასამატებლად გადადით აქ: <ph name="LINK" /></translation> <translation id="2307344026739914387">ამჟამინდელი წყვილის გამოყენება</translation> <translation id="2320295602967756579">ღია თემის ჩართვა</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">მუქი ფერის რეჟიმის ჩართვა</translation> <translation id="2740531572673183784">კარგი</translation> <translation id="2751739896257479635">EAP ავტორიზაციის მე-2 ფაზა</translation> +<translation id="2756652381241102009">დიაგნოსტიკის გაშვება</translation> <translation id="2783010256799387990">გავლილია</translation> <translation id="2789486458103222910">კარგი</translation> <translation id="2805756323405976993">პროგრამები</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">დაკავშირება…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">მიმდინარეობს <ph name="DEVICE_NAME" />-ის გადატვირთვა</translation> +<translation id="4415951057168511744">ამჟამინდელი ავატარი</translation> <translation id="4425149324548788773">ჩემი Drive</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> გამორთულია</translation> <translation id="4429881212383817840">Kerberos ბილეთის მოქმედების ვადა მალე იწურება</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">მშობლის წვდომა</translation> <translation id="473775607612524610">განახლება</translation> <translation id="4744944742468440486">თქვენს არჩევანთან დაკავშირებული ინფორმაცია</translation> +<translation id="4751272708893364980">RMA ჟურნალების ნახვა</translation> <translation id="4773299976671772492">შეწყვეტილია</translation> <translation id="4774530504324923332">დაგჭირდებათ RSU-იანი უსაფრთხოების გასაღები, QR კოდების სკანერი და მეორე მოწყობილობა ინტერნეტთან კავშირით</translation> <translation id="4782311465517282004">მიიღეთ განმარტებები, თარგმნეთ ან გადაიყვანეთ საზომი ერთეულები ტექსტზე მარჯვენა დაწკაპუნების ან ხანგრძლივად შეხების მეშვეობით</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Wi-Fi ქსელი არ არის დაცული</translation> <translation id="5376354385557966694">ავტომატური ღია რეჟიმი</translation> <translation id="537872351913703572">მოწყობილობას სხვა მომხმარებელი ან ორგანიზაცია მიიღებს</translation> +<translation id="5389224261615877010">ცისარტყელისფერი</translation> <translation id="5395600419410242651">ყველა მონაცემის ამოშლა</translation> <translation id="5400907029458559844">მოწყობილობა უკავშირდება.</translation> <translation id="5401938042319910061">ყველა რუტინის გაშვება</translation> +<translation id="5406131354638931058">შეასრულეთ ბარატერის გათიშვის პროცედურა მოწყობილობებისთვის, რომელთა ტრანსპორტირებას ან შენახვას აპირებთ</translation> <translation id="5423849171846380976">გააქტიურებულია</translation> <translation id="5430931332414098647">მყისიერი ტეტერინგი</translation> <translation id="5431318178759467895">ფერი</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">ფაილი ვერ მოიძებნა</translation> <translation id="5939518447894949180">გადატვირთვა</translation> <translation id="594552776027197022">გასაღებთა შემთხვევითი წყვილის შექმნა</translation> +<translation id="5951259522948394825">დაადასტურეთ, რომ ყველაფერი თავის ადგილზეა და გაეცანით დიაგნოსტიკურ ანგარიშს</translation> <translation id="5972388717451707488">ძრავას განახლება</translation> <translation id="5984145644188835034">ნაგულისხმევი ფონი</translation> <translation id="6017514345406065928">მწვანე</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">აირჩიეთ <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA ჟურნალები</translation> <translation id="8206859287963243715">ფიჭური</translation> <translation id="8208861521865154048">ბონუსები</translation> <translation id="8217675307824400706">დაამყარეთ კავშირი</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">ავტომატური მუქი რეჟიმი</translation> <translation id="8461329675984532579">ადგილობრივი პროვაიდერის სახელი</translation> <translation id="8467104829907989997">მიმდინარეობს კომპონენტების კალიბრაცია...</translation> +<translation id="8474030592808010086">ბატარეის გათიშვის პროცედურის შესასრულებლად გამოაერთეთ მოწყობილობა</translation> <translation id="8475690821716466388">Wi-Fi ქსელი უზრუნველყოფილია სუსტი პროტოკოლით WEP PSK</translation> <translation id="8477551185774834963">DNS-ის რეაგირების დრო ოდნავ აღემატება დასაშვებ ზღვარს</translation> <translation id="8483248364096924578">IP მისამართი</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">სიგნალის სიძლიერე</translation> <translation id="8910721771319628100">ნაგულისხმევი ქსელი აღემატება რეაგირების დროის ზღვარს</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />-ის <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">შეიტყვეთ, რა შესწორდა</translation> <translation id="8919837981463578619">ვერ მოხერხდა — პრინტერს კალათა აკლია</translation> <translation id="8923267550422472772">თვის კონკრეტული დღე გადაყენებისთვის</translation> <translation id="8928727111548978589">ვერ მოხერხდა — ქაღალდი გაუთავდა</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb index 0f1dcd70..dc0ba7a 100644 --- a/chromeos/strings/chromeos_strings_kk.xtb +++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Роуминг емес, үй желісі</translation> <translation id="1327977588028644528">Шлюз</translation> +<translation id="1328223165223065150">Тұсқағаз түсі</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Сканерлеу аймағына сәйкестендіру</translation> <translation id="1367951781824006909">Файлды таңдау</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Сурет дереккөзі</translation> <translation id="1451536289672181509">Бұл — пернетақта.</translation> <translation id="1459693405370120464">Ауа райы</translation> +<translation id="1459784442280469416">USB дискісіне сақтау</translation> <translation id="1468664791493211953">Ұсыныстар</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> құрылғыңызды басқарады және әрекетіңізді де бақылауы мүмкін.</translation> <translation id="1478594628797167447">Сканер</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> бұл пайдаланушыны басқарады және параметрлер мен пайдаланушы әрекеттерін қашықтан бақылай алады.</translation> <translation id="150962533380566081">PUK коды жарамсыз.</translation> <translation id="1510238584712386396">Іске қосу құрылғысы</translation> +<translation id="1512982610995527443">Құрылғы 5 секундтан кейін өшеді.</translation> +<translation id="1522984060396982789">Жөнделді. Құрылғыны өшіруге немесе кейбір қосымша шараларды қолдануға болады.</translation> <translation id="152892567002884378">Дыбысты арттыру</translation> <translation id="1555130319947370107">Көк</translation> <translation id="155865706765934889">Сенсорлық тақта</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Жабдық нұсқасы</translation> <translation id="1905710495812624430">Максималды рұқсат етілетін әрекеттер шегінен асып кетті.</translation> <translation id="1908234395526491708">UDP сұрауының ақаулары</translation> +<translation id="1932611479324127242">Батареяны өшіру</translation> <translation id="1947737735496445907">Басып шығарылған</translation> <translation id="1951012854035635156">Assistant</translation> <translation id="1977994649430373166">Google профилі фотосуреті</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Қалқу</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> фотосурет</translation> +<translation id="2154739667870063220">Өшіріп қосу</translation> <translation id="2157959690810728433">КЕЗЕКТЕ</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Қайталау</translation> <translation id="2161394479394250669">Баспа жұмысынан бас тарту</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Пернетақта форматын ауыстырғыш</translation> <translation id="225692081236532131">Белсендіру күйі</translation> <translation id="2271469253353559191">Қараңғы режим кестесі</translation> +<translation id="2275586345903859204">Жөндеу аяқталды</translation> <translation id="2287186687001756809">Қолжетімді суреттер жоқ. Суреттер қосу үшін <ph name="LINK" /> сайтына өтіңіз.</translation> <translation id="2307344026739914387">Ағымдағы кілттер жұбын пайдалану</translation> <translation id="2320295602967756579">Жарық режимді қосу</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Қараңғы түс режимін қосу</translation> <translation id="2740531572673183784">Жарайды</translation> <translation id="2751739896257479635">EAP 2-фаза аутентификациясы</translation> +<translation id="2756652381241102009">Диагностиканы бастау</translation> <translation id="2783010256799387990">ӨТТІ</translation> <translation id="2789486458103222910">Жарайды</translation> <translation id="2805756323405976993">Қолданбалар</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Қосылуда…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> қайта қосылуда</translation> +<translation id="4415951057168511744">Қазіргі аватар</translation> <translation id="4425149324548788773">Менің Drive дискім</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> өшірулі</translation> <translation id="4429881212383817840">Kerberos билетінің жарамдылық мерзімі жақында аяқталады</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Ата-ананың кіру рұқсаты</translation> <translation id="473775607612524610">Жаңарту</translation> <translation id="4744944742468440486">Таңдауға қатысты ақпарат</translation> +<translation id="4751272708893364980">RMA журналдарын көру</translation> <translation id="4773299976671772492">Тоқтатылды</translation> <translation id="4774530504324923332">RSU қосылған қауіпсіздік кілті, QR кодының сканері және интернетке қосылған екінші құрылғы қажет болады</translation> <translation id="4782311465517282004">Тінтуірдің оң жақ түймесін басқанда немесе мәтінді басып тұрғанда мәтіннің анықтамасын, аудармасын немесе өлшем бірліктерін көріңіз.</translation> @@ -450,9 +460,11 @@ <translation id="5372659122375744710">WiFi желісі қауіпсіз емес.</translation> <translation id="5376354385557966694">Автоматты жарық режим</translation> <translation id="537872351913703572">Құрылғы басқа пайдаланушыға немесе ұйымға өтеді</translation> +<translation id="5389224261615877010">Кемпірқосақ</translation> <translation id="5395600419410242651">Барлық деректі өшіру</translation> <translation id="5400907029458559844">Құрылғы жалғануда.</translation> <translation id="5401938042319910061">Барлық әрекеттер тізімін іске қосу</translation> +<translation id="5406131354638931058">Тасымалданатын немесе сақталатын құрылғылардың батареясын өшіру</translation> <translation id="5423849171846380976">Белсендірілген</translation> <translation id="5430931332414098647">Жылдам тетеринг</translation> <translation id="5431318178759467895">Түс</translation> @@ -505,6 +517,7 @@ <translation id="5931523347251946569">Файл табылмады.</translation> <translation id="5939518447894949180">Қалпына келтіру</translation> <translation id="594552776027197022">Кездейсоқ кілттер жұбын жасау</translation> +<translation id="5951259522948394825">Барлығы өз орнында екенін растап, диагностика есебін көріңіз.</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Әдепкі тұсқағаз</translation> <translation id="6017514345406065928">Жасыл</translation> @@ -725,6 +738,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> таңдау</translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA журналдары</translation> <translation id="8206859287963243715">Ұялы</translation> <translation id="8208861521865154048">Бонустар</translation> <translation id="8217675307824400706">Қосылу</translation> @@ -758,6 +772,7 @@ <translation id="8456761643544401578">Автоматты қараңғы режим</translation> <translation id="8461329675984532579">Жергілікті провайдер аты</translation> <translation id="8467104829907989997">Құрамдастар калибрленуде...</translation> +<translation id="8474030592808010086">Батареяны өшіру үшін құрылғыны ажыратыңыз.</translation> <translation id="8475690821716466388">WiFi желісі WEP PSK әлсіз протоколымен қорғалған.</translation> <translation id="8477551185774834963">DNS кідірісі рұқсат етілетін шектен сәл жоғары.</translation> <translation id="8483248364096924578">IP мекенжайы</translation> @@ -803,6 +818,7 @@ <translation id="8898840733695078011">Сигнал күші</translation> <translation id="8910721771319628100">Әдепкі желі кідірісі шекті мәннен асады.</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> иелік ететін <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">Түзетулерді көріңіз.</translation> <translation id="8919837981463578619">Сәтсіз: науа жоқ</translation> <translation id="8923267550422472772">Бастапқы күйге қайтару күні</translation> <translation id="8928727111548978589">Сәтсіз: қағаз бітіп қалды</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb index b724c07f..530690c 100644 --- a/chromeos/strings/chromeos_strings_kn.xtb +++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">ಹೋಮ್ ನೆಟ್ವರ್ಕ್, ರೋಮಿಂಗ್ ಇಲ್ಲ</translation> <translation id="1327977588028644528">ಗೇಟ್ವೇ</translation> +<translation id="1328223165223065150">ವಾಲ್ಪೇಪರ್ ಬಣ್ಣ</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">ಸ್ಕ್ಯಾನ್ ಪ್ರದೇಶಕ್ಕೆ ಹೊಂದಿಸಿ</translation> <translation id="1367951781824006909">ಫೈಲ್ವೊಂದನ್ನು ಆರಿಸಿ</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">ಚಿತ್ರದ ಮೂಲ</translation> <translation id="1451536289672181509">ಸಾಧನವು ಕೀಬೋರ್ಡ್ ಆಗಿದೆ.</translation> <translation id="1459693405370120464">ಹವಾಮಾನ</translation> +<translation id="1459784442280469416">USB ಗೆ ಉಳಿಸಿ</translation> <translation id="1468664791493211953">ಆಫರ್ಗಳು</translation> <translation id="1476467821656042872">ಈ ಸಾಧನವನ್ನು <ph name="MANAGER" /> ನಿರ್ವಹಿಸುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಚಟುವಟಿಕೆಯ ಮೇಲೆ ಗಮನವಿಡಲು ಇದಕ್ಕೆ ಸಾಧ್ಯವಾಗಬಹುದು.</translation> <translation id="1478594628797167447">ಸ್ಕ್ಯಾನರ್</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732">ಈ ಬಳಕೆದಾರರನ್ನು <ph name="MANAGER" /> ನಿರ್ವಹಿಸುತ್ತದೆ ಮತ್ತು ರಿಮೋಟ್ ಆಗಿ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನಿರ್ವಹಿಸಬಹುದು ಹಾಗೂ ಬಳಕೆದಾರರ ಚಟುವಟಿಕೆಯನ್ನು ಮಾನಿಟರ್ ಮಾಡಬಹುದು.</translation> <translation id="150962533380566081">ಅಮಾನ್ಯ PUK.</translation> <translation id="1510238584712386396">ಲಾಂಚರ್</translation> +<translation id="1512982610995527443">ಸಾಧನವು 5 ಸೆಕೆಂಡ್ಗಳಲ್ಲಿ ಸ್ಥಗಿತಗೊಳ್ಳುತ್ತದೆ</translation> +<translation id="1522984060396982789">ನಿಮ್ಮ ದುರಸ್ತಿ ಯಶಸ್ವಿಯಾಗಿದೆ. ನೀವು ಸಾಧನವನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಬಹುದು ಅಥವಾ ಕೆಲವು ಹೆಚ್ಚುವರಿ ಕ್ರಮಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು.</translation> <translation id="152892567002884378">ವಾಲ್ಯೂಮ್ ಹೆಚ್ಚು ಮಾಡಿ</translation> <translation id="1555130319947370107">ನೀಲಿ</translation> <translation id="155865706765934889">ಟಚ್ಪ್ಯಾಡ್</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">ಹಾರ್ಡ್ವೇರ್ ಪರಿಷ್ಕರಣೆ</translation> <translation id="1905710495812624430">ಅನುಮತಿಸಲಾದ ಗರಿಷ್ಟ ಪ್ರಯತ್ನಗಳು ಮೀರಿವೆ.</translation> <translation id="1908234395526491708">UDP ವಿನಂತಿ ವೈಫಲ್ಯಗಳು</translation> +<translation id="1932611479324127242">ಬ್ಯಾಟರಿ ಕಡಿತಗೊಳ್ಳುತ್ತದೆ</translation> <translation id="1947737735496445907">ಮುದ್ರಿಸಲಾಗಿದೆ</translation> <translation id="1951012854035635156">Assistant</translation> <translation id="1977994649430373166">Google ಪ್ರೊಫೈಲ್ ಫೋಟೋ</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">ಗಾಳಿಯಲ್ಲಿ ತೇಲಿಹೋಗಿ</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> ಫೋಟೋಗಳು</translation> +<translation id="2154739667870063220">ರೀಬೂಟ್ ಮಾಡಿ</translation> <translation id="2157959690810728433">ಸರದಿಯಲ್ಲಿರಿಸಲಾಗಿದೆ</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: ಮರುಪ್ರಯತ್ನಿಸಿ</translation> <translation id="2161394479394250669">ಮುದ್ರಣ ಕಾರ್ಯವನ್ನು ರದ್ದುಮಾಡಿ</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">ಲೇಔಟ್ ಸ್ವಿಚ್</translation> <translation id="225692081236532131">ಸಕ್ರಿಯ ಸ್ಥಿತಿ</translation> <translation id="2271469253353559191">ಕತ್ತಲೆ ಮೋಡ್ ವೇಳಾಪಟ್ಟಿ</translation> +<translation id="2275586345903859204">ದುರಸ್ತಿ ಪೂರ್ಣಗೊಂಡಿದೆ</translation> <translation id="2287186687001756809">ಯಾವುದೇ ಚಿತ್ರ ಲಭ್ಯವಿಲ್ಲ. ಫೋಟೋಗಳನ್ನು ಸೇರಿಸಲು, <ph name="LINK" /> ಗೆ ಹೋಗಿ</translation> <translation id="2307344026739914387">ಪ್ರಸ್ತುತ ಕೀ ಜೋಡಿಯನ್ನು ಬಳಸಿ</translation> <translation id="2320295602967756579">ಲೈಟ್ ಥೀಮ್ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">ಗಾಢ ಬಣ್ಣದ ಮೋಡ್ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="2740531572673183784">ಸರಿ</translation> <translation id="2751739896257479635">EAP 2 ನೇ ಹಂತದ ಪ್ರಮಾಣೀಕರಣ</translation> +<translation id="2756652381241102009">ಡಯಾಗ್ನಾಸ್ಟಿಕ್ಸ್ ಅನ್ನು ರನ್ ಮಾಡಿ</translation> <translation id="2783010256799387990">ಪರಿಶೀಲನೆ ಸಫಲವಾಗಿದೆ</translation> <translation id="2789486458103222910">ಸರಿ</translation> <translation id="2805756323405976993">ಆಪ್ಸ್</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">ಕನೆಕ್ಟ್...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ</translation> +<translation id="4415951057168511744">ಪ್ರಸ್ತುತ ಅವತಾರ್</translation> <translation id="4425149324548788773">ನನ್ನ ಡ್ರೈವ್</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> ಆಫ್ ಆಗಿದೆ</translation> <translation id="4429881212383817840">Kerberos ಟಿಕೆಟ್ ಶೀಘ್ರದಲ್ಲೇ ಅವಧಿ ಮೀರಲಿದೆ</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">ಪೋಷಕ ಪ್ರವೇಶ ಬಟನ್</translation> <translation id="473775607612524610">ಅಪ್ಡೇಟ್</translation> <translation id="4744944742468440486">ನಿಮ್ಮ ಆಯ್ಕೆಗೆ ಸಂಬಂಧಿಸಿದ ಮಾಹಿತಿ</translation> +<translation id="4751272708893364980">RMA ಲಾಗ್ಗಳನ್ನು ನೋಡಿ</translation> <translation id="4773299976671772492">ನಿಲ್ಲಿಸಲಾಗಿದೆ</translation> <translation id="4774530504324923332">ನಿಮಗೆ RSU-ಸಕ್ರಿಯ ಭದ್ರತಾ ಕೀ, QR ಕೋಡ್ ಸ್ಕ್ಯಾನರ್ ಮತ್ತು ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಇರುವ ಎರಡನೇ ಸಾಧನದ ಅಗತ್ಯವಿದೆ</translation> <translation id="4782311465517282004">ನೀವು ಬಲ-ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ ಅಥವಾ ಪಠ್ಯವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿದಾಗ ವಿವರಣೆಗಳು, ಅನುವಾದಗಳು ಅಥವಾ ಯೂನಿಟ್ ಪರಿವರ್ತನೆಗಳನ್ನು ಪಡೆಯಿರಿ</translation> @@ -450,9 +460,11 @@ <translation id="5372659122375744710">ವೈಫೈ ನೆಟ್ವರ್ಕ್ ಸುರಕ್ಷಿತವಾಗಿಲ್ಲ</translation> <translation id="5376354385557966694">ಸ್ವಯಂಚಾಲಿತ ಬೆಳಕಿನ ಮೋಡ್</translation> <translation id="537872351913703572">ಸಾಧನವು ಬೇರೆ ಬಳಕೆದಾರರು ಅಥವಾ ಸಂಸ್ಥೆಗೆ ಹೋಗುತ್ತದೆ</translation> +<translation id="5389224261615877010">ಕಾಮನಬಿಲ್ಲಿನ ಬಣ್ಣ</translation> <translation id="5395600419410242651">ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಅಳಿಸಿ</translation> <translation id="5400907029458559844">ಸಾಧನವು ಕನೆಕ್ಟ್ ಆಗುತ್ತಿದೆ.</translation> <translation id="5401938042319910061">ಎಲ್ಲಾ ದಿನಚರಿಗಳನ್ನು ರನ್ ಮಾಡಿ</translation> +<translation id="5406131354638931058">ಶಿಪ್ ಮಾಡಲಾದ ಅಥವಾ ಸಂಗ್ರಹಿಸಲಾದ ಸಾಧನಗಳಿಗೆ ಬ್ಯಾಟರಿ ಕಡಿತಗೊಳಿಸಿ</translation> <translation id="5423849171846380976">ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="5430931332414098647">ತತ್ಕ್ಷಣದ ಟೆಥರಿಂಗ್</translation> <translation id="5431318178759467895">ಬಣ್ಣ</translation> @@ -505,6 +517,7 @@ <translation id="5931523347251946569">ಫೈಲ್ ಕಂಡುಬಂದಿಲ್ಲ</translation> <translation id="5939518447894949180">ಮರುಹೊಂದಿಸು</translation> <translation id="594552776027197022">ರ್ಯಾಂಡಮ್ ಕೀ ಜೋಡಿಯನ್ನು ರಚಿಸಿ</translation> +<translation id="5951259522948394825">ಎಲ್ಲವೂ ಸರಿಯಾದ ಸ್ಥಳದಲ್ಲಿದೆ ಎಂಬುದನ್ನು ದೃಢೀಕರಿಸಿ ಮತ್ತು ಡಯಾಗ್ನಾಸ್ಟಿಕ್ಸ್ ವರದಿಯನ್ನು ವೀಕ್ಷಿಸಿ</translation> <translation id="5972388717451707488">ಎಂಜಿನ್ ಅಪ್ಡೇಟ್ ಮಾಡಿ</translation> <translation id="5984145644188835034">ಡೀಫಾಲ್ಟ್ ವಾಲ್ಪೇಪರ್</translation> <translation id="6017514345406065928">ಹಸಿರು</translation> @@ -725,6 +738,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA ಲಾಗ್ಗಳು</translation> <translation id="8206859287963243715">ಸೆಲ್ಯುಲಾರ್</translation> <translation id="8208861521865154048">ಪರ್ಕ್ಗಳು</translation> <translation id="8217675307824400706">ಕನೆಕ್ಟ್ ಆಗಿರಿ</translation> @@ -758,6 +772,7 @@ <translation id="8456761643544401578">ಸ್ವಯಂಚಾಲಿತ ಕತ್ತಲೆ ಮೋಡ್</translation> <translation id="8461329675984532579">Home ಪೂರೈಕೆದಾರರ ಹೆಸರು</translation> <translation id="8467104829907989997">ಘಟಕಗಳನ್ನು ಕ್ಯಾಲಿಬ್ರೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> +<translation id="8474030592808010086">ಬ್ಯಾಟರಿ ಕಡಿತಗೊಳಿಸಲು ಸಾಧನವನ್ನು ಅನ್ಪ್ಲಗ್ ಮಾಡಿ</translation> <translation id="8475690821716466388">ದುರ್ಬಲ ಪ್ರೋಟೋಕಾಲ್ WEP PSK ಮೂಲಕ ವೈಫೈ ನೆಟ್ವರ್ಕ್ ರಕ್ಷಿಸಲಾಗಿದೆ</translation> <translation id="8477551185774834963">ಅನುಮತಿಸಬಹುದಾದ ಥ್ರೆಶ್ಹೋಲ್ಡ್ಗಿಂತ DNS ವಿಳಂಬವು ಸ್ವಲ್ಪ ಮೇಲಿದೆ</translation> <translation id="8483248364096924578">ಐಪಿ ವಿಳಾಸ</translation> @@ -803,6 +818,7 @@ <translation id="8898840733695078011">ಸಿಗ್ನಲ್ ಸಾಮರ್ಥ್ಯ</translation> <translation id="8910721771319628100">ವಿಳಂಬ ಥ್ರೆಶ್ಹೋಲ್ಡ್ ಮೇಲಿನ ಡೀಫಾಲ್ಟ್ ನೆಟ್ವರ್ಕ್</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />ನ <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">ಏನು ಸರಿಪಡಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ನೋಡಿ</translation> <translation id="8919837981463578619">ವಿಫಲವಾಗಿದೆ - ಟ್ರೇ ಕಾಣೆಯಾಗಿದೆ</translation> <translation id="8923267550422472772">ರೀಸೆಟ್ ಮಾಡಬೇಕಾಗಿರುವ ತಿಂಗಳಿನ ದಿನ</translation> <translation id="8928727111548978589">ವಿಫಲವಾಗಿದೆ - ಕಾಗದ ಖಾಲಿಯಾಗಿದೆ</translation>
diff --git a/chromeos/strings/chromeos_strings_lo.xtb b/chromeos/strings/chromeos_strings_lo.xtb index 28eb06f..4a8e4e3 100644 --- a/chromeos/strings/chromeos_strings_lo.xtb +++ b/chromeos/strings/chromeos_strings_lo.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">ເຄືອຂ່າຍພາຍໃນ, ບໍ່ໂຣມມິງ</translation> <translation id="1327977588028644528">ເກດເວ</translation> +<translation id="1328223165223065150">ສີຮູບພື້ນຫຼັງ</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">ພໍດີກັບພື້ນທີ່ສະແກນ</translation> <translation id="1367951781824006909">ເລືອກໄຟລ໌</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">ທີ່ມາຮູບ</translation> <translation id="1451536289672181509">ອຸປະກອນແມ່ນແປ້ນພິມ.</translation> <translation id="1459693405370120464">ສະພາບອາກາດ</translation> +<translation id="1459784442280469416">ບັນທຶກໄປໃສ່ USB</translation> <translation id="1468664791493211953">ຂໍ້ສະເໜີ</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> ຈັດການອຸປະກອນນີ້ ແລະ ອາດຈະສາມາດຕິດຕາມການເຄື່ອນໄຫວຂອງທ່ານໄດ້.</translation> <translation id="1478594628797167447">ເຄື່ອງສະແກນ</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> ຈັດການຜູ້ໃຊ້ນີ້ ແລະ ອາດຈະຈັດການການຕັ້ງຄ່າ ແລະ ຕິດຕາມເບິ່ງການເຄື່ອນໄຫວຂອງຜູ້ໃຊ້ຈາກທາງໄກໄດ້.</translation> <translation id="150962533380566081">PUK ທີ່ຖືກຕ້ອງ.</translation> <translation id="1510238584712386396">ຕົວເປີດໃຊ້</translation> +<translation id="1512982610995527443">ອຸປະກອນຈະປິດເຄື່ອງໃນ 5 ວິນາທີ</translation> +<translation id="1522984060396982789">ການສ້ອມແປງຂອງທ່ານສຳເລັດແລ້ວ. ທ່ານສາມາດປິດອຸປະກອນ ຫຼື ດຳເນີນການເພີ່ມເຕີມບາງຢ່າງໄດ້.</translation> <translation id="152892567002884378">ເປີດສຽງຂຶ້ນ</translation> <translation id="1555130319947370107">ສີຟ້າ</translation> <translation id="155865706765934889">ແຜ່ນສໍາຜັດ</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">ການປັບປຸງແກ້ໄຂຮາດແວ</translation> <translation id="1905710495812624430">ເກີນຈຳນວນຄວາມພະຍາຍາມສູງສຸດແລ້ວ.</translation> <translation id="1908234395526491708">ຂໍ UDP ບໍ່ສຳເລັດ</translation> +<translation id="1932611479324127242">ຕັດແຮງດັນໄຟຟ້າຂອງແບັດເຕີຣີ</translation> <translation id="1947737735496445907">ພິມແລ້ວ</translation> <translation id="1951012854035635156">ຜູ້ຊ່ວຍ</translation> <translation id="1977994649430373166">ຮູບໂປຣໄຟລ໌ Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">ລ່ອງລອຍຜ່ານໄປ</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> ຮູບ</translation> +<translation id="2154739667870063220">ປິດເປີດໃໝ່</translation> <translation id="2157959690810728433">ເຂົ້າຄິວແລ້ວ</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: ລອງໃໝ່</translation> <translation id="2161394479394250669">ຍົກເລີກວຽກພິມ</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">ສະວິດໂຄງຮ່າງ</translation> <translation id="225692081236532131">ສະຖານະການເປີດນຳໃຊ້</translation> <translation id="2271469253353559191">ກຳນົດເວລາໂໝດມືດ</translation> +<translation id="2275586345903859204">ສ້ອມແປງສຳເລັດແລ້ວ</translation> <translation id="2287186687001756809">ບໍ່ມີຮູບທີ່ສາມາດໃຊ້ໄດ້. ເພື່ອເພີ່ມຮູບ, ກະລຸນາເຂົ້າໄປ <ph name="LINK" /></translation> <translation id="2307344026739914387">ໃຊ້ຄູ່ກະແຈປັດຈຸບັນ</translation> <translation id="2320295602967756579">ເປີດການນຳໃຊ້ຮູບແບບສີສັນແຈ້ງ</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">ເປີດການນຳໃຊ້ໂໝດສີມືດ</translation> <translation id="2740531572673183784">ຕົກລົງ</translation> <translation id="2751739896257479635">ການຮັບຮອງຄວາມຖືກຕ້ອງ EAP ໄລຍະທີ 2</translation> +<translation id="2756652381241102009">ເປີດໃຊ້ການວິນິໄສ</translation> <translation id="2783010256799387990">ຜ່ານແລ້ວ</translation> <translation id="2789486458103222910">ຕົກລົງ</translation> <translation id="2805756323405976993">ແອັບ</translation> @@ -333,6 +341,7 @@ <translation id="4378551569595875038">ກໍາລັງເຊື່ອມຕໍ່ ...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">ກຳລັງຣີສະຕາດ <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">ຮູບແທນຕົວປັດຈຸບັນ</translation> <translation id="4425149324548788773">My Drive</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> ປິດຢູ່</translation> <translation id="4429881212383817840">ປີ້ Kerberos ຈະໝົດອາຍຸໃນໄວໆນີ້</translation> @@ -369,6 +378,7 @@ <translation id="4731797938093519117">ສິດເຂົ້າເຖິງຂອງພໍ່ແມ່</translation> <translation id="473775607612524610">ອັບເດດ</translation> <translation id="4744944742468440486">ຂໍ້ມູນທີ່ກ່ຽວຂ້ອງກັບການເລືອກຂອງທ່ານ</translation> +<translation id="4751272708893364980">ເບິ່ງບັນທຶກ RMA</translation> <translation id="4773299976671772492">ຢຸດແລ້ວ</translation> <translation id="4774530504324923332">ທ່ານຈະຕ້ອງໃຊ້ກະແຈຄວາມປອດໄພທີ່ເປີດການນຳໃຊ້ RSU, ຕົວສະແກນລະຫັດ QR ແລະ ອຸປະກອນທີສອງທີ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ</translation> <translation id="4782311465517282004">ຮັບຄຳນິຍາມ, ການແປພາສາ ຫຼື ການປ່ຽນແປງຫົວໜ່ວຍເມື່ອທ່ານຄລິກຂວາ ຫຼື ແຕະໃສ່ຂໍ້ຄວາມຄ້າງໄວ້</translation> @@ -452,9 +462,11 @@ <translation id="5372659122375744710">ເຄືອຂ່າຍ WiFi ບໍ່ປອດໄພ</translation> <translation id="5376354385557966694">ໂໝດແຈ້ງອັດຕະໂນມັດ</translation> <translation id="537872351913703572">ອຸປະກອນຈະສົ່ງໄປຫາຜູ້ໃຊ້ ຫຼື ອົງການອື່ນ</translation> +<translation id="5389224261615877010">ຮຸ້ງ</translation> <translation id="5395600419410242651">ລຶບຂໍ້ມູນທັງໝົດ</translation> <translation id="5400907029458559844">ອຸປະກອນກຳລັງເຊື່ອມຕໍ່ຢູ່.</translation> <translation id="5401938042319910061">ເອີ້ນໃຊ້ສິ່ງທີ່ເຮັດປະຈຳທັງໝົດ</translation> +<translation id="5406131354638931058">ຕັດແຮງດັນໄຟຟ້າຂອງແບັດເຕີຣີສຳລັບອຸປະກອນທີ່ຈະຈັດສົ່ງ ຫຼື ຈະຖືກຈັດເກັບໄວ້</translation> <translation id="5423849171846380976">ເປີດໃຊ້ງານແລ້ວ</translation> <translation id="5430931332414098647">ການປ່ອຍສັນຍານທັນທີ</translation> <translation id="5431318178759467895">ສີ</translation> @@ -507,6 +519,7 @@ <translation id="5931523347251946569">ບໍ່ພົບໄຟລ໌</translation> <translation id="5939518447894949180">ຕັ້ງຄ່າຄືນໃໝ່</translation> <translation id="594552776027197022">ສ້າງຄູ່ກະແຈແບບສຸ່ມ</translation> +<translation id="5951259522948394825">ຢືນຢັນວ່າທຸກຢ່າງຖືກຕ້ອງແລ້ວ ແລະ ເບິ່ງລາຍງານການວິນິໄສ</translation> <translation id="5972388717451707488">ອັບເດດລະບົບ</translation> <translation id="5984145644188835034">ຮູບພື້ນຫຼັງເລີ່ມຕົ້ນ</translation> <translation id="6017514345406065928">ສີຂຽວ</translation> @@ -728,6 +741,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">ເລືອກ <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">ປ້ອນເຂົ້າ</translation> +<translation id="819552138404104974">ບັນທຶກ RMA</translation> <translation id="8206859287963243715">ເຊວລູລາ</translation> <translation id="8208861521865154048">ສິດທິປະໂຫຍດຕ່າງໆ</translation> <translation id="8217675307824400706">ເລີ່ມການເຊື່ອມຕໍ່</translation> @@ -761,6 +775,7 @@ <translation id="8456761643544401578">ໂໝດມືດອັດຕະໂນມັດ</translation> <translation id="8461329675984532579">ຊື່ຜູ້ໃຫ້ບໍລິການ Home</translation> <translation id="8467104829907989997">ກຳລັງປັບທຽບອົງປະກອບ...</translation> +<translation id="8474030592808010086">ຖອດສາຍອຸປະກອນອອກເພື່ອຕັດແຮງດັນໄຟຟ້າຂອງແບັດເຕີຣີ</translation> <translation id="8475690821716466388">ເຄືອຂ່າຍ WiFi ມີການຮັກສາຄວາມປອດໄພດ້ວຍໂປຣໂຕຄໍ WEP PSK ທີ່ບໍ່ຮັດກຸມ</translation> <translation id="8477551185774834963">ເວລາໃນການຕອບສະໜອງ DNS ສູງກວ່າເກນທີ່ຍອມຮັບໄດ້ເລັກນ້ອຍ</translation> <translation id="8483248364096924578">ທີ່ຢູ່ IP</translation> @@ -806,6 +821,7 @@ <translation id="8898840733695078011">ຄວາມແຮງສັນຍານ</translation> <translation id="8910721771319628100">ເຄືອຂ່າຍເລີ່ມຕົ້ນສູງກວ່າເກນເວລາໃນການຕອບສະໜອງ</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> ຂອງ <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">ເບິ່ງວ່າມີການແກ້ໄຂຫຍັງ</translation> <translation id="8919837981463578619">ບໍ່ສຳເລັດ, ຖາດໃສ່ເຈ້ຍຫາຍໄປ</translation> <translation id="8923267550422472772">ວັນທີຂອງເດືອນສຳລັບການຣີເຊັດ</translation> <translation id="8928727111548978589">ບໍ່ສຳເລັດ, ເຈ້ຍໝົດ</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb index 8f3d3fe..c90b7d9 100644 --- a/chromeos/strings/chromeos_strings_lt.xtb +++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">„Android“ VPN</translation> <translation id="131461803491198646">Namų tinklas, ne tarptinklinis ryšys</translation> <translation id="1327977588028644528">Tinklų sietuvas</translation> +<translation id="1328223165223065150">Ekrano fono spalva</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Pritaikyti pagal nuskaitomą sritį</translation> <translation id="1367951781824006909">Pasirinkti failą</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Vaizdo šaltinis</translation> <translation id="1451536289672181509">Įrenginys yra klaviatūra.</translation> <translation id="1459693405370120464">Oras</translation> +<translation id="1459784442280469416">Išsaugoti USB įrenginyje</translation> <translation id="1468664791493211953">Pasiūlymai</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> tvarko šį įrenginį ir gali stebėti jūsų veiklą.</translation> <translation id="1478594628797167447">Skaitytuvas</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> valdo šį naudotoją ir gali nuotoliniu būdu valdyti nustatymus bei stebėti naudotojo veiklą.</translation> <translation id="150962533380566081">Netinkamas PUK.</translation> <translation id="1510238584712386396">Paleidimo priemonė</translation> +<translation id="1512982610995527443">Įrenginys bus išjungtas po penkių sekundžių</translation> +<translation id="1522984060396982789">Sėkmingai sutvarkyta. Galite išjungti įrenginį arba atlikti papildomų veiksmų.</translation> <translation id="152892567002884378">Padidinti garsumą</translation> <translation id="1555130319947370107">Mėlyna</translation> <translation id="155865706765934889">Jutiklinis kilimėlis</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Aparatinės įrangos taisymas</translation> <translation id="1905710495812624430">Viršytas didžiausias bandymų skaičius.</translation> <translation id="1908234395526491708">Nepavyko pateikti UDP užklausų</translation> +<translation id="1932611479324127242">Atjungti akumuliatorių</translation> <translation id="1947737735496445907">Atspausdinta</translation> <translation id="1951012854035635156">Padėjėjas</translation> <translation id="1977994649430373166">„Google“ profilio nuotrauka</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Skriek šalin</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" /> proc.</translation> <translation id="2152882202543497059">Nuotraukų: <ph name="NUMBER" /></translation> +<translation id="2154739667870063220">Paleisti iš naujo</translation> <translation id="2157959690810728433">ĮTRAUKTAS Į EILĘ</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: bandyti dar kartą</translation> <translation id="2161394479394250669">Atšaukti spausdinimo užduotį</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Išdėstymo jungiklis</translation> <translation id="225692081236532131">Aktyvinimo būsena</translation> <translation id="2271469253353559191">Tamsaus režimo planavimas</translation> +<translation id="2275586345903859204">Sutvarkyta</translation> <translation id="2287186687001756809">Nėra jokių vaizdų. Jei norite pridėti nuotraukų, eikite adresu <ph name="LINK" /></translation> <translation id="2307344026739914387">Naudoti dabartinę raktų porą</translation> <translation id="2320295602967756579">Įgalinti šviesiąją temą</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Įgalinti tamsių spalvų režimą</translation> <translation id="2740531572673183784">Gerai</translation> <translation id="2751739896257479635">EAP 2 tapatybės nustatymo etapas</translation> +<translation id="2756652381241102009">Vykdyti diagnostiką</translation> <translation id="2783010256799387990">PAVYKO</translation> <translation id="2789486458103222910">Gerai</translation> <translation id="2805756323405976993">Taikomosios programos</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Jungiamasi...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Įrenginys „<ph name="DEVICE_NAME" />“ paleidžiamas iš naujo</translation> +<translation id="4415951057168511744">Dabartinis pseudoportretas</translation> <translation id="4425149324548788773">Mano Diskas</translation> <translation id="4428374560396076622">„<ph name="NETWORK_NAME" />“ išjungta</translation> <translation id="4429881212383817840">„Kerberos“ bilietas netrukus baigs galioti</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Tėvų prieiga</translation> <translation id="473775607612524610">Atnaujinti</translation> <translation id="4744944742468440486">Informacija, susijusi su jūsų pasirinkimu</translation> +<translation id="4751272708893364980">Žr. GPL žurnalus</translation> <translation id="4773299976671772492">Sustabdyta</translation> <translation id="4774530504324923332">Reikės saugos rakto su įgalintu RSU, QR kodų skaitytuvo ir antro įrenginio su interneto ryšiu</translation> <translation id="4782311465517282004">Spustelėkite dešiniuoju klavišu arba palieskite ir palaikykite tekstą, kad būtų pateiktos apibrėžtys, vertimai ar vienetų konvertavimas.</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">„Wi-Fi“ tinklas nesaugus</translation> <translation id="5376354385557966694">Automatinis šviesus režimas</translation> <translation id="537872351913703572">Įrenginys bus perduotas kitam naudotojui ar organizacijai</translation> +<translation id="5389224261615877010">Vaivorykštė</translation> <translation id="5395600419410242651">Trinti visus duomenis</translation> <translation id="5400907029458559844">Prijungiamas įrenginys.</translation> <translation id="5401938042319910061">Vykdyti visas veiksmų sekas</translation> +<translation id="5406131354638931058">Atjunkite įrenginių, kurie siunčiami ar saugomi, akumuliatorių</translation> <translation id="5423849171846380976">Suaktyvinta</translation> <translation id="5430931332414098647">Momentinis įrenginio kaip modemo naudojimas</translation> <translation id="5431318178759467895">Spalva</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Failas nerastas</translation> <translation id="5939518447894949180">Nustatyti iš naujo</translation> <translation id="594552776027197022">Generuoti atsitiktinę raktų porą</translation> +<translation id="5951259522948394825">Patvirtinkite, kad viskas yra tinkamoje vietoje, ir peržiūrėkite diagnostikos ataskaitą</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Numatytasis ekrano fonas</translation> <translation id="6017514345406065928">Žalia</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Pasirinkite <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Įvesti</translation> +<translation id="819552138404104974">GPL žurnalai</translation> <translation id="8206859287963243715">Mobilusis</translation> <translation id="8208861521865154048">Privilegijos</translation> <translation id="8217675307824400706">Prisijungimas</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Automatinis tamsus režimas</translation> <translation id="8461329675984532579">Namų paslaugos teikėjo pavadinimas</translation> <translation id="8467104829907989997">Kalibruojami komponentai...</translation> +<translation id="8474030592808010086">Atjunkite įrenginio maitinimo laidą, kad atjungtumėte akumuliatorių</translation> <translation id="8475690821716466388">„Wi-Fi“ tinklas apsaugotas naudojant nepatikimą protokolą WEP PSK</translation> <translation id="8477551185774834963">DNS delsa šiek tiek viršija leistiną slenksčio vertę</translation> <translation id="8483248364096924578">IP adresas</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Signalo stiprumas</translation> <translation id="8910721771319628100">Numatytojo tinklo delsa viršija slenksčio vertę</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />, <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">Žr., kas sutvarkyta</translation> <translation id="8919837981463578619">Nepavyko – nėra dėklo</translation> <translation id="8923267550422472772">Nustatymo iš naujo mėnesio diena</translation> <translation id="8928727111548978589">Nepavyko – baigėsi popierius</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb index 7070e4f..bd9309c 100644 --- a/chromeos/strings/chromeos_strings_ml.xtb +++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -37,6 +37,7 @@ <translation id="131421566576084655">അവസാനം ഡാറ്റാ റീസെറ്റ് ചെയ്ത തീയതി ലഭ്യമല്ല</translation> <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">ഹോം നെറ്റ്വര്ക്ക്, റോമിംഗ് അല്ല</translation> +<translation id="132712914231403017">ഫേംവെയർ ഇമേജ് ഇൻസ്റ്റാൾ ചെയ്യുക</translation> <translation id="1327977588028644528">ഗേറ്റ്വേ</translation> <translation id="1328223165223065150">വാൾപേപ്പറിനിന്റെ നിറം</translation> <translation id="1330426557709298164">JPG</translation> @@ -80,6 +81,7 @@ <translation id="1641857168437328880">ഡോക്യുമെന്റ് ഫീഡർ (ഒരു വശമുള്ളത്)</translation> <translation id="1643449475550628585">വാൾപേപ്പർ ചിത്രം ദിവസേന മാറ്റുക</translation> <translation id="1644574205037202324">ചരിത്രം</translation> +<translation id="1645954272419197032">ഉപകരണ വിവരം സ്ഥിരീകരിക്കുക</translation> <translation id="1662989795263954667">പ്രിന്റ് ജോലി നിർത്തി - മഷിയില്ല</translation> <translation id="1668469839109562275">ബിൽറ്റ് ഇൻ VPN</translation> <translation id="1703835215927279855">ലെറ്റർ</translation> @@ -118,6 +120,7 @@ <translation id="2006864819935886708">കണക്റ്റിവിറ്റി</translation> <translation id="2008685064673031089">പ്രധാന തിരയൽ</translation> <translation id="2016697457005847575">ട്രബിള്ഷൂട്ടിംഗ് ഘട്ടങ്ങൾ പരീക്ഷിക്കുക</translation> +<translation id="2016848882344942759">--വൈറ്റ് ലേബൽ ഇല്ല--</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">കൂടുതൽ ക്രമീകരണങ്ങൾ</translation> <translation id="2085089206770112532">ഡിസ്പ്ലേ തെളിച്ചം കുറയ്ക്കുക</translation> @@ -148,6 +151,7 @@ <translation id="2271469253353559191">ഡാർക്ക് മോഡ് ഷെഡ്യൂൾ ചെയ്യൽ</translation> <translation id="2275586345903859204">റിപ്പയർ ചെയ്യൽ പൂർത്തിയായി</translation> <translation id="2287186687001756809">ചിത്രമൊന്നും ലഭ്യമല്ല. ഫോട്ടോകൾ ചേർക്കാൻ <ph name="LINK" /> -ലേക്ക് പോകുക</translation> +<translation id="2294753434210277304">ഡൗൺലോഡ് ചെയ്ത Chromebook വീണ്ടെടുക്കൽ യൂട്ടിലിറ്റി ഇമേജ് ഉള്ള USB ഡ്രൈവോ SD കാർഡോ പോലുള്ള ബാഹ്യ സ്റ്റോറേജ് ഉപകരണം ഇൻസേർട്ട് ചെയ്യുക</translation> <translation id="2307344026739914387">നിലവിലെ കീ ജോടി ഉപയോഗിക്കുക</translation> <translation id="2320295602967756579">ലൈറ്റ് തീം പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="2323506179655536734">ഒഴിവാക്കി</translation> @@ -188,6 +192,7 @@ <translation id="2712812801627182647">TLS പരിശോധിച്ചുറപ്പിക്കൽ കീ</translation> <translation id="2713444072780614174">വെള്ള</translation> <translation id="2717139507051041123">ഡാർക്ക് കളർ മോഡ് പ്രവർത്തനക്ഷമമാക്കുക</translation> +<translation id="2727250716596204208">ഫേംവെയർ ഇമേജ് കണ്ടെത്താനായില്ല. ഡൗൺലോഡ് ചെയ്ത Chromebook വീണ്ടെടുക്കൽ യൂട്ടിലിറ്റി ഇമേജ് ഉള്ള USB ഡ്രൈവോ SD കാർഡോ പോലുള്ള ബാഹ്യ സ്റ്റോറേജ് ഉപകരണം ഇൻസേർട്ട് ചെയ്യുക.</translation> <translation id="2740531572673183784">ശരി</translation> <translation id="2751739896257479635">രണ്ടാം ഘട്ട EAP പരിശോധിച്ചുറപ്പിക്കൽ</translation> <translation id="2756652381241102009">ഡയഗ്നോസ്റ്റിക്സ് റൺ ചെയ്യുക</translation> @@ -219,6 +224,7 @@ <translation id="3122464029669770682">CPU</translation> <translation id="3124039320086536031">ഉപകരണം കണക്റ്റ് ചെയ്തിരിക്കുന്നു.</translation> <translation id="3127341325625468058">{PAGE_NUMBER,plural, =0{പേജ് നീക്കം ചെയ്യണോ?}=1{{PAGE_NUMBER}-ാം പേജ് നീക്കം ചെയ്യണോ?}other{{PAGE_NUMBER}-ാം പേജ് നീക്കം ചെയ്യണോ?}}</translation> +<translation id="3137983112374760826">ഉപകരണം പ്രൊവിഷൻ ചെയ്യുന്നു...</translation> <translation id="315116470104423982">മൊബൈല് ഡാറ്റ</translation> <translation id="3156846309055100599"><ph name="PAGE_NUMBER" />-ാമത്തെ പേജ് സ്കാൻ ചെയ്യുന്നു...</translation> <translation id="315738237743207937">ക്യാപ്റ്റീവ് പോർട്ടൽ തിരിച്ചറിഞ്ഞു</translation> @@ -240,6 +246,7 @@ <translation id="3340011300870565703">ഉപകരണത്തിന്റെ വലത് ബഡിൽ <ph name="BATTERY_PERCENTAGE" />% ബാറ്ററിയുണ്ട്.</translation> <translation id="3368922792935385530">കണക്റ്റുചെയ്തു</translation> <translation id="3369013195428705271">എല്ലാ പ്രിന്റ് ചരിത്രവും മായ്ക്കണമെന്ന് തീർച്ചയാണോ? നിങ്ങളുടെ പുരോഗതിയിലുള്ള പ്രിന്റ് ജോലികൾ മായ്ക്കില്ല.</translation> +<translation id="3383751554789092165">ഉപകരണ വിവരങ്ങൾ ആവശ്യാനുസരണം മാറ്റുക.</translation> <translation id="3404249063913988450">സ്ക്രീൻ സേവർ പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="3404770484521709967">ഘടകങ്ങൾ ശരിയായിട്ടാണ് ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നത്.</translation> <translation id="3413935475507503304">അപ്ഡേറ്റുമായി മുന്നോട്ട് പോകാൻ, 'അടുത്തത്' ക്ലിക്ക് ചെയ്യുക.</translation> @@ -278,6 +285,7 @@ <translation id="3748026146096797577">കണക്റ്റുചെയ്തിട്ടില്ല</translation> <translation id="3749289110408117711">ഫയല് നാമം</translation> <translation id="3771294271822695279">വീഡിയോ ഫയലുകള്</translation> +<translation id="3774059845329307709">സീരിയൽ നമ്പർ</translation> <translation id="3784455785234192852">ലോക്കുചെയ്യുക</translation> <translation id="38114475217616659">എല്ലാ ചരിത്രവും മായ്ക്കുക</translation> <translation id="3820172043799983114">പിൻ നമ്പർ തെറ്റാണ്.</translation> @@ -361,6 +369,7 @@ <translation id="455835558791489930"><ph name="CHARGE_VALUE" />mAh ബാറ്ററി</translation> <translation id="4561801978359312462">സിം അൺലോക്ക് ചെയ്തു</translation> <translation id="4562494484721939086">സേവനമില്ല</translation> +<translation id="4568938274596692027">ഇൻസ്റ്റാൾ ചെയ്യൽ പൂർത്തിയായി. റീസ്റ്റാർട്ട് ചെയ്യാൻ തയ്യാറെടുക്കുന്നു...</translation> <translation id="458794348635939462">എല്ലാ ഹോസ്റ്റുകളും പരിഹരിക്കാനായില്ല</translation> <translation id="4593212453765072419">പ്രോക്സി പ്രാമാണീകരണം ആവശ്യമാണ്</translation> <translation id="4609350030397390689">കീബോർഡ് തെളിച്ചം കുറയ്ക്കുക</translation> @@ -403,6 +412,7 @@ <translation id="4890353053343094602">പുതിയ പാസ്വേഡ് പെട്ടെന്ന് തിരഞ്ഞെടുക്കുക</translation> <translation id="4891842000192098784">സമ്മർദ്ദം</translation> <translation id="4897058166682006107">ഉപകരണത്തിന്റെ ഇടത് ബഡിൽ <ph name="BATTERY_PERCENTAGE" />% ബാറ്ററിയുണ്ട്.</translation> +<translation id="4908030561598728899">ഫേംവെയർ ഇൻസ്റ്റാൾ ചെയ്യുന്നു...</translation> <translation id="4915052247106771211">ഇത് ഉപകരണത്തെ ഫാക്ടറി ക്രമീകരണത്തിലേക്ക് റീസെറ്റ് ചെയ്യും (Powerwash).</translation> <translation id="4917385247580444890">ശക്തം</translation> <translation id="4917889632206600977">പ്രിന്റ് ജോലി നിർത്തി - പേപ്പറില്ല</translation> @@ -614,8 +624,10 @@ <translation id="6768237774506518020">ഉയർന്ന DNS റെസല്യൂഷൻ ഫെയ്ലിയർ നിരക്ക്</translation> <translation id="680983167891198932">കീ</translation> <translation id="6816797338148849397">നിങ്ങളുടെ തിരഞ്ഞെടുപ്പുമായി ബന്ധപ്പെട്ട വിവരങ്ങൾ ലഭ്യമാണ്. ആക്സസ് ചെയ്യാൻ മുകളിലേയ്ക്കുള്ള അമ്പടയാളം കീ ഉപയോഗിക്കുക.</translation> +<translation id="6822504384524564824">പുതിയ കമ്പോണന്റ്(കൾ) അവയ്ക്ക് പകരം മുമ്പ് ഉണ്ടായിരുന്നവയിൽ നിന്ന് വ്യത്യസ്തമാണെങ്കിൽ മാത്രമേ SKU മാറ്റാവൂ. ഉദാഹരണത്തിന്, ടച്ച്സ്ക്രീൻ അല്ലാത്തത് മാറി പകരം ടച്ച്സ്ക്രീൻ ആകുമ്പോൾ ആല്ലെങ്കിൽ മെമ്മറി 8GB-യിൽ നിന്ന് 16GB-ലേക്ക് അപ്ഗ്രേഡ് ചെയ്യുമ്പോൾ.</translation> <translation id="6840315122969944400"><ph name="DEVICE_TYPE" /> റിപ്പയർ ചെയ്യുക</translation> <translation id="6853312040151791195">ഡിസ്ചാർജ് ചെയ്യൽ റേറ്റ്</translation> +<translation id="6876833053687020046">DRAM പാർട്ട് നമ്പർ</translation> <translation id="6889786074662672253">റീസ്റ്റാർട്ട് ചെയ്തുകൊണ്ടിരിക്കുമ്പോൾ, ഈ ബാഹ്യ ഉപകരണം അൺപ്ലഗ് ചെയ്യാനോ നിങ്ങളുടെ കമ്പ്യൂട്ടർ ഷട്ട് ഡൗൺ ചെയ്യാനോ പാടില്ല. നിങ്ങൾക്ക് ഈ വിൻഡോ ചെറുതാക്കാം. ഇത് പൂർത്തിയാകാൻ ഏതാനും മിനിറ്റുകൾ എടുത്തേക്കാം, അതുവരെ നിങ്ങളുടെ ബാഹ്യ ഉപകരണം പ്രവർത്തിക്കില്ല.</translation> <translation id="6905724422583748843"><ph name="PAGE_NAME" /> എന്ന പേജിലേക്ക് മടങ്ങുക</translation> <translation id="6910312834584889076">സ്കാനറിന്റെ കവർ തുറന്നിരിക്കുന്നു. കവർ അടച്ച് വീണ്ടും ശ്രമിക്കുക.</translation> @@ -663,6 +675,7 @@ <translation id="7343649194310845056">നെറ്റ്വർക്ക് ഉപകരണങ്ങൾ</translation> <translation id="7359657277149375382">ഫയല് തരം</translation> <translation id="7375053625150546623">EAP</translation> +<translation id="7378553660733179982">SKU</translation> <translation id="7378886533986123738">സ്ക്രീൻ സേവർ മാറ്റുക</translation> <translation id="7397270852490618635">ലൈറ്റ് തീം ഓഫാക്കുക</translation> <translation id="741244894080940828">പരിവർത്തനം</translation> @@ -762,6 +775,7 @@ <translation id="8364946094152050673">ശൂന്യമായ നെയിം സെർവറുകൾ</translation> <translation id="8372477600026034341">അധിക ഹോസ്റ്റുകൾ</translation> <translation id="8378855320830505539">പ്രദേശം</translation> +<translation id="8382302752385457774">വൈറ്റ്-ലേബൽ</translation> <translation id="8395584934117017006">ഈ <ph name="DEVICE_TYPE" /> എന്റർപ്രൈസ് മാനേജ് ചെയ്യുന്നു</translation> <translation id="8398927464629426868">ഉപകരണം നിലവിൽ ചാർജ് ചെയ്യുന്നതോ ഡിസ്ചാർജ് ചെയ്യുന്നതോ ആയ റേറ്റ്</translation> <translation id="8422748173858722634">IMEI</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb index 7b2ebd2..fdd9221 100644 --- a/chromeos/strings/chromeos_strings_mn.xtb +++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -37,6 +37,7 @@ <translation id="131421566576084655">Сүүлийн дата шинэчлэлтийн огноо боломжгүй байна</translation> <translation id="1314565355471455267">Андройд VPN</translation> <translation id="131461803491198646">Үндсэн сүлжээ, роуминг биш</translation> +<translation id="132712914231403017">Жижиг программын системийн хуулбарыг суулгах</translation> <translation id="1327977588028644528">Гэйтвэй</translation> <translation id="1328223165223065150">Дэлгэцийн зургийн өнгө</translation> <translation id="1330426557709298164">JPG</translation> @@ -80,6 +81,7 @@ <translation id="1641857168437328880">Документыг дамжуулах тавиур (Нэг талаар нь)</translation> <translation id="1643449475550628585">Дэлгэцийн зургийг өдөр бүр өөрчлөх</translation> <translation id="1644574205037202324">Түүх</translation> +<translation id="1645954272419197032">Төхөөрөмжийн мэдээллийг баталгаажуулна уу</translation> <translation id="1662989795263954667">Зогссон - Хэвлэгчийн хор дууссан</translation> <translation id="1668469839109562275">Бүрэлдэхүүн VPN</translation> <translation id="1703835215927279855">Захидал</translation> @@ -118,6 +120,7 @@ <translation id="2006864819935886708">Холболт</translation> <translation id="2008685064673031089">Үндсэн хайлт</translation> <translation id="2016697457005847575">Асуудал шийдэх алхмуудыг турших</translation> +<translation id="2016848882344942759">--цагаан-шошго байхгүй--</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">Нэмэлт тохиргоо</translation> <translation id="2085089206770112532">Дэлгэцийн гэрэлтүүлгийг багасгах</translation> @@ -148,6 +151,7 @@ <translation id="2271469253353559191">Бараан горимын хуваарь</translation> <translation id="2275586345903859204">Засаж дууслаа</translation> <translation id="2287186687001756809">Боломжтой зураг байхгүй. Зураг нэмэхийн тулд <ph name="LINK" /> руу очно уу</translation> +<translation id="2294753434210277304">Chromebook Нөхөн сэргээх хэрэгслийн татсан системийн хуулбартай USB драйв эсвэл SD карт зэрэг гадаад хадгалах сан оруулна уу</translation> <translation id="2307344026739914387">Одоогийн хос түлхүүрийг ашиглах</translation> <translation id="2320295602967756579">Цайвар загварыг идэвхжүүлэх</translation> <translation id="2323506179655536734">АЛГАССАН</translation> @@ -188,6 +192,7 @@ <translation id="2712812801627182647">TLS баталгаажуулалтын түлхүүр</translation> <translation id="2713444072780614174">Цагаан</translation> <translation id="2717139507051041123">Бараан өнгөний горимыг идэвхжүүлэх</translation> +<translation id="2727250716596204208">Жижиг программын системийн хуулбарыг олж чадсангүй. Chromebook Нөхөн сэргээх хэрэгслийн татсан системийн хуулбартай USB драйв эсвэл SD карт зэрэг гадаад хадгалах сан оруулна уу.</translation> <translation id="2740531572673183784">OK</translation> <translation id="2751739896257479635">EAP 2-р шатны баталгаажуулалт</translation> <translation id="2756652381241102009">Оношилгоо явуулах</translation> @@ -219,6 +224,7 @@ <translation id="3122464029669770682">CPU</translation> <translation id="3124039320086536031">Төхөөрөмж холбогдсон байна.</translation> <translation id="3127341325625468058">{PAGE_NUMBER,plural, =0{Хуудсыг хасах уу?}=1{{PAGE_NUMBER}-р хуудсыг хасах уу?}other{{PAGE_NUMBER}-р хуудсыг хасах уу?}}</translation> +<translation id="3137983112374760826">Төхөөрөмжийг бэлдэж байна...</translation> <translation id="315116470104423982">Гар утасны дата</translation> <translation id="3156846309055100599"><ph name="PAGE_NUMBER" />-р хуудсыг скан хийж байна...</translation> <translation id="315738237743207937">Дамжих портал илэрсэн</translation> @@ -240,6 +246,7 @@ <translation id="3340011300870565703">Төхөөрөмжийн баруун талын чихэвчийн батарей <ph name="BATTERY_PERCENTAGE" />% байна.</translation> <translation id="3368922792935385530">Холбогдсон</translation> <translation id="3369013195428705271">Та хэвлэлийн бүх түүхийг арилгахдаа итгэлтэй байна уу? Таны хийж буй хэвлэлийн ажлуудыг арилгахгүй.</translation> +<translation id="3383751554789092165">Шаардлагатай бол төхөөрөмжийн мэдээллийг өөрчилнө үү.</translation> <translation id="3404249063913988450">Дэлгэц амраагчийг идэвхжүүлэх</translation> <translation id="3404770484521709967">Бүрэлдэхүүн хэсгүүдийг зөв суулгасан.</translation> <translation id="3413935475507503304">Шинэчлэлтийг үргэлжлүүлэхийн тулд Дараах дээр товшино уу.</translation> @@ -278,6 +285,7 @@ <translation id="3748026146096797577">Холбогдоогүй</translation> <translation id="3749289110408117711">Файлын нэр</translation> <translation id="3771294271822695279">Видео файлууд</translation> +<translation id="3774059845329307709">Серийн дугаар</translation> <translation id="3784455785234192852">Түгжих</translation> <translation id="38114475217616659">Бүх түүхийг арилгах</translation> <translation id="3820172043799983114">ПИН буруу байна.</translation> @@ -361,6 +369,7 @@ <translation id="455835558791489930"><ph name="CHARGE_VALUE" />mAh батарей</translation> <translation id="4561801978359312462">SIM-н түгжээг тайлсан</translation> <translation id="4562494484721939086">Үйлчилгээ байхгүй</translation> +<translation id="4568938274596692027">Суулгаж дууслаа. Дахин эхлүүлэхээр бэлтгэж байна...</translation> <translation id="458794348635939462">Бүх хостыг шийдвэрлэж чадсангүй</translation> <translation id="4593212453765072419">Проксиг баталгаажуулах шаардлагатай</translation> <translation id="4609350030397390689">Гарны гэрэлтүүлгийг багасгах</translation> @@ -403,6 +412,7 @@ <translation id="4890353053343094602">Нэн даруй шинийг сонгоно уу</translation> <translation id="4891842000192098784">Стресс</translation> <translation id="4897058166682006107">Төхөөрөмжийн зүүн талын чихэвчийн батарей <ph name="BATTERY_PERCENTAGE" />% байна.</translation> +<translation id="4908030561598728899">Жижиг программыг суулгаж байна...</translation> <translation id="4915052247106771211">Энэ нь төхөөрөмжийг үйлдвэрийн тохиргоонд шинэчлэх болно (Powerwash).</translation> <translation id="4917385247580444890">Хүчтэй</translation> <translation id="4917889632206600977">Зогссон - Цаас дууссан</translation> @@ -615,8 +625,10 @@ <translation id="6768237774506518020">DNS-н тайллын алдааны өндөр хувь</translation> <translation id="680983167891198932">Түлхүүр</translation> <translation id="6816797338148849397">Таны сонголттой холбоотой мэдээлэл боломжтой байна. Хандахын тулд Дээш суман товчийг ашиглана уу.</translation> +<translation id="6822504384524564824">SKU-г зөвхөн шинэ бүрэлдэхүүн хэсгүүд нь сольсон бүрэлдэхүүн хэсгүүдээс өөр тохиолдолд өөрчлөх шаардлагатай. Жишээлбэл мэдрэмтгий бус дэлгэцийг мэдрэмтгий дэлгэцээр солих эсвэл санах ойг 8ГБ-аас 16ГБ болгож сайжруулах.</translation> <translation id="6840315122969944400"><ph name="DEVICE_TYPE" />-н засвар</translation> <translation id="6853312040151791195">Цэнэггүй болох хурд</translation> +<translation id="6876833053687020046">DRAM эд ангийн дугаар</translation> <translation id="6889786074662672253">Дахин эхлүүлэх үед энэ гадаад төхөөрөмжийг бүү салгаарай. Мөн компьютероо бүү унтраагаарай. Та энэ цонхыг багасгах боломжтой. Үүнд хэдэн минут зарцуулж магадгүй бөгөөд энэ хугацаанд таны гадаад төхөөрөмж ажиллахгүй байж магадгүй.</translation> <translation id="6905724422583748843"><ph name="PAGE_NAME" /> руу буцах</translation> <translation id="6910312834584889076">Сканнерын таг нээлттэй байна. Тагийг хаагаад, дахин оролдоно уу.</translation> @@ -664,6 +676,7 @@ <translation id="7343649194310845056">Сүлжээний төхөөрөмжүүд</translation> <translation id="7359657277149375382">Файлын төрөл</translation> <translation id="7375053625150546623">EAP</translation> +<translation id="7378553660733179982">SKU</translation> <translation id="7378886533986123738">Дэлгэц амраагчийг өөрчлөх</translation> <translation id="7397270852490618635">Цайвар загварыг унтраах</translation> <translation id="741244894080940828">хөрвүүлэлт</translation> @@ -763,6 +776,7 @@ <translation id="8364946094152050673">DNS хоосон байна</translation> <translation id="8372477600026034341">Нэмэлт хост</translation> <translation id="8378855320830505539">Хамрах бүс</translation> +<translation id="8382302752385457774">Цагаан-шошго</translation> <translation id="8395584934117017006">Энэ <ph name="DEVICE_TYPE" />-г байгууллага удирддаг</translation> <translation id="8398927464629426868">Төхөөрөмжийн одоогийн цэнэглэгдэж эсвэл цэнэгээ алдаж байгаа хувь</translation> <translation id="8422748173858722634">IMEI</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb index 448fd4f..598e5a4 100644 --- a/chromeos/strings/chromeos_strings_ms.xtb +++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">VPN Android</translation> <translation id="131461803491198646">Rangkaian utama, bukan perayauan</translation> <translation id="1327977588028644528">Get Laluan</translation> +<translation id="1328223165223065150">Warna kertas dinding</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Muatkan mengikut kawasan imbasan</translation> <translation id="1367951781824006909">Pilih fail</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Sumber imej</translation> <translation id="1451536289672181509">Peranti ialah papan kekunci.</translation> <translation id="1459693405370120464">Cuaca</translation> +<translation id="1459784442280469416">Simpan pada USB</translation> <translation id="1468664791493211953">Tawaran</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> mengurus peranti ini dan mungkin dapat memantau aktiviti anda.</translation> <translation id="1478594628797167447">Pengimbas</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> mengurus pengguna ini dan mungkin mengurus tetapan dan memantau aktiviti pengguna dari jauh.</translation> <translation id="150962533380566081">PUK tidak sah.</translation> <translation id="1510238584712386396">Pelancar</translation> +<translation id="1512982610995527443">Peranti akan dimatikan dalam masa 5 saat</translation> +<translation id="1522984060396982789">Pembaikan anda berjaya. Anda boleh mematikan peranti atau mengambil beberapa tindakan tambahan.</translation> <translation id="152892567002884378">Tambah kelantangan</translation> <translation id="1555130319947370107">Biru</translation> <translation id="155865706765934889">Pad sentuh</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Semakan perkakasan</translation> <translation id="1905710495812624430">Melebihi had maksimum percubaan yang dibenarkan.</translation> <translation id="1908234395526491708">Kegagalan permintaan UDP</translation> +<translation id="1932611479324127242">Mematikan bateri dalaman</translation> <translation id="1947737735496445907">Dicetak</translation> <translation id="1951012854035635156">Pembantu</translation> <translation id="1977994649430373166">Foto profil Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Terapung-apung</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> foto</translation> +<translation id="2154739667870063220">But semula</translation> <translation id="2157959690810728433">BERBARIS GILIR</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Cuba lagi</translation> <translation id="2161394479394250669">Batalkan tugas cetak</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Penukaran reka letak</translation> <translation id="225692081236532131">Status pengaktifan</translation> <translation id="2271469253353559191">Jadual mod gelap</translation> +<translation id="2275586345903859204">Pembaikan selesai</translation> <translation id="2287186687001756809">Tiada imej tersedia. Untuk menambah foto, lawati <ph name="LINK" /></translation> <translation id="2307344026739914387">Gunakan pasangan kunci semasa</translation> <translation id="2320295602967756579">Dayakan tema cerah</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Dayakan mod warna gelap</translation> <translation id="2740531572673183784">Ok</translation> <translation id="2751739896257479635">Pengesahan Fasa 2 EAP</translation> +<translation id="2756652381241102009">Jalankan Diagnostik</translation> <translation id="2783010256799387990">LULUS</translation> <translation id="2789486458103222910">Okey</translation> <translation id="2805756323405976993">Apl</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Menyambung...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Memulakan semula <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Avatar Semasa</translation> <translation id="4425149324548788773">Drive Saya</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> dimatikan</translation> <translation id="4429881212383817840">Tiket Kerberos akan tamat tempoh tidak lama lagi</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Akses ibu bapa</translation> <translation id="473775607612524610">Kemas kini</translation> <translation id="4744944742468440486">Maklumat yang berkaitan dengan pilihan anda</translation> +<translation id="4751272708893364980">Lihat log RMA</translation> <translation id="4773299976671772492">Dihentikan</translation> <translation id="4774530504324923332">Anda akan memerlukan kunci keselamatan didayakan RSU, pengimbas kod QR dan peranti kedua yang mempunyai sambungan Internet</translation> <translation id="4782311465517282004">Dapatkan takrif, terjemahan atau penukaran unit apabila anda mengklik kanan atau menyentuh & menahan teks</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Rangkaian Wi-Fi tidak selamat</translation> <translation id="5376354385557966694">Mod cerah automatik</translation> <translation id="537872351913703572">Peranti akan menjadi milik pengguna atau organisasi lain</translation> +<translation id="5389224261615877010">Pelangi</translation> <translation id="5395600419410242651">Padamkan semua data</translation> <translation id="5400907029458559844">Peranti sedang menyambung.</translation> <translation id="5401938042319910061">Jalankan Semua Rutin</translation> +<translation id="5406131354638931058">Mematikan bateri dalaman untuk peranti yang dihantar atau disimpan</translation> <translation id="5423849171846380976">Diaktifkan</translation> <translation id="5430931332414098647">Penambatan Segera</translation> <translation id="5431318178759467895">Warna</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Fail tidak dijumpai</translation> <translation id="5939518447894949180">Tetapkan semula</translation> <translation id="594552776027197022">Jana pasangan kunci rawak</translation> +<translation id="5951259522948394825">Sahkan semuanya berada di tempat yang betul dan lihat laporan diagnostik</translation> <translation id="5972388717451707488">Enjin Kemaskinian</translation> <translation id="5984145644188835034">Kertas Dinding Lalai</translation> <translation id="6017514345406065928">Hijau</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Pilih <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Log RMA</translation> <translation id="8206859287963243715">Selular</translation> <translation id="8208861521865154048">Manfaat</translation> <translation id="8217675307824400706">Berhubung</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Mod gelap automatik</translation> <translation id="8461329675984532579">Nama pembekal tempatan</translation> <translation id="8467104829907989997">Menentukurkan komponen...</translation> +<translation id="8474030592808010086">Cabut palam peranti untuk mematikan bateri dalaman</translation> <translation id="8475690821716466388">Rangkaian Wi-Fi selamat dengan protokol lemah WEP PSK</translation> <translation id="8477551185774834963">Kependaman DNS sedikit melebihi ambang yang dibenarkan</translation> <translation id="8483248364096924578">Alamat IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Kekuatan isyarat</translation> <translation id="8910721771319628100">Rangkaian lalai melebihi ambang kependaman</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Lihat apa yang telah dibetulkan</translation> <translation id="8919837981463578619">Gagal - Dulang tiada</translation> <translation id="8923267550422472772">Hari dalam bulan untuk ditetapkan semula</translation> <translation id="8928727111548978589">Gagal - Kehabisan kertas</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb index 88d23ee0..38f8a6c 100644 --- a/chromeos/strings/chromeos_strings_pa.xtb +++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">ਘਰੇਲੂ ਨੈੱਟਵਰਕ, ਰੋਮਿੰਗ ਨਹੀਂ</translation> <translation id="1327977588028644528">ਗੇਟਵੇ</translation> +<translation id="1328223165223065150">ਵਾਲਪੇਪਰ ਦਾ ਰੰਗ</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">ਸਕੈਨ ਕਰਨ ਯੋਗ ਖੇਤਰ ਵਿੱਚ ਫਿੱਟ ਕਰੋ</translation> <translation id="1367951781824006909">ਇੱਕ ਫਾਈਲ ਚੁਣੋ</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">ਚਿੱਤਰ ਸਰੋਤ</translation> <translation id="1451536289672181509">ਡੀਵਾਈਸ ਇੱਕ ਕੀ-ਬੋਰਡ ਹੈ।</translation> <translation id="1459693405370120464">ਮੌਸਮ</translation> +<translation id="1459784442280469416">USB ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੋ</translation> <translation id="1468664791493211953">ਪੇਸ਼ਕਸ਼ਾਂ</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> ਵੱਲੋਂ ਇਸ ਡੀਵਾਈਸ ਦਾ ਪ੍ਰਬੰਧਨ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਅਤੇ ਤੁਹਾਡੀ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।</translation> <translation id="1478594628797167447">ਸਕੈਨਰ</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> ਇਸ ਵਰਤੋਂਕਾਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਦਾ ਹੈ ਅਤੇ ਦੂਰ-ਦਰਾਡੇ ਤੋਂ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਅਤੇ ਵਰਤੋਂਕਾਰ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।</translation> <translation id="150962533380566081">ਅਵੈਧ PUK।</translation> <translation id="1510238584712386396">ਲੌਂਚਰ</translation> +<translation id="1512982610995527443">ਡੀਵਾਈਸ 5 ਸਕਿੰਟਾਂ ਵਿੱਚ ਬੰਦ ਹੋ ਜਾਵੇਗਾ</translation> +<translation id="1522984060396982789">ਤੁਹਾਡੀ ਮੁਰੰਮਤ ਸਫਲ ਰਹੀ। ਤੁਸੀਂ ਡੀਵਾਈਸ ਨੂੰ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ ਕੁਝ ਵਧੀਕ ਕਾਰਵਾਈਆਂ ਕਰ ਸਕਦੇ ਹੋ।</translation> <translation id="152892567002884378">ਅਵਾਜ਼ ਵਧਾਓ</translation> <translation id="1555130319947370107">ਨੀਲਾ</translation> <translation id="155865706765934889">ਟਚਪੈਡ</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">ਹਾਰਡਵੇਅਰ ਸੰਸ਼ੋਧਨ</translation> <translation id="1905710495812624430">ਅਧਿਕਤਮ ਮਨਜ਼ੂਰ ਕੀਤੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ ਵਧੀਆਂ।</translation> <translation id="1908234395526491708">UDP ਬੇਨਤੀ ਦੀਆਂ ਅਸਫਲਤਾਵਾਂ</translation> +<translation id="1932611479324127242">ਬੈਟਰੀ ਕੱਟ ਆਫ਼ ਕਰੋ</translation> <translation id="1947737735496445907">ਪ੍ਰਿੰਟ ਕੀਤੀ ਗਈ</translation> <translation id="1951012854035635156">Assistant</translation> <translation id="1977994649430373166">Google ਪ੍ਰੋਫਾਈਲ ਫ਼ੋਟੋ</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">ਐਨੀਮੇਸ਼ਨ ਰਾਹੀਂ ਦਿਖਾਓ</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> ਫ਼ੋਟੋਆਂ</translation> +<translation id="2154739667870063220">ਰੀਬੂਟ ਕਰੋ</translation> <translation id="2157959690810728433">ਕਤਾਰਬੱਧ</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</translation> <translation id="2161394479394250669">ਪ੍ਰਿੰਟ ਜੌਬ ਰੱਦ ਕਰੋ</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">ਖਾਕਾ ਸਵਿੱਚ ਕਰਨ ਵਾਲੀ ਕੁੰਜੀ</translation> <translation id="225692081236532131">ਕਿਰਿਆਸ਼ੀਲਤਾ ਸਥਿਤੀ</translation> <translation id="2271469253353559191">ਗੂੜ੍ਹਾ ਮੋਡ ਨਿਯਤ ਕਰੋ</translation> +<translation id="2275586345903859204">ਮੁਰੰਮਤ ਪੂਰੀ ਹੋਈ</translation> <translation id="2287186687001756809">ਕੋਈ ਚਿੱਤਰ ਉਪਲਬਧ ਨਹੀਂ ਹੈ। ਫ਼ੋਟੋਆਂ ਸ਼ਾਮਲ ਕਰਨ ਲਈ, <ph name="LINK" /> ’ਤੇ ਜਾਓ</translation> <translation id="2307344026739914387">ਮੌਜੂਦਾ ਕੁੰਜੀਆਂ ਦਾ ਜੋੜਾ ਵਰਤੋ</translation> <translation id="2320295602967756579">ਹਲਕਾ ਥੀਮ ਚਾਲੂ ਕਰੋ</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">ਗੂੜ੍ਹੇ ਰੰਗ ਵਾਲੇ ਮੋਡ ਨੂੰ ਚਾਲੂ ਕਰੋ</translation> <translation id="2740531572673183784">ਠੀਕ</translation> <translation id="2751739896257479635">EAP ਫੇਜ਼ 2 ਪ੍ਰਮਾਣੀਕਰਨ</translation> +<translation id="2756652381241102009">ਤਸ਼ਖੀਸ ਚਲਾਓ</translation> <translation id="2783010256799387990">ਪਾਸ ਕੀਤਾ</translation> <translation id="2789486458103222910">ਠੀਕ ਹੈ</translation> <translation id="2805756323405976993">ਐਪਸ</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> +<translation id="4415951057168511744">ਮੌਜੂਦਾ ਅਵਤਾਰ</translation> <translation id="4425149324548788773">My Drive</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> ਬੰਦ ਹੈ</translation> <translation id="4429881212383817840">Kerberos ਟਿਕਟ ਦੀ ਮਿਆਦ ਜਲਦ ਹੀ ਮੁੱਕ ਜਾਵੇਗੀ</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">ਮਾਂ-ਪਿਓ ਲਈ ਪਹੁੰਚ</translation> <translation id="473775607612524610">ਅੱਪਡੇਟ ਕਰੋ</translation> <translation id="4744944742468440486">ਤੁਹਾਡੀ ਚੋਣ ਨਾਲ ਸੰਬੰਧਿਤ ਜਾਣਕਾਰੀ</translation> +<translation id="4751272708893364980">RMA ਲੌਗ ਦੇਖੋ</translation> <translation id="4773299976671772492">ਬੰਦ ਕੀਤਾ</translation> <translation id="4774530504324923332">ਤੁਹਾਨੂੰ RSU-ਸਮਰਥਿਤ ਸੁਰੱਖਿਆ ਕੁੰਜੀ, QR ਕੋਡ ਸਕੈਨਰ, ਅਤੇ ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਵਾਲੇ ਕਿਸੇ ਦੂਜੇ ਡੀਵਾਈਸ ਦੀ ਲੋੜ ਪਵੇਗੀ</translation> <translation id="4782311465517282004">ਲਿਖਤ ਨੂੰ ਸਪਰਸ਼ ਕਰਕੇ ਰੱਖਣ ਜਾਂ ਉਸ 'ਤੇ ਸੱਜਾ-ਕਲਿੱਕ ਕਰਨ 'ਤੇ ਪਰਿਭਾਸ਼ਾਵਾਂ, ਅਨੁਵਾਦ, ਜਾਂ ਇਕਾਈ ਰੂਪਾਂਤਰਨ ਪ੍ਰਾਪਤ ਕਰੋ</translation> @@ -450,9 +460,11 @@ <translation id="5372659122375744710">ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਹੈ</translation> <translation id="5376354385557966694">ਸਵੈਚਲਿਤ ਹਲਕਾ ਮੋਡ</translation> <translation id="537872351913703572">ਡੀਵਾਈਸ ਕਿਸੇ ਵੱਖਰੇ ਵਰਤੋਂਕਾਰ ਜਾਂ ਸੰਸਥਾ ਕੋਲ ਜਾਵੇਗਾ</translation> +<translation id="5389224261615877010">ਸਤਰੰਗ</translation> <translation id="5395600419410242651">ਸਾਰਾ ਡਾਟਾ ਮਿਟਾਓ</translation> <translation id="5400907029458559844">ਡੀਵਾਈਸ ਨੂੰ ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।</translation> <translation id="5401938042319910061">ਸਾਰੇ ਨਿਯਮਬੱਧ ਕੰਮ ਚਲਾਓ</translation> +<translation id="5406131354638931058">ਸ਼ਿੱਪ ਜਾਂ ਸਟੋਰ ਕੀਤੇ ਜਾ ਰਹੇ ਡੀਵਾਈਸਾਂ ਲਈ ਬੈਟਰੀ ਕੱਟ ਆਫ਼ ਕਰੋ</translation> <translation id="5423849171846380976">ਸਕਿਰਿਆ ਕੀਤਾ</translation> <translation id="5430931332414098647">ਤਤਕਾਲ ਟੈਦਰਿੰਗ</translation> <translation id="5431318178759467895">ਰੰਗ</translation> @@ -505,6 +517,7 @@ <translation id="5931523347251946569">ਫ਼ਾਈਲ ਨਹੀਂ ਮਿਲੀ</translation> <translation id="5939518447894949180">ਰੀਸੈਟ ਕਰੋ</translation> <translation id="594552776027197022">ਬੇਤਰਤੀਬ ਕੁੰਜੀਆਂ ਦਾ ਜੋੜਾ ਸਿਰਜੋ</translation> +<translation id="5951259522948394825">ਤਸਦੀਕ ਕਰੋ ਕਿ ਸਭ ਕੁਝ ਸਹੀ ਥਾਂ 'ਤੇ ਹੈ ਅਤੇ ਤਸ਼ਖੀਸ ਰਿਪੋਰਟ ਦੇਖੋ</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਵਾਲਪੇਪਰ</translation> <translation id="6017514345406065928">ਹਰਾ</translation> @@ -725,6 +738,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> ਚੁਣੋ</translation> <translation id="8179976553408161302">ਦਰਜ ਕਰੋ</translation> +<translation id="819552138404104974">RMA ਲੌਗ</translation> <translation id="8206859287963243715">Cellular</translation> <translation id="8208861521865154048">ਫ਼ਾਇਦੇ</translation> <translation id="8217675307824400706">ਕਨੈਕਟ ਹੋਵੋ</translation> @@ -758,6 +772,7 @@ <translation id="8456761643544401578">ਸਵੈਚਲਿਤ ਗੂੜ੍ਹਾ ਮੋਡ</translation> <translation id="8461329675984532579">ਹੋਮ ਪ੍ਰਦਾਨਕ ਨਾਮ</translation> <translation id="8467104829907989997">ਕੰਪੋਨੈਂਟਾਂ ਨੂੰ ਕੈਲੀਬ੍ਰੇਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> +<translation id="8474030592808010086">ਬੈਟਰੀ ਕੱਟ ਆਫ਼ ਕਰਨ ਲਈ ਡੀਵਾਈਸ ਨੂੰ ਅਣਪਲੱਗ ਕਰੋ</translation> <translation id="8475690821716466388">ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਕਮਜ਼ੋਰ ਪ੍ਰੋਟੋਕੋਲ WEP PSK ਨਾਲ ਸੁਰੱਖਿਅਤ ਹੈ</translation> <translation id="8477551185774834963">DNS ਵਿਲੰਬਤਾ ਇਜਾਜ਼ਤਯੋਗ ਨਿਊਨਤਮ ਸੀਮਾ ਤੋਂ ਥੋੜ੍ਹੀ ਜਿਹੀ ਉੱਤੇ ਹੈ</translation> <translation id="8483248364096924578">IP ਪਤਾ</translation> @@ -803,6 +818,7 @@ <translation id="8898840733695078011">ਸਿਗਨਲ ਸ਼ਕਤੀ</translation> <translation id="8910721771319628100">ਪੂਰਵ-ਨਿਰਧਾਰਤ ਨੈੱਟਵਰਕ ਵਿਲੰਬਤਾ ਨਿਊਨਤਮ ਸੀਮਾ ਤੋਂ ਉੱਤੇ ਹੈ</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> ਦਾ <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">ਦੇਖੋ ਕਿ ਕੀ ਠੀਕ ਕੀਤਾ ਗਿਆ ਹੈ</translation> <translation id="8919837981463578619">ਅਸਫਲ ਰਹੀ - ਟ੍ਰੇਅ ਮੌਜੂਦ ਨਹੀਂ ਹੈ</translation> <translation id="8923267550422472772">ਰੀਸੈੱਟ ਕਰਨ ਲਈ ਮਹੀਨੇ ਦਾ ਦਿਨ</translation> <translation id="8928727111548978589">ਅਸਫਲ ਰਹੀ - ਕਾਗਜ਼ ਖਤਮ ਹੋ ਗਏ</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb index 95dd17d..73a3bbd 100644 --- a/chromeos/strings/chromeos_strings_pt-BR.xtb +++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">VPN do Android</translation> <translation id="131461803491198646">Rede doméstica, não está em roaming</translation> <translation id="1327977588028644528">Gateway</translation> +<translation id="1328223165223065150">Cor do plano de fundo</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Ajustar à área de digitalização</translation> <translation id="1367951781824006909">Escolher um arquivo</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Origem da imagem</translation> <translation id="1451536289672181509">Este dispositivo é um teclado.</translation> <translation id="1459693405370120464">Clima</translation> +<translation id="1459784442280469416">Salvar no pen drive</translation> <translation id="1468664791493211953">Ofertas</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> gerencia este dispositivo e pode monitorar sua atividade.</translation> <translation id="1478594628797167447">Scanner</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> gerencia o usuário. Esse administrador pode controlar as configurações e monitorar a atividade do usuário remotamente.</translation> <translation id="150962533380566081">PUK inválida.</translation> <translation id="1510238584712386396">Iniciador</translation> +<translation id="1512982610995527443">O dispositivo vai ser desligado em cinco segundos</translation> +<translation id="1522984060396982789">O reparo foi concluído. Você pode desligar o dispositivo ou realizar mais algumas ações.</translation> <translation id="152892567002884378">Aumentar volume</translation> <translation id="1555130319947370107">Azul</translation> <translation id="155865706765934889">Touchpad</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Revisão do hardware</translation> <translation id="1905710495812624430">O número máximo de tentativas permitidas foi excedido.</translation> <translation id="1908234395526491708">Falhas de solicitações UDP</translation> +<translation id="1932611479324127242">Desligar a bateria</translation> <translation id="1947737735496445907">Impresso</translation> <translation id="1951012854035635156">Assistente</translation> <translation id="1977994649430373166">Foto do perfil do Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Flutue</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> fotos</translation> +<translation id="2154739667870063220">Reinicializar</translation> <translation id="2157959690810728433">EM FILA</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: tentar novamente</translation> <translation id="2161394479394250669">Cancelar trabalho de impressão</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Alternar layout</translation> <translation id="225692081236532131">Status da ativação</translation> <translation id="2271469253353559191">Programação do modo escuro</translation> +<translation id="2275586345903859204">O reparo foi concluído</translation> <translation id="2287186687001756809">Nenhuma imagem disponível. Para adicionar fotos, acesse <ph name="LINK" /></translation> <translation id="2307344026739914387">Usar par de chaves atual</translation> <translation id="2320295602967756579">Ativar o tema claro</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Ativar o modo de cor escuro</translation> <translation id="2740531572673183784">Ok</translation> <translation id="2751739896257479635">Autenticação EAP Fase 2</translation> +<translation id="2756652381241102009">Executar diagnóstico</translation> <translation id="2783010256799387990">APROVADO</translation> <translation id="2789486458103222910">Ok</translation> <translation id="2805756323405976993">Apps</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Conectando...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Reiniciando <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Avatar atual</translation> <translation id="4425149324548788773">Meu Drive</translation> <translation id="4428374560396076622">A rede <ph name="NETWORK_NAME" /> está desativada</translation> <translation id="4429881212383817840">O tíquete do Kerberos expirará em breve</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Acesso do familiar responsável</translation> <translation id="473775607612524610">Atualizar</translation> <translation id="4744944742468440486">Informações relacionadas à sua seleção</translation> +<translation id="4751272708893364980">Conferir registros da ADM</translation> <translation id="4773299976671772492">Interrompida</translation> <translation id="4774530504324923332">Você vai precisar de uma chave de segurança habilitada para RSU, um leitor de código QR e um segundo dispositivo com uma conexão de Internet</translation> <translation id="4782311465517282004">Veja definições, traduções ou conversões de unidades ao clicar com o botão direito do mouse no texto ou tocar nele e mantê-lo pressionado</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">A rede Wi-Fi não é segura</translation> <translation id="5376354385557966694">Modo claro automático</translation> <translation id="537872351913703572">O dispositivo vai mudar para um usuário ou uma organização diferente</translation> +<translation id="5389224261615877010">Arco-íris</translation> <translation id="5395600419410242651">Limpar todos os dados</translation> <translation id="5400907029458559844">O dispositivo está conectando.</translation> <translation id="5401938042319910061">Executar todas as rotinas</translation> +<translation id="5406131354638931058">Desligue a bateria de dispositivos que vão ser enviados ou armazenados</translation> <translation id="5423849171846380976">Ativado</translation> <translation id="5430931332414098647">Tethering instantâneo</translation> <translation id="5431318178759467895">Colorido</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Arquivo não encontrado</translation> <translation id="5939518447894949180">Redefinir</translation> <translation id="594552776027197022">Gerar par de chaves aleatório</translation> +<translation id="5951259522948394825">Confirme se tudo está no lugar certo e confira o relatório de diagnóstico</translation> <translation id="5972388717451707488">Mecanismo de atualização</translation> <translation id="5984145644188835034">Plano de fundo padrão</translation> <translation id="6017514345406065928">Verde</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTE Advanced</translation> <translation id="8143951647992294073">Selecionar <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Entrar</translation> +<translation id="819552138404104974">Registros da ADM</translation> <translation id="8206859287963243715">Celular</translation> <translation id="8208861521865154048">Benefícios</translation> <translation id="8217675307824400706">Conectar</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Modo escuro automático</translation> <translation id="8461329675984532579">Nome do provedor doméstico</translation> <translation id="8467104829907989997">Calibrando componentes…</translation> +<translation id="8474030592808010086">Desconecte o dispositivo para desligar a bateria</translation> <translation id="8475690821716466388">A rede Wi-Fi é protegida pelo protocolo fraco WEP PSK</translation> <translation id="8477551185774834963">Latência do DNS um pouco acima do limite permitido</translation> <translation id="8483248364096924578">Endereço IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Intensidade do sinal</translation> <translation id="8910721771319628100">Rede padrão acima do limite de latência</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Saiba o que foi consertado</translation> <translation id="8919837981463578619">Falha - Bandeja ausente</translation> <translation id="8923267550422472772">Dia do mês para redefinição</translation> <translation id="8928727111548978589">Falha - Sem papel</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-PT.xtb b/chromeos/strings/chromeos_strings_pt-PT.xtb index 3601208..c651cbd 100644 --- a/chromeos/strings/chromeos_strings_pt-PT.xtb +++ b/chromeos/strings/chromeos_strings_pt-PT.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">VPN Android</translation> <translation id="131461803491198646">Rede doméstica, sem roaming</translation> <translation id="1327977588028644528">Gateway</translation> +<translation id="1328223165223065150">Cor da imagem de fundo</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Ajustar à área de digitalização</translation> <translation id="1367951781824006909">Selecione um ficheiro</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Fonte da imagem</translation> <translation id="1451536289672181509">O dispositivo é um teclado.</translation> <translation id="1459693405370120464">Meteorologia</translation> +<translation id="1459784442280469416">Guardar na unidade USB</translation> <translation id="1468664791493211953">Ofertas</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> gere este dispositivo e pode conseguir monitorizar a sua atividade.</translation> <translation id="1478594628797167447">Scanner</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> gere este utilizador e pode gerir remotamente as definições e monitorizar a atividade do utilizador.</translation> <translation id="150962533380566081">PUK inválido.</translation> <translation id="1510238584712386396">Iniciador</translation> +<translation id="1512982610995527443">O dispositivo vai encerrar daqui a 5 segundos</translation> +<translation id="1522984060396982789">A reparação foi realizada com êxito. Pode encerrar o dispositivo ou tomar algumas medidas adicionais.</translation> <translation id="152892567002884378">Aumentar o volume</translation> <translation id="1555130319947370107">Azul</translation> <translation id="155865706765934889">Touchpad</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Revisão de hardware</translation> <translation id="1905710495812624430">Foi excedido o número máximo de tentativas permitidas.</translation> <translation id="1908234395526491708">Falhas de pedidos de UDP.</translation> +<translation id="1932611479324127242">Corte da bateria</translation> <translation id="1947737735496445907">Impressão concluída</translation> <translation id="1951012854035635156">Assistente</translation> <translation id="1977994649430373166">Foto do perfil do Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">A flutuar</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> fotos</translation> +<translation id="2154739667870063220">Reiniciar</translation> <translation id="2157959690810728433">EM LISTA DE ESPERA</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: tente novamente</translation> <translation id="2161394479394250669">Cancelar tarefa de impressão</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Interruptor do esquema</translation> <translation id="225692081236532131">Estado da ativação</translation> <translation id="2271469253353559191">Horário do modo escuro</translation> +<translation id="2275586345903859204">A reparação está concluída</translation> <translation id="2287186687001756809">Nenhuma imagem disponível. Para adicionar fotos, aceda a <ph name="LINK" /></translation> <translation id="2307344026739914387">Utilizar par de chaves atual</translation> <translation id="2320295602967756579">Ativar tema claro</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Ativar modo de cor escura</translation> <translation id="2740531572673183784">OK</translation> <translation id="2751739896257479635">Autenticação da fase 2 de EAP</translation> +<translation id="2756652381241102009">Executar diagnósticos</translation> <translation id="2783010256799387990">APROVADO</translation> <translation id="2789486458103222910">Ok</translation> <translation id="2805756323405976993">Apps</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">A ligar...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">A reiniciar o dispositivo <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Avatar atual</translation> <translation id="4425149324548788773">O meu disco</translation> <translation id="4428374560396076622">A rede <ph name="NETWORK_NAME" /> está desativada</translation> <translation id="4429881212383817840">A permissão Kerberos expira em breve</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Acesso parental</translation> <translation id="473775607612524610">Atualizar</translation> <translation id="4744944742468440486">Informações relacionadas com a sua seleção</translation> +<translation id="4751272708893364980">Ver registos RMA</translation> <translation id="4773299976671772492">Parado</translation> <translation id="4774530504324923332">Vai precisar de uma chave de segurança com RSU (Desbloqueio por servidor RMA) ativado, um Leitor de códigos QR e um segundo dispositivo com ligação à Internet</translation> <translation id="4782311465517282004">Obtenha definições, traduções ou conversões de unidades quando clicar com o botão direito do rato ou tocar sem soltar no texto</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">A rede Wi-Fi não é segura.</translation> <translation id="5376354385557966694">Modo claro automático</translation> <translation id="537872351913703572">O dispositivo vai para um utilizador ou uma organização diferente</translation> +<translation id="5389224261615877010">Arco-íris</translation> <translation id="5395600419410242651">Apagar todos os dados</translation> <translation id="5400907029458559844">O dispositivo está a ligar.</translation> <translation id="5401938042319910061">Executar todas as rotinas</translation> +<translation id="5406131354638931058">Faça o corte da bateria para os dispositivos a enviar ou armazenar</translation> <translation id="5423849171846380976">Activado</translation> <translation id="5430931332414098647">Ligação via telemóvel instantânea</translation> <translation id="5431318178759467895">Cor</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Ficheiro não encontrado</translation> <translation id="5939518447894949180">Repor</translation> <translation id="594552776027197022">Gerar par de chaves aleatório</translation> +<translation id="5951259522948394825">Confirme se está tudo no local certo e veja o relatório de diagnóstico</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Imagem de fundo predefinida</translation> <translation id="6017514345406065928">Verde</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Selecionar <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Registos de RMA (Autorização de devolução de mercadoria)</translation> <translation id="8206859287963243715">Telemóvel</translation> <translation id="8208861521865154048">Benefícios</translation> <translation id="8217675307824400706">Estabeleça ligação</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Modo escuro automático</translation> <translation id="8461329675984532579">Nome do fornecedor base</translation> <translation id="8467104829907989997">A calibrar os componentes…</translation> +<translation id="8474030592808010086">Desligue o dispositivo para fazer o corte da bateria</translation> <translation id="8475690821716466388">A rede Wi-Fi está protegida com um protocolo pouco seguro WEP PSK.</translation> <translation id="8477551185774834963">Latência de DNS ligeiramente acima do limite permitido.</translation> <translation id="8483248364096924578">Endereço IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Intensidade do sinal</translation> <translation id="8910721771319628100">Rede predefinida acima do limite de latência.</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Veja o que foi corrigido</translation> <translation id="8919837981463578619">Falha – Tabuleiro em falta</translation> <translation id="8923267550422472772">Dia do mês para a reposição</translation> <translation id="8928727111548978589">Falha – Sem papel</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb index c2334d6..243cbff 100644 --- a/chromeos/strings/chromeos_strings_ru.xtb +++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Домашняя сеть, без роуминга</translation> <translation id="1327977588028644528">Шлюз</translation> +<translation id="1328223165223065150">Цвет обоев</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">По области сканирования</translation> <translation id="1367951781824006909">Выберите файл</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Источник изображения</translation> <translation id="1451536289672181509">Это клавиатура.</translation> <translation id="1459693405370120464">Погода</translation> +<translation id="1459784442280469416">Сохранить на USB-накопитель</translation> <translation id="1468664791493211953">Предложения</translation> <translation id="1476467821656042872">Этим устройством управляет <ph name="MANAGER" />. Ваши действия могут отслеживаться.</translation> <translation id="1478594628797167447">Сканер</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732">Этим аккаунтом управляет <ph name="MANAGER" />. Администратор может отслеживать действия пользователя, а также удаленно изменять настройки.</translation> <translation id="150962533380566081">Неверный PUK-код.</translation> <translation id="1510238584712386396">Панель запуска</translation> +<translation id="1512982610995527443">Устройство будет выключено через 5 секунд.</translation> +<translation id="1522984060396982789">Ремонт завершен. Можно выключить устройство или выполнить дополнительные действия.</translation> <translation id="152892567002884378">Увеличить громкость</translation> <translation id="1555130319947370107">Синий</translation> <translation id="155865706765934889">Сенсорная панель</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Версия оборудования</translation> <translation id="1905710495812624430">Превышено максимально допустимое число попыток.</translation> <translation id="1908234395526491708">Невыполненные запросы UDP.</translation> +<translation id="1932611479324127242">Отключить батарею</translation> <translation id="1947737735496445907">Напечатано</translation> <translation id="1951012854035635156">Ассистент</translation> <translation id="1977994649430373166">Фото профиля Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Течение воды</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" /> %</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> фото</translation> +<translation id="2154739667870063220">Перезагрузить</translation> <translation id="2157959690810728433">В ОЧЕРЕДИ</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />. Повторить</translation> <translation id="2161394479394250669">Отменить задание печати</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Переключение раскладки клавиатуры</translation> <translation id="225692081236532131">Статус активации</translation> <translation id="2271469253353559191">Расписание тёмной темы</translation> +<translation id="2275586345903859204">Ремонт завершен</translation> <translation id="2287186687001756809">Изображений нет. Добавить фотографии можно на сайте <ph name="LINK" />.</translation> <translation id="2307344026739914387">Использовать текущую пару ключей</translation> <translation id="2320295602967756579">Использовать светлую тему</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Включить режим темных цветов</translation> <translation id="2740531572673183784">ОК</translation> <translation id="2751739896257479635">2-й этап аутентификации EAP</translation> +<translation id="2756652381241102009">Запустить диагностику</translation> <translation id="2783010256799387990">ПРОЙДЕНО</translation> <translation id="2789486458103222910">ОК</translation> <translation id="2805756323405976993">Сервисы</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Подключение…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" />: перезапуск…</translation> +<translation id="4415951057168511744">Текущий аватар</translation> <translation id="4425149324548788773">Мой диск</translation> <translation id="4428374560396076622">Сеть "<ph name="NETWORK_NAME" />" отключена.</translation> <translation id="4429881212383817840">Срок действия билета Kerberos истекает</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Родительский доступ</translation> <translation id="473775607612524610">Обновить</translation> <translation id="4744944742468440486">Информация на основе выделенного текста</translation> +<translation id="4751272708893364980">Посмотреть журналы разрешений на возврат товара</translation> <translation id="4773299976671772492">Остановлено</translation> <translation id="4774530504324923332">Потребуется электронный ключ с поддержкой RSU, сканер QR-кодов и второе устройство с доступом в интернет</translation> <translation id="4782311465517282004">Получайте определения слов, перевод или значение в других единицах измерения: достаточно нажать на текст правой кнопкой мыши или коснуться его и удерживать.</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Сеть Wi-Fi недостаточно безопасна.</translation> <translation id="5376354385557966694">Автоматическая светлая тема</translation> <translation id="537872351913703572">Устройство будет передано другому пользователю или организации</translation> +<translation id="5389224261615877010">Радуга</translation> <translation id="5395600419410242651">Удалить все данные</translation> <translation id="5400907029458559844">Устройство подключается.</translation> <translation id="5401938042319910061">Запустить все проверки</translation> +<translation id="5406131354638931058">Отключение батареи для устройств, подлежащих отправке или хранящихся на складе</translation> <translation id="5423849171846380976">Активировано</translation> <translation id="5430931332414098647">Мгновенная точка доступа</translation> <translation id="5431318178759467895">Цветная печать</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Файл не найден.</translation> <translation id="5939518447894949180">Сбросить</translation> <translation id="594552776027197022">Создать случайную пару ключей</translation> +<translation id="5951259522948394825">Позволяет убедиться в отсутствии проблем и посмотреть отчет о диагностике.</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Обои по умолчанию</translation> <translation id="6017514345406065928">Зеленый</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Выбрать вариант "<ph name="TOPIC_SOURCE" />" (<ph name="TOPIC_SOURCE_DESC" />)</translation> <translation id="8179976553408161302">ВВОД</translation> +<translation id="819552138404104974">Журналы разрешений на возврат товара</translation> <translation id="8206859287963243715">Сотовый</translation> <translation id="8208861521865154048">Преимущества</translation> <translation id="8217675307824400706">Подключение</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Автоматическая тёмная тема</translation> <translation id="8461329675984532579">Название провайдера</translation> <translation id="8467104829907989997">Калибровка компонентов…</translation> +<translation id="8474030592808010086">Чтобы отключить батарею, отсоедините устройство от сети.</translation> <translation id="8475690821716466388">Безопасность сети Wi-Fi обеспечивается недостаточно надежным протоколом WEP PSK</translation> <translation id="8477551185774834963">Задержка на сервере доменных имен незначительно превышает допустимое значение.</translation> <translation id="8483248364096924578">IP-адрес</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Уровень сигнала</translation> <translation id="8910721771319628100">В сети, используемой по умолчанию, превышено пороговое значение задержки.</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> пользователя <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Позволяет смотреть исправления</translation> <translation id="8919837981463578619">Сбой: нет лотка для бумаги</translation> <translation id="8923267550422472772">День месяца для сброса показателя</translation> <translation id="8928727111548978589">Сбой: закончилась бумага</translation>
diff --git a/chromeos/strings/chromeos_strings_si.xtb b/chromeos/strings/chromeos_strings_si.xtb index d396e09..758c6f01 100644 --- a/chromeos/strings/chromeos_strings_si.xtb +++ b/chromeos/strings/chromeos_strings_si.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">නිවෙස් ජාලය, සංක්රමණයේ නොවේ</translation> <translation id="1327977588028644528">වාහල</translation> +<translation id="1328223165223065150">වෝල්පේපර වර්ණය</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">ස්කෑන් කළ හැකි ප්රදේශයට ගළපන්න</translation> <translation id="1367951781824006909">ගොනුවක් තෝරන්න</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">පින්තූර මූලාශ්රය</translation> <translation id="1451536289672181509">උපාංගය යතුරු පුවරුවකි.</translation> <translation id="1459693405370120464">කාලගුණය</translation> +<translation id="1459784442280469416">USB වෙත සුරකින්න</translation> <translation id="1468664791493211953">දීමනා</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> මෙම උපාංගය කළමනාකරණය කරන අතර ඔබගේ ක්රියාකාරකම නිරීක්ෂණ කිරීමට හැකි වීමට ඉඩ ඇත.</translation> <translation id="1478594628797167447">ස්කෑනරය</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> මෙම පරිශීලකයා කළමනාකරණය කරන අතර දුරස්ථව සැකසීම් කළමනාකරණය කිරීමට සහ පරිශීලක ක්රියාකාරකම් නිරීක්ෂණය කිරීමට හැකිය.</translation> <translation id="150962533380566081">වලංගු නොවන PUK.</translation> <translation id="1510238584712386396">දියත්කරණය</translation> +<translation id="1512982610995527443">තත්පර 5කින් උපාංගය වැසෙනු ඇත</translation> +<translation id="1522984060396982789">ඔබගේ අලුත්වැඩියාව සාර්ථක විය. ඔබට උපාංගය වැසීමට හෝ යම් අමතර ක්රියාමාර්ග ගැනීමට හැකිය.</translation> <translation id="152892567002884378">හඬ පරිමාව වැඩි</translation> <translation id="1555130319947370107">නිල්</translation> <translation id="155865706765934889">ස්පර්ශ පුවරුව</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">දෘඨාංග සංශෝධනය</translation> <translation id="1905710495812624430">ඉඩ දෙන උපරිම උත්සාහයන් ගණන ඉක්මවා ඇත.</translation> <translation id="1908234395526491708">UDP ඉල්ලීම් අසාර්ථක වීම්</translation> +<translation id="1932611479324127242">බැටරිය කපා හැරීම</translation> <translation id="1947737735496445907">මුද්රණය කරන ලදි</translation> <translation id="1951012854035635156">සහායක</translation> <translation id="1977994649430373166">Google පැතිකඩ ඡායාරූපය</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">පාවී යන්න</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059">ඡායාරූප <ph name="NUMBER" />ක්</translation> +<translation id="2154739667870063220">නැවත පණ ගන්වන්න</translation> <translation id="2157959690810728433">පෙළ ගස්වන ලදි</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: යළි උත්සාහ කරන්න</translation> <translation id="2161394479394250669">මුද්රණ කාර්යය අවලංගු කරන්න</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">පිරිසැලසුම් මාරුව</translation> <translation id="225692081236532131">සක්රිය කිරීමේ තත්ත්වය</translation> <translation id="2271469253353559191">අඳුරු ප්රකාර කාල සටහන</translation> +<translation id="2275586345903859204">අලුත්වැඩියාව සම්පූර්ණයි</translation> <translation id="2287186687001756809">රූප නැත. ඡායාරූප එක් කිරීමට, <ph name="LINK" /> වෙත යන්න</translation> <translation id="2307344026739914387">වත්මන් යතුරු යුගල භාවිත කරන්න</translation> <translation id="2320295602967756579">ආලෝක තේමාව සබල කරන්න</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">අඳුරු වර්ණ ප්රකාරය සබල කරන්න</translation> <translation id="2740531572673183784">හරි</translation> <translation id="2751739896257479635">EAP අදියර 2 සත්යාපනය</translation> +<translation id="2756652381241102009">දෝෂ නිර්ණ ධාවනය කරන්න</translation> <translation id="2783010256799387990">සමත් විය</translation> <translation id="2789486458103222910">හරි</translation> <translation id="2805756323405976993">යෙදුම්</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">සම්බන්ධ වෙමින්...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> යළි අරඹමින්</translation> +<translation id="4415951057168511744">වත්මන් නියුරුව</translation> <translation id="4425149324548788773">මගේ Drive</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> ක්රියාවිරහිතයි</translation> <translation id="4429881212383817840">Kerberos ප්රවේශපත්රය ඉක්මනින් කල් ඉකුත් වෙයි</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">මාපිය ප්රවේශය</translation> <translation id="473775607612524610">යාවත්කාලීනය</translation> <translation id="4744944742468440486">ඔබගේ තේරීමට අදාළ තොරතුරු</translation> +<translation id="4751272708893364980">RMA ලොග බලන්න</translation> <translation id="4773299976671772492">නවත්වන ලදි</translation> <translation id="4774530504324923332">ඔබට RSU-සබල කළ ආරක්ෂක යතුරක්, QR කේත ස්කෑනරයක් සහ අන්තර්ජාල සම්බන්ධතාවක් සහිත දෙවන උපාංගයක් අවශ්ය වනු ඇත</translation> <translation id="4782311465517282004">ඔබ දකුණු-ක්ලික් කළ විට හෝ පෙළ ස්පර්ශ කර අල්ලාගෙන සිටින විට නිර්වචන, පරිවර්තන හෝ ඒකක පරිවර්තන ලබා ගන්න</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">WiFi ජාලය ආරක්ෂිත නැත</translation> <translation id="5376354385557966694">ස්වයංක්රිය ආලෝක ප්රකාරය</translation> <translation id="537872351913703572">උපාංගය වෙනත් පරිශීලකයෙකු හෝ සංවිධානයක් වෙත යනු ඇත</translation> +<translation id="5389224261615877010">දේදුන්න</translation> <translation id="5395600419410242651">සියලු දත්ත මකන්න</translation> <translation id="5400907029458559844">උපාංගය සම්බන්ධ වෙමින් පවතී.</translation> <translation id="5401938042319910061">සියලු දින චර්යා ධාවනය කරන්න</translation> +<translation id="5406131354638931058">නැව්ගත කරන හෝ ගබඩා කරන උපාංග සඳහා බැටරිය කපා හැරීම සිදු කරන්න</translation> <translation id="5423849171846380976">සක්රිය කෙරිණි</translation> <translation id="5430931332414098647">ක්ෂණික ටෙදරින්</translation> <translation id="5431318178759467895">වර්ණය</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">ගොනුව හමු නොවිණි</translation> <translation id="5939518447894949180">නැවත සකසන්න</translation> <translation id="594552776027197022">අහඹු යතුරු යුගල උත්පාදනය කරන්න</translation> +<translation id="5951259522948394825">සියල්ල නිවැරදි ස්ථානයේ ඇති බව තහවුරු කර ගන්න සහ දෝෂ නිර්ණ වාර්තාව බලන්න</translation> <translation id="5972388717451707488">යන්ත්රය යාවත්කාලීන කරන්න</translation> <translation id="5984145644188835034">පෙරනිමි වෝල්පේපරය</translation> <translation id="6017514345406065928">කොළ</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073"><ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /> තෝරන්න</translation> <translation id="8179976553408161302">ඇතුළු කරන්න</translation> +<translation id="819552138404104974">RMA ලොග</translation> <translation id="8206859287963243715">සෙලියුලර්</translation> <translation id="8208861521865154048">අමතර වාසි</translation> <translation id="8217675307824400706">සම්බන්ධ කර ගන්න</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">ස්වයංක්රිය අඳුරු ප්රකාරය</translation> <translation id="8461329675984532579">නිවෙස් සපයන්නාගේ නම</translation> <translation id="8467104829907989997">සංරචක ක්රමාංකනය කරමින්...</translation> +<translation id="8474030592808010086">බැටරිය කපා හැරීම සිදු කිරීමට උපාංගය පේනුගත කිරීම ඉවත් කරන්න</translation> <translation id="8475690821716466388">WiFi ජාලය දුර්වල ප්රොටොකෝලයකින් ආරක්ෂිතයි WEP PSK</translation> <translation id="8477551185774834963">DNS පමාව ඉඩ දිය හැකි මායිමෙන් මදක් ඉහළය</translation> <translation id="8483248364096924578">IP ලිපිනය</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">සංඥා ප්රබලතාව</translation> <translation id="8910721771319628100">පමාවේ මායිමට ඉහළ පෙරනිමි ජාලය</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />ගේ <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">විසඳා ඇති දේ බලන්න</translation> <translation id="8919837981463578619">අසාර්ථක විය - තැටිය මගහැරී ඇත</translation> <translation id="8923267550422472772">යළි සැකසීම සඳහා මාසයේ දිනය</translation> <translation id="8928727111548978589">අසාර්ථක විය - කඩදාසි නැත</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb index 8f830a7..45f17d6a 100644 --- a/chromeos/strings/chromeos_strings_sl.xtb +++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Domače omrežje, brez gostovanja</translation> <translation id="1327977588028644528">Prehod</translation> +<translation id="1328223165223065150">Barva zaslonskega ozadja</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Ustrezanje velikosti območja za optično branje</translation> <translation id="1367951781824006909">Izberite datoteko</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Vir slike</translation> <translation id="1451536289672181509">Naprava je tipkovnica.</translation> <translation id="1459693405370120464">Vreme</translation> +<translation id="1459784442280469416">Shranjevanje v napravo USB</translation> <translation id="1468664791493211953">Ponudbe</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> upravlja to napravo in morda nadzira vašo dejavnost.</translation> <translation id="1478594628797167447">Optični bralniki</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> upravlja tega uporabnika in lahko na daljavo upravlja nastavitve ter nadzira dejavnost uporabnika.</translation> <translation id="150962533380566081">Neveljavna koda PUK.</translation> <translation id="1510238584712386396">Zaganjalnik</translation> +<translation id="1512982610995527443">Naprava se bo izklopila čez 5 sekund.</translation> +<translation id="1522984060396982789">Popravilo je bilo uspešno. Napravo lahko izklopite ali izvedete dodatna dejanja.</translation> <translation id="152892567002884378">Povečanje glasnosti</translation> <translation id="1555130319947370107">Modra</translation> <translation id="155865706765934889">Sledilna ploščica</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Različica strojne opreme</translation> <translation id="1905710495812624430">Preseženo je največje dovoljeno število dovoljenih poskusov.</translation> <translation id="1908234395526491708">Neuspele zahteve UDP</translation> +<translation id="1932611479324127242">Odtegnitev napajanja bateriji</translation> <translation id="1947737735496445907">Natisnjeno</translation> <translation id="1951012854035635156">Pomočnik</translation> <translation id="1977994649430373166">Fotografija za profil v Googlu</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Lebdite mimo</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" /> %</translation> <translation id="2152882202543497059">Št. fotografij: <ph name="NUMBER" /></translation> +<translation id="2154739667870063220">Vnovičen zagon</translation> <translation id="2157959690810728433">NA ČAKANJU</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Poskusi znova</translation> <translation id="2161394479394250669">Preklic tiskalnega opravila</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Preklop postavitve</translation> <translation id="225692081236532131">Stanje aktiviranja</translation> <translation id="2271469253353559191">Urnik za temni način</translation> +<translation id="2275586345903859204">Popravilo je končano</translation> <translation id="2287186687001756809">Na voljo ni nobene slike. Fotografije lahko dodate na <ph name="LINK" />.</translation> <translation id="2307344026739914387">Uporaba trenutnega para ključev</translation> <translation id="2320295602967756579">Omogočanje svetle teme</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Omogoči način temne barve</translation> <translation id="2740531572673183784">V redu</translation> <translation id="2751739896257479635">2. faza preverjanja pristnosti EAP</translation> +<translation id="2756652381241102009">Zaženi diagnostiko</translation> <translation id="2783010256799387990">USPEŠNO</translation> <translation id="2789486458103222910">V redu</translation> <translation id="2805756323405976993">Aplikacije</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Povezovanje …</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Vnovičen zagon naprave <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Trenutni avatar</translation> <translation id="4425149324548788773">Moj disk</translation> <translation id="4428374560396076622">Omrežje <ph name="NETWORK_NAME" /> je izklopljeno.</translation> <translation id="4429881212383817840">Kartonček za Kerberos kmalu poteče</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Starševski dostop</translation> <translation id="473775607612524610">Posodobi</translation> <translation id="4744944742468440486">Podatki, povezani z vašim izborom</translation> +<translation id="4751272708893364980">Ogled dnevnikov dovoljenja za vračilo blaga</translation> <translation id="4773299976671772492">Ustavljeno</translation> <translation id="4774530504324923332">Potrebovali boste varnostni ključ, ki podpira RSU, optični bralnik kod QR in drugo napravo z internetno povezavo</translation> <translation id="4782311465517282004">Zagotovite si definicije, prevode ali pretvorbe enot, ko besedilo kliknete z desnim gumbom ali se ga dotaknete in pridržite.</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Omrežje Wi-Fi ni varno</translation> <translation id="5376354385557966694">Samodejni svetli način</translation> <translation id="537872351913703572">Naprava se prenaša k drugemu uporabniku ali organizaciji.</translation> +<translation id="5389224261615877010">Mavrica</translation> <translation id="5395600419410242651">Izbriši vse podatke</translation> <translation id="5400907029458559844">Naprava se povezuje.</translation> <translation id="5401938042319910061">Izvedi vse rutine</translation> +<translation id="5406131354638931058">Izvedba odtegnitve napajanja bateriji za naprave, ki so namenjene odpremi ali shranjevanju.</translation> <translation id="5423849171846380976">Aktivirano</translation> <translation id="5430931332414098647">Takojšnji internet prek mobilnega telefona</translation> <translation id="5431318178759467895">Barvno</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Datoteke ni bilo mogoče najti</translation> <translation id="5939518447894949180">Ponastavi</translation> <translation id="594552776027197022">Ustvarjanje naključnega para ključev</translation> +<translation id="5951259522948394825">Potrdite, da je vse na svojem mestu in si oglejte diagnostično poročilo.</translation> <translation id="5972388717451707488">Posodobitev mehanizma</translation> <translation id="5984145644188835034">Privzeto ozadje</translation> <translation id="6017514345406065928">Zelena</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Izberite: <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Dnevniki dovoljenja za vračilo blaga</translation> <translation id="8206859287963243715">Prenosni</translation> <translation id="8208861521865154048">Ugodnosti</translation> <translation id="8217675307824400706">Povežite se</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Samodejni temni način</translation> <translation id="8461329675984532579">Ime domačega ponudnika</translation> <translation id="8467104829907989997">Umerjanje komponent ...</translation> +<translation id="8474030592808010086">Odklopite napravo iz napajanja, da bateriji odtegnete napajanje.</translation> <translation id="8475690821716466388">Omrežje Wi-Fi je zavarovano s šibkim protokolom WEP PSK</translation> <translation id="8477551185774834963">Zakasnitev DNS-ja je nekoliko nad dovoljenim pragom</translation> <translation id="8483248364096924578">Naslov IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Moč signala</translation> <translation id="8910721771319628100">Privzeto omrežje je nad pragom zakasnitve</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> – <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">Oglejte si, kaj je bilo popravljeno.</translation> <translation id="8919837981463578619">Napaka – ni pladnja</translation> <translation id="8923267550422472772">Dan v mesecu za ponastavitev</translation> <translation id="8928727111548978589">Napaka – zmanjkalo je papirja</translation>
diff --git a/chromeos/strings/chromeos_strings_sq.xtb b/chromeos/strings/chromeos_strings_sq.xtb index 55fbf03..af693a1 100644 --- a/chromeos/strings/chromeos_strings_sq.xtb +++ b/chromeos/strings/chromeos_strings_sq.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Rrjeti vendor, jo në roaming</translation> <translation id="1327977588028644528">Porta e kalimit</translation> +<translation id="1328223165223065150">Ngjyra e imazhit të sfondit</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Përshtat me zonën e skanuar</translation> <translation id="1367951781824006909">Zgjidh një skedar</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Burimi i imazhit</translation> <translation id="1451536289672181509">Pajisja është një tastierë.</translation> <translation id="1459693405370120464">Moti</translation> +<translation id="1459784442280469416">Ruaj te njësia USB</translation> <translation id="1468664791493211953">Ofertat</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> e menaxhon këtë pajisje dhe mund të jetë në gjendje të monitorojë aktivitetin tënd.</translation> <translation id="1478594628797167447">Skaner</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> menaxhon këtë përdorues dhe mund të menaxhojë në distancë cilësimet dhe të monitorojë aktivitetin e përdoruesit.</translation> <translation id="150962533380566081">Kodi PUK i pavlefshëm.</translation> <translation id="1510238584712386396">Nisësi</translation> +<translation id="1512982610995527443">Pajisja do të fiket pas 5 sekondash</translation> +<translation id="1522984060396982789">Riparimi u krye me sukses. Mund ta fikësh pajisjen ose mund të kryesh disa veprime të tjera.</translation> <translation id="152892567002884378">Rrit volumin</translation> <translation id="1555130319947370107">E kaltër</translation> <translation id="155865706765934889">Blloku me prekje</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Rishikimi i harduerit</translation> <translation id="1905710495812624430">U kaluan përpjekjet maksimale të lejuara.</translation> <translation id="1908234395526491708">Dështimet e kërkesave UDP</translation> +<translation id="1932611479324127242">Fikja e baterisë së brendshme</translation> <translation id="1947737735496445907">Printuar</translation> <translation id="1951012854035635156">Asistenti</translation> <translation id="1977994649430373166">Fotografia e profilit në Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Plusko</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> fotografi</translation> +<translation id="2154739667870063220">Rindiz</translation> <translation id="2157959690810728433">NË RADHË</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Riprovo</translation> <translation id="2161394479394250669">Anulo printimin</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Ndërrimi i strukturës</translation> <translation id="225692081236532131">Statusi i aktivizimit</translation> <translation id="2271469253353559191">Planifikimi i modalitetit të errët</translation> +<translation id="2275586345903859204">Riparimi përfundoi</translation> <translation id="2287186687001756809">Nuk ka asnjë imazh. Për të shtuar fotografi, shko te <ph name="LINK" /></translation> <translation id="2307344026739914387">Përdor çiftin aktual të çelësave</translation> <translation id="2320295602967756579">Aktivizo temën e ndriçuar</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Aktivizo modalitetin e ngjyrave të errëta</translation> <translation id="2740531572673183784">Në rregull</translation> <translation id="2751739896257479635">Vërtetimi EAP i fazës 2</translation> +<translation id="2756652381241102009">Ekzekuto diagnostikimin</translation> <translation id="2783010256799387990">KALOI</translation> <translation id="2789486458103222910">Në rregull</translation> <translation id="2805756323405976993">Aplikacionet</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Po lidhet...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> po riniset</translation> +<translation id="4415951057168511744">Simboli aktual</translation> <translation id="4425149324548788773">Disku im</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> është joaktiv</translation> <translation id="4429881212383817840">Bileta e Kerberos skadon së shpejti</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Qasja e prindit</translation> <translation id="473775607612524610">Përditësoje</translation> <translation id="4744944742468440486">Informacion në lidhje me zgjedhjen tënde</translation> +<translation id="4751272708893364980">Shiko evidencat e autorizimeve AKM</translation> <translation id="4773299976671772492">Ndaloi</translation> <translation id="4774530504324923332">Do të të duhet një çelës sigurie me aftësinë RSU ose një skaner kodesh QR, si dhe një pajisje e dytë me lidhje interneti</translation> <translation id="4782311465517282004">Merr përkufizime, përkthime ose konvertime të njësive kur klikon me të djathtin ose prek e mban shtypur tekstin</translation> @@ -450,9 +460,11 @@ <translation id="5372659122375744710">Rrjeti Wi-Fi nuk është i sigurt</translation> <translation id="5376354385557966694">Modaliteti i ndriçuar automatik</translation> <translation id="537872351913703572">Pajisja do të kalojë te një përdorues ose organizatë tjerër</translation> +<translation id="5389224261615877010">Ylber</translation> <translation id="5395600419410242651">Spastro të gjitha të dhënat</translation> <translation id="5400907029458559844">Pajisja po lidhet.</translation> <translation id="5401938042319910061">Ekzekuto të gjitha rutinat</translation> +<translation id="5406131354638931058">Kryej fikjen e baterisë së brendshme për pajisjet që dërgohen ose magazinohen</translation> <translation id="5423849171846380976">U aktivizua</translation> <translation id="5430931332414098647">Ndarja e internetit në çast</translation> <translation id="5431318178759467895">Ngjyra</translation> @@ -505,6 +517,7 @@ <translation id="5931523347251946569">Skedari nuk u gjet</translation> <translation id="5939518447894949180">Rivendos</translation> <translation id="594552776027197022">Gjenero çift të rastësishëm çelësash</translation> +<translation id="5951259522948394825">Konfirmo që çdo gjë është në vendin e duhur dhe shiko raportin e diagnostikimit</translation> <translation id="5972388717451707488">Motori i përditësimit</translation> <translation id="5984145644188835034">Imazhi i parazgjedhur i sfondit</translation> <translation id="6017514345406065928">E gjelbër</translation> @@ -725,6 +738,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Zgjidh "<ph name="TOPIC_SOURCE_DESC" />" nga "<ph name="TOPIC_SOURCE" />"</translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Evidencat e autorizimeve AKM</translation> <translation id="8206859287963243715">Rrjeti celular</translation> <translation id="8208861521865154048">Avantazhet</translation> <translation id="8217675307824400706">Lidh</translation> @@ -758,6 +772,7 @@ <translation id="8456761643544401578">Modalitet i errët automatik</translation> <translation id="8461329675984532579">Emri i ofruesit të rrjetit bazë</translation> <translation id="8467104829907989997">Komponentët po kalibrohen...</translation> +<translation id="8474030592808010086">Hiqe pajisjen nga priza për të kryer fikjen e baterisë së brendshme</translation> <translation id="8475690821716466388">Rrjeti Wi-Fi është i siguruar me protokollin e dobët WEP PSK</translation> <translation id="8477551185774834963">Vonesa e DNS-së është pak më lart se pragu i lejueshëm</translation> <translation id="8483248364096924578">Adresa e IP-së</translation> @@ -803,6 +818,7 @@ <translation id="8898840733695078011">Fuqia e sinjalit</translation> <translation id="8910721771319628100">Rrjeti i parazgjedhur është mbi pragun e vonesës</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> që ka <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Shiko se çfarë është rregulluar</translation> <translation id="8919837981463578619">Dështoi - Tabakaja mungon</translation> <translation id="8923267550422472772">Dita e muajit për rivendosje</translation> <translation id="8928727111548978589">Dështoi - Nuk ka letër</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb index 968e15b..4280565 100644 --- a/chromeos/strings/chromeos_strings_sr-Latn.xtb +++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Matična mreža, nije u romingu</translation> <translation id="1327977588028644528">Mrežni prolaz</translation> +<translation id="1328223165223065150">Boja pozadine</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Prilagodi oblasti za skeniranje</translation> <translation id="1367951781824006909">Izaberi datoteku</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Izvor slike</translation> <translation id="1451536289672181509">Uređaj je tastatura.</translation> <translation id="1459693405370120464">Vreme</translation> +<translation id="1459784442280469416">Sačuvaj na USB</translation> <translation id="1468664791493211953">Ponude</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> upravlja ovim uređajem i može da prati vaše aktivnosti.</translation> <translation id="1478594628797167447">Skener</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> upravlja ovim korisnikom i može daljinski da upravlja podešavanjima i nadgleda aktivnosti korisnika.</translation> <translation id="150962533380566081">Nevažeći PUK.</translation> <translation id="1510238584712386396">Pokretač</translation> +<translation id="1512982610995527443">Uređaj će se isključiti za 5 sekundi</translation> +<translation id="1522984060396982789">Izvršena je popravka. Možete da isključite uređaj ili da preduzmete dodatne radnje.</translation> <translation id="152892567002884378">Pojačajte zvuk</translation> <translation id="1555130319947370107">Plava</translation> <translation id="155865706765934889">Dodirna tabla</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Revizija hardvera</translation> <translation id="1905710495812624430">Premašen je maksimalni broj pokušaja.</translation> <translation id="1908234395526491708">Neuspeli UDP zahtevi</translation> +<translation id="1932611479324127242">Gašenje baterije</translation> <translation id="1947737735496445907">Odštampano</translation> <translation id="1951012854035635156">Pomoćnik</translation> <translation id="1977994649430373166">Slika Google profila</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Nastavite da plutate</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059">Slika: <ph name="NUMBER" /></translation> +<translation id="2154739667870063220">Restartuj</translation> <translation id="2157959690810728433">NA ČEKANJU</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Probaj ponovo</translation> <translation id="2161394479394250669">Otkaži zadatak štampanja</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Prekidač rasporeda</translation> <translation id="225692081236532131">Status aktivacije</translation> <translation id="2271469253353559191">Raspored tamnog režima</translation> +<translation id="2275586345903859204">Popravka je završena</translation> <translation id="2287186687001756809">Slika nije dostupna. Da biste dodali slike, idite na <ph name="LINK" /></translation> <translation id="2307344026739914387">Koristite aktuelni par ključeva</translation> <translation id="2320295602967756579">Omogućite svetlu temu</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Omogućite režim tamne boje</translation> <translation id="2740531572673183784">Potvrdi</translation> <translation id="2751739896257479635">EAP potvrda identiteta 2. faze:</translation> +<translation id="2756652381241102009">Pokreni dijagnostiku</translation> <translation id="2783010256799387990">PROŠLO</translation> <translation id="2789486458103222910">Potvrdi</translation> <translation id="2805756323405976993">Aplikacije</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Povezuje se...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Restartuje se <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Aktuelni avatar</translation> <translation id="4425149324548788773">Moj disk</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> mreža je isključena</translation> <translation id="4429881212383817840">Kerberos tiket uskoro ističe</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Roditeljski pristup</translation> <translation id="473775607612524610">Ažuriraj</translation> <translation id="4744944742468440486">Informacije vezane za vaš izbor</translation> +<translation id="4751272708893364980">Prikaži RMA evidencije</translation> <translation id="4773299976671772492">Zaustavljeno je</translation> <translation id="4774530504324923332">Treba vam bezbednosni ključ omogućen za RSU, skener QR koda i još jedan uređaj sa internet vezom</translation> <translation id="4782311465517282004">Dobijajte definicije, prevode ili konverzije jedinica kada kliknete desnim tasterom na tekst ili ga dodirnete i zadržite</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">WiFi mreža nije bezbedna</translation> <translation id="5376354385557966694">Automatski svetli režim</translation> <translation id="537872351913703572">Uređaj će preći na drugog korisnika ili organizaciju</translation> +<translation id="5389224261615877010">Duga</translation> <translation id="5395600419410242651">Obriši sve podatke</translation> <translation id="5400907029458559844">Uređaj se povezuje.</translation> <translation id="5401938042319910061">Pokreni sve rutine</translation> +<translation id="5406131354638931058">Ugasite bateriju za uređaje koji se šalju ili skladište</translation> <translation id="5423849171846380976">Aktivirano</translation> <translation id="5430931332414098647">Trenutno privezivanje</translation> <translation id="5431318178759467895">U boji</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Fajl nije pronađen</translation> <translation id="5939518447894949180">Resetuj</translation> <translation id="594552776027197022">Generišite nasumični par ključeva</translation> +<translation id="5951259522948394825">Potvrdite da je sve u redu i pregledajte izveštaj o dijagnostici</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Podrazumevana pozadina</translation> <translation id="6017514345406065928">Zelena</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Izaberite <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA evidencije</translation> <translation id="8206859287963243715">Mobilni uređaj</translation> <translation id="8208861521865154048">Pogodnosti</translation> <translation id="8217675307824400706">Povežite se</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Automatski tamni režim</translation> <translation id="8461329675984532579">Naziv dobavljača za Home</translation> <translation id="8467104829907989997">Komponente se kalibriraju…</translation> +<translation id="8474030592808010086">Isključite uređaj iz utičnice da biste ugasili bateriju</translation> <translation id="8475690821716466388">WiFi mreža je obezbeđena slabim protokolom WEP PSK</translation> <translation id="8477551185774834963">Kašnjenje DNS-a u manjoj meri premašuje dozvoljenu graničnu vrednost</translation> <translation id="8483248364096924578">IP adresa</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Jačina signala</translation> <translation id="8910721771319628100">Podrazumevana mreža premašuje graničnu vrednost za kašnjenje</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> korisnika <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Pogledajte šta je popravljeno</translation> <translation id="8919837981463578619">Nije uspelo – nedostaje fioka</translation> <translation id="8923267550422472772">Dan u mesecu za resetovanje</translation> <translation id="8928727111548978589">Nije uspelo – nema više papira</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index 775aed7..b278ae0f 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Матична мрежа, није у ромингу</translation> <translation id="1327977588028644528">Мрежни пролаз</translation> +<translation id="1328223165223065150">Боја позадине</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Прилагоди области за скенирање</translation> <translation id="1367951781824006909">Изабери датотеку</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Извор слике</translation> <translation id="1451536289672181509">Уређај је тастатура.</translation> <translation id="1459693405370120464">Време</translation> +<translation id="1459784442280469416">Сачувај на USB</translation> <translation id="1468664791493211953">Понуде</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> управља овим уређајем и може да прати ваше активности.</translation> <translation id="1478594628797167447">Скенер</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> управља овим корисником и може даљински да управља подешавањима и надгледа активности корисника.</translation> <translation id="150962533380566081">Неважећи PUK.</translation> <translation id="1510238584712386396">Покретач</translation> +<translation id="1512982610995527443">Уређај ће се искључити за 5 секунди</translation> +<translation id="1522984060396982789">Извршена је поправка. Можете да искључите уређај или да предузмете додатне радње.</translation> <translation id="152892567002884378">Појачајте звук</translation> <translation id="1555130319947370107">Плава</translation> <translation id="155865706765934889">Додирна табла</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Ревизија хардвера</translation> <translation id="1905710495812624430">Премашен је максимални број покушаја.</translation> <translation id="1908234395526491708">Неуспели UDP захтеви</translation> +<translation id="1932611479324127242">Гашење батерије</translation> <translation id="1947737735496445907">Одштампано</translation> <translation id="1951012854035635156">Помоћник</translation> <translation id="1977994649430373166">Слика Google профила</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Наставите да плутате</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059">Слика: <ph name="NUMBER" /></translation> +<translation id="2154739667870063220">Рестартуј</translation> <translation id="2157959690810728433">НА ЧЕКАЊУ</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Пробај поново</translation> <translation id="2161394479394250669">Откажи задатак штампања</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Прекидач распореда</translation> <translation id="225692081236532131">Статус активације</translation> <translation id="2271469253353559191">Распоред тамног режима</translation> +<translation id="2275586345903859204">Поправка је завршена</translation> <translation id="2287186687001756809">Слика није доступна. Да бисте додали слике, идите на <ph name="LINK" /></translation> <translation id="2307344026739914387">Користите актуелни пар кључева</translation> <translation id="2320295602967756579">Омогућите светлу тему</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Омогућите режим тамне боје</translation> <translation id="2740531572673183784">Потврди</translation> <translation id="2751739896257479635">EAP потврда идентитета 2. фазе:</translation> +<translation id="2756652381241102009">Покрени дијагностику</translation> <translation id="2783010256799387990">ПРОШЛО</translation> <translation id="2789486458103222910">Потврди</translation> <translation id="2805756323405976993">Апликације</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Повезује се...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Рестартује се <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Актуелни аватар</translation> <translation id="4425149324548788773">Мој диск</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> мрежа је искључена</translation> <translation id="4429881212383817840">Kerberos тикет ускоро истиче</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Родитељски приступ</translation> <translation id="473775607612524610">Ажурирај</translation> <translation id="4744944742468440486">Информације везане за ваш избор</translation> +<translation id="4751272708893364980">Прикажи RMA евиденције</translation> <translation id="4773299976671772492">Заустављено је</translation> <translation id="4774530504324923332">Треба вам безбедносни кључ омогућен за RSU, скенер QR кода и још један уређај са интернет везом</translation> <translation id="4782311465517282004">Добијајте дефиниције, преводе или конверзије јединица када кликнете десним тастером на текст или га додирнете и задржите</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">WiFi мрежа није безбедна</translation> <translation id="5376354385557966694">Аутоматски светли режим</translation> <translation id="537872351913703572">Уређај ће прећи на другог корисника или организацију</translation> +<translation id="5389224261615877010">Дуга</translation> <translation id="5395600419410242651">Обриши све податке</translation> <translation id="5400907029458559844">Уређај се повезује.</translation> <translation id="5401938042319910061">Покрени све рутине</translation> +<translation id="5406131354638931058">Угасите батерију за уређаје који се шаљу или складиште</translation> <translation id="5423849171846380976">Активирано</translation> <translation id="5430931332414098647">Тренутно привезивање</translation> <translation id="5431318178759467895">У боји</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Фајл није пронађен</translation> <translation id="5939518447894949180">Ресетуј</translation> <translation id="594552776027197022">Генеришите насумични пар кључева</translation> +<translation id="5951259522948394825">Потврдите да је све у реду и прегледајте извештај о дијагностици</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Подразумевана позадина</translation> <translation id="6017514345406065928">Зелена</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Изаберите <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA евиденције</translation> <translation id="8206859287963243715">Мобилни уређај</translation> <translation id="8208861521865154048">Погодности</translation> <translation id="8217675307824400706">Повежите се</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Аутоматски тамни режим</translation> <translation id="8461329675984532579">Назив добављача за Home</translation> <translation id="8467104829907989997">Компоненте се калибрирају…</translation> +<translation id="8474030592808010086">Искључите уређај из утичнице да бисте угасили батерију</translation> <translation id="8475690821716466388">WiFi мрежа је обезбеђена слабим протоколом WEP PSK</translation> <translation id="8477551185774834963">Кашњење DNS-а у мањој мери премашује дозвољену граничну вредност</translation> <translation id="8483248364096924578">IP адреса</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Јачина сигнала</translation> <translation id="8910721771319628100">Подразумевана мрежа премашује граничну вредност за кашњење</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> корисника <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Погледајте шта је поправљено</translation> <translation id="8919837981463578619">Није успело – недостаје фиока</translation> <translation id="8923267550422472772">Дан у месецу за ресетовање</translation> <translation id="8928727111548978589">Није успело – нема више папира</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb index a010f48c..0729320b 100644 --- a/chromeos/strings/chromeos_strings_sv.xtb +++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Hemnätverk, ingen roaming</translation> <translation id="1327977588028644528">Gateway</translation> +<translation id="1328223165223065150">Bakgrundsfärg</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Anpassa till området som ska skannas</translation> <translation id="1367951781824006909">Välj fil</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Bildkälla</translation> <translation id="1451536289672181509">Enheten är ett tangentbord.</translation> <translation id="1459693405370120464">Väder</translation> +<translation id="1459784442280469416">Spara på USB-enhet</translation> <translation id="1468664791493211953">Erbjudanden</translation> <translation id="1476467821656042872">Den här enheten hanteras av <ph name="MANAGER" />, som kan ha möjlighet att övervaka din aktivitet.</translation> <translation id="1478594628797167447">Skanner</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> hanterar denna användare och kan fjärrhantera inställningar och övervaka användaraktivitet.</translation> <translation id="150962533380566081">Ogiltig PUK-kod.</translation> <translation id="1510238584712386396">Startprogram</translation> +<translation id="1512982610995527443">Enheten stängs av om fem sekunder</translation> +<translation id="1522984060396982789">Reparationen lyckades. Du kan stänga av enheten eller vidta ytterligare åtgärder.</translation> <translation id="152892567002884378">Höj volymen</translation> <translation id="1555130319947370107">Blå</translation> <translation id="155865706765934889">Styrplatta</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Revision av maskinvara</translation> <translation id="1905710495812624430">Du har försökt för många gånger.</translation> <translation id="1908234395526491708">Misslyckade UDP-förfrågningar</translation> +<translation id="1932611479324127242">Inaktivera batteriet</translation> <translation id="1947737735496445907">Utskrivet</translation> <translation id="1951012854035635156">Assistent</translation> <translation id="1977994649430373166">Profilbild på Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Med strömmen</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" /> %</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> foton</translation> +<translation id="2154739667870063220">Starta om</translation> <translation id="2157959690810728433">I KÖ</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Försök igen</translation> <translation id="2161394479394250669">Avbryt utskriftsjobb</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Tangenten som byter tangentbordslayout</translation> <translation id="225692081236532131">Aktiveringsstatus</translation> <translation id="2271469253353559191">Schema för mörkt läge</translation> +<translation id="2275586345903859204">Reparationen är klar</translation> <translation id="2287186687001756809">Det finns inga bilder. Du kan lägga till foton via <ph name="LINK" /></translation> <translation id="2307344026739914387">Använd nuvarande nyckelpar</translation> <translation id="2320295602967756579">Aktivera ljust tema</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Aktivera mörkt färgläge</translation> <translation id="2740531572673183784">OK</translation> <translation id="2751739896257479635">Fas 2 i EAP-autentisering</translation> +<translation id="2756652381241102009">Kör diagnostik</translation> <translation id="2783010256799387990">SLUTFÖRT</translation> <translation id="2789486458103222910">OK</translation> <translation id="2805756323405976993">Appar</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Ansluter ...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> startas om</translation> +<translation id="4415951057168511744">Aktuell avatar</translation> <translation id="4425149324548788773">Min enhet</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> är av</translation> <translation id="4429881212383817840">Kerberos-biljetten upphör snart att gälla</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Föräldraåtkomst</translation> <translation id="473775607612524610">Uppdatera</translation> <translation id="4744944742468440486">Information om det som är markerat</translation> +<translation id="4751272708893364980">Se RMA-loggar</translation> <translation id="4773299976671772492">Har stoppats</translation> <translation id="4774530504324923332">Du behöver en RSU-aktiverad säkerhetsnyckel, en QR-skanner eller en annan enhet med en internetanslutning</translation> <translation id="4782311465517282004">Få definitioner, översättningar eller enhetskonverteringar när du högerklickar eller trycker länge på text</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">wifi-nätverket är inte säkert</translation> <translation id="5376354385557966694">Automatiskt ljust läge</translation> <translation id="537872351913703572">En annan användare eller organisation tar över enheten</translation> +<translation id="5389224261615877010">Regnbåge</translation> <translation id="5395600419410242651">Rensa all data</translation> <translation id="5400907029458559844">Enheter ansluter.</translation> <translation id="5401938042319910061">Kör alla rutiner</translation> +<translation id="5406131354638931058">Inaktivera batteriet på enheter som ska fraktas eller lagras</translation> <translation id="5423849171846380976">Aktiverat</translation> <translation id="5430931332414098647">Direktinternetdelning</translation> <translation id="5431318178759467895">Färg</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Filen hittades inte</translation> <translation id="5939518447894949180">Återställ</translation> <translation id="594552776027197022">Generera slumpmässigt nyckelpar</translation> +<translation id="5951259522948394825">Bekräfta att allt sitter på rätt ställe och visa diagnostikrapporten</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Standardbakgrund</translation> <translation id="6017514345406065928">Grön</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Välj <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA-loggar</translation> <translation id="8206859287963243715">Mobil</translation> <translation id="8208861521865154048">Förmåner</translation> <translation id="8217675307824400706">Anslutning</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Automatiskt mörkt läge</translation> <translation id="8461329675984532579">Hemleverantörens namn</translation> <translation id="8467104829907989997">Kalibrerar komponenter …</translation> +<translation id="8474030592808010086">Koppla ur enheten för att inaktivera batteriet</translation> <translation id="8475690821716466388">wifi-nätverket använder det svaga säkerhetsprotokollet WEP PSK</translation> <translation id="8477551185774834963">DNS-latensen är något högre än det godtagbara tröskelvärdet</translation> <translation id="8483248364096924578">IP-adress</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Signalstyrka</translation> <translation id="8910721771319628100">Tröskelvärdet för latens överskreds för standardnätverket</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> som tillhör <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Se vad som har åtgärdats</translation> <translation id="8919837981463578619">Misslyckades – fack saknas</translation> <translation id="8923267550422472772">Dag i månaden för återställning</translation> <translation id="8928727111548978589">Misslyckades – slut på papper</translation>
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb index 50fddd3..47e0796 100644 --- a/chromeos/strings/chromeos_strings_sw.xtb +++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">VPN ya Android</translation> <translation id="131461803491198646">Uko katika mtandao wako wa kawaida</translation> <translation id="1327977588028644528">Lango</translation> +<translation id="1328223165223065150">Rangi ya mandhari</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Tosheza kwenye sehemu ya kuchanganua</translation> <translation id="1367951781824006909">Chagua faili</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Chanzo cha picha</translation> <translation id="1451536289672181509">Kifaa hiki ni kibodi.</translation> <translation id="1459693405370120464">Hali ya Hewa</translation> +<translation id="1459784442280469416">Hifadhi kwenye USB</translation> <translation id="1468664791493211953">Ofa</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> anadhibiti kifaa hiki na anaweza kufuatilia shughuli zako.</translation> <translation id="1478594628797167447">Kichanganuzi</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> inamdhibiti mtumiaji huyu na huenda ikadhibiti mipangilio na kufuatilia shughuli za mtumiaji kwa mbali.</translation> <translation id="150962533380566081">PUK si sahihi.</translation> <translation id="1510238584712386396">Kizindua</translation> +<translation id="1512982610995527443">Kifaa kitazima ndani ya sekunde 5</translation> +<translation id="1522984060396982789">Umefanikiwa kurekebisha. Unaweza kuzima kifaa au kuchukua hatua kadhaa za ziada.</translation> <translation id="152892567002884378">Ongeza sauti</translation> <translation id="1555130319947370107">Samawati</translation> <translation id="155865706765934889">Touchpad</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Sahihisho la maunzi</translation> <translation id="1905710495812624430">Idadi ya juu ya majaribio yanayoruhusiwa.</translation> <translation id="1908234395526491708">Maombi ya UDP ambayo hayakufaulu</translation> +<translation id="1932611479324127242">Hifadhi chaji ya betri</translation> <translation id="1947737735496445907">Imechapishwa</translation> <translation id="1951012854035635156">Mratibu</translation> <translation id="1977994649430373166">Picha ya wasifu kwenye Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Hali ya kuelea</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059">Picha <ph name="NUMBER" /></translation> +<translation id="2154739667870063220">Washa tena</translation> <translation id="2157959690810728433">IMEWEKWA KWENYE FOLENI</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Jaribu tena</translation> <translation id="2161394479394250669">Ghairi kazi ya kuchapisha</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Swichi ya muundo</translation> <translation id="225692081236532131">Hali ya kuwasha</translation> <translation id="2271469253353559191">Ratiba ya hali nyeusi</translation> +<translation id="2275586345903859204">Urekebishaji umekamilika</translation> <translation id="2287186687001756809">Hakuna picha inayopatikana. Ili uweke picha, nenda kwenye <ph name="LINK" /></translation> <translation id="2307344026739914387">Tumia jozi ya funguo ya sasa</translation> <translation id="2320295602967756579">Washa mandhari meupe</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Washa hali ya rangi yenye giza</translation> <translation id="2740531572673183784">Sawa</translation> <translation id="2751739896257479635">Uthibitisho wa EAP wa awamu ya pili</translation> +<translation id="2756652381241102009">Tekeleza Uchunguzi</translation> <translation id="2783010256799387990">LIMEFAULU</translation> <translation id="2789486458103222910">Sawa</translation> <translation id="2805756323405976993">Programu</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Inaunganisha...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Inazima kisha iwake <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Ishara ya Sasa</translation> <translation id="4425149324548788773">Hifadhi Yangu</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> imezimwa</translation> <translation id="4429881212383817840">Muda wa kutumia tiketi ya Kerberos unakaribia kuisha</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Idhini ya mzazi</translation> <translation id="473775607612524610">Sasisha</translation> <translation id="4744944742468440486">Maelezo yanayohusiana na chaguo lako</translation> +<translation id="4751272708893364980">Angalia kumbukumbu za idhini ya kurudisha bidhaa (RMA)</translation> <translation id="4773299976671772492">Imesimamishwa</translation> <translation id="4774530504324923332">Utahitaji ufunguo wa usalama unaotumia RSU, kichanganuzi cha msimbo wa QR na kifaa kingine chenye muunganisho wa intaneti</translation> <translation id="4782311465517282004">Pata ufafanuzi, tafsiri au ubadilishaji wa vipimo unapobofya kulia au unapogusa na kushikilia maandishi</translation> @@ -450,9 +460,11 @@ <translation id="5372659122375744710">Mtandao wa WiFi si salama</translation> <translation id="5376354385557966694">Hali ya mwangaza inayowekwa kiotomatiki</translation> <translation id="537872351913703572">Kifaa kitaenda kwa mtumiaji au shirika tofauti</translation> +<translation id="5389224261615877010">Upinde wa mvua</translation> <translation id="5395600419410242651">Futa data yote</translation> <translation id="5400907029458559844">Kifaa kinaunganishwa.</translation> <translation id="5401938042319910061">Tekeleza Ratiba Zote</translation> +<translation id="5406131354638931058">Tekeleza uhifadhi wa chaji ya betri kwenye vifaa vinavyosafirishwa au vinavyohifadhiwa</translation> <translation id="5423849171846380976">Imeamilishwa</translation> <translation id="5430931332414098647">Mtandao wa Kusambazwa Papo Hapo</translation> <translation id="5431318178759467895">Rangi</translation> @@ -505,6 +517,7 @@ <translation id="5931523347251946569">Faili haijapatikana</translation> <translation id="5939518447894949180">Weka upya</translation> <translation id="594552776027197022">Zalisha jozi ya funguo nasibu</translation> +<translation id="5951259522948394825">Thibitisha kama kila kitu kipo sehemu sahihi na uangalie ripoti ya uchunguzi</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Mandhari chaguomsingi</translation> <translation id="6017514345406065928">Kijani</translation> @@ -725,6 +738,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Chagua <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Kumbukumbu za idhini ya kurudisha kifaa (RMA)</translation> <translation id="8206859287963243715">Simu ya Mkononi</translation> <translation id="8208861521865154048">Manufaa</translation> <translation id="8217675307824400706">Unganisha</translation> @@ -758,6 +772,7 @@ <translation id="8456761643544401578">Hali nyeusi inayowekwa kiotomatiki</translation> <translation id="8461329675984532579">Jina la mtoa huduma</translation> <translation id="8467104829907989997">Inarekebisha vipengele...</translation> +<translation id="8474030592808010086">Chomoa kifaa ili uhifadhi chaji ya betri</translation> <translation id="8475690821716466388">Mtandao wa WiFi umelindwa kwa kutumia itifaki hafifu ya WEP PSK</translation> <translation id="8477551185774834963">Muda wa kusubiri wa DNS umezidi kidogo kiwango cha juu kinachoruhusiwa</translation> <translation id="8483248364096924578">Anwani ya IP</translation> @@ -803,6 +818,7 @@ <translation id="8898840733695078011">Uthabiti wa mawimbi</translation> <translation id="8910721771319628100">Muda wa kusubiri wa mtandao chaguomsingi umezidi kiwango cha juu</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> ya <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Angalia vipengee vilivyorekebishwa</translation> <translation id="8919837981463578619">Haijakamilika - Trei haipo</translation> <translation id="8923267550422472772">Siku ya mwezi kwa ajili ya kuweka upya</translation> <translation id="8928727111548978589">Haijakamilika - Karatasi zimeisha</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb index 6d62850..1242256 100644 --- a/chromeos/strings/chromeos_strings_th.xtb +++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -37,6 +37,7 @@ <translation id="131421566576084655">ไม่มีวันที่รีเซ็ตปริมาณการใช้อินเทอร์เน็ตครั้งล่าสุด</translation> <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">เครือข่ายในประเทศ ไม่ใช่โรมมิ่ง</translation> +<translation id="132712914231403017">ติดตั้งอิมเมจของเฟิร์มแวร์</translation> <translation id="1327977588028644528">เกตเวย์</translation> <translation id="1328223165223065150">สีวอลเปเปอร์</translation> <translation id="1330426557709298164">JPG</translation> @@ -80,6 +81,7 @@ <translation id="1641857168437328880">ตัวป้อนเอกสาร (ด้านเดียว)</translation> <translation id="1643449475550628585">เปลี่ยนรูปภาพวอลเปเปอร์ทุกวัน</translation> <translation id="1644574205037202324">ประวัติการเข้าชม</translation> +<translation id="1645954272419197032">โปรดยืนยันข้อมูลอุปกรณ์</translation> <translation id="1662989795263954667">หยุดพิมพ์ - หมึกหมด</translation> <translation id="1668469839109562275">VPN ในตัว</translation> <translation id="1703835215927279855">Letter</translation> @@ -118,6 +120,7 @@ <translation id="2006864819935886708">การเชื่อมต่อ</translation> <translation id="2008685064673031089">Prime Search</translation> <translation id="2016697457005847575">ลองทำตามขั้นตอนการแก้ปัญหา</translation> +<translation id="2016848882344942759">--ไม่มีไวท์เลเบล--</translation> <translation id="202500043506723828">EID</translation> <translation id="2080070583977670716">การตั้งค่าเพิ่มเติม</translation> <translation id="2085089206770112532">ลดความสว่างของหน้าจอ</translation> @@ -148,6 +151,7 @@ <translation id="2271469253353559191">กำหนดเวลาโหมดมืด</translation> <translation id="2275586345903859204">ซ่อมเรียบร้อยแล้ว</translation> <translation id="2287186687001756809">ไม่มีรูปภาพ ไปที่ <ph name="LINK" /> เพื่อเพิ่มรูปภาพ</translation> +<translation id="2294753434210277304">เสียบที่จัดเก็บข้อมูลภายนอก เช่น ไดรฟ์ USB หรือการ์ด SD ซึ่งมีอิมเมจยูทิลิตีการกู้คืน Chromebook ที่ดาวน์โหลดมา</translation> <translation id="2307344026739914387">ใช้คู่คีย์ปัจจุบัน</translation> <translation id="2320295602967756579">เปิดใช้ธีมสว่าง</translation> <translation id="2323506179655536734">ข้าม</translation> @@ -188,6 +192,7 @@ <translation id="2712812801627182647">คีย์การตรวจสอบสิทธิ์ TLS</translation> <translation id="2713444072780614174">สีขาว</translation> <translation id="2717139507051041123">เปิดใช้โหมดสีมืด</translation> +<translation id="2727250716596204208">ไม่พบอิมเมจของเฟิร์มแวร์ เสียบที่จัดเก็บข้อมูลภายนอก เช่น ไดรฟ์ USB หรือการ์ด SD ซึ่งมีอิมเมจยูทิลิตีการกู้คืน Chromebook ที่ดาวน์โหลดมา</translation> <translation id="2740531572673183784">ตกลง</translation> <translation id="2751739896257479635">การตรวจสอบสิทธิ์ขั้นที่ 2 ของ EAP</translation> <translation id="2756652381241102009">เรียกใช้การวินิจฉัย</translation> @@ -219,6 +224,7 @@ <translation id="3122464029669770682">CPU</translation> <translation id="3124039320086536031">อุปกรณ์เชื่อมต่ออยู่</translation> <translation id="3127341325625468058">{PAGE_NUMBER,plural, =0{นำหน้าออกไหม}=1{นำหน้าที่ {PAGE_NUMBER} ออกไหม}other{นำหน้าที่ {PAGE_NUMBER} ออกไหม}}</translation> +<translation id="3137983112374760826">กำลังจัดสรรอุปกรณ์...</translation> <translation id="315116470104423982">เน็ตมือถือ</translation> <translation id="3156846309055100599">กำลังสแกนหน้า <ph name="PAGE_NUMBER" />...</translation> <translation id="315738237743207937">ตรวจพบแคพทีฟพอร์ทัล</translation> @@ -240,6 +246,7 @@ <translation id="3340011300870565703">อุปกรณ์มีระดับแบตเตอรี่ของหูฟังข้างขวา <ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="3368922792935385530">เชื่อมต่อแล้ว</translation> <translation id="3369013195428705271">คุณแน่ใจไหมว่าต้องการล้างประวัติการพิมพ์ทั้งหมด ทั้งนี้ ระบบจะไม่ล้างงานพิมพ์ที่กำลังดำเนินอยู่</translation> +<translation id="3383751554789092165">เปลี่ยนข้อมูลอุปกรณ์ตามความจำเป็น</translation> <translation id="3404249063913988450">เปิดใช้โปรแกรมรักษาหน้าจอ</translation> <translation id="3404770484521709967">คอมโพเนนต์ติดตั้งอย่างถูกต้อง</translation> <translation id="3413935475507503304">คลิก "ถัดไป" เพื่อดำเนินการอัปเดตต่อ</translation> @@ -278,6 +285,7 @@ <translation id="3748026146096797577">ไม่ได้เชื่อมต่อ</translation> <translation id="3749289110408117711">ชื่อไฟล์</translation> <translation id="3771294271822695279">ไฟล์วิดีโอ</translation> +<translation id="3774059845329307709">หมายเลขซีเรียล</translation> <translation id="3784455785234192852">ล็อก</translation> <translation id="38114475217616659">ล้างประวัติทั้งหมด</translation> <translation id="3820172043799983114">PIN ไม่ถูกต้อง</translation> @@ -361,6 +369,7 @@ <translation id="455835558791489930">แบตเตอรี่ <ph name="CHARGE_VALUE" />mAh</translation> <translation id="4561801978359312462">ปลดล็อกซิมแล้ว</translation> <translation id="4562494484721939086">ไม่มีบริการ</translation> +<translation id="4568938274596692027">ติดตั้งเสร็จสมบูรณ์แล้ว กำลังเตรียมรีสตาร์ท...</translation> <translation id="458794348635939462">แก้ไขทุกโฮสต์ไม่สำเร็จ</translation> <translation id="4593212453765072419">จำเป็นต้องมีการตรวจสอบสิทธิ์พร็อกซี</translation> <translation id="4609350030397390689">ลดความสว่างของแป้นพิมพ์</translation> @@ -403,6 +412,7 @@ <translation id="4890353053343094602">อย่ารอช้า รีบเลือกรหัสผ่านใหม่</translation> <translation id="4891842000192098784">ประสิทธิภาพเมื่อเพิ่มแรงกดดัน</translation> <translation id="4897058166682006107">อุปกรณ์มีระดับแบตเตอรี่ของหูฟังข้างซ้าย <ph name="BATTERY_PERCENTAGE" />%</translation> +<translation id="4908030561598728899">กำลังติดตั้งเฟิร์มแวร์...</translation> <translation id="4915052247106771211">ตัวเลือกนี้จะรีเซ็ตอุปกรณ์เป็นการตั้งค่าเริ่มต้น (Powerwash)</translation> <translation id="4917385247580444890">แรง</translation> <translation id="4917889632206600977">หยุดพิมพ์ - กระดาษหมด</translation> @@ -615,8 +625,10 @@ <translation id="6768237774506518020">อัตราการแปลง DNS ไม่สำเร็จสูง</translation> <translation id="680983167891198932">คีย์</translation> <translation id="6816797338148849397">มีข้อมูลที่เกี่ยวข้องกับสิ่งที่คุณเลือก ใช้แป้นลูกศรขึ้นเพื่อดูข้อมูลนั้น</translation> +<translation id="6822504384524564824">ควรเปลี่ยน SKU ในกรณีที่คอมโพเนนต์ใหม่แตกต่างจากรายการเดิมที่ถูกแทนที่เท่านั้น ตัวอย่างเช่น ใช้หน้าจอสัมผัสแทนหน้าจอไม่สัมผัส หรืออัปเกรดหน่วยความจำจาก 8 GB เป็น 16 GB</translation> <translation id="6840315122969944400">การซ่อม <ph name="DEVICE_TYPE" /></translation> <translation id="6853312040151791195">อัตราการคายประจุ</translation> +<translation id="6876833053687020046">หมายเลขชิ้นส่วน DRAM</translation> <translation id="6889786074662672253">ขณะรีสตาร์ท โปรดอย่าถอดปลั๊กอุปกรณ์ภายนอกเครื่องนี้หรือปิดคอมพิวเตอร์ คุณย่อหน้าต่างนี้ให้เล็กสุดได้ การดำเนินการอาจใช้เวลาสักครู่และอุปกรณ์ภายนอกอาจใช้ไม่ได้ในช่วงเวลานี้</translation> <translation id="6905724422583748843">กลับไปที่ <ph name="PAGE_NAME" /></translation> <translation id="6910312834584889076">ฝาเครื่องสแกนเปิดอยู่ ปิดฝาแล้วลองอีกครั้ง</translation> @@ -664,6 +676,7 @@ <translation id="7343649194310845056">อุปกรณ์เครือข่าย</translation> <translation id="7359657277149375382">ประเภทไฟล์</translation> <translation id="7375053625150546623">EAP</translation> +<translation id="7378553660733179982">SKU</translation> <translation id="7378886533986123738">เปลี่ยนโปรแกรมรักษาหน้าจอ</translation> <translation id="7397270852490618635">ปิดธีมสว่าง</translation> <translation id="741244894080940828">การแปลง</translation> @@ -763,6 +776,7 @@ <translation id="8364946094152050673">เนมเซิร์ฟเวอร์ว่างเปล่า</translation> <translation id="8372477600026034341">โฮสต์เพิ่มเติม</translation> <translation id="8378855320830505539">ภูมิภาค</translation> +<translation id="8382302752385457774">ไวท์เลเบล</translation> <translation id="8395584934117017006"><ph name="DEVICE_TYPE" /> เครื่องนี้จัดการโดยองค์กร</translation> <translation id="8398927464629426868">อัตราการชาร์จหรือการคายประจุของอุปกรณ์ในปัจจุบัน</translation> <translation id="8422748173858722634">IMEI</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb index bb36efb..308952e 100644 --- a/chromeos/strings/chromeos_strings_tr.xtb +++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Ev ağı, dolaşımda değil</translation> <translation id="1327977588028644528">Ağ geçidi</translation> +<translation id="1328223165223065150">Duvar kağıdı rengi</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Tarama alanına sığdır</translation> <translation id="1367951781824006909">Dosya seç</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Resim kaynağı</translation> <translation id="1451536289672181509">Cihazın türü klavye.</translation> <translation id="1459693405370120464">Hava durumu</translation> +<translation id="1459784442280469416">USB'ye kaydet</translation> <translation id="1468664791493211953">Teklifler</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> bu cihazı yönetiyor ve etkinliklerinizi izleyebilir.</translation> <translation id="1478594628797167447">Tarayıcı</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" />, bu kullanıcıyı yönetir ve hem ayarları uzaktan yönetebilir hem de kullanıcı etkinliğini izleyebilir.</translation> <translation id="150962533380566081">Geçersiz PUK.</translation> <translation id="1510238584712386396">Başlatıcı</translation> +<translation id="1512982610995527443">Cihaz 5 saniye sonra kapanacak</translation> +<translation id="1522984060396982789">Onarımınız başarıyla tamamlandı. Cihazı kapatabilir veya başka işlemler yapabilirsiniz.</translation> <translation id="152892567002884378">Sesi açar</translation> <translation id="1555130319947370107">Mavi</translation> <translation id="155865706765934889">Dokunmatik Tuş Takımı</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Donanım düzeltmesi</translation> <translation id="1905710495812624430">İzin verilen maksimum deneme sayısı aşıldı.</translation> <translation id="1908234395526491708">UDP istek hataları</translation> +<translation id="1932611479324127242">Pil gücünün kesilmesi</translation> <translation id="1947737735496445907">Yazdırıldı</translation> <translation id="1951012854035635156">Asistan</translation> <translation id="1977994649430373166">Google profil fotoğrafı</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Ekranda süzülün</translation> <translation id="2141644705054017895">%<ph name="PERCENTAGE_VALUE" /></translation> <translation id="2152882202543497059"><ph name="NUMBER" /> fotoğraf</translation> +<translation id="2154739667870063220">Yeniden başlat</translation> <translation id="2157959690810728433">SIRAYA ALINDI</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Yeniden dene</translation> <translation id="2161394479394250669">Yazdırma işini iptal et</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Düzeni değiştir</translation> <translation id="225692081236532131">Etkinleştirme durumu</translation> <translation id="2271469253353559191">Koyu mod programı</translation> +<translation id="2275586345903859204">Onarım tamamlandı</translation> <translation id="2287186687001756809">Resim yok. Fotoğraf eklemek için <ph name="LINK" /> adresine gidin</translation> <translation id="2307344026739914387">Mevcut anahtar çiftini kullanın</translation> <translation id="2320295602967756579">Açık temayı etkinleştir</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Koyu renk modunu etkinleştir</translation> <translation id="2740531572673183784">Tamam</translation> <translation id="2751739896257479635">EAP Aşama 2 kimlik doğrulaması</translation> +<translation id="2756652381241102009">Teşhisi Çalıştır</translation> <translation id="2783010256799387990">BAŞARILI OLDU</translation> <translation id="2789486458103222910">Tamam</translation> <translation id="2805756323405976993">Uygulamalar</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Bağlanıyor...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> yeniden başlatılıyor</translation> +<translation id="4415951057168511744">Mevcut Avatar</translation> <translation id="4425149324548788773">Drive'ım</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> kapalı</translation> <translation id="4429881212383817840">Kerberos biletinin süresi yakında doluyor</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Ebeveyn erişimi</translation> <translation id="473775607612524610">Güncelle</translation> <translation id="4744944742468440486">Seçiminizle ilgili bilgi</translation> +<translation id="4751272708893364980">RMA günlüklerini göster</translation> <translation id="4773299976671772492">Durduruldu</translation> <translation id="4774530504324923332">RSU özellikli bir güvenlik anahtarı, QR kodu tarayıcı ve internet bağlantısı olan ikinci bir cihaz gerekir</translation> <translation id="4782311465517282004">Metni sağ tıkladığınızda veya dokunup basılı tuttuğunuzda tanımını veya çevirisini görün ya da birim dönüştürmesi alın</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Kablosuz ağ güvenli değil</translation> <translation id="5376354385557966694">Otomatik açık mod</translation> <translation id="537872351913703572">Cihaz başka bir kullanıcı veya kuruluşa teslim edilir</translation> +<translation id="5389224261615877010">Gökkuşağı</translation> <translation id="5395600419410242651">Tüm verileri sil</translation> <translation id="5400907029458559844">Cihaz bağlanıyor.</translation> <translation id="5401938042319910061">Tüm Rutinleri Çalıştır</translation> +<translation id="5406131354638931058">Gönderim veya depolama sürecinde olan cihazların pil gücünü kesin</translation> <translation id="5423849171846380976">Etkin</translation> <translation id="5430931332414098647">Anında Tethering</translation> <translation id="5431318178759467895">Renk</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Dosya bulunamadı</translation> <translation id="5939518447894949180">Sıfırla</translation> <translation id="594552776027197022">Rastgele anahtar çifti oluşturun</translation> +<translation id="5951259522948394825">Her şeyin sorunsuz olduğunu onaylayıp teşhis raporunu görüntüleyin</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Varsayılan Duvar Kağıdı</translation> <translation id="6017514345406065928">Yeşil</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Seç: <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA Günlükleri</translation> <translation id="8206859287963243715">Cep telefonu</translation> <translation id="8208861521865154048">Avantajlar</translation> <translation id="8217675307824400706">Bağlanın</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Otomatik koyu mod</translation> <translation id="8461329675984532579">Ev sağlayıcısının adı</translation> <translation id="8467104829907989997">Bileşenler kalibre ediliyor...</translation> +<translation id="8474030592808010086">Pil gücünü kesmek için cihazı prizden çıkarın</translation> <translation id="8475690821716466388">Kablosuz ağ, zayıf bir protokol olan WEP PSK ile güvenlik altına alınmış</translation> <translation id="8477551185774834963">DNS gecikmesi, izin verilen eşiğin biraz üzerinde</translation> <translation id="8483248364096924578">IP adresi</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Sinyal gücü</translation> <translation id="8910721771319628100">Varsayılan ağ, gecikme eşiğini aştı</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> adlı kişinin <ph name="DEVICE_TYPE" /> cihazı</translation> +<translation id="8919792139048574232">Düzeltilen noktalara göz atın</translation> <translation id="8919837981463578619">İşlem başarısız - Tepsi yok</translation> <translation id="8923267550422472772">Aylık sıfırlama günü</translation> <translation id="8928727111548978589">İşlem başarısız - Kağıt yok</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb index a3ecda95..e7218e3 100644 --- a/chromeos/strings/chromeos_strings_uz.xtb +++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Roumingsiz uy tarmog‘i</translation> <translation id="1327977588028644528">Shlyuz</translation> +<translation id="1328223165223065150">Fon rasmi rangi</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Skanerlash sohasiga moslash</translation> <translation id="1367951781824006909">Fayl tanlang</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Rasm manbasi</translation> <translation id="1451536289672181509">Qurilma — klaviatura.</translation> <translation id="1459693405370120464">Ob-havo</translation> +<translation id="1459784442280469416">USB qurilmaga saqlash</translation> <translation id="1468664791493211953">Takliflar</translation> <translation id="1476467821656042872">Bu qurilma <ph name="MANAGER" /> domenida boshqariladi va faoliyatingiz kuzatilishi mumkin.</translation> <translation id="1478594628797167447">Skaner</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> bu foydalanuvchi faoliyatini masofadan kuzatishi va boshqarishi mumkin.</translation> <translation id="150962533380566081">PUK kod xato.</translation> <translation id="1510238584712386396">Ishga tushirish paneli</translation> +<translation id="1512982610995527443">Qurilma 5 soniyadan keyin oʻchadi</translation> +<translation id="1522984060396982789">Tuzatildi. Qurilmani uzishingiz yoki qoʻshimcha choralar koʻrishingiz mumkin.</translation> <translation id="152892567002884378">Ovozni kuchaytirish</translation> <translation id="1555130319947370107">Ko‘k</translation> <translation id="155865706765934889">Sensorli panel</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Qurilma versiyasi</translation> <translation id="1905710495812624430">Urinishlar soni cheklovdan oshib ketdi.</translation> <translation id="1908234395526491708">Bajarilmagan UDP soʻrovlari</translation> +<translation id="1932611479324127242">Batareyani uzish</translation> <translation id="1947737735496445907">Chop etildi</translation> <translation id="1951012854035635156">Assistent</translation> <translation id="1977994649430373166">Google profil surati</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Ustma-ust chiqadigan</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> ta rasm</translation> +<translation id="2154739667870063220">Qayta yoqish</translation> <translation id="2157959690810728433">NAVBATDA</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Qayta urinish</translation> <translation id="2161394479394250669">Chop etish vazifasini bekor qilish</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Sxemani almashtirish</translation> <translation id="225692081236532131">Aktivatsiya holati</translation> <translation id="2271469253353559191">Tungi rejim rejasi</translation> +<translation id="2275586345903859204">Tuzatildi</translation> <translation id="2287186687001756809">Hech qanday rasm topilmadi. Suratlar kiritish uchun <ph name="LINK" /> sahifasini oching.</translation> <translation id="2307344026739914387">Joriy kalitlar juftligidan foydalanish</translation> <translation id="2320295602967756579">Kunduzgi mavzuni yoqish</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Toʻq rangli rejimni yoqish</translation> <translation id="2740531572673183784">Ok</translation> <translation id="2751739896257479635">EAP autentifikatsiya 2-bosqichi</translation> +<translation id="2756652381241102009">Diagnostikani ishga tushirish</translation> <translation id="2783010256799387990">TUGADI</translation> <translation id="2789486458103222910">OK</translation> <translation id="2805756323405976993">Ilovalar</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Ulanmoqda...</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098"><ph name="DEVICE_NAME" /> qayta ishga tushirilmoqda</translation> +<translation id="4415951057168511744">Joriy avatar</translation> <translation id="4425149324548788773">My Drive</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> yoqilmagan</translation> <translation id="4429881212383817840">Kerberos chiptasi amal qilish muddati tezda tugaydi</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Ota-ona kirishi</translation> <translation id="473775607612524610">Yangilash</translation> <translation id="4744944742468440486">Tanlovga aloqador axborot</translation> +<translation id="4751272708893364980">RMA jurnalini koʻrish</translation> <translation id="4773299976671772492">To‘xtatildi</translation> <translation id="4774530504324923332">RMA serveri qulfi (RSU) yoniq elektron kalit, QR kod skaneri va internetga ulangan ikkinchi qurilma talab etiladi</translation> <translation id="4782311465517282004">Tavsif olish, tarjima qilish yoki birlik konversiyasi uchun matn ustiga oʻng klik yoki biroz bosib turing</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">WiFi tarmoq xavfsiz emas</translation> <translation id="5376354385557966694">Avtomatik kunduzgi rejim</translation> <translation id="537872351913703572">Qurilma foydalanuvchisi yoki tashkiloti oʻzgaradi</translation> +<translation id="5389224261615877010">Kamalak</translation> <translation id="5395600419410242651">Hamma narsani tozalash</translation> <translation id="5400907029458559844">Qurilma ulanmoqda.</translation> <translation id="5401938042319910061">Barcha dasturlarni ishga tushirish</translation> +<translation id="5406131354638931058">Yuborilayotgani yoki ombordaligi sababli qurilmalar uchun batareyani uzing</translation> <translation id="5423849171846380976">Faol</translation> <translation id="5430931332414098647">Tezkor modem rejimi</translation> <translation id="5431318178759467895">Rang</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Fayl topilmadi</translation> <translation id="5939518447894949180">Asliga qaytarish</translation> <translation id="594552776027197022">Tasodifiy kalitlar juftligini yaratish</translation> +<translation id="5951259522948394825">Hech qanday muammo yoʻqligini tekshirish va diagnostika hisobotini koʻrish imkonini beradi.</translation> <translation id="5972388717451707488">Tizimni yangilash</translation> <translation id="5984145644188835034">Standart fon rasmi</translation> <translation id="6017514345406065928">Yashil</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Tanlash: <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA jurnallari</translation> <translation id="8206859287963243715">Uyali</translation> <translation id="8208861521865154048">Imtiyozlar</translation> <translation id="8217675307824400706">Internetga ulaning</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Avtomatik tungi rejim</translation> <translation id="8461329675984532579">Mahalliy ta’minotchi nomi</translation> <translation id="8467104829907989997">Komponentlar kalibrlanmoqda...</translation> +<translation id="8474030592808010086">Batareyani uzish uchun qurilmani tarmoqdan uzing.</translation> <translation id="8475690821716466388">WiFi tarmoq zaif WEP PSK protokoli bilan himoyalangan</translation> <translation id="8477551185774834963">DNS kutish vaqti ruxsat etilgan chegaradan biroz baland</translation> <translation id="8483248364096924578">IP manzil</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Signal darajasi</translation> <translation id="8910721771319628100">Birlamchi tarmoq kutish vaqti baland</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> (<ph name="GIVEN_NAME" />)</translation> +<translation id="8919792139048574232">Nima tuzatilganini koʻrish imkonini beradi</translation> <translation id="8919837981463578619">Bajarilmadi - Tarnov joyida emas</translation> <translation id="8923267550422472772">Asliga qaytarilish kuni</translation> <translation id="8928727111548978589">Bajarilmadi - Qogʻoz tugadi</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb index d78a0aa..4f745917 100644 --- a/chromeos/strings/chromeos_strings_vi.xtb +++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Mạng chủ, không chuyển vùng</translation> <translation id="1327977588028644528">Cổng vào</translation> +<translation id="1328223165223065150">Màu hình nền</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">Vừa với vùng quét</translation> <translation id="1367951781824006909">Chọn tệp</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">Nguồn hình ảnh</translation> <translation id="1451536289672181509">Thiết bị là bàn phím.</translation> <translation id="1459693405370120464">Thời tiết</translation> +<translation id="1459784442280469416">Lưu vào USB</translation> <translation id="1468664791493211953">Ưu đãi</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> quản lý thiết bị này và có thể giám sát hoạt động của bạn.</translation> <translation id="1478594628797167447">Máy quét</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> quản lý người dùng này và có thể quản lý từ xa các tùy chọn cài đặt cũng như giám sát hoạt động của người dùng.</translation> <translation id="150962533380566081">PUK không hợp lệ.</translation> <translation id="1510238584712386396">Trình chạy</translation> +<translation id="1512982610995527443">Thiết bị sẽ tắt trong 5 giây</translation> +<translation id="1522984060396982789">Quá trình sửa đã thành công. Bạn có thể tắt thiết bị hoặc thực hiện thao tác khác.</translation> <translation id="152892567002884378">Tăng âm lượng</translation> <translation id="1555130319947370107">Xanh lam</translation> <translation id="155865706765934889">Ô di chuột</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">Hiệu chỉnh phần cứng</translation> <translation id="1905710495812624430">Đã vượt quá số lần thử tối đa được phép.</translation> <translation id="1908234395526491708">Không gửi được yêu cầu UDP</translation> +<translation id="1932611479324127242">Tắt hẳn pin</translation> <translation id="1947737735496445907">Đã in</translation> <translation id="1951012854035635156">Trợ lý</translation> <translation id="1977994649430373166">Ảnh hồ sơ trên Google</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">Lơ lửng</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> ảnh</translation> +<translation id="2154739667870063220">Khởi động lại</translation> <translation id="2157959690810728433">ĐÃ XẾP VÀO HÀNG ĐỢI</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />: Thử lại</translation> <translation id="2161394479394250669">Hủy lệnh in</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">Chuyển bố cục</translation> <translation id="225692081236532131">Trạng thái kích hoạt</translation> <translation id="2271469253353559191">Lịch áp dụng chế độ tối</translation> +<translation id="2275586345903859204">Đã sửa xong</translation> <translation id="2287186687001756809">Không có hình ảnh nào. Để thêm ảnh, hãy truy cập <ph name="LINK" /></translation> <translation id="2307344026739914387">Dùng cặp khóa hiện tại</translation> <translation id="2320295602967756579">Bật giao diện sáng</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">Bật chế độ màu tối</translation> <translation id="2740531572673183784">Ok</translation> <translation id="2751739896257479635">Xác thực EAP giai đoạn 2</translation> +<translation id="2756652381241102009">Chạy quá trình chẩn đoán</translation> <translation id="2783010256799387990">ĐÃ ĐẠT</translation> <translation id="2789486458103222910">OK</translation> <translation id="2805756323405976993">Ứng dụng</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">Đang kết nối…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">Đang khởi động lại <ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">Hình đại diện hiện tại</translation> <translation id="4425149324548788773">Drive của tôi</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> đang tắt</translation> <translation id="4429881212383817840">Vé Kerberos sẽ sớm hết hạn</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">Quyền truy cập của cha mẹ</translation> <translation id="473775607612524610">Cập nhật</translation> <translation id="4744944742468440486">Thông tin liên quan đến nội dung bạn chọn</translation> +<translation id="4751272708893364980">Xem nhật ký RMA</translation> <translation id="4773299976671772492">Đã dừng</translation> <translation id="4774530504324923332">Bạn cần có khoá bảo mật hỗ trợ RSU, máy quét mã QR và thiết bị thứ hai có kết nối internet</translation> <translation id="4782311465517282004">Xem định nghĩa, bản dịch hoặc kết quả chuyển đổi đơn vị bằng cách nhấp chuột phải hoặc chạm và giữ văn bản</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Mạng Wi-Fi không bảo mật</translation> <translation id="5376354385557966694">Chế độ sáng tự động</translation> <translation id="537872351913703572">Thiết bị sẽ thuộc về người dùng hoặc tổ chức khác</translation> +<translation id="5389224261615877010">Cầu vồng</translation> <translation id="5395600419410242651">Xoá toàn bộ dữ liệu</translation> <translation id="5400907029458559844">Thiết bị đang kết nối.</translation> <translation id="5401938042319910061">Chạy tất cả quy trình</translation> +<translation id="5406131354638931058">Tắt hẳn pin cho thiết bị được vận chuyển hoặc lưu giữ</translation> <translation id="5423849171846380976">Đã kích hoạt</translation> <translation id="5430931332414098647">Chia sẻ Internet tức thì</translation> <translation id="5431318178759467895">Màu</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">Không tìm thấy tệp</translation> <translation id="5939518447894949180">Đặt lại</translation> <translation id="594552776027197022">Tạo cặp khóa ngẫu nhiên</translation> +<translation id="5951259522948394825">Xác nhận mọi thứ đều ổn và xem báo cáo chẩn đoán</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">Hình nền mặc định</translation> <translation id="6017514345406065928">Xanh lục</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Chọn <ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">Nhật ký RMA</translation> <translation id="8206859287963243715">Di động</translation> <translation id="8208861521865154048">Đặc quyền</translation> <translation id="8217675307824400706">Kết nối</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">Chế độ tối tự động</translation> <translation id="8461329675984532579">Tên nhà mạng nội hạt</translation> <translation id="8467104829907989997">Đang hiệu chỉnh các thành phần...</translation> +<translation id="8474030592808010086">Rút thiết bị ra khỏi nguồn điện để tắt hẳn pin</translation> <translation id="8475690821716466388">Mạng Wi-Fi được bảo mật bằng giao thức yếu WEP PSK</translation> <translation id="8477551185774834963">Độ trễ của Hệ thống tên miền (DNS) vượt ngưỡng cho phép đôi chút</translation> <translation id="8483248364096924578">Địa chỉ IP</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">Cường độ tín hiệu</translation> <translation id="8910721771319628100">Mạng mặc định vượt ngưỡng độ trễ</translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> của <ph name="GIVEN_NAME" /></translation> +<translation id="8919792139048574232">Xem những vấn đề đã được sửa</translation> <translation id="8919837981463578619">Không thành công – Thiếu khay</translation> <translation id="8923267550422472772">Ngày trong tháng để đặt lại</translation> <translation id="8928727111548978589">Không thành công – Hết giấy</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb index 9766766..1248a6a 100644 --- a/chromeos/strings/chromeos_strings_zh-CN.xtb +++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">家庭网络,非漫游</translation> <translation id="1327977588028644528">网关</translation> +<translation id="1328223165223065150">壁纸颜色</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">适合扫描区域</translation> <translation id="1367951781824006909">选择文件</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">图片来源</translation> <translation id="1451536289672181509">设备类型是键盘。</translation> <translation id="1459693405370120464">天气</translation> +<translation id="1459784442280469416">保存至 USB</translation> <translation id="1468664791493211953">优惠</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> 负责管理此设备,而且也许能够监控您的活动。</translation> <translation id="1478594628797167447">扫描器</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> 负责管理此用户,而且可能会远程管理设置并监控用户活动。</translation> <translation id="150962533380566081">PUK 无效。</translation> <translation id="1510238584712386396">启动器</translation> +<translation id="1512982610995527443">设备将在 5 秒后关机</translation> +<translation id="1522984060396982789">已成功修复。您可将设备关机或执行一些其他操作。</translation> <translation id="152892567002884378">调高音量</translation> <translation id="1555130319947370107">蓝色</translation> <translation id="155865706765934889">触控板</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">硬件版本</translation> <translation id="1905710495812624430">已超过允许的尝试次数上限。</translation> <translation id="1908234395526491708">UDP 请求失败</translation> +<translation id="1932611479324127242">切断电池供电</translation> <translation id="1947737735496445907">已打印</translation> <translation id="1951012854035635156">智能助理</translation> <translation id="1977994649430373166">Google 个人资料照片</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">一飘而过</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> 张照片</translation> +<translation id="2154739667870063220">重新启动</translation> <translation id="2157959690810728433">已加入队列</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />:重试</translation> <translation id="2161394479394250669">取消打印任务</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">布局切换</translation> <translation id="225692081236532131">激活状态</translation> <translation id="2271469253353559191">深色模式时间表</translation> +<translation id="2275586345903859204">已修复完毕</translation> <translation id="2287186687001756809">没有可显示的图片。若要添加照片,请前往 <ph name="LINK" /></translation> <translation id="2307344026739914387">使用当前密钥对</translation> <translation id="2320295602967756579">启用浅色主题</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">启用深色模式</translation> <translation id="2740531572673183784">确定</translation> <translation id="2751739896257479635">EAP 阶段 2 身份验证</translation> +<translation id="2756652381241102009">运行诊断</translation> <translation id="2783010256799387990">通过</translation> <translation id="2789486458103222910">确定</translation> <translation id="2805756323405976993">应用</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">正在连接…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">正在重启<ph name="DEVICE_NAME" /></translation> +<translation id="4415951057168511744">当前头像</translation> <translation id="4425149324548788773">我的云端硬盘</translation> <translation id="4428374560396076622">“<ph name="NETWORK_NAME" />”已关闭</translation> <translation id="4429881212383817840">Kerberos 票据即将过期</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">家长访问</translation> <translation id="473775607612524610">更新</translation> <translation id="4744944742468440486">与您所选内容相关的信息</translation> +<translation id="4751272708893364980">查看 RMA 日志</translation> <translation id="4773299976671772492">已停止</translation> <translation id="4774530504324923332">您将需要一个已启用 RSU 的安全密钥、二维码扫描器和另一部联网设备</translation> <translation id="4782311465517282004">在您右键点击或轻触并按住文字时获取定义、翻译或单位换算结果</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">Wi-Fi 网络不安全</translation> <translation id="5376354385557966694">自动浅色模式</translation> <translation id="537872351913703572">设备将由另一用户或组织使用</translation> +<translation id="5389224261615877010">彩虹色</translation> <translation id="5395600419410242651">清除所有数据</translation> <translation id="5400907029458559844">设备正在连接。</translation> <translation id="5401938042319910061">运行所有例程</translation> +<translation id="5406131354638931058">为正配送或库存中的设备切断电池供电</translation> <translation id="5423849171846380976">已激活</translation> <translation id="5430931332414098647">即时网络共享</translation> <translation id="5431318178759467895">彩色</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">未找到文件</translation> <translation id="5939518447894949180">重置</translation> <translation id="594552776027197022">生成随机密钥对</translation> +<translation id="5951259522948394825">确认一切都各就各位并查看诊断报告</translation> <translation id="5972388717451707488">更新引擎</translation> <translation id="5984145644188835034">默认壁纸</translation> <translation id="6017514345406065928">绿色</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">选择 <ph name="TOPIC_SOURCE" /> - <ph name="TOPIC_SOURCE_DESC" /></translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">RMA 日志</translation> <translation id="8206859287963243715">蜂窝网络设备</translation> <translation id="8208861521865154048">福利</translation> <translation id="8217675307824400706">连接到网络</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">自动深色模式</translation> <translation id="8461329675984532579">家用移动网络提供商名称</translation> <translation id="8467104829907989997">正在校准组件…</translation> +<translation id="8474030592808010086">拔掉设备的电源线,以切断电池供电</translation> <translation id="8475690821716466388">Wi-Fi 网络采用了防护能力较弱的 WEP PSK 协议</translation> <translation id="8477551185774834963">DNS 延迟时间略微超出了允许的阈值</translation> <translation id="8483248364096924578">IP 地址</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">信号强度</translation> <translation id="8910721771319628100">默认网络的延迟时间超出了阈值</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />的 <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">查看已解决的问题</translation> <translation id="8919837981463578619">失败 - 缺少送纸盘</translation> <translation id="8923267550422472772">每月重置流量使用情况的日期</translation> <translation id="8928727111548978589">失败 - 纸张已用完</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb index 9fc2a4b..663d7156 100644 --- a/chromeos/strings/chromeos_strings_zh-TW.xtb +++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -38,6 +38,7 @@ <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">家用網路,非漫遊狀態</translation> <translation id="1327977588028644528">閘道</translation> +<translation id="1328223165223065150">桌布顏色</translation> <translation id="1330426557709298164">JPG</translation> <translation id="1337912285145772892">符合掃描區大小</translation> <translation id="1367951781824006909">選擇檔案</translation> @@ -55,6 +56,7 @@ <translation id="1442433966118452622">圖片來源</translation> <translation id="1451536289672181509">裝置類型為鍵盤。</translation> <translation id="1459693405370120464">天氣</translation> +<translation id="1459784442280469416">儲存至 USB</translation> <translation id="1468664791493211953">優惠</translation> <translation id="1476467821656042872"><ph name="MANAGER" /> 管理這個裝置,且可能有權監控你的活動。</translation> <translation id="1478594628797167447">掃描器</translation> @@ -63,6 +65,8 @@ <translation id="1499900233129743732"><ph name="MANAGER" /> 管理這位使用者,且可從遠端管理設定及監控使用者活動。</translation> <translation id="150962533380566081">PUK 無效。</translation> <translation id="1510238584712386396">啟動器</translation> +<translation id="1512982610995527443">裝置將於 5 秒內關機</translation> +<translation id="1522984060396982789">已成功完成維修程序。你可以將裝置關機或採取其他額外動作。</translation> <translation id="152892567002884378">調高音量</translation> <translation id="1555130319947370107">藍色</translation> <translation id="155865706765934889">觸控板</translation> @@ -105,6 +109,7 @@ <translation id="1887850431809612466">硬體版本</translation> <translation id="1905710495812624430">超過嘗試次數上限。</translation> <translation id="1908234395526491708">UDP 要求失敗</translation> +<translation id="1932611479324127242">電池斷開</translation> <translation id="1947737735496445907">已列印</translation> <translation id="1951012854035635156">小幫手</translation> <translation id="1977994649430373166">Google 個人資料相片</translation> @@ -123,6 +128,7 @@ <translation id="2138109643290557664">隨興漂浮</translation> <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation> <translation id="2152882202543497059"><ph name="NUMBER" /> 張相片</translation> +<translation id="2154739667870063220">重新啟動</translation> <translation id="2157959690810728433">已排入佇列</translation> <translation id="2158971754079422508"><ph name="DESC_TEXT" />:重試</translation> <translation id="2161394479394250669">取消列印工作</translation> @@ -140,6 +146,7 @@ <translation id="2240366984605217732">版面配置切換</translation> <translation id="225692081236532131">啟用狀態</translation> <translation id="2271469253353559191">深色模式時間表</translation> +<translation id="2275586345903859204">維修程序已完成</translation> <translation id="2287186687001756809">沒有圖片。如要新增相片,請前往 <ph name="LINK" /></translation> <translation id="2307344026739914387">使用目前的金鑰組</translation> <translation id="2320295602967756579">啟用淺色主題</translation> @@ -183,6 +190,7 @@ <translation id="2717139507051041123">啟用深色模式</translation> <translation id="2740531572673183784">確定</translation> <translation id="2751739896257479635">EAP 第 2 階段驗證</translation> +<translation id="2756652381241102009">執行診斷</translation> <translation id="2783010256799387990">已通過</translation> <translation id="2789486458103222910">確定</translation> <translation id="2805756323405976993">應用程式</translation> @@ -332,6 +340,7 @@ <translation id="4378551569595875038">連線中…</translation> <translation id="4382484599443659549">PDF</translation> <translation id="439429847087949098">正在重新啟動「<ph name="DEVICE_NAME" />」</translation> +<translation id="4415951057168511744">目前的顯示圖片</translation> <translation id="4425149324548788773">我的雲端硬碟</translation> <translation id="4428374560396076622"><ph name="NETWORK_NAME" /> 已停用</translation> <translation id="4429881212383817840">Kerberos 票證即將到期</translation> @@ -368,6 +377,7 @@ <translation id="4731797938093519117">家長存取</translation> <translation id="473775607612524610">更新</translation> <translation id="4744944742468440486">所選內容的相關資訊</translation> +<translation id="4751272708893364980">查看退貨授權記錄</translation> <translation id="4773299976671772492">已停止</translation> <translation id="4774530504324923332">你需要啟用了 RSU 的安全金鑰、QR 圖碼掃描器,以及另一部可以連上網際網路的裝置</translation> <translation id="4782311465517282004">按住文字或在文字上按一下滑鼠右鍵後,就能取得定義、翻譯或單位轉換結果</translation> @@ -451,9 +461,11 @@ <translation id="5372659122375744710">WiFi 網路不安全</translation> <translation id="5376354385557966694">自動淺色模式</translation> <translation id="537872351913703572">裝置的擁有者或所屬機構會變更</translation> +<translation id="5389224261615877010">彩虹</translation> <translation id="5395600419410242651">清除所有資料</translation> <translation id="5400907029458559844">正在連接裝置。</translation> <translation id="5401938042319910061">執行所有的日常網路診斷</translation> +<translation id="5406131354638931058">為要運送或庫存的裝置執行電池斷開作業</translation> <translation id="5423849171846380976">已啟用</translation> <translation id="5430931332414098647">即時網路共用</translation> <translation id="5431318178759467895">彩色</translation> @@ -506,6 +518,7 @@ <translation id="5931523347251946569">找不到檔案</translation> <translation id="5939518447894949180">重設</translation> <translation id="594552776027197022">產生隨機金鑰組</translation> +<translation id="5951259522948394825">確認一切無誤並查看診斷報告</translation> <translation id="5972388717451707488">Update Engine</translation> <translation id="5984145644188835034">預設桌布</translation> <translation id="6017514345406065928">綠色</translation> @@ -726,6 +739,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">選取「<ph name="TOPIC_SOURCE" /><ph name="TOPIC_SOURCE_DESC" />」</translation> <translation id="8179976553408161302">Enter</translation> +<translation id="819552138404104974">退貨授權記錄</translation> <translation id="8206859287963243715">手機</translation> <translation id="8208861521865154048">獎勵</translation> <translation id="8217675307824400706">連上網路</translation> @@ -759,6 +773,7 @@ <translation id="8456761643544401578">自動深色模式</translation> <translation id="8461329675984532579">家用提供者名稱</translation> <translation id="8467104829907989997">正在校正元件...</translation> +<translation id="8474030592808010086">拔除裝置電源線以執行電池斷開作業</translation> <translation id="8475690821716466388">已使用防護力較弱的通訊協定 WEP PSK 保護 Wi-Fi 網路</translation> <translation id="8477551185774834963">DNS 延遲時間稍微超過允許的門檻</translation> <translation id="8483248364096924578">IP 位址</translation> @@ -804,6 +819,7 @@ <translation id="8898840733695078011">訊號強度</translation> <translation id="8910721771319628100">預設網路超過延遲門檻</translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />的 <ph name="DEVICE_TYPE" /></translation> +<translation id="8919792139048574232">查看修復項目</translation> <translation id="8919837981463578619">失敗 - 缺少紙匣</translation> <translation id="8923267550422472772">每月重設日</translation> <translation id="8928727111548978589">失敗 - 紙張用盡</translation>
diff --git a/components/app_restore/app_restore_utils.cc b/components/app_restore/app_restore_utils.cc index 2a38ed2..6f0f2ca 100644 --- a/components/app_restore/app_restore_utils.cc +++ b/components/app_restore/app_restore_utils.cc
@@ -74,7 +74,7 @@ true); } if (window_info->pre_minimized_show_state_type) { - property_handler->SetProperty(aura::client::kPreMinimizedShowStateKey, + property_handler->SetProperty(aura::client::kRestoreShowStateKey, *window_info->pre_minimized_show_state_type); } }
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc index ae8a55d4..3c934b2 100644 --- a/components/autofill/core/browser/autofill_manager.cc +++ b/components/autofill/core/browser/autofill_manager.cc
@@ -161,6 +161,9 @@ mojom::SubmissionSource source) { if (IsValidFormData(form)) OnFormSubmittedImpl(form, known_success, source); + + for (Observer& observer : observers_) + observer.OnFormSubmitted(); } void AutofillManager::OnFormsSeen( @@ -276,6 +279,10 @@ return; OnTextFieldDidChangeImpl(form, field, bounding_box, timestamp); + + for (Observer& observer : observers_) { + observer.OnTextFieldDidChange(); + } } void AutofillManager::OnTextFieldDidScroll(const FormData& form, @@ -285,6 +292,9 @@ return; OnTextFieldDidScrollImpl(form, field, bounding_box); + + for (Observer& observer : observers_) + observer.OnTextFieldDidScroll(); } void AutofillManager::OnSelectControlDidChange(const FormData& form, @@ -294,6 +304,9 @@ return; OnSelectControlDidChangeImpl(form, field, bounding_box); + + for (Observer& observer : observers_) + observer.OnSelectControlDidChange(); } void AutofillManager::OnAskForValuesToFill(int query_id, @@ -409,8 +422,9 @@ form_structure->RetrieveFromCache(*cached_form, /*should_keep_cached_value=*/true, /*only_server_and_autofill_state=*/true); - if (observer_for_testing_) - observer_for_testing_->OnFormParsed(); + + for (Observer& observer : observers_) + observer.OnFormParsed(); if (form_structure.get()->value_from_dynamic_change_form()) value_from_dynamic_change_form_ = true;
diff --git a/components/autofill/core/browser/autofill_manager.h b/components/autofill/core/browser/autofill_manager.h index 539ec5e..15b4146 100644 --- a/components/autofill/core/browser/autofill_manager.h +++ b/components/autofill/core/browser/autofill_manager.h
@@ -12,6 +12,7 @@ #include "base/cancelable_callback.h" #include "base/memory/raw_ptr.h" +#include "base/observer_list.h" #include "base/scoped_observation.h" #include "base/time/time.h" #include "base/types/strong_alias.h" @@ -56,9 +57,21 @@ public: // An observer class used by browsertests that gets notified whenever // particular actions occur. - class ObserverForTest { + class Observer : public base::CheckedObserver { public: - virtual void OnFormParsed() = 0; + virtual void OnFormParsed(){}; + + // See |AutofillManager::OnTextFieldDidChange|. + virtual void OnTextFieldDidChange(){}; + + // See |AutofillManager::OnTextFieldDidScroll|. + virtual void OnTextFieldDidScroll(){}; + + // See |AutofillManager::OnSelectControlDidChange|. + virtual void OnSelectControlDidChange(){}; + + // See |AutofillManager::OnFormSubmitted|. + virtual void OnFormSubmitted(){}; }; using EnableDownloadManager = @@ -214,8 +227,10 @@ // Returns the number of forms this Autofill handler is aware of. size_t NumFormsDetected() const { return form_structures_.size(); } - void SetEventObserverForTesting(ObserverForTest* observer) { - observer_for_testing_ = observer; + void AddObserver(Observer* observer) { observers_.AddObserver(observer); } + + void RemoveObserver(Observer* observer) { + observers_.RemoveObserver(observer); } // Returns the present form structures seen by Autofill handler. @@ -401,8 +416,8 @@ std::unique_ptr<AutofillMetrics::FormInteractionsUkmLogger> form_interactions_ukm_logger_; - // Will be not null only for |SaveCardBubbleViewsFullFormBrowserTest|. - raw_ptr<ObserverForTest> observer_for_testing_ = nullptr; + // Observers that listen to updates of this instance. + base::ObserverList<Observer> observers_; }; } // namespace autofill
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc index 79e5f72..12aed8d 100644 --- a/components/autofill/core/browser/autofill_manager_unittest.cc +++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -18,6 +18,7 @@ #include "components/autofill/core/browser/test_autofill_driver.h" #include "components/autofill/core/common/autofill_constants.h" #include "components/autofill/core/common/autofill_features.h" +#include "components/autofill/core/common/autofill_tick_clock.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -151,6 +152,24 @@ (override)); }; +class MockAutofillObserver : public AutofillManager::Observer { + public: + MockAutofillObserver() = default; + MockAutofillObserver(const MockAutofillObserver&) = delete; + MockAutofillObserver& operator=(const MockAutofillObserver&) = delete; + ~MockAutofillObserver() override = default; + + MOCK_METHOD(void, OnFormParsed, (), (override)); + + MOCK_METHOD(void, OnTextFieldDidChange, (), (override)); + + MOCK_METHOD(void, OnTextFieldDidScroll, (), (override)); + + MOCK_METHOD(void, OnSelectControlDidChange, (), (override)); + + MOCK_METHOD(void, OnFormSubmitted, (), (override)); +}; + // Creates a vector of test forms which differ in their FormGlobalIds // and FieldGlobalIds. std::vector<FormData> CreateTestForms(size_t num_forms) { @@ -280,4 +299,38 @@ OnFormsSeenWithExpectations(*manager_, forms, GetFormIds(forms), forms); } +TEST_F(AutofillManagerTest, ObserverReceiveCalls) { + FormData form = CreateTestForms(1).front(); + FormFieldData field = form.fields.front(); + gfx::RectF bounds; + base::TimeTicks time = AutofillTickClock::NowTicks(); + + MockAutofillObserver observer; + manager_->AddObserver(&observer); + // Reset the manager, the observers should stick around. + manager_->Reset(); + + EXPECT_CALL(observer, OnTextFieldDidChange()).Times(1); + manager_->OnTextFieldDidChange(form, field, bounds, time); + EXPECT_CALL(observer, OnTextFieldDidChange()).Times(0); + + EXPECT_CALL(observer, OnTextFieldDidScroll()).Times(1); + manager_->OnTextFieldDidScroll(form, field, bounds); + EXPECT_CALL(observer, OnTextFieldDidScroll()).Times(0); + + EXPECT_CALL(observer, OnSelectControlDidChange()).Times(1); + manager_->OnSelectControlDidChange(form, field, bounds); + EXPECT_CALL(observer, OnSelectControlDidChange()).Times(0); + + EXPECT_CALL(observer, OnFormSubmitted()).Times(1); + manager_->OnFormSubmitted(form, true, + mojom::SubmissionSource::FORM_SUBMISSION); + EXPECT_CALL(observer, OnFormSubmitted()).Times(0); + + // Remove observer from manager, the observer should no longer receive pings. + manager_->RemoveObserver(&observer); + EXPECT_CALL(observer, OnTextFieldDidChange()).Times(0); + manager_->OnTextFieldDidChange(form, field, bounds, time); +} + } // namespace autofill
diff --git a/components/autofill/core/browser/autofill_suggestion_generator.cc b/components/autofill/core/browser/autofill_suggestion_generator.cc index dfba3a59..60a4e62 100644 --- a/components/autofill/core/browser/autofill_suggestion_generator.cc +++ b/components/autofill/core/browser/autofill_suggestion_generator.cc
@@ -57,7 +57,8 @@ const FormStructure& form_structure, const FormFieldData& field, const AutofillType& type, - const std::string& app_locale) { + const std::string& app_locale, + bool* should_display_gpay_logo) { std::vector<Suggestion> suggestions; DCHECK(personal_data_); @@ -65,6 +66,9 @@ personal_data_->GetCreditCardsToSuggest( autofill_client_->AreServerCardsSupported()); + *should_display_gpay_logo = base::ranges::all_of( + cards_to_suggest, base::not_fn(&CreditCard::IsLocalCard)); + // The field value is sanitized before attempting to match it to the user's // data. auto field_contents = SanitizeCreditCardFieldValue(field.value);
diff --git a/components/autofill/core/browser/autofill_suggestion_generator.h b/components/autofill/core/browser/autofill_suggestion_generator.h index 585378e..c059c66b 100644 --- a/components/autofill/core/browser/autofill_suggestion_generator.h +++ b/components/autofill/core/browser/autofill_suggestion_generator.h
@@ -41,7 +41,8 @@ const FormStructure& form_structure, const FormFieldData& field, const AutofillType& type, - const std::string& app_locale); + const std::string& app_locale, + bool* should_display_gpay_logo); // Remove credit cards that are expired at |comparison_time| and not used // since |min_last_used| from |cards|. The relative ordering of |cards| is
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc index d08a5ab..66f68f24 100644 --- a/components/autofill/core/browser/browser_autofill_manager.cc +++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -780,7 +780,7 @@ } const std::vector<CreditCard*>& credit_cards = - credit_card_access_manager_->GetCreditCards(); + personal_data_->GetCreditCards(); if (profiles.empty() && credit_cards.empty()) return false; @@ -1131,7 +1131,8 @@ if (!GetCachedFormAndField(form, field, &form_structure, &autofill_field)) return; FillOrPreviewDataModelForm(action, query_id, form, field, &profile, - /*cvc=*/nullptr, form_structure, autofill_field); + /*optional_cvc=*/nullptr, form_structure, + autofill_field); } void BrowserAutofillManager::FillOrPreviewForm( @@ -1652,8 +1653,7 @@ local_record_type_count); } - return !profiles.empty() || - !credit_card_access_manager_->GetCreditCards().empty(); + return !profiles.empty() || !personal_data_->GetCreditCards().empty(); } CreditCard* BrowserAutofillManager::GetCreditCard(int unique_id) { @@ -1661,7 +1661,7 @@ std::string credit_card_id; std::string profile_id; SplitFrontendID(unique_id, &credit_card_id, &profile_id); - return credit_card_access_manager_->GetCreditCard(credit_card_id); + return personal_data_->GetCreditCardByGUID(credit_card_id); } AutofillProfile* BrowserAutofillManager::GetProfile(int unique_id) { @@ -2037,9 +2037,9 @@ } } - for (size_t i = 0; i < suggestions.size(); ++i) { - suggestions[i].frontend_id = - MakeFrontendID(std::string(), suggestions[i].backend_id); + for (auto& suggestion : suggestions) { + suggestion.frontend_id = + MakeFrontendID(std::string(), suggestion.backend_id); } return suggestions; } @@ -2051,13 +2051,10 @@ bool* should_display_gpay_logo) const { credit_card_form_event_logger_->OnDidPollSuggestions(field, sync_state_); - *should_display_gpay_logo = - credit_card_access_manager_->ShouldDisplayGPayLogo(); - std::vector<Suggestion> suggestions; if (!IsInAutofillSuggestionsDisabledExperiment()) { suggestions = suggestion_generator_->GetSuggestionsForCreditCards( - form_structure, field, type, app_locale_); + form_structure, field, type, app_locale_, should_display_gpay_logo); } // TODO(crbug.com/1196021): Once the profile suggestion creation is moved to @@ -2449,7 +2446,8 @@ const AutofillProfile* profile = absl::get<const AutofillProfile*>(profile_or_credit_card); client()->DidFillOrPreviewField( - /*value=*/profile->GetInfo(autofill_field->Type(), app_locale_), + /*autofilled_value=*/profile->GetInfo(autofill_field->Type(), + app_locale_), /*profile_full_name=*/profile->GetInfo(AutofillType(NAME_FULL), app_locale_)); }
diff --git a/components/autofill/core/browser/browser_autofill_manager.h b/components/autofill/core/browser/browser_autofill_manager.h index 13ecc92..3581f7aa 100644 --- a/components/autofill/core/browser/browser_autofill_manager.h +++ b/components/autofill/core/browser/browser_autofill_manager.h
@@ -745,6 +745,7 @@ base::WeakPtrFactory<BrowserAutofillManager> weak_ptr_factory_{this}; friend class AutofillAssistantTest; + friend class AutofillMetricsCrossFrameFormTest; friend class BrowserAutofillManagerTest; friend class AutofillMetricsTest; friend class metrics::AutofillMetricsBaseTest;
diff --git a/components/autofill/core/browser/data_model/credit_card.cc b/components/autofill/core/browser/data_model/credit_card.cc index 7c93d47..b9e126b 100644 --- a/components/autofill/core/browser/data_model/credit_card.cc +++ b/components/autofill/core/browser/data_model/credit_card.cc
@@ -170,7 +170,7 @@ operator=(credit_card); } -CreditCard::~CreditCard() {} +CreditCard::~CreditCard() = default; // static const std::u16string CreditCard::StripSeparators(const std::u16string& number) { @@ -374,6 +374,11 @@ return dots; } +// static +bool CreditCard::IsLocalCard(const CreditCard* card) { + return card && card->record_type() == CreditCard::LOCAL_CARD; +} + void CreditCard::SetNetworkForMaskedCard(base::StringPiece network) { DCHECK_EQ(MASKED_SERVER_CARD, record_type()); network_ = std::string(network);
diff --git a/components/autofill/core/browser/data_model/credit_card.h b/components/autofill/core/browser/data_model/credit_card.h index f1f5b74..44a74f8a 100644 --- a/components/autofill/core/browser/data_model/credit_card.h +++ b/components/autofill/core/browser/data_model/credit_card.h
@@ -124,6 +124,9 @@ // Returns string of dots for hidden card information. static std::u16string GetMidlineEllipsisDots(size_t num_dots); + // Returns whether the card is a local card. + static bool IsLocalCard(const CreditCard* card); + // Network issuer strings are defined at the bottom of this file, e.g. // kVisaCard. void SetNetworkForMaskedCard(base::StringPiece network);
diff --git a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc index 7ccee0b1..dbb96f2f 100644 --- a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc +++ b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
@@ -12225,11 +12225,13 @@ false /* include_full_server_credit_card */, false /* masked_card_is_enrolled_for_virtual_card */); - credit_card_with_cvc_ = {.credit_card = *autofill_manager() - .GetCreditCardAccessManager() - ->GetCreditCardsToSuggest() - .front(), - .cvc = u"123"}; + credit_card_with_cvc_ = { + .credit_card = *autofill_manager() + .personal_data_ + ->GetCreditCardsToSuggest( + autofill_client_->AreServerCardsSupported()) + .front(), + .cvc = u"123"}; url::Origin main_origin = url::Origin::Create(GURL("https://example.test/"));
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager.cc b/components/autofill/core/browser/payments/credit_card_access_manager.cc index 6e1b315..56172eb 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager.cc +++ b/components/autofill/core/browser/payments/credit_card_access_manager.cc
@@ -49,9 +49,6 @@ // Suffix for server IDs in the cache indicating that a card is a virtual card. const char kVirtualCardIdentifier[] = "_vcn"; -bool IsLocalCard(const CreditCard* card) { - return card && card->record_type() == CreditCard::LOCAL_CARD; -} } // namespace CreditCardAccessManager::CreditCardAccessManager( @@ -65,10 +62,11 @@ personal_data_manager_(personal_data_manager), form_event_logger_(form_event_logger) {} -CreditCardAccessManager::~CreditCardAccessManager() {} +CreditCardAccessManager::~CreditCardAccessManager() = default; void CreditCardAccessManager::UpdateCreditCardFormEventLogger() { - std::vector<CreditCard*> credit_cards = GetCreditCards(); + std::vector<CreditCard*> credit_cards = + personal_data_manager_->GetCreditCards(); size_t server_record_type_count = 0; size_t local_record_type_count = 0; @@ -83,23 +81,6 @@ form_event_logger_->set_is_context_secure(client_->IsContextSecure()); } -std::vector<CreditCard*> CreditCardAccessManager::GetCreditCards() { - return personal_data_manager_->GetCreditCards(); -} - -std::vector<CreditCard*> CreditCardAccessManager::GetCreditCardsToSuggest() { - const std::vector<CreditCard*> cards_to_suggest = - personal_data_manager_->GetCreditCardsToSuggest( - client_->AreServerCardsSupported()); - - return cards_to_suggest; -} - -bool CreditCardAccessManager::ShouldDisplayGPayLogo() { - return base::ranges::all_of(GetCreditCardsToSuggest(), - base::not_fn(&IsLocalCard)); -} - bool CreditCardAccessManager::UnmaskedCardCacheIsEmpty() { return unmasked_card_cache_.empty(); } @@ -118,14 +99,9 @@ unmasked_card_cache_.end(); } -bool CreditCardAccessManager::ServerCardsAvailable() { - return base::ranges::any_of(GetCreditCardsToSuggest(), - base::not_fn(&IsLocalCard)); -} - bool CreditCardAccessManager::DeleteCard(const CreditCard* card) { // Server cards cannot be deleted from within Chrome. - bool allowed_to_delete = IsLocalCard(card); + bool allowed_to_delete = CreditCard::IsLocalCard(card); if (allowed_to_delete) personal_data_manager_->DeleteLocalCreditCards({*card}); @@ -137,7 +113,7 @@ const CreditCard* card, std::u16string* title, std::u16string* body) { - if (!IsLocalCard(card)) + if (!CreditCard::IsLocalCard(card)) return false; if (title) @@ -154,18 +130,14 @@ return !is_authentication_in_progress_; } -CreditCard* CreditCardAccessManager::GetCreditCard(std::string guid) { - if (base::IsValidGUID(guid)) { - return personal_data_manager_->GetCreditCardByGUID(guid); - } - return nullptr; -} - void CreditCardAccessManager::PrepareToFetchCreditCard() { #if !BUILDFLAG(IS_IOS) // No need to fetch details if there are no server cards. - if (!ServerCardsAvailable()) + if (!base::ranges::any_of(personal_data_manager_->GetCreditCardsToSuggest( + client_->AreServerCardsSupported()), + base::not_fn(&CreditCard::IsLocalCard))) { return; + } // Do not make a preflight call if unnecessary, such as if one is already in // progress or a recently-returned call should be currently used.
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager.h b/components/autofill/core/browser/payments/credit_card_access_manager.h index 5d26130..8b693f8 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager.h +++ b/components/autofill/core/browser/payments/credit_card_access_manager.h
@@ -95,7 +95,7 @@ public: class Accessor { public: - virtual ~Accessor() {} + virtual ~Accessor() = default; virtual void OnCreditCardFetched( CreditCardFetchResult result, const CreditCard* credit_card = nullptr, @@ -115,12 +115,6 @@ // Logs information about current credit card data. void UpdateCreditCardFormEventLogger(); - // Returns all credit cards. - std::vector<CreditCard*> GetCreditCards(); - // Returns credit cards in the order to be suggested to the user. - std::vector<CreditCard*> GetCreditCardsToSuggest(); - // Returns true only if all cards are server cards. - bool ShouldDisplayGPayLogo(); // Returns true when deletion is allowed. Only local cards can be deleted. bool DeleteCard(const CreditCard* card); // Returns true if the |card| is deletable. Fills out @@ -132,9 +126,6 @@ // Returns false only if some form of authentication is still in progress. bool ShouldClearPreviewedForm(); - // Retrieves instance of CreditCard with given guid. - CreditCard* GetCreditCard(std::string guid); - // Makes a call to Google Payments to retrieve authentication details. void PrepareToFetchCreditCard(); @@ -247,9 +238,6 @@ // Returns whether or not unmasked card cache is empty. Exposed for testing. bool UnmaskedCardCacheIsEmpty(); - // Returns false if all suggested cards are local cards, otherwise true. - bool ServerCardsAvailable(); - // Invoked from CreditCardFIDOAuthenticator::IsUserVerifiable(). // |is_user_verifiable| is set to true only if user has a verifying platform // authenticator. e.g. Touch/Face ID, Windows Hello, Android fingerprint,
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc index 12c5ed8..d696323 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc +++ b/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc
@@ -440,8 +440,7 @@ features::kAutofillCreditCardAuthentication}, {}); CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false, kTestServerId); - CreditCard* virtual_card = - credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* virtual_card = personal_data().GetCreditCardByGUID(kTestGUID); virtual_card->set_record_type(CreditCard::VIRTUAL_CARD); #if !BUILDFLAG(IS_IOS) @@ -540,24 +539,10 @@ #endif }; -// Ensures GetCreditCard() successfully retrieves Card. -TEST_F(CreditCardAccessManagerTest, GetCreditCardSuccess) { - CreateLocalCard(kTestGUID); - - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); - EXPECT_NE(card, nullptr); -} - -// Ensures GetCreditCard() returns nullptr for invalid GUID. -TEST_F(CreditCardAccessManagerTest, GetCreditCardFailure) { - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); - EXPECT_EQ(card, nullptr); -} - // Ensures DeleteCard() successfully removes local cards. TEST_F(CreditCardAccessManagerTest, RemoveLocalCreditCard) { CreateLocalCard(kTestGUID); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); EXPECT_TRUE(personal_data().GetCreditCardWithGUID(kTestGUID)); EXPECT_TRUE(credit_card_access_manager_->DeleteCard(card)); @@ -567,7 +552,7 @@ // Ensures DeleteCard() does nothing for server cards. TEST_F(CreditCardAccessManagerTest, RemoveServerCreditCard) { CreateServerCard(kTestGUID); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); EXPECT_TRUE(personal_data().GetCreditCardWithGUID(kTestGUID)); EXPECT_FALSE(credit_card_access_manager_->DeleteCard(card)); @@ -580,7 +565,7 @@ // cards. TEST_F(CreditCardAccessManagerTest, LocalCardGetDeletionConfirmationText) { CreateLocalCard(kTestGUID); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); std::u16string title = std::u16string(); std::u16string body = std::u16string(); @@ -597,7 +582,7 @@ // Ensures GetDeletionConfirmationText(~) returns false for server cards. TEST_F(CreditCardAccessManagerTest, ServerCardGetDeletionConfirmationText) { CreateServerCard(kTestGUID); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); std::u16string title = std::u16string(); std::u16string body = std::u16string(); @@ -612,7 +597,7 @@ // Tests retrieving local cards. TEST_F(CreditCardAccessManagerTest, FetchLocalCardSuccess) { CreateLocalCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); credit_card_access_manager_->PrepareToFetchCreditCard(); WaitForCallbacks(); @@ -639,7 +624,7 @@ // response from payments. TEST_F(CreditCardAccessManagerTest, FetchServerCardCVCSuccess) { CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); base::HistogramTester histogram_tester; std::string flow_events_histogram_name = "Autofill.BetterAuth.FlowEvents.Cvc"; @@ -666,7 +651,7 @@ // from the server. TEST_F(CreditCardAccessManagerTest, FetchServerCardCVCNetworkError) { CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); credit_card_access_manager_->PrepareToFetchCreditCard(); WaitForCallbacks(); @@ -682,7 +667,7 @@ // from the server. TEST_F(CreditCardAccessManagerTest, FetchServerCardCVCPermanentFailure) { CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); credit_card_access_manager_->PrepareToFetchCreditCard(); WaitForCallbacks(); @@ -697,7 +682,7 @@ // Ensures that a "try again" response from payments does not end the flow. TEST_F(CreditCardAccessManagerTest, FetchServerCardCVCTryAgainFailure) { CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); credit_card_access_manager_->FetchCreditCard(card, accessor_->GetWeakPtr()); @@ -808,7 +793,7 @@ "Autofill.BetterAuth.FlowEvents.Fido"; CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(true); payments_client_->AddFidoEligibleCard(card->server_id(), kCredentialId, @@ -864,7 +849,7 @@ // General setup. CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); payments_client_->AddFidoEligibleCard(card->server_id(), kCredentialId, kGooglePaymentsRpid); @@ -901,7 +886,7 @@ "Autofill.BetterAuth.FlowEvents.CvcFallbackFromFido"; CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(true); payments_client_->AddFidoEligibleCard(card->server_id(), kCredentialId, @@ -959,7 +944,7 @@ "Autofill.BetterAuth.WebauthnResult.ImmediateAuthentication"; CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(true); payments_client_->AddFidoEligibleCard(card->server_id(), kCredentialId, @@ -1002,7 +987,7 @@ TEST_F(CreditCardAccessManagerTest, FetchServerCardBadRequestOptionsCVCFallback) { CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(true); // Don't set Credential ID. @@ -1032,7 +1017,7 @@ // Payments times out. TEST_F(CreditCardAccessManagerTest, FetchServerCardFIDOTimeoutCVCFallback) { CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(true); @@ -1056,7 +1041,7 @@ {features::kAutofillEnableVirtualCardsRiskBasedAuthentication}); base::HistogramTester histogram_tester; CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetCreditCardFIDOAuthEnabled(true); payments_client_->AddFidoEligibleCard(card->server_id(), kCredentialId, @@ -1102,10 +1087,8 @@ std::string local_guid = "00000000-0000-0000-0000-000000000003"; CreateServerCard(server_guid, "4594299181086168"); CreateLocalCard(local_guid, "4409763681177079"); - CreditCard* server_card = - credit_card_access_manager_->GetCreditCard(server_guid); - CreditCard* local_card = - credit_card_access_manager_->GetCreditCard(local_guid); + CreditCard* server_card = personal_data().GetCreditCardByGUID(server_guid); + CreditCard* local_card = personal_data().GetCreditCardByGUID(local_guid); GetFIDOAuthenticator()->SetUserVerifiable(true); for (bool user_is_opted_in : {true, false}) { @@ -1189,8 +1172,7 @@ // Setting up a FIDO-enabled user with a local card and a server card. std::string server_guid = "00000000-0000-0000-0000-000000000001"; CreateServerCard(server_guid, "4594299181086168"); - CreditCard* server_card = - credit_card_access_manager_->GetCreditCard(server_guid); + CreditCard* server_card = personal_data().GetCreditCardByGUID(server_guid); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(true); payments_client_->ShouldReturnUnmaskDetailsImmediately(false); @@ -1265,7 +1247,7 @@ "Autofill.BetterAuth.FlowEvents.CvcThenFido"; CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); // Opt the user in, but don't include the card above. std::string other_server_id = "00000000-0000-0000-0000-000000000034"; // Add other FIDO eligible card, it will return RequestOptions in unmask @@ -1324,7 +1306,7 @@ // Creating an expired server card and opting the user in with authorized // card. CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); card->SetExpirationYearFromString(u"2010"); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(true); @@ -1349,7 +1331,7 @@ TEST_F(CreditCardAccessManagerTest, UnmaskAuthFlowEvent_AlsoLogsServerCardSubhistogram) { CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); base::HistogramTester histogram_tester; std::string flow_events_histogram_name = "Autofill.BetterAuth.FlowEvents.Cvc.ServerCard"; @@ -1380,7 +1362,7 @@ "Autofill.BetterAuth.WebauthnResult.CheckoutOptIn"; CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(false); @@ -1432,7 +1414,7 @@ "Autofill.BetterAuth.WebauthnResult.CheckoutOptIn"; CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(false); @@ -1473,7 +1455,7 @@ // Ensures that enrollment does not happen if the server returns a failure. TEST_F(CreditCardAccessManagerTest, FIDOOptInServerFailure) { CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(false); @@ -1511,7 +1493,7 @@ // checkbox. TEST_F(CreditCardAccessManagerTest, FIDOOptIn_CheckboxDeclined) { CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(false); @@ -1539,7 +1521,7 @@ // opt-in request the next time the user downstreams a card. TEST_F(CreditCardAccessManagerTest, FIDOSettingsPageOptInSuccess_Android) { CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); // Setting the local opt-in state as true and implying that Payments servers @@ -1581,7 +1563,7 @@ ClearStrikes(); CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(false); payments_client_->AllowFidoRegistration(true); @@ -1640,7 +1622,7 @@ ClearStrikes(); CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(false); payments_client_->AllowFidoRegistration(true); @@ -1677,7 +1659,7 @@ ClearStrikes(); CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(false); payments_client_->AllowFidoRegistration(true); @@ -1715,7 +1697,7 @@ ClearStrikes(); CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(false); payments_client_->AllowFidoRegistration(true); @@ -1762,7 +1744,7 @@ "Autofill.BetterAuth.OptInCalled.FromCheckoutFlow"; CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(false); payments_client_->AllowFidoRegistration(true); @@ -1882,7 +1864,7 @@ base::HistogramTester histogram_tester; // Setting up a FIDO-enabled user with a server card. CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); // The user is FIDO-enabled from Payments. GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(true); @@ -1927,7 +1909,7 @@ TEST_F(CreditCardAccessManagerTest, IntentToOptOut_OptOutAfterUnmaskSucceeds) { // Setting up a FIDO-enabled user with a server card. CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); // The user is FIDO-enabled from Payments. GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(true); @@ -1963,7 +1945,7 @@ TEST_F(CreditCardAccessManagerTest, IntentToOptOut_OptOutAfterUnmaskFails) { // Setting up a FIDO-enabled user with a server card. CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); // The user is FIDO-enabled from Payments. GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(true); @@ -1998,7 +1980,7 @@ TEST_F(CreditCardAccessManagerTest, IntentToOptOut_OptOutFailure) { // Setting up a FIDO-enabled user with a server card. CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); // The user is FIDO-enabled from Payments. GetFIDOAuthenticator()->SetUserVerifiable(true); SetUserOptedIn(true); @@ -2072,7 +2054,7 @@ // Ensures that |is_authentication_in_progress_| is set correctly. TEST_F(CreditCardAccessManagerTest, AuthenticationInProgress) { CreateServerCard(kTestGUID, kTestNumber); - CreditCard* card = credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); EXPECT_FALSE(IsAuthenticationInProgress()); @@ -2088,14 +2070,12 @@ TEST_F(CreditCardAccessManagerTest, FetchCreditCardUsesUnmaskedCardCache) { base::HistogramTester histogram_tester; CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false); - CreditCard* unmasked_card = - credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* unmasked_card = personal_data().GetCreditCardByGUID(kTestGUID); credit_card_access_manager_->CacheUnmaskedCardInfo(*unmasked_card, kTestCvc16); CreateServerCard(kTestGUID, kTestNumber, /*masked=*/true); - CreditCard* masked_card = - credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* masked_card = personal_data().GetCreditCardByGUID(kTestGUID); credit_card_access_manager_->FetchCreditCard(masked_card, accessor_->GetWeakPtr()); @@ -2127,8 +2107,7 @@ CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false, kTestServerId); CreateServerCard(kTestGUID2, kTestNumber2, /*masked=*/true, kTestServerId2); // Add a card to the cache. - CreditCard* unmasked_card = - credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* unmasked_card = personal_data().GetCreditCardByGUID(kTestGUID); credit_card_access_manager_->CacheUnmaskedCardInfo(*unmasked_card, kTestCvc16); @@ -2142,8 +2121,7 @@ CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false, kTestServerId); CreateServerCard(kTestGUID2, kTestNumber2, /*masked=*/true, kTestServerId2); // Add a card to the cache. - CreditCard* unmasked_card = - credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* unmasked_card = personal_data().GetCreditCardByGUID(kTestGUID); credit_card_access_manager_->CacheUnmaskedCardInfo(*unmasked_card, kTestCvc16); @@ -2151,13 +2129,12 @@ EXPECT_TRUE(credit_card_access_manager_->IsCardPresentInUnmaskedCache( *unmasked_card)); EXPECT_FALSE(credit_card_access_manager_->IsCardPresentInUnmaskedCache( - *credit_card_access_manager_->GetCreditCard(kTestGUID2))); + *personal_data().GetCreditCardByGUID(kTestGUID2))); } TEST_F(CreditCardAccessManagerTest, IsVirtualCardPresentInUnmaskedCache) { CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false, kTestServerId); - CreditCard* unmasked_card = - credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* unmasked_card = personal_data().GetCreditCardByGUID(kTestGUID); unmasked_card->set_record_type(CreditCard::VIRTUAL_CARD); // Add the virtual card to the cache. @@ -2175,8 +2152,7 @@ scoped_feature_list_.InitAndEnableFeature( features::kAutofillEnableVirtualCardsRiskBasedAuthentication); CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false, kTestServerId); - CreditCard* virtual_card = - credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* virtual_card = personal_data().GetCreditCardByGUID(kTestGUID); virtual_card->set_record_type(CreditCard::VIRTUAL_CARD); credit_card_access_manager_->FetchCreditCard(virtual_card, @@ -2252,8 +2228,7 @@ features::kAutofillCreditCardAuthentication}, {}); CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false, kTestServerId); - CreditCard* virtual_card = - credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* virtual_card = personal_data().GetCreditCardByGUID(kTestGUID); virtual_card->set_record_type(CreditCard::VIRTUAL_CARD); // TODO(crbug.com/1249665): Switch to SetUserVerifiable after moving all // is_user_veriable_ related logic from CreditCardAccessManager to @@ -2315,8 +2290,7 @@ features::kAutofillCreditCardAuthentication}, {}); CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false, kTestServerId); - CreditCard* virtual_card = - credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* virtual_card = personal_data().GetCreditCardByGUID(kTestGUID); virtual_card->set_record_type(CreditCard::VIRTUAL_CARD); // TODO(crbug.com/1249665): Switch to SetUserVerifiable after moving all // is_user_veriable_ related logic from CreditCardAccessManager to @@ -2440,8 +2414,7 @@ features::kAutofillCreditCardAuthentication}, {}); CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false, kTestServerId); - CreditCard* virtual_card = - credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* virtual_card = personal_data().GetCreditCardByGUID(kTestGUID); virtual_card->set_record_type(CreditCard::VIRTUAL_CARD); // TODO(crbug.com/1249665): Switch to SetUserVerifiable after moving all // is_user_veriable_ related logic from CreditCardAccessManager to @@ -2492,8 +2465,7 @@ features::kAutofillCreditCardAuthentication}, {}); CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false, kTestServerId); - CreditCard* virtual_card = - credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* virtual_card = personal_data().GetCreditCardByGUID(kTestGUID); virtual_card->set_record_type(CreditCard::VIRTUAL_CARD); // TODO(crbug.com/1249665): Switch to SetUserVerifiable after moving all // |is_user_verifiable_| related logic from CreditCardAccessManager to @@ -2544,8 +2516,7 @@ features::kAutofillCreditCardAuthentication}, {}); CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false, kTestServerId); - CreditCard* virtual_card = - credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* virtual_card = personal_data().GetCreditCardByGUID(kTestGUID); virtual_card->set_record_type(CreditCard::VIRTUAL_CARD); // TODO(crbug.com/1249665): Switch to SetUserVerifiable after moving all // is_user_veriable_ related logic from CreditCardAccessManager to @@ -2594,8 +2565,7 @@ features::kAutofillCreditCardAuthentication}, {}); CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false, kTestServerId); - CreditCard* virtual_card = - credit_card_access_manager_->GetCreditCard(kTestGUID); + CreditCard* virtual_card = personal_data().GetCreditCardByGUID(kTestGUID); virtual_card->set_record_type(CreditCard::VIRTUAL_CARD); // TODO(crbug.com/1249665): Switch to SetUserVerifiable after moving all // is_user_veriable_ related logic from CreditCardAccessManager to
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc index 01b4b4b3..1bf575f 100644 --- a/components/autofill/core/browser/personal_data_manager.cc +++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -18,6 +18,7 @@ #include "base/containers/contains.h" #include "base/containers/cxx20_erase.h" #include "base/feature_list.h" +#include "base/guid.h" #include "base/i18n/case_conversion.h" #include "base/i18n/timezone.h" #include "base/logging.h" @@ -1895,13 +1896,13 @@ const std::vector<AutofillProfile*>& profiles = GetProfiles(); const std::vector<std::string>& country_codes = CountryDataMap::GetInstance()->country_codes(); - for (size_t i = 0; i < profiles.size(); ++i) { + for (auto* profile : profiles) { std::string country_code = base::ToUpperASCII( - base::UTF16ToASCII(profiles[i]->GetRawInfo(ADDRESS_HOME_COUNTRY))); + base::UTF16ToASCII(profile->GetRawInfo(ADDRESS_HOME_COUNTRY))); if (base::Contains(country_codes, country_code)) { // Verified profiles count 100x more than unverified ones. - votes[country_code] += profiles[i]->IsVerified() ? 100 : 1; + votes[country_code] += profile->IsVerified() ? 100 : 1; } }
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc index 092f846..ce8a8fc4 100644 --- a/components/autofill/core/common/autofill_payments_features.cc +++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -165,6 +165,12 @@ const base::Feature kAutofillSaveCardDismissOnNavigation{ "AutofillSaveCardDismissOnNavigation", base::FEATURE_ENABLED_BY_DEFAULT}; +// When enabled, the expiration date of the card will not be shown in the +// Autofill Suggestions. +const base::Feature kAutofillRemoveCardExpiryFromDownstreamSuggestion{ + "AutofillRemoveCardExpiryFromDownstreamSuggestion", + base::FEATURE_DISABLED_BY_DEFAULT}; + // When enabled, the Save Card infobar supports editing before submitting. const base::Feature kAutofillSaveCardInfobarEditSupport{ "AutofillSaveCardInfobarEditSupport", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/components/autofill/core/common/autofill_payments_features.h b/components/autofill/core/common/autofill_payments_features.h index 86548a9..78c37324 100644 --- a/components/autofill/core/common/autofill_payments_features.h +++ b/components/autofill/core/common/autofill_payments_features.h
@@ -41,6 +41,7 @@ extern const base::FeatureParam<int> kAutofillImageFetcherDiskCacheExpirationInMinutes; extern const base::Feature kAutofillParseMerchantPromoCodeFields; +extern const base::Feature kAutofillRemoveCardExpiryFromDownstreamSuggestion; extern const base::Feature kAutofillSaveCardDismissOnNavigation; extern const base::Feature kAutofillSaveCardInfobarEditSupport; extern const base::Feature kAutofillSaveCardUiExperiment;
diff --git a/components/autofill_assistant/browser/android/client_android.cc b/components/autofill_assistant/browser/android/client_android.cc index 3157c71..af6e66a 100644 --- a/components/autofill_assistant/browser/android/client_android.cc +++ b/components/autofill_assistant/browser/android/client_android.cc
@@ -537,7 +537,8 @@ } autofill::PersonalDataManager* ClientAndroid::GetPersonalDataManager() const { - return dependencies_->GetCommonDependencies()->GetPersonalDataManager(); + return dependencies_->GetCommonDependencies()->GetPersonalDataManager( + GetWebContents()->GetBrowserContext()); } WebsiteLoginManager* ClientAndroid::GetWebsiteLoginManager() const {
diff --git a/components/autofill_assistant/browser/common_dependencies.h b/components/autofill_assistant/browser/common_dependencies.h index c18dfe4..71423d3 100644 --- a/components/autofill_assistant/browser/common_dependencies.h +++ b/components/autofill_assistant/browser/common_dependencies.h
@@ -49,7 +49,8 @@ virtual std::string GetCountryCode() const = 0; - virtual autofill::PersonalDataManager* GetPersonalDataManager() const = 0; + virtual autofill::PersonalDataManager* GetPersonalDataManager( + content::BrowserContext* browser_context) const = 0; virtual password_manager::PasswordManagerClient* GetPasswordManagerClient( content::WebContents* web_contents) const = 0;
diff --git a/components/autofill_assistant/browser/headless/client_headless.cc b/components/autofill_assistant/browser/headless/client_headless.cc index 7ec3d04..5766cf9 100644 --- a/components/autofill_assistant/browser/headless/client_headless.cc +++ b/components/autofill_assistant/browser/headless/client_headless.cc
@@ -117,7 +117,8 @@ } autofill::PersonalDataManager* ClientHeadless::GetPersonalDataManager() const { - return common_dependencies_->GetPersonalDataManager(); + return common_dependencies_->GetPersonalDataManager( + GetWebContents()->GetBrowserContext()); } WebsiteLoginManager* ClientHeadless::GetWebsiteLoginManager() const {
diff --git a/components/autofill_assistant/browser/mock_common_dependencies.h b/components/autofill_assistant/browser/mock_common_dependencies.h index e0c59d58..6a6f8531 100644 --- a/components/autofill_assistant/browser/mock_common_dependencies.h +++ b/components/autofill_assistant/browser/mock_common_dependencies.h
@@ -24,7 +24,7 @@ MOCK_METHOD(std::string, GetCountryCode, (), (const override)); MOCK_METHOD(autofill::PersonalDataManager*, GetPersonalDataManager, - (), + (content::BrowserContext*), (const override)); MOCK_METHOD(password_manager::PasswordManagerClient*, GetPasswordManagerClient,
diff --git a/components/browser_sync/signin_confirmation_helper.cc b/components/browser_sync/signin_confirmation_helper.cc index 0d861900..62cf4a44 100644 --- a/components/browser_sync/signin_confirmation_helper.cc +++ b/components/browser_sync/signin_confirmation_helper.cc
@@ -26,8 +26,8 @@ class HasTypedURLsTask : public history::HistoryDBTask { public: explicit HasTypedURLsTask(base::OnceCallback<void(bool)> cb) - : has_typed_urls_(false), cb_(std::move(cb)) {} - ~HasTypedURLsTask() override {} + : cb_(std::move(cb)) {} + ~HasTypedURLsTask() override = default; bool RunOnDBThread(history::HistoryBackend* backend, history::HistoryDatabase* db) override { @@ -44,7 +44,7 @@ void DoneRunOnMainThread() override { std::move(cb_).Run(has_typed_urls_); } private: - bool has_typed_urls_; + bool has_typed_urls_ = false; base::OnceCallback<void(bool)> cb_; };
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 9eb3ea9..b141f34 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "9.11", - "log_list_timestamp": "2022-05-13T12:55:36Z", + "version": "9.13", + "log_list_timestamp": "2022-05-15T12:54:42Z", "operators": [ { "name": "Google",
diff --git a/components/content_settings/core/browser/website_settings_registry.cc b/components/content_settings/core/browser/website_settings_registry.cc index 0b9a5d9..c2b56b3 100644 --- a/components/content_settings/core/browser/website_settings_registry.cc +++ b/components/content_settings/core/browser/website_settings_registry.cc
@@ -238,8 +238,7 @@ Register(ContentSettingsType::HTTP_ALLOWED, "http-allowed", base::Value(), WebsiteSettingsInfo::UNSYNCABLE, WebsiteSettingsInfo::NOT_LOSSY, WebsiteSettingsInfo::SINGLE_ORIGIN_WITH_EMBEDDED_EXCEPTIONS_SCOPE, - DESKTOP | PLATFORM_ANDROID, - WebsiteSettingsInfo::INHERIT_IN_INCOGNITO); + ALL_PLATFORMS, WebsiteSettingsInfo::INHERIT_IN_INCOGNITO); Register(ContentSettingsType::FORMFILL_METADATA, "formfill-metadata", base::Value(), WebsiteSettingsInfo::UNSYNCABLE, WebsiteSettingsInfo::LOSSY,
diff --git a/components/exo/client_controlled_shell_surface.cc b/components/exo/client_controlled_shell_surface.cc index 1d68a81..02a9efdf 100644 --- a/components/exo/client_controlled_shell_surface.cc +++ b/components/exo/client_controlled_shell_surface.cc
@@ -166,17 +166,13 @@ switch (window_state->GetStateType()) { case chromeos::WindowStateType::kDefault: case chromeos::WindowStateType::kNormal: - window->SetProperty(aura::client::kPreFullscreenShowStateKey, - ui::SHOW_STATE_NORMAL); next_state = chromeos::WindowStateType::kFullscreen; break; case chromeos::WindowStateType::kMaximized: - window->SetProperty(aura::client::kPreFullscreenShowStateKey, - ui::SHOW_STATE_MAXIMIZED); next_state = chromeos::WindowStateType::kFullscreen; break; case chromeos::WindowStateType::kFullscreen: - switch (window->GetProperty(aura::client::kPreFullscreenShowStateKey)) { + switch (window->GetProperty(aura::client::kRestoreShowStateKey)) { case ui::SHOW_STATE_DEFAULT: case ui::SHOW_STATE_NORMAL: next_state = chromeos::WindowStateType::kNormal; @@ -192,17 +188,11 @@ case ui::SHOW_STATE_END: NOTREACHED() << " unknown state :" << window->GetProperty( - aura::client::kPreFullscreenShowStateKey); + aura::client::kRestoreShowStateKey); return false; } break; case chromeos::WindowStateType::kMinimized: { - ui::WindowShowState pre_full_state = - window->GetProperty(aura::client::kPreMinimizedShowStateKey); - if (pre_full_state != ui::SHOW_STATE_FULLSCREEN) { - window->SetProperty(aura::client::kPreFullscreenShowStateKey, - pre_full_state); - } next_state = chromeos::WindowStateType::kFullscreen; break; }
diff --git a/components/history/core/browser/BUILD.gn b/components/history/core/browser/BUILD.gn index b715808bb..2d397284 100644 --- a/components/history/core/browser/BUILD.gn +++ b/components/history/core/browser/BUILD.gn
@@ -187,6 +187,7 @@ "//components/test/data/history/history.50.sql", "//components/test/data/history/history.52.sql", "//components/test/data/history/history.53.sql", + "//components/test/data/history/history.54.sql", "//components/test/data/history/thumbnail_wild/Favicons.corrupt_meta.disable", "//components/test/data/history/thumbnail_wild/Favicons.v2.init.sql", "//components/test/data/history/thumbnail_wild/Favicons.v3.init.sql",
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc index 82edfc5..a59ffcfa 100644 --- a/components/history/core/browser/history_backend.cc +++ b/components/history/core/browser/history_backend.cc
@@ -593,6 +593,29 @@ } } +void HistoryBackend::AddPageMetadataForVisit( + VisitID visit_id, + const std::string& alternative_title) { + TRACE_EVENT0("browser", "HistoryBackend::AddPageMetadataForVisit"); + + if (!db_) + return; + // Only add to the annotations table if the visit_id exists in the visits + // table. + VisitRow visit_row; + if (db_->GetRowForVisit(visit_id, &visit_row)) { + VisitContentAnnotations annotations; + if (db_->GetContentAnnotationsForVisit(visit_id, &annotations)) { + annotations.alternative_title = alternative_title; + db_->UpdateContentAnnotationsForVisit(visit_id, annotations); + } else { + annotations.alternative_title = alternative_title; + db_->AddContentAnnotationsForVisit(visit_id, annotations); + } + ScheduleCommit(); + } +} + void HistoryBackend::UpdateVisitDuration(VisitID visit_id, const Time end_ts) { if (!db_) return;
diff --git a/components/history/core/browser/history_backend.h b/components/history/core/browser/history_backend.h index bde4d7c5..e2558a8 100644 --- a/components/history/core/browser/history_backend.h +++ b/components/history/core/browser/history_backend.h
@@ -265,6 +265,8 @@ void AddSearchMetadataForVisit(VisitID visit_id, const GURL& search_normalized_url, const std::u16string& search_terms); + void AddPageMetadataForVisit(VisitID visit_id, + const std::string& alternative_title); // Querying ------------------------------------------------------------------
diff --git a/components/history/core/browser/history_backend_db_unittest.cc b/components/history/core/browser/history_backend_db_unittest.cc index 2aac0c1..58d0f43 100644 --- a/components/history/core/browser/history_backend_db_unittest.cc +++ b/components/history/core/browser/history_backend_db_unittest.cc
@@ -2589,6 +2589,50 @@ EXPECT_TRUE(visit_content_annotations.search_terms.empty()); } } +TEST_F(HistoryBackendDBTest, MigrateContentAnnotationsAddPageMetadataColumns) { + ASSERT_NO_FATAL_FAILURE(CreateDBVersion(53)); + + const VisitID visit_id1 = 1; + + // Open the db for manual manipulation. + sql::Database db; + ASSERT_TRUE(db.Open(history_dir_.Append(kHistoryFilename))); + + const char kInsertContentAnnotationsStatement[] = + "INSERT INTO content_annotations " + "(visit_id, floc_protected_score, categories, page_topics_model_version, " + "annotation_flags, entities, related_searches, search_normalized_url, " + "search_terms) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + // Add an entry to "content_annotations" table. + { + sql::Statement s(db.GetUniqueStatement(kInsertContentAnnotationsStatement)); + s.BindInt64(0, visit_id1); + s.BindDouble(1, -1); + s.BindString(2, ""); + s.BindInt64(3, -1); + s.BindInt64(4, 0); + s.BindString(5, ""); + s.BindString(6, ""); + s.BindString(7, ""); + s.BindString(8, ""); + ASSERT_TRUE(s.Run()); + } + + // Re-open the db, triggering migration. + CreateBackendAndDatabase(); + + // The version should have been updated. + ASSERT_GE(HistoryDatabase::GetCurrentVersion(), 54); + + // After the migration, the page metadata should be empty. + { + VisitContentAnnotations visit_content_annotations; + db_->GetContentAnnotationsForVisit(visit_id1, &visit_content_annotations); + EXPECT_TRUE(visit_content_annotations.alternative_title.empty()); + } +} bool FilterURL(const GURL& url) { return url.SchemeIsHTTPOrHTTPS();
diff --git a/components/history/core/browser/history_backend_unittest.cc b/components/history/core/browser/history_backend_unittest.cc index d655b2e4..8f15ddfa 100644 --- a/components/history/core/browser/history_backend_unittest.cc +++ b/components/history/core/browser/history_backend_unittest.cc
@@ -2030,6 +2030,66 @@ visit_id, &got_content_annotations)); } +TEST_F(HistoryBackendTest, AddPageMetadata) { + ASSERT_TRUE(backend_.get()); + + GURL url("http://pagewithvisit.com"); + ContextID context_id = reinterpret_cast<ContextID>(1); + int nav_entry_id = 1; + + HistoryAddPageArgs request(url, base::Time::Now(), context_id, nav_entry_id, + GURL(), RedirectList(), ui::PAGE_TRANSITION_TYPED, + false, SOURCE_BROWSED, false, true, false); + backend_->AddPage(request); + + VisitVector visits; + URLRow row; + URLID id = backend_->db()->GetRowForURL(url, &row); + ASSERT_TRUE(backend_->db()->GetVisitsForURL(id, &visits)); + ASSERT_EQ(1U, visits.size()); + VisitID visit_id = visits[0].visit_id; + + backend_->AddPageMetadataForVisit(visit_id, "alternative title"); + + VisitContentAnnotations got_content_annotations; + ASSERT_TRUE(backend_->db()->GetContentAnnotationsForVisit( + visit_id, &got_content_annotations)); + + EXPECT_EQ(VisitContentAnnotationFlag::kNone, + got_content_annotations.annotation_flags); + EXPECT_EQ(-1.0f, got_content_annotations.model_annotations.visibility_score); + ASSERT_TRUE(got_content_annotations.model_annotations.categories.empty()); + EXPECT_EQ( + -1, got_content_annotations.model_annotations.page_topics_model_version); + ASSERT_TRUE(got_content_annotations.model_annotations.entities.empty()); + ASSERT_TRUE(got_content_annotations.related_searches.empty()); + ASSERT_TRUE(got_content_annotations.search_normalized_url.is_empty()); + ASSERT_TRUE(got_content_annotations.search_terms.empty()); + EXPECT_EQ(got_content_annotations.alternative_title, "alternative title"); + + QueryOptions options; + options.duplicate_policy = QueryOptions::KEEP_ALL_DUPLICATES; + QueryResults results = backend_->QueryHistory(/*text_query=*/{}, options); + + ASSERT_EQ(results.size(), 1u); + EXPECT_EQ(VisitContentAnnotationFlag::kNone, + results[0].content_annotations().annotation_flags); + EXPECT_EQ(VisitContentAnnotationFlag::kNone, + got_content_annotations.annotation_flags); + EXPECT_EQ(-1.0f, got_content_annotations.model_annotations.visibility_score); + ASSERT_TRUE(got_content_annotations.model_annotations.categories.empty()); + EXPECT_EQ( + -1, got_content_annotations.model_annotations.page_topics_model_version); + ASSERT_TRUE(got_content_annotations.model_annotations.entities.empty()); + ASSERT_TRUE(got_content_annotations.related_searches.empty()); + EXPECT_EQ(got_content_annotations.alternative_title, "alternative title"); + + // Now, delete the URL. Content Annotations should be deleted. + backend_->DeleteURL(url); + ASSERT_FALSE(backend_->db()->GetContentAnnotationsForVisit( + visit_id, &got_content_annotations)); +} + TEST_F(HistoryBackendTest, MixedContentAnnotationsRequestTypes) { ASSERT_TRUE(backend_.get());
diff --git a/components/history/core/browser/history_database.cc b/components/history/core/browser/history_database.cc index 5ff83d2..37dd8ee 100644 --- a/components/history/core/browser/history_database.cc +++ b/components/history/core/browser/history_database.cc
@@ -38,7 +38,7 @@ // Current version number. We write databases at the "current" version number, // but any previous version that can read the "compatible" one can make do with // our database without *too* many bad effects. -const int kCurrentVersionNumber = 53; +const int kCurrentVersionNumber = 54; const int kCompatibleVersionNumber = 16; const char kEarlyExpirationThresholdKey[] = "early_expiration_threshold"; @@ -681,6 +681,13 @@ meta_table_.SetVersionNumber(cur_version); } + if (cur_version == 53) { + if (!MigrateContentAnnotationsAddAlternativeTitle()) + return LogMigrationFailure(53); + cur_version++; + meta_table_.SetVersionNumber(cur_version); + } + // ========================= ^^ new migration code goes here ^^ // ADDING NEW MIGRATION CODE // =========================
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc index fa1509f..0028edd 100644 --- a/components/history/core/browser/history_service.cc +++ b/components/history/core/browser/history_service.cc
@@ -518,6 +518,17 @@ search_terms)); } +void HistoryService::AddPageMetadataForVisit( + const std::string& alternative_title, + VisitID visit_id) { + TRACE_EVENT0("browser", "HistoryService::AddPageMetadataForVisit"); + DCHECK(backend_task_runner_) << "History service being called after cleanup"; + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + ScheduleTask(PRIORITY_NORMAL, + base::BindOnce(&HistoryBackend::AddPageMetadataForVisit, + history_backend_, visit_id, alternative_title)); +} + void HistoryService::AddPageWithDetails(const GURL& url, const std::u16string& title, int visit_count,
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h index 0f3f7c0..a290e89c6f 100644 --- a/components/history/core/browser/history_service.h +++ b/components/history/core/browser/history_service.h
@@ -245,6 +245,10 @@ const std::u16string& search_terms, VisitID visit_id); + // Updates the history database with additional page metadata. + void AddPageMetadataForVisit(const std::string& alternative_title, + VisitID visit_id); + // Querying ------------------------------------------------------------------ // Returns the information about the requested URL. If the URL is found,
diff --git a/components/history/core/browser/sync/delete_directive_handler.cc b/components/history/core/browser/sync/delete_directive_handler.cc index b804386..a1a920a3 100644 --- a/components/history/core/browser/sync/delete_directive_handler.cc +++ b/components/history/core/browser/sync/delete_directive_handler.cc
@@ -143,7 +143,7 @@ delete_directives_(delete_directive), post_processing_action_(post_processing_action) {} - ~DeleteDirectiveTask() override {} + ~DeleteDirectiveTask() override = default; // Implements HistoryDBTask. bool RunOnDBThread(HistoryBackend* backend, HistoryDatabase* db) override; @@ -220,15 +220,13 @@ typedef std::map<std::pair<base::Time, base::Time>, std::set<base::Time>> GlobalIdTimesGroup; GlobalIdTimesGroup id_times_group; - for (size_t i = 0; i < global_id_directives.size(); ++i) { + for (const syncer::SyncData& global_id_directive : global_id_directives) { DVLOG(1) << "Processing delete directive: " - << DeleteDirectiveToString(global_id_directives[i] - .GetSpecifics() + << DeleteDirectiveToString(global_id_directive.GetSpecifics() .history_delete_directive()); const sync_pb::GlobalIdDirective& id_directive = - global_id_directives[i] - .GetSpecifics() + global_id_directive.GetSpecifics() .history_delete_directive() .global_id_directive(); if (id_directive.global_id_size() == 0 || @@ -267,9 +265,9 @@ // time range for multiple directives whose time ranges overlap. base::Time current_start_time; base::Time current_end_time; - for (size_t i = 0; i < time_range_directives.size(); ++i) { + for (const syncer::SyncData& data : time_range_directives) { const sync_pb::HistoryDeleteDirectiveSpecifics& delete_directive = - time_range_directives[i].GetSpecifics().history_delete_directive(); + data.GetSpecifics().history_delete_directive(); DVLOG(1) << "Processing time range directive: " << DeleteDirectiveToString(delete_directive); @@ -338,7 +336,7 @@ BackendTaskScheduler backend_task_scheduler) : backend_task_scheduler_(std::move(backend_task_scheduler)) {} -DeleteDirectiveHandler::~DeleteDirectiveHandler() {} +DeleteDirectiveHandler::~DeleteDirectiveHandler() = default; void DeleteDirectiveHandler::OnBackendLoaded() { backend_loaded_ = true; @@ -460,10 +458,10 @@ } syncer::SyncDataList delete_directives; - for (auto it = change_list.begin(); it != change_list.end(); ++it) { - switch (it->change_type()) { + for (const syncer::SyncChange& sync_change : change_list) { + switch (sync_change.change_type()) { case syncer::SyncChange::ACTION_ADD: - delete_directives.push_back(it->sync_data()); + delete_directives.push_back(sync_change.sync_data()); break; case syncer::SyncChange::ACTION_DELETE: // TODO(akalin): Keep track of existing delete directives. @@ -498,9 +496,9 @@ if (sync_processor_.get() && post_processing_action == DROP_AFTER_PROCESSING) { syncer::SyncChangeList change_list; - for (size_t i = 0; i < delete_directives.size(); ++i) { + for (const syncer::SyncData& delete_directive : delete_directives) { change_list.push_back(syncer::SyncChange( - FROM_HERE, syncer::SyncChange::ACTION_DELETE, delete_directives[i])); + FROM_HERE, syncer::SyncChange::ACTION_DELETE, delete_directive)); } sync_processor_->ProcessSyncChanges(FROM_HERE, change_list); }
diff --git a/components/history/core/browser/sync/delete_directive_handler_unittest.cc b/components/history/core/browser/sync/delete_directive_handler_unittest.cc index 069dd2f2..c90bb02 100644 --- a/components/history/core/browser/sync/delete_directive_handler_unittest.cc +++ b/components/history/core/browser/sync/delete_directive_handler_unittest.cc
@@ -38,7 +38,7 @@ class TestHistoryBackendDelegate : public HistoryBackend::Delegate { public: - TestHistoryBackendDelegate() {} + TestHistoryBackendDelegate() = default; TestHistoryBackendDelegate(const TestHistoryBackendDelegate&) = delete; TestHistoryBackendDelegate& operator=(const TestHistoryBackendDelegate&) =
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge.cc b/components/history/core/browser/sync/typed_url_sync_bridge.cc index bd4efa1e..fc27482 100644 --- a/components/history/core/browser/sync/typed_url_sync_bridge.cc +++ b/components/history/core/browser/sync/typed_url_sync_bridge.cc
@@ -849,7 +849,7 @@ base::Time::FromInternalValue(sync_url.visits(index)); ui::PageTransition transition = ui::PageTransitionFromInt(sync_url.visit_transitions(index)); - added_visits.push_back(VisitInfo(visit_time, transition)); + added_visits.emplace_back(visit_time, transition); } new_synced_visits->emplace_back(new_url.url(), added_visits); return;
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc index d42ab8c..ff72455c 100644 --- a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc +++ b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
@@ -255,7 +255,7 @@ class TestHistoryBackendDelegate : public HistoryBackend::Delegate { public: - TestHistoryBackendDelegate() {} + TestHistoryBackendDelegate() = default; TestHistoryBackendDelegate(const TestHistoryBackendDelegate&) = delete; TestHistoryBackendDelegate& operator=(const TestHistoryBackendDelegate&) = @@ -316,14 +316,14 @@ std::vector<VisitInfo> added_visits; for (const auto& visit : visits) { - added_visits.push_back(VisitInfo(visit.visit_time, visit.transition)); + added_visits.emplace_back(visit.visit_time, visit.transition); } AddVisits(new_url->url(), added_visits, SOURCE_SYNCED); new_url->set_id(GetIdByUrl(new_url->url())); } private: - ~TestHistoryBackendForSync() override {} + ~TestHistoryBackendForSync() override = default; }; class MockHistoryBackendClient : public HistoryBackendClient { @@ -1498,8 +1498,8 @@ const int64_t visits[] = {1024, 2065, 65534, 1237684}; for (int64_t visit : visits) { - old_visits.push_back(VisitRow(0, SinceEpoch(visit), 0, - ui::PAGE_TRANSITION_TYPED, 0, true, 0)); + old_visits.emplace_back(0, SinceEpoch(visit), 0, ui::PAGE_TRANSITION_TYPED, + 0, true, 0); new_url.add_visits(visit); new_url.add_visit_transitions(ui::PAGE_TRANSITION_TYPED); } @@ -1528,8 +1528,8 @@ const int64_t visits_removed[] = {1500, 6000, 2237684}; for (int64_t visit : visits_left) { - old_visits.push_back(VisitRow(0, SinceEpoch(visit), 0, - ui::PAGE_TRANSITION_TYPED, 0, true, 0)); + old_visits.emplace_back(0, SinceEpoch(visit), 0, ui::PAGE_TRANSITION_TYPED, + 0, true, 0); } for (int64_t visit : visits_right) { @@ -1562,8 +1562,8 @@ const int64_t visits_added[] = {1, 1500, 6000, 2237684}; for (int64_t visit : visits_left) { - old_visits.push_back(VisitRow(0, SinceEpoch(visit), 0, - ui::PAGE_TRANSITION_TYPED, 0, true, 0)); + old_visits.emplace_back(0, SinceEpoch(visit), 0, ui::PAGE_TRANSITION_TYPED, + 0, true, 0); } for (int64_t visit : visits_right) {
diff --git a/components/history/core/browser/sync/typed_url_sync_metadata_database.cc b/components/history/core/browser/sync/typed_url_sync_metadata_database.cc index 90fa5754..faf273e3 100644 --- a/components/history/core/browser/sync/typed_url_sync_metadata_database.cc +++ b/components/history/core/browser/sync/typed_url_sync_metadata_database.cc
@@ -32,9 +32,9 @@ // value Serialize sync EntityMetadata, which is for tracking sync // state of each typed url. -TypedURLSyncMetadataDatabase::TypedURLSyncMetadataDatabase() {} +TypedURLSyncMetadataDatabase::TypedURLSyncMetadataDatabase() = default; -TypedURLSyncMetadataDatabase::~TypedURLSyncMetadataDatabase() {} +TypedURLSyncMetadataDatabase::~TypedURLSyncMetadataDatabase() = default; bool TypedURLSyncMetadataDatabase::GetAllSyncMetadata( syncer::MetadataBatch* metadata_batch) {
diff --git a/components/history/core/browser/sync/typed_url_sync_metadata_database_unittest.cc b/components/history/core/browser/sync/typed_url_sync_metadata_database_unittest.cc index a4cac59b..2913939 100644 --- a/components/history/core/browser/sync/typed_url_sync_metadata_database_unittest.cc +++ b/components/history/core/browser/sync/typed_url_sync_metadata_database_unittest.cc
@@ -35,14 +35,14 @@ class TypedURLSyncMetadataDatabaseTest : public testing::Test, public TypedURLSyncMetadataDatabase { public: - TypedURLSyncMetadataDatabaseTest() {} + TypedURLSyncMetadataDatabaseTest() = default; TypedURLSyncMetadataDatabaseTest(const TypedURLSyncMetadataDatabaseTest&) = delete; TypedURLSyncMetadataDatabaseTest& operator=( const TypedURLSyncMetadataDatabaseTest&) = delete; - ~TypedURLSyncMetadataDatabaseTest() override {} + ~TypedURLSyncMetadataDatabaseTest() override = default; protected: sql::Database& GetDB() override { return db_; }
diff --git a/components/history/core/browser/url_row.cc b/components/history/core/browser/url_row.cc index f8bd64ed..e2a9a19e 100644 --- a/components/history/core/browser/url_row.cc +++ b/components/history/core/browser/url_row.cc
@@ -133,12 +133,14 @@ VisitContentModelAnnotations model_annotations, const std::vector<std::string>& related_searches, const GURL& search_normalized_url, - const std::u16string& search_terms) + const std::u16string& search_terms, + const std::string& alternative_title) : annotation_flags(annotation_flags), model_annotations(model_annotations), related_searches(related_searches), search_normalized_url(search_normalized_url), - search_terms(search_terms) {} + search_terms(search_terms), + alternative_title(alternative_title) {} VisitContentAnnotations::VisitContentAnnotations() = default; VisitContentAnnotations::VisitContentAnnotations( const VisitContentAnnotations&) = default;
diff --git a/components/history/core/browser/url_row.h b/components/history/core/browser/url_row.h index 96849eb..b7e03fb 100644 --- a/components/history/core/browser/url_row.h +++ b/components/history/core/browser/url_row.h
@@ -240,7 +240,8 @@ VisitContentModelAnnotations model_annotations, const std::vector<std::string>& related_searches, const GURL& search_normalized_url, - const std::u16string& search_terms); + const std::u16string& search_terms, + const std::string& alternative_title); VisitContentAnnotations(const VisitContentAnnotations& other); ~VisitContentAnnotations(); @@ -251,6 +252,8 @@ std::vector<std::string> related_searches; GURL search_normalized_url; std::u16string search_terms; + // Alternative page title for the visit. + std::string alternative_title; }; class URLResult : public URLRow {
diff --git a/components/history/core/browser/visit_annotations_database.cc b/components/history/core/browser/visit_annotations_database.cc index dbeba7d4..a6846554 100644 --- a/components/history/core/browser/visit_annotations_database.cc +++ b/components/history/core/browser/visit_annotations_database.cc
@@ -24,7 +24,7 @@ #define HISTORY_CONTENT_ANNOTATIONS_ROW_FIELDS \ " visit_id,visibility_score,categories,page_topics_model_version," \ "annotation_flags,entities,related_searches,search_normalized_url," \ - "search_terms " + "search_terms,alternative_title " #define HISTORY_CONTEXT_ANNOTATIONS_ROW_FIELDS \ " visit_id,context_annotation_flags,duration_since_last_visit," \ "page_end_reason,total_foreground_duration " @@ -169,7 +169,8 @@ "entities VARCHAR," "related_searches VARCHAR," "search_normalized_url VARCHAR," - "search_terms LONGVARCHAR)")) { + "search_terms LONGVARCHAR," + "alternative_title VARCHAR)")) { return false; } @@ -226,7 +227,7 @@ sql::Statement statement(GetDB().GetCachedStatement( SQL_FROM_HERE, "INSERT INTO content_annotations(" HISTORY_CONTENT_ANNOTATIONS_ROW_FIELDS - ")VALUES(?,?,?,?,?,?,?,?,?)")); + ")VALUES(?,?,?,?,?,?,?,?,?,?)")); statement.BindInt64(0, visit_id); statement.BindDouble( 1, static_cast<double>( @@ -245,6 +246,7 @@ statement.BindString(7, visit_content_annotations.search_normalized_url.spec()); statement.BindString16(8, visit_content_annotations.search_terms); + statement.BindString(9, visit_content_annotations.alternative_title); if (!statement.Run()) { DVLOG(0) << "Failed to execute 'content_annotations' insert statement: " @@ -285,7 +287,8 @@ "visibility_score=?,categories=?," "page_topics_model_version=?," "annotation_flags=?,entities=?," - "related_searches=?,search_normalized_url=?,search_terms=? " + "related_searches=?,search_normalized_url=?,search_terms=?," + "alternative_title=? " "WHERE visit_id=?")); statement.BindDouble( 0, static_cast<double>( @@ -304,7 +307,8 @@ statement.BindString(6, visit_content_annotations.search_normalized_url.spec()); statement.BindString16(7, visit_content_annotations.search_terms); - statement.BindInt64(8, visit_id); + statement.BindString(8, visit_content_annotations.alternative_title); + statement.BindInt64(9, visit_id); if (!statement.Run()) { DVLOG(0) @@ -370,6 +374,7 @@ out_content_annotations->search_normalized_url = GURL(statement.ColumnString(7)); out_content_annotations->search_terms = statement.ColumnString16(8); + out_content_annotations->alternative_title = statement.ColumnString(9); return true; } @@ -641,4 +646,19 @@ "ALTER TABLE content_annotations ADD COLUMN search_terms LONGVARCHAR"); } +bool VisitAnnotationsDatabase::MigrateContentAnnotationsAddAlternativeTitle() { + if (!GetDB().DoesTableExist("content_annotations")) { + NOTREACHED() << "Content annotations table should exist before migration"; + return false; + } + + if (GetDB().DoesColumnExist("content_annotations", "alternative_title")) + return true; + + // Add the `alternative_title`column to the older versions of the table. + return GetDB().Execute( + "ALTER TABLE content_annotations " + "ADD COLUMN alternative_title"); +} + } // namespace history
diff --git a/components/history/core/browser/visit_annotations_database.h b/components/history/core/browser/visit_annotations_database.h index 8bf56a51..2c2e3dbe 100644 --- a/components/history/core/browser/visit_annotations_database.h +++ b/components/history/core/browser/visit_annotations_database.h
@@ -130,6 +130,10 @@ // Called by the derived classes to migrate the older content_annotations // table by adding the search_normalized_url and search_terms columns. bool MigrateContentAnnotationsAddSearchMetadata(); + + // Called by the derived classes to migrate the older content_annotations + // table by adding the alternative_title column. + bool MigrateContentAnnotationsAddAlternativeTitle(); }; } // namespace history
diff --git a/components/history/core/browser/visit_annotations_database_unittest.cc b/components/history/core/browser/visit_annotations_database_unittest.cc index 30480d7c..d2894ad4 100644 --- a/components/history/core/browser/visit_annotations_database_unittest.cc +++ b/components/history/core/browser/visit_annotations_database_unittest.cc
@@ -90,8 +90,9 @@ std::vector<std::string> related_searches{"related searches", "búsquedas relacionadas"}; VisitContentAnnotations content_annotations{ - annotation_flags, model_annotations, related_searches, - GURL("http://pagewithvisit.com?q=search"), u"search"}; + annotation_flags, model_annotations, + related_searches, GURL("http://pagewithvisit.com?q=search"), + u"search", "Alternative title"}; AddContentAnnotationsForVisit(visit_id, content_annotations); // Query for it. @@ -119,6 +120,7 @@ EXPECT_EQ(GURL("http://pagewithvisit.com?q=search"), got_content_annotations.search_normalized_url); EXPECT_EQ(u"search", got_content_annotations.search_terms); + EXPECT_EQ("Alternative title", got_content_annotations.alternative_title); } TEST_F(VisitAnnotationsDatabaseTest, @@ -172,8 +174,9 @@ VisitContentAnnotationFlags annotation_flags = VisitContentAnnotationFlag::kBrowsingTopicsEligible; VisitContentAnnotations original{ - annotation_flags, model_annotations, related_searches, - GURL("http://pagewithvisit.com?q=search"), u"search"}; + annotation_flags, model_annotations, + related_searches, GURL("http://pagewithvisit.com?q=search"), + u"search", "Alternative title"}; AddContentAnnotationsForVisit(visit_id, original); // Mutate that row. @@ -183,6 +186,7 @@ modification.search_normalized_url = GURL("http://pagewithvisit.com?q=search2"); modification.search_terms = u"search2"; + modification.alternative_title = "New alternative title"; UpdateContentAnnotationsForVisit(visit_id, modification); // Check that the mutated version was written. @@ -208,6 +212,7 @@ EXPECT_EQ(final.search_normalized_url, GURL("http://pagewithvisit.com?q=search2")); EXPECT_EQ(final.search_terms, u"search2"); + EXPECT_EQ(final.alternative_title, "New alternative title"); } TEST_F(VisitAnnotationsDatabaseTest, GetMostRecentClusterIds) { @@ -259,8 +264,9 @@ VisitContentAnnotationFlags annotation_flags = VisitContentAnnotationFlag::kNone; VisitContentAnnotations content_annotations{ - annotation_flags, model_annotations, related_searches, - GURL("http://pagewithvisit.com?q=search"), u"search"}; + annotation_flags, model_annotations, + related_searches, GURL("http://pagewithvisit.com?q=search"), + u"search", "Alternative title"}; AddContentAnnotationsForVisit(visit_id, content_annotations); VisitContentAnnotations got_content_annotations;
diff --git a/components/optimization_guide/content/browser/page_content_annotations_service.cc b/components/optimization_guide/content/browser/page_content_annotations_service.cc index 601a9dd9..92ae6ed 100644 --- a/components/optimization_guide/content/browser/page_content_annotations_service.cc +++ b/components/optimization_guide/content/browser/page_content_annotations_service.cc
@@ -49,6 +49,8 @@ return "RelatedSearches"; case PageContentAnnotationsType::kSearchMetadata: return "SearchMetadata"; + case PageContentAnnotationsType::kRemoteMetdata: + return "RemoteMetadata"; } } @@ -543,6 +545,18 @@ PageContentAnnotationsType::kModelAnnotations); } +void PageContentAnnotationsService::PersistRemotePageMetadata( + const HistoryVisit& visit, + const proto::PageEntitiesMetadata& page_metadata) { + if (!page_metadata.has_alternative_title()) + return; + QueryURL(visit, + base::BindOnce(&history::HistoryService::AddPageMetadataForVisit, + history_service_->AsWeakPtr(), + page_metadata.alternative_title()), + PageContentAnnotationsType::kRemoteMetdata); +} + // static HistoryVisit PageContentAnnotationsService::CreateHistoryVisitFromWebContents( content::WebContents* web_contents,
diff --git a/components/optimization_guide/content/browser/page_content_annotations_service.h b/components/optimization_guide/content/browser/page_content_annotations_service.h index 7dbda51a..e9cac58 100644 --- a/components/optimization_guide/content/browser/page_content_annotations_service.h +++ b/components/optimization_guide/content/browser/page_content_annotations_service.h
@@ -30,6 +30,7 @@ #include "components/optimization_guide/core/model_info.h" #include "components/optimization_guide/core/page_content_annotations_common.h" #include "components/optimization_guide/machine_learning_tflite_buildflags.h" +#include "components/optimization_guide/proto/page_entities_metadata.pb.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" @@ -84,13 +85,15 @@ // The type of page content annotations stored in the history database. enum class PageContentAnnotationsType { kUnknown = 0, - // Results from executing the models on page content or received from the - // remote Optimization Guide service. + // Results from executing the models on page content or annotations received + // from the remote Optimization Guide service. kModelAnnotations = 1, // Related searches for the Google Search Results page. kRelatedSearches = 2, // Metadata for "search-like" pages. kSearchMetadata = 3, + // Metadata received from the remote Optimization Guide service. + kRemoteMetdata = 4, }; // A KeyedService that annotates page content. @@ -226,6 +229,13 @@ const std::vector<history::VisitContentModelAnnotations::Category>& entities); + // Persist |page_metadata| for |visit| in |history_service_|. + // + // Virtualized for testing. + virtual void PersistRemotePageMetadata( + const HistoryVisit& visit, + const proto::PageEntitiesMetadata& page_metadata); + using PersistAnnotationsCallback = base::OnceCallback<void(history::VisitID)>; // Queries |history_service| for all the visits to the visited URL of |visit|. // |callback| will be invoked to write the bound content annotations to
diff --git a/components/optimization_guide/content/browser/page_content_annotations_web_contents_observer.cc b/components/optimization_guide/content/browser/page_content_annotations_web_contents_observer.cc index 533ba21..773eacfe 100644 --- a/components/optimization_guide/content/browser/page_content_annotations_web_contents_observer.cc +++ b/components/optimization_guide/content/browser/page_content_annotations_web_contents_observer.cc
@@ -23,6 +23,12 @@ namespace { +// Return whether or not we should fetch remote metadata. +bool FetchRemoteMetadataEnabled() { + return features::RemotePageEntitiesEnabled() || + features::RemotePageMetadataEnabled(); +} + // Returns search metadata if |url| is a valid Search URL according to // |template_url_service|. absl::optional<SearchMetadata> ExtractSearchMetadata( @@ -121,7 +127,7 @@ optimization_guide_decider_(optimization_guide_decider) { DCHECK(page_content_annotations_service_); - if (features::RemotePageEntitiesEnabled() && optimization_guide_decider_) { + if (FetchRemoteMetadataEnabled() && optimization_guide_decider_) { optimization_guide_decider_->RegisterOptimizationTypes( {proto::PAGE_ENTITIES}); } @@ -147,12 +153,11 @@ optimization_guide::HistoryVisit history_visit = optimization_guide:: PageContentAnnotationsService::CreateHistoryVisitFromWebContents( web_contents(), navigation_handle->GetNavigationId()); - - if (features::RemotePageEntitiesEnabled() && optimization_guide_decider_) { + if (FetchRemoteMetadataEnabled() && optimization_guide_decider_) { optimization_guide_decider_->CanApplyOptimizationAsync( navigation_handle, proto::PAGE_ENTITIES, base::BindOnce(&PageContentAnnotationsWebContentsObserver:: - OnRemotePageEntitiesReceived, + OnRemotePageMetadataReceived, weak_ptr_factory_.GetWeakPtr(), history_visit)); } @@ -247,7 +252,7 @@ } } -void PageContentAnnotationsWebContentsObserver::OnRemotePageEntitiesReceived( +void PageContentAnnotationsWebContentsObserver::OnRemotePageMetadataReceived( const HistoryVisit& history_visit, OptimizationGuideDecision decision, const OptimizationMetadata& metadata) { @@ -256,22 +261,36 @@ absl::optional<proto::PageEntitiesMetadata> page_entities_metadata = metadata.ParsedMetadata<proto::PageEntitiesMetadata>(); - if (!page_entities_metadata || page_entities_metadata->entities().size() == 0) + if (!page_entities_metadata) return; - std::vector<history::VisitContentModelAnnotations::Category> entities; - for (const auto& entity : page_entities_metadata->entities()) { - if (entity.entity_id().empty()) - continue; + // Persist entities to VisitContentModelAnnotations if that feature is + // enabled. + if (page_entities_metadata->entities().size() != 0 && + features::RemotePageEntitiesEnabled()) { + std::vector<history::VisitContentModelAnnotations::Category> entities; + for (const auto& entity : page_entities_metadata->entities()) { + if (entity.entity_id().empty()) + continue; - if (entity.score() < 0 || entity.score() > 100) - continue; + if (entity.score() < 0 || entity.score() > 100) + continue; - entities.emplace_back(history::VisitContentModelAnnotations::Category( - entity.entity_id(), entity.score())); + entities.emplace_back(history::VisitContentModelAnnotations::Category( + entity.entity_id(), entity.score())); + } + page_content_annotations_service_->PersistRemotePageEntities(history_visit, + entities); } - page_content_annotations_service_->PersistRemotePageEntities(history_visit, - entities); + if (!features::RemotePageMetadataEnabled()) { + return; + } + // Persist any other metadata to VisitContentAnnotations. + page_entities_metadata->clear_entities(); + if (page_entities_metadata->has_alternative_title()) { + page_content_annotations_service_->PersistRemotePageMetadata( + history_visit, *page_entities_metadata); + } } WEB_CONTENTS_USER_DATA_KEY_IMPL(PageContentAnnotationsWebContentsObserver);
diff --git a/components/optimization_guide/content/browser/page_content_annotations_web_contents_observer.h b/components/optimization_guide/content/browser/page_content_annotations_web_contents_observer.h index d30c5c7..1cfdc3e 100644 --- a/components/optimization_guide/content/browser/page_content_annotations_web_contents_observer.h +++ b/components/optimization_guide/content/browser/page_content_annotations_web_contents_observer.h
@@ -54,9 +54,9 @@ void DidFinishNavigation(content::NavigationHandle* handle) override; void TitleWasSet(content::NavigationEntry* navigation_entry) override; - // Callback invoked when the page entities have been received from + // Callback invoked when the page metadata has been received from // |optimization_guide_decider_| for |visit|. - void OnRemotePageEntitiesReceived(const HistoryVisit& visit, + void OnRemotePageMetadataReceived(const HistoryVisit& visit, OptimizationGuideDecision decision, const OptimizationMetadata& metadata);
diff --git a/components/optimization_guide/content/browser/page_content_annotations_web_contents_observer_unittest.cc b/components/optimization_guide/content/browser/page_content_annotations_web_contents_observer_unittest.cc index 155f4621..e53fc62b 100644 --- a/components/optimization_guide/content/browser/page_content_annotations_web_contents_observer_unittest.cc +++ b/components/optimization_guide/content/browser/page_content_annotations_web_contents_observer_unittest.cc
@@ -96,6 +96,17 @@ return last_search_metadata_; } + void PersistRemotePageMetadata( + const HistoryVisit& visit, + const proto::PageEntitiesMetadata& page_metadata) override { + last_page_metadata_ = page_metadata; + } + + absl::optional<proto::PageEntitiesMetadata> last_page_metadata_persisted() + const { + return last_page_metadata_; + } + private: absl::optional<HistoryVisit> last_annotation_request_; absl::optional<std::pair<HistoryVisit, content::WebContents*>> @@ -105,6 +116,7 @@ std::vector<history::VisitContentModelAnnotations::Category>>> last_entities_persistence_request_; absl::optional<SearchMetadata> last_search_metadata_; + absl::optional<proto::PageEntitiesMetadata> last_page_metadata_; }; class FakeOptimizationGuideDecider : public TestOptimizationGuideDecider { @@ -146,6 +158,15 @@ std::move(callback).Run(OptimizationGuideDecision::kTrue, metadata); return; } + if (navigation_handle->GetURL() == GURL("http://hasmetadata.com/")) { + proto::PageEntitiesMetadata page_entities_metadata; + page_entities_metadata.set_alternative_title("alternative title"); + + OptimizationMetadata metadata; + metadata.SetAnyMetadataForTesting(page_entities_metadata); + std::move(callback).Run(OptimizationGuideDecision::kTrue, metadata); + return; + } if (navigation_handle->GetURL() == GURL("http://noentities.com/")) { proto::PageEntitiesMetadata page_entities_metadata; OptimizationMetadata metadata; @@ -498,8 +519,8 @@ public: PageContentAnnotationsWebContentsObserverRemotePageEntitiesTest() { scoped_feature_list_.InitAndEnableFeatureWithParameters( - features::kPageContentAnnotations, - {{"fetch_remote_page_entities", "true"}}); + features::kRemotePageMetadata, + {{"persist_page_entities", "true"}, {"persist_page_metadata", "true"}}); } private: @@ -559,4 +580,15 @@ history::VisitContentModelAnnotations::Category("entity1", 50))); } +TEST_F(PageContentAnnotationsWebContentsObserverRemotePageEntitiesTest, + RequestsToPersistIfHasPageMetadata) { + // Navigate. + content::NavigationSimulator::NavigateAndCommitFromBrowser( + web_contents(), GURL("http://hasmetadata.com/")); + + absl::optional<proto::PageEntitiesMetadata> metadata = + service()->last_page_metadata_persisted(); + EXPECT_EQ(metadata->alternative_title(), "alternative title"); +} + } // namespace optimization_guide
diff --git a/components/optimization_guide/core/entity_annotator_native_library.cc b/components/optimization_guide/core/entity_annotator_native_library.cc index 0bb123b..32350cb5 100644 --- a/components/optimization_guide/core/entity_annotator_native_library.cc +++ b/components/optimization_guide/core/entity_annotator_native_library.cc
@@ -245,6 +245,16 @@ base::GetFunctionPointerFromNativeLibrary( native_library_, "OptimizationGuideEntityMetadataGetHumanReadableAliasAtIndex")); + entity_metadata_get_collections_count_func_ = + reinterpret_cast<EntityMetadataGetCollectionsCountFunc>( + base::GetFunctionPointerFromNativeLibrary( + native_library_, + "OptimizationGuideEntityMetadataGetCollectionsCount")); + entity_metadata_get_collection_at_index_func_ = + reinterpret_cast<EntityMetadataGetCollectionAtIndexFunc>( + base::GetFunctionPointerFromNativeLibrary( + native_library_, + "OptimizationGuideEntityMetadataGetCollectionAtIndex")); } DISABLE_CFI_ICALL @@ -267,7 +277,9 @@ entity_metadata_get_human_readable_category_name_at_index_func_ && entity_metadata_get_human_readable_category_score_at_index_func_ && entity_metadata_get_human_readable_aliases_count_func_ && - entity_metadata_get_human_readable_alias_at_index_func_; + entity_metadata_get_human_readable_alias_at_index_func_ && + entity_metadata_get_collections_count_func_ && + entity_metadata_get_collection_at_index_func_; } DISABLE_CFI_ICALL @@ -507,6 +519,7 @@ og_entity_metadata, i); entity_metadata.human_readable_categories[category_name] = category_score; } + int32_t human_readable_aliases_count = entity_metadata_get_human_readable_aliases_count_func_( og_entity_metadata); @@ -515,6 +528,14 @@ entity_metadata_get_human_readable_alias_at_index_func_( og_entity_metadata, i)); } + + int32_t collections_count = + entity_metadata_get_collections_count_func_(og_entity_metadata); + for (int32_t i = 0; i < collections_count; i++) { + std::string collection = + entity_metadata_get_collection_at_index_func_(og_entity_metadata, i); + entity_metadata.collections.push_back(collection); + } return entity_metadata; }
diff --git a/components/optimization_guide/core/entity_annotator_native_library.h b/components/optimization_guide/core/entity_annotator_native_library.h index 9b6b39b..aeb99a0 100644 --- a/components/optimization_guide/core/entity_annotator_native_library.h +++ b/components/optimization_guide/core/entity_annotator_native_library.h
@@ -185,8 +185,15 @@ entity_metadata_get_human_readable_aliases_count_func_ = nullptr; using EntityMetadataGetHumanReadableAliasAtIndexFunc = const char* (*)(const void*, int32_t); - EntityMetadataGetHumanReadableCategoryNameAtIndexFunc + EntityMetadataGetHumanReadableAliasAtIndexFunc entity_metadata_get_human_readable_alias_at_index_func_ = nullptr; + using EntityMetadataGetCollectionsCountFunc = int32_t (*)(const void*); + EntityMetadataGetCollectionsCountFunc + entity_metadata_get_collections_count_func_ = nullptr; + using EntityMetadataGetCollectionAtIndexFunc = const char* (*)(const void*, + int32_t); + EntityMetadataGetCollectionAtIndexFunc + entity_metadata_get_collection_at_index_func_ = nullptr; }; } // namespace optimization_guide
diff --git a/components/optimization_guide/core/entity_metadata.cc b/components/optimization_guide/core/entity_metadata.cc index 9609edd..bff1d67 100644 --- a/components/optimization_guide/core/entity_metadata.cc +++ b/components/optimization_guide/core/entity_metadata.cc
@@ -19,11 +19,13 @@ const std::string& entity_id, const std::string& human_readable_name, const base::flat_map<std::string, float>& human_readable_categories, - const std::vector<std::string>& human_readable_aliases) + const std::vector<std::string>& human_readable_aliases, + const std::vector<std::string>& collections) : entity_id(entity_id), human_readable_name(human_readable_name), human_readable_categories(human_readable_categories), - human_readable_aliases(human_readable_aliases) {} + human_readable_aliases(human_readable_aliases), + collections(collections) {} EntityMetadata::EntityMetadata(const EntityMetadata&) = default; EntityMetadata::~EntityMetadata() = default; @@ -35,11 +37,21 @@ category.Set("score", iter.second); categories.Append(std::move(category)); } + base::Value::List aliases_list; + for (const auto& alias : human_readable_aliases) { + aliases_list.Append(alias); + } + base::Value::List collection_list; + for (const auto& collection : collections) { + collection_list.Append(collection); + } base::Value::Dict metadata; metadata.Set("entity_id", entity_id); metadata.Set("human_readable_name", human_readable_name); metadata.Set("categories", std::move(categories)); + metadata.Set("human_readable_aliases", std::move(aliases_list)); + metadata.Set("collections", std::move(collection_list)); return base::Value(std::move(metadata)); } @@ -50,10 +62,12 @@ categories.push_back( base::StringPrintf("{%s,%f}", iter.first.c_str(), iter.second)); } + return base::StringPrintf( - "EntityMetadata{%s, %s, {%s}, {%s}}", entity_id.c_str(), + "EntityMetadata{%s, %s, {%s}, {%s}, {%s}}", entity_id.c_str(), human_readable_name.c_str(), base::JoinString(categories, ",").c_str(), - base::JoinString(human_readable_aliases, ",").c_str()); + base::JoinString(human_readable_aliases, ",").c_str(), + base::JoinString(collections, ",").c_str()); } std::ostream& operator<<(std::ostream& out, const EntityMetadata& md) { @@ -65,7 +79,8 @@ return lhs.entity_id == rhs.entity_id && lhs.human_readable_name == rhs.human_readable_name && lhs.human_readable_categories == rhs.human_readable_categories && - lhs.human_readable_aliases == rhs.human_readable_aliases; + lhs.human_readable_aliases == rhs.human_readable_aliases && + lhs.collections == rhs.collections; } ScoredEntityMetadata::ScoredEntityMetadata() = default;
diff --git a/components/optimization_guide/core/entity_metadata.h b/components/optimization_guide/core/entity_metadata.h index 3c60f265..ad70404b 100644 --- a/components/optimization_guide/core/entity_metadata.h +++ b/components/optimization_guide/core/entity_metadata.h
@@ -20,7 +20,8 @@ const std::string& entity_id, const std::string& human_readable_name, const base::flat_map<std::string, float>& human_readable_categories, - const std::vector<std::string>& human_readable_aliases = {}); + const std::vector<std::string>& human_readable_aliases = {}, + const std::vector<std::string>& collections = {}); EntityMetadata(const EntityMetadata&); ~EntityMetadata(); @@ -38,6 +39,9 @@ // The ordered set of aliases for this entity in the user's locale. std::vector<std::string> human_readable_aliases; + // A vector of collections of the entity. Will contain the top 5 collections. + std::vector<std::string> collections; + std::string ToString() const; base::Value AsValue() const;
diff --git a/components/optimization_guide/core/optimization_guide_features.cc b/components/optimization_guide/core/optimization_guide_features.cc index afffb7da..7c72e17d 100644 --- a/components/optimization_guide/core/optimization_guide_features.cc +++ b/components/optimization_guide/core/optimization_guide_features.cc
@@ -117,6 +117,10 @@ const base::Feature kPageContentAnnotations{"PageContentAnnotations", enabled_by_default_desktop_only}; +// Enables fetching page metadata from the remote Optimization Guide service. +const base::Feature kRemotePageMetadata{"RemotePageMetadata", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables the page entities model to be annotated on every page load. const base::Feature kPageEntitiesPageContentAnnotations{ "PageEntitiesPageContentAnnotations", enabled_by_default_desktop_only}; @@ -507,8 +511,13 @@ } bool RemotePageEntitiesEnabled() { - return GetFieldTrialParamByFeatureAsBool(kPageContentAnnotations, - "fetch_remote_page_entities", false); + return GetFieldTrialParamByFeatureAsBool(kRemotePageMetadata, + "persist_page_entities", false); +} + +bool RemotePageMetadataEnabled() { + return GetFieldTrialParamByFeatureAsBool(kRemotePageMetadata, + "persist_page_metadata", false); } base::TimeDelta GetOnloadDelayForHintsFetching() {
diff --git a/components/optimization_guide/core/optimization_guide_features.h b/components/optimization_guide/core/optimization_guide_features.h index 9c2e3663..4e459af 100644 --- a/components/optimization_guide/core/optimization_guide_features.h +++ b/components/optimization_guide/core/optimization_guide_features.h
@@ -45,6 +45,7 @@ extern const base::Feature kPreventLongRunningPredictionModels; extern const base::Feature kOverrideNumThreadsForModelExecution; extern const base::Feature kOptGuideEnableXNNPACKDelegateWithTFLite; +extern const base::Feature kRemotePageMetadata; // Enables use of task runner with trait CONTINUE_ON_SHUTDOWN for page content // annotations on-device models. @@ -252,6 +253,10 @@ // Optimization Guide service. bool RemotePageEntitiesEnabled(); +// Returns whether page metadata should be retrieved from the remote +// Optimization Guide service. +bool RemotePageMetadataEnabled(); + // The time to wait beyond the onload event before sending the hints request for // link predictions. base::TimeDelta GetOnloadDelayForHintsFetching();
diff --git a/components/optimization_guide/proto/page_entities_metadata.proto b/components/optimization_guide/proto/page_entities_metadata.proto index 1b5fa33..222b8b7f 100644 --- a/components/optimization_guide/proto/page_entities_metadata.proto +++ b/components/optimization_guide/proto/page_entities_metadata.proto
@@ -29,6 +29,8 @@ message PageEntitiesMetadata { // A set of entities that are expected to be present on the page. repeated Entity entities = 1; + // A string representing an alternative title for the page. + optional string alternative_title = 2; } // The metadata associated with an |Entity|. @@ -38,4 +40,4 @@ // opposed to the opaque entity_id. message EntityMetadataStorage { optional string entity_name = 1; -} \ No newline at end of file +}
diff --git a/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer.cc b/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer.cc index bb710b7..40cb0102 100644 --- a/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer.cc +++ b/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer.cc
@@ -50,7 +50,7 @@ #include "services/metrics/public/cpp/ukm_recorder.h" #include "third_party/blink/public/mojom/devtools/inspector_issue.mojom-shared.h" #include "third_party/blink/public/mojom/devtools/inspector_issue.mojom.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "ui/base/page_transition_types.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h"
diff --git a/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.h b/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.h index edc28baa7..0d6405e 100644 --- a/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.h +++ b/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer.h
@@ -11,9 +11,9 @@ #include "base/containers/flat_set.h" #include "components/page_load_metrics/browser/page_load_metrics_observer.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom.h" -#include "third_party/blink/public/mojom/use_counter/css_property_id.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "third_party/blink/public/mojom/use_counter/use_counter_feature.mojom-forward.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" // This class reports several use counters coming from Blink. // For FencedFrames, it reports the use counters with a "FencedFrames" prefix.
diff --git a/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer_unittest.cc b/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer_unittest.cc index b80c0ec..0f929265 100644 --- a/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer_unittest.cc +++ b/components/page_load_metrics/browser/observers/use_counter_page_load_metrics_observer_unittest.cc
@@ -16,7 +16,7 @@ #include "content/public/test/navigation_simulator.h" #include "content/public/test/test_renderer_host.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "url/gurl.h" namespace {
diff --git a/components/page_load_metrics/common/page_load_metrics.mojom b/components/page_load_metrics/common/page_load_metrics.mojom index da3b279d..f3fa086 100644 --- a/components/page_load_metrics/common/page_load_metrics.mojom +++ b/components/page_load_metrics/common/page_load_metrics.mojom
@@ -7,7 +7,7 @@ import "ui/gfx/geometry/mojom/geometry.mojom"; import "mojo/public/mojom/base/shared_memory.mojom"; import "mojo/public/mojom/base/time.mojom"; -import "third_party/blink/public/mojom/web_feature/web_feature.mojom"; +import "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom"; import "third_party/blink/public/mojom/mobile_metrics/mobile_friendliness.mojom"; import "third_party/blink/public/mojom/use_counter/use_counter_feature.mojom";
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc index ff29e47..0fefca8d 100644 --- a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc +++ b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc
@@ -18,8 +18,8 @@ #include "services/network/public/cpp/url_loader_completion_status.h" #include "services/network/public/mojom/url_response_head.mojom.h" #include "third_party/blink/public/common/features.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/public/mojom/use_counter/use_counter_feature.mojom-shared.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" #include "ui/gfx/geometry/rect.h" namespace page_load_metrics {
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 58dd418..ad9f0dd 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -1283,6 +1283,11 @@ Jika kebijakan ditetapkan ke Salah (False) atau tidak ditetapkan, tombol tidak akan muncul.</translation> <translation id="2294382669900758280">Pemutaran video di aplikasi Android tidak dipertimbangkan, meski kebijakan ini disetel ke <ph name="TRUE" />.</translation> +<translation id="2297792368307475351">Jika kebijakan disetel, Anda dapat menetapkan daftar pola URL yang menentukan situs yang tidak dapat menggunakan izin situs papan klip. Ini tidak termasuk semua operasi papan klip pada asal yang cocok dengan pola. Misalnya, pengguna masih dapat menempelkan dengan pintasan keyboard karena tindakan ini tidak dibatasi oleh izin situs papan klip. + + Tidak menyetel kebijakan berarti <ph name="DEFAULT_CLIPBOARD_SETTING" /> akan berlaku untuk semua situs, jika disetel. Jika tidak, setelan pribadi pengguna akan digunakan. + + Untuk informasi selengkapnya tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> bukanlah nilai yang diterima untuk kebijakan ini.</translation> <translation id="2299220924812062390">Tentukan daftar plugin yang diaktifkan</translation> <translation id="2301048990069984110">Memperluas dukungan untuk Aplikasi Chrome di Windows, Mac, dan Linux.</translation> <translation id="2303795211377219696">Mengaktifkan IsiOtomatis untuk kartu kredit</translation> @@ -1586,6 +1591,7 @@ <translation id="2604182581880595781">Mengonfigurasi kebijakan terkait fitur Berbagi File Jaringan.</translation> <translation id="2608535066974278204">Jangka waktu (menit) yang menentukan lamanya interval peluncuran kembali.</translation> <translation id="2608887839902987727">Cegah autentikasi captive portal mengabaikan setelan proxy</translation> +<translation id="2608985885792348429">Setelan papan klip default</translation> <translation id="2615240493030733717">Melaporkan Info Zona waktu</translation> <translation id="2619966380594000538">Jika kebijakan disetel ke Aktif atau tidak disetel, peringatan keamanan akan muncul saat tanda command line yang berpotensi bahaya digunakan untuk meluncurkan Chrome. @@ -1605,6 +1611,7 @@ <translation id="264093234299818170">Semua printer akan ditampilkan, kecuali printer yang tercantum dalam daftar yang tidak diizinkan.</translation> <translation id="264252574246191885">Tidak terdaftar</translation> <translation id="2647069081229792812">Aktifkan atau nonaktifkan pengeditan bookmark</translation> +<translation id="264771271300359481">Jangan izinkan situs apa pun menggunakan izin situs papan klip</translation> <translation id="2649896281375932517">Biarkan pengguna memutuskan</translation> <translation id="2650049181907741121">Tindakan yang akan diambil saat pengguna menutup penutupnya</translation> <translation id="2658653824183107970">Menggunakan implementasi <ph name="CORS" /> lama, bukan <ph name="CORS" /> baru.</translation> @@ -4086,6 +4093,7 @@ <translation id="5470500958458209831">URL tempat playbook Ansible dapat didownload.</translation> <translation id="5475361623548884387">Aktifkan pencetakan</translation> <translation id="547601067149622666">Jangan izinkan iklan di situs yang menayangkan iklan mengganggu</translation> +<translation id="5476152378885134514">Memblokir papan klip di situs ini</translation> <translation id="5478734531226638813">Menyetel kebijakan akan menonaktifkan update aplikasi Kiosk Chrome (yang menggunakan URL update dari manifes ekstensi) dalam sesi dan hanya akan menggunakan pra-pengambilan CRX sebagai mekanisme update.</translation> <translation id="5480380613778757009">Jika kebijakan ini dinonaktifkan atau tidak disetel, semua setelan tampilan yang disetel di Sesi tamu terkelola akan direset segera setelah sesi selesai. Jika kebijakan ini disetel ke Benar (True), properti tampilan akan tetap tersimpan setelah keluar dari sesi tamu terkelola.</translation> <translation id="5483065054530244863">Mengizinkan sertifikat bertanda tangan SHA-1 yang dikeluarkan oleh trust anchor lokal</translation> @@ -4218,6 +4226,11 @@ <translation id="5649046890958064703">Jika <ph name="PRINTERS_BLACKLIST" /> dipilih untuk <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, menyetel <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> akan menentukan printer yang tidak dapat digunakan oleh pengguna. Semua printer diberikan kepada pengguna kecuali ID yang tercantum dalam kebijakan ini. ID harus sesuai dengan kolom <ph name="ID_FIELD" /> atau <ph name="GUID_FIELD" /> dalam file yang ditentukan di <ph name="DEVICE_PRINTERS_POLICY_NAME" />. Kebijakan ini tidak digunakan lagi. Sebagai gantinya, gunakan <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.</translation> +<translation id="5649773663020498924">Jika kebijakan disetel ke 2, situs akan diblokir agar tidak menggunakan izin situs papan klip. Jika kebijakan ini disetel ke 3 atau tidak disetel, pengguna dapat mengubah setelan dan menentukan apakah API papan klip tersedia saat situs ingin menggunakannya. + + Kebijakan ini dapat diganti untuk pola URL tertentu menggunakan kebijakan <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" /> dan <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" />. + + Kebijakan ini hanya memengaruhi operasi papan klip yang dikontrol oleh izin situs papan klip, dan tidak memengaruhi penulisan papan klip yang dibersihkan atau operasi salin dan tempel tepercaya.</translation> <translation id="5652250453612826983">Mengontrol kebijakan pengawasan orang tua, yang diterapkan hanya ke akun anak. Kebijakan ini tidak disetel di konsol admin, tetapi dikonfigurasi langsung oleh Server Kids API.</translation> <translation id="5654682237531873653">Jika kebijakan disetel ke Aktif, periksa ejaan akan diaktifkan dan pengguna tidak dapat menonaktifkannya. Di <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" />, dan <ph name="LINUX_OS_NAME" />, bahasa periksa ejaan dapat diaktifkan atau dinonaktifkan satu per satu, sehingga pengguna tetap dapat menonaktifkan periksa ejaan dengan menonaktifkan setiap bahasa periksa ejaan. Untuk menghindari hal tersebut, gunakan <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> untuk mengaktifkan paksa bahasa periksa ejaan tertentu. @@ -4983,6 +4996,7 @@ 1) Lokal yang ditentukan pengguna (jika dikonfigurasi). 2) Lokal sistem. 3) Lokal pengganti (en-US).</translation> +<translation id="6493089139124468815">Izinkan situs meminta pengguna untuk memberikan izin situs papan klip</translation> <translation id="6493918190032622602">Versi <ph name="PRODUCT_OS_NAME" /> minimum yang diizinkan</translation> <translation id="6495337487202227251">Perhatikan bahwa kebijakan ini sudah tidak digunakan lagi dan akan dihapus di <ph name="PRODUCT_OS_NAME" /> versi 85. Sebagai gantinya, gunakan <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />. @@ -6225,6 +6239,12 @@ Jika kebijakan tidak disetel, pengguna dapat memilih apakah akan dimintai sandi untuk membuka kunci perangkat dari mode tidur.</translation> <translation id="7784062550705119230">Jika <ph name="PRINTERS_ALLOWLIST" /> dipilih untuk <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, menyetel <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> akan menentukan printer yang dapat digunakan oleh pengguna. Hanya printer dengan ID yang cocok dengan nilai dalam kebijakan ini yang akan tersedia bagi pengguna. ID harus sesuai dengan kolom <ph name="ID_FIELD" /> atau <ph name="GUID_FIELD" /> dalam file yang ditentukan di <ph name="DEVICE_PRINTERS_POLICY_NAME" /></translation> <translation id="7788511847830146438">Per Profil</translation> +<translation id="7788632499792081231">Jika kebijakan disetel, Anda dapat menetapkan daftar pola URL yang menentukan situs yang dapat menggunakan izin situs papan klip. Ini tidak termasuk semua operasi papan klip pada asal yang cocok dengan pola. Misalnya, pengguna masih dapat menempelkan dengan pintasan keyboard karena tindakan ini tidak dibatasi oleh izin situs papan klip. + + + Tidak menyetel kebijakan berarti <ph name="DEFAULT_CLIPBOARD_SETTING" /> akan berlaku untuk semua situs, jika disetel. Jika tidak, setelan pribadi pengguna akan digunakan. + + Untuk informasi selengkapnya tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> bukanlah nilai yang diterima untuk kebijakan ini.</translation> <translation id="7792796937016596423">Pengguna tidak akan dapat melakukan rekaman paket jaringan</translation> <translation id="7798441698807517880">Kebijakan ini telah dihapus sejak <ph name="PRODUCT_NAME" /> versi 89 karena <ph name="FLASH_PLUGIN_NAME" /> tidak digunakan lagi. @@ -6999,6 +7019,7 @@ Jika kebijakan ditetapkan, pengguna tidak dapat mengubahnya. Jika tidak ditetapkan, respons lisan mula-mula dinonaktifkan, tetapi pengguna dapat mengaktifkannya kapan saja.</translation> <translation id="8656110680728938054">Aktifkan fitur klik untuk diucapkan</translation> +<translation id="8659843732895043951">Mengizinkan papan klip di situs ini</translation> <translation id="8661297125441579970">Jangan izinkan migrasi data dan ARC.</translation> <translation id="8665314828727504286">Tingkat Perlindungan Safe Browsing</translation> <translation id="8666123502812856425">Menyetel kebijakan memungkinkan Anda menetapkan daftar URL yang menentukan situs mana yang otomatis diizinkan untuk mengakses perangkat HID yang berisi koleksi tingkat atas dengan penggunaan HID tertentu. Setiap item dalam daftar memerlukan kolom <ph name="USAGES_FIELD_NAME" /> dan <ph name="URLS_FIELD_NAME" /> agar kebijakan menjadi valid. Setiap item di kolom <ph name="USAGES_FIELD_NAME" /> harus memiliki kolom <ph name="USAGE_PAGE_FIELD_NAME" /> dan dapat memiliki kolom <ph name="USAGE_FIELD_NAME" />. Jika kolom <ph name="USAGE_FIELD_NAME" /> tidak ada, kebijakan akan cocok dengan perangkat yang berisi koleksi tingkat atas dengan penggunaan dari halaman penggunaan tertentu. Item yang memiliki kolom <ph name="USAGE_FIELD_NAME" /> tanpa kolom <ph name="USAGE_PAGE_FIELD_NAME" /> menjadi tidak valid dan akan diabaikan.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 254f6de6..f92a6225 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -428,6 +428,18 @@ หากคุณปิดใช้นโยบายนี้ ระบบจะปิดใช้การเลื่อนหน้าเว็บไปยัง Fragment ของข้อความที่เจาะจงผ่าน URL</translation> <translation id="1474273443907024088">ปิดใช้ TLS False Start</translation> +<translation id="1476128579011024193"> + หากตั้งค่านโยบายนี้เป็น <ph name="POLICY_VALUE_PRIMARY_ACCOUNT" /> หลังจากลงชื่อเข้าใช้บัญชีที่จัดการภายใต้นโยบายนี้ ระบบจะขอให้ผู้ใช้สร้างโปรไฟล์ใหม่สำหรับบัญชีนั้น + หากตั้งค่านโยบายนี้เป็น <ph name="POLICY_VALUE_PRIMARY_ACCOUNT_KEEP_EXISTING_DATA" /> หลังจากลงชื่อเข้าใช้บัญชีที่จัดการภายใต้นโยบายนี้ ระบบจะขอให้ผู้ใช้สร้างโปรไฟล์ใหม่สำหรับบัญชีนั้นโดยมีตัวเลือกให้เก็บข้อมูลการท่องเว็บที่มีอยู่ไว้ ตัวเลือกนี้ใช้ได้ใน Chrome เวอร์ชัน 102 ขึ้นไป + + หากตั้งค่านโยบายนี้เป็น <ph name="POLICY_VALUE_PRIMARY_ACCOUNT_STRICT" /> หลังจากลงชื่อเข้าใช้บัญชีที่จัดการภายใต้นโยบายนี้ ระบบจะขอให้ผู้ใช้สร้างโปรไฟล์ใหม่สำหรับบัญชีนั้น โปรไฟล์นี้จะไม่อนุญาตให้มีบัญชีรอง + หากตั้งค่านโยบายนี้เป็น <ph name="POLICY_VALUE_PRIMARY_ACCOUNT_STRICT_KEEP_EXISTING_DATA" /> หลังจากลงชื่อเข้าใช้บัญชีที่จัดการภายใต้นโยบายนี้ ระบบจะขอให้ผู้ใช้สร้างโปรไฟล์ใหม่สำหรับบัญชีนั้นโดยมีตัวเลือกให้เก็บข้อมูลการท่องเว็บที่มีอยู่ไว้ โปรไฟล์นี้จะไม่อนุญาตให้มีบัญชีรอง ตัวเลือกนี้ใช้ได้ใน Chrome เวอร์ชัน 102 ขึ้นไป + + หากตั้งค่านโยบายนี้เป็น <ph name="POLICY_VALUE_NONE" /> หรือไม่ได้ตั้งค่า บัญชีที่จัดการจะไม่มีข้อจำกัด ซึ่งอาจส่งผลต่อบัญชีที่จัดการที่เป็นบัญชีรอง นั่นคือผู้ดูแลระบบจะตั้งค่านโยบายในบัญชีดังกล่าวไม่ได้ + + หากตั้งค่านโยบายนี้ที่ระดับอุปกรณ์ บัญชีทั้งหมดในเบราว์เซอร์จะอยู่ภายใต้นโยบาย + หากตั้งค่านโยบายนี้ที่ระดับบัญชี จะมีเฉพาะบัญชีนั้นที่ได้รับผลกระทบในเบราว์เซอร์ + </translation> <translation id="1477934438414550161">TLS 1.2</translation> <translation id="1479427764273213107">การตั้งค่านโยบายนี้จะกำหนดรายการอุปกรณ์ USB ที่ผู้ใช้จะปลดออกจากไดรเวอร์ Kernel เพื่อใช้งานผ่าน chrome.usb API ในเว็บแอปโดยตรงได้ รายการต่างๆ เป็นการจับคู่ระหว่างตัวระบุผู้ให้บริการ USB และตัวระบุผลิตภัณฑ์เพื่อที่จะระบุฮาร์ดแวร์ที่เจาะจง
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index b59df3f..fe2e62c7 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -1284,6 +1284,11 @@ Nếu bạn đặt chính sách này thành False hoặc không đặt chính sách này, thì sẽ không có nút nào xuất hiện.</translation> <translation id="2294382669900758280">Video đang phát trong các ứng dụng Android không được xem xét ngay cả khi chính sách này được đặt thành <ph name="TRUE" />.</translation> +<translation id="2297792368307475351">Việc thiết lập chính sách này cho phép bạn thiết lập một danh sách mẫu URL xác định những trang web không được sử dụng quyền bảng nhớ tạm cho trang web. Việc này không bao gồm mọi thao tác bảng nhớ tạm trên những nguồn gốc khớp với mẫu đó. Ví dụ: người dùng vẫn có thể dán bằng phím tắt do việc này không do quyền bảng nhớ tạm cho trang web kiểm soát. + + Khi bạn không đặt giá trị cho chính sách này, <ph name="DEFAULT_CLIPBOARD_SETTING" /> (nếu được đặt) sẽ áp dụng cho mọi trang web. Nếu không, chế độ cài đặt do người dùng chọn sẽ được áp dụng. + + Để biết thông tin chi tiết về các mẫu <ph name="URL_LABEL" /> hợp lệ, vui lòng xem tại https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Chúng tôi không chấp nhận giá trị <ph name="WILDCARD_VALUE" /> đối với chính sách này.</translation> <translation id="2299220924812062390">Chỉ định danh sách plugin được phép</translation> <translation id="2301048990069984110">Mở rộng hỗ trợ cho Ứng dụng Chrome trên Windows, Mac và Linux.</translation> <translation id="2303795211377219696">Bật tính năng Tự động điền cho thẻ tín dụng</translation> @@ -1586,6 +1591,7 @@ <translation id="2604182581880595781">Định cấu hình các chính sách liên quan đến tính năng Chia sẻ tệp trong mạng.</translation> <translation id="2608535066974278204">Khoảng thời gian (tính bằng phút) chỉ định khoảng thời gian chạy lại.</translation> <translation id="2608887839902987727">Ngăn quá trình xác thực qua trang xác thực bỏ qua cài đặt proxy</translation> +<translation id="2608985885792348429">Chế độ cài đặt bảng nhớ tạm mặc định</translation> <translation id="2615240493030733717">Báo cáo thông tin về múi giờ</translation> <translation id="2619966380594000538">Khi bạn đặt thành Bật hoặc không đặt chính sách này, cảnh báo bảo mật sẽ hiện ra khi những cờ hiệu dòng lệnh có thể nguy hiểm được dùng để chạy Chrome. @@ -1605,6 +1611,7 @@ <translation id="264093234299818170">Tất cả máy in đều được hiển thị trừ những máy in trong danh sách chặn.</translation> <translation id="264252574246191885">Không công khai</translation> <translation id="2647069081229792812">Bật hoặc tắt tính năng chỉnh sửa dấu trang</translation> +<translation id="264771271300359481">Không cho phép bất kỳ trang web nào sử dụng quyền bảng nhớ tạm cho trang web</translation> <translation id="2649896281375932517">Để người dùng quyết định</translation> <translation id="2650049181907741121">Hành động sẽ thực hiện khi người dùng đóng nắp</translation> <translation id="2658653824183107970">Sử dụng quy trình triển khai <ph name="CORS" /> cũ thay vì <ph name="CORS" /> mới</translation> @@ -4076,6 +4083,7 @@ <translation id="5470500958458209831">URL mà từ đó có thể tải cẩm nang Ansible xuống.</translation> <translation id="5475361623548884387">Bật tính năng in</translation> <translation id="547601067149622666">Không cho phép quảng cáo trên các trang web chứa quảng cáo xâm nhập</translation> +<translation id="5476152378885134514">Chặn bảng nhớ tạm trên những trang web này</translation> <translation id="5478734531226638813">Nếu bạn đặt chính sách này, thì hệ thống sẽ dừng việc cập nhật các ứng dụng Kiosk Chrome trong phiên (sử dụng URL cập nhật từ tệp kê khai tiện ích) và chỉ sử dụng tính năng tìm nạp trước CRX làm cơ chế cập nhật.</translation> <translation id="5480380613778757009">Nếu bạn tắt hoặc không đặt chính sách này, thì tất cả những chế độ cài đặt hiển thị đã đặt trong Phiên khách được quản lý sẽ được đặt lại ngay khi phiên này kết thúc. Nếu bạn đặt chính sách này thành Bật, thì các thuộc tính hiển thị sẽ vẫn giữ nguyên sau khi bạn thoát khỏi phiên khách được quản lý.</translation> <translation id="5483065054530244863">Cho phép các chứng chỉ SHA-1 có chữ ký do neo tin cậy cục bộ phát hành</translation> @@ -4208,6 +4216,11 @@ <translation id="5649046890958064703">Nếu bạn chọn <ph name="PRINTERS_BLACKLIST" /> cho <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, thì việc đặt <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> sẽ chỉ định những máy in mà người dùng không thể sử dụng. Tất cả máy in sẽ được cung cấp cho người dùng, ngoại trừ những mã nhận dạng được liệt kê trong chính sách này. Các mã nhận dạng này phải tương ứng với trường <ph name="ID_FIELD" /> hoặc <ph name="GUID_FIELD" /> ở tệp được chỉ định trong <ph name="DEVICE_PRINTERS_POLICY_NAME" />. Chính sách này không còn dùng nữa, vui lòng sử dụng <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.</translation> +<translation id="5649773663020498924">Nếu bạn đặt chính sách này thành 2, các trang web sẽ không được sử dụng quyền sử dụng bảng nhớ tạm cho trang web. Nếu bạn đặt chính sách này thành 3 hoặc không đặt chính sách này, người dùng có thể thay đổi chế độ cài đặt và chọn xem có API bảng nhớ tạm hay không khi một trang web muốn sử dụng. + + Bạn có thể ghi đè chính sách này cho các mẫu URL cụ thể bằng các chính sách <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME" /> và <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME" />. + + Chính sách này chỉ ảnh hưởng đến những thao tác bảng nhớ tạm do quyền sử dụng bảng nhớ tạm cho trang web kiểm soát mà không ảnh hưởng đến việc viết bảng nhớ tạm được bảo vệ an toàn hoặc việc thực hiện thao tác sao chép và dán.</translation> <translation id="5652250453612826983">Kiểm soát các chính sách về sự giám sát của cha mẹ (chỉ áp dụng cho tài khoản người dùng là trẻ em). Những chính sách này không được đặt trong bảng điều khiển dành cho quản trị viên mà do Máy chủ API Kids định cấu hình trực tiếp.</translation> <translation id="5654682237531873653">Nếu bạn đặt chính sách này thành Bật, tính năng kiểm tra lỗi chính tả sẽ được bật và người dùng không thể tắt tính năng đó. Trên <ph name="MS_WIN_NAME" />, <ph name="PRODUCT_OS_NAME" /> và <ph name="LINUX_OS_NAME" />, các ngôn ngữ có tính năng kiểm tra lỗi chính tả có thể được bật hoặc tắt riêng. Vì vậy, người dùng vẫn có thể tắt tính năng kiểm tra lỗi chính tả bằng cách tắt mọi ngôn ngữ có tính năng đó. Để tránh trường hợp này, hãy dùng <ph name="SPELLCHECK_LANGUAGE_POLICY_NAME" /> để buộc bật các ngôn ngữ có tính năng kiểm tra lỗi chính tả cụ thể. @@ -4956,6 +4969,7 @@ 1) Ngôn ngữ do người dùng chỉ định (nếu đã định cấu hình). 2) Ngôn ngữ hệ thống. 3) Ngôn ngữ dự phòng (en-US).</translation> +<translation id="6493089139124468815">Cho phép trang web đề nghị người dùng cấp quyền bảng nhớ tạm cho trang web</translation> <translation id="6493918190032622602">Phiên bản <ph name="PRODUCT_OS_NAME" /> tối thiểu được phép</translation> <translation id="6495337487202227251">Lưu ý rằng chúng tôi không dùng chính sách này nữa và sẽ xóa khỏi <ph name="PRODUCT_OS_NAME" /> phiên bản 85. Thay vào đó, vui lòng sử dụng <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME" />. @@ -6199,6 +6213,12 @@ Nếu bạn không đặt chính sách này, người dùng có thể chọn có nhắc nhập mật khẩu để đánh thức thiết bị hay không.</translation> <translation id="7784062550705119230">Nếu bạn chọn <ph name="PRINTERS_ALLOWLIST" /> cho <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, việc đặt <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME" /> sẽ chỉ định những máy in mà người dùng có thể sử dụng. Người dùng chỉ có thể sử dụng những máy in có mã nhận dạng khớp với giá trị trong chính sách này. Các mã nhận dạng này phải tương ứng với trường <ph name="ID_FIELD" /> hoặc <ph name="GUID_FIELD" /> ở tệp được chỉ định trong <ph name="DEVICE_PRINTERS_POLICY_NAME" /></translation> <translation id="7788511847830146438">Cho mỗi hồ sơ</translation> +<translation id="7788632499792081231">Việc thiết lập chính sách này cho phép bạn thiết lập một danh sách mẫu URL xác định những trang web được sử dụng quyền bảng nhớ tạm cho trang web. Việc này không bao gồm mọi thao tác bảng nhớ tạm trên những nguồn gốc khớp với mẫu đó. Ví dụ: người dùng vẫn có thể dán bằng phím tắt do việc này không do quyền bảng nhớ tạm cho trang web kiểm soát. + + + Khi bạn không đặt giá trị cho chính sách này, <ph name="DEFAULT_CLIPBOARD_SETTING" /> (nếu được đặt) sẽ áp dụng cho mọi trang web. Nếu không, chế độ cài đặt do người dùng chọn sẽ được áp dụng. + + Để biết thông tin chi tiết về các mẫu <ph name="URL_LABEL" /> hợp lệ, vui lòng xem tại https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Chúng tôi không chấp nhận giá trị <ph name="WILDCARD_VALUE" /> đối với chính sách này.</translation> <translation id="7792796937016596423">Người dùng sẽ không thể chặn bắt gói tin qua mạng</translation> <translation id="7798441698807517880">Chúng tôi đã xóa chính sách này khỏi <ph name="PRODUCT_NAME" /> phiên bản 89 trở đi <ph name="FLASH_PLUGIN_NAME" /> không còn được dùng nữa. @@ -6986,6 +7006,7 @@ Nếu bạn đặt chính sách này, thì người dùng sẽ không thể thay đổi được. Nếu bạn không đặt chính sách này, thì ban đầu, tính năng phản hồi bằng giọng nói sẽ tắt, nhưng người dùng có thể bật bất cứ lúc nào.</translation> <translation id="8656110680728938054">Bật tính năng chọn để nói</translation> +<translation id="8659843732895043951">Cho phép dùng bảng nhớ tạm trên những trang này</translation> <translation id="8661297125441579970">Không cho phép di chuyển dữ liệu và App Runtime for Chrome (ARC).</translation> <translation id="8665314828727504286">Mức độ bảo vệ của tính năng Duyệt web an toàn</translation> <translation id="8666123502812856425">Nếu thiết lập chính sách này, bạn có thể liệt kê danh sách URL để chỉ định những trang web được tự động cấp quyền truy cập vào thiết bị HID chứa bộ sưu tập cấp cao nhất với cách sử dụng HID cụ thể. Mỗi mục trong danh sách này phải có cả trường <ph name="USAGES_FIELD_NAME" /> lẫn trường <ph name="URLS_FIELD_NAME" /> thì chính sách mới hợp lệ. Mỗi mục trong trường <ph name="USAGES_FIELD_NAME" /> phải có <ph name="USAGE_PAGE_FIELD_NAME" /> và có thể có trường <ph name="USAGE_FIELD_NAME" />. Nếu bạn bỏ qua trường <ph name="USAGE_FIELD_NAME" />, hệ thống sẽ tạo một chính sách áp dụng cho mọi thiết bị chứa bộ sưu tập cấp cao nhất với cách sử dụng từ một trang cụ thể về cách sử dụng. Nếu một mục có trường <ph name="USAGE_FIELD_NAME" /> nhưng không có trường <ph name="USAGE_PAGE_FIELD_NAME" />, thì mục đó không hợp lệ và bị bỏ qua.
diff --git a/components/safe_browsing/content/browser/web_ui/resources/safe_browsing.html b/components/safe_browsing/content/browser/web_ui/resources/safe_browsing.html index ca2794e..685ee88 100644 --- a/components/safe_browsing/content/browser/web_ui/resources/safe_browsing.html +++ b/components/safe_browsing/content/browser/web_ui/resources/safe_browsing.html
@@ -5,142 +5,137 @@ <title>Safe Browsing</title> <link rel="stylesheet" href="safe_browsing.css"> <link rel="stylesheet" href="chrome://resources/css/text_defaults.css"> - <link rel="stylesheet" href="chrome://resources/css/tabs.css"> </head> <body> <div id="header"> <h1 id="sb-title">Safe Browsing</h1> </div> - <tabbox id='tabbox'> - <tabs> - <tab id="preferences">Preferences</tab> - <tab id="db-manager">Database Manager</tab> - <tab id="hash-cache">Hash Cache</tab> - <tab id="csbrr">ClientSafeBrowsingReportRequests</tab> - <tab id="download-protection">Download Protection</tab> - <tab id="cpr">Client Phishing Requests</tab> - <tab id="password-protection">Password Protection</tab> - <tab id="rt-lookup">RT Lookup</tab> - <tab id="referrer-chain">Referrer Chain</tab> - <tab id="log">Log Messages</tab> - <tab id="reporting">Reporting Events</tab> - <tab id="deep-scan">Deep Scans</tab> - </tabs> - <tabpanels> - <tabpanel> - <h2>Experiments</h2> - <div class="content"> - <p id="experiments-list" class="result-container"></p> - </div> - <h2>Preferences</h2> - <div class="content"> - <p id="preferences-list" class="result-container"></p> - </div> - <h2>Policies</h2> - <div class="content"> - <p id="policies-list" class="result-container"></p> - </div> - <h2>Safe Browsing Cookie</h2> - <div class="content"> - <p id="cookie-panel" class="result-container"></p> - </div> - </tabpanel> - <tabpanel> - <h2>Database Manager</h2> - <div class="content"> - <p id="database-info-list" class="result-container"></p> - </div> - </tabpanel> - <tabpanel> - <h2>Full Hash Cache</h2> - <div class="content"> - <p id="full-hash-cache-info"></p> - </div> - </tabpanel> - <tabpanel> - <h2>CSBRRs (ClientSafeBrowsingReportRequest) sent</h2> - <div class="content"> - <p id="sent-csbrrs-list" class="result-container"></p> - </div> - <h2>Hit Reports sent</h2> - <div class="content"> - <p id="sent-hit-report-list" class="result-container"></p> - </div> - </tabpanel> - <tabpanel> - <h2>Download URLs checked</h2> - <div class="content"> - <p id="download-urls-checked-list"></p> - </div> - <h2>Download requests (ClientDownloadRequest) sent</h2> - <div class="content"> - <p id="sent-client-download-requests-list"></p> - </div> - <h2>Download responses (ClientDownloadResponse) received</h2> - <div class="content"> - <p id="received-client-download-response-list"></p> - </div> - </tabpanel> - <tabpanel> - <h2>Client Phishing requests sent</h2> - <div class="content"> - <p id="sent-client-phishing-requests-list"></p> - </div> - <h2>Client Phishing responses sent</h2> - <div class="content"> - <p id="received-client-phishing-response-list"></p> - </div> - </tabpanel> - <tabpanel> - <h2>Saved Password Hashes</h2> - <div class="content"> - <p id="saved-passwords"></p> - </div> - <h2>Password Protection Events</h2> - <div class="content"> - <p id="pg-event-log"></p> - </div> - <h2>Security Events</h2> - <div class="content"> - <p id="security-event-log"></p> - </div> - <h2>Password Protection Pings</h2> - <table id="pg-ping-list" class="request-response"></table> - </tabpanel> - <tabpanel> - <h2>RT Lookup Pings</h2> - <table id="rt-lookup-ping-list" class="request-response"></table> - </tabpanel> - <tabpanel> - <h2>Referrer Chain</h2> - <form id="get-referrer-chain-form"> - <input type="text" id="referrer-chain-url"> - <input type="submit" value="Get Chain"> - </form> - <div class="content"> - <p id="referrer-chain-content"></p> - </div> - <h2>Most Recent Referring App Info (Android)</h2> - <p id="referring-app-info" class="result-container"></p> - </tabpanel> - <tabpanel> - <h2>Log Messages</h2> - <div class="content"> - <p id="log-messages"></p> - </div> - </tabpanel> - <tabpanel> - <h2>Reporting Events</h2> - <div class="content"> - <p id="reporting-events"></p> - </div> - </tabpanel> - <tabpanel> - <h2>Deep Scans</h2> - <table id="deep-scan-list" class="request-response"></table> - </tabpanel> - </tabpanels> - </tabbox> + <cr-tab-box id='tabbox'> + <div slot="tab" id="preferences">Preferences</div> + <div slot="tab" id="db-manager">Database Manager</div> + <div slot="tab" id="hash-cache">Hash Cache</div> + <div slot="tab" id="csbrr">ClientSafeBrowsingReportRequests</div> + <div slot="tab" id="download-protection">Download Protection</div> + <div slot="tab" id="cpr">Client Phishing Requests</div> + <div slot="tab" id="password-protection">Password Protection</div> + <div slot="tab" id="rt-lookup">RT Lookup</div> + <div slot="tab" id="referrer-chain">Referrer Chain</div> + <div slot="tab" id="log">Log Messages</div> + <div slot="tab" id="reporting">Reporting Events</div> + <div slot="tab" id="deep-scan">Deep Scans</div> + <div slot="panel"> + <h2>Experiments</h2> + <div class="content"> + <p id="experiments-list" class="result-container"></p> + </div> + <h2>Preferences</h2> + <div class="content"> + <p id="preferences-list" class="result-container"></p> + </div> + <h2>Policies</h2> + <div class="content"> + <p id="policies-list" class="result-container"></p> + </div> + <h2>Safe Browsing Cookie</h2> + <div class="content"> + <p id="cookie-panel" class="result-container"></p> + </div> + </div> + <div slot="panel"> + <h2>Database Manager</h2> + <div class="content"> + <p id="database-info-list" class="result-container"></p> + </div> + </div> + <div slot="panel"> + <h2>Full Hash Cache</h2> + <div class="content"> + <p id="full-hash-cache-info"></p> + </div> + </div> + <div slot="panel"> + <h2>CSBRRs (ClientSafeBrowsingReportRequest) sent</h2> + <div class="content"> + <p id="sent-csbrrs-list" class="result-container"></p> + </div> + <h2>Hit Reports sent</h2> + <div class="content"> + <p id="sent-hit-report-list" class="result-container"></p> + </div> + </div> + <div slot="panel"> + <h2>Download URLs checked</h2> + <div class="content"> + <p id="download-urls-checked-list"></p> + </div> + <h2>Download requests (ClientDownloadRequest) sent</h2> + <div class="content"> + <p id="sent-client-download-requests-list"></p> + </div> + <h2>Download responses (ClientDownloadResponse) received</h2> + <div class="content"> + <p id="received-client-download-response-list"></p> + </div> + </div> + <div slot="panel"> + <h2>Client Phishing requests sent</h2> + <div class="content"> + <p id="sent-client-phishing-requests-list"></p> + </div> + <h2>Client Phishing responses sent</h2> + <div class="content"> + <p id="received-client-phishing-response-list"></p> + </div> + </div> + <div slot="panel"> + <h2>Saved Password Hashes</h2> + <div class="content"> + <p id="saved-passwords"></p> + </div> + <h2>Password Protection Events</h2> + <div class="content"> + <p id="pg-event-log"></p> + </div> + <h2>Security Events</h2> + <div class="content"> + <p id="security-event-log"></p> + </div> + <h2>Password Protection Pings</h2> + <table id="pg-ping-list" class="request-response"></table> + </div> + <div slot="panel"> + <h2>RT Lookup Pings</h2> + <table id="rt-lookup-ping-list" class="request-response"></table> + </div> + <div slot="panel"> + <h2>Referrer Chain</h2> + <form id="get-referrer-chain-form"> + <input type="text" id="referrer-chain-url"> + <input type="submit" value="Get Chain"> + </form> + <div class="content"> + <p id="referrer-chain-content"></p> + </div> + <h2>Most Recent Referring App Info (Android)</h2> + <p id="referring-app-info" class="result-container"></p> + </div> + <div slot="panel"> + <h2>Log Messages</h2> + <div class="content"> + <p id="log-messages"></p> + </div> + </div> + <div slot="panel"> + <h2>Reporting Events</h2> + <div class="content"> + <p id="reporting-events"></p> + </div> + </div> + <div slot="panel"> + <h2>Deep Scans</h2> + <table id="deep-scan-list" class="request-response"></table> + </div> + </cr-tab-box> <template id="result-template"> <div> <span class="bold-span"></span>
diff --git a/components/safe_browsing/content/browser/web_ui/resources/safe_browsing.js b/components/safe_browsing/content/browser/web_ui/resources/safe_browsing.js index 38d7271..6ad33bf7 100644 --- a/components/safe_browsing/content/browser/web_ui/resources/safe_browsing.js +++ b/components/safe_browsing/content/browser/web_ui/resources/safe_browsing.js
@@ -2,12 +2,10 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ -import {addWebUIListener, sendWithPromise} from 'chrome://resources/js/cr.m.js'; -import {decorate} from 'chrome://resources/js/cr/ui.m.js'; -import {TabBox} from 'chrome://resources/js/cr/ui/tabs.js'; -import {$} from 'chrome://resources/js/util.m.js'; +import 'chrome://resources/cr_elements/cr_tab_box/cr_tab_box.js'; -decorate('tabbox', TabBox); +import {addWebUIListener, sendWithPromise} from 'chrome://resources/js/cr.m.js'; +import {$} from 'chrome://resources/js/util.m.js'; /** * Asks the C++ SafeBrowsingUIHandler to get the lists of Safe Browsing @@ -193,10 +191,9 @@ }; // When the tab updates, update the anchor - $('tabbox').addEventListener('selectedChange', function() { - const tabbox = $('tabbox'); - const tabs = tabbox.querySelector('tabs').children; - const selectedTab = tabs[tabbox.selectedIndex]; + $('tabbox').addEventListener('selected-index-change', e => { + const tabs = document.querySelectorAll('div[slot=\'tab\']'); + const selectedTab = tabs[e.detail]; window.location.hash = 'tab-' + selectedTab.id; }, true); } @@ -435,8 +432,11 @@ } function showTab(tabId) { - if ($(tabId)) { - $(tabId).selected = 'selected'; + const tabs = document.querySelectorAll('div[slot=\'tab\']'); + const index = Array.from(tabs).findIndex(t => t.id === tabId); + if (index !== -1) { + document.querySelector('cr-tab-box') + .setAttribute('selected-index', index.toString()); } }
diff --git a/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc b/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc index 5c02f37..f5f8a33 100644 --- a/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc +++ b/components/safe_browsing/content/browser/web_ui/safe_browsing_ui.cc
@@ -46,6 +46,7 @@ #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h" +#include "services/network/public/mojom/content_security_policy.mojom.h" #if BUILDFLAG(SAFE_BROWSING_DB_LOCAL) #include "components/safe_browsing/core/browser/db/v4_local_database_manager.h" @@ -2237,6 +2238,11 @@ html_source->AddResourcePath("safe_browsing.js", IDR_SAFE_BROWSING_JS); html_source->SetDefaultResource(IDR_SAFE_BROWSING_HTML); + // Static types + html_source->OverrideContentSecurityPolicy( + network::mojom::CSPDirectiveName::TrustedTypes, + "trusted-types static-types;"); + content::WebUIDataSource::Add(browser_context, html_source); }
diff --git a/components/security_interstitials/DEPS b/components/security_interstitials/DEPS index af6cbb98..66cf581 100644 --- a/components/security_interstitials/DEPS +++ b/components/security_interstitials/DEPS
@@ -1,4 +1,5 @@ include_rules = [ + "+components/content_settings/core/browser", "+components/google/core", "+components/history/core/browser", "+components/metrics",
diff --git a/components/security_interstitials/content/stateful_ssl_host_state_delegate.cc b/components/security_interstitials/content/stateful_ssl_host_state_delegate.cc index efd772b..524e3c6 100644 --- a/components/security_interstitials/content/stateful_ssl_host_state_delegate.cc +++ b/components/security_interstitials/content/stateful_ssl_host_state_delegate.cc
@@ -84,10 +84,6 @@ const int kDefaultSSLCertDecisionVersion = 1; -// Key for the expiration time of a decision in the per-site HTTP allowlist -// content settings dictionary. -const char kHTTPAllowlistExpirationTimeKey[] = "decision_expiration_time"; - // Records a new occurrence of |error|. The occurrence is stored in the // recurrent interstitial pref, which keeps track of the most recent timestamps // at which each error type occurred (up to the |threshold| most recent @@ -207,10 +203,13 @@ browser_context_(browser_context), pref_service_(pref_service), host_content_settings_map_(host_content_settings_map), + https_only_mode_allowlist_( + host_content_settings_map, + clock_.get(), + base::Seconds(kDeltaDefaultExpirationInSeconds)), recurrent_interstitial_threshold_for_testing(-1), recurrent_interstitial_mode_for_testing(NOT_SET), - recurrent_interstitial_reset_time_for_testing(-1) { -} + recurrent_interstitial_reset_time_for_testing(-1) {} StatefulSSLHostStateDelegate::~StatefulSSLHostStateDelegate() = default; @@ -280,9 +279,7 @@ host_content_settings_map_->ClearSettingsForOneTypeWithPredicate( ContentSettingsType::SSL_CERT_DECISIONS, base::Time(), base::Time::Max(), pattern_filter); - host_content_settings_map_->ClearSettingsForOneTypeWithPredicate( - ContentSettingsType::HTTP_ALLOWED, base::Time(), base::Time::Max(), - pattern_filter); + https_only_mode_allowlist_.Clear(pattern_filter); } content::SSLHostStateDelegate::CertJudgment @@ -377,25 +374,10 @@ browser_context_->GetStoragePartition( web_contents->GetMainFrame()->GetSiteInstance(), /*can_create=*/false); - if (!storage_partition || - storage_partition != browser_context_->GetDefaultStoragePartition()) { - // Decisions for non-default storage partitions are stored in memory only. - allowed_http_hosts_for_non_default_storage_partitions_.insert(host); - return; - } - - // Store when the HTTP allowlist entry for this host should expire. This value - // must be stored inside a dictionary as content settings don't support - // directly storing a string value. - GURL url = GetSecureGURLForHost(host); - base::Time expiration_time = - clock_->Now() + base::Seconds(kDeltaDefaultExpirationInSeconds); - auto dict = std::make_unique<base::Value>(base::Value::Type::DICTIONARY); - dict->SetKey(kHTTPAllowlistExpirationTimeKey, - base::TimeToValue(expiration_time)); - host_content_settings_map_->SetWebsiteSettingDefaultScope( - url, GURL(), ContentSettingsType::HTTP_ALLOWED, - base::Value::FromUniquePtrValue(std::move(dict))); + bool is_nondefault_storage = + !storage_partition || + storage_partition != browser_context_->GetDefaultStoragePartition(); + https_only_mode_allowlist_.AllowHttpForHost(host, is_nondefault_storage); } bool StatefulSSLHostStateDelegate::IsHttpAllowedForHost( @@ -404,47 +386,24 @@ content::StoragePartition* storage_partition = browser_context_->GetStoragePartition( web_contents->GetMainFrame()->GetSiteInstance(), - false /* can_create */); - if (!storage_partition || - storage_partition != browser_context_->GetDefaultStoragePartition()) { - return base::Contains( - allowed_http_hosts_for_non_default_storage_partitions_, host); - } - - GURL url = GetSecureGURLForHost(host); - const ContentSettingsPattern pattern = - ContentSettingsPattern::FromURLNoWildcard(url); - - const base::Value value = host_content_settings_map_->GetWebsiteSetting( - url, url, ContentSettingsType::HTTP_ALLOWED, nullptr); - if (!value.is_dict()) { - return false; - } - - auto* decision_expiration_value = - value.FindKey(kHTTPAllowlistExpirationTimeKey); - auto decision_expiration = base::ValueToTime(decision_expiration_value); - if (decision_expiration <= clock_->Now()) { - // Allowlist entry has expired. - return false; - } - - return true; + /*can_create=*/false); + bool is_nondefault_storage = + !storage_partition || + storage_partition != browser_context_->GetDefaultStoragePartition(); + return https_only_mode_allowlist_.IsHttpAllowedForHost(host, + is_nondefault_storage); } void StatefulSSLHostStateDelegate::RevokeUserAllowExceptions( const std::string& host) { GURL url = GetSecureGURLForHost(host); - host_content_settings_map_->SetWebsiteSettingDefaultScope( url, GURL(), ContentSettingsType::SSL_CERT_DECISIONS, base::Value()); - host_content_settings_map_->SetWebsiteSettingDefaultScope( - url, GURL(), ContentSettingsType::HTTP_ALLOWED, base::Value()); - // Decisions for non-default storage partitions are stored separately in // memory; delete those as well. allowed_certs_for_non_default_storage_partitions_.erase(host); - allowed_http_hosts_for_non_default_storage_partitions_.erase(host); + + https_only_mode_allowlist_.RevokeUserAllowExceptions(host); } bool StatefulSSLHostStateDelegate::HasAllowException( @@ -533,6 +492,7 @@ void StatefulSSLHostStateDelegate::SetClockForTesting( std::unique_ptr<base::Clock> clock) { clock_ = std::move(clock); + https_only_mode_allowlist_.SetClockForTesting(clock_.get()); } void StatefulSSLHostStateDelegate::SetRecurrentInterstitialThresholdForTesting(
diff --git a/components/security_interstitials/content/stateful_ssl_host_state_delegate.h b/components/security_interstitials/content/stateful_ssl_host_state_delegate.h index a7e8ea7c..db1dc5a8 100644 --- a/components/security_interstitials/content/stateful_ssl_host_state_delegate.h +++ b/components/security_interstitials/content/stateful_ssl_host_state_delegate.h
@@ -11,6 +11,7 @@ #include "base/feature_list.h" #include "base/memory/raw_ptr.h" #include "components/keyed_service/core/keyed_service.h" +#include "components/security_interstitials/core/https_only_mode_allowlist.h" #include "content/public/browser/ssl_host_state_delegate.h" class HostContentSettingsMap; @@ -174,17 +175,9 @@ std::map<int /* error code */, int /* count */> recurrent_errors_; // Tracks sites that are allowed to load over HTTP when HTTPS-First Mode is - // enabled, for non-default storage partitions. Allowed hosts are exact - // hostname matches -- subdomains of a host on the allowlist must be - // separately allowlisted. - // - // In most cases, HTTP interstitial decisions are stored in ContentSettings - // and persisted to disk, like cert decisions. Similar to cert decisions, for - // non-default StoragePartitions the decisions should be isolated from normal - // browsing and don't need to be persisted to disk. For these cases, track - // allowlist decisions purely in memory. - std::set<std::string /* host */> - allowed_http_hosts_for_non_default_storage_partitions_; + // enabled. Allowed hosts are exact hostname matches -- subdomains of a host + // on the allowlist must be separately allowlisted. + security_interstitials::HttpsOnlyModeAllowlist https_only_mode_allowlist_; int recurrent_interstitial_threshold_for_testing; enum RecurrentInterstitialMode recurrent_interstitial_mode_for_testing;
diff --git a/components/security_interstitials/core/BUILD.gn b/components/security_interstitials/core/BUILD.gn index 0ef1fe85..c84beef 100644 --- a/components/security_interstitials/core/BUILD.gn +++ b/components/security_interstitials/core/BUILD.gn
@@ -14,6 +14,8 @@ "common_string_util.h", "controller_client.cc", "controller_client.h", + "https_only_mode_allowlist.cc", + "https_only_mode_allowlist.h", "https_only_mode_metrics.cc", "https_only_mode_metrics.h", "https_only_mode_ui_util.cc", @@ -48,6 +50,7 @@ deps = [ "//base", "//base:i18n", + "//components/content_settings/core/browser", "//components/google/core/common", "//components/history/core/browser", "//components/metrics",
diff --git a/components/security_interstitials/core/https_only_mode_allowlist.cc b/components/security_interstitials/core/https_only_mode_allowlist.cc new file mode 100644 index 0000000..031923a5 --- /dev/null +++ b/components/security_interstitials/core/https_only_mode_allowlist.cc
@@ -0,0 +1,115 @@ +// 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/security_interstitials/core/https_only_mode_allowlist.h" + +#include "base/containers/contains.h" +#include "base/json/values_util.h" +#include "base/time/clock.h" + +namespace { + +// Key for the expiration time of a decision in the per-site HTTP allowlist +// content settings dictionary. +const char kHTTPAllowlistExpirationTimeKey[] = "decision_expiration_time"; + +// All SSL decisions are per host (and are shared arcoss schemes), so this +// canonicalizes all hosts into a secure scheme GURL to use with content +// settings. The returned GURL will be the passed in host with an empty path and +// https:// as the scheme. +GURL GetSecureGURLForHost(const std::string& host) { + std::string url = "https://" + host; + return GURL(url); +} + +} // namespace + +namespace security_interstitials { + +HttpsOnlyModeAllowlist::HttpsOnlyModeAllowlist( + HostContentSettingsMap* host_content_settings_map, + base::Clock* clock, + base::TimeDelta expiration_timeout) + : host_content_settings_map_(host_content_settings_map), + clock_(clock), + expiration_timeout_(expiration_timeout) {} + +HttpsOnlyModeAllowlist::~HttpsOnlyModeAllowlist() = default; + +void HttpsOnlyModeAllowlist::AllowHttpForHost(const std::string& host, + bool is_nondefault_storage) { + if (is_nondefault_storage) { + // Decisions for non-default storage partitions are stored in memory only. + allowed_http_hosts_for_non_default_storage_partitions_.insert(host); + return; + } + + // Store when the HTTP allowlist entry for this host should expire. This value + // must be stored inside a dictionary as content settings don't support + // directly storing a string value. + GURL url = GetSecureGURLForHost(host); + base::Time expiration_time = clock_->Now() + expiration_timeout_; + auto dict = std::make_unique<base::Value>(base::Value::Type::DICTIONARY); + dict->SetKey(kHTTPAllowlistExpirationTimeKey, + base::TimeToValue(expiration_time)); + host_content_settings_map_->SetWebsiteSettingDefaultScope( + url, GURL(), ContentSettingsType::HTTP_ALLOWED, + base::Value::FromUniquePtrValue(std::move(dict))); +} + +bool HttpsOnlyModeAllowlist::IsHttpAllowedForHost( + const std::string& host, + bool is_nondefault_storage) const { + if (is_nondefault_storage) { + return base::Contains( + allowed_http_hosts_for_non_default_storage_partitions_, host); + } + + GURL url = GetSecureGURLForHost(host); + const ContentSettingsPattern pattern = + ContentSettingsPattern::FromURLNoWildcard(url); + + const base::Value value = host_content_settings_map_->GetWebsiteSetting( + url, url, ContentSettingsType::HTTP_ALLOWED, nullptr); + if (!value.is_dict()) { + return false; + } + + auto* decision_expiration_value = + value.FindKey(kHTTPAllowlistExpirationTimeKey); + auto decision_expiration = base::ValueToTime(decision_expiration_value); + if (decision_expiration <= clock_->Now()) { + // Allowlist entry has expired. + return false; + } + + return true; +} + +void HttpsOnlyModeAllowlist::RevokeUserAllowExceptions( + const std::string& host) { + GURL url = GetSecureGURLForHost(host); + host_content_settings_map_->SetWebsiteSettingDefaultScope( + url, GURL(), ContentSettingsType::HTTP_ALLOWED, base::Value()); + // Decisions for non-default storage partitions are stored separately in + // memory; delete those as well. + allowed_http_hosts_for_non_default_storage_partitions_.erase(host); +} + +void HttpsOnlyModeAllowlist::Clear( + const HostContentSettingsMap::PatternSourcePredicate& pattern_filter) { + host_content_settings_map_->ClearSettingsForOneTypeWithPredicate( + ContentSettingsType::HTTP_ALLOWED, base::Time(), base::Time::Max(), + pattern_filter); +} + +void HttpsOnlyModeAllowlist::SetClockForTesting(base::Clock* clock) { + clock_ = clock; +} + +void HttpsOnlyModeAllowlist::ClearInMemoryAllowlistForTesting() { + allowed_http_hosts_for_non_default_storage_partitions_.clear(); +} + +} // namespace security_interstitials
diff --git a/components/security_interstitials/core/https_only_mode_allowlist.h b/components/security_interstitials/core/https_only_mode_allowlist.h new file mode 100644 index 0000000..105a8c9 --- /dev/null +++ b/components/security_interstitials/core/https_only_mode_allowlist.h
@@ -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. + +#ifndef COMPONENTS_SECURITY_INTERSTITIALS_CORE_HTTPS_ONLY_MODE_ALLOWLIST_H_ +#define COMPONENTS_SECURITY_INTERSTITIALS_CORE_HTTPS_ONLY_MODE_ALLOWLIST_H_ + +#include <set> + +#include "base/memory/raw_ptr.h" +#include "base/time/time.h" +#include "base/values.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" +#include "url/gurl.h" + +namespace base { +class Clock; +} + +namespace security_interstitials { + +// Stores allowlist decisions for HTTPS-Only Mode. +// A user can allowlist a site by clicking through its HTTPS-Only Mode +// interstitial. For default storage partitions (e.g. non-incognito mode), the +// decision is stored in content settings. Otherwise, it's stored in memory. +class HttpsOnlyModeAllowlist { + public: + HttpsOnlyModeAllowlist(HostContentSettingsMap* host_content_settings_map, + base::Clock* clock, + base::TimeDelta expiration_timeout); + + HttpsOnlyModeAllowlist(const HttpsOnlyModeAllowlist&) = delete; + HttpsOnlyModeAllowlist& operator=(const HttpsOnlyModeAllowlist&) = delete; + + ~HttpsOnlyModeAllowlist(); + + void AllowHttpForHost(const std::string& host, bool is_nondefault_storage); + bool IsHttpAllowedForHost(const std::string& host, + bool is_nondefault_storage) const; + void RevokeUserAllowExceptions(const std::string& host); + void Clear( + const HostContentSettingsMap::PatternSourcePredicate& pattern_filter); + + // Sets the test clock. + void SetClockForTesting(base::Clock* clock); + // Clears the in-memory allowlist. + void ClearInMemoryAllowlistForTesting(); + + private: + HostContentSettingsMap* host_content_settings_map_; + base::Clock* clock_; + base::TimeDelta expiration_timeout_; + + // Tracks sites that are allowed to load over HTTP when HTTPS-First Mode is + // enabled, for non-default storage partitions. Allowed hosts are exact + // hostname matches -- subdomains of a host on the allowlist must be + // separately allowlisted. + // + // In most cases, HTTP interstitial decisions are stored in ContentSettings + // and persisted to disk, like cert decisions. Similar to cert decisions, for + // non-default StoragePartitions the decisions should be isolated from normal + // browsing and don't need to be persisted to disk. For these cases, track + // allowlist decisions purely in memory. + std::set<std::string /* host */> + allowed_http_hosts_for_non_default_storage_partitions_; +}; + +} // namespace security_interstitials + +#endif // COMPONENTS_SECURITY_INTERSTITIALS_CORE_HTTPS_ONLY_MODE_ALLOWLIST_H_
diff --git a/components/services/storage/dom_storage/local_storage_impl.cc b/components/services/storage/dom_storage/local_storage_impl.cc index b35524e8..97f917ac 100644 --- a/components/services/storage/dom_storage/local_storage_impl.cc +++ b/components/services/storage/dom_storage/local_storage_impl.cc
@@ -629,18 +629,6 @@ void LocalStorageImpl::OnDatabaseOpened(leveldb::Status status) { if (!status.ok()) { - UMA_HISTOGRAM_ENUMERATION("LocalStorageContext.DatabaseOpenError", - leveldb_env::GetLevelDBStatusUMAValue(status), - leveldb_env::LEVELDB_STATUS_MAX); - if (in_memory_) { - UMA_HISTOGRAM_ENUMERATION("LocalStorageContext.DatabaseOpenError.Memory", - leveldb_env::GetLevelDBStatusUMAValue(status), - leveldb_env::LEVELDB_STATUS_MAX); - } else { - UMA_HISTOGRAM_ENUMERATION("LocalStorageContext.DatabaseOpenError.Disk", - leveldb_env::GetLevelDBStatusUMAValue(status), - leveldb_env::LEVELDB_STATUS_MAX); - } LogDatabaseOpenResult(OpenResult::DATABASE_OPEN_FAILED); // If we failed to open the database, try to delete and recreate the // database, or ultimately fallback to an in-memory database. @@ -758,9 +746,6 @@ void LocalStorageImpl::OnDBDestroyed(bool recreate_in_memory, leveldb::Status status) { - UMA_HISTOGRAM_ENUMERATION("LocalStorageContext.DestroyDBResult", - leveldb_env::GetLevelDBStatusUMAValue(status), - leveldb_env::LEVELDB_STATUS_MAX); // We're essentially ignoring the status here. Even if destroying failed we // still want to go ahead and try to recreate. InitiateConnection(recreate_in_memory);
diff --git a/components/services/storage/public/cpp/buckets/bucket_init_params.h b/components/services/storage/public/cpp/buckets/bucket_init_params.h index d9cc0e0f..0f309bb 100644 --- a/components/services/storage/public/cpp/buckets/bucket_init_params.h +++ b/components/services/storage/public/cpp/buckets/bucket_init_params.h
@@ -29,7 +29,7 @@ blink::StorageKey storage_key; std::string name{kDefaultBucketName}; - base::Time expiration = base::Time::Max(); + base::Time expiration = base::Time(); int64_t quota = 0; };
diff --git a/components/services/storage/public/mojom/service_worker_database.mojom b/components/services/storage/public/mojom/service_worker_database.mojom index 52da6a3..242c537 100644 --- a/components/services/storage/public/mojom/service_worker_database.mojom +++ b/components/services/storage/public/mojom/service_worker_database.mojom
@@ -11,7 +11,7 @@ import "third_party/blink/public/mojom/service_worker/service_worker_database.mojom"; import "third_party/blink/public/mojom/service_worker/service_worker_registration_options.mojom"; import "third_party/blink/public/mojom/storage_key/storage_key.mojom"; -import "third_party/blink/public/mojom/web_feature/web_feature.mojom"; +import "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom"; import "url/mojom/url.mojom"; // Status code of service worker database operations.
diff --git a/components/services/storage/service_worker/service_worker_database.h b/components/services/storage/service_worker/service_worker_database.h index fd26867..0fb57346 100644 --- a/components/services/storage/service_worker/service_worker_database.h +++ b/components/services/storage/service_worker/service_worker_database.h
@@ -24,7 +24,7 @@ #include "third_party/blink/public/common/storage_key/storage_key.h" #include "third_party/blink/public/mojom/service_worker/navigation_preload_state.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_registration_options.mojom.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "url/gurl.h" #include "url/origin.h"
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 7ecb7a6c..25883d5 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -1956,6 +1956,7 @@ <translation id="6337133576188860026">إخلاء أقل من <ph name="SIZE" />. وقد يتم تحميل بعض المواقع الإلكترونية بشكل أبطأ عند زيارتها في المرة القادمة.</translation> <translation id="6337534724793800597">تصفية السياسات بحسب الاسم</translation> <translation id="6340739886198108203">حسب سياسة المشرف، لا يُنصح بأخذ لقطات شاشة أو تسجيل فيديوهات لمحتوى سرّي معروض على الشاشة:</translation> +<translation id="6348220984832452017">الأنماط المتنوّعة المفعَّلة</translation> <translation id="6349101878882523185">تثبيت <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{ما من كلمات مرور}=1{كلمة مرور واحدة (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}=2{كلمتا مرور (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}few{# كلمات مرور (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}many{# كلمة مرور (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}other{# كلمة مرور (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}}</translation> <translation id="6355392890578844978">لا تتم إدارة هذا المتصفِّح من خلال شركة أو مؤسسة أخرى. وقد تتم إدارة النشاط على هذا الجهاز خارج Chromium. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index 2df449e0..a578c83f 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -1953,6 +1953,7 @@ <translation id="6337133576188860026">Вызваліцца да <ph name="SIZE" />. Некаторыя сайты могуць загружацца павальней пры наступным наведванні.</translation> <translation id="6337534724793800597">Фільтр палітык па назве</translation> <translation id="6340739886198108203">Згодна з зададзенай адміністратарам палітыкай, не рэкамендуецца рабіць здымкі або відэазапісы экрана, калі паказваецца канфідэнцыяльнае змесціва:</translation> +<translation id="6348220984832452017">Дзеючыя варыянты</translation> <translation id="6349101878882523185">Усталяваць праграму "<ph name="APP_NAME" />"</translation> <translation id="6353505687280762741">{COUNT,plural, =0{Няма}=1{1 пароль (для даменаў <ph name="DOMAIN_LIST" />, сінхранізаваны)}=2{2 паролі (для даменаў <ph name="DOMAIN_LIST" />, сінхранізаваны)}one{# пароль (для даменаў <ph name="DOMAIN_LIST" />, сінхранізаваны)}few{# паролі (для даменаў <ph name="DOMAIN_LIST" />, сінхранізаваны)}many{# пароляў (для даменаў <ph name="DOMAIN_LIST" />, сінхранізаваны)}other{# пароля (для даменаў <ph name="DOMAIN_LIST" />, сінхранізаваны)}}</translation> <translation id="6355392890578844978">Гэты браўзер не знаходзіцца пад кіраваннем кампаніі або іншай арганізацыі. Аднак сама прылада можа знаходзіцца пад знешнім кіраваннем. <ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index 40103522..cd9875d 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -1952,6 +1952,7 @@ <translation id="6337133576188860026">Ще освободите по-малко от <ph name="SIZE" />. Някои сайтове може да се заредят по-бавно при следващото ви посещение.</translation> <translation id="6337534724793800597">Филтриране на правилата по име</translation> <translation id="6340739886198108203">Според администраторско правило не се препоръчва правенето на екранни снимки или записи, когато се вижда поверително съдържание:</translation> +<translation id="6348220984832452017">Активни варианти</translation> <translation id="6349101878882523185">Инсталиране на <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Няма}=1{1 парола (за <ph name="DOMAIN_LIST" />, синхронизирана)}=2{2 пароли (за <ph name="DOMAIN_LIST" />, синхронизирани)}other{# пароли (за <ph name="DOMAIN_LIST" />, синхронизирани)}}</translation> <translation id="6355392890578844978">Този браузър не се управлява от дружество или друга организация. Възможно е активността на устройството да се управлява извън Chromium. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 8ecfeba..ffbb9aa 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -1954,6 +1954,7 @@ <translation id="6337133576188860026"><ph name="SIZE" />-এর চেয়ে কম জায়গা খালি করে। পরের বার যখন দেখবেন তখন কিছু সাইট লোড হতে দেরি হতে পারে।</translation> <translation id="6337534724793800597">নাম অনুসারে ফিল্টারগুলি বাছাই করুন</translation> <translation id="6340739886198108203">গোপনীয় কন্টেন্ট দেখা গেলে অ্যাডমিনিস্ট্রেটরের নীতি স্ক্রিনশট নেওয়া অথবা রেকর্ডিং করার সাজেশন দেয় না:</translation> +<translation id="6348220984832452017">অ্যাক্টিভ ভ্যারিয়েশন</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ইনস্টল করুন</translation> <translation id="6353505687280762741">{COUNT,plural, =0{একটিও নয়}=1{১টি পাসওয়ার্ড (<ph name="DOMAIN_LIST" />-এর জন্য, সিঙ্ক করা হয়েছে)}=2{২টি পাসওয়ার্ড (<ph name="DOMAIN_LIST" />-এর জন্য, সিঙ্ক করা হয়েছে)}one{#টি পাসওয়ার্ড (<ph name="DOMAIN_LIST" />-এর জন্য, সিঙ্ক করা হয়েছে)}other{#টি পাসওয়ার্ড (<ph name="DOMAIN_LIST" />-এর জন্য, সিঙ্ক করা হয়েছে)}}</translation> <translation id="6355392890578844978">কোনও কোম্পানি বা অন্য কোনও সংস্থা এই ব্রাউজার ম্যানেজ করে না। এই ডিভাইসের অ্যাক্টিভিটি Chromium-এর বাইরে থেকে ম্যানেজ করা যেতে পারে। <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index 04a023c..2847c5081 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -1954,6 +1954,7 @@ <translation id="6337133576188860026">Oslobodit će se manje od <ph name="SIZE" />. Neke web lokacije će se prilikom sljedeće posjete možda sporije učitavati.</translation> <translation id="6337534724793800597">Filtriraj pravila po nazivu</translation> <translation id="6340739886198108203">Pravila administratora ne preporučuju pravljenje snimaka ekrana niti snimanje kada je vidljiv povjerljiv sadržaj:</translation> +<translation id="6348220984832452017">Aktivne varijacije</translation> <translation id="6349101878882523185">Instalirajte <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Ništa}=1{1 lozinka (za <ph name="DOMAIN_LIST" />, sinhronizirano)}=2{2 lozinke (za <ph name="DOMAIN_LIST" />, sinhronizirano)}one{# lozinka (za <ph name="DOMAIN_LIST" />, sinhronizirano)}few{# lozinke (za <ph name="DOMAIN_LIST" />, sinhronizirano)}other{# lozinki (za <ph name="DOMAIN_LIST" />, sinhronizirano)}}</translation> <translation id="6355392890578844978">Ovim preglednikom ne upravlja kompanija ili neka druga organizacija. Aktivnostima na ovom uređaju se može upravljati van Chromiuma. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index 7eb4116..866e3ac 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -1940,6 +1940,7 @@ <translation id="6337133576188860026">Uvolní méně než <ph name="SIZE" />. Je možné, že se některé weby při příští návštěvě budou načítat pomaleji.</translation> <translation id="6337534724793800597">Filtrovat zásady podle názvu</translation> <translation id="6340739886198108203">Zásady správce nedoporučují pořizování snímků nebo záznamů obrazovky, když je viditelný důvěrný obsah:</translation> +<translation id="6348220984832452017">Aktivní variace</translation> <translation id="6349101878882523185">Nainstalovat aplikaci <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Žádné}=1{1 heslo (pro <ph name="DOMAIN_LIST" />, synchronizováno)}=2{2 hesla (pro <ph name="DOMAIN_LIST" />, synchronizováno)}few{# hesla (pro <ph name="DOMAIN_LIST" />, synchronizováno)}many{# hesla (pro <ph name="DOMAIN_LIST" />, synchronizováno)}other{# hesel (pro <ph name="DOMAIN_LIST" />, synchronizováno)}}</translation> <translation id="6355392890578844978">Tento prohlížeč není spravován administrátorem ani jinou organizací. Aktivita na tomto zařízení může být spravována mimo Chromium. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index 61df32d..e10ae583 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -1954,6 +1954,7 @@ <translation id="6337133576188860026">Yn creu llai na <ph name="SIZE" />. Mae'n bosib y bydd rhai gwefannau yn llwytho'n arafach ar eich ymweliad nesaf.</translation> <translation id="6337534724793800597">Hidlo polisïau yn ôl enw</translation> <translation id="6340739886198108203">Nid yw'r polisi gweinyddwr yn argymell cymryd sgrinluniau na recordiadau pan fydd cynnwys cyfrinachol yn weladwy:</translation> +<translation id="6348220984832452017">Amrywiadau Gweithredol</translation> <translation id="6349101878882523185">Gosod <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Dim}=1{1 cyfrinair (ar gyfer <ph name="DOMAIN_LIST" />, cysonwyd)}=2{2 gyfrinair (ar gyfer <ph name="DOMAIN_LIST" />, cysonwyd)}few{# chyfrinair (ar gyfer <ph name="DOMAIN_LIST" />, cysonwyd)}many{# chyfrinair (ar gyfer <ph name="DOMAIN_LIST" />, cysonwyd)}other{# cyfrinair (ar gyfer <ph name="DOMAIN_LIST" />, cysonwyd)}}</translation> <translation id="6355392890578844978">Nid yw'r porwr hwn yn cael ei reoli gan gwmni neu sefydliad arall. Gellir rheoli gweithgarwch ar y ddyfais hon y tu allan i Chromium. <ph name="BEGIN_LINK" />Dysgu rhagor<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 1cf573f..9feef74f 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -1954,6 +1954,7 @@ <translation id="6337133576188860026">Frigiver mindre end <ph name="SIZE" />. Nogle websites indlæses muligvis langsommere under dit næste besøg.</translation> <translation id="6337534724793800597">Filtrér politikker efter navn</translation> <translation id="6340739886198108203">Administratorpolitikken fraråder screenshots og optagelser, når der vises fortroligt indhold på skærmen:</translation> +<translation id="6348220984832452017">Aktive variationer</translation> <translation id="6349101878882523185">Installer <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Ingen}=1{1 adgangskode (til <ph name="DOMAIN_LIST" /> – synkroniseret)}=2{2 adgangskoder (til <ph name="DOMAIN_LIST" /> – synkroniseret)}one{# adgangskode (til <ph name="DOMAIN_LIST" /> – synkroniseret)}other{# adgangskoder (til <ph name="DOMAIN_LIST" /> – synkroniseret)}}</translation> <translation id="6355392890578844978">Denne browser administreres ikke af en virksomhed eller en anden organisation. Aktivitet på denne enhed administreres muligvis uden for Chromium. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 43a4e27c..0407c2b5 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -1943,6 +1943,7 @@ <translation id="6337133576188860026">Es werden weniger als <ph name="SIZE" /> Speicherplatz freigegeben. Manche Websites werden beim nächsten Öffnen eventuell langsamer geladen.</translation> <translation id="6337534724793800597">Richtlinien nach Name filtern</translation> <translation id="6340739886198108203">Gemäß der Administratorrichtlinie wird nicht empfohlen, Screenshots oder Aufnahmen zu machen, wenn vertrauliche Inhalte zu sehen sind:</translation> +<translation id="6348220984832452017">Aktive Variationen</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> installieren</translation> <translation id="6353505687280762741">{COUNT,plural, =0{Keins}=1{1 Passwort (für <ph name="DOMAIN_LIST" />, synchronisiert)}=2{2 Passwörter (für <ph name="DOMAIN_LIST" />, synchronisiert)}other{# Passwörter (für <ph name="DOMAIN_LIST" />, synchronisiert)}}</translation> <translation id="6355392890578844978">Dieser Browser wird nicht von einem Unternehmen oder einer anderen Organisation verwaltet. Aktivitäten auf diesem Gerät können außerhalb von Chromium verwaltet werden. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index b9a5763da..3024ce8e57 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -1958,6 +1958,7 @@ <translation id="6337133576188860026">Απελευθερώνει λιγότερο από <ph name="SIZE" />. Ορισμένοι ιστότοποι μπορεί να φορτωθούν πιο αργά κατά την επόμενη επίσκεψή σας.</translation> <translation id="6337534724793800597">Φιλτράρισμα πολιτικών με βάση το όνομα</translation> <translation id="6340739886198108203">Η πολιτική διαχειριστή δεν συνιστά τη λήψη στιγμιότυπων οθόνης ή εγγραφών όταν εμπιστευτικό περιεχόμενο είναι ορατό:</translation> +<translation id="6348220984832452017">Ενεργές παραλλαγές</translation> <translation id="6349101878882523185">Εγκατάσταση εφαρμογής <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Κανένας}=1{1 κωδικός πρόσβασης (για <ph name="DOMAIN_LIST" />, συγχρονισμένος)}=2{2 κωδικοί πρόσβασης (για <ph name="DOMAIN_LIST" />, συγχρονισμένοι)}other{# κωδικοί πρόσβασης (για <ph name="DOMAIN_LIST" />, συγχρονισμένοι)}}</translation> <translation id="6355392890578844978">Αυτό το πρόγραμμα περιήγησης δεν είναι διαχειριζόμενο από κάποια εταιρεία ή άλλον οργανισμό. Η διαχείριση της δραστηριότητας σε αυτήν τη συσκευή μπορεί να πραγματοποιηθεί εκτός Chromium. <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index c8af68b..3373608 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -652,6 +652,7 @@ <translation id="2676271551327853224">Roc-8K</translation> <translation id="2677696497921480781">Birthdays and name days</translation> <translation id="2677748264148917807">Leave</translation> +<translation id="2679714844901977852">Save your card and billing info to your Google Account <ph name="USER_EMAIL" /> for secure and faster checkouts</translation> <translation id="2684561033061424857">11x12</translation> <translation id="2687555958734450033">Best fit</translation> <translation id="2688969097326701645">Yes, continue</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 6983161..6b75eebb 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -1946,6 +1946,7 @@ <translation id="6337133576188860026">Esta acción libera menos de <ph name="SIZE" />. Es posible que algunos sitios se carguen más lento en tu próxima visita.</translation> <translation id="6337534724793800597">Filtrar políticas por nombre</translation> <translation id="6340739886198108203">La política del administrador no recomienda grabar pantalla o tomar capturas cuando hay contenido confidencial visible:</translation> +<translation id="6348220984832452017">Variaciones activas</translation> <translation id="6349101878882523185">Instalar <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Ninguna}=1{1 contraseña (para <ph name="DOMAIN_LIST" />, sincronizada)}=2{2 contraseñas (para <ph name="DOMAIN_LIST" />, sincronizadas)}other{# contraseñas (para <ph name="DOMAIN_LIST" />, sincronizadas)}}</translation> <translation id="6355392890578844978">Este navegador no es administrado por una empresa ni por otra organización. Es posible que la actividad correspondiente a este dispositivo se administre fuera de Chromium. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 6838df2..7b477c95 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -1954,6 +1954,7 @@ <translation id="6337133576188860026">Libera menos de <ph name="SIZE" />. Algunos sitios pueden tardar más en cargarse la próxima vez que accedas a ellos.</translation> <translation id="6337534724793800597">Filtrar políticas por nombre</translation> <translation id="6340739886198108203">La política del administrador recomienda no hacer capturas de pantalla o grabaciones cuando se muestra contenido confidencial:</translation> +<translation id="6348220984832452017">Variaciones activas</translation> <translation id="6349101878882523185">Instalar <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Ninguna}=1{1 contraseña de <ph name="DOMAIN_LIST" /> (sincronizada)}=2{2 contraseñas de <ph name="DOMAIN_LIST" /> (sincronizadas)}other{# contraseñas de <ph name="DOMAIN_LIST" /> (sincronizadas)}}</translation> <translation id="6355392890578844978">Ninguna empresa u organización gestiona este navegador. Es posible que la actividad de este dispositivo se gestione fuera de Chromium. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 6362455..b2fd4bac 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -1953,6 +1953,7 @@ <translation id="6337133576188860026">Vabastab alla <ph name="SIZE" />. Mõne saidi laadimine võib järgmisel külastusel rohkem aega võtta.</translation> <translation id="6337534724793800597">Reeglite filtreerimine nime järgi</translation> <translation id="6340739886198108203">Administraatori reegel ei soovita konfidentsiaalse sisu kuvamise ajal jäädvustada ekraanipilte ega salvestisi:</translation> +<translation id="6348220984832452017">Aktiivsed variatsioonid</translation> <translation id="6349101878882523185">Installi <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Puudub}=1{1 parool (loendile <ph name="DOMAIN_LIST" />, sünkroonitud)}=2{2 parooli (loendile <ph name="DOMAIN_LIST" />, sünkroonitud)}other{# parooli (loendile <ph name="DOMAIN_LIST" />, sünkroonitud)}}</translation> <translation id="6355392890578844978">Seda brauserit ei halda ettevõte ega muu organisatsioon. Selle seadme tegevusi võidakse hallata ka väljaspool Chromiumi. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index f7c0fe2..248552a4 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -1940,6 +1940,7 @@ <translation id="6337133576188860026"><ph name="SIZE" /> baino gutxiago utziko ditu libre. Webgune batzuk mantsoago kargatuko dira bisitatzen dituzun hurrengoan.</translation> <translation id="6337534724793800597">Iragazi gidalerroak izenaren arabera</translation> <translation id="6340739886198108203">Administratzailearen gidalerroek ez dute gomendatzen pantaila-argazkirik ateratzea edo grabaketarik egitea isilpeko edukia ikusgai dagoenean:</translation> +<translation id="6348220984832452017">Aldaera aktiboak</translation> <translation id="6349101878882523185">Instalatu <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Bat ere ez}=1{<ph name="DOMAIN_LIST" />: 1 pasahitz (sinkronizatuta)}=2{<ph name="DOMAIN_LIST" />: 2 pasahitz (sinkronizatuta)}other{<ph name="DOMAIN_LIST" />: # pasahitz (sinkronizatuta)}}</translation> <translation id="6355392890578844978">Arakatzailea ez du enpresa edo erakunde batek kudeatzen. Baliteke gailu honetako jarduerak Chromium-etik kanpo kudeatzea. <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index fbf9728f..be259bf 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -1955,6 +1955,7 @@ <translation id="6337133576188860026">Vapauttaa alle <ph name="SIZE" />. Jotkin sivustot saattavat latautua hitaammin seuraavalla käynnillä.</translation> <translation id="6337534724793800597">Suodata käytäntöjä nimen mukaan</translation> <translation id="6340739886198108203">Järjestelmänvalvojakäytännössä ei suositella kuvakaappausten ottamista tai tallenteen kuvaamista, kun luottamuksellinen sisältö on näkyvissä:</translation> +<translation id="6348220984832452017">Aktiiviset muunnelmat</translation> <translation id="6349101878882523185">Asenna <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Ei mitään}=1{1 salasana: (<ph name="DOMAIN_LIST" />, synkronoitu)}=2{2 salasanaa (<ph name="DOMAIN_LIST" />, synkronoitu)}other{# salasanaa (<ph name="DOMAIN_LIST" />, synkronoitu)}}</translation> <translation id="6355392890578844978">Yritys tai muu organisaatio ei ylläpidä selainta. Laitteen toimintaa saatetaan ylläpitää Chromiumin ulkopuolelta. <ph name="BEGIN_LINK" />Lue lisää<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index 12fcfded..7e939e3 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -1945,6 +1945,7 @@ <translation id="6337133576188860026">Libère moins de <ph name="SIZE" />. Certains sites peuvent être plus longs à charger lors de votre prochaine visite.</translation> <translation id="6337534724793800597">Filtrer les règles par nom</translation> <translation id="6340739886198108203">La politique de l'administrateur ne recommande pas de faire des captures d'écran ni des enregistrements lorsque du contenu confidentiel est visible :</translation> +<translation id="6348220984832452017">Variantes actives</translation> <translation id="6349101878882523185">Installer <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Aucun}=1{1 mot de passe (pour <ph name="DOMAIN_LIST" />, synchronisé)}=2{2 mots de passe (pour <ph name="DOMAIN_LIST" />, synchronisés)}one{# mot de passe (pour <ph name="DOMAIN_LIST" />, synchronisé)}other{# mots de passe (pour <ph name="DOMAIN_LIST" />, synchronisés)}}</translation> <translation id="6355392890578844978">Ce navigateur n'est pas géré par une entreprise ni une organisation. L'activité sur cet appareil peut être gérée à l'extérieur de Chromium. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index 6c3f542c..605f4db 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -1954,6 +1954,7 @@ <translation id="6337133576188860026">Libère moins de <ph name="SIZE" />. Le chargement de certains sites risque d'être plus lent lors de votre prochaine visite.</translation> <translation id="6337534724793800597">Filtrer les règles par nom</translation> <translation id="6340739886198108203">Une règle de l'administrateur déconseille de capturer ou d'enregistrer l'écran quand du contenu confidentiel est visible :</translation> +<translation id="6348220984832452017">Variantes actives</translation> <translation id="6349101878882523185">Installer <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Aucun}=1{1 mot de passe (associé à <ph name="DOMAIN_LIST" /> ; synchronisé)}=2{2 mots de passe (associés à <ph name="DOMAIN_LIST" /> ; synchronisés)}one{# mot de passe (associé à <ph name="DOMAIN_LIST" /> ; synchronisé)}other{# mots de passe (associés à <ph name="DOMAIN_LIST" /> ; synchronisés)}}</translation> <translation id="6355392890578844978">Ce navigateur n'est géré par aucune entreprise ni aucune autre organisation. Il se peut que l'activité sur cet appareil soit gérée en dehors de Chromium. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 847f6b0..df9174d 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -1953,6 +1953,7 @@ <translation id="6337133576188860026">Libera menos de <ph name="SIZE" />. É posible que algúns sitios carguen de forma máis lenta a próxima vez que os visites.</translation> <translation id="6337534724793800597">Filtrar políticas por nome</translation> <translation id="6340739886198108203">Na política do administrador recoméndase que non se fagan capturas nin gravacións se na pantalla se mostra contido confidencial:</translation> +<translation id="6348220984832452017">Variacións activas</translation> <translation id="6349101878882523185">Instalar a aplicación <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Ningún}=1{1 contrasinal (para <ph name="DOMAIN_LIST" />, sincronizado)}=2{2 contrasinais (para <ph name="DOMAIN_LIST" />, sincronizados)}other{# contrasinais (para <ph name="DOMAIN_LIST" />, sincronizados)}}</translation> <translation id="6355392890578844978">Ningunha compañía ou organización xestiona este navegador. A actividade deste dispositivo pódese xestionar fóra de Chromium. <ph name="BEGIN_LINK" />Máis información<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 3f7cac60..1b28d15 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -1954,6 +1954,7 @@ <translation id="6337133576188860026">Oslobodit će se <ph name="SIZE" />. Neke bi se web-lokacije pri sljedećem otvaranju mogle sporije učitavati.</translation> <translation id="6337534724793800597">Filtriranje pravila prema nazivu</translation> <translation id="6340739886198108203">Prema pravilima administratora ne preporučuje se izrada snimki zaslona ili snimki kad je vidljiv povjerljiv sadržaj:</translation> +<translation id="6348220984832452017">Aktivne varijacije</translation> <translation id="6349101878882523185">Instalirajte aplikaciju <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Nijedna}=1{Jedna zaporka (za <ph name="DOMAIN_LIST" />, sinkronizirano)}=2{Dvije zaporke (za <ph name="DOMAIN_LIST" />, sinkronizirano)}one{# zaporka (za <ph name="DOMAIN_LIST" />, sinkronizirano)}few{# zaporke (za <ph name="DOMAIN_LIST" />, sinkronizirano)}other{# zaporki (za <ph name="DOMAIN_LIST" />, sinkronizirano)}}</translation> <translation id="6355392890578844978">Preglednikom ne upravlja tvrtka ili neka druga organizacija. Aktivnostima na ovom uređaju možda se upravlja izvan Chromiuma. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index e5f28a1..0b8bf89933 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -1955,6 +1955,7 @@ <translation id="6337133576188860026">Կազատվի մինչև <ph name="SIZE" /> տարածք։ Դրանից հետո որոշ կայքեր հնարավոր է՝ ավելի դանդաղ բեռնվեն։</translation> <translation id="6337534724793800597">Զտել կանոններն ըստ անվան</translation> <translation id="6340739886198108203">Ադմինիստրատորը խորհուրդ չի տալիս սքրինշոթներ կամ տեսագրություններ անել, երբ էկրանին կոնֆիդենցիալ բովանդակություն է երևում։</translation> +<translation id="6348220984832452017">Ընթացիկ տարբերակներ</translation> <translation id="6349101878882523185">Տեղադրել <ph name="APP_NAME" /> հավելվածը</translation> <translation id="6353505687280762741">{COUNT,plural, =0{Չկա}=1{1 գաղտնաբառ (հետևյալ տիրույթների համար՝ <ph name="DOMAIN_LIST" />, համաժամացված է)}=2{2 գաղտնաբառ (հետևյալ տիրույթների համար՝ <ph name="DOMAIN_LIST" />, համաժամացված են)}one{# գաղտնաբառ (հետևյալ տիրույթների համար՝ <ph name="DOMAIN_LIST" />, համաժամացված են)}other{# գաղտնաբառ (հետևյալ տիրույթների համար՝ <ph name="DOMAIN_LIST" />, համաժամացված են)}}</translation> <translation id="6355392890578844978">Ձեր դիտարկիչը չի կառավարվում որևէ ընկերության կամ կազմակերպության կողմից։ Սարքում արվող գործողությունները կարող են կառավարվել Chromium-ից դուրս։ <ph name="BEGIN_LINK" />Իմանալ ավելին<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 767e2e8..d815593 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -1944,6 +1944,7 @@ <translation id="6337133576188860026">Sediakan ruang kurang dari <ph name="SIZE" />. Beberapa situs mungkin dimuat lebih lambat saat dibuka lagi.</translation> <translation id="6337534724793800597">Filter kebijakan menurut nama</translation> <translation id="6340739886198108203">Kebijakan administrator tidak merekomendasikan untuk mengambil screenshot atau merekam layar saat konten rahasia terlihat:</translation> +<translation id="6348220984832452017">Variasi Aktif</translation> <translation id="6349101878882523185">Instal <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Tidak ada}=1{1 sandi (untuk <ph name="DOMAIN_LIST" />, disinkronkan)}=2{2 sandi (untuk <ph name="DOMAIN_LIST" />, disinkronkan)}other{# sandi (untuk <ph name="DOMAIN_LIST" />, disinkronkan)}}</translation> <translation id="6355392890578844978">Browser ini tidak dikelola oleh perusahaan atau organisasi lain. Aktivitas di perangkat ini mungkin dikelola di luar Chromium. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index 8b96303..9dee3fb 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -1954,6 +1954,7 @@ <translation id="6337133576188860026">Losar minna en <ph name="SIZE" />. Lengri tíma gæti tekið að sækja sum vefsvæði þegar þú heimsækir þau næst.</translation> <translation id="6337534724793800597">Sía reglur eftir heiti</translation> <translation id="6340739886198108203">Regla kerfisstjóra ræður gegn því að taka skjámyndir eða taka upp þegar trúnaðarupplýsingar eru sýnilegar:</translation> +<translation id="6348220984832452017">Virk afbrigði</translation> <translation id="6349101878882523185">Setja upp <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Ekkert}=1{1 aðgangsorð (fyrir <ph name="DOMAIN_LIST" />, samstillt)}=2{2 aðgangsorð fyrir (<ph name="DOMAIN_LIST" />, samstillt)}one{# aðgangsorð (fyrir <ph name="DOMAIN_LIST" />, samstillt)}other{# aðgangsorð (fyrir <ph name="DOMAIN_LIST" />, samstillt)}}</translation> <translation id="6355392890578844978">Þessi vafri er ekki í umsjón fyrirtækis eða stofnunar Hægt er að hafa umsjón með aðgerðum í þessu tæki utan Chromium. <ph name="BEGIN_LINK" />Nánar<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 8cabd3a..a011038 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -1957,6 +1957,7 @@ <translation id="6337133576188860026">פינוי של פחות מ-<ph name="SIZE" /> מהנפח. ייתכן שחלק מהאתרים ייטענו לאט יותר בביקור הבא שלך.</translation> <translation id="6337534724793800597">סינון מדיניות לפי שם</translation> <translation id="6340739886198108203">בהתאם למדיניות של מנהל המערכת, לא מומלץ לצלם צילומי מסך או הקלטות כשתוכן סודי גלוי:</translation> +<translation id="6348220984832452017">הגרסאות הפעילות</translation> <translation id="6349101878882523185">התקנת <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{אין}=1{סיסמה אחת (עבור <ph name="DOMAIN_LIST" />, מסונכרנת)}=2{שתי סיסמאות (עבור <ph name="DOMAIN_LIST" />, מסונכרנות)}many{# סיסמאות (עבור <ph name="DOMAIN_LIST" />, מסונכרנות)}other{# סיסמאות (עבור <ph name="DOMAIN_LIST" />, מסונכרנות)}}</translation> <translation id="6355392890578844978">הדפדפן הזה לא מנוהל על ידי חברה או ארגון אחר. ייתכן שהפעילות במכשיר הזה מנוהלת מחוץ ל-Chromium. <ph name="BEGIN_LINK" />למידע נוסף<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index 5c6860e1..f6da77e 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -1945,6 +1945,7 @@ <translation id="6337133576188860026">გამოთავისუფლდება <ph name="SIZE" /> ან ნაკლები. ზოგიერთი საიტი შემდეგი მონახულებისას შეიძლება უფრო ნელა ჩაიტვირთოს.</translation> <translation id="6337534724793800597">ფილტრის წესები სახელის მიხედვით</translation> <translation id="6340739886198108203">ადმინისტრატორის წესების მიხედვით, ეკრანის ანაბეჭდების ან ჩანაწერების გაკეთება არ არის რეკომენდებული, როცა ხილულია კონფიდენციალური კონტენტი:</translation> +<translation id="6348220984832452017">აქტიური ვარიაციები</translation> <translation id="6349101878882523185"><ph name="APP_NAME" />-ის ინსტალაცია</translation> <translation id="6353505687280762741">{COUNT,plural, =0{არცერთი}=1{1 პაროლი (<ph name="DOMAIN_LIST" />-ისთვის, სინქრონიზებული)}=2{2 პაროლი (<ph name="DOMAIN_LIST" />-ისთვის, სინქრონიზებული)}other{# პაროლი (<ph name="DOMAIN_LIST" />-ისთვის, სინქრონიზებული)}}</translation> <translation id="6355392890578844978">ამ ბრაუზერს არ მართავს კომპანია და არც სხვა ორგანიზაცია. ამ მოწყობილობაზე აქტივობა შეიძლება იმართებოდეს Chromium-ს მიღმა. <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index d3f8f853..a15323b 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -1953,6 +1953,7 @@ <translation id="6337133576188860026"><ph name="SIZE" /> аз орын босатады .Кейбір сайттар келесі кіргенде баяуырақ жүктелуі мүмкін.</translation> <translation id="6337534724793800597">Атауы бойынша сүзгі саясаттары</translation> <translation id="6340739886198108203">Әкімші саясаты құпия мазмұн көрсетілген кезде, скриншот жасауды немесе жазуды ұсынбайды.</translation> +<translation id="6348220984832452017">Белсенді нұсқалар</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> қолданбасын орнату</translation> <translation id="6353505687280762741">{COUNT,plural, =0{Жоқ}=1{1 құпия сөз (<ph name="DOMAIN_LIST" />, синхрондалды)}=2{2 құпия сөз (<ph name="DOMAIN_LIST" />, синхрондалды)}other{# құпия сөз (<ph name="DOMAIN_LIST" />, синхрондалды)}}</translation> <translation id="6355392890578844978">Бұл браузер компания немесе басқа ұйым арқылы басқарылмайды. Құрылғыдағы әрекет Chromium браузерінен тыс басқарылуы мүмкін. <ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 2ec124b..4f46b197 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -1943,6 +1943,7 @@ <translation id="6337133576188860026"><ph name="SIZE" /> ಕ್ಕಿಂತ ಕಡಿಮೆ ಇರುವುದನ್ನು ತೆಗೆದುಹಾಕಿ. ನಿಮ್ಮ ನಂತರದ ಭೇಟಿಯ ಸಮಯದಲ್ಲಿ ಕೆಲವು ಸೈಟ್ಗಳು ನಿಧಾನವಾಗಿ ಲೋಡ್ ಆಗಬಹುದು.</translation> <translation id="6337534724793800597">ಹೆಸರಿನ ಪ್ರಕಾರವಾಗಿ ನೀತಿಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡಿ</translation> <translation id="6340739886198108203">ನಿರ್ವಾಹಕರ ನೀತಿಯು ಗೌಪ್ಯ ವಿಷಯ ಕಾಣಿಸುತ್ತಿರುವಾಗ ಸ್ಕ್ರೀನ್ಶಾಟ್ಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುವುದನ್ನು ಮತ್ತು ರೆಕಾರ್ಡ್ ಮಾಡುವುದನ್ನು ಶಿಫಾರಸು ಮಾಡುವುದಿಲ್ಲ:</translation> +<translation id="6348220984832452017">ಸಕ್ರಿಯ ವ್ಯತ್ಯಾಸಗಳು</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ</translation> <translation id="6353505687280762741">{COUNT,plural, =0{ಒಂದೂ ಇಲ್ಲ}=1{1 ಪಾಸ್ವರ್ಡ್ (<ph name="DOMAIN_LIST" /> ಗೆ ಸಂಬಂಧಿಸಿದ್ದು, ಅದನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆ)}=2{2 ಪಾಸ್ವರ್ಡ್ಗಳು (<ph name="DOMAIN_LIST" /> ಗೆ ಸಂಬಂಧಿಸಿದ್ದು, ಅವುಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆ)}one{# ಪಾಸ್ವರ್ಡ್ಗಳು (<ph name="DOMAIN_LIST" /> ಗೆ ಸಂಬಂಧಿಸಿದ್ದು, ಅವುಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆ)}other{# ಪಾಸ್ವರ್ಡ್ಗಳು (<ph name="DOMAIN_LIST" /> ಗೆ ಸಂಬಂಧಿಸಿದ್ದು, ಅವುಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗಿದೆ)}}</translation> <translation id="6355392890578844978">ಈ ಬ್ರೌಸರ್ ಅನ್ನು ಕಂಪನಿ ಅಥವಾ ಇತರ ಸಂಸ್ಥೆಯು ನಿರ್ವಹಿಸುತ್ತಿಲ್ಲ. ಈ ಸಾಧನದಲ್ಲಿನ ಚಟುವಟಿಕೆಯನ್ನು Chromium ನಿಂದ ಹೊರಗೆ ನಿರ್ವಹಿಸಬಹುದು. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index abc84b0..a92253e 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -1954,6 +1954,7 @@ <translation id="6337133576188860026">ຂະຫຍາຍພື້ນທີ່ຫວ່າງໄດ້ໜ້ອຍກວ່າ <ph name="SIZE" />. ບາງເວັບໄຊອາດຈະໂຫຼດຊ້າກວ່າໃນການເຂົ້າເບິ່ງຄັ້ງຕໍ່ໄປຂອງທ່ານ.</translation> <translation id="6337534724793800597">ກັ່ນຕອງນະໂຍບາຍຕາມຊື່</translation> <translation id="6340739886198108203">ນະໂຍບາຍຜູ້ເບິ່ງແຍງລະບົບບໍ່ແນະນຳໃຫ້ຖ່າຍຮູບ ຫຼື ບັນທຶກໜ້າຈໍໃນເວລາປາກົດມີເນື້ອຫາທີ່ເປັນຄວາມລັບ:</translation> +<translation id="6348220984832452017">ຮູບແບບທີ່ນຳໃຊ້ຢູ່</translation> <translation id="6349101878882523185">ຕິດຕັ້ງ <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{ບໍ່ມີ}=1{1 ລະຫັດຜ່ານ (ສຳລັບ <ph name="DOMAIN_LIST" />, ຊິ້ງຂໍ້ມູນແລ້ວ)}=2{2 ລະຫັດຜ່ານ (ສຳລັບ <ph name="DOMAIN_LIST" />, ຊິ້ງຂໍ້ມູນແລ້ວ)}other{# ລະຫັດຜ່ານ (ສຳລັບ <ph name="DOMAIN_LIST" />, ຊິ້ງຂໍ້ມູນແລ້ວ)}}</translation> <translation id="6355392890578844978">ໂປຣແກຣມທ່ອງເວັບນີ້ບໍ່ໄດ້ຖືກຈັດການໂດຍບໍລິສັດ ຫຼື ອົງການອື່ນ. ການເຄື່ອນໄຫວຢູ່ອຸປະກອນນີ້ອາດຖືກຈັດການຢູ່ນອກ Chromium ໄດ້. <ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index e4c5673f..b5cb2905 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -1955,6 +1955,7 @@ <translation id="6337133576188860026">Atlaisvina mažiau nei <ph name="SIZE" />. Per kitą jūsų apsilankymą kai kurios svetainės gali būti įkeliamos lėčiau.</translation> <translation id="6337534724793800597">Filtruoti politiką pagal pavadinimą</translation> <translation id="6340739886198108203">Pagal administratoriaus politikos nuostatas nerekomenduojama daryti ekrano kopijų arba įrašyti, kai matomas konfidencialus turinys.</translation> +<translation id="6348220984832452017">Aktyvūs variantai</translation> <translation id="6349101878882523185">Įdiegti <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Nėra}=1{1 slaptažodis (skirta <ph name="DOMAIN_LIST" />, sinchronizuojama)}=2{2 slaptažodžiai (skirta <ph name="DOMAIN_LIST" />, sinchronizuojama)}one{# slaptažodis (skirta <ph name="DOMAIN_LIST" />, sinchronizuojama)}few{# slaptažodžiai (skirta <ph name="DOMAIN_LIST" />, sinchronizuojama)}many{# slaptažodžio (skirta <ph name="DOMAIN_LIST" />, sinchronizuojama)}other{# slaptažodžių (skirta <ph name="DOMAIN_LIST" />, sinchronizuojama)}}</translation> <translation id="6355392890578844978">Šios naršyklės netvarko įmonė ar kita organizacija. Veiklą šiame įrenginyje galima tvarkyti ne naršyklėje „Chromium“. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index 3ba373a..ad297404c 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -1955,6 +1955,7 @@ <translation id="6337133576188860026">Mengosongkan kurang daripada <ph name="SIZE" />. Sesetengah tapak mungkin dimuatkan dengan lebih perlahan pada lawatan anda yang seterusnya.</translation> <translation id="6337534724793800597">Tapis dasar mengikut nama</translation> <translation id="6340739886198108203">Dasar pentadbir tidak mengesyorkan mengambil tangkapan skrin atau rakaman apabila kandungan sulit kelihatan:</translation> +<translation id="6348220984832452017">Variasi Aktif</translation> <translation id="6349101878882523185">Pasang <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Tiada}=1{1 kata laluan (untuk <ph name="DOMAIN_LIST" />, disegerakkan)}=2{2 kata laluan (untuk <ph name="DOMAIN_LIST" />, disegerakkan)}other{# kata laluan (untuk <ph name="DOMAIN_LIST" />, disegerakkan)}}</translation> <translation id="6355392890578844978">Penyemak imbas ini tidak diurus oleh syarikat atau organisasi lain. Aktiviti pada peranti ini mungkin diurus di luar Chromium. <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index fdf7f87..2469992 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -1941,6 +1941,7 @@ <translation id="6337133576188860026"><ph name="SIZE" /> ਤੋਂ ਘੱਟ ਜਗ੍ਹਾ ਖਾਲੀ ਕਰਦਾ ਹੈ। ਤੁਹਾਡੀ ਅਗਲੀ ਫੇਰੀ 'ਤੇ ਕੁਝ ਸਾਈਟਾਂ ਵਧੇਰੇ ਹੌਲੀ ਲੋਡ ਹੋ ਸਕਦੀਆਂ ਹਨ।</translation> <translation id="6337534724793800597">ਨਾਮ ਮੁਤਾਬਕ ਨੀਤੀਆਂ ਫਿਲਟਰ ਕਰੋ</translation> <translation id="6340739886198108203">ਗੁਪਤ ਸਮੱਗਰੀ ਦੇ ਦਿਸਣਯੋਗ ਹੋਣ 'ਤੇ ਪ੍ਰਸ਼ਾਸਕ ਨੀਤੀ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਜਾਂ ਰਿਕਾਰਡਿੰਗਾਂ ਕਰਨ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਨਹੀਂ ਕਰਦੀ ਹੈ:</translation> +<translation id="6348220984832452017">ਕਿਰਿਆਸ਼ੀਲ ਭਿੰਨਤਾਵਾਂ</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ਸਥਾਪਤ ਕਰੋ</translation> <translation id="6353505687280762741">{COUNT,plural, =0{ਕੋਈ ਨਹੀਂ}=1{1 ਪਾਸਵਰਡ (<ph name="DOMAIN_LIST" /> ਲਈ, ਸਿੰਕ ਕੀਤਾ ਗਿਆ)}=2{2 ਪਾਸਵਰਡ (<ph name="DOMAIN_LIST" /> ਲਈ, ਸਿੰਕ ਕੀਤੇ ਗਏ)}other{# ਪਾਸਵਰਡ (<ph name="DOMAIN_LIST" /> ਲਈ, ਸਿੰਕ ਕੀਤੇ ਗਏ)}}</translation> <translation id="6355392890578844978">ਇਹ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਿਸੇ ਕੰਪਨੀ ਜਾਂ ਹੋਰ ਸੰਸਥਾ ਵੱਲੋਂ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਇਸ ਡੀਵਾਈਸ ਦੀ ਸਰਗਰਮੀ ਦਾ ਪ੍ਰਬੰਧਨ Chromium ਤੋਂ ਬਾਹਰ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index dd013f315..4317b28 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -1945,6 +1945,7 @@ <translation id="6337133576188860026">Libera menos de <ph name="SIZE" />. O carregamento de alguns sites pode ficar mais lento no seu próximo acesso.</translation> <translation id="6337534724793800597">Filtrar políticas por nome</translation> <translation id="6340739886198108203">A política do administrador não recomenda fazer capturas de tela ou gravações quando há conteúdo confidencial visível:</translation> +<translation id="6348220984832452017">Variações ativas</translation> <translation id="6349101878882523185">Instalar <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Nenhuma}=1{1 senha (para <ph name="DOMAIN_LIST" />, sincronizada)}=2{2 senhas (para <ph name="DOMAIN_LIST" />, sincronizadas)}one{# senha (para <ph name="DOMAIN_LIST" />, sincronizada)}other{# senhas (para <ph name="DOMAIN_LIST" />, sincronizadas)}}</translation> <translation id="6355392890578844978">Este navegador não é gerenciado por uma empresa ou outra organização. A atividade deste dispositivo pode ser gerenciada fora do Chromium. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index fafa67a3..cab61e3f 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -1954,6 +1954,7 @@ <translation id="6337133576188860026">Liberta menos de <ph name="SIZE" />. É possível que alguns sites sejam carregados mais lentamente na sua próxima visita.</translation> <translation id="6337534724793800597">Filtrar políticas pelo nome</translation> <translation id="6340739886198108203">A política do administrador não recomenda fazer capturas de ecrã nem gravações quando existe conteúdo confidencial visível:</translation> +<translation id="6348220984832452017">Variações ativas</translation> <translation id="6349101878882523185">Instale a aplicação <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Nenhuma}=1{1 palavra-passe (de <ph name="DOMAIN_LIST" />, sincronizada)}=2{2 palavras-passe (de <ph name="DOMAIN_LIST" />, sincronizadas)}other{# palavras-passe (de <ph name="DOMAIN_LIST" />, sincronizadas)}}</translation> <translation id="6355392890578844978">Este navegador não é gerido por uma empresa ou outra entidade. A atividade neste dispositivo pode ser gerida fora do Chromium. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 2cdb7a2..cb1f034 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -1944,6 +1944,7 @@ <translation id="6337133576188860026">Освободится менее <ph name="SIZE" /> пространства. После этого некоторые веб-страницы могут загружаться дольше обычного.</translation> <translation id="6337534724793800597">Фильтровать правила по названию</translation> <translation id="6340739886198108203">Администратор не рекомендует делать снимки и видеозаписи экрана, когда на нем показаны конфиденциальные данные:</translation> +<translation id="6348220984832452017">Текущие изменения</translation> <translation id="6349101878882523185">Установить приложение "<ph name="APP_NAME" />"</translation> <translation id="6353505687280762741">{COUNT,plural, =0{Нет}=1{1 пароль (для <ph name="DOMAIN_LIST" />, синхронизировано)}=2{2 пароля (для <ph name="DOMAIN_LIST" />, синхронизировано)}one{# пароль (для <ph name="DOMAIN_LIST" />, синхронизировано)}few{# пароля (для <ph name="DOMAIN_LIST" />, синхронизировано)}many{# паролей (для <ph name="DOMAIN_LIST" />, синхронизировано)}other{# пароля (для <ph name="DOMAIN_LIST" />, синхронизировано)}}</translation> <translation id="6355392890578844978">Компания или организация не управляет этим браузером. Действиями на этом устройстве можно управлять вне браузера Chromium. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index 2e17145e..d1498a4 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -1951,6 +1951,7 @@ <translation id="6337133576188860026"><ph name="SIZE" />ට වඩා අඩුවෙන් හිස් කරයි. ඔබගේ ඊළඟ පිවිසීමේදී සමහර අඩවි වඩාත් සෙමින් පූරණය විය හැකිය.</translation> <translation id="6337534724793800597">නම් වශයෙන් ප්රතිපත්ති පෙරන්න</translation> <translation id="6340739886198108203">පරිපාලක ප්රතිපත්තිය රහසිගත අන්තර්ගතය දෘශ්යමාන වන විට තිරපිටපත් හෝ පටිගත කිරීම් ගැනීම නිර්දේශ නොකරයි:</translation> +<translation id="6348220984832452017">සක්රිය විචලන</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ස්ථාපන කරන්න</translation> <translation id="6353505687280762741">{COUNT,plural, =0{කිසිවක් නැත}=1{1 මුරපදයක් (<ph name="DOMAIN_LIST" /> සඳහා, සමමුහූර්තයි)}=2{මුරපද 2 ක් (<ph name="DOMAIN_LIST" /> සඳහා, සමමුහූර්තයි)}one{මුරපද # ක් (<ph name="DOMAIN_LIST" /> සඳහා, සමමුහූර්තයි)}other{මුරපද # ක් (<ph name="DOMAIN_LIST" /> සඳහා, සමමුහූර්තයි)}}</translation> <translation id="6355392890578844978">මෙම බ්රවුසරය සමාගමකින් හෝ වෙනත් සංවිධානයකින් කළමනාකරණය නොකරයි. මෙම උපාංගයේ ක්රියාකාරකම් Chromium වෙතින් බැහැරව කළමනාකරණය කිරීමට හැකිය. <ph name="BEGIN_LINK" />තව දැන ගන්න<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 73a2ed0..6b0545c 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -1954,6 +1954,7 @@ <translation id="6337133576188860026">Sprosti manj kot <ph name="SIZE" />. Nekatera spletna mesta se bodo ob naslednjem obisku morda počasneje naložila.</translation> <translation id="6337534724793800597">Filtriraj pravilnike po imenu</translation> <translation id="6340739886198108203">Pravilnik skrbnika ne priporoča ustvarjanja posnetkov zaslona ali videoposnetkov, ko je vidna zaupna vsebina:</translation> +<translation id="6348220984832452017">Aktivne različice</translation> <translation id="6349101878882523185">Namestite <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Nič}=1{Eno geslo (za <ph name="DOMAIN_LIST" />, sinhronizirano)}=2{Dve gesli (za <ph name="DOMAIN_LIST" />, sinhronizirano)}one{# geslo (za <ph name="DOMAIN_LIST" />, sinhronizirano)}two{# gesli (za <ph name="DOMAIN_LIST" />, sinhronizirano)}few{# gesla (za <ph name="DOMAIN_LIST" />, sinhronizirano)}other{# gesel (za <ph name="DOMAIN_LIST" />, sinhronizirano)}}</translation> <translation id="6355392890578844978">Tega brskalnika ne upravlja podjetje ali druga organizacija. Dejavnost v tej napravi morda upravljajo zunaj Chromiuma. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index b3c372a..6804667 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -1950,6 +1950,7 @@ <translation id="6337133576188860026">Liron më pak se <ph name="SIZE" />. Disa sajte mund të ngarkohen më ngadalë gjatë vizitës tënde të radhës.</translation> <translation id="6337534724793800597">Filtro politikat sipas emrit</translation> <translation id="6340739886198108203">Politika e administratorit nuk rekomandon nxjerrjen e pamjeve të ekranit apo regjistrimeve kur përmbajtja konfidenciale është e dukshme:</translation> +<translation id="6348220984832452017">Variantet aktive</translation> <translation id="6349101878882523185">Instalo <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Asnjë}=1{1 fjalëkalim (për <ph name="DOMAIN_LIST" />, sinkronizuar)}=2{2 fjalëkalime (për <ph name="DOMAIN_LIST" />, sinkronizuar)}other{# fjalëkalime (për <ph name="DOMAIN_LIST" />, sinkronizuar)}}</translation> <translation id="6355392890578844978">Ky shfletues nuk menaxhohet nga një kompani ose organizatë tjetër. Aktiviteti në këtë pajisje mund të menaxhohet jashtë Chromium. <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 285fd8fa..f4ed124 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -1953,6 +1953,7 @@ <translation id="6337133576188860026">Oslobađa manje od <ph name="SIZE" />. Neki sajtovi će se možda sporije učitavati kad ih sledeći put posetite.</translation> <translation id="6337534724793800597">Filtriraj smernice prema nazivu</translation> <translation id="6340739886198108203">Smernice administratora ne preporučuju pravljenje snimaka ekrana ili snimaka kada je poverljiv sadržaj vidljiv:</translation> +<translation id="6348220984832452017">Aktivne varijacije</translation> <translation id="6349101878882523185">Instalirajte <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Nijedna}=1{1 lozinka (za <ph name="DOMAIN_LIST" />, sinhronizovano)}=2{2 lozinke (za <ph name="DOMAIN_LIST" />, sinhronizovano)}one{# lozinka (za <ph name="DOMAIN_LIST" />, sinhronizovano)}few{# lozinke (za <ph name="DOMAIN_LIST" />, sinhronizovano)}other{# lozinki (za <ph name="DOMAIN_LIST" />, sinhronizovano)}}</translation> <translation id="6355392890578844978">Ovim pregledačem ne upravlja kompanija niti druga organizacija. Aktivnostima na ovom uređaju se možda upravlja van Chromium-a. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index e9488923..831f7065 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -1953,6 +1953,7 @@ <translation id="6337133576188860026">Ослобађа мање од <ph name="SIZE" />. Неки сајтови ће се можда спорије учитавати кад их следећи пут посетите.</translation> <translation id="6337534724793800597">Филтрирај смернице према називу</translation> <translation id="6340739886198108203">Смернице администратора не препоручују прављење снимака екрана или снимака када је поверљив садржај видљив:</translation> +<translation id="6348220984832452017">Активне варијације</translation> <translation id="6349101878882523185">Инсталирајте <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Ниједна}=1{1 лозинка (за <ph name="DOMAIN_LIST" />, синхронизовано)}=2{2 лозинке (за <ph name="DOMAIN_LIST" />, синхронизовано)}one{# лозинка (за <ph name="DOMAIN_LIST" />, синхронизовано)}few{# лозинке (за <ph name="DOMAIN_LIST" />, синхронизовано)}other{# лозинки (за <ph name="DOMAIN_LIST" />, синхронизовано)}}</translation> <translation id="6355392890578844978">Овим прегледачем не управља компанија нити друга организација. Активностима на овом уређају се можда управља ван Chromium-а. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index ff41d93..5542d5f 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -1954,6 +1954,7 @@ <translation id="6337133576188860026">Frigör mindre än <ph name="SIZE" />. Vissa webbplatser kan läsas in långsammare nästa gång du besöker dem.</translation> <translation id="6337534724793800597">Filtrera princip efter namn</translation> <translation id="6340739886198108203">Enligt administratörspolicyn är det inte rekommenderat att ta skärmbilder eller göra inspelningar när konfidentiellt innehåll är synligt:</translation> +<translation id="6348220984832452017">Aktiva variationer</translation> <translation id="6349101878882523185">Installera <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Inga}=1{1 lösenord (för <ph name="DOMAIN_LIST" />, synkroniseras)}=2{2 lösenord (för <ph name="DOMAIN_LIST" />, synkroniseras)}other{# lösenord (för <ph name="DOMAIN_LIST" />, synkroniseras)}}</translation> <translation id="6355392890578844978">Den här webbläsaren hanteras inte av ett företag eller en organisation. Aktiviteter på den här enheten kan hanteras utanför Chromium. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index ac82065..5ff5884 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -1953,6 +1953,7 @@ <translation id="6337133576188860026">Huongeza nafasi isiyozidi <ph name="SIZE" />. Baadhi ya tovuti huenda zikapakia polepole zaidi utakapozivinjari tena.</translation> <translation id="6337534724793800597">Chuja sera kwa jina</translation> <translation id="6340739886198108203">Sera ya msimamizi haipendekezi kurekodi au kupiga picha za skrini wakati maudhui ya siri yanaonekana:</translation> +<translation id="6348220984832452017">Aina Zinazotumika</translation> <translation id="6349101878882523185">Sakinisha <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Hamna}=1{Nenosiri 1 (la <ph name="DOMAIN_LIST" />, limesawazishwa)}=2{Manenosiri 2 (ya <ph name="DOMAIN_LIST" />, yamesawazishwa)}other{Manenosiri # (ya <ph name="DOMAIN_LIST" />, yamesawazishwa)}}</translation> <translation id="6355392890578844978">Kivinjari hiki hakidhibitiwi na kampuni au shirika lingine. Huenda shughuli kwenye kifaa hiki zikadhibitiwa nje ya Chromium. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index f86056d..b3ed383c 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -1947,6 +1947,7 @@ <translation id="6337133576188860026"><ph name="SIZE" /> boyutundan daha az yer açar. Bir sonraki ziyaretinizde bazı siteler daha yavaş yüklenebilir.</translation> <translation id="6337534724793800597">Politikalara ada göre filtre uygula</translation> <translation id="6340739886198108203">Yönetici politikası, gizli içerik görünür olduğunda ekran görüntüsü veya kayıt alınmasını önermiyor:</translation> +<translation id="6348220984832452017">Etkin Varyasyonlar</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> uygulamasını yükle</translation> <translation id="6353505687280762741">{COUNT,plural, =0{Yok}=1{1 şifre (<ph name="DOMAIN_LIST" /> için, senkronize edildi)}=2{2 şifre (<ph name="DOMAIN_LIST" /> için, senkronize edildi)}other{# şifre (<ph name="DOMAIN_LIST" /> için, senkronize edildi)}}</translation> <translation id="6355392890578844978">Bu tarayıcı bir şirket veya başka bir kuruluş tarafından yönetilmemektedir. Bu cihazdaki etkinlikler Chromium dışında yönetilebilir. <ph name="BEGIN_LINK" />Daha fazla bilgi<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index e14510e..788ea4f 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -1948,6 +1948,7 @@ <translation id="6337133576188860026">Xotirada <ph name="SIZE" /> tozalandi. Bundan keyin ba’zi veb-saytlar sekinroq yuklanishi mumkin.</translation> <translation id="6337534724793800597">Qoidalarni nomi bo‘yicha filtrlash</translation> <translation id="6340739886198108203">Maxfiy kontent koʻringanda administrator skrinshot olish yoki yozib olishni tavsiya qilmaydi:</translation> +<translation id="6348220984832452017">Joriy oʻzgarishlar</translation> <translation id="6349101878882523185"><ph name="APP_NAME" /> ilovasini oʻrnatish</translation> <translation id="6353505687280762741">{COUNT,plural, =0{Hech qanday}=1{1 ta parol (<ph name="DOMAIN_LIST" /> uchun, sinxronlandi)}=2{2 ta parol (<ph name="DOMAIN_LIST" /> uchun, sinxronlandi)}other{# ta parol (<ph name="DOMAIN_LIST" /> uchun, sinxronlandi)}}</translation> <translation id="6355392890578844978">Bu brauzer kompaniya yoki tashkilot boshqaruvida emas. Bu qurilmadagi amallar Chromiumdan tashqarida boshqarilishi mumkin. <ph name="BEGIN_LINK" />Batafsil<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 8081c96..86ed8ba 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -1954,6 +1954,7 @@ <translation id="6337133576188860026">Bộ nhớ đệm còn chưa đầy <ph name="SIZE" />. Một số trang web có thể tải chậm hơn vào lần tới bạn truy cập.</translation> <translation id="6337534724793800597">Lọc chính sách theo tên</translation> <translation id="6340739886198108203">Chính sách của quản trị viên không khuyến khích chụp ảnh màn hình hoặc ghi âm khi đang có nội dung bảo mật trên màn hình:</translation> +<translation id="6348220984832452017">Biến thể đang hoạt động</translation> <translation id="6349101878882523185">Cài đặt <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{Không có}=1{1 mật khẩu (cho <ph name="DOMAIN_LIST" />, đã đồng bộ hóa)}=2{2 mật khẩu (cho <ph name="DOMAIN_LIST" />, đã đồng bộ hóa)}other{# mật khẩu (cho <ph name="DOMAIN_LIST" />, đã đồng bộ hóa)}}</translation> <translation id="6355392890578844978">Không có công ty hay tổ chức nào quản lý trình duyệt này. Hoạt động trên thiết bị này có thể được quản lý ở bên ngoài Chromium. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 92320dd..44c7b59 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -1940,6 +1940,7 @@ <translation id="6337133576188860026">释放不到 <ph name="SIZE" /> 空间。当您下次访问时,某些网站的加载速度可能会更慢。</translation> <translation id="6337534724793800597">按名称过滤政策</translation> <translation id="6340739886198108203">管理员政策不建议在屏幕显示机密内容时截屏/录屏:</translation> +<translation id="6348220984832452017">使用中的变体</translation> <translation id="6349101878882523185">安装“<ph name="APP_NAME" />”</translation> <translation id="6353505687280762741">{COUNT,plural, =0{无}=1{1 个密码(用于 <ph name="DOMAIN_LIST" />,已同步)}=2{2 个密码(用于 <ph name="DOMAIN_LIST" />,已同步)}other{# 个密码(用于 <ph name="DOMAIN_LIST" />,已同步)}}</translation> <translation id="6355392890578844978">此浏览器并未由某个公司或其他组织管理。此设备上的活动可能在接受 Chromium 外部的管理。<ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index fec32a04..a2085430 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -1945,6 +1945,7 @@ <translation id="6337133576188860026">釋出不到 <ph name="SIZE" />。下次造訪部分網站時,載入速度可能會變慢。</translation> <translation id="6337534724793800597">依名稱篩選政策</translation> <translation id="6340739886198108203">根據管理員政策,當畫面上有機密內容時,不建議你擷取螢幕截圖或錄影:</translation> +<translation id="6348220984832452017">使用中的變化版本</translation> <translation id="6349101878882523185">安裝 <ph name="APP_NAME" /></translation> <translation id="6353505687280762741">{COUNT,plural, =0{無}=1{有 1 組密碼 (<ph name="DOMAIN_LIST" />,已同步處理)}=2{有 2 組密碼 (<ph name="DOMAIN_LIST" />,已同步處理)}other{有 # 組密碼 (<ph name="DOMAIN_LIST" />,已同步處理)}}</translation> <translation id="6355392890578844978">這個瀏覽器未受到任何公司或其他機構管理。這部裝置上的活動可透過 Chromium 以外的服務管理。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
diff --git a/components/sync/driver/sync_internals_util.cc b/components/sync/driver/sync_internals_util.cc index b55d4671d..bea2531 100644 --- a/components/sync/driver/sync_internals_util.cc +++ b/components/sync/driver/sync_internals_util.cc
@@ -30,9 +30,7 @@ #include "ash/constants/ash_features.h" #endif -namespace syncer { - -namespace sync_ui_util { +namespace syncer::sync_ui_util { namespace { @@ -622,6 +620,4 @@ return about_info; } -} // namespace sync_ui_util - -} // namespace syncer +} // namespace syncer::sync_ui_util
diff --git a/components/sync/driver/sync_internals_util_unittest.cc b/components/sync/driver/sync_internals_util_unittest.cc index 03d9206..37348861e 100644 --- a/components/sync/driver/sync_internals_util_unittest.cc +++ b/components/sync/driver/sync_internals_util_unittest.cc
@@ -10,8 +10,8 @@ #include "components/sync/driver/test_sync_service.h" #include "testing/gtest/include/gtest/gtest.h" -namespace syncer { -namespace sync_ui_util { +namespace syncer::sync_ui_util { + namespace { TEST(SyncUIUtilTestAbout, ConstructAboutInformationWithUnrecoverableErrorTest) { @@ -26,5 +26,5 @@ } } // namespace -} // namespace sync_ui_util -} // namespace syncer + +} // namespace syncer::sync_ui_util
diff --git a/components/sync/model/client_tag_based_model_type_processor_unittest.cc b/components/sync/model/client_tag_based_model_type_processor_unittest.cc index 70faad4c4..553ed13 100644 --- a/components/sync/model/client_tag_based_model_type_processor_unittest.cc +++ b/components/sync/model/client_tag_based_model_type_processor_unittest.cc
@@ -2679,7 +2679,7 @@ type_processor()->OnCommitCompleted( model_type_state(), /*committed_response_list=*/CommitResponseDataList(), - /*rror_response_list=*/FailedCommitResponseDataList()); + /*error_response_list=*/FailedCommitResponseDataList()); EXPECT_EQ(0, bridge()->commit_failures_count()); }
diff --git a/components/sync_bookmarks/bookmark_model_merger.cc b/components/sync_bookmarks/bookmark_model_merger.cc index ad86f18..9965719 100644 --- a/components/sync_bookmarks/bookmark_model_merger.cc +++ b/components/sync_bookmarks/bookmark_model_merger.cc
@@ -593,7 +593,7 @@ DCHECK_EQ(permanent_folder->guid(), GetPermanentFolderGUIDForServerDefinedUniqueTag( server_defined_unique_tag)); - MergeSubtree(/*local_subtree_root=*/permanent_folder, + MergeSubtree(/*local_node=*/permanent_folder, /*remote_node=*/root); }
diff --git a/components/sync_bookmarks/bookmark_model_merger_unittest.cc b/components/sync_bookmarks/bookmark_model_merger_unittest.cc index 7b49c8a..7f4f1cc2 100644 --- a/components/sync_bookmarks/bookmark_model_merger_unittest.cc +++ b/components/sync_bookmarks/bookmark_model_merger_unittest.cc
@@ -1696,7 +1696,7 @@ histogram_tester.ExpectUniqueSample( "Sync.ProblematicServerSideBookmarksDuringMerge", /*sample=*/ExpectedRemoteBookmarkUpdateError::kInvalidSpecifics, - /*count=*/1); + /*expected_bucket_count=*/1); } TEST(BookmarkModelMergerTest, ShouldLogMetricsForChildrenOfNonFolder) { @@ -1740,7 +1740,7 @@ histogram_tester.ExpectUniqueSample( "Sync.ProblematicServerSideBookmarksDuringMerge", /*sample=*/ExpectedRemoteBookmarkUpdateError::kParentNotFolder, - /*count=*/3); + /*expected_bucket_count=*/3); } TEST(BookmarkModelMergerTest, ShouldLogMetricsForChildrenOfOrphanUpdates) { @@ -1771,7 +1771,7 @@ histogram_tester.ExpectUniqueSample( "Sync.ProblematicServerSideBookmarksDuringMerge", /*sample=*/ExpectedRemoteBookmarkUpdateError::kMissingParentEntity, - /*count=*/1); + /*expected_bucket_count=*/1); EXPECT_THAT(histogram_tester.GetTotalSum( "Sync.BookmarkModelMerger.ReachableInputUpdates"), Eq(1)); @@ -1792,7 +1792,7 @@ histogram_tester.ExpectUniqueSample( "Sync.ProblematicServerSideBookmarksDuringMerge", /*sample=*/ExpectedRemoteBookmarkUpdateError::kUnsupportedPermanentFolder, - /*count=*/1); + /*expected_bucket_count=*/1); } TEST(BookmarkModelMergerTest, ShouldLogMetricsForkDescendantOfRootNode) { @@ -1822,7 +1822,7 @@ histogram_tester.ExpectUniqueSample( "Sync.ProblematicServerSideBookmarksDuringMerge", /*sample=*/ExpectedRemoteBookmarkUpdateError::kMissingParentEntity, - /*count=*/1); + /*expected_bucket_count=*/1); } TEST(BookmarkModelMergerTest, ShouldRemoveMatchingDuplicatesByGUID) { @@ -1881,7 +1881,8 @@ Eq(4)); histogram_tester.ExpectBucketCount( "Sync.BookmarksGUIDDuplicates", - /*sample=*/ExpectedBookmarksGUIDDuplicates::kMatchingUrls, /*count=*/1); + /*sample=*/ExpectedBookmarksGUIDDuplicates::kMatchingUrls, + /*expected_count=*/1); EXPECT_THAT(histogram_tester.GetTotalSum( "Sync.BookmarkModelMerger.ReachableInputUpdates"), Eq(3)); @@ -1930,7 +1931,8 @@ UnorderedElementsAre(HasTitle(base::UTF8ToUTF16(kTitle1)))); histogram_tester.ExpectBucketCount( "Sync.BookmarksGUIDDuplicates", - /*sample=*/ExpectedBookmarksGUIDDuplicates::kDifferentUrls, /*count=*/1); + /*sample=*/ExpectedBookmarksGUIDDuplicates::kDifferentUrls, + /*expected_count=*/1); } TEST(BookmarkModelMergerTest, ShouldRemoveMatchingFolderDuplicatesByGUID) { @@ -1973,7 +1975,7 @@ histogram_tester.ExpectBucketCount( "Sync.BookmarksGUIDDuplicates", /*sample=*/ExpectedBookmarksGUIDDuplicates::kMatchingFolders, - /*count=*/1); + /*expected_count=*/1); EXPECT_THAT(tracker->GetEntityForSyncId("Id1"), IsNull()); EXPECT_THAT(tracker->GetEntityForSyncId("Id2"), NotNull()); } @@ -2029,7 +2031,7 @@ histogram_tester.ExpectBucketCount( "Sync.BookmarksGUIDDuplicates", /*sample=*/ExpectedBookmarksGUIDDuplicates::kDifferentFolders, - /*count=*/1); + /*expected_count=*/1); EXPECT_THAT(tracker->GetEntityForSyncId("Id1"), NotNull()); EXPECT_THAT(tracker->GetEntityForSyncId("Id2"), IsNull()); EXPECT_EQ(bookmark_bar_node->children().front()->GetTitle(), @@ -2184,7 +2186,7 @@ histogram_tester.ExpectUniqueSample( "Sync.BookmarksGUIDDuplicates", /*sample=*/ExpectedBookmarksGUIDDuplicates::kDifferentTypes, - /*count=*/1); + /*expected_bucket_count=*/1); EXPECT_THAT(tracker->GetEntityForSyncId("Id1"), NotNull()); EXPECT_THAT(tracker->GetEntityForSyncId("Id2"), IsNull()); EXPECT_EQ(bookmark_bar_node->children().front()->children().size(), 1u);
diff --git a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc index f2b85b6..b61a0dd 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
@@ -358,7 +358,7 @@ histogram_tester.ExpectUniqueSample( "Sync.ModelTypeInitialUpdateReceived", /*sample=*/syncer::ModelTypeHistogramValue(syncer::BOOKMARKS), - /*expected_count=*/3); + /*expected_bucket_count=*/3); } TEST_F(BookmarkModelTypeProcessorTest, ShouldUpdateModelAfterRemoteCreation) { @@ -431,7 +431,7 @@ histogram_tester.ExpectUniqueSample( "Sync.ModelTypeIncrementalUpdateReceived", /*sample=*/syncer::ModelTypeHistogramValue(syncer::BOOKMARKS), - /*expected_count=*/1); + /*expected_bucket_count=*/1); } TEST_F(
diff --git a/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc b/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc index 3ab4860..4899209 100644 --- a/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc +++ b/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc
@@ -634,7 +634,8 @@ histogram_tester.ExpectUniqueSample( "Sync.BookmarksModelMetadataCorruptionReason", - /*sample=*/ExpectedCorruptionReason::NO_CORRUPTION, /*expected_count=*/1); + /*sample=*/ExpectedCorruptionReason::NO_CORRUPTION, + /*expected_bucket_count=*/1); } TEST(SyncedBookmarkTrackerTest, ShouldNotRequireClientTagsForPermanentNodes) { @@ -684,7 +685,8 @@ histogram_tester.ExpectUniqueSample( "Sync.BookmarksModelMetadataCorruptionReason", - /*sample=*/ExpectedCorruptionReason::UNTRACKED_BOOKMARK, /*count=*/1); + /*sample=*/ExpectedCorruptionReason::UNTRACKED_BOOKMARK, + /*expected_bucket_count=*/1); } TEST(SyncedBookmarkTrackerTest, ShouldInvalidateMetadataIfMissingServerId) { @@ -707,7 +709,8 @@ histogram_tester.ExpectUniqueSample( "Sync.BookmarksModelMetadataCorruptionReason", - /*sample=*/ExpectedCorruptionReason::MISSING_SERVER_ID, /*count=*/1); + /*sample=*/ExpectedCorruptionReason::MISSING_SERVER_ID, + /*expected_bucket_count=*/1); } TEST(SyncedBookmarkTrackerTest, @@ -734,7 +737,8 @@ histogram_tester.ExpectUniqueSample( "Sync.BookmarksModelMetadataCorruptionReason", - /*sample=*/ExpectedCorruptionReason::MISSING_BOOKMARK_ID, /*count=*/1); + /*sample=*/ExpectedCorruptionReason::MISSING_BOOKMARK_ID, + /*expected_bucket_count=*/1); } TEST(SyncedBookmarkTrackerTest, @@ -761,7 +765,7 @@ histogram_tester.ExpectUniqueSample( "Sync.BookmarksModelMetadataCorruptionReason", /*sample=*/ExpectedCorruptionReason::BOOKMARK_ID_IN_TOMBSTONE, - /*count=*/1); + /*expected_bucket_count=*/1); } TEST(SyncedBookmarkTrackerTest, @@ -789,7 +793,7 @@ histogram_tester.ExpectUniqueSample( "Sync.BookmarksModelMetadataCorruptionReason", /*sample=*/ExpectedCorruptionReason::UNKNOWN_BOOKMARK_ID, - /*count=*/1); + /*expected_bucket_count=*/1); } TEST(SyncedBookmarkTrackerTest, ShouldInvalidateMetadataIfGuidMismatch) { @@ -817,7 +821,8 @@ histogram_tester.ExpectUniqueSample( "Sync.BookmarksModelMetadataCorruptionReason", - /*sample=*/ExpectedCorruptionReason::BOOKMARK_GUID_MISMATCH, /*count=*/1); + /*sample=*/ExpectedCorruptionReason::BOOKMARK_GUID_MISMATCH, + /*expected_bucket_count=*/1); } TEST(SyncedBookmarkTrackerTest, @@ -859,7 +864,7 @@ histogram_tester.ExpectUniqueSample( "Sync.BookmarksModelMetadataCorruptionReason", /*sample=*/ExpectedCorruptionReason::DUPLICATED_CLIENT_TAG_HASH, - /*count=*/1); + /*expected_bucket_count=*/1); } TEST(SyncedBookmarkTrackerTest, @@ -887,7 +892,7 @@ histogram_tester.ExpectUniqueSample( "Sync.BookmarksModelMetadataCorruptionReason", /*sample=*/ExpectedCorruptionReason::MISSING_CLIENT_TAG_HASH, - /*count=*/1); + /*expected_bucket_count=*/1); } TEST(SyncedBookmarkTrackerTest, @@ -918,7 +923,8 @@ IsNull()); histogram_tester.ExpectUniqueSample( "Sync.BookmarksModelMetadataCorruptionReason", - /*sample=*/ExpectedCorruptionReason::TRACKED_MANAGED_NODE, /*count=*/1); + /*sample=*/ExpectedCorruptionReason::TRACKED_MANAGED_NODE, + /*expected_bucket_count=*/1); } TEST(SyncedBookmarkTrackerTest, @@ -944,7 +950,8 @@ NotNull()); histogram_tester.ExpectUniqueSample( "Sync.BookmarksModelMetadataCorruptionReason", - /*sample=*/ExpectedCorruptionReason::NO_CORRUPTION, /*count=*/1); + /*sample=*/ExpectedCorruptionReason::NO_CORRUPTION, + /*expected_bucket_count=*/1); } TEST(SyncedBookmarkTrackerTest,
diff --git a/components/sync_preferences/pref_service_syncable_unittest.cc b/components/sync_preferences/pref_service_syncable_unittest.cc index b52c76a..7610404 100644 --- a/components/sync_preferences/pref_service_syncable_unittest.cc +++ b/components/sync_preferences/pref_service_syncable_unittest.cc
@@ -88,7 +88,7 @@ class TestSyncProcessorStub : public syncer::SyncChangeProcessor { public: explicit TestSyncProcessorStub(syncer::SyncChangeList* output) - : output_(output), fail_next_(false) {} + : output_(output) {} absl::optional<syncer::ModelError> ProcessSyncChanges( const base::Location& from_here, @@ -106,7 +106,7 @@ private: raw_ptr<syncer::SyncChangeList> output_; - bool fail_next_; + bool fail_next_ = false; }; class TestSyncedPrefObserver : public SyncedPrefObserver {
diff --git a/components/sync_sessions/local_session_event_handler_impl_unittest.cc b/components/sync_sessions/local_session_event_handler_impl_unittest.cc index 96171569..77406de 100644 --- a/components/sync_sessions/local_session_event_handler_impl_unittest.cc +++ b/components/sync_sessions/local_session_event_handler_impl_unittest.cc
@@ -336,7 +336,7 @@ auto mock_batch = std::make_unique<StrictMock<MockWriteBatch>>(); EXPECT_CALL(*mock_batch, Put(Pointee(MatchesHeader(kSessionTag, /*window_ids=*/IsEmpty(), - /*tabs_ids=*/IsEmpty())))); + /*tab_ids=*/IsEmpty())))); EXPECT_CALL(*mock_batch, Commit()); EXPECT_CALL(mock_delegate_, CreateLocalSessionWriteBatch()) .WillOnce(Return(ByMove(std::move(mock_batch))));
diff --git a/components/test/data/history/history.54.sql b/components/test/data/history/history.54.sql new file mode 100644 index 0000000..db9ef933 --- /dev/null +++ b/components/test/data/history/history.54.sql
@@ -0,0 +1,35 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; +CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); +INSERT INTO meta VALUES('mmap_status','-1'); +INSERT INTO meta VALUES('version','54'); +INSERT INTO meta VALUES('last_compatible_version','16'); +CREATE TABLE urls(id INTEGER PRIMARY KEY AUTOINCREMENT,url LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL); +CREATE TABLE visits(id INTEGER PRIMARY KEY,url INTEGER NOT NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration INTEGER DEFAULT 0 NOT NULL,incremented_omnibox_typed_score BOOLEAN DEFAULT FALSE NOT NULL,opener_visit INTEGER); +CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER NOT NULL); +CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT NULL,url_id INTEGER NOT NULL,term LONGVARCHAR NOT NULL,normalized_term LONGVARCHAR NOT NULL); +CREATE TABLE downloads (id INTEGER PRIMARY KEY,guid VARCHAR NOT NULL,current_path LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT NULL,start_time INTEGER NOT NULL,received_bytes INTEGER NOT NULL,total_bytes INTEGER NOT NULL,state INTEGER NOT NULL,danger_type INTEGER NOT NULL,interrupt_reason INTEGER NOT NULL,hash BLOB NOT NULL,end_time INTEGER NOT NULL,opened INTEGER NOT NULL,last_access_time INTEGER NOT NULL,transient INTEGER NOT NULL,referrer VARCHAR NOT NULL,site_url VARCHAR NOT NULL,embedder_download_data VARCHAR NOT NULL,tab_url VARCHAR NOT NULL,tab_referrer_url VARCHAR NOT NULL,http_method VARCHAR NOT NULL,by_ext_id VARCHAR NOT NULL,by_ext_name VARCHAR NOT NULL,etag VARCHAR NOT NULL,last_modified VARCHAR NOT NULL,mime_type VARCHAR(255) NOT NULL,original_mime_type VARCHAR(255) NOT NULL); +CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, chain_index) ); +CREATE TABLE downloads_slices (download_id INTEGER NOT NULL,offset INTEGER NOT NULL,received_bytes INTEGER NOT NULL,finished INTEGER NOT NULL DEFAULT 0,PRIMARY KEY (download_id, offset) ); +CREATE TABLE downloads_reroute_info (download_id INTEGER NOT NULL,reroute_info_serialized VARCHAR NOT NULL,PRIMARY KEY (download_id) ); +CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id INTEGER NON NULL); +CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER DEFAULT 0 NOT NULL); +CREATE TABLE typed_url_sync_metadata (storage_key INTEGER PRIMARY KEY NOT NULL,value BLOB); +CREATE TABLE content_annotations(visit_id INTEGER PRIMARY KEY,visibility_score NUMERIC,floc_protected_score NUMERIC,categories VARCHAR,page_topics_model_version INTEGER,annotation_flags INTEGER NOT NULL,entities VARCHAR,related_searches VARCHAR,search_normalized_url VARCHAR,search_terms LONGVARCHAR,alternative_title VARCHAR); +CREATE TABLE context_annotations(visit_id INTEGER PRIMARY KEY,context_annotation_flags INTEGER NOT NULL,duration_since_last_visit INTEGER,page_end_reason INTEGER,total_foreground_duration INTEGER); +CREATE TABLE clusters(cluster_id INTEGER PRIMARY KEY,score NUMERIC NOT NULL); +CREATE TABLE clusters_and_visits(cluster_id INTEGER NOT NULL,visit_id INTEGER NOT NULL,score NUMERIC NOT NULL,PRIMARY KEY(cluster_id,visit_id))WITHOUT ROWID; +DELETE FROM sqlite_sequence; +CREATE INDEX visits_url_index ON visits (url); +CREATE INDEX visits_from_index ON visits (from_visit); +CREATE INDEX visits_time_index ON visits (visit_time); +CREATE INDEX keyword_search_terms_index1 ON keyword_search_terms (keyword_id, normalized_term); +CREATE INDEX keyword_search_terms_index2 ON keyword_search_terms (url_id); +CREATE INDEX keyword_search_terms_index3 ON keyword_search_terms (term); +CREATE INDEX segments_name ON segments(name); +CREATE INDEX segments_url_id ON segments(url_id); +CREATE INDEX segment_usage_time_slot_segment_id ON segment_usage(time_slot, segment_id); +CREATE INDEX segments_usage_seg_id ON segment_usage(segment_id); +CREATE INDEX clusters_for_visit ON clusters_and_visits(visit_id); +CREATE INDEX urls_url_index ON urls (url); +COMMIT;
diff --git a/components/viz/common/frame_sinks/README.md b/components/viz/common/frame_sinks/README.md index fc04942b..f134b4e 100644 --- a/components/viz/common/frame_sinks/README.md +++ b/components/viz/common/frame_sinks/README.md
@@ -56,8 +56,8 @@ Note that all coordinates are constrained to be integer values, to avoid introducing alignment, rounding or other "fuzz" issues. - * Result format: An RGBA-interleaved bitmap (SkBitmap) or I420 Y+U+V image - planes. + * Result format: An RGBA-interleaved bitmap (SkBitmap), I420 Y+U+V image + planes, or NV12 Y+UV image planes. For efficient video capture, the above are used as follows: An issuer of CopyOutputRequests "locks into" a target area within the Surface (usually the
diff --git a/components/viz/common/frame_sinks/blit_request.cc b/components/viz/common/frame_sinks/blit_request.cc index 29bbb2d..8aafb6a 100644 --- a/components/viz/common/frame_sinks/blit_request.cc +++ b/components/viz/common/frame_sinks/blit_request.cc
@@ -31,9 +31,11 @@ BlitRequest::BlitRequest( const gfx::Point& destination_region_offset, + LetterboxingBehavior letterboxing_behavior, const std::array<gpu::MailboxHolder, CopyOutputResult::kMaxPlanes>& mailboxes) : destination_region_offset_(destination_region_offset), + letterboxing_behavior_(letterboxing_behavior), mailboxes_(mailboxes) {} BlitRequest::BlitRequest(BlitRequest&& other) = default;
diff --git a/components/viz/common/frame_sinks/blit_request.h b/components/viz/common/frame_sinks/blit_request.h index b236231c..3912c70 100644 --- a/components/viz/common/frame_sinks/blit_request.h +++ b/components/viz/common/frame_sinks/blit_request.h
@@ -53,6 +53,16 @@ sk_sp<SkImage> image_; }; +// Enum used to specify letteboxing behavior for a BlitRequest. +enum class LetterboxingBehavior { + // No letterboxing is needed - only the destination region will be written + // into by the handler of CopyOutputRequest. + kDoNotLetterbox, + // Letterboxing is needed - everything outside of the destination region + // will be filled with black by the handler of CopyOutputRequest. + kLetterbox +}; + // Structure describing a blit operation that can be appended to // `CopyOutputRequest` if the callers want to place the results of the operation // in textures that they own. @@ -60,6 +70,7 @@ public: explicit BlitRequest( const gfx::Point& destination_region_offset, + LetterboxingBehavior letterboxing_behavior, const std::array<gpu::MailboxHolder, CopyOutputResult::kMaxPlanes>& mailboxes); @@ -74,6 +85,10 @@ return destination_region_offset_; } + LetterboxingBehavior letterboxing_behavior() const { + return letterboxing_behavior_; + } + const std::array<gpu::MailboxHolder, CopyOutputResult::kMaxPlanes>& mailboxes() const { return mailboxes_; @@ -106,6 +121,9 @@ // images. gfx::Point destination_region_offset_; + // Specifies the letterboxing behavior of this request. + LetterboxingBehavior letterboxing_behavior_; + // Mailboxes with planes that will be populated. // The textures can (but don't have to be) backed by // a GpuMemoryBuffer. The pixel format of the request determines
diff --git a/components/viz/common/frame_sinks/copy_output_request.cc b/components/viz/common/frame_sinks/copy_output_request.cc index 648a6fa..63f2ff3 100644 --- a/components/viz/common/frame_sinks/copy_output_request.cc +++ b/components/viz/common/frame_sinks/copy_output_request.cc
@@ -107,6 +107,7 @@ DCHECK(!blit_request_); DCHECK_EQ(result_destination(), ResultDestination::kNativeTextures); DCHECK_EQ(result_format(), ResultFormat::NV12_PLANES); + DCHECK(has_result_selection()); // Destination region must start at an even offset for NV12 results: DCHECK_EQ(blit_request.destination_region_offset().x() % 2, 0);
diff --git a/components/viz/common/frame_sinks/copy_output_request.h b/components/viz/common/frame_sinks/copy_output_request.h index fa9a5dd..28fef1f 100644 --- a/components/viz/common/frame_sinks/copy_output_request.h +++ b/components/viz/common/frame_sinks/copy_output_request.h
@@ -116,12 +116,14 @@ // Optionally specify that only a portion of the result be generated. The // selection rect will be clamped to the result bounds, which always starts at // 0,0 and spans the post-scaling size of the copy area (see set_area() - // above). Only RGBA format supports odd-sized result selection. + // above). Only RGBA format supports odd-sized result selection. Can only be + // called before blit request was set on the copy request. void set_result_selection(const gfx::Rect& selection) { DCHECK(result_format_ == ResultFormat::RGBA || (selection.width() % 2 == 0 && selection.height() % 2 == 0)) << "CopyOutputRequest supports odd-sized result_selection() only for " "RGBA!"; + DCHECK(!has_blit_request()); result_selection_ = selection; } bool has_result_selection() const { return result_selection_.has_value(); } @@ -129,7 +131,15 @@ // Requests that the region copied by the CopyOutputRequest be blitted into // the caller's textures. Can be called only for CopyOutputRequests that - // target native textures. + // target native textures. Requires that result selection was set, in which + // case the caller's textures will be populated with the results of the + // copy request. The region in the caller's textures that will be populated + // is specified by `gfx::Rect(blit_request.destination_region_offset(), + // result_selection().size())`. If blit request is configured to perform + // letterboxing, all contents outside of that region will be overwritten with + // black, otherwise they will be unchanged. If the copy request's result would + // be smaller than `result_selection().size()`, the request will fail (i.e. + // empty result will be sent). void set_blit_request(BlitRequest blit_request); bool has_blit_request() const { return blit_request_.has_value(); } const BlitRequest& blit_request() const { return *blit_request_; }
diff --git a/components/viz/host/gpu_host_impl.cc b/components/viz/host/gpu_host_impl.cc index 895d860..5417369 100644 --- a/components/viz/host/gpu_host_impl.cc +++ b/components/viz/host/gpu_host_impl.cc
@@ -136,7 +136,7 @@ viz_main_->CreateGpuService( gpu_service_remote_.BindNewPipeAndPassReceiver(task_runner), gpu_host_receiver_.BindNewPipeAndPassRemote(task_runner), - std::move(discardable_manager_remote), activity_flags_.CloneHandle(), + std::move(discardable_manager_remote), activity_flags_.CloneRegion(), GetFontRenderParams().Get()->subpixel_rendering); #if defined(USE_OZONE)
diff --git a/components/viz/service/display/skia_readback_pixeltest.cc b/components/viz/service/display/skia_readback_pixeltest.cc index c3bffea..86516244 100644 --- a/components/viz/service/display/skia_readback_pixeltest.cc +++ b/components/viz/service/display/skia_readback_pixeltest.cc
@@ -17,6 +17,7 @@ #include "cc/test/pixel_test.h" #include "cc/test/pixel_test_utils.h" #include "cc/test/resource_provider_test_utils.h" +#include "components/viz/common/frame_sinks/blit_request.h" #include "components/viz/common/frame_sinks/copy_output_request.h" #include "components/viz/common/frame_sinks/copy_output_result.h" #include "components/viz/common/frame_sinks/copy_output_util.h" @@ -572,7 +573,8 @@ class SkiaReadbackPixelTestNV12WithBlit : public SkiaReadbackPixelTest, - public testing::WithParamInterface<bool> { + public testing::WithParamInterface< + std::tuple<bool, LetterboxingBehavior>> { public: CopyOutputResult::Destination RequestDestination() const { return CopyOutputResult::Destination::kNativeTextures; @@ -583,7 +585,11 @@ } void SetUp() override { - SkiaReadbackPixelTest::SetUpReadbackPixeltest(GetParam()); + SkiaReadbackPixelTest::SetUpReadbackPixeltest(std::get<0>(GetParam())); + } + + LetterboxingBehavior GetLetterboxingBehavior() const { + return std::get<1>(GetParam()); } }; @@ -625,8 +631,7 @@ << " The test case expects the blit region's origin to be even for NV12 " "blit requests"; - const SkColor rgba_red = SkColorSetARGB(0xff, 0xff, 0, 0); - const SkColor yuv_red = GLScalerTestUtil::ConvertRGBAColorToYUV(rgba_red); + const SkColor yuv_red = GLScalerTestUtil::ConvertRGBAColorToYUV(SK_ColorRED); const std::vector<uint8_t> luma_pattern = { static_cast<uint8_t>(SkColorGetR(yuv_red))}; @@ -669,8 +674,9 @@ request.set_result_selection(result_selection); - request.set_blit_request( - BlitRequest(destination_subregion.origin(), mailboxes)); + request.set_blit_request(BlitRequest(destination_subregion.origin(), + GetLetterboxingBehavior(), + mailboxes)); })); // Check that a result was produced and is of the expected rect/size. @@ -716,7 +722,18 @@ // The textures that we passed in to BlitRequest contained NV12 plane data for // an all-red image, let's re-create such a bitmap: SkBitmap expected = GLScalerTestUtil::AllocateRGBABitmap(source_size); - expected.eraseColor(rgba_red); + + if (GetLetterboxingBehavior() == LetterboxingBehavior::kLetterbox) { + // We have requested the results to be letterboxed, so everything that + // CopyOutputRequest is not populating w/ render pass contents should be + // black: + expected.eraseColor(SK_ColorBLACK); + } else { + // We have requested the results to not be letterboxed, so everything that + // CopyOutputRequest is not populating w/ render pass will have original + // contents (red in our case): + expected.eraseColor(SK_ColorRED); + } // Blit request should "stitch" the pixels from the source image into a // sub-region of caller-provided texture - let's write our expected pixels @@ -732,10 +749,12 @@ } #if !BUILDFLAG(IS_ANDROID) || !defined(ARCH_CPU_X86_FAMILY) -INSTANTIATE_TEST_SUITE_P(, - SkiaReadbackPixelTestNV12WithBlit, - // Result scaling: Scale by half? - testing::Values(true, false)); +INSTANTIATE_TEST_SUITE_P( + , + SkiaReadbackPixelTestNV12WithBlit, + testing::Combine(testing::Bool(), // Result scaling: Scale by half? + testing::Values(LetterboxingBehavior::kDoNotLetterbox, + LetterboxingBehavior::kLetterbox))); #else // Don't instantiate the NV12 tests when run on Android emulator, they won't // work since the SkiaRenderer currently does not support CopyOutputRequests
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc index 65d7af0..325079b0 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
@@ -849,8 +849,8 @@ for (size_t i = 0; i < CopyOutputResult::kNV12MaxPlanes; ++i) { const gpu::MailboxHolder& mailbox_holder = blit_request.mailbox(i); - // Should never happen, maiboxes are validated when setting blit request on - // a CopyOutputResult. + // Should never happen, mailboxes are validated when setting blit request on + // a CopyOutputResult and we only access `kNV12MaxPlanes` mailboxes. DCHECK(!mailbox_holder.mailbox.IsZero()); PlaneAccessData& plane_data = plane_access_datas[i]; @@ -912,6 +912,9 @@ CopyOutputRequest::ResultDestination::kNativeTextures) << "Only CopyOutputRequests that hand out native textures support blit " "requests!"; + DCHECK(!request->has_blit_request() || request->has_result_selection()) + << "Only CopyOutputRequests that specify result selection support blit " + "requests!"; // Overview: // 1. Try to create surfaces for NV12 planes (we know the needed size in @@ -934,16 +937,29 @@ // copied, as well as area, scaling & result_selection of the `request`. // This represents the size of the intermediate texture that will be then // blitted to the destination textures. - const gfx::Size destination_size = geometry.result_selection.size(); + const gfx::Size intermediate_dst_size = geometry.result_selection.size(); std::array<PlaneAccessData, CopyOutputResult::kNV12MaxPlanes> plane_access_datas; SkYUVAInfo yuva_info; - bool destination_surfaces_created = false; + bool destination_surfaces_ready = false; if (request->has_blit_request()) { - destination_surfaces_created = ImportSurfacesForNV12Planes( + if (request->result_selection().size() != intermediate_dst_size) { + DLOG(WARNING) + << __func__ + << ": result selection is different than render pass output, " + "geometry=" + << geometry.ToString() << ", request=" << request->ToString(); + // Send empty result, we have a blit request that asks for a different + // size than what we have available - the behavior in this case is + // currently unspecified as we'd have to leave parts of the caller's + // region unpopulated. + return; + } + + destination_surfaces_ready = ImportSurfacesForNV12Planes( request->blit_request(), plane_access_datas); // The entire destination image size is the same as the size of the luma @@ -954,7 +970,8 @@ // Check if the destination will fit in the blit target: const gfx::Rect blit_destination_rect( - request->blit_request().destination_region_offset(), destination_size); + request->blit_request().destination_region_offset(), + intermediate_dst_size); const gfx::Rect blit_target_image_rect( gfx::SkISizeToSize(plane_access_datas[0].size)); @@ -964,24 +981,25 @@ return; } } else { - yuva_info = SkYUVAInfo( - gfx::SizeToSkISize(destination_size), SkYUVAInfo::PlaneConfig::kY_UV, - SkYUVAInfo::Subsampling::k420, kRec709_Limited_SkYUVColorSpace); + yuva_info = SkYUVAInfo(gfx::SizeToSkISize(intermediate_dst_size), + SkYUVAInfo::PlaneConfig::kY_UV, + SkYUVAInfo::Subsampling::k420, + kRec709_Limited_SkYUVColorSpace); - destination_surfaces_created = + destination_surfaces_ready = CreateSurfacesForNV12Planes(yuva_info, color_space, plane_access_datas); } - if (!destination_surfaces_created) { - DVLOG(1) << "failed to create destination surfaces"; + if (!destination_surfaces_ready) { + DVLOG(1) << "failed to create / import destination surfaces"; // Send empty result. return; } // Create a destination for the scaled & clipped result: - auto representation = CreateSharedImageRepresentationSkia( - ResourceFormat::RGBA_8888, destination_size, color_space); - if (!representation) { + auto intermediate_representation = CreateSharedImageRepresentationSkia( + ResourceFormat::RGBA_8888, intermediate_dst_size, color_space); + if (!intermediate_representation) { DVLOG(1) << "failed to create shared image representation for the " "intermediate surface"; // Send empty result. @@ -992,9 +1010,11 @@ std::vector<GrBackendSemaphore> begin_semaphores; std::vector<GrBackendSemaphore> end_semaphores; - auto scoped_write = representation->BeginScopedWriteAccess( - /*final_msaa_count=*/1, surface_props, &begin_semaphores, &end_semaphores, - gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes); + auto intermediate_scoped_write = + intermediate_representation->BeginScopedWriteAccess( + /*final_msaa_count=*/1, surface_props, &begin_semaphores, + &end_semaphores, + gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes); absl::optional<SkVector> scaling; if (request->is_scaled()) { @@ -1004,21 +1024,22 @@ request->scale_from().y()); } - scoped_write->surface()->wait(begin_semaphores.size(), - begin_semaphores.data()); + intermediate_scoped_write->surface()->wait(begin_semaphores.size(), + begin_semaphores.data()); RenderSurface(surface, src_rect, scaling, is_downscale_or_identity_in_both_dimensions, - scoped_write->surface()); + intermediate_scoped_write->surface()); if (request->has_blit_request()) { - BlendBitmapOverlays(scoped_write->surface()->getCanvas(), + BlendBitmapOverlays(intermediate_scoped_write->surface()->getCanvas(), request->blit_request()); } - auto source_image = scoped_write->surface()->makeImageSnapshot(); - if (!source_image) { - DLOG(ERROR) << "failed to retrieve source_image."; + auto intermediate_image = + intermediate_scoped_write->surface()->makeImageSnapshot(); + if (!intermediate_image) { + DLOG(ERROR) << "failed to retrieve `intermediate_image`."; return; } @@ -1030,19 +1051,27 @@ plane_access_datas[1].scoped_write->surface(), nullptr, nullptr}; // The region to be populated in caller's textures is derived from blit - // request's |destination_region_offset|, and from COR's |result_selection|. - // If we have a blit request, use it. Otherwise, use an + // request's |destination_region_offset()|, and from COR's + // |result_selection()|. If we have a blit request, use it. Otherwise, use an // empty rect (which means that entire image will be used as the target of the // blit - this will not result in rescaling since w/o blit request present, - // the image size matches the |result_selection|). - SkRect dst_region = + // the destination image size matches the |geometry.result_selection|). + const SkRect dst_region = request->has_blit_request() ? gfx::RectToSkRect( gfx::Rect(request->blit_request().destination_region_offset(), - destination_size)) + intermediate_dst_size)) : SkRect::MakeEmpty(); - skia::BlitRGBAToYUVA(source_image.get(), plane_surfaces.data(), yuva_info, - dst_region); + + // We should clear destination if BlitRequest asked to letterbox everything + // outside of intended destination region: + const bool clear_destination = + request->has_blit_request() + ? request->blit_request().letterboxing_behavior() == + LetterboxingBehavior::kLetterbox + : false; + skia::BlitRGBAToYUVA(intermediate_image.get(), plane_surfaces.data(), + yuva_info, dst_region, clear_destination); bool should_submit = false; @@ -1059,12 +1088,12 @@ } } - representation->SetCleared(); + intermediate_representation->SetCleared(); should_submit |= !end_semaphores.empty(); - if (!FlushSurface(scoped_write->surface(), end_semaphores, - scoped_write->TakeEndState())) { + if (!FlushSurface(intermediate_scoped_write->surface(), end_semaphores, + intermediate_scoped_write->TakeEndState())) { // TODO(penghuang): handle vulkan device lost. FailedSkiaFlush("CopyOutputNV12 dest_surface->flush()"); return;
diff --git a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc index 7be1f120..1a846379 100644 --- a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc +++ b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
@@ -37,6 +37,8 @@ #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gfx/color_space.h" +#include "ui/gfx/geometry/point.h" +#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" using media::VideoCaptureOracle; @@ -111,6 +113,46 @@ } } +bool IsCompatibleWithFormat(const gfx::Rect& rect, + media::VideoPixelFormat format) { + DCHECK(format == media::PIXEL_FORMAT_I420 || + format == media::PIXEL_FORMAT_NV12 || + format == media::PIXEL_FORMAT_ARGB); + if (format == media::PIXEL_FORMAT_ARGB) { + // No special requirements: + return true; + } + + return rect.origin().x() % 2 == 0 && rect.origin().y() % 2 == 0 && + rect.width() % 2 == 0 && rect.height() % 2 == 0; +} + +// Given a |visible_rect| representing visible rectangle of some video frame, +// calculates a centered rectangle that fits entirely within |visible_rect| and +// has the same aspect ratio as |source_size|, taking into account +// |pixel_format|. +gfx::Rect GetContentRectangle(const gfx::Rect& visible_rect, + const gfx::Size& source_size, + media::VideoPixelFormat pixel_format) { + DCHECK(pixel_format == media::PIXEL_FORMAT_I420 || + pixel_format == media::PIXEL_FORMAT_NV12 || + pixel_format == media::PIXEL_FORMAT_ARGB); + + if (pixel_format == media::PIXEL_FORMAT_I420 || + pixel_format == media::PIXEL_FORMAT_NV12) { + return media::ComputeLetterboxRegionForI420(visible_rect, source_size); + } else { + DCHECK_EQ(media::PIXEL_FORMAT_ARGB, pixel_format); + const gfx::Rect content_rect = + media::ComputeLetterboxRegion(visible_rect, source_size); + + // The media letterboxing computation explicitly allows for off-by-one + // errors due to computation, so we address those here. + return content_rect.ApproximatelyEqual(visible_rect, 1) ? visible_rect + : content_rect; + } +} + } // namespace // static @@ -308,6 +350,10 @@ bool use_fixed_aspect_ratio) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DVLOG(2) << __func__ << ": min_size=" << min_size.ToString() + << ", max_size=" << max_size.ToString() + << ", use_fixed_aspect_ratio=" << use_fixed_aspect_ratio; + TRACE_EVENT_INSTANT2("gpu.capture", "SetResolutionConstraints", TRACE_EVENT_SCOPE_THREAD, "min_size.width", min_size.width(), "min_size.height", min_size.height()); @@ -695,6 +741,7 @@ // TODO(https://crbug.com/1300943): we should likely just get the frame // region from the last aggregated surface. if (!compositor_frame_region.Contains(capture_region)) { + DVLOG(3) << __func__ << ": skipping capture!"; MaybeScheduleRefreshFrame(); return; } @@ -707,9 +754,23 @@ // Reserve a buffer from the pool for the next frame. const OracleFrameNumber oracle_frame_number = oracle_->next_frame_number(); + + // Size of the video frames that we are supposed to produce. Depends on the + // pixel format and the capture size as determined by the oracle (which in + // turn depends on the capture constraints). const gfx::Size capture_size = AdjustSizeForPixelFormat(oracle_->capture_size()); + // Size of the source that we are capturing: + const gfx::Size source_size = oracle_->source_size(); + DCHECK_EQ(capture_region.size(), source_size); + DCHECK(!source_size.IsEmpty()); + + DVLOG(3) << __func__ + << ": compositor_frame_region=" << compositor_frame_region.ToString() + << ", capture_region=" << capture_region.ToString() + << ", capture_size=" << capture_size.ToString(); + const bool can_resurrect_content = CanResurrectFrame(capture_size); scoped_refptr<VideoFrame> frame; if (can_resurrect_content) { @@ -757,6 +818,13 @@ return; } + // If frame was resurrected / allocated from the pool, its visible rectangle + // should match what we requested: + DCHECK_EQ(frame->visible_rect().size(), capture_size); + // The pool should return a frame with visible rectangle that is compatible + // with the capture format. + DCHECK(IsCompatibleWithFormat(frame->visible_rect(), pixel_format_)); + // Record a trace event if the capture pipeline is redlining, but capture will // still proceed. if (utilization >= 1.0) { @@ -800,23 +868,24 @@ "frame_number", capture_frame_number, "trigger", VideoCaptureOracle::EventAsString(event)); - const gfx::Size& source_size = oracle_->source_size(); - DCHECK(!source_size.IsEmpty()); - gfx::Rect content_rect; - if (pixel_format_ == media::PIXEL_FORMAT_I420 || - pixel_format_ == media::PIXEL_FORMAT_NV12) { - content_rect = media::ComputeLetterboxRegionForI420(frame->visible_rect(), - source_size); - } else { - DCHECK_EQ(media::PIXEL_FORMAT_ARGB, pixel_format_); - content_rect = - media::ComputeLetterboxRegion(frame->visible_rect(), source_size); - // The media letterboxing computation explicitly allows for off-by-one - // errors due to computation, so we address those here. - if (content_rect.ApproximatelyEqual(frame->visible_rect(), 1)) { - content_rect = frame->visible_rect(); - } - } + // `content_rect` is the region of the `frame` that we would like to populate. + // We know our source is of size `source_size`, and we have + // `frame->visible_rect()` to fill out - find the largest centered rectangle + // that will fit within the frame and maintains the aspect ratio of the + // source. + // TODO(https://crbug.com/1323342): currently, both the frame's visible + // rectangle and source size are controlled by oracle + // (`frame->visible_rect().size() == `capture_size`). Oracle also knows if we + // need to maintain fixed aspect ratio, so it should compute both the + // `capture_size` and `content_rect` for us, thus ensuring that letterboxing + // happens only when it needs to (i.e. when we allocate a frame and know that + // aspect ratio does not have to be maintained, we should use a size that we + // know would not require letterboxing). + const gfx::Rect content_rect = + GetContentRectangle(frame->visible_rect(), source_size, pixel_format_); + DVLOG(3) << __func__ << ": content_rect=" << content_rect.ToString() + << ", source_size=" << source_size.ToString() + << ", frame=" << frame->AsHumanReadableString(); // Determine what rectangular region has changed since the last captured // frame. @@ -900,7 +969,6 @@ return; } - DCHECK(capture_region.size() == source_size); if (absl::holds_alternative<RegionCaptureCropId>(target_->sub_target)) { const float scale_factor = frame_metadata.device_scale_factor; metadata.region_capture_rect = @@ -927,7 +995,12 @@ std::array<gpu::MailboxHolder, 3> mailbox_holders = { request_properties.frame->mailbox_holder(0), request_properties.frame->mailbox_holder(1), gpu::MailboxHolder{}}; - blit_request = BlitRequest(content_rect.origin(), mailbox_holders); + + // TODO(https://crbug.com/775740): change the capturer to only request the + // parts of the frame that have changed whenever possible. + blit_request = + BlitRequest(content_rect.origin(), LetterboxingBehavior::kLetterbox, + mailbox_holders); // We haven't captured the frame yet, but let's pretend that we did for the // sake of blend information computation. We will be asking for an entire @@ -1021,6 +1094,7 @@ scoped_refptr<media::VideoFrame>& frame = properties.frame; const gfx::Rect& content_rect = properties.content_rect; + if (log_to_webrtc_ && consumer_) { std::string format = ""; std::string strides = ""; @@ -1131,6 +1205,13 @@ } if (frame) { + // The result may be smaller than what was requested, if unforeseen + // clamping to the source boundaries occurred by the executor of the + // CopyOutputRequest. However, the result should never contain more than + // what was requested. + DCHECK_LE(result->size().width(), content_rect.width()); + DCHECK_LE(result->size().height(), content_rect.height()); + if (!frame->HasGpuMemoryBuffer()) { // For GMB-backed video frames, overlays were already applied by // CopyOutputRequest API. For in-memory frames, apply overlays here: @@ -1145,15 +1226,21 @@ } } - // The result may be smaller than what was requested, if unforeseen - // clamping to the source boundaries occurred by the executor of the - // CopyOutputRequest. However, the result should never contain more than - // what was requested. - DCHECK_LE(result->size().width(), content_rect.width()); - DCHECK_LE(result->size().height(), content_rect.height()); - media::LetterboxVideoFrame( - frame.get(), gfx::Rect(content_rect.origin(), - AdjustSizeForPixelFormat(result->size()))); + const gfx::Rect result_rect = + gfx::Rect(content_rect.origin(), result->size()); + DCHECK(IsCompatibleWithFormat(result_rect, pixel_format_)); + + DVLOG(3) << __func__ << ": result->size()=" << result->size().ToString() + << ", content_rect=" << content_rect.ToString() + << ", result_rect=" << result_rect.ToString() + << ", frame=" << frame->AsHumanReadableString(); + + if (frame->visible_rect() != result_rect && !frame->HasGpuMemoryBuffer()) { + // If there are parts of the frame that are visible but we have not wrote + // into them, letterbox them. This is not needed for GMB-backed frames as + // the letterboxing happens on GPU. + media::LetterboxVideoFrame(frame.get(), result_rect); + } if (ShouldMark(*frame, properties.content_version)) { MarkFrame(frame, properties.content_version);
diff --git a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc index 5fe5c790..20565f12 100644 --- a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc +++ b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc
@@ -442,8 +442,9 @@ const VideoFrame& frame = *arg; const gfx::Rect kContentRect = content_rect; - const auto IsLetterboxedPlane = [&frame, kContentRect](int plane, - uint8_t component) { + + const auto IsLetterboxedPlane = [&frame, kContentRect, result_listener]( + int plane, uint8_t component) { gfx::Rect content_rect_copy = kContentRect; if (plane != VideoFrame::kYPlane) { content_rect_copy = gfx::Rect( @@ -455,10 +456,19 @@ for (int col = 0; col < frame.row_bytes(plane); ++col) { if (content_rect_copy.Contains(gfx::Point(col, row))) { if (p[col] != component) { + *result_listener << " where pixel at (" << col << ", " << row + << ") should be inside content rectangle and the " + "component should match 0x" + << std::hex << component << " but is 0x" + << std::hex << static_cast<unsigned int>(p[col]); return false; } } else { // Letterbox border around content. if (plane == VideoFrame::kYPlane && p[col] != 0x00) { + *result_listener << " where pixel at (" << col << ", " << row + << ") should be outside content rectangle and the " + "component should match 0x00 but is 0x" + << std::hex << static_cast<unsigned int>(p[col]); return false; } }
diff --git a/components/viz/service/main/viz_main_impl.cc b/components/viz/service/main/viz_main_impl.cc index f682cf1f..b5ed34b0 100644 --- a/components/viz/service/main/viz_main_impl.cc +++ b/components/viz/service/main/viz_main_impl.cc
@@ -172,7 +172,7 @@ mojo::PendingRemote< discardable_memory::mojom::DiscardableSharedMemoryManager> discardable_memory_manager, - mojo::ScopedSharedBufferHandle activity_flags, + base::UnsafeSharedMemoryRegion activity_flags_region, gfx::FontRenderParams::SubpixelRendering subpixel_rendering) { DCHECK(gpu_thread_task_runner_->BelongsToCurrentThread()); @@ -208,7 +208,7 @@ gpu_service_->InitializeWithHost( gpu_host.Unbind(), - gpu::GpuProcessActivityFlags(std::move(activity_flags)), + gpu::GpuProcessActivityFlags(std::move(activity_flags_region)), gpu_init_->TakeDefaultOffscreenSurface(), dependencies_.sync_point_manager, dependencies_.shared_image_manager, dependencies_.shutdown_event);
diff --git a/components/viz/service/main/viz_main_impl.h b/components/viz/service/main/viz_main_impl.h index b2965ba..978bc229 100644 --- a/components/viz/service/main/viz_main_impl.h +++ b/components/viz/service/main/viz_main_impl.h
@@ -8,6 +8,7 @@ #include <memory> #include "base/memory/raw_ptr.h" +#include "base/memory/unsafe_shared_memory_region.h" #include "base/process/process_handle.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" @@ -120,7 +121,7 @@ mojo::PendingRemote< discardable_memory::mojom::DiscardableSharedMemoryManager> discardable_memory_manager, - mojo::ScopedSharedBufferHandle activity_flags, + base::UnsafeSharedMemoryRegion activity_flags_region, gfx::FontRenderParams::SubpixelRendering subpixel_rendering) override; #if BUILDFLAG(IS_WIN) void CreateInfoCollectionGpuService(
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 6594d0e..20fb7433 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -10,7 +10,7 @@ import("//build/config/linux/pangocairo/pangocairo.gni") import("//build/config/ozone.gni") import("//build/config/ui.gni") -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") import("//components/viz/common/debugger/viz_debugger.gni") import("//content/common/features.gni") import("//content/public/common/zygote/features.gni") @@ -3063,7 +3063,7 @@ deps += [ "//ash/components/audio", "//ash/constants", - "//chromeos/assistant:buildflags", + "//chromeos/ash/components/assistant:buildflags", "//chromeos/dbus", "//chromeos/dbus/power", "//chromeos/dbus/power:power_manager_proto",
diff --git a/content/browser/accessibility/browser_accessibility_fuchsia.cc b/content/browser/accessibility/browser_accessibility_fuchsia.cc index 647eb3ac..c8e1c712 100644 --- a/content/browser/accessibility/browser_accessibility_fuchsia.cc +++ b/content/browser/accessibility/browser_accessibility_fuchsia.cc
@@ -370,13 +370,6 @@ if (GetData().relative_bounds.transform) transform = *GetData().relative_bounds.transform; - // If this node is the root of its AXTree, apply the inverse device scale - // factor. - if (manager()->GetRoot() == this) { - transform.PostScale(1 / manager()->device_scale_factor(), - 1 / manager()->device_scale_factor()); - } - // Convert to fuchsia's transform type. std::array<float, 16> mat = {}; transform.matrix().getColMajor(mat.data());
diff --git a/content/browser/accessibility/browser_accessibility_manager_fuchsia_unittest.cc b/content/browser/accessibility/browser_accessibility_manager_fuchsia_unittest.cc index 31c39fc..d86bb74 100644 --- a/content/browser/accessibility/browser_accessibility_manager_fuchsia_unittest.cc +++ b/content/browser/accessibility/browser_accessibility_manager_fuchsia_unittest.cc
@@ -394,41 +394,6 @@ } } -TEST_F(BrowserAccessibilityManagerFuchsiaTest, TestDeviceScale) { - const float kScaleFactor = 0.8f; - mock_accessibility_bridge_->SetDeviceScaleFactor(kScaleFactor); - - AXEventNotificationDetails event; - ui::AXTreeUpdate initial_state; - ui::AXTreeID tree_id = ui::AXTreeID::CreateNewAXTreeID(); - initial_state.tree_data.tree_id = tree_id; - initial_state.has_tree_data = true; - initial_state.tree_data.loaded = true; - initial_state.root_id = 1; - initial_state.nodes.resize(1); - initial_state.nodes[0].id = 1; - event.updates.push_back(std::move(initial_state)); - - EXPECT_TRUE(manager_->OnAccessibilityEvents(std::move(event))); - - { - const auto& node_updates = mock_accessibility_bridge_->node_updates(); - ASSERT_FALSE(node_updates.empty()); - - BrowserAccessibilityFuchsia* root_node = - ToBrowserAccessibilityFuchsia(manager_->GetRoot()); - ASSERT_TRUE(root_node); - - EXPECT_EQ(node_updates.back().node_id(), root_node->GetFuchsiaNodeID()); - - ASSERT_TRUE(node_updates[0].has_node_to_container_transform()); - const auto& transform = - node_updates[0].node_to_container_transform().matrix; - EXPECT_EQ(transform[0], 1.f / kScaleFactor); - EXPECT_EQ(transform[5], 1.f / kScaleFactor); - } -} - TEST_F(BrowserAccessibilityManagerFuchsiaTest, HitTest) { mock_browser_accessibility_delegate_->is_root_frame_ = true;
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc index d9775a8c..3ffdcf4 100644 --- a/content/browser/browser_interface_binders.cc +++ b/content/browser/browser_interface_binders.cc
@@ -122,7 +122,6 @@ #include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h" #include "third_party/blink/public/mojom/input/input_host.mojom.h" #include "third_party/blink/public/mojom/keyboard_lock/keyboard_lock.mojom.h" -#include "third_party/blink/public/mojom/loader/anchor_element_interaction_host.mojom.h" #include "third_party/blink/public/mojom/loader/code_cache.mojom.h" #include "third_party/blink/public/mojom/loader/content_security_notifier.mojom.h" #include "third_party/blink/public/mojom/loader/navigation_predictor.mojom.h" @@ -1088,11 +1087,6 @@ &EmptyBinderForFrame<payments::mojom::PaymentRequest>)); map->Add<blink::mojom::AnchorElementMetricsHost>(base::BindRepeating( &EmptyBinderForFrame<blink::mojom::AnchorElementMetricsHost>)); - if (base::FeatureList::IsEnabled( - blink::features::kAnchorElementInteraction)) { - map->Add<blink::mojom::AnchorElementInteractionHost>(base::BindRepeating( - &EmptyBinderForFrame<blink::mojom::AnchorElementInteractionHost>)); - } map->Add<blink::mojom::CredentialManager>(base::BindRepeating( &EmptyBinderForFrame<blink::mojom::CredentialManager>)); if (base::FeatureList::IsEnabled(blink::features::kBrowsingTopics)) {
diff --git a/content/browser/devtools/network_service_devtools_observer.cc b/content/browser/devtools/network_service_devtools_observer.cc index 06c58e0..180a180 100644 --- a/content/browser/devtools/network_service_devtools_observer.cc +++ b/content/browser/devtools/network_service_devtools_observer.cc
@@ -13,7 +13,7 @@ #include "content/public/common/content_client.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "services/network/public/mojom/http_raw_headers.mojom.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" namespace content {
diff --git a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc index 8670fc2..5adffaf 100644 --- a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc +++ b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -1148,12 +1148,7 @@ } // TODO(crbug.com/1280746): Flaky on MacOS. -#if BUILDFLAG(IS_MAC) -#define MAYBE_CrossSiteNavigation DISABLED_CrossSiteNavigation -#else -#define MAYBE_CrossSiteNavigation CrossSiteNavigation -#endif -IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, MAYBE_CrossSiteNavigation) { +IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, DISABLED_CrossSiteNavigation) { content::SetupCrossSiteRedirector(embedded_test_server()); ASSERT_TRUE(embedded_test_server()->Start());
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc index 966ed1b..d47b7853 100644 --- a/content/browser/devtools/protocol/page_handler.cc +++ b/content/browser/devtools/protocol/page_handler.cc
@@ -181,7 +181,7 @@ bool CanExecuteGlobalCommands( RenderFrameHost* host, const std::unique_ptr<ProtocolCallback>& callback) { - if (!host || !host->GetParent()) + if (!host || host->IsInPrimaryMainFrame()) return true; callback->sendFailure( Response::ServerError(kCommandIsOnlyAvailableAtTopTarget));
diff --git a/content/browser/indexed_db/indexed_db_factory_impl.cc b/content/browser/indexed_db/indexed_db_factory_impl.cc index 5fc6c675..4de86ae8 100644 --- a/content/browser/indexed_db/indexed_db_factory_impl.cc +++ b/content/browser/indexed_db/indexed_db_factory_impl.cc
@@ -20,7 +20,6 @@ #include "base/feature_list.h" #include "base/files/file_path.h" #include "base/logging.h" -#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/strings/strcat.h" #include "base/strings/string_util.h" @@ -456,10 +455,6 @@ leveldb::Status s = class_factory_->leveldb_factory().DestroyLevelDB(file_path); DLOG_IF(ERROR, !s.ok()) << "Unable to delete backing store: " << s.ToString(); - base::UmaHistogramEnumeration( - "WebCore.IndexedDB.DestroyCorruptBackingStoreStatus", - leveldb_env::GetLevelDBStatusUMAValue(s), - leveldb_env::LEVELDB_STATUS_MAX); } std::vector<IndexedDBDatabase*> IndexedDBFactoryImpl::GetOpenDatabasesForBucket( @@ -861,10 +856,7 @@ // This is a special case where we want to make sure the database is // deleted, so we try to delete again. status = class_factory_->leveldb_factory().DestroyLevelDB(database_path); - base::UmaHistogramEnumeration( - "WebCore.IndexedDB.DestroyCorruptBackingStoreStatus", - leveldb_env::GetLevelDBStatusUMAValue(status), - leveldb_env::LEVELDB_STATUS_MAX); + if (UNLIKELY(!status.ok())) { LOG(ERROR) << "Unable to delete backing store: " << status.ToString(); return {nullptr, status, data_loss_info, /*is_disk_full=*/false};
diff --git a/content/browser/interest_group/ad_auction_service_impl.cc b/content/browser/interest_group/ad_auction_service_impl.cc index 4b99a4b1..738d152 100644 --- a/content/browser/interest_group/ad_auction_service_impl.cc +++ b/content/browser/interest_group/ad_auction_service_impl.cc
@@ -371,13 +371,13 @@ void AdAuctionServiceImpl::FinalizeAd(const std::string& ads_guid, ::blink::mojom::AuctionAdConfigPtr config, FinalizeAdCallback callback) { - if (!config->decision_logic_url.SchemeIs(url::kHttpsScheme)) { - std::move(callback).Run(absl::nullopt); + if (!IsAuctionValid(*config, /*is_top_level_auction=*/true)) { + ReportBadMessageAndDeleteThis("Invalid auction"); return; } if (ads_guid.empty()) { - std::move(callback).Run(absl::nullopt); + ReportBadMessageAndDeleteThis("GUID empty"); return; } @@ -443,6 +443,10 @@ return static_cast<RenderFrameHostImpl*>(render_frame_host()); } +scoped_refptr<SiteInstance> AdAuctionServiceImpl::GetFrameSiteInstance() { + return render_frame_host()->GetSiteInstance(); +} + network::mojom::ClientSecurityStatePtr AdAuctionServiceImpl::GetClientSecurityState() { return GetFrame()->BuildClientSecurityState();
diff --git a/content/browser/interest_group/ad_auction_service_impl.h b/content/browser/interest_group/ad_auction_service_impl.h index 54d9cbd..adfc465 100644 --- a/content/browser/interest_group/ad_auction_service_impl.h +++ b/content/browser/interest_group/ad_auction_service_impl.h
@@ -73,6 +73,7 @@ network::mojom::URLLoaderFactory* GetFrameURLLoaderFactory() override; network::mojom::URLLoaderFactory* GetTrustedURLLoaderFactory() override; RenderFrameHostImpl* GetFrame() override; + scoped_refptr<SiteInstance> GetFrameSiteInstance() override; network::mojom::ClientSecurityStatePtr GetClientSecurityState() override; using DocumentService::origin;
diff --git a/content/browser/interest_group/ad_auction_service_impl_unittest.cc b/content/browser/interest_group/ad_auction_service_impl_unittest.cc index 264827c..3079fb3 100644 --- a/content/browser/interest_group/ad_auction_service_impl_unittest.cc +++ b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
@@ -430,9 +430,10 @@ ~SameProcessAuctionProcessManager() override = default; private: - void LaunchProcess( + RenderProcessHost* LaunchProcess( mojo::PendingReceiver<auction_worklet::mojom::AuctionWorkletService> auction_worklet_service_receiver, + const ProcessHandle* handle, const std::string& display_name) override { // Create one AuctionWorkletServiceImpl per Mojo pipe, just like in // production code. Don't bother to delete the service on pipe close, @@ -440,6 +441,17 @@ auction_worklet_services_.push_back( std::make_unique<auction_worklet::AuctionWorkletServiceImpl>( std::move(auction_worklet_service_receiver))); + return nullptr; + } + + scoped_refptr<SiteInstance> MaybeComputeSiteInstance( + SiteInstance* frame_site_instance, + const url::Origin& worklet_origin) override { + return nullptr; + } + + bool TryUseSharedProcess(ProcessHandle* process_handle) override { + return false; } std::vector<std::unique_ptr<auction_worklet::AuctionWorkletServiceImpl>> @@ -685,15 +697,23 @@ interest_service.FlushForTesting(); } - void FinalizeAd(std::string guid, - blink::mojom::AuctionAdConfigPtr config, - AdAuctionServiceImpl::FinalizeAdCallback callback) { + // Finalizes an ad and expects the Mojo pipe to be closed without invoking the + // callback, as should be done in the case of a bad Mojo message. + void FinalizeAdAndExpectPipeClosed(const std::string& guid, + blink::mojom::AuctionAdConfigPtr config) { mojo::Remote<blink::mojom::AdAuctionService> interest_service; AdAuctionServiceImpl::CreateMojoService( main_rfh(), interest_service.BindNewPipeAndPassReceiver()); - interest_service->FinalizeAd(guid, std::move(config), std::move(callback)); - interest_service.FlushForTesting(); + base::RunLoop run_loop; + interest_service.set_disconnect_handler(run_loop.QuitClosure()); + interest_service->FinalizeAd( + guid, std::move(config), + base::BindLambdaForTesting( + [&](const absl::optional<GURL>& creative_url) { + ADD_FAILURE() << "Callback unexpectedly invoked."; + })); + run_loop.Run(); } protected: @@ -4271,6 +4291,115 @@ EXPECT_FALSE(network_responder_->ReportSent("/report_seller_2")); } +TEST_F(AdAuctionServiceImplTest, SendReportsMaxReportRoundDuration) { + const std::string kBiddingScript = base::StringPrintf(R"( +function generateBid( + interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, + browserSignals) { + return {'ad': 'example', 'bid': 1, 'render': 'https://example.com/render'}; +} +function reportWin( + auctionSignals, perBuyerSignals, sellerSignals, browserSignals) { + sendReportTo('%s/report_bidder'); +} + )", + kOriginStringA); + + const std::string kDecisionScript = + base::StringPrintf(R"( +function scoreAd( + adMetadata, bid, auctionConfig, trustedScoringSignals, browserSignals) { + return bid; +} +function reportResult(auctionConfig, browserSignals) { + sendReportTo('%s/report_seller'); + return { + 'success': true, + 'signalsForWinner': {'signalForWinner': 1}, + 'reportUrl': '%s/report_seller', + }; +} +)", + kOriginStringA, kOriginStringA); + + // `max_reporting_round_duration_` is set lower than `reporting_interval_` so + // that we can exceed the max round duration with pending unsent reports. + manager_->set_reporting_interval_for_testing(base::Seconds(5)); + manager_->set_max_reporting_round_duration_for_testing(base::Seconds(1)); + manager_->set_max_active_report_requests_for_testing(1); + + network_responder_->RegisterScriptResponse(kBiddingUrlPath, kBiddingScript); + network_responder_->RegisterScriptResponse(kDecisionUrlPath, kDecisionScript); + network_responder_->RegisterReportResponse("/report_bidder", /*response=*/""); + network_responder_->RegisterReportResponse("/report_seller", /*response=*/""); + + blink::InterestGroup interest_group = CreateInterestGroup(); + interest_group.bidding_url = kUrlA.Resolve(kBiddingUrlPath); + interest_group.ads.emplace(); + blink::InterestGroup::Ad ad( + /*render_url=*/GURL("https://example.com/render"), + /*metadata=*/absl::nullopt); + interest_group.ads->emplace_back(std::move(ad)); + JoinInterestGroupAndFlush(interest_group); + EXPECT_EQ(1, GetJoinCount(kOriginA, kInterestGroupName)); + + auto auction_config = blink::mojom::AuctionAdConfig::New(); + auction_config->seller = kOriginA; + auction_config->decision_logic_url = kUrlA.Resolve(kDecisionUrlPath); + auction_config->auction_ad_config_non_shared_params = + blink::mojom::AuctionAdConfigNonSharedParams::New(); + auction_config->auction_ad_config_non_shared_params->interest_group_buyers = { + kOriginA}; + absl::optional<GURL> auction_result = + RunAdAuctionAndFlush(std::move(auction_config)); + EXPECT_NE(auction_result, absl::nullopt); + + task_environment()->FastForwardBy(base::Seconds(2)); + // There should only be the seller report, and the bidder report request is + // waiting in the report queue. + EXPECT_EQ(network_responder_->ReportCount(), 1u); + EXPECT_EQ(manager_->report_queue_length_for_testing(), 1u); + + // Run a second auction while the first auction's reporting is in progress. + auto auction_config2 = blink::mojom::AuctionAdConfig::New(); + auction_config2->seller = kOriginA; + auction_config2->decision_logic_url = kUrlA.Resolve(kDecisionUrlPath); + auction_config2->auction_ad_config_non_shared_params = + blink::mojom::AuctionAdConfigNonSharedParams::New(); + auction_config2->auction_ad_config_non_shared_params + ->interest_group_buyers = {kOriginA}; + auction_result = RunAdAuctionAndFlush(std::move(auction_config2)); + EXPECT_NE(auction_result, absl::nullopt); + // Two more reports are enqueued. + EXPECT_EQ(manager_->report_queue_length_for_testing(), 3u); + + task_environment()->FastForwardBy(base::Seconds(20)); + // Should still only have 1 report sent because the report queue is cleared + // after `max_reporting_round_duration` passed, before popping the second + // report from the queue and send it. + EXPECT_EQ(network_responder_->ReportCount(), 1u); + EXPECT_EQ(manager_->report_queue_length_for_testing(), 0u); + + // Run a third auction after report queue is cleared, to make sure further + // auction's reports can be normally enqueued and sent again. + auto auction_config3 = blink::mojom::AuctionAdConfig::New(); + auction_config3->seller = kOriginA; + auction_config3->decision_logic_url = kUrlA.Resolve(kDecisionUrlPath); + auction_config3->auction_ad_config_non_shared_params = + blink::mojom::AuctionAdConfigNonSharedParams::New(); + auction_config3->auction_ad_config_non_shared_params + ->interest_group_buyers = {kOriginA}; + auction_result = RunAdAuctionAndFlush(std::move(auction_config3)); + EXPECT_NE(auction_result, absl::nullopt); + + // Set `max_reporting_round_duration_` high enough so that the auction's two + // reports can be sent successfully. + manager_->set_max_reporting_round_duration_for_testing(base::Seconds(20)); + task_environment()->FastForwardBy(base::Seconds(20)); + // Two more reports from the third auction are sent. + EXPECT_EQ(network_responder_->ReportCount(), 3u); +} + // Run several auctions, some of which have a winner, and some of which do // not. Verify that the auction result UMA is recorded correctly. TEST_F(AdAuctionServiceImplTest, @@ -4786,22 +4915,17 @@ ASSERT_TRUE(callback_fired); } -// An empty config will cause FinalizeAd to fail and run the supplied callback. +// An empty config should be treated as a bad message. TEST_F(AdAuctionServiceImplTest, FinalizeAdRejectsEmptyConfig) { auto mojo_config = blink::mojom::AuctionAdConfig::New(); mojo_config->auction_ad_config_non_shared_params = blink::mojom::AuctionAdConfigNonSharedParams::New(); - bool callback_fired = false; - FinalizeAd( - /*guid=*/std::string("1234"), std::move(mojo_config), - base::BindLambdaForTesting([&](const absl::optional<GURL>& creative_url) { - ASSERT_FALSE(creative_url.has_value()); - callback_fired = true; - })); - ASSERT_TRUE(callback_fired); + FinalizeAdAndExpectPipeClosed( + /*guid=*/std::string("1234"), std::move(mojo_config)); } +// An HTTP decision logic URL should be treated as a bad message. TEST_F(AdAuctionServiceImplTest, FinalizeAdRejectsHTTPDecisionUrl) { auto mojo_config = blink::mojom::AuctionAdConfig::New(); mojo_config->auction_ad_config_non_shared_params = @@ -4809,17 +4933,11 @@ mojo_config->seller = url::Origin::Create(GURL("https://site.test")); mojo_config->decision_logic_url = GURL("http://site.test/"); - bool callback_fired = false; - FinalizeAd( - /*guid=*/"1234", std::move(mojo_config), - base::BindLambdaForTesting([&](const absl::optional<GURL>& creative_url) { - ASSERT_FALSE(creative_url.has_value()); - callback_fired = true; - })); - ASSERT_TRUE(callback_fired); + FinalizeAdAndExpectPipeClosed( + /*guid=*/"1234", std::move(mojo_config)); } -// An empty GUID should trigger any FinalizeAd request to fail. +// An empty GUID should be treated as a bad message. TEST_F(AdAuctionServiceImplTest, FinalizeAdRejectsMissingGuid) { auto mojo_config = blink::mojom::AuctionAdConfig::New(); mojo_config->auction_ad_config_non_shared_params = @@ -4827,14 +4945,8 @@ mojo_config->seller = url::Origin::Create(GURL("https://site.test")); mojo_config->decision_logic_url = GURL("https://site.test/"); - bool callback_fired = false; - FinalizeAd( - /*guid=*/std::string(), std::move(mojo_config), - base::BindLambdaForTesting([&](const absl::optional<GURL>& creative_url) { - ASSERT_FALSE(creative_url.has_value()); - callback_fired = true; - })); - ASSERT_TRUE(callback_fired); + FinalizeAdAndExpectPipeClosed( + /*guid=*/std::string(), std::move(mojo_config)); } class AdAuctionServiceImplNumAuctionLimitTest @@ -5268,13 +5380,15 @@ for (int i = 1; i < 3; i++) { const std::string name = base::NumberToString(i); network_responder_->RegisterReportResponse( - base::StringPrintf("/report_bidder_%s", name.c_str()), ""); + base::StringPrintf("/report_bidder_%s", name.c_str()), /*response=*/""); network_responder_->RegisterReportResponse( - base::StringPrintf("/report_seller_%s", name.c_str()), ""); + base::StringPrintf("/report_seller_%s", name.c_str()), /*response=*/""); network_responder_->RegisterReportResponse( - base::StringPrintf("/seller_debug_win_%s", name.c_str()), ""); + base::StringPrintf("/seller_debug_win_%s", name.c_str()), + /*response=*/""); network_responder_->RegisterReportResponse( - base::StringPrintf("/bidder_debug_win_%s", name.c_str()), ""); + base::StringPrintf("/bidder_debug_win_%s", name.c_str()), + /*response=*/""); blink::InterestGroup interest_group = CreateInterestGroup(); interest_group.bidding_url = kUrlA.Resolve(kBiddingUrlPath); interest_group.name = name;
diff --git a/content/browser/interest_group/auction_process_manager.cc b/content/browser/interest_group/auction_process_manager.cc index 8b09c7b..eee52bf 100644 --- a/content/browser/interest_group/auction_process_manager.cc +++ b/content/browser/interest_group/auction_process_manager.cc
@@ -13,7 +13,12 @@ #include "base/threading/sequenced_task_runner_handle.h" #include "base/timer/timer.h" #include "build/build_config.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/render_process_host.h" +#include "content/public/browser/render_process_host_observer.h" #include "content/public/browser/service_process_host.h" +#include "content/public/browser/site_instance.h" #include "content/public/common/child_process_host.h" #include "content/services/auction_worklet/public/mojom/auction_worklet_service.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -26,20 +31,30 @@ constexpr size_t AuctionProcessManager::kMaxSellerProcesses = 3; class AuctionProcessManager::WorkletProcess - : public base::RefCounted<WorkletProcess> { + : public base::RefCounted<WorkletProcess>, + public RenderProcessHostObserver { public: WorkletProcess( AuctionProcessManager* auction_process_manager, + RenderProcessHost* render_process_host, mojo::Remote<auction_worklet::mojom::AuctionWorkletService> service, WorkletType worklet_type, - const url::Origin& origin) - : worklet_type_(worklet_type), + const url::Origin& origin, + bool uses_shared_process) + : render_process_host_(render_process_host), + worklet_type_(worklet_type), origin_(origin), + uses_shared_process_(uses_shared_process), auction_process_manager_(auction_process_manager), service_(std::move(service)) { DCHECK(auction_process_manager); service_.set_disconnect_handler(base::BindOnce( &WorkletProcess::NotifyUnusableOnce, base::Unretained(this))); + + if (render_process_host_) { + render_process_host_->IncrementWorkerRefCount(); + render_process_host_->AddObserver(this); + } } auction_worklet::mojom::AuctionWorkletService* GetService() { @@ -49,24 +64,43 @@ WorkletType worklet_type() const { return worklet_type_; } const url::Origin& origin() const { return origin_; } + RenderProcessHost* render_process_host() const { + return render_process_host_; + } private: friend class base::RefCounted<WorkletProcess>; + // From RenderProcessHostObserver. + void RenderProcessHostDestroyed(RenderProcessHost* host) override { + DCHECK_EQ(host, render_process_host_); + NotifyUnusableOnce(); + } + void NotifyUnusableOnce() { AuctionProcessManager* maybe_apm = auction_process_manager_; // Clear `auction_process_manager_` to make sure OnWorkletProcessUnusable() // is called once. Clear it before call to ensure this is the case even // if this method is re-entered somehow. auction_process_manager_ = nullptr; - if (maybe_apm) + if (maybe_apm && !uses_shared_process_) maybe_apm->OnWorkletProcessUnusable(this); + + if (render_process_host_) { + render_process_host_->RemoveObserver(this); + if (!render_process_host_->AreRefCountsDisabled()) + render_process_host_->DecrementWorkerRefCount(); + render_process_host_ = nullptr; + } } - ~WorkletProcess() { NotifyUnusableOnce(); } + ~WorkletProcess() override { NotifyUnusableOnce(); } + + RenderProcessHost* render_process_host_; const WorkletType worklet_type_; const url::Origin origin_; + bool uses_shared_process_; // nulled out once OnWorkletProcessUnusable() called. raw_ptr<AuctionProcessManager> auction_process_manager_; @@ -92,6 +126,13 @@ return worklet_process_->GetService(); } +RenderProcessHost* +AuctionProcessManager::ProcessHandle::GetRenderProcessHostForTesting() { + if (!worklet_process_) + return nullptr; + return worklet_process_->render_process_host(); +} + void AuctionProcessManager::ProcessHandle::AssignProcess( scoped_refptr<WorkletProcess> worklet_process) { worklet_process_ = std::move(worklet_process); @@ -111,8 +152,6 @@ std::move(callback_).Run(); } -AuctionProcessManager::AuctionProcessManager() = default; - AuctionProcessManager::~AuctionProcessManager() { DCHECK(pending_bidder_request_queue_.empty()); DCHECK(pending_seller_request_queue_.empty()); @@ -122,10 +161,12 @@ DCHECK(seller_processes_.empty()); } -bool AuctionProcessManager::RequestWorkletService(WorkletType worklet_type, - const url::Origin& origin, - ProcessHandle* process_handle, - base::OnceClosure callback) { +bool AuctionProcessManager::RequestWorkletService( + WorkletType worklet_type, + const url::Origin& origin, + scoped_refptr<SiteInstance> frame_site_instance, + ProcessHandle* process_handle, + base::OnceClosure callback) { DCHECK(!callback.is_null()); // `process_handle` should not already be in use. DCHECK(!process_handle->manager_); @@ -135,6 +176,15 @@ process_handle->manager_ = this; process_handle->origin_ = origin; process_handle->worklet_type_ = worklet_type; + process_handle->site_instance_ = + MaybeComputeSiteInstance(frame_site_instance.get(), origin); + + // See if a subclass can reuse existing non-auction process for this. + // + // This needs to be done before TryCreateOrGetProcessForHandle, since + // shared processes really can't be keyed by origin. + if (TryUseSharedProcess(process_handle)) + return true; // If can assign a process to the handle instantly, nothing else to do. if (TryCreateOrGetProcessForHandle(process_handle)) @@ -170,34 +220,23 @@ // Launch the process and create WorkletProcess object bound to it. mojo::Remote<auction_worklet::mojom::AuctionWorkletService> service; - LaunchProcess(service.BindNewPipeAndPassReceiver(), - ComputeDisplayName(process_handle->worklet_type_, - process_handle->origin_)); + RenderProcessHost* render_process_host = + LaunchProcess(service.BindNewPipeAndPassReceiver(), process_handle, + ComputeDisplayName(process_handle->worklet_type_, + process_handle->origin_)); scoped_refptr<WorkletProcess> worklet_process = - base::MakeRefCounted<WorkletProcess>(this, std::move(service), - process_handle->worklet_type_, - process_handle->origin_); + base::MakeRefCounted<WorkletProcess>( + this, render_process_host, std::move(service), + process_handle->worklet_type_, process_handle->origin_, + /*uses_shared_process=*/false); (*processes)[process_handle->origin_] = worklet_process.get(); process_handle->AssignProcess(std::move(worklet_process)); return true; } -void AuctionProcessManager::LaunchProcess( - mojo::PendingReceiver<auction_worklet::mojom::AuctionWorkletService> - auction_worklet_service_receiver, - const std::string& display_name) { - content::ServiceProcessHost::Launch( - std::move(auction_worklet_service_receiver), - ServiceProcessHost::Options() - .WithDisplayName(display_name) -#if BUILDFLAG(IS_MAC) - // TODO(https://crbug.com/1281311) add a utility helper for Jit. - .WithChildFlags(ChildProcessHost::CHILD_RENDERER) -#endif - .Pass()); -} +AuctionProcessManager::AuctionProcessManager() = default; std::string AuctionProcessManager::ComputeDisplayName( WorkletType worklet_type, @@ -324,4 +363,100 @@ return seller_processes_.size() < kMaxSellerProcesses; } +DedicatedAuctionProcessManager::DedicatedAuctionProcessManager() = default; +DedicatedAuctionProcessManager::~DedicatedAuctionProcessManager() = default; + +RenderProcessHost* DedicatedAuctionProcessManager::LaunchProcess( + mojo::PendingReceiver<auction_worklet::mojom::AuctionWorkletService> + auction_worklet_service_receiver, + const ProcessHandle* process_handle, + const std::string& display_name) { + content::ServiceProcessHost::Launch( + std::move(auction_worklet_service_receiver), + ServiceProcessHost::Options() + .WithDisplayName(display_name) +#if BUILDFLAG(IS_MAC) + // TODO(https://crbug.com/1281311) add a utility helper for Jit. + .WithChildFlags(ChildProcessHost::CHILD_RENDERER) +#endif + .Pass()); + return nullptr; +} + +scoped_refptr<SiteInstance> +DedicatedAuctionProcessManager::MaybeComputeSiteInstance( + SiteInstance* frame_site_instance, + const url::Origin& worklet_origin) { + return nullptr; +} + +bool DedicatedAuctionProcessManager::TryUseSharedProcess( + ProcessHandle* process_handle) { + return false; +} + +InRendererAuctionProcessManager::InRendererAuctionProcessManager() = default; +InRendererAuctionProcessManager::~InRendererAuctionProcessManager() = default; + +RenderProcessHost* InRendererAuctionProcessManager::LaunchProcess( + mojo::PendingReceiver<auction_worklet::mojom::AuctionWorkletService> + auction_worklet_service_receiver, + const ProcessHandle* process_handle, + const std::string& display_name) { + DCHECK(process_handle->site_instance_); + DCHECK(process_handle->site_instance_->RequiresDedicatedProcess()); + return LaunchInSiteInstance(process_handle->site_instance_.get(), + std::move(auction_worklet_service_receiver)); +} + +scoped_refptr<SiteInstance> +InRendererAuctionProcessManager::MaybeComputeSiteInstance( + SiteInstance* frame_site_instance, + const url::Origin& worklet_origin) { + return frame_site_instance->GetRelatedSiteInstance(worklet_origin.GetURL()); +} + +bool InRendererAuctionProcessManager::TryUseSharedProcess( + ProcessHandle* process_handle) { + // If this needs a dedicated process due to site isolation, return and let + // AuctionProcessManager do the quota thing. Then it will ask for one in + // LaunchProcess once process count is low enough. This is only reasonable to + // do since dedicated processes are shared among different BrowsingInstances, + // so the stored `process_handle->site_instance_` requiring a dedicated + // process is as good as any. + if (process_handle->site_instance_->RequiresDedicatedProcess()) + return false; + + // Shared process case. + mojo::Remote<auction_worklet::mojom::AuctionWorkletService> service; + RenderProcessHost* render_process_host = + LaunchInSiteInstance(process_handle->site_instance_.get(), + service.BindNewPipeAndPassReceiver()); + + auto process = base::MakeRefCounted<WorkletProcess>( + this, render_process_host, std::move(service), + process_handle->worklet_type_, process_handle->origin_, + /*uses_shared_process=*/true); + process_handle->AssignProcess(std::move(process)); + return true; +} + +RenderProcessHost* InRendererAuctionProcessManager::LaunchInSiteInstance( + SiteInstance* site_instance, + mojo::PendingReceiver<auction_worklet::mojom::AuctionWorkletService> + auction_worklet_service_receiver) { + if (site_instance->GetBrowserContext()->ShutdownStarted()) { + // This browser context is shutting down, so we shouldn't start any + // processes, in part because managing their lifetime will be impossible. + // So... just give up. The service pipe will be broken, but that should be + // OK since the destination of the async callback on process assignment + // should get deleted before we get back to the event loop. + return nullptr; + } + site_instance->GetProcess()->Init(); + site_instance->GetProcess()->BindReceiver( + std::move(auction_worklet_service_receiver)); + return site_instance->GetProcess(); +} + } // namespace content
diff --git a/content/browser/interest_group/auction_process_manager.h b/content/browser/interest_group/auction_process_manager.h index 76009bf..ff68e06d 100644 --- a/content/browser/interest_group/auction_process_manager.h +++ b/content/browser/interest_group/auction_process_manager.h
@@ -22,9 +22,11 @@ namespace content { -// Per-StoragePartition manager of auction bidder and seller worklet processes. -// Limits the total number of worklet process at once. Processes for the same -// origin will be vended to multiple consumers. +class RenderProcessHost; +class SiteInstance; + +// Base class of per-StoragePartition manager of auction bidder and seller +// worklet processes. This provides limiting and sharing of worker processes. class CONTENT_EXPORT AuctionProcessManager { public: // The maximum number of bidder processes. Once this number is reached, no @@ -71,8 +73,23 @@ // process. The pipe, however, may get broken if the process exits. auction_worklet::mojom::AuctionWorkletService* GetService(); + // Returns any RenderProcessHost being used to host this process, or + // nullptr. + RenderProcessHost* GetRenderProcessHostForTesting(); + + // Returns the underlying process assignment at this level. + // Meant for reference-equality testing. + const scoped_refptr<WorkletProcess>& worklet_process_for_testing() const { + return worklet_process_; + } + + const scoped_refptr<SiteInstance>& site_instance_for_testing() const { + return site_instance_; + } + private: - friend AuctionProcessManager; + friend class AuctionProcessManager; + friend class InRendererAuctionProcessManager; // Assigns `worklet_process` to `this`. If `callback_` is non-null, queues a // task to invoke it asynchronously, and GetService() will return nullptr @@ -86,6 +103,10 @@ url::Origin origin_; WorkletType worklet_type_; + // SiteInstance representing the worklet. Used only by + // InRendererAuctionProcessManager. + scoped_refptr<SiteInstance> site_instance_; + // Associated AuctionProcessManager. Set when a process is requested, // cleared once a process is assigned (synchronously or asynchronously), // since the AuctionProcessManager doesn't track Handles after they've been @@ -101,7 +122,6 @@ base::WeakPtrFactory<ProcessHandle> weak_ptr_factory_{this}; }; - AuctionProcessManager(); AuctionProcessManager(const AuctionProcessManager&) = delete; AuctionProcessManager& operator=(const AuctionProcessManager&) = delete; virtual ~AuctionProcessManager(); @@ -117,6 +137,9 @@ // Auctions must request (and get) a service for their `kSeller` worklet // before requesting any `kBidder` worklets to avoid deadlock. // + // `frame_site_instance` must be the SiteInstance of the frame that requested + // the auction. It's only examined by InRendererAuctionProcessManager. + // // Passed in ProcessHandles must be destroyed before the AuctionProcessManager // is. ProcessHandles may not be reused. // @@ -124,10 +147,12 @@ // AuctionProcessManager to request more WorkletServices, or even to delete // the AuctionProcessManager, since nothing but the callback invocation is on // the call stack. - [[nodiscard]] bool RequestWorkletService(WorkletType worklet_type, - const url::Origin& origin, - ProcessHandle* process_handle, - base::OnceClosure callback); + [[nodiscard]] bool RequestWorkletService( + WorkletType worklet_type, + const url::Origin& origin, + scoped_refptr<SiteInstance> frame_site_instance, + ProcessHandle* process_handle, + base::OnceClosure callback); size_t GetPendingBidderRequestsForTesting() const { return pending_bidder_request_queue_.size(); @@ -143,11 +168,31 @@ } protected: - // Launches the actual process. Virtual so tests can override it. - virtual void LaunchProcess( + AuctionProcessManager(); + + // Launches the actual process. Return value of null is permitted if a + // RenderProcessHost isn't used; otherwise the process will be kept-alive and + // watched by the ProcessHandle's WorkletProcess. + virtual RenderProcessHost* LaunchProcess( mojo::PendingReceiver<auction_worklet::mojom::AuctionWorkletService> auction_worklet_service_receiver, - const std::string& display_name); + const ProcessHandle* process_handle, + const std::string& display_name) = 0; + + // Used to compute the value of `site_instance_` field of ProcessHandle. + // A subclass can return nullptr if it is not using SiteInstance to place + // worklets in appropriate renderers, but some other mechanism implementing a + // policy that's at least as strong as site isolation would be. + virtual scoped_refptr<SiteInstance> MaybeComputeSiteInstance( + SiteInstance* frame_site_instance, + const url::Origin& worklet_origin) = 0; + + // Tries to see if a shared process can be used for this, which will bypass + // the normal accounting logic and just use it. If it returns true, the + // process got assigned synchronously. There is no async case. + // + // `process_handle` will be already filled. + virtual bool TryUseSharedProcess(ProcessHandle* process_handle) = 0; // Returns the display name to use for a process. Separate method so it can be // used in tests. @@ -216,6 +261,55 @@ base::WeakPtrFactory<AuctionProcessManager> weak_ptr_factory_{this}; }; +// An implementation of AuctionProcessManager that places worklet execution into +// dedicated utility processes, isolated by domain and role. +class CONTENT_EXPORT DedicatedAuctionProcessManager + : public AuctionProcessManager { + public: + DedicatedAuctionProcessManager(); + ~DedicatedAuctionProcessManager() override; + + private: + RenderProcessHost* LaunchProcess( + mojo::PendingReceiver<auction_worklet::mojom::AuctionWorkletService> + auction_worklet_service_receiver, + const ProcessHandle* process_handle, + const std::string& display_name) override; + + scoped_refptr<SiteInstance> MaybeComputeSiteInstance( + SiteInstance* frame_site_instance, + const url::Origin& worklet_origin) override; + bool TryUseSharedProcess(ProcessHandle* process_handle) override; +}; + +// An alternative implementation of AuctionProcessManager that places worklet +// execution into regular renderer processes (rather than worklet-only utility +// processes) following the site isolation policy. +class CONTENT_EXPORT InRendererAuctionProcessManager + : public AuctionProcessManager { + public: + InRendererAuctionProcessManager(); + ~InRendererAuctionProcessManager() override; + + protected: + RenderProcessHost* LaunchProcess( + mojo::PendingReceiver<auction_worklet::mojom::AuctionWorkletService> + auction_worklet_service_receiver, + const ProcessHandle* process_handle, + const std::string& display_name) override; + + scoped_refptr<SiteInstance> MaybeComputeSiteInstance( + SiteInstance* frame_site_instance, + const url::Origin& worklet_origin) override; + bool TryUseSharedProcess(ProcessHandle* process_handle) override; + + private: + RenderProcessHost* LaunchInSiteInstance( + SiteInstance* site_instance, + mojo::PendingReceiver<auction_worklet::mojom::AuctionWorkletService> + auction_worklet_service_receiver); +}; + } // namespace content #endif // CONTENT_BROWSER_INTEREST_GROUP_AUCTION_PROCESS_MANAGER_H_
diff --git a/content/browser/interest_group/auction_process_manager_unittest.cc b/content/browser/interest_group/auction_process_manager_unittest.cc index 3112d6f9..0d612f8 100644 --- a/content/browser/interest_group/auction_process_manager_unittest.cc +++ b/content/browser/interest_group/auction_process_manager_unittest.cc
@@ -15,10 +15,22 @@ #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" -#include "base/test/task_environment.h" +#include "base/test/scoped_command_line.h" +#include "base/test/scoped_feature_list.h" +#include "content/browser/renderer_host/render_process_host_impl.h" +#include "content/public/browser/site_instance.h" +#include "content/public/browser/site_isolation_mode.h" +#include "content/public/browser/site_isolation_policy.h" +#include "content/public/common/content_client.h" +#include "content/public/common/content_features.h" +#include "content/public/common/content_switches.h" +#include "content/public/test/browser_task_environment.h" +#include "content/public/test/mock_render_process_host.h" +#include "content/public/test/test_browser_context.h" #include "content/services/auction_worklet/public/mojom/auction_worklet_service.mojom.h" #include "content/services/auction_worklet/public/mojom/bidder_worklet.mojom.h" #include "content/services/auction_worklet/public/mojom/seller_worklet.mojom.h" +#include "content/test/test_content_browser_client.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver_set.h" @@ -90,11 +102,23 @@ } private: - void LaunchProcess( + RenderProcessHost* LaunchProcess( mojo::PendingReceiver<auction_worklet::mojom::AuctionWorkletService> auction_worklet_service_receiver, + const ProcessHandle* handle, const std::string& display_name) override { receiver_set_.Add(this, std::move(auction_worklet_service_receiver)); + return handle->site_instance_for_testing()->GetProcess(); + } + + scoped_refptr<SiteInstance> MaybeComputeSiteInstance( + SiteInstance* frame_site_instance, + const url::Origin& worklet_origin) override { + return frame_site_instance->GetRelatedSiteInstance(worklet_origin.GetURL()); + } + + bool TryUseSharedProcess(ProcessHandle* process_handle) override { + return false; } mojo::ReceiverSet<auction_worklet::mojom::AuctionWorkletService> @@ -104,6 +128,19 @@ class AuctionProcessManagerTest : public testing::TestWithParam<AuctionProcessManager::WorkletType> { protected: + AuctionProcessManagerTest() + : site_instance_(SiteInstance::Create(&test_browser_context_)) {} + + void SetUp() override { + RenderProcessHostImpl::set_render_process_host_factory_for_testing( + &rph_factory_); + SiteIsolationPolicy::DisableFlagCachingForTesting(); + } + + void TearDown() override { + RenderProcessHostImpl::set_render_process_host_factory_for_testing(nullptr); + } + // Request a worklet service and expect the request to complete synchronously. // There's no async version, since async calls are only triggered by deleting // another handle. @@ -113,7 +150,8 @@ auto process_handle = std::make_unique<AuctionProcessManager::ProcessHandle>(); EXPECT_TRUE(auction_process_manager_.RequestWorkletService( - worklet_type, origin, process_handle.get(), NeverInvokedClosure())); + worklet_type, origin, site_instance_, process_handle.get(), + NeverInvokedClosure())); EXPECT_TRUE(process_handle->GetService()); return process_handle; } @@ -149,7 +187,10 @@ []() { ADD_FAILURE() << "This should not be called"; }); } - base::test::TaskEnvironment task_environment_; + BrowserTaskEnvironment task_environment_; + TestBrowserContext test_browser_context_; + MockRenderProcessHostFactory rph_factory_; + scoped_refptr<SiteInstance> site_instance_; TestAuctionProcessManager auction_process_manager_; const url::Origin kOriginA = url::Origin::Create(GURL("https://a.test")); @@ -344,11 +385,11 @@ data.emplace_back(ProcessHandleData()); url::Origin distinct_origin = url::Origin::Create( GURL(base::StringPrintf("https://%i.test", ++num_origins))); - ASSERT_EQ( - original_size < GetMaxProcesses(), - auction_process_manager_.RequestWorkletService( - GetParam(), distinct_origin, data.back().process_handle.get(), - data.back().run_loop->QuitClosure())); + ASSERT_EQ(original_size < GetMaxProcesses(), + auction_process_manager_.RequestWorkletService( + GetParam(), distinct_origin, site_instance_, + data.back().process_handle.get(), + data.back().run_loop->QuitClosure())); } break; @@ -441,7 +482,7 @@ auto process_delayed_a1 = std::make_unique<AuctionProcessManager::ProcessHandle>(); ASSERT_FALSE(auction_process_manager_.RequestWorkletService( - GetParam(), kOriginA, process_delayed_a1.get(), + GetParam(), kOriginA, site_instance_, process_delayed_a1.get(), run_loop_delayed_a1.QuitClosure())); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(run_loop_delayed_a1.AnyQuitCalled()); @@ -452,7 +493,7 @@ auto process_delayed_a2 = std::make_unique<AuctionProcessManager::ProcessHandle>(); ASSERT_FALSE(auction_process_manager_.RequestWorkletService( - GetParam(), kOriginA, process_delayed_a2.get(), + GetParam(), kOriginA, site_instance_, process_delayed_a2.get(), run_loop_delayed_a2.QuitClosure())); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(run_loop_delayed_a2.AnyQuitCalled()); @@ -463,7 +504,7 @@ auto process_delayed_b = std::make_unique<AuctionProcessManager::ProcessHandle>(); ASSERT_FALSE(auction_process_manager_.RequestWorkletService( - GetParam(), kOriginB, process_delayed_b.get(), + GetParam(), kOriginB, site_instance_, process_delayed_b.get(), run_loop_delayed_b.QuitClosure())); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(run_loop_delayed_b.AnyQuitCalled()); @@ -537,7 +578,8 @@ auto pending_process1 = std::make_unique<AuctionProcessManager::ProcessHandle>(); ASSERT_FALSE(auction_process_manager_.RequestWorkletService( - GetParam(), kOriginA, pending_process1.get(), NeverInvokedClosure())); + GetParam(), kOriginA, site_instance_, pending_process1.get(), + NeverInvokedClosure())); EXPECT_EQ(1u, GetPendingRequestsOfParamType()); // Destroy the pending request. Its callback should not be invoked. @@ -549,12 +591,13 @@ auto pending_process2 = std::make_unique<AuctionProcessManager::ProcessHandle>(); ASSERT_FALSE(auction_process_manager_.RequestWorkletService( - GetParam(), kOriginA, pending_process2.get(), NeverInvokedClosure())); + GetParam(), kOriginA, site_instance_, pending_process2.get(), + NeverInvokedClosure())); auto pending_process3 = std::make_unique<AuctionProcessManager::ProcessHandle>(); base::RunLoop pending_process3_run_loop; ASSERT_FALSE(auction_process_manager_.RequestWorkletService( - GetParam(), kOriginB, pending_process3.get(), + GetParam(), kOriginB, site_instance_, pending_process3.get(), pending_process3_run_loop.QuitClosure())); EXPECT_EQ(2u, GetPendingRequestsOfParamType()); @@ -594,5 +637,274 @@ EXPECT_EQ(1u, auction_process_manager_.NumReceivers()); } +TEST_P(AuctionProcessManagerTest, DisconnectBeforeDelete) { + // Exercise the codepath where the mojo pipe to a service is broken when + // a handle to its process is still alive, to make sure this is handled + // correctly (rather than hitting a DCHECK on incorrect refcounting). + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_a1 = + GetServiceExpectSuccess(kOriginA); + auction_process_manager_.ClosePipes(); + task_environment_.RunUntilIdle(); + handle_a1.reset(); + task_environment_.RunUntilIdle(); +} + +TEST_P(AuctionProcessManagerTest, ProcessDeleteBeforeHandle) { + // Exercise the codepath where a RenderProcessHostDestroyed is received, to + // make sure it doesn't crash. + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_a1 = + GetServiceExpectSuccess(kOriginA); + for (std::unique_ptr<MockRenderProcessHost>& proc : + *rph_factory_.GetProcesses()) { + proc.reset(); + } + task_environment_.RunUntilIdle(); + handle_a1.reset(); + task_environment_.RunUntilIdle(); +} + +class PartialSiteIsolationContentBrowserClient + : public TestContentBrowserClient { + public: + bool ShouldEnableStrictSiteIsolation() override { return false; } + + bool ShouldDisableSiteIsolation( + SiteIsolationMode site_isolation_mode) override { + switch (site_isolation_mode) { + case SiteIsolationMode::kStrictSiteIsolation: + return true; + case SiteIsolationMode::kPartialSiteIsolation: + return false; + } + } +}; + +class InRendererAuctionProcessManagerTest : public ::testing::Test { + protected: + InRendererAuctionProcessManagerTest() { + SiteInstance::StartIsolatingSite( + &test_browser_context_, kIsolatedOrigin.GetURL(), + ChildProcessSecurityPolicy::IsolatedOriginSource::TEST); + // Created these after StartIsolatingSite so they are affected by it. + site_instance1_ = SiteInstance::Create(&test_browser_context_); + site_instance2_ = SiteInstance::Create(&test_browser_context_); + } + + void SetUp() override { + RenderProcessHostImpl::set_render_process_host_factory_for_testing( + &rph_factory_); + SiteIsolationPolicy::DisableFlagCachingForTesting(); + } + + void TearDown() override { + RenderProcessHostImpl::set_render_process_host_factory_for_testing(nullptr); + } + + std::unique_ptr<AuctionProcessManager::ProcessHandle> + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType worklet_type, + scoped_refptr<SiteInstance> site_instance, + const url::Origin& origin) { + auto process_handle = + std::make_unique<AuctionProcessManager::ProcessHandle>(); + EXPECT_TRUE(auction_process_manager_.RequestWorkletService( + worklet_type, origin, site_instance, process_handle.get(), + NeverInvokedClosure())); + EXPECT_TRUE(process_handle->GetService()); + return process_handle; + } + + base::OnceClosure NeverInvokedClosure() { + return base::BindOnce( + []() { ADD_FAILURE() << "This should not be called"; }); + } + + BrowserTaskEnvironment task_environment_; + TestBrowserContext test_browser_context_; + MockRenderProcessHostFactory rph_factory_; + + // `site_instance1_` and `site_instance2_` are in different browsing + // instances. + scoped_refptr<SiteInstance> site_instance1_, site_instance2_; + InRendererAuctionProcessManager auction_process_manager_; + + const url::Origin kOriginA = url::Origin::Create(GURL("https://a.test")); + const url::Origin kOriginB = url::Origin::Create(GURL("https://b.test")); + const url::Origin kIsolatedOrigin = + url::Origin::Create(GURL("https://bank.test")); +}; + +TEST_F(InRendererAuctionProcessManagerTest, AndroidLike) { + PartialSiteIsolationContentBrowserClient browser_client; + ContentBrowserClient* orig_browser_client = + content::SetBrowserClientForTesting(&browser_client); + + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{features::kProcessSharingWithDefaultSiteInstances}, + /*disabled_features=*/{features::kProcessSharingWithStrictSiteInstances}); + + base::test::ScopedCommandLine scoped_command_line; + scoped_command_line.GetProcessCommandLine()->RemoveSwitch( + switches::kSitePerProcess); + + // Launch some services in different origins and browsing instances. + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_a1 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance1_, kOriginA); + int id_a1 = handle_a1->GetRenderProcessHostForTesting()->GetID(); + + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_a2 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance2_, kOriginA); + int id_a2 = handle_a2->GetRenderProcessHostForTesting()->GetID(); + + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_b1 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance1_, kOriginB); + int id_b1 = handle_b1->GetRenderProcessHostForTesting()->GetID(); + + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_b2 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance2_, kOriginB); + int id_b2 = handle_b2->GetRenderProcessHostForTesting()->GetID(); + + // Non-site-isolation requiring origins can share processes, but not across + // different browsing instances. + EXPECT_NE(id_a1, id_a2); + EXPECT_EQ(id_a1, id_b1); + EXPECT_NE(id_a1, id_b2); + EXPECT_NE(id_a2, id_b1); + EXPECT_EQ(id_a2, id_b2); + EXPECT_NE(id_b1, id_b2); + + // Site-isolation requiring origins are distinct from non-isolated ones, but + // can share across browsing instances. + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_i1 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance1_, kIsolatedOrigin); + int id_i1 = handle_i1->GetRenderProcessHostForTesting()->GetID(); + + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_i2 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance2_, kIsolatedOrigin); + int id_i2 = handle_i2->GetRenderProcessHostForTesting()->GetID(); + + EXPECT_EQ(id_i1, id_i2); + EXPECT_NE(id_i1, id_a1); + EXPECT_NE(id_i1, id_a2); + EXPECT_NE(id_i1, id_b1); + EXPECT_NE(id_i1, id_b2); + + content::SetBrowserClientForTesting(orig_browser_client); +} + +TEST_F(InRendererAuctionProcessManagerTest, DesktopLike) { + // Use a site-per-process mode. + base::test::ScopedCommandLine scoped_command_line; + scoped_command_line.GetProcessCommandLine()->AppendSwitch( + switches::kSitePerProcess); + + // Launch some services in different origins and browsing instances. + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_a1 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance1_, kOriginA); + int id_a1 = handle_a1->GetRenderProcessHostForTesting()->GetID(); + + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_a2 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance2_, kOriginA); + int id_a2 = handle_a2->GetRenderProcessHostForTesting()->GetID(); + + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_b1 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance1_, kOriginB); + int id_b1 = handle_b1->GetRenderProcessHostForTesting()->GetID(); + + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_b2 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance2_, kOriginB); + int id_b2 = handle_b2->GetRenderProcessHostForTesting()->GetID(); + + // Since we are site-per-process, things should be grouped by origin. + EXPECT_EQ(id_a1, id_a2); + EXPECT_NE(id_a1, id_b1); + EXPECT_NE(id_a1, id_b2); + EXPECT_NE(id_a2, id_b1); + EXPECT_NE(id_a2, id_b2); + EXPECT_EQ(id_b1, id_b2); + + // Stuff that's also isolated by explicit requests gets the same treatment. + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_i1 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance1_, kIsolatedOrigin); + int id_i1 = handle_i1->GetRenderProcessHostForTesting()->GetID(); + + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_i2 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance2_, kIsolatedOrigin); + int id_i2 = handle_i2->GetRenderProcessHostForTesting()->GetID(); + + EXPECT_EQ(id_i1, id_i2); + EXPECT_NE(id_i1, id_a1); + EXPECT_NE(id_i1, id_a2); + EXPECT_NE(id_i1, id_b1); + EXPECT_NE(id_i1, id_b2); +} + +TEST_F(InRendererAuctionProcessManagerTest, PolicyChange) { + PartialSiteIsolationContentBrowserClient browser_client; + ContentBrowserClient* orig_browser_client = + content::SetBrowserClientForTesting(&browser_client); + + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures( + /*enabled_features=*/{features::kProcessSharingWithDefaultSiteInstances}, + /*disabled_features=*/{features::kProcessSharingWithStrictSiteInstances}); + + base::test::ScopedCommandLine scoped_command_line; + scoped_command_line.GetProcessCommandLine()->RemoveSwitch( + switches::kSitePerProcess); + + // Launch site in default instance. + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_a1 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance1_, kOriginA); + EXPECT_FALSE( + handle_a1->site_instance_for_testing()->RequiresDedicatedProcess()); + RenderProcessHost* shared_process = + handle_a1->GetRenderProcessHostForTesting(); + + // Change policy so that A can no longer use shared instances. + SiteInstance::StartIsolatingSite( + &test_browser_context_, kOriginA.GetURL(), + ChildProcessSecurityPolicy::IsolatedOriginSource::TEST); + site_instance1_ = SiteInstance::Create(&test_browser_context_); + + // Launch another A-origin worklet, this should get a different process. + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_a2 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance1_, kOriginA); + EXPECT_TRUE( + handle_a2->site_instance_for_testing()->RequiresDedicatedProcess()); + EXPECT_NE(handle_a2->GetRenderProcessHostForTesting(), shared_process); + + // Destroy shared process and try to get another A one --- should reuse the + // same non-shared process. + handle_a1.reset(); + std::unique_ptr<AuctionProcessManager::ProcessHandle> handle_a3 = + GetServiceOfTypeExpectSuccess(AuctionProcessManager::WorkletType::kSeller, + site_instance1_, kOriginA); + EXPECT_TRUE( + handle_a3->site_instance_for_testing()->RequiresDedicatedProcess()); + EXPECT_EQ(handle_a2->GetRenderProcessHostForTesting(), + handle_a3->GetRenderProcessHostForTesting()); + // Checking GetRenderProcessHostForTesting isn't enough since SiteInstance + // can share it, too. + EXPECT_EQ(handle_a2->worklet_process_for_testing(), + handle_a3->worklet_process_for_testing()); + + content::SetBrowserClientForTesting(orig_browser_client); +} + } // namespace } // namespace content
diff --git a/content/browser/interest_group/auction_runner.cc b/content/browser/interest_group/auction_runner.cc index 5f2c800..c98126f 100644 --- a/content/browser/interest_group/auction_runner.cc +++ b/content/browser/interest_group/auction_runner.cc
@@ -1133,6 +1133,7 @@ // If there's a tie for top bid, the highest score is second highest score // as well. second_highest_score_ = score; + num_second_highest_bids_ = num_top_bids_; if (owner != top_bid_->bid->interest_group->owner) { at_most_one_top_bid_owner_ = false; at_most_one_second_highest_scoring_bids_owner_ = false; @@ -1151,6 +1152,7 @@ // Previous top bid becomes highest scoring other bid. highest_scoring_other_bid_ = top_bid_->bid->bid; second_highest_score_ = top_bid_->score; + num_second_highest_bids_ = num_top_bids_; highest_scoring_other_bid_owner_ = top_bid_->bid->interest_group->owner; at_most_one_second_highest_scoring_bids_owner_ = at_most_one_top_bid_owner_; } @@ -1161,15 +1163,24 @@ double bid_value, const url::Origin& owner) { // Current (the most recent) bid becomes highest scoring other bid. - highest_scoring_other_bid_ = bid_value; - at_most_one_second_highest_scoring_bids_owner_ = true; - if (score == second_highest_score_) { + if (score > second_highest_score_) { + highest_scoring_other_bid_ = bid_value; + at_most_one_second_highest_scoring_bids_owner_ = true; + num_second_highest_bids_ = 1; + highest_scoring_other_bid_owner_ = owner; + } else { + // score == second_highest_score_ DCHECK(highest_scoring_other_bid_owner_.has_value()); if (owner != highest_scoring_other_bid_owner_.value()) at_most_one_second_highest_scoring_bids_owner_ = false; + // In case of a tie, randomly decide which to pick. + ++num_second_highest_bids_; + if (1 == base::RandInt(1, num_second_highest_bids_)) { + highest_scoring_other_bid_owner_ = owner; + highest_scoring_other_bid_ = bid_value; + } } second_highest_score_ = score; - highest_scoring_other_bid_owner_ = owner; } absl::optional<std::string> AuctionRunner::Auction::PerBuyerSignals(
diff --git a/content/browser/interest_group/auction_runner.h b/content/browser/interest_group/auction_runner.h index ae3dda94..a15cb11 100644 --- a/content/browser/interest_group/auction_runner.h +++ b/content/browser/interest_group/auction_runner.h
@@ -819,6 +819,8 @@ std::unique_ptr<ScoredBid> top_bid_; // Number of bidders with the same score as `top_bidder`. size_t num_top_bids_ = 0; + // Number of bidders with the same score as `second_highest_score_`. + size_t num_second_highest_bids_ = 0; // The numeric value of the bid that got the second highest score. When // there's a tie for second highest score, just take the most recent one (
diff --git a/content/browser/interest_group/auction_runner_unittest.cc b/content/browser/interest_group/auction_runner_unittest.cc index c954f1dd..6ef7629 100644 --- a/content/browser/interest_group/auction_runner_unittest.cc +++ b/content/browser/interest_group/auction_runner_unittest.cc
@@ -1138,9 +1138,10 @@ ~MockAuctionProcessManager() override = default; // AuctionProcessManager implementation: - void LaunchProcess( + RenderProcessHost* LaunchProcess( mojo::PendingReceiver<auction_worklet::mojom::AuctionWorkletService> auction_worklet_service_receiver, + const ProcessHandle* handle, const std::string& display_name) override { mojo::ReceiverId receiver_id = receiver_set_.Add(this, std::move(auction_worklet_service_receiver)); @@ -1161,6 +1162,17 @@ } receiver_display_name_map_[receiver_id] = display_name; + return nullptr; + } + + scoped_refptr<SiteInstance> MaybeComputeSiteInstance( + SiteInstance* frame_site_instance, + const url::Origin& worklet_origin) override { + return nullptr; + } + + bool TryUseSharedProcess(ProcessHandle* process_handle) override { + return false; } // auction_worklet::mojom::AuctionWorkletService implementation: @@ -1347,9 +1359,10 @@ } private: - void LaunchProcess( + RenderProcessHost* LaunchProcess( mojo::PendingReceiver<auction_worklet::mojom::AuctionWorkletService> auction_worklet_service_receiver, + const ProcessHandle* handle, const std::string& display_name) override { // Create one AuctionWorkletServiceImpl per Mojo pipe, just like in // production code. Don't bother to delete the service on pipe close, @@ -1357,6 +1370,17 @@ auction_worklet_services_.push_back( std::make_unique<auction_worklet::AuctionWorkletServiceImpl>( std::move(auction_worklet_service_receiver))); + return nullptr; + } + + scoped_refptr<SiteInstance> MaybeComputeSiteInstance( + SiteInstance* frame_site_instance, + const url::Origin& worklet_origin) override { + return nullptr; + } + + bool TryUseSharedProcess(ProcessHandle* process_handle) override { + return false; } std::vector<std::unique_ptr<auction_worklet::AuctionWorkletServiceImpl>> @@ -1516,6 +1540,7 @@ interest_group_manager_ = std::make_unique<InterestGroupManagerImpl>( base::FilePath(), /*in_memory=*/true, + InterestGroupManagerImpl::ProcessMode::kDedicated, /*url_loader_factory=*/nullptr); if (!auction_process_manager_) { auction_process_manager_ = @@ -1725,6 +1750,9 @@ return &url_loader_factory_; } RenderFrameHostImpl* GetFrame() override { return nullptr; } + scoped_refptr<SiteInstance> GetFrameSiteInstance() override { + return scoped_refptr<SiteInstance>(); + } network::mojom::ClientSecurityStatePtr GetClientSecurityState() override { return network::mojom::ClientSecurityState::New(); } @@ -4480,9 +4508,9 @@ GURL(base::StringPrintf("https://%zu.test", i))); EXPECT_TRUE(auction_process_manager->RequestWorkletService( AuctionProcessManager::WorkletType::kSeller, origin, - &*sellers.back(), base::BindOnce([]() { - ADD_FAILURE() << "This should not be called"; - }))); + scoped_refptr<SiteInstance>(), &*sellers.back(), + base::BindOnce( + []() { ADD_FAILURE() << "This should not be called"; }))); } } @@ -4496,9 +4524,9 @@ GURL(base::StringPrintf("https://blocking.bidder.%zu.test", i))); EXPECT_TRUE(auction_process_manager->RequestWorkletService( AuctionProcessManager::WorkletType::kBidder, origin, - &*bidders.back(), base::BindOnce([]() { - ADD_FAILURE() << "This should not be called"; - }))); + scoped_refptr<SiteInstance>(), &*bidders.back(), + base::BindOnce( + []() { ADD_FAILURE() << "This should not be called"; }))); } // If neither sellers nor bidders are at their limit, the auction should @@ -4623,9 +4651,9 @@ GURL(base::StringPrintf("https://%zu.test", i))); EXPECT_TRUE(auction_process_manager->RequestWorkletService( AuctionProcessManager::WorkletType::kSeller, origin, - &*sellers.back(), base::BindOnce([]() { - ADD_FAILURE() << "This should not be called"; - }))); + scoped_refptr<SiteInstance>(), &*sellers.back(), + base::BindOnce( + []() { ADD_FAILURE() << "This should not be called"; }))); } // Make `num_used_bidder_worklet_processes` bidder worklet requests for @@ -4638,9 +4666,9 @@ GURL(base::StringPrintf("https://blocking.bidder.%zu.test", i))); EXPECT_TRUE(auction_process_manager->RequestWorkletService( AuctionProcessManager::WorkletType::kBidder, origin, - &*bidders.back(), base::BindOnce([]() { - ADD_FAILURE() << "This should not be called"; - }))); + scoped_refptr<SiteInstance>(), &*bidders.back(), + base::BindOnce( + []() { ADD_FAILURE() << "This should not be called"; }))); } // If neither sellers nor bidders are at their limit, the auction should @@ -4766,9 +4794,9 @@ GURL(base::StringPrintf("https://blocking.bidder.%zu.test", i))); EXPECT_TRUE(auction_process_manager_->RequestWorkletService( AuctionProcessManager::WorkletType::kBidder, origin, - &*other_bidders.back(), base::BindOnce([]() { - ADD_FAILURE() << "This should not be called"; - }))); + scoped_refptr<SiteInstance>(), &*other_bidders.back(), + base::BindOnce( + []() { ADD_FAILURE() << "This should not be called"; }))); } auction_worklet::AddJavascriptResponse(&url_loader_factory_, kSellerUrl, @@ -4844,9 +4872,10 @@ url::Origin origin = url::Origin::Create(GURL(base::StringPrintf("https://%zu.test", i))); EXPECT_TRUE(auction_process_manager_->RequestWorkletService( - AuctionProcessManager::WorkletType::kSeller, origin, &*sellers.back(), - base::BindOnce( - []() { ADD_FAILURE() << "This should not be called"; }))); + AuctionProcessManager::WorkletType::kSeller, origin, + scoped_refptr<SiteInstance>(), &*sellers.back(), base::BindOnce([]() { + ADD_FAILURE() << "This should not be called"; + }))); } // Take up but 1 of the bidder worklet process slots. @@ -4856,9 +4885,10 @@ url::Origin origin = url::Origin::Create( GURL(base::StringPrintf("https://blocking.bidder.%zu.test", i))); EXPECT_TRUE(auction_process_manager_->RequestWorkletService( - AuctionProcessManager::WorkletType::kBidder, origin, &*bidders.back(), - base::BindOnce( - []() { ADD_FAILURE() << "This should not be called"; }))); + AuctionProcessManager::WorkletType::kBidder, origin, + scoped_refptr<SiteInstance>(), &*bidders.back(), base::BindOnce([]() { + ADD_FAILURE() << "This should not be called"; + }))); } RunStandardAuction();
diff --git a/content/browser/interest_group/auction_worklet_manager.cc b/content/browser/interest_group/auction_worklet_manager.cc index afd4949..f68a436 100644 --- a/content/browser/interest_group/auction_worklet_manager.cc +++ b/content/browser/interest_group/auction_worklet_manager.cc
@@ -25,6 +25,7 @@ #include "content/browser/interest_group/auction_process_manager.h" #include "content/browser/interest_group/auction_url_loader_factory_proxy.h" #include "content/browser/interest_group/debuggable_auction_worklet.h" +#include "content/browser/renderer_host/render_frame_host_impl.h" #include "content/common/content_export.h" #include "content/services/auction_worklet/public/mojom/bidder_worklet.mojom.h" #include "content/services/auction_worklet/public/mojom/seller_worklet.mojom.h" @@ -126,6 +127,7 @@ worklet_info_(std::move(worklet_info)) { if (worklet_manager_->auction_process_manager()->RequestWorkletService( worklet_info_.type, url::Origin::Create(worklet_info_.script_url), + worklet_manager_->delegate()->GetFrameSiteInstance(), &process_handle_, base::BindOnce( &AuctionWorkletManager::WorkletOwner::OnProcessAssigned,
diff --git a/content/browser/interest_group/auction_worklet_manager.h b/content/browser/interest_group/auction_worklet_manager.h index 1da6852..168a483a 100644 --- a/content/browser/interest_group/auction_worklet_manager.h +++ b/content/browser/interest_group/auction_worklet_manager.h
@@ -28,6 +28,7 @@ namespace content { class RenderFrameHostImpl; +class SiteInstance; // Per-frame manager of auction worklets. Manages creation and sharing of // worklets. Worklets may be reused if they share URLs for scripts and trusted @@ -81,6 +82,9 @@ // Get containing frame. (Passed to debugging hooks). virtual RenderFrameHostImpl* GetFrame() = 0; + // Returns the SiteInstance representing the frame running the auction. + virtual scoped_refptr<SiteInstance> GetFrameSiteInstance() = 0; + // Returns the ClientSecurityState associated with the frame, for use in // bidder worklet and signals fetches. virtual network::mojom::ClientSecurityStatePtr GetClientSecurityState() = 0;
diff --git a/content/browser/interest_group/auction_worklet_manager_unittest.cc b/content/browser/interest_group/auction_worklet_manager_unittest.cc index 43e3569..0213c51 100644 --- a/content/browser/interest_group/auction_worklet_manager_unittest.cc +++ b/content/browser/interest_group/auction_worklet_manager_unittest.cc
@@ -20,6 +20,7 @@ #include "base/test/task_environment.h" #include "base/time/time.h" #include "content/browser/interest_group/auction_process_manager.h" +#include "content/public/browser/site_instance.h" #include "content/services/auction_worklet/public/mojom/auction_worklet_service.mojom.h" #include "content/services/auction_worklet/public/mojom/bidder_worklet.mojom.h" #include "content/services/auction_worklet/public/mojom/seller_worklet.mojom.h" @@ -384,9 +385,10 @@ ~MockAuctionProcessManager() override = default; // AuctionProcessManager implementation: - void LaunchProcess( + RenderProcessHost* LaunchProcess( mojo::PendingReceiver<auction_worklet::mojom::AuctionWorkletService> auction_worklet_service_receiver, + const ProcessHandle* process_handle, const std::string& display_name) override { mojo::ReceiverId receiver_id = receiver_set_.Add(this, std::move(auction_worklet_service_receiver)); @@ -407,6 +409,17 @@ } receiver_display_name_map_[receiver_id] = display_name; + return nullptr; + } + + scoped_refptr<SiteInstance> MaybeComputeSiteInstance( + SiteInstance* frame_site_instance, + const url::Origin& worklet_origin) override { + return nullptr; + } + + bool TryUseSharedProcess(ProcessHandle* process_handle) override { + return false; } // auction_worklet::mojom::AuctionWorkletService implementation: @@ -543,6 +556,9 @@ return &url_loader_factory_; } RenderFrameHostImpl* GetFrame() override { return nullptr; } + scoped_refptr<SiteInstance> GetFrameSiteInstance() override { + return scoped_refptr<SiteInstance>(); + } network::mojom::ClientSecurityStatePtr GetClientSecurityState() override { return network::mojom::ClientSecurityState::New(); }
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc index 17c27be..79000b4 100644 --- a/content/browser/interest_group/interest_group_browsertest.cc +++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -2454,36 +2454,36 @@ AttachInterestGroupObserver(); EXPECT_EQ( - kSuccess, - JoinInterestGroupAndVerify(blink::InterestGroup( - /*expiry=*/base::Time(), - /*owner=*/test_origin, - /*name=*/"cars", - /*priority=*/0.0, - /*bidding_url=*/ - https_server_->GetURL("a.test", "/interest_group/bidding_logic.js"), - /*bidding_wasm_helper_url=*/absl::nullopt, - /*daily_update_url=*/absl::nullopt, - /*trusted_bidding_signals_url=*/absl::nullopt, - /*trusted_bidding_signals_keys=*/absl::nullopt, - /*user_bidding_signals=*/"{some: 'json', data: {here: [1, 2]}}", - /*ads=*/ - {{{GURL("https://example.com/render"), - "{ad:'metadata', here:[1,2]}"}}}, - /*ad_components=*/absl::nullopt))); + "TypeError: Failed to execute 'runAdAuction' on 'Navigator': " + "decisionLogicUrl 'https://b.test/foo' for AuctionAdConfig with seller " + "'https://a.test/' must match seller origin.", + RunAuctionAndWait(R"({ + seller: "https://a.test/", + decisionLogicUrl: "https://b.test/foo", + interestGroupBuyers: ["https://c.test/"], + })")); + WaitForAccessObserved({}); +} - EXPECT_EQ(nullptr, RunAuctionAndWait(JsReplace( - R"({ - seller: $1, - decisionLogicUrl: $2, - interestGroupBuyers: [$1], - })", - test_origin, - https_server_->GetURL( - "b.test", "/interest_group/decision_logic.js")))); - WaitForAccessObserved({ - {InterestGroupTestObserver::kJoin, test_origin.Serialize(), "cars"}, - }); +IN_PROC_BROWSER_TEST_F( + InterestGroupBrowserTest, + RunAdAuctionTrustedScoringSignalsUrlDifferentFromSeller) { + GURL test_url = https_server_->GetURL("a.test", "/echo"); + ASSERT_TRUE(NavigateToURL(shell(), test_url)); + url::Origin test_origin = url::Origin::Create(test_url); + AttachInterestGroupObserver(); + + EXPECT_EQ( + "TypeError: Failed to execute 'runAdAuction' on 'Navigator': " + "trustedScoringSignalsUrl 'https://b.test/foo' for AuctionAdConfig with " + "seller 'https://a.test/' must match seller origin.", + RunAuctionAndWait(R"({ + seller: "https://a.test/", + decisionLogicUrl: "https://a.test/foo", + trustedScoringSignalsUrl: "https://b.test/foo", + interestGroupBuyers: ["https://c.test/"], + })")); + WaitForAccessObserved({}); } IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest,
diff --git a/content/browser/interest_group/interest_group_manager_impl.cc b/content/browser/interest_group/interest_group_manager_impl.cc index 382ca696..a588619 100644 --- a/content/browser/interest_group/interest_group_manager_impl.cc +++ b/content/browser/interest_group/interest_group_manager_impl.cc
@@ -34,7 +34,9 @@ constexpr int kMaxActiveReportRequests = 5; // The maximum number of report URLs that can be stored in `report_requests_` // queue. -constexpr int kMaxReportQueueLength = 100; +constexpr int kMaxReportQueueLength = 1000; +// The maximum amount of time allowed to fetch report requests in the queue. +constexpr base::TimeDelta kMaxReportingRoundDuration = base::Minutes(10); // The time interval to wait before sending the next report after sending one. constexpr base::TimeDelta kReportingInterval = base::Milliseconds(50); @@ -92,16 +94,22 @@ InterestGroupManagerImpl::InterestGroupManagerImpl( const base::FilePath& path, bool in_memory, + ProcessMode process_mode, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) : impl_(base::ThreadPool::CreateSequencedTaskRunner( {base::MayBlock(), base::TaskPriority::USER_VISIBLE, base::TaskShutdownBehavior::BLOCK_SHUTDOWN}), in_memory ? base::FilePath() : path), - auction_process_manager_(std::make_unique<AuctionProcessManager>()), + auction_process_manager_( + base::WrapUnique(process_mode == ProcessMode::kDedicated + ? static_cast<AuctionProcessManager*>( + new DedicatedAuctionProcessManager()) + : new InRendererAuctionProcessManager())), update_manager_(this, std::move(url_loader_factory)), max_active_report_requests_(kMaxActiveReportRequests), max_report_queue_length_(kMaxReportQueueLength), - reporting_interval_(kReportingInterval) {} + reporting_interval_(kReportingInterval), + max_reporting_round_duration_(kMaxReportingRoundDuration) {} InterestGroupManagerImpl::~InterestGroupManagerImpl() = default; @@ -354,6 +362,12 @@ } void InterestGroupManagerImpl::SendReports() { + if (reporting_started_ == base::TimeTicks::Min()) { + // It appears we're staring a new reporting round; mark the time we started + // the round. + reporting_started_ = base::TimeTicks::Now(); + } + while (!report_requests_.empty() && num_active_ < max_active_report_requests_) { num_active_++; @@ -362,8 +376,22 @@ } void InterestGroupManagerImpl::TrySendingOneReport() { + if (base::TimeTicks::Now() - reporting_started_ > + max_reporting_round_duration_) { + // We've been reporting for too long; delete all pending reports in the + // queue. + // TODO(qingxinwu): maybe add UMA metrics to learn how often this happens. + report_requests_.clear(); + reporting_started_ = base::TimeTicks::Min(); + } + if (report_requests_.empty()) { + DCHECK_GT(num_active_, 0); num_active_--; + if (num_active_ == 0) { + // This reporting round is finished, there's no more work to do. + reporting_started_ = base::TimeTicks::Min(); + } return; } @@ -407,19 +435,24 @@ num_active_--; } +void InterestGroupManagerImpl::set_max_active_report_requests_for_testing( + int max_active_report_requests) { + max_active_report_requests_ = max_active_report_requests; +} + void InterestGroupManagerImpl::set_max_report_queue_length_for_testing( int max_queue_length) { max_report_queue_length_ = max_queue_length; } +void InterestGroupManagerImpl::set_max_reporting_round_duration_for_testing( + base::TimeDelta max_reporting_round_duration) { + max_reporting_round_duration_ = max_reporting_round_duration; +} + void InterestGroupManagerImpl::set_reporting_interval_for_testing( base::TimeDelta interval) { reporting_interval_ = interval; } -void InterestGroupManagerImpl::set_max_active_report_requests_for_testing( - int max_active_report_requests) { - max_active_report_requests_ = max_active_report_requests; -} - } // namespace content
diff --git a/content/browser/interest_group/interest_group_manager_impl.h b/content/browser/interest_group/interest_group_manager_impl.h index 569b246..b9f7fc8 100644 --- a/content/browser/interest_group/interest_group_manager_impl.h +++ b/content/browser/interest_group/interest_group_manager_impl.h
@@ -49,12 +49,18 @@ // as it performs blocking file IO when backed by on-disk storage. class CONTENT_EXPORT InterestGroupManagerImpl : public InterestGroupManager { public: + // Controls how auction worklets will be run. kDedicated will use + // fully-isolated utility processes solely for worklet. kInRenderer will + // re-use regular renderers following the normal site isolation policy. + enum class ProcessMode { kDedicated, kInRenderer }; + // Creates an interest group manager using the provided directory path for // persistent storage. If `in_memory` is true the path is ignored and only // in-memory storage is used. explicit InterestGroupManagerImpl( const base::FilePath& path, bool in_memory, + ProcessMode process_mode, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory); ~InterestGroupManagerImpl() override; InterestGroupManagerImpl(const InterestGroupManagerImpl& other) = delete; @@ -189,18 +195,26 @@ auction_process_manager_ = std::move(auction_process_manager); } + // For testing *only*; changes the maximum number of active report requests + // at a time. + void set_max_active_report_requests_for_testing( + int max_active_report_requests); + // For testing *only*; changes the maximum number of report requests that can // be stored in `report_requests_` queue. void set_max_report_queue_length_for_testing(int max_queue_length); + // For testing *only*; changes `max_reporting_round_duration_`. + void set_max_reporting_round_duration_for_testing( + base::TimeDelta max_reporting_round_duration); + // For testing *only*; changes the time interval to wait before sending the // next report after sending one. void set_reporting_interval_for_testing(base::TimeDelta interval); - // For testing *only*; changes the maximum number of active report requests - // at a time. - void set_max_active_report_requests_for_testing( - int max_active_report_requests); + size_t report_queue_length_for_testing() const { + return report_requests_.size(); + } private: // InterestGroupUpdateManager calls private members to write updates to the @@ -336,6 +350,17 @@ // Should *only* be changed by tests. base::TimeDelta reporting_interval_; + // The maximum amount of time that the reporting process can run before the + // report queue is cleared due to taking too long. + // + // Should *only* be changed by tests. + base::TimeDelta max_reporting_round_duration_; + + // The last time we started sending reports from the `report_requests_` queue; + // used to clear pending report requests in the queue if reporting takes too + // long. + base::TimeTicks reporting_started_ = base::TimeTicks::Min(); + base::WeakPtrFactory<InterestGroupManagerImpl> weak_factory_{this}; };
diff --git a/content/browser/net/sandboxed_nqe_browsertest.cc b/content/browser/net/sandboxed_nqe_browsertest.cc index 94bba8a..4a09c385 100644 --- a/content/browser/net/sandboxed_nqe_browsertest.cc +++ b/content/browser/net/sandboxed_nqe_browsertest.cc
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <vector> + #include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "content/public/browser/network_service_instance.h" @@ -15,9 +17,29 @@ #include "services/network/public/cpp/network_quality_tracker.h" #include "services/network/public/mojom/network_service_test.mojom.h" +#if BUILDFLAG(IS_ANDROID) +#include "net/android/network_change_notifier_delegate_android.h" +#include "net/android/network_library.h" +#endif + namespace content { namespace { +std::ostream& operator<<( + std::ostream& os, + const std::vector<net::EffectiveConnectionType>& types) { + os << "["; + bool is_first = true; + for (auto& type : types) { + if (is_first) + is_first = false; + else + os << ","; + os << type; + } + return os << "]"; +} + class TestNetworkQualityObserver : public network::NetworkQualityTracker::EffectiveConnectionTypeObserver { public: @@ -26,32 +48,36 @@ // NetworkQualityTracker::EffectiveConnectionTypeObserver implementation: void OnEffectiveConnectionTypeChanged( net::EffectiveConnectionType type) override { - effective_connection_type_ = type; - if (effective_connection_type_ != run_loop_wait_effective_connection_type_) + received_types_.push_back(type); + if (type != run_loop_wait_type_) return; run_loop_->Quit(); } - void WaitForNotification( - net::EffectiveConnectionType run_loop_wait_effective_connection_type) { - if (effective_connection_type_ == run_loop_wait_effective_connection_type) + void WaitForNotification(net::EffectiveConnectionType run_loop_wait_type) { + if (std::any_of(received_types_.begin(), received_types_.end(), + [=](net::EffectiveConnectionType type) { + return type == run_loop_wait_type; + })) { + received_types_.clear(); return; - run_loop_wait_effective_connection_type_ = - run_loop_wait_effective_connection_type; + } + run_loop_wait_type_ = run_loop_wait_type; run_loop_ = std::make_unique<base::RunLoop>(); run_loop_->Run(); - } - - net::EffectiveConnectionType EffectiveConnectionType() const { - return effective_connection_type_; + if (!run_loop_->AnyQuitCalled()) { + LOG(ERROR) << "Timed out waiting run_loop_wait_type=" + << run_loop_wait_type + << ", received_types_=" << received_types_; + } + received_types_.clear(); } private: std::unique_ptr<base::RunLoop> run_loop_; - net::EffectiveConnectionType run_loop_wait_effective_connection_type_ = + net::EffectiveConnectionType run_loop_wait_type_ = net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN; - net::EffectiveConnectionType effective_connection_type_ = - net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN; + std::vector<net::EffectiveConnectionType> received_types_; }; class SandboxedNQEBrowserTest : public ContentBrowserTest { @@ -88,7 +114,6 @@ // Simulates a network quality change. void SimulateNetworkQualityChange(net::EffectiveConnectionType type) { - mojo::ScopedAllowSyncCallForTesting allow_sync_call; DCHECK(content::GetNetworkService()); mojo::Remote<network::mojom::NetworkServiceTest> network_service_test; @@ -100,6 +125,19 @@ run_loop.Run(); } + void ForceNetworkQualityEstimatorReportWifiAsSlow2G() { + mojo::ScopedAllowSyncCallForTesting allow_sync_call; + DCHECK(content::GetNetworkService()); + + mojo::Remote<network::mojom::NetworkServiceTest> network_service_test; + content::GetNetworkService()->BindTestInterface( + network_service_test.BindNewPipeAndPassReceiver()); + base::RunLoop run_loop; + network_service_test->ForceNetworkQualityEstimatorReportWifiAsSlow2G( + run_loop.QuitClosure()); + run_loop.Run(); + } + private: base::test::ScopedFeatureList scoped_feature_list_; }; @@ -131,14 +169,10 @@ SimulateNetworkQualityChange(net::EFFECTIVE_CONNECTION_TYPE_4G); network_quality_observer.WaitForNotification( net::EFFECTIVE_CONNECTION_TYPE_4G); - EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_4G, - network_quality_observer.EffectiveConnectionType()); SimulateNetworkQualityChange(net::EFFECTIVE_CONNECTION_TYPE_3G); network_quality_observer.WaitForNotification( net::EFFECTIVE_CONNECTION_TYPE_3G); - EXPECT_EQ(net::EFFECTIVE_CONNECTION_TYPE_3G, - network_quality_observer.EffectiveConnectionType()); // Typical RTT and downlink values when effective connection type is 3G. Taken // from net::NetworkQualityEstimatorParams. @@ -147,5 +181,39 @@ EXPECT_EQ(400, tracker->GetDownstreamThroughputKbps()); } +#if BUILDFLAG(IS_ANDROID) +// Turn on/off Wifi on Android and listen it in the network service. +IN_PROC_BROWSER_TEST_F(SandboxedNQEBrowserTest, TurnWifiEnabled) { + const std::string wifi_ssid = net::android::GetWifiSSID(); + if (wifi_ssid.empty()) { + GTEST_SKIP() << "This test requires wifi network."; + } + // Let NetworkQualityEstimator reports NetworkChangeNotifier::CONNECTION_WIFI + // as EFFECTIVE_CONNECTION_TYPE_SLOW_2G since EffectiveConnectionType and + // the production receivers doesn't notice Wifi. + ForceNetworkQualityEstimatorReportWifiAsSlow2G(); + net::NetworkChangeNotifierDelegateAndroid:: + EnableNetworkChangeNotifierAutoDetectForTest(); + + std::unique_ptr<network::NetworkQualityTracker> tracker = + std::make_unique<network::NetworkQualityTracker>( + base::BindRepeating(&GetNetworkService)); + TestNetworkQualityObserver network_quality_observer; + tracker->AddEffectiveConnectionTypeObserver(&network_quality_observer); + + net::android::SetWifiEnabledForTesting(true); + network_quality_observer.WaitForNotification( + net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G); + + net::android::SetWifiEnabledForTesting(false); + network_quality_observer.WaitForNotification( + net::EFFECTIVE_CONNECTION_TYPE_4G); + + net::android::SetWifiEnabledForTesting(true); + network_quality_observer.WaitForNotification( + net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G); +} +#endif + } // namespace } // namespace content
diff --git a/content/browser/network_service_client.cc b/content/browser/network_service_client.cc index dfc793c..e9b0b11 100644 --- a/content/browser/network_service_client.cc +++ b/content/browser/network_service_client.cc
@@ -29,7 +29,7 @@ #include "services/network/public/cpp/network_switches.h" #include "services/network/public/mojom/network_context.mojom.h" #include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #if BUILDFLAG(IS_ANDROID) #include "base/android/content_uri_utils.h"
diff --git a/content/browser/renderer_host/ancestor_throttle.cc b/content/browser/renderer_host/ancestor_throttle.cc index bb6d6c04..b690820 100644 --- a/content/browser/renderer_host/ancestor_throttle.cc +++ b/content/browser/renderer_host/ancestor_throttle.cc
@@ -30,7 +30,7 @@ #include "services/network/public/cpp/content_security_policy/csp_context.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom-shared.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" namespace content {
diff --git a/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc b/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc index e39352a..604c8a3 100644 --- a/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc +++ b/content/browser/renderer_host/back_forward_cache_can_store_document_result.cc
@@ -202,6 +202,17 @@ } } +bool BackForwardCacheCanStoreDocumentResult::operator==( + const BackForwardCacheCanStoreDocumentResult& other) const { + return not_restored_reasons() == other.not_restored_reasons() && + blocklisted_features() == other.blocklisted_features() && + disabled_reasons() == other.disabled_reasons() && + browsing_instance_swap_result() == + other.browsing_instance_swap_result() && + disallow_activation_reasons() == other.disallow_activation_reasons() && + ax_events() == other.ax_events(); +} + bool BackForwardCacheCanStoreDocumentResult::HasNotRestoredReason( BackForwardCacheMetrics::NotRestoredReason reason) const { return not_restored_reasons_.Has(reason);
diff --git a/content/browser/renderer_host/back_forward_cache_can_store_document_result.h b/content/browser/renderer_host/back_forward_cache_can_store_document_result.h index 84d3135..b4d6622 100644 --- a/content/browser/renderer_host/back_forward_cache_can_store_document_result.h +++ b/content/browser/renderer_host/back_forward_cache_can_store_document_result.h
@@ -43,6 +43,8 @@ BackForwardCacheCanStoreDocumentResult&&); ~BackForwardCacheCanStoreDocumentResult(); + bool operator==(const BackForwardCacheCanStoreDocumentResult& other) const; + // Add reasons contained in the |other| to |this|. void AddReasonsFrom(const BackForwardCacheCanStoreDocumentResult& other); bool HasNotRestoredReason( @@ -79,6 +81,11 @@ return disabled_reasons_; } + const absl::optional<ShouldSwapBrowsingInstance> + browsing_instance_swap_result() const { + return browsing_instance_swap_result_; + } + const std::set<uint64_t>& disallow_activation_reasons() const { return disallow_activation_reasons_; }
diff --git a/content/browser/renderer_host/back_forward_cache_impl.cc b/content/browser/renderer_host/back_forward_cache_impl.cc index 797c604..7ea4659d 100644 --- a/content/browser/renderer_host/back_forward_cache_impl.cc +++ b/content/browser/renderer_host/back_forward_cache_impl.cc
@@ -596,6 +596,7 @@ ChromeTrackEvent::kBackForwardCacheCanStoreDocumentResult, flattened_result); + DCHECK(tree->FlattenTree() == flattened_result); return BackForwardCacheCanStoreDocumentResultWithTree(flattened_result, std::move(tree)); } @@ -604,16 +605,17 @@ BackForwardCacheImpl::GetFutureBackForwardCacheEligibilityPotential( RenderFrameHostImpl* rfh) { BackForwardCacheCanStoreDocumentResult flattened; - auto result = PopulateReasonsForPage(rfh, flattened, - /*include_non_sticky = */ false); + auto tree = PopulateReasonsForPage(rfh, flattened, + /*include_non_sticky = */ false); DVLOG(1) << "GetFutureBackForwardCacheEligibilityPotential: " << rfh->GetLastCommittedURL() << " : " << flattened.ToString(); TRACE_EVENT( "navigation", "BackForwardCacheImpl::GetFutureBackForwardCacheEligibilityPotential", ChromeTrackEvent::kBackForwardCacheCanStoreDocumentResult, flattened); + DCHECK(tree->FlattenTree() == flattened); return BackForwardCacheCanStoreDocumentResultWithTree(flattened, - std::move(result)); + std::move(tree)); } std::unique_ptr<BackForwardCacheCanStoreTreeResult> @@ -878,6 +880,8 @@ BackForwardCacheImpl::CreateEvictionBackForwardCacheCanStoreTreeResult( RenderFrameHostImpl& rfh, BackForwardCacheCanStoreDocumentResult& eviction_reason) { + // At this point the page already has some NotRestoredReasons for eviction, so + // we should always record cache_control:no-store related reasons. BackForwardCacheImpl::NotRestoredReasonBuilder builder( rfh.GetMainFrame(), /* include_non_sticky = */ false, @@ -1387,6 +1391,21 @@ document_result_.AddReasonsFrom(result); } +const BackForwardCacheCanStoreDocumentResult +BackForwardCacheCanStoreTreeResult::FlattenTree() { + BackForwardCacheCanStoreDocumentResult document_result; + FlattenTreeHelper(&document_result); + return document_result; +} + +void BackForwardCacheCanStoreTreeResult::FlattenTreeHelper( + BackForwardCacheCanStoreDocumentResult* document_result) { + document_result->AddReasonsFrom(document_result_); + for (const auto& subtree : GetChildren()) { + subtree->FlattenTreeHelper(document_result); + } +} + std::unique_ptr<BackForwardCacheCanStoreTreeResult> BackForwardCacheCanStoreTreeResult::CreateEmptyTree(RenderFrameHostImpl* rfh) { BackForwardCacheCanStoreDocumentResult empty_result;
diff --git a/content/browser/renderer_host/back_forward_cache_impl.h b/content/browser/renderer_host/back_forward_cache_impl.h index f3aecc0..7014357 100644 --- a/content/browser/renderer_host/back_forward_cache_impl.h +++ b/content/browser/renderer_host/back_forward_cache_impl.h
@@ -567,6 +567,10 @@ return document_result_; } + // Flatten the tree and return a flattened list of not restored reasons that + // includes all the reasons in the tree. + const BackForwardCacheCanStoreDocumentResult FlattenTree(); + // The children nodes. We can access the children nodes of this // node/document from this vector. const ChildrenVector& GetChildren() const { return children_; } @@ -590,6 +594,9 @@ BackForwardCacheCanStoreDocumentResult& result_for_this_document, ChildrenVector children); + void FlattenTreeHelper( + BackForwardCacheCanStoreDocumentResult* document_result); + // See |GetDocumentResult| BackForwardCacheCanStoreDocumentResult document_result_;
diff --git a/content/browser/renderer_host/back_forward_cache_metrics.cc b/content/browser/renderer_host/back_forward_cache_metrics.cc index b349632..70ea956 100644 --- a/content/browser/renderer_host/back_forward_cache_metrics.cc +++ b/content/browser/renderer_host/back_forward_cache_metrics.cc
@@ -310,8 +310,6 @@ void BackForwardCacheMetrics::AddNotRestoredFlattenedReasonsToExistingResult( BackForwardCacheCanStoreDocumentResult& flattened) { - // TODO(yuzus): Add DCHECK to ensure the flattened reasons and the tree - // reasons match. page_store_result_->AddReasonsFrom(flattened); const BackForwardCacheCanStoreDocumentResult::NotRestoredReasons& @@ -331,6 +329,7 @@ void BackForwardCacheMetrics::SetNotRestoredReasons( BackForwardCacheCanStoreDocumentResultWithTree& can_store) { + DCHECK(can_store.tree_reasons->FlattenTree() == can_store.flattened_reasons); page_store_tree_result_ = std::move(can_store.tree_reasons); AddNotRestoredFlattenedReasonsToExistingResult(can_store.flattened_reasons); }
diff --git a/content/browser/renderer_host/compositor_impl_android.h b/content/browser/renderer_host/compositor_impl_android.h index df7ddf8..51e4c88e 100644 --- a/content/browser/renderer_host/compositor_impl_android.h +++ b/content/browser/renderer_host/compositor_impl_android.h
@@ -164,8 +164,6 @@ void DidObserveFirstScrollDelay( base::TimeDelta first_scroll_delay, base::TimeTicks first_scroll_timestamp) override {} - void ReportEventLatency( - std::vector<cc::EventLatencyTracker::LatencyData> latencies) override {} // LayerTreeHostSingleThreadClient implementation. void DidSubmitCompositorFrame() override;
diff --git a/content/browser/renderer_host/mixed_content_navigation_throttle.h b/content/browser/renderer_host/mixed_content_navigation_throttle.h index 721d21c..37c755fd 100644 --- a/content/browser/renderer_host/mixed_content_navigation_throttle.h +++ b/content/browser/renderer_host/mixed_content_navigation_throttle.h
@@ -14,7 +14,7 @@ #include "services/network/public/mojom/fetch_api.mojom.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h" #include "third_party/blink/public/mojom/loader/mixed_content.mojom-forward.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" namespace content {
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 646e9a53..3b8c8fb 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -159,7 +159,7 @@ #include "third_party/blink/public/mojom/navigation/prefetched_signed_exchange_info.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h" #include "third_party/blink/public/mojom/storage_key/ancestor_chain_bit.mojom.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "third_party/blink/public/platform/resource_request_blocked_reason.h" #include "ui/compositor/compositor_lock.h" #include "url/origin.h"
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 83f5291..fea70d1a 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -6450,9 +6450,30 @@ void RenderFrameHostImpl::ScrollRectToVisibleInParentFrame( const gfx::RectF& rect_to_scroll, blink::mojom::ScrollIntoViewParamsPtr params) { - RenderFrameProxyHost* proxy = GetProxyToParent(); + RenderFrameProxyHost* proxy = nullptr; + + if (IsFencedFrameRoot()) { + // TODO(bokan): This is overy trusting of the renderer. We'll need some way + // to verify that the browser is the one that initiated this + // ScrollFocusedEditable process. + // https://crbug.com/1123606. I&S tracker row 484. + if (!params->for_focused_editable) { + local_frame_host_receiver_.ReportBadMessage( + "ScrollRectToVisibleInParentFrame can only be used for " + "is_for_editable from a fenced frame"); + return; + } + + proxy = blink::features::IsFencedFramesMPArchBased() + ? GetProxyToOuterDelegate() + : GetProxyToParent(); + } else { + proxy = GetProxyToParent(); + } + if (!proxy) return; + proxy->ScrollRectToVisible(rect_to_scroll, std::move(params)); }
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 26307d1..5687ba97 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -3251,6 +3251,7 @@ switches::kFullMemoryCrashReport, switches::kGaiaUrl, switches::kIPCConnectionTimeout, + switches::kIsolatedAppOrigins, switches::kLogBestEffortTasks, switches::kLogFile, switches::kLoggingLevel,
diff --git a/content/browser/renderer_host/scroll_into_view_browsertest.cc b/content/browser/renderer_host/scroll_into_view_browsertest.cc index ccf21f6..910486f 100644 --- a/content/browser/renderer_host/scroll_into_view_browsertest.cc +++ b/content/browser/renderer_host/scroll_into_view_browsertest.cc
@@ -8,6 +8,7 @@ #include "base/json/json_reader.h" #include "base/strings/strcat.h" #include "base/test/bind.h" +#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "content/browser/renderer_host/render_widget_host_view_child_frame.h" #include "content/browser/web_contents/web_contents_impl.h" @@ -22,6 +23,8 @@ #include "content/test/content_browser_test_utils_internal.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#include "third_party/blink/public/common/features.h" +#include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom.h" #include "third_party/re2/src/re2/re2.h" #include "ui/events/event_constants.h" #include "url/gurl.h" @@ -112,6 +115,39 @@ base::WeakPtr<WebContents> web_contents_; }; +// Interceptor that can be used to verify calls to +// ScrollRectToVisibleInParentFrame on the LocalFrameHost interface. +class ScrollRectToVisibleInParentFrameInterceptor + : public blink::mojom::LocalFrameHostInterceptorForTesting { + public: + ScrollRectToVisibleInParentFrameInterceptor() = default; + ~ScrollRectToVisibleInParentFrameInterceptor() override = default; + + void Init(RenderFrameHostImpl* render_frame_host) { + render_frame_host_ = render_frame_host; + std::ignore = render_frame_host_->local_frame_host_receiver_for_testing() + .SwapImplForTesting(this); + } + + blink::mojom::LocalFrameHost* GetForwardingInterface() override { + return render_frame_host_; + } + + void ScrollRectToVisibleInParentFrame( + const gfx::RectF& rect_to_scroll, + blink::mojom::ScrollIntoViewParamsPtr params) override { + has_called_method_ = true; + } + + bool HasCalledScrollRectToVisibleInParentFrame() const { + return has_called_method_; + } + + private: + raw_ptr<RenderFrameHostImpl> render_frame_host_; + bool has_called_method_ = false; +}; + // Test harness for ScrollIntoView related browser tests. These tests are // mainly concerned with behavior of scroll into view related functionality // across remote frames. This harness depends on @@ -135,11 +171,12 @@ virtual bool IsForceLocalFrames() const = 0; virtual bool IsWritingModeLTR() const = 0; virtual TestInvokeMethod GetInvokeMethod() const = 0; + virtual net::EmbeddedTestServer* server() { return embedded_test_server(); } void SetUpOnMainThread() override { ContentBrowserTest::SetUpOnMainThread(); host_resolver()->AddRule("*", "127.0.0.1"); - ASSERT_TRUE(embedded_test_server()->Start()); + ASSERT_TRUE(server()->Start()); suppress_ime_ = std::make_unique<ScopedSuppressImeEvents>(web_contents()); } @@ -164,11 +201,21 @@ FrameTreeNode* InnerMostFrameTreeNode() { FrameTreeNode* node = web_contents()->GetPrimaryFrameTree().root(); - while (node->child_count()) { - // These tests never have multiple child frames. - CHECK_EQ(node->child_count(), 1ul); - - node = node->child_at(0); + while (node->child_count() || + node->current_frame_host()->inner_tree_main_frame_tree_node_id() != + FrameTreeNode::kFrameTreeNodeInvalidId) { + if (node->child_count()) { + CHECK_EQ( + node->current_frame_host()->inner_tree_main_frame_tree_node_id(), + FrameTreeNode::kFrameTreeNodeInvalidId); + // These tests never have multiple child frames. + CHECK_EQ(node->child_count(), 1ul); + node = node->child_at(0); + } else { + CHECK_EQ(node->child_count(), 0ul); + node = FrameTreeNode::GloballyFindByID( + node->current_frame_host()->inner_tree_main_frame_tree_node_id()); + } } return node; } @@ -297,14 +344,15 @@ // If `node` is a child frame, we'll convert rect up the ancestor frame // chain, clipping to each frame rect. - FrameTreeNode* frame = FrameTreeNode::From(node->parent()); + FrameTreeNode* frame = + FrameTreeNode::From(node->GetParentOrOuterDocument()); while (frame) { - gfx::RectF parent_rect = GetClientRect(frame, "iframe"); + gfx::RectF parent_rect = GetClientRect(frame, "#childframe"); rect.Offset(parent_rect.OffsetFromOrigin()); rect = gfx::IntersectRects(parent_rect, rect); - frame = FrameTreeNode::From(frame->parent()); + frame = FrameTreeNode::From(frame->GetParentOrOuterDocument()); } gfx::RectF root_frame_rect = GetLayoutViewportRect(); @@ -377,30 +425,25 @@ } } - return embedded_test_server()->GetURL( - "a.com", base::StrCat({"/cross_site_scroll_into_view_factory.html?", - frame_tree_string})); + return server()->GetURL( + "a.test", base::StrCat({"/cross_site_scroll_into_view_factory.html?", + frame_tree_string})); } // Simualte a keyboard coming up, insetting the viewport by its height. void SetAuraOnScreenKeyboardInset(int keyboard_height) { #if defined(USE_AURA) - RenderWidgetHostViewChildFrame* child_render_widget_host_view_child_frame = - static_cast<RenderWidgetHostViewChildFrame*>(InnerMostFrameTreeNode() - ->current_frame_host() - ->GetRenderWidgetHost() - ->GetView()); + RenderWidgetHostViewBase* inner_most_view = InnerMostFrameTreeNode() + ->current_frame_host() + ->GetRenderWidgetHost() + ->GetView(); - RenderWidgetHostViewAura* parent_render_widget_host_aura = - static_cast<RenderWidgetHostViewAura*>( - child_render_widget_host_view_child_frame->GetRootView()); + RenderWidgetHostViewBase* root_view = inner_most_view->GetRootView(); // Set the pointer type to simulate the keyboard appearing as a result of // the user tapping on an editable element. - parent_render_widget_host_aura->SetLastPointerType( - ui::EventPointerType::kTouch); - parent_render_widget_host_aura->SetInsets( - gfx::Insets::TLBR(0, 0, keyboard_height, 0)); + root_view->SetLastPointerType(ui::EventPointerType::kTouch); + root_view->SetInsets(gfx::Insets::TLBR(0, 0, keyboard_height, 0)); #else NOTREACHED(); #endif @@ -560,6 +603,12 @@ // See comment in SetupTest for frame tree syntax. +// ScrollIntoViewBrowserTest runs with all combinations of multiple parameters +// to test the basic scroll into view machinery so each test instantiates 8 +// cases. To avoid an explosion of tests, prefer to add new tests to a more +// specific suite unless the functionality it's testing is likely to differ +// across the various parameters and isn't already covered. + IN_PROC_BROWSER_TEST_P(ScrollIntoViewBrowserTest, EditableInSingleNestedFrame) { ASSERT_TRUE(SetupTest("siteA(siteB)")); RunTest(); @@ -625,31 +674,30 @@ // Ensure that insetting the viewport causes the visual viewport to be resized // and focused editable scrolled into view. (https://crbug.com/927483) -// TODO(bokan): Failing flakily on Windows. https://crbug.com/1323876. -#if BUILDFLAG(IS_WIN) -#define MAYBE_InsetsCauseScrollToFocusedEditable \ - DISABLED_InsetsCauseScrollToFocusedEditable -#else -#define MAYBE_InsetsCauseScrollToFocusedEditable \ - InsetsCauseScrollToFocusedEditable -#endif IN_PROC_BROWSER_TEST_P(InsetScrollIntoViewBrowserTest, - MAYBE_InsetsCauseScrollToFocusedEditable) { + InsetsCauseScrollToFocusedEditable) { ASSERT_TRUE(SetupTest("siteA(siteB(siteC))")); - // Allow some fuzziness due to scrollbar. - const int kScrollbarApprox = 20; - ASSERT_NEAR(600, GetVisualViewport().height, kScrollbarApprox); - ASSERT_NEAR(600, GetLayoutViewportRect().height(), kScrollbarApprox); - ASSERT_EQ(1.f, GetVisualViewport().scale); + int visual_viewport_height_before = GetVisualViewport().height; + int layout_viewport_height_before = GetLayoutViewportRect().height(); + + // We expect the window to be 800x600px but allow some fuzziness due to + // differing scrollbars and window decorations on different platforms. + const int kEpsilon = 30; + EXPECT_NEAR(visual_viewport_height_before, 600, kEpsilon); + EXPECT_NEAR(layout_viewport_height_before, 600, kEpsilon); + EXPECT_EQ(1.f, GetVisualViewport().scale); RunTest(); - // The visualViewport should have been insetted but not the root frame. - ASSERT_NEAR(200, GetVisualViewport().height, kScrollbarApprox); - ASSERT_NEAR(600, GetLayoutViewportRect().height(), kScrollbarApprox); - ASSERT_EQ(1.f, GetVisualViewport().scale); + // The visualViewport should have been insetted by 400px but not the root + // frame. + EXPECT_EQ(visual_viewport_height_before - GetVisualViewport().height, 400); + EXPECT_EQ(layout_viewport_height_before, GetLayoutViewportRect().height()); + EXPECT_EQ(1.f, GetVisualViewport().scale); + // The rect where we expect the caret to appear must not not be below the + // inset region. ASSERT_LT(GetAcceptableCaretRect().bottom(), 200); } @@ -728,6 +776,118 @@ DescribeFrameType); #endif +enum FencedFrameType { kFencedFrameMPArch, kFencedFrameShadowDOM }; + +[[maybe_unused]] std::string DescribeFencedFrameType( + const testing::TestParamInfo<FencedFrameType>& info) { + std::string impl_type; + switch (info.param) { + case kFencedFrameMPArch: { + impl_type = "MPArch"; + } break; + case kFencedFrameShadowDOM: { + impl_type = "ShadowDOM"; + } break; + } + return impl_type; +} + +// Tests scrollIntoView behaviors related to a fenced frame. +class ScrollIntoViewFencedFrameBrowserTest + : public ScrollIntoViewBrowserTestBase, + public ::testing::WithParamInterface<FencedFrameType> { + public: + ScrollIntoViewFencedFrameBrowserTest() { + const char* impl_param = + GetParam() == kFencedFrameMPArch ? "mparch" : "shadow_dom"; + feature_list_.InitWithFeaturesAndParameters( + {{blink::features::kFencedFrames, + {{"implementation_type", impl_param}}}, + {features::kPrivacySandboxAdsAPIsOverride, {}}}, + {/* disabled_features */}); + } + bool IsForceLocalFrames() const override { return false; } + bool IsWritingModeLTR() const override { return true; } + TestInvokeMethod GetInvokeMethod() const override { return kInputHandler; } + net::EmbeddedTestServer* server() override { return &https_server_; } + + void SetUpOnMainThread() override { + https_server_.ServeFilesFromSourceDirectory(GetTestDataFilePath()); + https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES); + ScrollIntoViewBrowserTestBase::SetUpOnMainThread(); + } + + private: + net::EmbeddedTestServer https_server_{net::EmbeddedTestServer::TYPE_HTTPS}; + base::test::ScopedFeatureList feature_list_; +}; + +IN_PROC_BROWSER_TEST_P(ScrollIntoViewFencedFrameBrowserTest, + SingleFencedFrame) { + ASSERT_TRUE(SetupTest("siteA{FencedFrame}(siteB)")); + RunTest(); +} + +IN_PROC_BROWSER_TEST_P(ScrollIntoViewFencedFrameBrowserTest, + NestedFencedFrames) { + ASSERT_TRUE(SetupTest("siteA{FencedFrame}(siteB{FencedFrame}(siteC))")); + RunTest(); +} + +IN_PROC_BROWSER_TEST_P(ScrollIntoViewFencedFrameBrowserTest, + LocalFrameInFencedFrame) { + ASSERT_TRUE(SetupTest("siteA{FencedFrame}(siteB(siteB))")); + RunTest(); +} + +IN_PROC_BROWSER_TEST_P(ScrollIntoViewFencedFrameBrowserTest, + RemoteFrameInFencedFrame) { + ASSERT_TRUE(SetupTest("siteA{FencedFrame}(siteB(siteC))")); + RunTest(); +} + +IN_PROC_BROWSER_TEST_P(ScrollIntoViewFencedFrameBrowserTest, + FencedFrameInRemoteFrame) { + ASSERT_TRUE(SetupTest("siteA(siteB{FencedFrame}(siteC))")); + RunTest(); +} + +IN_PROC_BROWSER_TEST_P(ScrollIntoViewFencedFrameBrowserTest, + ProgrammaticScrollIntoViewDoesntCrossFencedFrame) { + ASSERT_TRUE(SetupTest("siteA{FencedFrame}(siteB)")); + + ScrollRectToVisibleInParentFrameInterceptor interceptor; + interceptor.Init(InnerMostFrameTreeNode()->current_frame_host()); + + ASSERT_EQ(0, EvalJs(InnerMostFrameTreeNode(), "window.scrollX")); + ASSERT_EQ(0, EvalJs(InnerMostFrameTreeNode(), "window.scrollY")); + ASSERT_TRUE(ExecJs(InnerMostFrameTreeNode(), R"JS( + document.querySelector('input').scrollIntoView({ + behavior: 'instant', + block: 'center', + inline: 'center' + }) + )JS")); + ASSERT_LT(0, EvalJs(InnerMostFrameTreeNode(), "window.scrollX")); + ASSERT_LT(0, EvalJs(InnerMostFrameTreeNode(), "window.scrollY")); + + // Since bubbling to a parent frame happens synchronously in scrollIntoView, + // once the fenced frame has visible scroll we can guarantee that, if it + // tried bubbling the scroll to the parent the message must have been sent to + // the browser by now. + InnerMostFrameTreeNode() + ->current_frame_host() + ->local_frame_host_receiver_for_testing() + .FlushForTesting(); + EXPECT_FALSE(interceptor.HasCalledScrollRectToVisibleInParentFrame()); +} + +INSTANTIATE_TEST_SUITE_P(/* no prefix */, + ScrollIntoViewFencedFrameBrowserTest, + testing::Values(kFencedFrameMPArch, + kFencedFrameShadowDOM), + DescribeFencedFrameType); + } // namespace } // namespace content
diff --git a/content/browser/service_worker/service_worker_host.h b/content/browser/service_worker/service_worker_host.h index c7fc511..7e3d08f 100644 --- a/content/browser/service_worker/service_worker_host.h +++ b/content/browser/service_worker/service_worker_host.h
@@ -33,7 +33,7 @@ #include "third_party/blink/public/mojom/service_worker/service_worker_container.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_container_type.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "third_party/blink/public/mojom/webtransport/web_transport_connector.mojom.h" #include "url/origin.h"
diff --git a/content/browser/service_worker/service_worker_internals_ui_browsertest.cc b/content/browser/service_worker/service_worker_internals_ui_browsertest.cc index 3d84e75..246384c4 100644 --- a/content/browser/service_worker/service_worker_internals_ui_browsertest.cc +++ b/content/browser/service_worker/service_worker_internals_ui_browsertest.cc
@@ -575,7 +575,8 @@ } IN_PROC_BROWSER_TEST_F(ServiceWorkerInternalsUIBrowserTest, - StopStartSWReflectedOnInternalUI) { + // TODO(crbug.com/1324856): Re-enable this test + DISABLED_StopStartSWReflectedOnInternalUI) { Shell* sw_internal_ui_window = CreateNewWindow(); NavigateToServiceWorkerInternalUI();
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h index 4d63846d..c716b51 100644 --- a/content/browser/service_worker/service_worker_version.h +++ b/content/browser/service_worker/service_worker_version.h
@@ -60,7 +60,7 @@ #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_client.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "url/gurl.h" #include "url/origin.h"
diff --git a/content/browser/shared_storage/shared_storage_browsertest.cc b/content/browser/shared_storage/shared_storage_browsertest.cc index a6808f0..72fe7fe 100644 --- a/content/browser/shared_storage/shared_storage_browsertest.cc +++ b/content/browser/shared_storage/shared_storage_browsertest.cc
@@ -19,6 +19,7 @@ #include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test.h" #include "content/public/test/content_browser_test_utils.h" +#include "content/public/test/fenced_frame_test_util.h" #include "content/public/test/test_frame_navigation_observer.h" #include "content/shell/browser/shell.h" #include "content/test/content_browser_test_utils_internal.h" @@ -200,16 +201,16 @@ return base::Seconds(30); } - // How many worklet operations have finished. This only include addModule and - // runOperation. + // How many worklet operations have finished. This only include `addModule()`, + // `selectURL()` and `run()`. size_t worklet_responses_count_ = 0; size_t expected_worklet_responses_count_ = 0; base::RunLoop worklet_responses_count_waiter_; // Whether we should defer messages received from the worklet environment to - // handle them later. This includes request callbacks (e.g. for addModule() - // and runOperation()), as well as commands initiated from the worklet - // (e.g. console.log()). + // handle them later. This includes request callbacks (e.g. for `addModule()`, + // `selectURL()` and `run()`), as well as commands initiated from the worklet + // (e.g. `console.log()`). bool should_defer_worklet_messages_; std::vector<base::OnceClosure> pending_worklet_messages_; @@ -266,7 +267,6 @@ SharedStorageBrowserTest() { scoped_feature_list_.InitWithFeatures( /*enabled_features=*/{blink::features::kSharedStorageAPI, - blink::features::kFencedFrames, features::kPrivacySandboxAdsAPIsOverride}, /*disabled_features=*/{}); } @@ -329,10 +329,10 @@ EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount()); EXPECT_TRUE(ExecJs(execution_target, R"( - sharedStorage.runOperation('test-operation'); + sharedStorage.run('test-operation'); )")); - // There are 2 "worklet operations": addModule and runOperation. + // There are 2 "worklet operations": `addModule()` and `run()`. test_worklet_host_manager() .GetAttachedWorkletHost() ->WaitForWorkletResponsesCount(2); @@ -347,7 +347,9 @@ ~SharedStorageBrowserTest() override = default; - private: + protected: + test::FencedFrameTestHelper fenced_frame_test_helper_; + base::test::ScopedFeatureList scoped_feature_list_; net::EmbeddedTestServer https_server_{net::EmbeddedTestServer::TYPE_HTTPS}; @@ -499,11 +501,11 @@ base::UTF16ToUTF8(console_observer.messages()[1].message)); EXPECT_TRUE(ExecJs(shell(), R"( - sharedStorage.runOperation( + sharedStorage.run( 'test-operation', {data: {'customKey': 'customValue'}}); )")); - // There are 2 "worklet operations": addModule and runOperation. + // There are 2 "worklet operations": `addModule()` and `run()`. test_worklet_host_manager() .GetAttachedWorkletHost() ->WaitForWorkletResponsesCount(2); @@ -525,7 +527,7 @@ WebContentsConsoleObserver console_observer(shell()->web_contents()); EXPECT_TRUE(ExecJs(shell(), R"( - sharedStorage.runOperation( + sharedStorage.run( 'test-operation', {data: {'customKey': 'customValue'}}); )")); @@ -536,7 +538,7 @@ EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount()); EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount()); - // There are 2 "worklet operations": runOperation and addModule. + // There are 2 "worklet operations": `run()` and `addModule()`. test_worklet_host_manager() .GetAttachedWorkletHost() ->WaitForWorkletResponsesCount(2); @@ -544,7 +546,7 @@ EXPECT_EQ(3u, console_observer.messages().size()); EXPECT_EQ( "sharedStorage.worklet.addModule() has to be called before " - "sharedStorage.runOperation().", + "sharedStorage.run().", base::UTF16ToUTF8(console_observer.messages()[0].message)); EXPECT_EQ(blink::mojom::ConsoleMessageLevel::kError, console_observer.messages()[0].log_level); @@ -566,7 +568,7 @@ EvalJsResult result = EvalJs(shell(), R"( function testFunction() {} - sharedStorage.runOperation( + sharedStorage.run( 'test-operation', {data: {'customKey': testFunction}}); )"); @@ -605,11 +607,11 @@ console_observer.messages()[0].log_level); EXPECT_TRUE(ExecJs(shell(), R"( - sharedStorage.runOperation( + sharedStorage.run( 'test-operation', {data: {'customKey': 'customValue'}}); )")); - // There are 2 "worklet operations": addModule and runOperation. + // There are 2 "worklet operations": `addModule()` and `run()`. test_worklet_host_manager() .GetAttachedWorkletHost() ->WaitForWorkletResponsesCount(2); @@ -728,7 +730,7 @@ ->WaitForWorkletResponsesCount(1); // Three pending messages are expected: two for console.log and one for - // addModule response. + // `addModule()` response. EXPECT_EQ(3u, test_worklet_host_manager() .GetKeepAliveWorkletHost() ->pending_worklet_messages() @@ -778,7 +780,7 @@ ->WaitForWorkletResponsesCount(1); // Three pending messages are expected: two for console.log and one for - // addModule response. + // `addModule()` response. EXPECT_EQ(3u, test_worklet_host_manager() .GetKeepAliveWorkletHost() ->pending_worklet_messages() @@ -812,14 +814,14 @@ EXPECT_EQ(2u, console_observer.messages().size()); - // Configure the worklet host to defer processing the subsequent runOperation + // Configure the worklet host to defer processing the subsequent `run()` // response. test_worklet_host_manager() .GetAttachedWorkletHost() ->set_should_defer_worklet_messages(true); EXPECT_TRUE(ExecJs(shell(), R"( - sharedStorage.runOperation( + sharedStorage.run( 'test-operation', {data: {'customKey': 'customValue'}}) )")); @@ -834,7 +836,7 @@ ->WaitForWorkletResponsesCount(2); // Four pending messages are expected: three for console.log and one for - // runOperation response. + // `run()` response. EXPECT_EQ(4u, test_worklet_host_manager() .GetKeepAliveWorkletHost() ->pending_worklet_messages() @@ -894,7 +896,7 @@ ->WaitForWorkletResponsesCount(1); // Three pending messages are expected: two for console.log and one for - // addModule response. + // `addModule()` response. EXPECT_EQ(3u, test_worklet_host_manager() .GetKeepAliveWorkletHost() ->pending_worklet_messages() @@ -979,7 +981,7 @@ base::UTF16ToUTF8(console_observer.messages()[1].message)); std::string urn_uuid = EvalJs(shell(), R"( - sharedStorage.runURLSelectionOperation( + sharedStorage.selectURL( 'test-url-selection-operation', ["fenced_frames/title0.html", "fenced_frames/title1.html", "fenced_frames/title2.html"], {data: {'mockResult': 1}}); @@ -988,7 +990,7 @@ EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid))); - // There are 2 "worklet operations": addModule and runURLSelectionOperation. + // There are 2 "worklet operations": `addModule()` and `selectURL()`. test_worklet_host_manager() .GetAttachedWorkletHost() ->WaitForWorkletResponsesCount(2); @@ -1042,6 +1044,36 @@ fenced_frame_root_node->current_frame_host()->GetLastCommittedURL()); } +IN_PROC_BROWSER_TEST_F(SharedStorageBrowserTest, + RunURLSelectionOperationNotAllowedInFencedFrame) { + GURL main_frame_url = https_server()->GetURL("a.test", kSimplePagePath); + + EXPECT_TRUE(NavigateToURL(shell(), main_frame_url)); + + GURL fenced_frame_url = + https_server()->GetURL("a.test", "/fenced_frames/title1.html"); + + RenderFrameHostWrapper fenced_frame_rfh_wrapper( + fenced_frame_test_helper_.CreateFencedFrame( + shell()->web_contents()->GetMainFrame(), fenced_frame_url)); + + EXPECT_TRUE(ExecJs(fenced_frame_rfh_wrapper.get(), R"( + sharedStorage.worklet.addModule('/shared_storage/simple_module.js'); + )")); + + EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount()); + EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount()); + + EvalJsResult result = EvalJs(fenced_frame_rfh_wrapper.get(), R"( + sharedStorage.selectURL( + 'test-url-selection-operation', + ["title0.html"], {data: {'mockResult': 0}}); + )"); + + EXPECT_TRUE(result.error.find("sharedStorage.selectURL() is not allowed in " + "fenced frame") != std::string::npos); +} + IN_PROC_BROWSER_TEST_F( SharedStorageBrowserTest, RunURLSelectionOperation_FinishAfterStartingFencedFrameNavigation) { @@ -1056,13 +1088,13 @@ EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount()); // Configure the worklet host to defer processing the subsequent - // runURLSelectionOperation response. + // `selectURL()` response. test_worklet_host_manager() .GetAttachedWorkletHost() ->set_should_defer_worklet_messages(true); std::string urn_uuid = EvalJs(shell(), R"( - sharedStorage.runURLSelectionOperation( + sharedStorage.selectURL( 'test-url-selection-operation', ["fenced_frames/title0.html", "fenced_frames/title1.html", "fenced_frames/title2.html"], {data: {'mockResult': 1}}); @@ -1071,7 +1103,7 @@ EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid))); - // There are 2 "worklet operations": addModule and runURLSelectionOperation. + // There are 2 "worklet operations": `addModule()` and `selectURL()`. test_worklet_host_manager() .GetAttachedWorkletHost() ->WaitForWorkletResponsesCount(2); @@ -1156,7 +1188,7 @@ EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount()); std::string urn_uuid = EvalJs(iframe, R"( - sharedStorage.runURLSelectionOperation( + sharedStorage.selectURL( 'test-url-selection-operation', ["fenced_frames/title0.html", "fenced_frames/title1.html", "fenced_frames/title2.html"], {data: {'mockResult': 1}}); @@ -1252,13 +1284,13 @@ EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount()); // Configure the worklet host to defer processing the subsequent - // runURLSelectionOperation response. + // `selectURL()` response. test_worklet_host_manager() .GetAttachedWorkletHost() ->set_should_defer_worklet_messages(true); std::string urn_uuid = EvalJs(iframe, R"( - sharedStorage.runURLSelectionOperation( + sharedStorage.selectURL( 'test-url-selection-operation', ["fenced_frames/title0.html", "fenced_frames/title1.html", "fenced_frames/title2.html"], {data: {'mockResult': 1}}); @@ -1272,7 +1304,7 @@ EXPECT_EQ(0u, test_worklet_host_manager().GetAttachedWorkletHostsCount()); EXPECT_EQ(1u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount()); - // There are 2 "worklet operations": addModule and runURLSelectionOperation. + // There are 2 "worklet operations": `addModule()` and `selectURL()`. test_worklet_host_manager() .GetKeepAliveWorkletHost() ->WaitForWorkletResponsesCount(2); @@ -1349,7 +1381,7 @@ EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount()); std::string urn_uuid = EvalJs(shell(), R"( - sharedStorage.runURLSelectionOperation( + sharedStorage.selectURL( 'test-url-selection-operation', ["fenced_frames/title0.html", "fenced_frames/title1.html", "fenced_frames/title2.html"], {data: {'mockResult': 3}}); @@ -1358,7 +1390,7 @@ EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid))); - // There are 2 "worklet operations": addModule and runURLSelectionOperation. + // There are 2 "worklet operations": `addModule()` and `selectURL()`. test_worklet_host_manager() .GetAttachedWorkletHost() ->WaitForWorkletResponsesCount(2); @@ -1416,7 +1448,7 @@ )")); std::string urn_uuid = EvalJs(shell(), R"( - sharedStorage.runURLSelectionOperation( + sharedStorage.selectURL( 'test-url-selection-operation', ["fenced_frames/title0.html"], {data: {'mockResult':0}}); )") @@ -1424,7 +1456,7 @@ EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid))); - // There are 2 "worklet operations": addModule and runURLSelectionOperation. + // There are 2 "worklet operations": `addModule()` and `selectURL()`. test_worklet_host_manager() .GetAttachedWorkletHost() ->WaitForWorkletResponsesCount(2); @@ -1454,7 +1486,7 @@ )")); std::string urn_uuid = EvalJs(shell(), R"( - sharedStorage.runURLSelectionOperation( + sharedStorage.selectURL( 'test-url-selection-operation', ["fenced_frames/title0.html"], {data: {'mockResult':-1}}); )") @@ -1462,7 +1494,7 @@ EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid))); - // There are 2 "worklet operations": addModule and runURLSelectionOperation. + // There are 2 "worklet operations": `addModule()` and `selectURL()`. test_worklet_host_manager() .GetAttachedWorkletHost() ->WaitForWorkletResponsesCount(2); @@ -1500,7 +1532,7 @@ EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount()); std::string urn_uuid = EvalJs(iframe, R"( - sharedStorage.runURLSelectionOperation( + sharedStorage.selectURL( 'test-url-selection-operation', ["fenced_frames/title0.html", "fenced_frames/title1.html", "fenced_frames/title2.html"], {data: {'mockResult': 1}}); @@ -1509,7 +1541,7 @@ EXPECT_TRUE(blink::IsValidUrnUuidURL(GURL(urn_uuid))); - // There are 2 "worklet operations": addModule and runURLSelectionOperation. + // There are 2 "worklet operations": `addModule()` and `selectURL()`. test_worklet_host_manager() .GetAttachedWorkletHost() ->WaitForWorkletResponsesCount(2);
diff --git a/content/browser/shared_storage/shared_storage_document_service_impl.cc b/content/browser/shared_storage/shared_storage_document_service_impl.cc index a87631a7..9268cb54 100644 --- a/content/browser/shared_storage/shared_storage_document_service_impl.cc +++ b/content/browser/shared_storage/shared_storage_document_service_impl.cc
@@ -43,12 +43,6 @@ void SharedStorageDocumentServiceImpl::AddModuleOnWorklet( const GURL& script_source_url, AddModuleOnWorkletCallback callback) { - if (!IsSharedStorageAllowed()) { - std::move(callback).Run(/*success=*/false, - /*error_message=*/kSharedStorageDisabledMessage); - return; - } - if (!render_frame_host().GetLastCommittedOrigin().IsSameOriginWith( script_source_url)) { // This could indicate a compromised renderer, so let's terminate it. @@ -57,6 +51,12 @@ return; } + if (!IsSharedStorageAllowed()) { + std::move(callback).Run(/*success=*/false, + /*error_message=*/kSharedStorageDisabledMessage); + return; + } + // Initialize the `URLLoaderFactory` now, as later on the worklet may enter // keep-alive phase and won't have access to the `RenderFrameHost`. mojo::PendingRemote<network::mojom::URLLoaderFactory> @@ -89,10 +89,11 @@ const std::vector<GURL>& urls, const std::vector<uint8_t>& serialized_data, RunURLSelectionOperationOnWorkletCallback callback) { - if (!IsSharedStorageAllowed()) { - std::move(callback).Run(/*success=*/false, - /*error_message=*/kSharedStorageDisabledMessage, - GURL()); + if (render_frame_host().IsNestedWithinFencedFrame()) { + // This could indicate a compromised renderer, so let's terminate it. + receiver_.ReportBadMessage( + "Attempted to execute RunURLSelectionOperationOnWorklet within a " + "fenced frame."); return; } @@ -104,6 +105,13 @@ return; } + if (!IsSharedStorageAllowed()) { + std::move(callback).Run(/*success=*/false, + /*error_message=*/kSharedStorageDisabledMessage, + GURL()); + return; + } + GetSharedStorageWorkletHost()->RunURLSelectionOperationOnWorklet( name, urls, serialized_data, std::move(callback)); }
diff --git a/content/browser/shared_storage/shared_storage_document_service_impl.h b/content/browser/shared_storage/shared_storage_document_service_impl.h index e64f5306..a439035 100644 --- a/content/browser/shared_storage/shared_storage_document_service_impl.h +++ b/content/browser/shared_storage/shared_storage_document_service_impl.h
@@ -24,17 +24,17 @@ extern CONTENT_EXPORT const char kSharedStorageDisabledMessage[]; // Handle renderer-initiated shared storage access and worklet operations. The -// worklet operations (i.e. addModule and runOperation) will be dispatched to -// the `SharedStorageWorkletHost` to be handled. +// worklet operations (i.e. `addModule()`, `selectURL()`, `run()`) will be +// dispatched to the `SharedStorageWorkletHost` to be handled. class CONTENT_EXPORT SharedStorageDocumentServiceImpl final : public DocumentUserData<SharedStorageDocumentServiceImpl>, public blink::mojom::SharedStorageDocumentService { public: // If true, allows operations to bypass the permission check in // `IsSharedStorageAllowed()` for testing, in order to simulate the situation - // where permission is allowed at the stage where `RunOperation()` is called - // but becomes disallowed when subsequent operations are called from inside - // the worklet. + // where permission is allowed at the stage where `run()` is called but + // becomes disallowed when subsequent operations are called from inside the + // worklet. static bool& GetBypassIsSharedStorageAllowedForTesting(); ~SharedStorageDocumentServiceImpl() final;
diff --git a/content/browser/shared_storage/shared_storage_worklet_host.cc b/content/browser/shared_storage/shared_storage_worklet_host.cc index fc8befb..b9cf01e 100644 --- a/content/browser/shared_storage/shared_storage_worklet_host.cc +++ b/content/browser/shared_storage/shared_storage_worklet_host.cc
@@ -144,7 +144,7 @@ /*success=*/false, /*error_message=*/ "sharedStorage.worklet.addModule() has to be called before " - "sharedStorage.runOperation()."); + "sharedStorage.run()."); return; } @@ -164,7 +164,7 @@ std::move(callback).Run( /*success=*/false, /*error_message=*/ "sharedStorage.worklet.addModule() has to be called before " - "sharedStorage.runURLSelectionOperation().", + "sharedStorage.selectURL().", /*opaque_url=*/{}); return; } @@ -498,7 +498,7 @@ // This could indicate a compromised worklet environment, so let's terminate // it. mojo::ReportBadMessage( - "Unexpected index number returned from runURLSelectionOperation()."); + "Unexpected index number returned from selectURL()."); return; }
diff --git a/content/browser/shared_storage/shared_storage_worklet_host.h b/content/browser/shared_storage/shared_storage_worklet_host.h index 492db2a..47f6d16 100644 --- a/content/browser/shared_storage/shared_storage_worklet_host.h +++ b/content/browser/shared_storage/shared_storage_worklet_host.h
@@ -26,8 +26,8 @@ class PageImpl; // The SharedStorageWorkletHost is responsible for getting worklet operation -// requests (i.e. addModule and runOperation) from the renderer (i.e. document -// that is hosting the worklet) and running it on the +// requests (i.e. `addModule()`, `selectURL()`, `run()`) from the renderer (i.e. +// document that is hosting the worklet) and running it on the // `SharedStorageWorkletService`. It will also handle the commands from the // `SharedStorageWorkletService` (i.e. storage access, console log) which // could happen while running those worklet operations. @@ -71,8 +71,8 @@ blink::mojom::SharedStorageDocumentService:: RunURLSelectionOperationOnWorkletCallback callback); - // Whether there are unfinished worklet operations (i.e. addModule() and - // runOperation()). + // Whether there are unfinished worklet operations (i.e. `addModule()`, + // `selectURL()`, or `run()`. bool HasPendingOperations(); // Called by the `SharedStorageWorkletHostManager` for this host to enter @@ -136,12 +136,12 @@ // the keep-alive phase. void FinishKeepAlive(); - // Increment `pending_operations_count_`. Called when receiving a addModule - // or runOperation operation. + // Increment `pending_operations_count_`. Called when receiving an + // `addModule()`, `selectURL()`, or `run()`. void IncrementPendingOperationsCount(); - // Decrement `pending_operations_count_`. Called when finishing handling a - // addModule or runOperation operation. + // Decrement `pending_operations_count_`. Called when finishing handling an + // `addModule()`, `selectURL()`, or `run()`. void DecrementPendingOperationsCount(); // virtual for testing @@ -193,8 +193,8 @@ // removed from `unresolved_urns_`. std::map<GURL, std::vector<GURL>> unresolved_urns_; - // The number of unfinished worklet requests, including addModule and - // runOperation. + // The number of unfinished worklet requests, including `addModule()`, + // `selectURL()`, or `run()`. uint32_t pending_operations_count_ = 0u; // Timer for starting and ending the keep-alive phase.
diff --git a/content/browser/site_per_process_sad_frame_browsertest.cc b/content/browser/site_per_process_sad_frame_browsertest.cc index d3d750f..d57ce19 100644 --- a/content/browser/site_per_process_sad_frame_browsertest.cc +++ b/content/browser/site_per_process_sad_frame_browsertest.cc
@@ -421,8 +421,10 @@ // Verify that a sad frame shown when its parent frame is loading is logged // with appropriate metrics, namely as kShownWhileAncestorIsLoading rather than // kShownAfterCrashing. See https://crbug.com/1132938. -IN_PROC_BROWSER_TEST_P(SitePerProcessBrowserTestWithSadFrameTabReload, - CrashedFencedframeVisibilityMetricsDuringParentLoad) { +IN_PROC_BROWSER_TEST_P( + SitePerProcessBrowserTestWithSadFrameTabReload, + // TODO(crbug.com/1325478): Re-enable this test + DISABLED_CrashedFencedframeVisibilityMetricsDuringParentLoad) { // Since Fenced Frames should create a renderer per fenced frame, we // do not need to explicitly change the site. GURL main_url(
diff --git a/content/browser/speculation_rules/speculation_host_impl.cc b/content/browser/speculation_rules/speculation_host_impl.cc index 58b2697d..0c7f4d0a 100644 --- a/content/browser/speculation_rules/speculation_host_impl.cc +++ b/content/browser/speculation_rules/speculation_host_impl.cc
@@ -17,7 +17,7 @@ #include "content/public/common/referrer.h" #include "mojo/public/cpp/bindings/message.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" namespace content {
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc index d649967..4e21b8b 100644 --- a/content/browser/storage_partition_impl.cc +++ b/content/browser/storage_partition_impl.cc
@@ -1313,8 +1313,16 @@ } if (base::FeatureList::IsEnabled(blink::features::kInterestGroupStorage)) { + // Auction worklets on non-Android use dedicated processes; on Android due + // to high cost of process launch they try to reuse renderers. interest_group_manager_ = std::make_unique<InterestGroupManagerImpl>( - path, is_in_memory(), GetURLLoaderFactoryForBrowserProcess()); + path, is_in_memory(), +#if BUILDFLAG(IS_ANDROID) + InterestGroupManagerImpl::ProcessMode::kInRenderer, +#else + InterestGroupManagerImpl::ProcessMode::kDedicated, +#endif + GetURLLoaderFactoryForBrowserProcess()); } // The Topics API is not available in Incognito mode.
diff --git a/content/browser/utility_process_sandbox_browsertest.cc b/content/browser/utility_process_sandbox_browsertest.cc index 3151f7a7..22e0847 100644 --- a/content/browser/utility_process_sandbox_browsertest.cc +++ b/content/browser/utility_process_sandbox_browsertest.cc
@@ -29,7 +29,7 @@ #include "sandbox/policy/switches.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) using sandbox::mojom::Sandbox;
diff --git a/content/browser/utility_sandbox_delegate.cc b/content/browser/utility_sandbox_delegate.cc index 2131cfc..dc8c342f 100644 --- a/content/browser/utility_sandbox_delegate.cc +++ b/content/browser/utility_sandbox_delegate.cc
@@ -20,7 +20,7 @@ #endif #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) namespace content {
diff --git a/content/browser/web_contents/web_contents_view_aura_browsertest.cc b/content/browser/web_contents/web_contents_view_aura_browsertest.cc index e0752fe..ae5f6589 100644 --- a/content/browser/web_contents/web_contents_view_aura_browsertest.cc +++ b/content/browser/web_contents/web_contents_view_aura_browsertest.cc
@@ -474,22 +474,19 @@ // this test to fail. This observer will let us know if this is happening. SpuriousMouseMoveEventObserver mouse_observer(GetRenderWidgetHost()); - // TODO(crbug.com/1322921): Use a mock timer to generate timestamps for - // events. This would need injecting the mock timer into - // `cc::CompositorFrameReportingController`. + base::TimeTicks timestamp = ui::EventTimeForNow(); ui::TouchEvent press( ui::ET_TOUCH_PRESSED, - gfx::Point(bounds.x() + bounds.width() / 2, bounds.y() + 5), - ui::EventTimeForNow(), + gfx::Point(bounds.x() + bounds.width() / 2, bounds.y() + 5), timestamp, ui::PointerDetails(ui::EventPointerType::kTouch, 0)); ui::EventDispatchDetails details = sink->OnEventFromSource(&press); ASSERT_FALSE(details.dispatcher_destroyed); EXPECT_EQ(1, GetCurrentIndex()); - ui::TouchEvent move1(ui::ET_TOUCH_MOVED, - gfx::Point(bounds.right() - 10, bounds.y() + 5), - ui::EventTimeForNow(), - ui::PointerDetails(ui::EventPointerType::kTouch, 0)); + timestamp += base::Milliseconds(10); + ui::TouchEvent move1( + ui::ET_TOUCH_MOVED, gfx::Point(bounds.right() - 10, bounds.y() + 5), + timestamp, ui::PointerDetails(ui::EventPointerType::kTouch, 0)); details = sink->OnEventFromSource(&move1); ASSERT_FALSE(details.dispatcher_destroyed); EXPECT_EQ(1, GetCurrentIndex()); @@ -497,27 +494,30 @@ // Swipe back from the right edge, back to the left edge, back to the right // edge. - for (int x = bounds.right() - 10; x >= bounds.x() + 10; x -= 10) { + for (int x = bounds.right() - 10; x >= bounds.x() + 10; x-= 10) { + timestamp += base::Milliseconds(10); ui::TouchEvent inc(ui::ET_TOUCH_MOVED, gfx::Point(x, bounds.y() + 5), - ui::EventTimeForNow(), + timestamp, ui::PointerDetails(ui::EventPointerType::kTouch, 0)); details = sink->OnEventFromSource(&inc); ASSERT_FALSE(details.dispatcher_destroyed); EXPECT_EQ(1, GetCurrentIndex()); } - for (int x = bounds.x() + 10; x <= bounds.width() - 10; x += 10) { + for (int x = bounds.x() + 10; x <= bounds.width() - 10; x+= 10) { + timestamp += base::Milliseconds(10); ui::TouchEvent inc(ui::ET_TOUCH_MOVED, gfx::Point(x, bounds.y() + 5), - ui::EventTimeForNow(), + timestamp, ui::PointerDetails(ui::EventPointerType::kTouch, 0)); details = sink->OnEventFromSource(&inc); ASSERT_FALSE(details.dispatcher_destroyed); EXPECT_EQ(1, GetCurrentIndex()); } - for (int x = bounds.width() - 10; x >= bounds.x() + 10; x -= 10) { + for (int x = bounds.width() - 10; x >= bounds.x() + 10; x-= 10) { + timestamp += base::Milliseconds(10); ui::TouchEvent inc(ui::ET_TOUCH_MOVED, gfx::Point(x, bounds.y() + 5), - ui::EventTimeForNow(), + timestamp, ui::PointerDetails(ui::EventPointerType::kTouch, 0)); details = sink->OnEventFromSource(&inc); ASSERT_FALSE(details.dispatcher_destroyed);
diff --git a/content/browser/webid/idp_network_request_manager.cc b/content/browser/webid/idp_network_request_manager.cc index 5a8d80c..71bc4d2 100644 --- a/content/browser/webid/idp_network_request_manager.cc +++ b/content/browser/webid/idp_network_request_manager.cc
@@ -290,11 +290,19 @@ } if (brand_icon_minimum_size && brand_icon_ideal_size) { + // As only a single bitmap is selected, select a bitmap which works with + // a high density display (if the OS supports high density displays). + float max_supported_scale = ui::GetScaleForResourceScaleFactor( + ui::GetSupportedResourceScaleFactors().back()); + int minimum_icon_size_px = brand_icon_minimum_size.value() * + max_supported_scale / + kMaskableWebIconSafeZoneRatio; + int ideal_icon_size_px = brand_icon_ideal_size.value() * + max_supported_scale / + kMaskableWebIconSafeZoneRatio; idp_metadata.brand_icon_url = blink::ManifestIconSelector::FindBestMatchingSquareIcon( - icons, - brand_icon_ideal_size.value() / kMaskableWebIconSafeZoneRatio, - brand_icon_minimum_size.value() / kMaskableWebIconSafeZoneRatio, + icons, ideal_icon_size_px, minimum_icon_size_px, blink::mojom::ManifestImageResource_Purpose::MASKABLE); } }
diff --git a/content/browser/webid/idp_network_request_manager_unittest.cc b/content/browser/webid/idp_network_request_manager_unittest.cc index 5b646a5..532325f 100644 --- a/content/browser/webid/idp_network_request_manager_unittest.cc +++ b/content/browser/webid/idp_network_request_manager_unittest.cc
@@ -21,6 +21,7 @@ #include "services/network/public/mojom/client_security_state.mojom.h" #include "services/network/test/test_url_loader_factory.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/layout.h" #include "ui/gfx/geometry/size.h" #include "url/gurl.h" @@ -533,6 +534,10 @@ } TEST_F(IdpNetworkRequestManagerTest, ParseManifestBrandingSelectBestSize) { + // Selected icon depends on OS supported scale factors. + ui::test::ScopedSetSupportedResourceScaleFactors + scoped_supported_scale_factors({ui::k100Percent}); + const char test_json[] = R"({ "branding" : { "icons": [
diff --git a/content/browser/worker_host/DEPS b/content/browser/worker_host/DEPS index 3f2e64b..8c6decc 100644 --- a/content/browser/worker_host/DEPS +++ b/content/browser/worker_host/DEPS
@@ -1,3 +1,3 @@ include_rules = [ - "+third_party/blink/public/mojom/web_feature/web_feature.mojom.h", + "+third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h", ]
diff --git a/content/browser/worker_host/shared_worker_host.cc b/content/browser/worker_host/shared_worker_host.cc index 432d596..6b23613c 100644 --- a/content/browser/worker_host/shared_worker_host.cc +++ b/content/browser/worker_host/shared_worker_host.cc
@@ -48,7 +48,7 @@ #include "third_party/blink/public/common/messaging/message_port_channel.h" #include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h" #include "third_party/blink/public/mojom/renderer_preference_watcher.mojom.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "third_party/blink/public/mojom/worker/shared_worker_info.mojom.h" #include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom.h"
diff --git a/content/browser/worker_host/worker_script_fetcher.cc b/content/browser/worker_host/worker_script_fetcher.cc index f6e77c0..b8d95c4 100644 --- a/content/browser/worker_host/worker_script_fetcher.cc +++ b/content/browser/worker_host/worker_script_fetcher.cc
@@ -54,7 +54,7 @@ #include "third_party/blink/public/common/loader/url_loader_throttle.h" #include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h" #include "third_party/blink/public/common/storage_key/storage_key.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" namespace content {
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index e461083..1f463b3 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -473,7 +473,7 @@ {wrf::EnableWebGPU, switches::kEnableUnsafeWebGPU, true}, {wrf::ForceOverlayFullscreenVideo, switches::kForceOverlayFullscreenVideo, true}, - {wrf::EnableDirectSockets, switches::kIsolatedAppOrigins, false}, + {wrf::EnableDirectSockets, switches::kIsolatedAppOrigins, true}, }; for (const auto& mapping : switchToFeatureMapping) { if (command_line.HasSwitch(mapping.switch_name))
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java index 0f35632..a9e7363 100644 --- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java +++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java
@@ -7,6 +7,7 @@ import org.chromium.base.ObserverList; import org.chromium.base.ObserverList.RewindableIterator; import org.chromium.base.ThreadUtils; +import org.chromium.base.TraceEvent; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; @@ -122,70 +123,119 @@ @Override @CalledByNative + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didStartNavigation(NavigationHandle navigation) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - mObserversIterator.next().didStartNavigation(navigation); + WebContentsObserver observer = mObserversIterator.next(); + String s = "WebContentsObserverProxy::didStartNavigation observer:" + + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.didStartNavigation(navigation); + } } finishObserverCall(); } @Override @CalledByNative + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didRedirectNavigation(NavigationHandle navigation) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - mObserversIterator.next().didRedirectNavigation(navigation); + WebContentsObserver observer = mObserversIterator.next(); + String s = "WebContentsObserverProxy::didRedirectNavigation observer:" + + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.didRedirectNavigation(navigation); + } } finishObserverCall(); } @Override @CalledByNative + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didFinishNavigation(NavigationHandle navigation) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - mObserversIterator.next().didFinishNavigation(navigation); + WebContentsObserver observer = mObserversIterator.next(); + String s = "WebContentsObserverProxy::didFinishNavigation observer:" + + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.didFinishNavigation(navigation); + } } finishObserverCall(); } @Override @CalledByNative + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didStartLoading(GURL url) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - mObserversIterator.next().didStartLoading(url); + WebContentsObserver observer = mObserversIterator.next(); + String s = "WebContentsObserverProxy::didStartLoading observer:" + + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.didStartLoading(url); + } } finishObserverCall(); } @Override @CalledByNative + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didStopLoading(GURL url, boolean isKnownValid) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - mObserversIterator.next().didStopLoading(url, isKnownValid); + WebContentsObserver observer = mObserversIterator.next(); + String s = "WebContentsObserverProxy::didStopLoading observer:" + + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.didStopLoading(url, isKnownValid); + } } finishObserverCall(); } @Override @CalledByNative + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void loadProgressChanged(float progress) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - mObserversIterator.next().loadProgressChanged(progress); + WebContentsObserver observer = mObserversIterator.next(); + String s = "WebContentsObserverProxy::loadProgressChanged observer:" + + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.loadProgressChanged(progress); + } } finishObserverCall(); } @Override @CalledByNative + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didChangeVisibleSecurityState() { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - mObserversIterator.next().didChangeVisibleSecurityState(); + WebContentsObserver observer = mObserversIterator.next(); + String s = "WebContentsObserverProxy::didChangeVisibleSecurityState observer:" + + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.didChangeVisibleSecurityState(); + } } finishObserverCall(); } @@ -234,10 +284,17 @@ @Override @CalledByNative + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void titleWasSet(String title) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - mObserversIterator.next().titleWasSet(title); + WebContentsObserver observer = mObserversIterator.next(); + String s = "WebContentsObserverProxy::titleWasSet observer:" + + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.titleWasSet(title); + } } finishObserverCall(); } @@ -261,12 +318,19 @@ } @Override + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void didFinishLoad(GlobalRenderFrameHostId rfhId, GURL url, boolean isKnownValid, boolean isInPrimaryMainFrame, @LifecycleState int rfhLifecycleState) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - mObserversIterator.next().didFinishLoad( - rfhId, url, isKnownValid, isInPrimaryMainFrame, rfhLifecycleState); + WebContentsObserver observer = mObserversIterator.next(); + String s = "WebContentsObserverProxy::didStartNavigation observer:" + + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.didFinishLoad( + rfhId, url, isKnownValid, isInPrimaryMainFrame, rfhLifecycleState); + } } finishObserverCall(); } @@ -291,10 +355,17 @@ @Override @CalledByNative + // The string passed is safe since it is class and method name. + @SuppressWarnings("NoDynamicStringsInTraceEventCheck") public void navigationEntryCommitted(LoadCommittedDetails details) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - mObserversIterator.next().navigationEntryCommitted(details); + WebContentsObserver observer = mObserversIterator.next(); + String s = "WebContentsObserverProxy::navigationEntryComitted observer:" + + observer.getClass().getName(); + try (TraceEvent e = TraceEvent.scoped(s, "scroll jank observer investigation")) { + observer.navigationEntryCommitted(details); + } } finishObserverCall(); }
diff --git a/content/public/app/BUILD.gn b/content/public/app/BUILD.gn index 591ab81..bf9adec 100644 --- a/content/public/app/BUILD.gn +++ b/content/public/app/BUILD.gn
@@ -22,7 +22,7 @@ import("//build/config/chrome_build.gni") import("//build/config/ui.gni") -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") import("//tools/v8_context_snapshot/v8_context_snapshot.gni") import("//ui/base/ui_features.gni")
diff --git a/content/public/browser/render_process_host.h b/content/public/browser/render_process_host.h index 63d78348..ba47d80 100644 --- a/content/public/browser/render_process_host.h +++ b/content/public/browser/render_process_host.h
@@ -480,6 +480,9 @@ // process that the shared storage worklets are going to use is determined // by the concrete implementation of // `SharedStorageRenderThreadWorkletDriver`. + // - Auction Worklets (on Android only): + // (https://github.com/WICG/turtledove/blob/main/FLEDGE.md) + // Keeps the renderer alive if there are any worklets using it. virtual void IncrementWorkerRefCount() = 0; virtual void DecrementWorkerRefCount() = 0;
diff --git a/content/public/test/mock_render_process_host.cc b/content/public/test/mock_render_process_host.cc index 6e80463..b56b109 100644 --- a/content/public/test/mock_render_process_host.cc +++ b/content/public/test/mock_render_process_host.cc
@@ -435,6 +435,7 @@ } void MockRenderProcessHost::DecrementWorkerRefCount() { + DCHECK_GT(worker_ref_count_, 0); --worker_ref_count_; }
diff --git a/content/public/test/network_service_test_helper.cc b/content/public/test/network_service_test_helper.cc index cb42d15..07878c1 100644 --- a/content/public/test/network_service_test_helper.cc +++ b/content/public/test/network_service_test_helper.cc
@@ -494,6 +494,14 @@ std::move(callback).Run(); } + void ForceNetworkQualityEstimatorReportWifiAsSlow2G( + SimulateNetworkChangeCallback callback) override { + network::NetworkService::GetNetworkServiceForTesting() + ->network_quality_estimator() + ->ForceReportWifiAsSlow2GForTesting(); + std::move(callback).Run(); + } + void SimulateCrash() override { LOG(ERROR) << "Intentionally terminating current process to simulate" " NetworkService crash for testing.";
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index 7d046da..3d4f080 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -263,6 +263,7 @@ "//content/common:buildflags", "//content/gpu:gpu_sources", "//content/public/child:child_sources", + "//content/services/auction_worklet:auction_worklet", "//content/services/shared_storage_worklet", "//crypto", "//device/base/synchronization",
diff --git a/content/renderer/DEPS b/content/renderer/DEPS index 798358f..4c5c138a 100644 --- a/content/renderer/DEPS +++ b/content/renderer/DEPS
@@ -21,6 +21,7 @@ "+content/public/renderer", "+content/child", "+content/services/shared_storage_worklet", + "+content/services/auction_worklet", "+device/base/synchronization", "+device/gamepad/public/cpp", "+device/gamepad/public/mojom",
diff --git a/content/renderer/browser_exposed_renderer_interfaces.cc b/content/renderer/browser_exposed_renderer_interfaces.cc index f6f6522..fc528011 100644 --- a/content/renderer/browser_exposed_renderer_interfaces.cc +++ b/content/renderer/browser_exposed_renderer_interfaces.cc
@@ -26,6 +26,7 @@ #include "content/renderer/render_thread_impl.h" #include "content/renderer/service_worker/embedded_worker_instance_client_impl.h" #include "content/renderer/worker/shared_worker_factory_impl.h" +#include "content/services/auction_worklet/auction_worklet_service_impl.h" #include "mojo/public/cpp/bindings/binder_map.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" @@ -166,6 +167,11 @@ base::ThreadTaskRunnerHandle::Get()); binders->Add(base::BindRepeating(&CreateResourceUsageReporter, render_thread), base::ThreadTaskRunnerHandle::Get()); +#if BUILDFLAG(IS_ANDROID) + binders->Add( + base::BindRepeating(&auction_worklet::AuctionWorkletServiceImpl::Create), + base::ThreadTaskRunnerHandle::Get()); +#endif auto task_runner_for_service_worker_startup = base::ThreadPool::CreateSingleThreadTaskRunner(
diff --git a/content/renderer/pepper/url_request_info_util.cc b/content/renderer/pepper/url_request_info_util.cc index 983d654..6d236d4 100644 --- a/content/renderer/pepper/url_request_info_util.cc +++ b/content/renderer/pepper/url_request_info_util.cc
@@ -27,7 +27,7 @@ #include "ppapi/thunk/enter.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/filesystem/file_system.mojom.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "third_party/blink/public/platform/file_path_conversion.h" #include "third_party/blink/public/platform/web_data.h" #include "third_party/blink/public/platform/web_http_body.h"
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index ec68866..5bedbf8 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -95,7 +95,7 @@ #include "third_party/blink/public/mojom/media/renderer_audio_input_stream_factory.mojom.h" #include "third_party/blink/public/mojom/navigation/navigation_params.mojom-forward.h" #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h" -#include "third_party/blink/public/mojom/use_counter/css_property_id.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom.h" #include "third_party/blink/public/platform/child_url_loader_factory_bundle.h" #include "third_party/blink/public/platform/web_media_player.h" #include "third_party/blink/public/platform/websocket_handshake_throttle_provider.h"
diff --git a/content/renderer/service_worker/service_worker_provider_context.h b/content/renderer/service_worker/service_worker_provider_context.h index bc9a84b..7df709ed 100644 --- a/content/renderer/service_worker/service_worker_provider_context.h +++ b/content/renderer/service_worker/service_worker_provider_context.h
@@ -31,7 +31,7 @@ #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom-forward.h" #include "third_party/blink/public/mojom/service_worker/service_worker_worker_client_registry.mojom.h" #include "third_party/blink/public/mojom/timing/worker_timing_container.mojom-forward.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-forward.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-forward.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_provider_client.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_provider_context.h"
diff --git a/content/renderer/service_worker/service_worker_provider_context_unittest.cc b/content/renderer/service_worker/service_worker_provider_context_unittest.cc index b2dc862..035e157 100644 --- a/content/renderer/service_worker/service_worker_provider_context_unittest.cc +++ b/content/renderer/service_worker/service_worker_provider_context_unittest.cc
@@ -35,7 +35,7 @@ #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h" #include "third_party/blink/public/mojom/service_worker/service_worker_registration_options.mojom.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_provider_client.h" #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
diff --git a/content/renderer/service_worker/web_service_worker_provider_impl.h b/content/renderer/service_worker/web_service_worker_provider_impl.h index 7c33cfe6..0fd23d2 100644 --- a/content/renderer/service_worker/web_service_worker_provider_impl.h +++ b/content/renderer/service_worker/web_service_worker_provider_impl.h
@@ -14,7 +14,7 @@ #include "third_party/blink/public/mojom/service_worker/service_worker_error_type.mojom-forward.h" #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom-forward.h" #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom-forward.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-forward.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-forward.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_provider.h" namespace blink {
diff --git a/content/services/auction_worklet/auction_worklet_service_impl.cc b/content/services/auction_worklet/auction_worklet_service_impl.cc index 4d7babe..fda89ff 100644 --- a/content/services/auction_worklet/auction_worklet_service_impl.cc +++ b/content/services/auction_worklet/auction_worklet_service_impl.cc
@@ -8,24 +8,85 @@ #include <string> #include <utility> +#include "base/memory/ptr_util.h" +#include "base/memory/raw_ptr.h" +#include "base/memory/ref_counted.h" +#include "base/sequence_checker.h" #include "content/services/auction_worklet/auction_v8_helper.h" #include "content/services/auction_worklet/bidder_worklet.h" #include "content/services/auction_worklet/public/mojom/auction_worklet_service.mojom.h" #include "content/services/auction_worklet/seller_worklet.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "third_party/blink/public/mojom/interest_group/interest_group_types.mojom.h" namespace auction_worklet { +// Make sure we only use a single AuctionV8Helper, including V8 thread and V8 +// isolate, no matter how many services there are. Assumes usages from a single +// thread. +class AuctionWorkletServiceImpl::V8HelperHolder + : public base::RefCounted<V8HelperHolder> { + public: + static V8HelperHolder* Instance() { + if (!g_instance) + g_instance = new V8HelperHolder(); + DCHECK_CALLED_ON_VALID_SEQUENCE(g_instance->sequence_checker_); + return g_instance; + } + + const scoped_refptr<AuctionV8Helper>& v8_helper() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return auction_v8_helper_; + } + + private: + friend class base::RefCounted<V8HelperHolder>; + + V8HelperHolder() + : auction_v8_helper_( + AuctionV8Helper::Create(AuctionV8Helper::CreateTaskRunner())) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + } + + ~V8HelperHolder() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + g_instance = nullptr; + } + + static V8HelperHolder* g_instance; + + scoped_refptr<AuctionV8Helper> auction_v8_helper_; + + SEQUENCE_CHECKER(sequence_checker_); +}; + +AuctionWorkletServiceImpl::V8HelperHolder* + AuctionWorkletServiceImpl::V8HelperHolder::g_instance = nullptr; + AuctionWorkletServiceImpl::AuctionWorkletServiceImpl( mojo::PendingReceiver<mojom::AuctionWorkletService> receiver) : receiver_(this, std::move(receiver)), - auction_v8_helper_( - AuctionV8Helper::Create(AuctionV8Helper::CreateTaskRunner())) {} + auction_v8_helper_holder_(V8HelperHolder::Instance()) {} + +AuctionWorkletServiceImpl::AuctionWorkletServiceImpl() + : receiver_(this), auction_v8_helper_holder_(V8HelperHolder::Instance()) {} AuctionWorkletServiceImpl::~AuctionWorkletServiceImpl() = default; +// static +void AuctionWorkletServiceImpl::Create( + mojo::PendingReceiver<mojom::AuctionWorkletService> receiver) { + mojo::MakeSelfOwnedReceiver(std::make_unique<AuctionWorkletServiceImpl>(), + std::move(receiver)); +} + +scoped_refptr<AuctionV8Helper> +AuctionWorkletServiceImpl::AuctionV8HelperForTesting() { + return auction_v8_helper_holder_->v8_helper(); +} + void AuctionWorkletServiceImpl::LoadBidderWorklet( mojo::PendingReceiver<mojom::BidderWorklet> bidder_worklet_receiver, bool pause_for_debugger_on_start, @@ -38,7 +99,7 @@ bool has_experiment_group_id, uint16_t experiment_group_id) { auto bidder_worklet = std::make_unique<BidderWorklet>( - auction_v8_helper_, pause_for_debugger_on_start, + auction_v8_helper_holder_->v8_helper(), pause_for_debugger_on_start, std::move(pending_url_loader_factory), script_source_url, wasm_helper_url, trusted_bidding_signals_url, top_window_origin, has_experiment_group_id ? absl::make_optional(experiment_group_id) @@ -64,7 +125,7 @@ bool has_experiment_group_id, uint16_t experiment_group_id) { auto seller_worklet = std::make_unique<SellerWorklet>( - auction_v8_helper_, pause_for_debugger_on_start, + auction_v8_helper_holder_->v8_helper(), pause_for_debugger_on_start, std::move(pending_url_loader_factory), decision_logic_url, trusted_scoring_signals_url, top_window_origin, has_experiment_group_id ? absl::make_optional(experiment_group_id)
diff --git a/content/services/auction_worklet/auction_worklet_service_impl.h b/content/services/auction_worklet/auction_worklet_service_impl.h index 3f5880a5..954be446 100644 --- a/content/services/auction_worklet/auction_worklet_service_impl.h +++ b/content/services/auction_worklet/auction_worklet_service_impl.h
@@ -30,16 +30,25 @@ // sandboxed utility process. class AuctionWorkletServiceImpl : public mojom::AuctionWorkletService { public: + // Constructor for when `this` owns the receiver. This is for the case where + // this is used as a service, with ServiceFactory managing the lifetime. explicit AuctionWorkletServiceImpl( mojo::PendingReceiver<mojom::AuctionWorkletService> receiver); + + // Constructor for when owned by an external SelfOwnedReceiver. Used by + // |Create()|, which is intended for use with a BinderMap. + AuctionWorkletServiceImpl(); + explicit AuctionWorkletServiceImpl(const AuctionWorkletServiceImpl&) = delete; AuctionWorkletServiceImpl& operator=(const AuctionWorkletServiceImpl&) = delete; ~AuctionWorkletServiceImpl() override; - const scoped_refptr<AuctionV8Helper>& AuctionV8HelperForTesting() { - return auction_v8_helper_; - } + // Creates an instance owned by (and bound to) |receiver|. + static void Create( + mojo::PendingReceiver<mojom::AuctionWorkletService> receiver); + + scoped_refptr<AuctionV8Helper> AuctionV8HelperForTesting(); // mojom::AuctionWorkletService implementation: void LoadBidderWorklet( @@ -65,6 +74,7 @@ uint16_t experiment_group_id) override; private: + class V8HelperHolder; void DisconnectSellerWorklet(mojo::ReceiverId receiver_id, const std::string& reason); void DisconnectBidderWorklet(mojo::ReceiverId receiver_id, @@ -72,7 +82,7 @@ mojo::Receiver<mojom::AuctionWorkletService> receiver_; - scoped_refptr<AuctionV8Helper> auction_v8_helper_; + scoped_refptr<V8HelperHolder> auction_v8_helper_holder_; mojo::UniqueReceiverSet<mojom::BidderWorklet> bidder_worklets_; mojo::UniqueReceiverSet<mojom::SellerWorklet> seller_worklets_;
diff --git a/content/services/auction_worklet/public/mojom/auction_worklet_service.mojom b/content/services/auction_worklet/public/mojom/auction_worklet_service.mojom index e82a0bf..2c8b0d0 100644 --- a/content/services/auction_worklet/public/mojom/auction_worklet_service.mojom +++ b/content/services/auction_worklet/public/mojom/auction_worklet_service.mojom
@@ -18,8 +18,9 @@ url.mojom.Origin seller; }; -// Used by the browser to load and run FLEDGE worklets in a sandboxed utility -// process. +// Used by the browser to load and run FLEDGE worklets. This can run in a +// sandboxed utility process (non-Android) or inside a regular renderer +// (Android). // See https://github.com/WICG/turtledove/blob/main/FLEDGE.md [ServiceSandbox=sandbox.mojom.Sandbox.kServiceWithJit] interface AuctionWorkletService {
diff --git a/content/services/shared_storage_worklet/shared_storage_worklet_global_scope.cc b/content/services/shared_storage_worklet/shared_storage_worklet_global_scope.cc index decad72..f9696d10 100644 --- a/content/services/shared_storage_worklet/shared_storage_worklet_global_scope.cc +++ b/content/services/shared_storage_worklet/shared_storage_worklet_global_scope.cc
@@ -96,9 +96,10 @@ v8::Local<v8::Object> global = context->Global(); url_selection_operation_handler_ = - std::make_unique<UrlSelectionOperationHandler>(); + std::make_unique<UrlSelectionOperationHandler>(operation_definition_map_); - unnamed_operation_handler_ = std::make_unique<UnnamedOperationHandler>(); + unnamed_operation_handler_ = + std::make_unique<UnnamedOperationHandler>(operation_definition_map_); console_ = std::make_unique<Console>(client); global @@ -107,24 +108,11 @@ .Check(); global - ->Set( - context, - gin::StringToSymbol(Isolate(), "registerURLSelectionOperation"), - gin::CreateFunctionTemplate( - Isolate(), base::BindRepeating(&SharedStorageWorkletGlobalScope:: - RegisterURLSelectionOperation, - weak_ptr_factory_.GetWeakPtr())) - ->GetFunction(context) - .ToLocalChecked()) - .Check(); - - global - ->Set(context, gin::StringToSymbol(Isolate(), "registerOperation"), + ->Set(context, gin::StringToSymbol(Isolate(), "register"), gin::CreateFunctionTemplate( Isolate(), - base::BindRepeating( - &SharedStorageWorkletGlobalScope::RegisterOperation, - weak_ptr_factory_.GetWeakPtr())) + base::BindRepeating(&SharedStorageWorkletGlobalScope::Register, + weak_ptr_factory_.GetWeakPtr())) ->GetFunction(context) .ToLocalChecked()) .Check(); @@ -151,15 +139,6 @@ std::move(callback).Run(true, {}); } -void SharedStorageWorkletGlobalScope::RegisterURLSelectionOperation( - gin::Arguments* args) { - url_selection_operation_handler_->RegisterOperation(args); -} - -void SharedStorageWorkletGlobalScope::RegisterOperation(gin::Arguments* args) { - unnamed_operation_handler_->RegisterOperation(args); -} - void SharedStorageWorkletGlobalScope::RunURLSelectionOperation( const std::string& name, const std::vector<GURL>& urls, @@ -201,6 +180,56 @@ LocalContext(), name, serialized_data, std::move(callback)); } +void SharedStorageWorkletGlobalScope::Register(gin::Arguments* args) { + std::string name; + if (!args->GetNext(&name)) { + args->ThrowTypeError("Missing \"name\" argument in operation registration"); + return; + } + + if (name.empty()) { + args->ThrowTypeError("Operation name cannot be empty"); + return; + } + + if (operation_definition_map_.count(name)) { + args->ThrowTypeError("Operation name already registered"); + return; + } + + v8::Local<v8::Object> class_definition; + if (!args->GetNext(&class_definition)) { + args->ThrowTypeError( + "Missing class name argument in operation registration"); + return; + } + + if (!class_definition->IsConstructor()) { + args->ThrowTypeError("Unexpected class argument: not a constructor"); + return; + } + + v8::Isolate* isolate = args->isolate(); + v8::Local<v8::Context> context = args->GetHolderCreationContext(); + + v8::Local<v8::Value> class_prototype = + class_definition->Get(context, gin::StringToV8(isolate, "prototype")) + .ToLocalChecked(); + + v8::Local<v8::Value> run_function = + class_prototype.As<v8::Object>() + ->Get(context, gin::StringToV8(isolate, "run")) + .ToLocalChecked(); + + if (run_function->IsUndefined() || !run_function->IsFunction()) { + args->ThrowTypeError("Missing \"run()\" function in the class"); + return; + } + + operation_definition_map_.emplace( + name, v8::Global<v8::Function>(isolate, run_function.As<v8::Function>())); +} + v8::Isolate* SharedStorageWorkletGlobalScope::Isolate() { return isolate_holder_->isolate(); }
diff --git a/content/services/shared_storage_worklet/shared_storage_worklet_global_scope.h b/content/services/shared_storage_worklet/shared_storage_worklet_global_scope.h index 9af56425..5f6da2b 100644 --- a/content/services/shared_storage_worklet/shared_storage_worklet_global_scope.h +++ b/content/services/shared_storage_worklet/shared_storage_worklet_global_scope.h
@@ -47,10 +47,6 @@ std::unique_ptr<std::string> response_body, std::string error_message); - void RegisterURLSelectionOperation(gin::Arguments* args); - - void RegisterOperation(gin::Arguments* args); - void RunURLSelectionOperation( const std::string& name, const std::vector<GURL>& urls, @@ -64,6 +60,8 @@ mojom::SharedStorageWorkletService::RunOperationCallback callback); private: + void Register(gin::Arguments* args); + friend class SharedStorageWorkletGlobalScopeTest; v8::Isolate* Isolate(); @@ -82,6 +80,8 @@ url_selection_operation_handler_; std::unique_ptr<UnnamedOperationHandler> unnamed_operation_handler_; + std::map<std::string, v8::Global<v8::Function>> operation_definition_map_; + base::WeakPtrFactory<SharedStorageWorkletGlobalScope> weak_ptr_factory_{this}; };
diff --git a/content/services/shared_storage_worklet/shared_storage_worklet_global_scope_unittest.cc b/content/services/shared_storage_worklet/shared_storage_worklet_global_scope_unittest.cc index 82a059c..29136fa 100644 --- a/content/services/shared_storage_worklet/shared_storage_worklet_global_scope_unittest.cc +++ b/content/services/shared_storage_worklet/shared_storage_worklet_global_scope_unittest.cc
@@ -254,8 +254,7 @@ EXPECT_EQ(GetTypeOf("console"), "object"); EXPECT_EQ(GetTypeOf("console.log"), "function"); - EXPECT_EQ(GetTypeOf("registerURLSelectionOperation"), "function"); - EXPECT_EQ(GetTypeOf("registerOperation"), "function"); + EXPECT_EQ(GetTypeOf("register"), "function"); EXPECT_EQ(GetTypeOf("sharedStorage"), "object"); EXPECT_EQ(GetTypeOf("sharedStorage.set"), "function"); EXPECT_EQ(GetTypeOf("sharedStorage.append"), "function"); @@ -337,8 +336,7 @@ TEST_F(SharedStorageAddModuleTest, ObjectDefinedStatusDuringAddModule) { SimulateAddModule(R"( if (typeof(console) !== 'object' || - typeof(registerOperation) !== 'function' || - typeof(registerURLSelectionOperation) !== 'function' || + typeof(register) !== 'function' || typeof(sharedStorage) !== 'undefined') { throw Error('Unexpected object defined status.'); } @@ -350,7 +348,7 @@ TEST_F(SharedStorageAddModuleTest, RegisterOperation_MissingOperationName) { SimulateAddModule(R"( - registerOperation(); + register(); )"); EXPECT_FALSE(success()); @@ -361,7 +359,7 @@ TEST_F(SharedStorageAddModuleTest, RegisterOperation_EmptyOperationName) { SimulateAddModule(R"( - registerOperation(""); + register(""); )"); EXPECT_FALSE(success()); @@ -373,7 +371,7 @@ TEST_F(SharedStorageAddModuleTest, RegisterOperation_MissingClassName_MissingArgument) { SimulateAddModule(R"( - registerOperation("test-operation"); + register("test-operation"); )"); EXPECT_FALSE(success()); @@ -385,7 +383,7 @@ TEST_F(SharedStorageAddModuleTest, RegisterOperation_MissingClassName_NotAnObject) { SimulateAddModule(R"( - registerOperation("test-operation", 1); + register("test-operation", 1); )"); EXPECT_FALSE(success()); @@ -396,7 +394,7 @@ TEST_F(SharedStorageAddModuleTest, RegisterOperation_ClassNameNotAConstructor) { SimulateAddModule(R"( - registerOperation("test-operation", {}); + register("test-operation", {}); )"); EXPECT_FALSE(success()); @@ -413,7 +411,7 @@ } } - registerOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); EXPECT_FALSE(success()); @@ -428,7 +426,7 @@ async run() {} } - registerOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); EXPECT_TRUE(success()); @@ -445,8 +443,8 @@ async run() {} } - registerOperation("test-operation", TestClass1); - registerOperation("test-operation", TestClass2); + register("test-operation", TestClass1); + register("test-operation", TestClass2); )"); EXPECT_FALSE(success()); @@ -559,7 +557,7 @@ async run() {} } - registerOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); SimulateRunOperation("test-operation-1", /*serialized_data=*/{}); @@ -577,7 +575,7 @@ } } - registerOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); SimulateRunOperation("test-operation", /*serialized_data=*/{}); @@ -595,7 +593,7 @@ run() {} } - registerOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); SimulateRunOperation("test-operation", /*serialized_data=*/{}); @@ -615,7 +613,7 @@ } } - registerOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); SimulateRunOperation("test-operation", /*serialized_data=*/{}); @@ -632,7 +630,7 @@ async run() {} } - registerOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); SimulateRunOperation("test-operation", /*serialized_data=*/{}); @@ -651,7 +649,7 @@ } } - registerOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); SimulateRunOperation("test-operation", /*serialized_data=*/{}); @@ -671,7 +669,7 @@ } } - registerOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); SimulateRunOperation("test-operation", /*serialized_data=*/{}); @@ -694,7 +692,7 @@ } } - registerOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); SimulateRunOperation("test-operation", /*serialized_data=*/{}); @@ -719,7 +717,7 @@ } } - registerOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); std::vector<uint8_t> serialized_data; @@ -751,7 +749,7 @@ } } - registerOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); std::vector<uint8_t> serialized_data; @@ -783,7 +781,7 @@ } } - registerURLSelectionOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); SimulateRunURLSelectionOperation( @@ -805,7 +803,7 @@ } } - registerURLSelectionOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); SimulateRunURLSelectionOperation( @@ -828,7 +826,7 @@ } } - registerURLSelectionOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); SimulateRunURLSelectionOperation( @@ -855,7 +853,7 @@ } } - registerURLSelectionOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); SimulateRunURLSelectionOperation( @@ -883,7 +881,7 @@ } } - registerURLSelectionOperation("test-operation", TestClass); + register("test-operation", TestClass); )"); SimulateRunURLSelectionOperation("test-operation", {GURL("https://foo.com")},
diff --git a/content/services/shared_storage_worklet/unnamed_operation_handler.cc b/content/services/shared_storage_worklet/unnamed_operation_handler.cc index b13e0c6..9a5512d 100644 --- a/content/services/shared_storage_worklet/unnamed_operation_handler.cc +++ b/content/services/shared_storage_worklet/unnamed_operation_handler.cc
@@ -30,60 +30,13 @@ UnnamedOperationHandler::PendingRequest::~PendingRequest() = default; -UnnamedOperationHandler::UnnamedOperationHandler() = default; +UnnamedOperationHandler::UnnamedOperationHandler( + const std::map<std::string, v8::Global<v8::Function>>& + operation_definition_map) + : operation_definition_map_(operation_definition_map) {} UnnamedOperationHandler::~UnnamedOperationHandler() = default; -void UnnamedOperationHandler::RegisterOperation(gin::Arguments* args) { - std::string name; - if (!args->GetNext(&name)) { - args->ThrowTypeError("Missing \"name\" argument in operation registration"); - return; - } - - if (name.empty()) { - args->ThrowTypeError("Operation name cannot be empty"); - return; - } - - if (operation_definition_map_.count(name)) { - args->ThrowTypeError("Operation name already registered"); - return; - } - - v8::Local<v8::Object> class_definition; - if (!args->GetNext(&class_definition)) { - args->ThrowTypeError( - "Missing class name argument in operation registration"); - return; - } - - if (!class_definition->IsConstructor()) { - args->ThrowTypeError("Unexpected class argument: not a constructor"); - return; - } - - v8::Isolate* isolate = args->isolate(); - v8::Local<v8::Context> context = args->GetHolderCreationContext(); - - v8::Local<v8::Value> class_prototype = - class_definition->Get(context, gin::StringToV8(isolate, "prototype")) - .ToLocalChecked(); - - v8::Local<v8::Value> run_function = - class_prototype.As<v8::Object>() - ->Get(context, gin::StringToV8(isolate, "run")) - .ToLocalChecked(); - - if (run_function->IsUndefined() || !run_function->IsFunction()) { - args->ThrowTypeError("Missing \"run()\" function in the class"); - return; - } - - operation_definition_map_.emplace( - name, v8::Global<v8::Function>(isolate, run_function.As<v8::Function>())); -} - void UnnamedOperationHandler::RunOperation( v8::Local<v8::Context> context, const std::string& name,
diff --git a/content/services/shared_storage_worklet/unnamed_operation_handler.h b/content/services/shared_storage_worklet/unnamed_operation_handler.h index e741191..8c049247 100644 --- a/content/services/shared_storage_worklet/unnamed_operation_handler.h +++ b/content/services/shared_storage_worklet/unnamed_operation_handler.h
@@ -21,12 +21,12 @@ public: struct PendingRequest; - UnnamedOperationHandler(); + explicit UnnamedOperationHandler( + const std::map<std::string, v8::Global<v8::Function>>& + operation_definition_map); ~UnnamedOperationHandler(); - void RegisterOperation(gin::Arguments* args); - void RunOperation( v8::Local<v8::Context> context, const std::string& name, @@ -38,7 +38,8 @@ void OnPromiseRejected(PendingRequest* request, gin::Arguments* args); private: - std::map<std::string, v8::Global<v8::Function>> operation_definition_map_; + const std::map<std::string, v8::Global<v8::Function>>& + operation_definition_map_; std::map<PendingRequest*, std::unique_ptr<PendingRequest>> pending_requests_;
diff --git a/content/services/shared_storage_worklet/url_selection_operation_handler.cc b/content/services/shared_storage_worklet/url_selection_operation_handler.cc index e506e16..7e9e996 100644 --- a/content/services/shared_storage_worklet/url_selection_operation_handler.cc +++ b/content/services/shared_storage_worklet/url_selection_operation_handler.cc
@@ -45,60 +45,13 @@ UrlSelectionOperationHandler::PendingRequest::~PendingRequest() = default; -UrlSelectionOperationHandler::UrlSelectionOperationHandler() = default; +UrlSelectionOperationHandler::UrlSelectionOperationHandler( + const std::map<std::string, v8::Global<v8::Function>>& + operation_definition_map) + : operation_definition_map_(operation_definition_map) {} UrlSelectionOperationHandler::~UrlSelectionOperationHandler() = default; -void UrlSelectionOperationHandler::RegisterOperation(gin::Arguments* args) { - std::string name; - if (!args->GetNext(&name)) { - args->ThrowTypeError("Missing \"name\" argument in operation registration"); - return; - } - - if (name.empty()) { - args->ThrowTypeError("Operation name cannot be empty"); - return; - } - - if (operation_definition_map_.count(name)) { - args->ThrowTypeError("Operation name already registered"); - return; - } - - v8::Local<v8::Object> class_definition; - if (!args->GetNext(&class_definition)) { - args->ThrowTypeError( - "Missing class name argument in operation registration"); - return; - } - - if (!class_definition->IsConstructor()) { - args->ThrowTypeError("Unexpected class argument: not a constructor"); - return; - } - - v8::Isolate* isolate = args->isolate(); - v8::Local<v8::Context> context = args->GetHolderCreationContext(); - - v8::Local<v8::Value> class_prototype = - class_definition->Get(context, gin::StringToV8(isolate, "prototype")) - .ToLocalChecked(); - - v8::Local<v8::Value> run_function = - class_prototype.As<v8::Object>() - ->Get(context, gin::StringToV8(isolate, "run")) - .ToLocalChecked(); - - if (run_function->IsUndefined() || !run_function->IsFunction()) { - args->ThrowTypeError("Missing \"run()\" function in the class"); - return; - } - - operation_definition_map_.emplace( - name, v8::Global<v8::Function>(isolate, run_function.As<v8::Function>())); -} - void UrlSelectionOperationHandler::RunOperation( v8::Local<v8::Context> context, const std::string& name,
diff --git a/content/services/shared_storage_worklet/url_selection_operation_handler.h b/content/services/shared_storage_worklet/url_selection_operation_handler.h index 2e39e78..66d51a5d 100644 --- a/content/services/shared_storage_worklet/url_selection_operation_handler.h +++ b/content/services/shared_storage_worklet/url_selection_operation_handler.h
@@ -21,12 +21,12 @@ public: struct PendingRequest; - UrlSelectionOperationHandler(); + explicit UrlSelectionOperationHandler( + const std::map<std::string, v8::Global<v8::Function>>& + operation_definition_map); ~UrlSelectionOperationHandler(); - void RegisterOperation(gin::Arguments* args); - void RunOperation( v8::Local<v8::Context> context, const std::string& name, @@ -40,7 +40,8 @@ void OnPromiseRejected(PendingRequest* request, gin::Arguments* args); private: - std::map<std::string, v8::Global<v8::Function>> operation_definition_map_; + const std::map<std::string, v8::Global<v8::Function>>& + operation_definition_map_; std::map<PendingRequest*, std::unique_ptr<PendingRequest>> pending_requests_;
diff --git a/content/shell/android/browsertests_apk/AndroidManifest.xml.jinja2 b/content/shell/android/browsertests_apk/AndroidManifest.xml.jinja2 index 0fb1409..f913c0b7 100644 --- a/content/shell/android/browsertests_apk/AndroidManifest.xml.jinja2 +++ b/content/shell/android/browsertests_apk/AndroidManifest.xml.jinja2
@@ -11,6 +11,8 @@ <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> + <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> + <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 9375813a..c4e1e78 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1711,7 +1711,7 @@ } if (is_chromeos_ash) { - deps += [ "//chromeos/assistant:buildflags" ] + deps += [ "//chromeos/ash/components/assistant:buildflags" ] } if (is_android) {
diff --git a/content/test/data/cross_site_scroll_into_view_factory.html b/content/test/data/cross_site_scroll_into_view_factory.html index 702918e3..898f6a9 100644 --- a/content/test/data/cross_site_scroll_into_view_factory.html +++ b/content/test/data/cross_site_scroll_into_view_factory.html
@@ -3,7 +3,7 @@ <!-- This file is based on cross_site_iframe_factory.html. See comments in that file as well as tree_parser_util.js for more details and syntax information. -This page creates a nested, non-branching, frame tree with each iframe being +This page creates a nested, non-branching, frame tree with each child frame being fully outside of its embedder's initial viewport. The inner-most frame will create a <input> box, also outside the frame's initial viewport. @@ -19,19 +19,22 @@ TouchActionNone: Adds a `touch-action: none` style to the inner-most frame's <input> box. No-op in other frames. + FencedFrame: Uses a <fencedframe> element rather than an <iframe> for the + child frame. + For example: siteA{ViewportMeta,RTL}(siteB(siteC{TouchActionNone})) --> <head> -<title>Cross-site scroll-into-view iframe factory</title> +<title>Cross-site scroll-into-view frame tree factory</title> <style> html,body { width: 100%; height: 100%; } - iframe { + iframe, fencedframe { position: absolute; /* 4 screens worth of inset, to make sure this is off screen on Android * where minimum scale on load is 0.25 */ @@ -123,15 +126,20 @@ } /** - * Adds ".com" to an argument if it doesn't already have a top level domain. - * This cuts down on noise in the query string, letting you use single-letter - * names. Adds the specified port number, if any, or the default port otherwise. + * Adds ".test" to an argument if it doesn't already have a top level domain. + * Converts "siteA" to "a.test" to match test host names defined in test SSL + * certificate. Adds the specified port number, if any, or the default port + * otherwise. */ function canonicalizeSiteAndPort(siteString, defaultPort) { var portNumber = sitePortNumber(siteString) || defaultPort; var hostName = siteString.split(':')[0]; if (hostName !== "localhost" && hostName.indexOf('.') == -1) - hostName = hostName + '.com'; + hostName = hostName + '.test'; + + if (hostName.startsWith('site')) + hostName = hostName.substring('site'.length).toLowerCase(); + return hostName + (portNumber ? ':' + portNumber : ""); } @@ -170,6 +178,17 @@ return false; } +// {FencedFrame} - Uses a <fencedframe> element rather than an <iframe> for the +// child frame. +function shouldUseFencedFrame(attributes) { + for (var attribute of attributes) { + if (attribute == "FencedFrame") { + return true; + } + } + return false; +} + function main() { var goCrossSite = !window.location.protocol.startsWith('file'); var queryString = decodeURIComponent(window.location.search.substring(1)); @@ -209,7 +228,7 @@ // ScrollIntoView tests don't need multiple children and we don't support it. console.assert(frameTree.children.length == 1); - // Compute the URL for this iframe. + // Compute the URL for this child frame. let url = frameTree.children[0].value; let siteAndPort = url; if (!isUrl(url)) { @@ -222,13 +241,14 @@ url += '?' + encodeURIComponent(subtreeString); // query } - // Construct the iframe. - var iframe = document.createElement('iframe'); - iframe.src = url; - iframe.id = "child"; + // Construct the child frame. + var elementType = shouldUseFencedFrame(frameTree.attributes) ? 'fencedframe' : 'iframe'; + var frame = document.createElement(elementType); + frame.src = url; + frame.id = "childframe"; - // Add the iframe to the document. - document.body.appendChild(iframe); + // Add the child frame to the document. + document.body.appendChild(frame); } main();
diff --git a/content/test/data/cross_site_scroll_into_view_factory.html.mock-http-headers b/content/test/data/cross_site_scroll_into_view_factory.html.mock-http-headers new file mode 100644 index 0000000..27f34d2 --- /dev/null +++ b/content/test/data/cross_site_scroll_into_view_factory.html.mock-http-headers
@@ -0,0 +1,2 @@ +HTTP/1.1 200 OK +Supports-Loading-Mode: fenced-frame
diff --git a/content/test/data/gpu/pixel_video_test.js b/content/test/data/gpu/pixel_video_test.js index 6737000..080d8c3 100644 --- a/content/test/data/gpu/pixel_video_test.js +++ b/content/test/data/gpu/pixel_video_test.js
@@ -54,6 +54,7 @@ } function main() { + let t0Ms = performance.now(); video = document.getElementById('video'); video.loop = true; video.muted = true; // No need to exercise audio paths. @@ -72,16 +73,37 @@ // callback before starting playback. Since these videos loop there should // always be frames being generated. video.requestVideoFrameCallback((_, f) => { - logOutput(`First frame: ${f.width}x${f.height}, ts: ${f.mediaTime}`); + let elapsedMs = performance.now() - t0Ms; + logOutput(`First VideoFrameCallback: ${f.width}x${f.height}, video ts: ${ + f.mediaTime}, TimeStamp:${elapsedMs}ms`); - // Trace tests on Windows need some time to collect statistics from the - // overlay system, so allow delay before verifying the stats. A 1000ms is - // about ~30 swaps at 30Hz. - setTimeout(_ => { - if (abort) - return; - logOutput('Test complete.'); - domAutomationController.send('SUCCESS'); - }, getTimeDelay()); + // Make sure a few frames have be swapped completely. + // add "--enable-features=ReportFCPOnlyOnSuccessfulCommit" along with + // gpu_benchmarking to ensure completion event is triggered only on + // a succdessful commit. + chrome.gpuBenchmarking.addSwapCompletionEventListener( + waitForSwapsToComplete); }); + + let g_swaps_completion = 4; + function waitForSwapsToComplete() { + g_swaps_completion--; + if (g_swaps_completion >= 0) { + chrome.gpuBenchmarking.addSwapCompletionEventListener( + waitForSwapsToComplete); + } else { + let elapsedMs = performance.now() - t0Ms; + logOutput(`TimeStamp after 4 swaps:${elapsedMs}ms `); + // Trace tests on Windows need some time to collect statistics from the + // overlay system, so allow delay before verifying the stats. A 1000ms is + // about ~30 swaps at 30Hz. + setTimeout(_ => { + if (abort) + return; + elapsedMs = performance.now() - t0Ms; + logOutput(`Test complete. TimeStamp:${elapsedMs}ms`); + domAutomationController.send('SUCCESS'); + }, getTimeDelay()); + } + } } \ No newline at end of file
diff --git a/content/test/data/gpu/pixel_webgpu_import_video_frame.html b/content/test/data/gpu/pixel_webgpu_import_video_frame.html index b027a7be..f0f19c0a 100644 --- a/content/test/data/gpu/pixel_webgpu_import_video_frame.html +++ b/content/test/data/gpu/pixel_webgpu_import_video_frame.html
@@ -24,7 +24,9 @@ return; } - let source = await createFrameSource("hw_decoder", cnv.width, cnv.height); + const urlSearchParams = new URLSearchParams(window.location.search); + + let source = await createFrameSource(urlSearchParams.get("sourceType"), cnv.width, cnv.height); if (!source) { console.error("Cannot get valid video frame - skipping test"); domAutomationController.send("FAILURE");
diff --git a/content/test/data/gpu/pixel_webgpu_import_video_frame_offscreen_canvas.html b/content/test/data/gpu/pixel_webgpu_import_video_frame_offscreen_canvas.html index 3197c77e..efff7f5 100644 --- a/content/test/data/gpu/pixel_webgpu_import_video_frame_offscreen_canvas.html +++ b/content/test/data/gpu/pixel_webgpu_import_video_frame_offscreen_canvas.html
@@ -25,7 +25,9 @@ return; } - let source = await createFrameSource("hw_decoder", cnv.width, cnv.height); + const urlSearchParams = new URLSearchParams(window.location.search); + + let source = await createFrameSource(urlSearchParams.get("sourceType"), cnv.width, cnv.height); if (!source) { console.error("Cannot get valid video frame - skipping test"); domAutomationController.send("FAILURE");
diff --git a/content/test/data/shared_storage/customizable_module.js b/content/test/data/shared_storage/customizable_module.js index cfa66af..a53d34d 100644 --- a/content/test/data/shared_storage/customizable_module.js +++ b/content/test/data/shared_storage/customizable_module.js
@@ -8,4 +8,4 @@ } } -registerOperation("test-operation", TestOperation); +register("test-operation", TestOperation);
diff --git a/content/test/data/shared_storage/erroneous_function_module.js b/content/test/data/shared_storage/erroneous_function_module.js index 1e8ea94..49a4ee4b 100644 --- a/content/test/data/shared_storage/erroneous_function_module.js +++ b/content/test/data/shared_storage/erroneous_function_module.js
@@ -12,6 +12,6 @@ } } -registerOperation("test-operation", TestOperation); +register("test-operation", TestOperation); console.log('Finish executing erroneous_function_module.js')
diff --git a/content/test/data/shared_storage/simple_module.js b/content/test/data/shared_storage/simple_module.js index fee4beb..8481e510 100644 --- a/content/test/data/shared_storage/simple_module.js +++ b/content/test/data/shared_storage/simple_module.js
@@ -27,8 +27,7 @@ } } -registerOperation("test-operation", TestOperation); -registerURLSelectionOperation( - "test-url-selection-operation", TestURLSelectionOperation); +register("test-operation", TestOperation); +register("test-url-selection-operation", TestURLSelectionOperation); console.log('Finish executing simple_module.js')
diff --git a/content/test/gpu/gpu_tests/pixel_integration_test.py b/content/test/gpu/gpu_tests/pixel_integration_test.py index 3b3d7305..bbe297ad 100644 --- a/content/test/gpu/gpu_tests/pixel_integration_test.py +++ b/content/test/gpu/gpu_tests/pixel_integration_test.py
@@ -73,6 +73,7 @@ pages += namespace.GpuRasterizationPages(cls.test_base_name) pages += namespace.ExperimentalCanvasFeaturesPages(cls.test_base_name) pages += namespace.LowLatencyPages(cls.test_base_name) + pages += namespace.WebGPUPages(cls.test_base_name) pages += namespace.PaintWorkletPages(cls.test_base_name) # pages += namespace.NoGpuProcessPages(cls.test_base_name) # The following pages should run only on platforms where SwiftShader is
diff --git a/content/test/gpu/gpu_tests/pixel_test_pages.py b/content/test/gpu/gpu_tests/pixel_test_pages.py index 2e793b0..89093e0 100644 --- a/content/test/gpu/gpu_tests/pixel_test_pages.py +++ b/content/test/gpu/gpu_tests/pixel_test_pages.py
@@ -9,6 +9,8 @@ import os +from enum import Enum + from gpu_tests import common_browser_args as cba from gpu_tests import skia_gold_matching_algorithms as algo @@ -129,11 +131,8 @@ @staticmethod def DefaultPages(base_name): sw_compositing_args = [cba.DISABLE_GPU_COMPOSITING] - - webgpu_args = [ - cba.ENABLE_UNSAFE_WEBGPU, cba.ENABLE_EXPERIMENTAL_WEB_PLATFORM_FEATURES - ] - webgpu_args_compiler = webgpu_args + ['--disable-metal-shader-cache'] + browser_swap_args = ['--enable-features=ReportFCPOnlyOnSuccessfulCommit'] + browser_args_DXVA = [cba.DISABLE_FEATURES_D3D11_VIDEO_DECODER] # The optimizer script spat out pretty similar values for most MP4 tests, so # combine into a single set of parameters. @@ -196,6 +195,7 @@ PixelTestPage( 'pixel_video_mp4.html?width=240&height=135', base_name + '_Video_MP4', + browser_args=browser_swap_args, test_rect=[0, 0, 240, 135], # Most images are actually very similar, but Pixel 2 # tends to produce images with all colors shifted by a @@ -204,11 +204,12 @@ # Surprisingly stable, does not appear to require inexact matching. PixelTestPage('pixel_video_mp4.html?width=240&height=135', base_name + '_Video_MP4_DXVA', - browser_args=[cba.DISABLE_FEATURES_D3D11_VIDEO_DECODER], + browser_args=browser_args_DXVA + browser_swap_args, test_rect=[0, 0, 240, 135]), PixelTestPage( 'pixel_video_mp4_four_colors_aspect_4x3.html?width=240&height=135', base_name + '_Video_MP4_FourColors_Aspect_4x3', + browser_args=browser_swap_args, test_rect=[0, 0, 240, 135], matching_algorithm=algo.SobelMatchingAlgorithm( max_different_pixels=41700, @@ -218,21 +219,25 @@ PixelTestPage( 'pixel_video_mp4_four_colors_rot_90.html?width=270&height=240', base_name + '_Video_MP4_FourColors_Rot_90', + browser_args=browser_swap_args, test_rect=[0, 0, 270, 240], matching_algorithm=general_mp4_algo), PixelTestPage( 'pixel_video_mp4_four_colors_rot_180.html?width=240&height=135', base_name + '_Video_MP4_FourColors_Rot_180', + browser_args=browser_swap_args, test_rect=[0, 0, 240, 135], matching_algorithm=general_mp4_algo), PixelTestPage( 'pixel_video_mp4_four_colors_rot_270.html?width=270&height=240', base_name + '_Video_MP4_FourColors_Rot_270', + browser_args=browser_swap_args, test_rect=[0, 0, 270, 240], matching_algorithm=general_mp4_algo), PixelTestPage( 'pixel_video_mp4_rounded_corner.html?width=240&height=135', base_name + '_Video_MP4_Rounded_Corner', + browser_args=browser_swap_args, test_rect=[0, 0, 240, 135], matching_algorithm=algo.SobelMatchingAlgorithm( max_different_pixels=30500, @@ -241,6 +246,7 @@ ignored_border_thickness=1)), PixelTestPage('pixel_video_vp9.html?width=240&height=135', base_name + '_Video_VP9', + browser_args=browser_swap_args, test_rect=[0, 0, 240, 135], matching_algorithm=algo.SobelMatchingAlgorithm( max_different_pixels=114000, @@ -249,7 +255,7 @@ ignored_border_thickness=1)), PixelTestPage('pixel_video_vp9.html?width=240&height=135', base_name + '_Video_VP9_DXVA', - browser_args=[cba.DISABLE_FEATURES_D3D11_VIDEO_DECODER], + browser_args=browser_args_DXVA + browser_swap_args, test_rect=[0, 0, 240, 135], matching_algorithm=algo.SobelMatchingAlgorithm( max_different_pixels=31100, @@ -295,6 +301,7 @@ PixelTestPage('pixel_video_backdrop_filter.html?width=240&height=135', base_name + '_Video_BackdropFilter', test_rect=[0, 0, 240, 135], + browser_args=browser_swap_args, matching_algorithm=algo.SobelMatchingAlgorithm( max_different_pixels=1000, pixel_delta_threshold=20, @@ -350,84 +357,125 @@ base_name + '_WebGLPreservedAfterTabSwitch', test_rect=[0, 0, 300, 300], optional_action='SwitchTabsAndCopyImage'), - PixelTestPage('pixel_webgpu_import_webgl_canvas.html', - base_name + '_WebGPUImportWebGLCanvas', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args), - PixelTestPage('pixel_webgpu_import_2d_canvas.html', - base_name + '_WebGPUImport2DCanvas', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args), - PixelTestPage('pixel_webgpu_import_2d_canvas.html', - base_name + '_WebGPUImportUnaccelerated2DCanvas', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args + - [cba.DISABLE_ACCELERATED_2D_CANVAS]), - PixelTestPage('pixel_webgpu_import_webgpu_canvas.html', - base_name + '_WebGPUImportWebGPUCanvas', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args), - PixelTestPage('pixel_webgpu_import_video_frame.html', - base_name + '_WebGPUImportVideoFrame', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args), - PixelTestPage('pixel_webgpu_import_video_frame.html', - base_name + '_WebGPUImportVideoFrameUnaccelerated', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args + - [cba.DISABLE_ACCELERATED_2D_CANVAS]), - PixelTestPage('pixel_webgpu_import_video_frame_offscreen_canvas.html', - base_name + '_WebGPUImportVideoFrameOffscreenCanvas', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args), - PixelTestPage( - 'pixel_webgpu_import_video_frame_offscreen_canvas.html', - base_name + '_WebGPUImportVideoFrameUnacceleratedOffscreenCanvas', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args + [cba.DISABLE_ACCELERATED_2D_CANVAS]), - PixelTestPage('pixel_webgpu_webgl_teximage2d.html', - base_name + '_WebGPUWebGLTexImage2D', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args), - PixelTestPage('pixel_webgpu_canvas2d_drawimage.html', - base_name + '_WebGPUCanvas2DDrawImage', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args), - PixelTestPage('pixel_webgpu_copy_image.html', - base_name + '_WebGPUToDataURL', - test_rect=[0, 0, 400, 300], - browser_args=webgpu_args_compiler), - PixelTestPage('pixel_webgpu_cached_swap_buffer_invalidated.html', - base_name + - '_WebGPUCachedSwapBufferInvalidatedShouldBeBlank', - test_rect=[0, 0, 300, 300], - browser_args=webgpu_args), - PixelTestPage('pixel_webgpu_copy_externalImage_2d_canvas.html', - base_name + '_WebGPUCopyExternalImage2DCanvas', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args), - PixelTestPage('pixel_webgpu_copy_externalImage_imageData.html', - base_name + '_WebGPUCopyExternalImageImageData', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args), - PixelTestPage('pixel_webgpu_copy_externalImage_imageBitmap.html', - base_name + '_WebGPUCopyExternalImageImageBitmap', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args), - PixelTestPage('pixel_webgpu_copy_externalImage_offscreenCanvas.html', - base_name + '_WebGPUCopyExternalImageOffscreenCanvas', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args), - PixelTestPage('pixel_webgpu_copy_externalImage_webgl_canvas.html', - base_name + '_WebGPUCopyExternalImageWebGLCanvas', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args), - PixelTestPage('pixel_webgpu_copy_externalImage_webgpu_canvas.html', - base_name + '_WebGPUCopyExternalImageWebGPUCanvas', - test_rect=[0, 0, 400, 200], - browser_args=webgpu_args), ] + @staticmethod + def WebGPUPages(base_name): + class Mode(Enum): + WEBGPU_DEFAULT = 0 + WEBGPU_SWIFTSHADER = 1 + VULKAN_SWIFTSHADER = 2 + + def webgpu_pages_helper(base_name, mode): + webgpu_args = [ + cba.ENABLE_UNSAFE_WEBGPU, + cba.ENABLE_EXPERIMENTAL_WEB_PLATFORM_FEATURES + ] + video_frame_query_params = '?sourceType=hw_decoder' + if mode == Mode.WEBGPU_SWIFTSHADER: + base_name += '_WebGPUSwiftShader' + webgpu_args += [ + '--enable-features=UseSkiaRenderer,Vulkan', + '--use-webgpu-adapter=swiftshader' + ] + video_frame_query_params = '?sourceType=sw_decoder' + elif mode == Mode.VULKAN_SWIFTSHADER: + base_name += '_VulkanSwiftShader' + webgpu_args += [ + '--enable-features=UseSkiaRenderer,Vulkan', + '--use-angle=swiftshader', '--use-vulkan=swiftshader', + '--use-webgpu-adapter=swiftshader', '--disable-vulkan-surface' + ] + video_frame_query_params = '?sourceType=sw_decoder' + + return [ + PixelTestPage('pixel_webgpu_import_webgl_canvas.html', + base_name + '_WebGPUImportWebGLCanvas', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args), + PixelTestPage('pixel_webgpu_import_2d_canvas.html', + base_name + '_WebGPUImport2DCanvas', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args), + PixelTestPage('pixel_webgpu_import_2d_canvas.html', + base_name + '_WebGPUImportUnaccelerated2DCanvas', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args + + [cba.DISABLE_ACCELERATED_2D_CANVAS]), + PixelTestPage('pixel_webgpu_import_webgpu_canvas.html', + base_name + '_WebGPUImportWebGPUCanvas', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args), + PixelTestPage('pixel_webgpu_import_video_frame.html' + + video_frame_query_params, + base_name + '_WebGPUImportVideoFrame', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args), + PixelTestPage( + 'pixel_webgpu_import_video_frame.html' + video_frame_query_params, + base_name + '_WebGPUImportVideoFrameUnaccelerated', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args + [cba.DISABLE_ACCELERATED_2D_CANVAS]), + PixelTestPage( + 'pixel_webgpu_import_video_frame_offscreen_canvas.html' + + video_frame_query_params, + base_name + '_WebGPUImportVideoFrameOffscreenCanvas', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args), + PixelTestPage( + 'pixel_webgpu_import_video_frame_offscreen_canvas.html' + + video_frame_query_params, + base_name + '_WebGPUImportVideoFrameUnacceleratedOffscreenCanvas', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args + [cba.DISABLE_ACCELERATED_2D_CANVAS]), + PixelTestPage('pixel_webgpu_webgl_teximage2d.html', + base_name + '_WebGPUWebGLTexImage2D', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args), + PixelTestPage('pixel_webgpu_canvas2d_drawimage.html', + base_name + '_WebGPUCanvas2DDrawImage', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args), + PixelTestPage('pixel_webgpu_copy_image.html', + base_name + '_WebGPUToDataURL', + test_rect=[0, 0, 400, 300], + browser_args=webgpu_args), + PixelTestPage('pixel_webgpu_cached_swap_buffer_invalidated.html', + base_name + + '_WebGPUCachedSwapBufferInvalidatedShouldBeBlank', + test_rect=[0, 0, 300, 300], + browser_args=webgpu_args), + PixelTestPage('pixel_webgpu_copy_externalImage_2d_canvas.html', + base_name + '_WebGPUCopyExternalImage2DCanvas', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args), + PixelTestPage('pixel_webgpu_copy_externalImage_imageData.html', + base_name + '_WebGPUCopyExternalImageImageData', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args), + PixelTestPage('pixel_webgpu_copy_externalImage_imageBitmap.html', + base_name + '_WebGPUCopyExternalImageImageBitmap', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args), + PixelTestPage('pixel_webgpu_copy_externalImage_offscreenCanvas.html', + base_name + '_WebGPUCopyExternalImageOffscreenCanvas', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args), + PixelTestPage('pixel_webgpu_copy_externalImage_webgl_canvas.html', + base_name + '_WebGPUCopyExternalImageWebGLCanvas', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args), + PixelTestPage('pixel_webgpu_copy_externalImage_webgpu_canvas.html', + base_name + '_WebGPUCopyExternalImageWebGPUCanvas', + test_rect=[0, 0, 400, 200], + browser_args=webgpu_args), + ] + + return (webgpu_pages_helper(base_name, mode=Mode.WEBGPU_DEFAULT) + + webgpu_pages_helper(base_name, mode=Mode.WEBGPU_SWIFTSHADER) + + webgpu_pages_helper(base_name, mode=Mode.VULKAN_SWIFTSHADER)) + + # Pages that should be run with GPU rasterization enabled. @staticmethod def GpuRasterizationPages(base_name): @@ -803,6 +851,9 @@ # All bots are connected with a power source, however, we want to to # test with the code path that's enabled with battery power. cba.DISABLE_DIRECT_COMPOSITION_VP_SCALING, + # This feature ensures that addSwapCompletionEventListener in + # gpu_benchmarking only sends completion event on a succdessful commit. + '--enable-features=ReportFCPOnlyOnSuccessfulCommit', ] browser_args_NV12 = browser_args + [ '--direct-composition-video-swap-chain-format=nv12'
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt index 7fc96c9..0daf799 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -178,6 +178,24 @@ # WebGPU's copyExternalImage is broken on mac10.12 crbug.com/1311710 [ mac-10.12 ] Pixel_WebGPUCopyExternalImage* [ Failure ] +# WebGPU SwiftShader tests are only supported on Linux with SkiaRenderer Vulkan. +crbug.com/1307787 [ linux skia-renderer-gl ] Pixel_WebGPUSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ linux skia-renderer-dawn ] Pixel_WebGPUSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ linux skia-renderer-disabled ] Pixel_WebGPUSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ android ] Pixel_WebGPUSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ chromeos ] Pixel_WebGPUSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ fuchsia ] Pixel_WebGPUSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ mac ] Pixel_WebGPUSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ win ] Pixel_WebGPUSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ linux skia-renderer-gl ] Pixel_VulkanSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ linux skia-renderer-dawn ] Pixel_VulkanSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ linux skia-renderer-disabled ] Pixel_VulkanSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ android ] Pixel_VulkanSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ chromeos ] Pixel_VulkanSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ fuchsia ] Pixel_VulkanSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ mac ] Pixel_VulkanSwiftShader_WebGPU* [ Skip ] +crbug.com/1307787 [ win ] Pixel_VulkanSwiftShader_WebGPU* [ Skip ] + ############################### # Temporary Skip Expectations # ###############################
diff --git a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt index 5a866d3..c1b12e0 100644 --- a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
@@ -126,19 +126,6 @@ crbug.com/1129879 [ chromeos ] TraceTest_Video_Media_Stream_Incompatible_Stride [ Skip ] crbug.com/1129879 [ fuchsia ] TraceTest_Video_Media_Stream_Incompatible_Stride [ Skip ] -# WebGPU is only supported on Win10, Mac, and Linux+SkiaRenderer+Vulkan. -crbug.com/976495 [ linux skia-renderer-gl ] TraceTest_WebGPU* [ Skip ] -crbug.com/976495 [ linux skia-renderer-dawn ] TraceTest_WebGPU* [ Skip ] -crbug.com/976495 [ linux skia-renderer-disabled ] TraceTest_WebGPU* [ Skip ] -crbug.com/976497 [ android ] TraceTest_WebGPU* [ Skip ] -crbug.com/852089 [ chromeos ] TraceTest_WebGPU* [ Skip ] -crbug.com/852089 [ fuchsia ] TraceTest_WebGPU* [ Skip ] - -# Tests that crash on gpu-fyi-win10-nvidia-rel-32 -crbug.com/1300670 [ win nvidia-0x2184 ] TraceTest_WebGPUImportVideoFrameUnacceleratedOffscreenCanvas [ Failure ] -crbug.com/1300670 [ win nvidia-0x2184 ] TraceTest_WebGPUImportVideoFrameOffscreenCanvas [ Failure ] -crbug.com/1300670 [ win nvidia-0x2184 ] TraceTest_WebGPUImportVideoFrameUnaccelerated [ Failure ] - ############################### # Temporary Skip Expectations # ############################### @@ -152,7 +139,7 @@ # Non-"Skip" expectations go here to suppress regular flakes/failures. # VP9 videos fail to trigger zero copy video presentation path. -crbug.com/930343 [ win intel ] VideoPathTraceTest_DirectComposition_Video_VP9_Fullsize [ Failure ] +crbug.com/930343 [ win10 intel-0x3e92 ] VideoPathTraceTest_DirectComposition_Video_VP9_Fullsize [ Failure ] # Incorrectly reporting SCALING instead of DIRECT on Windows 10 UHD 630 GPUs. crbug.com/1079393 [ win10 intel-0x3e92 ] OverlayModeTraceTest_DirectComposition_Underlay [ Failure ] @@ -164,6 +151,8 @@ crbug.com/1079393 [ win10 intel-0x3e92 ] OverlayModeTraceTest_DirectComposition_Video_MP4_Fullsize [ Failure ] crbug.com/1079393 [ win10 intel-0x3e92 ] OverlayModeTraceTest_DirectComposition_Video_MP4_NV12 [ Failure ] crbug.com/1079393 [ win10 intel-0x3e92 ] OverlayModeTraceTest_DirectComposition_Video_MP4_YUY2 [ Failure ] +crbug.com/1119491 [ win10 intel-0x3e92 ] OverlayModeTraceTest_DirectComposition_Video_MP4_BGRA [ Failure ] +crbug.com/1119491 [ win10 intel-0x3e92 ] OverlayModeTraceTest_DirectComposition_Video_VP9_BGRA [ Failure ] crbug.com/1079393 [ win10 intel-0x3e92 ] OverlayModeTraceTest_DirectComposition_Video_VP9 [ Failure ] crbug.com/1079393 [ win10 intel-0x3e92 ] OverlayModeTraceTest_DirectComposition_Video_VP9_DXVA [ Failure ] crbug.com/1079393 [ win10 intel-0x3e92 ] OverlayModeTraceTest_DirectComposition_Video_VP9_Fullsize [ Failure ] @@ -187,26 +176,13 @@ # Hardware overlay promotion fails on Win10 AMD. crbug.com/1246268 [ win10 amd-0x7340 ] OverlayModeTraceTest_DirectComposition_Video_MP4_FourColors_Aspect_4x3 [ Failure ] -# BGRA swap chains don't consistently get promoted to overlays. -crbug.com/1119491 [ win intel ] OverlayModeTraceTest_DirectComposition_Video_MP4_BGRA [ Failure ] -crbug.com/1119491 [ win intel ] OverlayModeTraceTest_DirectComposition_Video_VP9_BGRA [ Failure ] - # Failed to create YUY2 swap chain on Win10 AMD RX 5500 XT crbug.com/1151767 [ win10 amd-0x7340 ] VideoPathTraceTest_DirectComposition_Video_MP4_YUY2 [ Failure ] crbug.com/1151767 [ win10 amd-0x7340 ] VideoPathTraceTest_DirectComposition_Video_VP9_YUY2 [ Failure ] -# WebGPU pixel tests hang on mac bots which mostly run older versions of mac os. -crbug.com/1213170 [ mac ] TraceTest_WebGPU* [ Failure ] - -# WebGPU pixel tests fail on Linux+SkiaRenderer+Vulkan -crbug.com/1213657 [ linux skia-renderer-vulkan ] TraceTest_WebGPU* [ Failure ] - # Flakes on linux-rel. crbug.com/1216377 [ linux ] TraceTest_Video_Media_Stream_Incompatible_Stride [ RetryOnFailure ] -# Cannot generate correct rendering results on windows. -crbug.com/1238570 [ win ] TraceTest_WebGPUImportVideoFrame [ Failure ] - # New flakes seen on Nexus 5X bot. crbug.com/1278028 [ android android-nexus-5x ] TraceTest_Video_MP4_FourColors_Rot_180 [ RetryOnFailure ] crbug.com/1278028 [ android android-nexus-5x ] TraceTest_Video_VP9 [ RetryOnFailure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index 0e2e70c6..452c692 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -138,11 +138,9 @@ crbug.com/1099955 [ angle-swiftshader no-swiftshader-gl win ] WebglExtension_EXT_texture_compression_bptc [ Skip ] # Extensions not available under D3D9 -[ win angle-d3d9 no-swiftshader-gl ] WebglExtension_EXT_sRGB [ Skip ] crbug.com/867718 [ win angle-d3d9 ] WebglExtension_EXT_disjoint_timer_query [ Skip ] [ win amd angle-d3d9 ] WebglExtension_WEBGL_depth_texture [ Skip ] [ win angle-d3d9 ] WebglExtension_WEBGL_draw_buffers [ Skip ] -[ win angle-d3d9 ] WebglExtension_OES_fbo_render_mipmap [ Skip ] [ win angle-d3d9 ] WebglExtension_EXT_texture_compression_bptc [ Skip ] [ win angle-d3d9 no-swiftshader-gl ] WebglExtension_EXT_texture_compression_rgtc [ Skip ] @@ -442,10 +440,6 @@ # Mark ANGLE's OpenGL as flaky on Windows Nvidia crbug.com/582083 [ win nvidia angle-opengl ] conformance/* [ RetryOnFailure ] -# D3D9 / Passthrough command decoder -crbug.com/angleproject/2192 [ win angle-d3d9 passthrough ] conformance/textures/canvas/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] -crbug.com/angleproject/2192 [ win angle-d3d9 passthrough ] conformance/textures/canvas/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] - # D3D9 / AMD RX 5500 XT / Passthrough command decoder crbug.com/1159126 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/more/glsl/uniformOutOfBounds.html [ RetryOnFailure ]
diff --git a/content/utility/BUILD.gn b/content/utility/BUILD.gn index 2d14f33..299b13d 100644 --- a/content/utility/BUILD.gn +++ b/content/utility/BUILD.gn
@@ -3,7 +3,7 @@ # found in the LICENSE file. import("//build/config/chromeos/ui_mode.gni") -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") import("//components/services/screen_ai/buildflags/features.gni") import("//device/vr/buildflags/buildflags.gni") import("//media/gpu/args.gni") @@ -85,7 +85,7 @@ if (is_chromeos_ash) { deps += [ "//ash/services/ime:sandbox_hook", - "//chromeos/assistant:buildflags", + "//chromeos/ash/components/assistant:buildflags", "//chromeos/services/tts:sandbox_hook", ] if (use_vaapi || use_v4l2_codec) {
diff --git a/content/utility/DEPS b/content/utility/DEPS index 0bde0a1..e9802ce4 100644 --- a/content/utility/DEPS +++ b/content/utility/DEPS
@@ -5,7 +5,7 @@ "+content/child", "+content/public/utility", "+content/services", - "+chromeos/assistant/buildflags.h", + "+chromeos/ash/components/assistant/buildflags.h", "+chromeos/services/libassistant", "+chromeos/services/tts", "+device/vr/buildflags",
diff --git a/content/utility/utility_main.cc b/content/utility/utility_main.cc index 22a3ab63..89a2b36 100644 --- a/content/utility/utility_main.cc +++ b/content/utility/utility_main.cc
@@ -52,7 +52,7 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) #include "ash/services/ime/ime_sandbox_hook.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #include "chromeos/services/tts/tts_sandbox_hook.h" #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
diff --git a/device/bluetooth/bluez/bluetooth_bluez_unittest.cc b/device/bluetooth/bluez/bluetooth_bluez_unittest.cc index 0802a14..845ff850 100644 --- a/device/bluetooth/bluez/bluetooth_bluez_unittest.cc +++ b/device/bluetooth/bluez/bluetooth_bluez_unittest.cc
@@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/containers/contains.h" +#include "base/debug/dump_without_crashing.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" #include "base/task/current_thread.h" @@ -129,6 +130,11 @@ namespace { +bool* dump_without_crashing_flag; +extern "C" void HandleDumpWithoutCrashing() { + *dump_without_crashing_flag = true; +} + // Callback for BluetoothDevice::GetConnectionInfo() that simply saves the // connection info to the bound argument. void SaveConnectionInfo(BluetoothDevice::ConnectionInfo* out, @@ -4973,6 +4979,35 @@ devices_found_pair.second); } +TEST_F(BluetoothBlueZTest, BluetoothLowEnergyScanSessionBlueZDeviceNULL) { + GetAdapter(); + ASSERT_TRUE(adapter_->IsPresent()); + + FakeBluetoothAdvertisementMonitorApplicationServiceProvider* + application_manager = GetAdvertisementMonitorApplicationManger(); + FakeBluetoothLowEnergyScanSessionDelegate delegate; + auto background_scan_session = adapter_->StartLowEnergyScanSession( + CreateLowEnergyScanFilter(), /*delegate=*/delegate.GetWeakPtr()); + + // Check that advertisement monitor was added to d-bus layer. + EXPECT_EQ(1u, application_manager->AdvertisementMonitorsCount()); + + // Get advertisement fake advertisement monitor to forward events to + // BluetoothLowEnergyScanSessionBlueZ. + FakeBluetoothAdvertisementMonitorServiceProvider* advertisement_monitor = + application_manager->GetLastAddedAdvertisementMonitorServiceProvider(); + ASSERT_TRUE(advertisement_monitor); + + bool did_dump_without_crashing = false; + dump_without_crashing_flag = &did_dump_without_crashing; + base::debug::SetDumpWithoutCrashingFunction(&HandleDumpWithoutCrashing); + advertisement_monitor->delegate()->OnDeviceFound(dbus::ObjectPath("")); + + EXPECT_TRUE(did_dump_without_crashing); + + base::debug::SetDumpWithoutCrashingFunction(nullptr); +} + TEST_F(BluetoothBlueZTest, BluetoothLowEnergyScanSessionBlueZDeviceLost) { GetAdapter(); ASSERT_TRUE(adapter_->IsPresent());
diff --git a/device/bluetooth/bluez/bluetooth_low_energy_scan_session_bluez.cc b/device/bluetooth/bluez/bluetooth_low_energy_scan_session_bluez.cc index 75c4e01..3a8e453 100644 --- a/device/bluetooth/bluez/bluetooth_low_energy_scan_session_bluez.cc +++ b/device/bluetooth/bluez/bluetooth_low_energy_scan_session_bluez.cc
@@ -5,6 +5,7 @@ #include "device/bluetooth/bluez/bluetooth_low_energy_scan_session_bluez.h" #include "base/callback.h" +#include "base/debug/dump_without_crashing.h" #include "base/logging.h" #include "base/memory/ptr_util.h" #include "device/bluetooth/bluez/bluetooth_adapter_bluez.h" @@ -61,7 +62,13 @@ DCHECK(adapter_); device::BluetoothDevice* device = adapter_->GetDeviceWithPath(device_path); - DCHECK(device); + if (!device) { + // TODO(b/212643004): Generate crash dumps to understand why the device + // path is sometimes invalid but avoid notifying observers with a null + // device. + base::debug::DumpWithoutCrashing(); + return; + } delegate_->OnDeviceFound(this, device); }
diff --git a/extensions/browser/api/networking_private/networking_private_api.cc b/extensions/browser/api/networking_private/networking_private_api.cc index 08b019e..8578053 100644 --- a/extensions/browser/api/networking_private/networking_private_api.cc +++ b/extensions/browser/api/networking_private/networking_private_api.cc
@@ -4,6 +4,7 @@ #include "extensions/browser/api/networking_private/networking_private_api.h" +#include <memory> #include <utility> #include "base/bind.h" @@ -21,6 +22,8 @@ #include "extensions/common/extension_api.h" #include "extensions/common/features/feature_provider.h" +#include "base/logging.h" + namespace extensions { namespace { @@ -466,12 +469,18 @@ return RespondNow(Error(kPrivateOnlyError)); } - base::Value enabled_networks_onc_types( - GetDelegate(browser_context())->GetEnabledNetworkTypes()); - if (enabled_networks_onc_types.GetList().empty()) - return RespondNow(Error(networking_private::kErrorNotSupported)); + GetDelegate(browser_context()) + ->GetEnabledNetworkTypes(base::BindOnce( + &NetworkingPrivateGetEnabledNetworkTypesFunction::Result, this)); + return did_respond() ? AlreadyResponded() : RespondLater(); +} + +void NetworkingPrivateGetEnabledNetworkTypesFunction::Result( + std::unique_ptr<base::Value> enabled_networks_onc_types) { + if (enabled_networks_onc_types->GetList().empty()) + return Respond(Error(networking_private::kErrorNotSupported)); base::Value enabled_networks_list(base::Value::Type::LIST); - for (const auto& entry : enabled_networks_onc_types.GetList()) { + for (const auto& entry : enabled_networks_onc_types->GetList()) { const std::string& type = entry.GetString(); if (type == ::onc::network_type::kEthernet) { enabled_networks_list.Append( @@ -486,7 +495,7 @@ LOG(ERROR) << "networkingPrivate: Unexpected type: " << type; } } - return RespondNow(OneArgument(std::move(enabled_networks_list))); + return Respond(OneArgument(std::move(enabled_networks_list))); } //////////////////////////////////////////////////////////////////////////////// @@ -498,16 +507,22 @@ ExtensionFunction::ResponseAction NetworkingPrivateGetDeviceStatesFunction::Run() { - std::unique_ptr<NetworkingPrivateDelegate::DeviceStateList> device_states( - GetDelegate(browser_context())->GetDeviceStateList()); + GetDelegate(browser_context()) + ->GetDeviceStateList(base::BindOnce( + &NetworkingPrivateGetDeviceStatesFunction::Result, this)); + return did_respond() ? AlreadyResponded() : RespondLater(); +} + +void NetworkingPrivateGetDeviceStatesFunction::Result( + std::unique_ptr<NetworkingPrivateDelegate::DeviceStateList> device_states) { if (!device_states) - return RespondNow(Error(networking_private::kErrorNotSupported)); + return Respond(Error(networking_private::kErrorNotSupported)); base::Value::List device_state_list; for (const auto& properties : *device_states) device_state_list.Append( base::Value::FromUniquePtrValue(properties->ToValue())); - return RespondNow(OneArgument(base::Value(std::move(device_state_list)))); + return Respond(OneArgument(base::Value(std::move(device_state_list)))); } //////////////////////////////////////////////////////////////////////////////// @@ -523,11 +538,18 @@ private_api::EnableNetworkType::Params::Create(args()); EXTENSION_FUNCTION_VALIDATE(params); - if (!GetDelegate(browser_context()) - ->EnableNetworkType(private_api::ToString(params->network_type))) { - return RespondNow(Error(networking_private::kErrorNotSupported)); - } - return RespondNow(NoArguments()); + GetDelegate(browser_context()) + ->EnableNetworkType( + private_api::ToString(params->network_type), + base::BindOnce(&NetworkingPrivateEnableNetworkTypeFunction::Result, + this)); + + return did_respond() ? AlreadyResponded() : RespondLater(); +} +void NetworkingPrivateEnableNetworkTypeFunction::Result(bool success) { + if (!success) + return Respond(Error(networking_private::kErrorNotSupported)); + return Respond(NoArguments()); } //////////////////////////////////////////////////////////////////////////////// @@ -542,11 +564,18 @@ std::unique_ptr<private_api::DisableNetworkType::Params> params = private_api::DisableNetworkType::Params::Create(args()); - if (!GetDelegate(browser_context()) - ->DisableNetworkType(private_api::ToString(params->network_type))) { - return RespondNow(Error(networking_private::kErrorNotSupported)); - } - return RespondNow(NoArguments()); + GetDelegate(browser_context()) + ->DisableNetworkType( + private_api::ToString(params->network_type), + base::BindOnce(&NetworkingPrivateDisableNetworkTypeFunction::Result, + this)); + return did_respond() ? AlreadyResponded() : RespondLater(); +} + +void NetworkingPrivateDisableNetworkTypeFunction::Result(bool success) { + if (!success) + return Respond(Error(networking_private::kErrorNotSupported)); + return Respond(NoArguments()); } //////////////////////////////////////////////////////////////////////////////// @@ -562,9 +591,18 @@ private_api::RequestNetworkScan::Params::Create(args()); EXTENSION_FUNCTION_VALIDATE(params); std::string network_type = private_api::ToString(params->network_type); - if (!GetDelegate(browser_context())->RequestScan(network_type)) - return RespondNow(Error(networking_private::kErrorNotSupported)); - return RespondNow(NoArguments()); + GetDelegate(browser_context()) + ->RequestScan( + network_type, + base::BindOnce(&NetworkingPrivateRequestNetworkScanFunction::Result, + this)); + return did_respond() ? AlreadyResponded() : RespondLater(); +} + +void NetworkingPrivateRequestNetworkScanFunction::Result(bool success) { + if (!success) + return Respond(Error(networking_private::kErrorNotSupported)); + return Respond(NoArguments()); } //////////////////////////////////////////////////////////////////////////////// @@ -840,13 +878,21 @@ ExtensionFunction::ResponseAction NetworkingPrivateGetGlobalPolicyFunction::Run() { - base::Value policy_dict(GetDelegate(browser_context())->GetGlobalPolicy()); + GetDelegate(browser_context()) + ->GetGlobalPolicy(base::BindOnce( + &NetworkingPrivateGetGlobalPolicyFunction::Result, this)); + + return did_respond() ? AlreadyResponded() : RespondLater(); +} + +void NetworkingPrivateGetGlobalPolicyFunction::Result( + std::unique_ptr<base::Value> policy_dict) { // private_api::GlobalPolicy is a subset of the global policy dictionary // (by definition), so use the api setter/getter to generate the subset. std::unique_ptr<private_api::GlobalPolicy> policy( - private_api::GlobalPolicy::FromValue(policy_dict)); + private_api::GlobalPolicy::FromValue(*policy_dict)); DCHECK(policy); - return RespondNow( + return Respond( ArgumentList(private_api::GetGlobalPolicy::Results::Create(*policy))); } @@ -863,9 +909,15 @@ return RespondNow(Error(kPrivateOnlyError)); } - base::Value certificate_lists( - GetDelegate(browser_context())->GetCertificateLists()); - return RespondNow(OneArgument(std::move(certificate_lists))); + GetDelegate(browser_context()) + ->GetCertificateLists(base::BindOnce( + &NetworkingPrivateGetCertificateListsFunction::Result, this)); + return did_respond() ? AlreadyResponded() : RespondLater(); +} + +void NetworkingPrivateGetCertificateListsFunction::Result( + std::unique_ptr<base::Value> certificate_lists) { + return Respond(OneArgument(std::move(*certificate_lists))); } } // namespace extensions
diff --git a/extensions/browser/api/networking_private/networking_private_api.h b/extensions/browser/api/networking_private/networking_private_api.h index 4e78a50e..ef6c07f 100644 --- a/extensions/browser/api/networking_private/networking_private_api.h +++ b/extensions/browser/api/networking_private/networking_private_api.h
@@ -9,7 +9,9 @@ #include <string> #include "base/values.h" +#include "extensions/browser/api/networking_private/networking_private_delegate.h" #include "extensions/browser/extension_function.h" +#include "extensions/common/api/networking_private.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace extensions { @@ -239,6 +241,9 @@ // ExtensionFunction: ResponseAction Run() override; + + private: + void Result(std::unique_ptr<base::Value> enabled_networks_onc_types); }; // Implements the chrome.networkingPrivate.getDeviceStates method. @@ -259,6 +264,10 @@ // ExtensionFunction: ResponseAction Run() override; + + private: + void Result(std::unique_ptr<NetworkingPrivateDelegate::DeviceStateList> + device_states); }; // Implements the chrome.networkingPrivate.enableNetworkType method. @@ -279,6 +288,9 @@ // ExtensionFunction: ResponseAction Run() override; + + private: + void Result(bool success); }; // Implements the chrome.networkingPrivate.disableNetworkType method. @@ -299,6 +311,9 @@ // ExtensionFunction: ResponseAction Run() override; + + private: + void Result(bool success); }; // Implements the chrome.networkingPrivate.requestNetworkScan method. @@ -319,6 +334,9 @@ // ExtensionFunction: ResponseAction Run() override; + + private: + void Result(bool success); }; // Implements the chrome.networkingPrivate.startConnect method. @@ -504,6 +522,9 @@ // ExtensionFunction: ResponseAction Run() override; + + private: + void Result(std::unique_ptr<base::Value> global_policies); }; class NetworkingPrivateGetCertificateListsFunction : public ExtensionFunction { @@ -523,6 +544,9 @@ // ExtensionFunction: ResponseAction Run() override; + + private: + void Result(std::unique_ptr<base::Value> certificate_list); }; } // namespace extensions
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos.cc b/extensions/browser/api/networking_private/networking_private_chromeos.cc index c3ff185..45328e3f 100644 --- a/extensions/browser/api/networking_private/networking_private_chromeos.cc +++ b/extensions/browser/api/networking_private/networking_private_chromeos.cc
@@ -680,7 +680,8 @@ std::move(failure_callback))); } -base::Value NetworkingPrivateChromeOS::GetEnabledNetworkTypes() { +void NetworkingPrivateChromeOS::GetEnabledNetworkTypes( + EnabledNetworkTypesCallback callback) { chromeos::NetworkStateHandler* state_handler = GetStateHandler(); base::Value network_list(base::Value::Type::LIST); @@ -692,11 +693,12 @@ if (state_handler->IsTechnologyEnabled(NetworkTypePattern::Cellular())) network_list.Append(::onc::network_type::kCellular); - return network_list; + std::move(callback).Run( + base::Value::ToUniquePtrValue(std::move(network_list))); } -std::unique_ptr<NetworkingPrivateDelegate::DeviceStateList> -NetworkingPrivateChromeOS::GetDeviceStateList() { +void NetworkingPrivateChromeOS::GetDeviceStateList( + DeviceStateListCallback callback) { std::set<std::string> technologies_found; NetworkStateHandler::DeviceStateList devices; NetworkHandler::Get()->network_state_handler()->GetDeviceList(&devices); @@ -720,20 +722,23 @@ AppendDeviceState(technology, nullptr /* device */, device_state_list.get()); } - return device_state_list; + std::move(callback).Run(std::move(device_state_list)); } -base::Value NetworkingPrivateChromeOS::GetGlobalPolicy() { +void NetworkingPrivateChromeOS::GetGlobalPolicy( + GetGlobalPolicyCallback callback) { base::Value result(base::Value::Type::DICTIONARY); const base::Value* global_network_config = GetManagedConfigurationHandler()->GetGlobalConfigFromPolicy( std::string() /* no username hash, device policy */); + if (global_network_config) result.MergeDictionary(global_network_config); - return result; + std::move(callback).Run(base::Value::ToUniquePtrValue(std::move(result))); } -base::Value NetworkingPrivateChromeOS::GetCertificateLists() { +void NetworkingPrivateChromeOS::GetCertificateLists( + GetCertificateListsCallback callback) { private_api::CertificateLists result; const std::vector<NetworkCertificateHandler::Certificate>& server_cas = NetworkHandler::Get() @@ -749,11 +754,11 @@ ->client_certificates(); for (const auto& cert : user_certs) result.user_certificates.push_back(GetCertDictionary(cert)); - - return base::Value::FromUniquePtrValue(result.ToValue()); + std::move(callback).Run(result.ToValue()); } -bool NetworkingPrivateChromeOS::EnableNetworkType(const std::string& type) { +void NetworkingPrivateChromeOS::EnableNetworkType(const std::string& type, + BoolCallback callback) { NetworkTypePattern pattern = chromeos::onc::NetworkTypePatternFromOncType(type); @@ -761,10 +766,11 @@ GetStateHandler()->SetTechnologyEnabled( pattern, true, chromeos::network_handler::ErrorCallback()); - return true; + std::move(callback).Run(true); } -bool NetworkingPrivateChromeOS::DisableNetworkType(const std::string& type) { +void NetworkingPrivateChromeOS::DisableNetworkType(const std::string& type, + BoolCallback callback) { NetworkTypePattern pattern = chromeos::onc::NetworkTypePatternFromOncType(type); @@ -772,14 +778,16 @@ GetStateHandler()->SetTechnologyEnabled( pattern, false, chromeos::network_handler::ErrorCallback()); - return true; + std::move(callback).Run(true); } -bool NetworkingPrivateChromeOS::RequestScan(const std::string& type) { +void NetworkingPrivateChromeOS::RequestScan(const std::string& type, + BoolCallback callback) { NetworkTypePattern pattern = chromeos::onc::NetworkTypePatternFromOncType( type.empty() ? ::onc::network_type::kAllTypes : type); GetStateHandler()->RequestScan(pattern); - return true; + + std::move(callback).Run(true); } // Private methods
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos.h b/extensions/browser/api/networking_private/networking_private_chromeos.h index 3ebb677..cf075f9 100644 --- a/extensions/browser/api/networking_private/networking_private_chromeos.h +++ b/extensions/browser/api/networking_private/networking_private_chromeos.h
@@ -87,13 +87,15 @@ const std::string& network_id, VoidCallback success_callback, FailureCallback failure_callback) override; - base::Value GetEnabledNetworkTypes() override; - std::unique_ptr<DeviceStateList> GetDeviceStateList() override; - base::Value GetGlobalPolicy() override; - base::Value GetCertificateLists() override; - bool EnableNetworkType(const std::string& type) override; - bool DisableNetworkType(const std::string& type) override; - bool RequestScan(const std::string& type) override; + void GetEnabledNetworkTypes(EnabledNetworkTypesCallback callback) override; + void GetDeviceStateList(DeviceStateListCallback callback) override; + void GetGlobalPolicy(GetGlobalPolicyCallback callback) override; + void GetCertificateLists(GetCertificateListsCallback callback) override; + void EnableNetworkType(const std::string& type, + BoolCallback callback) override; + void DisableNetworkType(const std::string& type, + BoolCallback callback) override; + void RequestScan(const std::string& type, BoolCallback callback) override; private: // Callback for both GetProperties and GetManagedProperties. Copies
diff --git a/extensions/browser/api/networking_private/networking_private_delegate.h b/extensions/browser/api/networking_private/networking_private_delegate.h index 3d605d7..81926b4 100644 --- a/extensions/browser/api/networking_private/networking_private_delegate.h +++ b/extensions/browser/api/networking_private/networking_private_delegate.h
@@ -30,9 +30,17 @@ using StringCallback = base::OnceCallback<void(const std::string&)>; using NetworkListCallback = base::OnceCallback<void(std::unique_ptr<base::ListValue>)>; + using EnabledNetworkTypesCallback = + base::OnceCallback<void(std::unique_ptr<base::Value>)>; using FailureCallback = base::OnceCallback<void(const std::string&)>; using DeviceStateList = std::vector< std::unique_ptr<api::networking_private::DeviceStateProperties>>; + using DeviceStateListCallback = + base::OnceCallback<void(std::unique_ptr<DeviceStateList>)>; + using GetGlobalPolicyCallback = + base::OnceCallback<void(std::unique_ptr<base::Value>)>; + using GetCertificateListsCallback = + base::OnceCallback<void(std::unique_ptr<base::Value>)>; // Returns |result| on success, or |result|=nullopt and |error| on failure. using PropertiesCallback = @@ -68,7 +76,7 @@ const UIDelegate* ui_delegate() { return ui_delegate_.get(); } - // Asynchronous methods + // All methods are asynchronous virtual void GetProperties(const std::string& guid, PropertiesCallback callback) = 0; virtual void GetManagedProperties(const std::string& guid, @@ -125,35 +133,37 @@ VoidCallback success_callback, FailureCallback failure_callback) = 0; - // Synchronous methods - // Returns a list of ONC type strings. - virtual base::Value GetEnabledNetworkTypes() = 0; + virtual void GetEnabledNetworkTypes(EnabledNetworkTypesCallback callback) = 0; // Returns a list of DeviceStateProperties. - virtual std::unique_ptr<DeviceStateList> GetDeviceStateList() = 0; + virtual void GetDeviceStateList(DeviceStateListCallback callback) = 0; // Returns a dictionary of global policy values (may be empty). Note: the // dictionary is expected to be a superset of the networkingPrivate // GlobalPolicy dictionary. Any properties not in GlobalPolicy will be // ignored. - virtual base::Value GetGlobalPolicy() = 0; + virtual void GetGlobalPolicy(GetGlobalPolicyCallback callback) = 0; // Returns a dictionary of certificate lists. - virtual base::Value GetCertificateLists() = 0; + virtual void GetCertificateLists(GetCertificateListsCallback callback) = 0; // Returns true if the ONC network type |type| is enabled. - virtual bool EnableNetworkType(const std::string& type) = 0; + virtual void EnableNetworkType(const std::string& type, + BoolCallback callback) = 0; // Returns true if the ONC network type |type| is disabled. - virtual bool DisableNetworkType(const std::string& type) = 0; + virtual void DisableNetworkType(const std::string& type, + BoolCallback callback) = 0; // Returns true if a scan was requested. It may take many seconds for a scan // to complete. The scan may or may not trigger API events when complete. // |type| is the type of network to request a scan for; if empty, scans for // all supported network types except Cellular, which must be requested // explicitly. - virtual bool RequestScan(const std::string& type) = 0; + virtual void RequestScan(const std::string& type, BoolCallback callback) = 0; + + // These functions are "fire and forget" - so in a way synchrone and not. // Optional methods for adding a NetworkingPrivateDelegateObserver for // implementations that require it (non-chromeos).
diff --git a/extensions/browser/api/networking_private/networking_private_linux.cc b/extensions/browser/api/networking_private/networking_private_linux.cc index 881f260..f2fc005 100644 --- a/extensions/browser/api/networking_private/networking_private_linux.cc +++ b/extensions/browser/api/networking_private/networking_private_linux.cc
@@ -602,41 +602,47 @@ std::move(failure_callback)); } -base::Value NetworkingPrivateLinux::GetEnabledNetworkTypes() { +void NetworkingPrivateLinux::GetEnabledNetworkTypes( + EnabledNetworkTypesCallback callback) { base::Value network_list(base::Value::Type::LIST); network_list.Append(::onc::network_type::kWiFi); - return network_list; + std::move(callback).Run( + base::Value::ToUniquePtrValue(std::move(network_list))); } -std::unique_ptr<NetworkingPrivateDelegate::DeviceStateList> -NetworkingPrivateLinux::GetDeviceStateList() { +void NetworkingPrivateLinux::GetDeviceStateList( + DeviceStateListCallback callback) { std::unique_ptr<DeviceStateList> device_state_list(new DeviceStateList); std::unique_ptr<api::networking_private::DeviceStateProperties> properties( new api::networking_private::DeviceStateProperties); properties->type = api::networking_private::NETWORK_TYPE_WIFI; properties->state = api::networking_private::DEVICE_STATE_TYPE_ENABLED; device_state_list->push_back(std::move(properties)); - return device_state_list; + std::move(callback).Run(std::move(device_state_list)); } -base::Value NetworkingPrivateLinux::GetGlobalPolicy() { - return {}; +void NetworkingPrivateLinux::GetGlobalPolicy(GetGlobalPolicyCallback callback) { + std::move(callback).Run(base::Value::ToUniquePtrValue({})); } -base::Value NetworkingPrivateLinux ::GetCertificateLists() { - return {}; +void NetworkingPrivateLinux ::GetCertificateLists( + GetCertificateListsCallback callback) { + std::move(callback).Run(base::Value::ToUniquePtrValue({})); } -bool NetworkingPrivateLinux::EnableNetworkType(const std::string& type) { - return false; +void NetworkingPrivateLinux::EnableNetworkType(const std::string& type, + BoolCallback callback) { + std::move(callback).Run(false); } -bool NetworkingPrivateLinux::DisableNetworkType(const std::string& type) { - return false; +void NetworkingPrivateLinux::DisableNetworkType(const std::string& type, + BoolCallback callback) { + std::move(callback).Run(false); } -bool NetworkingPrivateLinux::RequestScan(const std::string& /* type */) { - return GetNetworksForScanRequest(); +void NetworkingPrivateLinux::RequestScan(const std::string& /* type */, + BoolCallback callback) { + std::move(callback).Run(GetNetworksForScanRequest()); } void NetworkingPrivateLinux::AddObserver(
diff --git a/extensions/browser/api/networking_private/networking_private_linux.h b/extensions/browser/api/networking_private/networking_private_linux.h index 3d94778..2549759 100644 --- a/extensions/browser/api/networking_private/networking_private_linux.h +++ b/extensions/browser/api/networking_private/networking_private_linux.h
@@ -87,13 +87,15 @@ const std::string& network_id, VoidCallback success_callback, FailureCallback failure_callback) override; - base::Value GetEnabledNetworkTypes() override; - std::unique_ptr<DeviceStateList> GetDeviceStateList() override; - base::Value GetGlobalPolicy() override; - base::Value GetCertificateLists() override; - bool EnableNetworkType(const std::string& type) override; - bool DisableNetworkType(const std::string& type) override; - bool RequestScan(const std::string& type) override; + void GetEnabledNetworkTypes(EnabledNetworkTypesCallback callback) override; + void GetDeviceStateList(DeviceStateListCallback callback) override; + void GetGlobalPolicy(GetGlobalPolicyCallback callback) override; + void GetCertificateLists(GetCertificateListsCallback callback) override; + void EnableNetworkType(const std::string& type, + BoolCallback callback) override; + void DisableNetworkType(const std::string& type, + BoolCallback callback) override; + void RequestScan(const std::string& type, BoolCallback callback) override; void AddObserver(NetworkingPrivateDelegateObserver* observer) override; void RemoveObserver(NetworkingPrivateDelegateObserver* observer) override;
diff --git a/extensions/browser/api/networking_private/networking_private_service_client.cc b/extensions/browser/api/networking_private/networking_private_service_client.cc index 42b11c4..1bbffc0 100644 --- a/extensions/browser/api/networking_private/networking_private_service_client.cc +++ b/extensions/browser/api/networking_private/networking_private_service_client.cc
@@ -332,47 +332,53 @@ std::move(failure_callback).Run(networking_private::kErrorNotSupported); } -base::Value NetworkingPrivateServiceClient::GetEnabledNetworkTypes() { +void NetworkingPrivateServiceClient::GetEnabledNetworkTypes( + EnabledNetworkTypesCallback callback) { base::Value network_list(base::Value::Type::LIST); network_list.Append(::onc::network_type::kWiFi); - return network_list; + std::move(callback).Run( + base::Value::ToUniquePtrValue(std::move(network_list))); } -std::unique_ptr<NetworkingPrivateDelegate::DeviceStateList> -NetworkingPrivateServiceClient::GetDeviceStateList() { +void NetworkingPrivateServiceClient::GetDeviceStateList( + DeviceStateListCallback callback) { std::unique_ptr<DeviceStateList> device_state_list(new DeviceStateList); std::unique_ptr<api::networking_private::DeviceStateProperties> properties( new api::networking_private::DeviceStateProperties); properties->type = api::networking_private::NETWORK_TYPE_WIFI; properties->state = api::networking_private::DEVICE_STATE_TYPE_ENABLED; device_state_list->push_back(std::move(properties)); - return device_state_list; + std::move(callback).Run(std::move(device_state_list)); } -base::Value NetworkingPrivateServiceClient::GetGlobalPolicy() { - return base::Value(base::Value::Type::DICTIONARY); +void NetworkingPrivateServiceClient::GetGlobalPolicy( + GetGlobalPolicyCallback callback) { + std::move(callback).Run(base::Value::ToUniquePtrValue( + base::Value(base::Value::Type::DICTIONARY))); } -base::Value NetworkingPrivateServiceClient::GetCertificateLists() { - return base::Value(base::Value::Type::DICTIONARY); +void NetworkingPrivateServiceClient::GetCertificateLists( + GetCertificateListsCallback callback) { + std::move(callback).Run(base::Value::ToUniquePtrValue( + base::Value(base::Value::Type::DICTIONARY))); } -bool NetworkingPrivateServiceClient::EnableNetworkType( - const std::string& type) { - return false; +void NetworkingPrivateServiceClient::EnableNetworkType(const std::string& type, + BoolCallback callback) { + std::move(callback).Run(false); } -bool NetworkingPrivateServiceClient::DisableNetworkType( - const std::string& type) { - return false; +void NetworkingPrivateServiceClient::DisableNetworkType(const std::string& type, + BoolCallback callback) { + std::move(callback).Run(false); } -bool NetworkingPrivateServiceClient::RequestScan( - const std::string& /* type */) { +void NetworkingPrivateServiceClient::RequestScan(const std::string& /* type */, + BoolCallback callback) { task_runner_->PostTask(FROM_HERE, base::BindOnce(&WiFiService::RequestNetworkScan, base::Unretained(wifi_service_.get()))); - return true; + std::move(callback).Run(true); } ////////////////////////////////////////////////////////////////////////////////
diff --git a/extensions/browser/api/networking_private/networking_private_service_client.h b/extensions/browser/api/networking_private/networking_private_service_client.h index 90fcdfa..cf65197 100644 --- a/extensions/browser/api/networking_private/networking_private_service_client.h +++ b/extensions/browser/api/networking_private/networking_private_service_client.h
@@ -99,13 +99,15 @@ const std::string& network_id, VoidCallback success_callback, FailureCallback failure_callback) override; - base::Value GetEnabledNetworkTypes() override; - std::unique_ptr<DeviceStateList> GetDeviceStateList() override; - base::Value GetGlobalPolicy() override; - base::Value GetCertificateLists() override; - bool EnableNetworkType(const std::string& type) override; - bool DisableNetworkType(const std::string& type) override; - bool RequestScan(const std::string& type) override; + void GetEnabledNetworkTypes(EnabledNetworkTypesCallback callback) override; + void GetDeviceStateList(DeviceStateListCallback callback) override; + void GetGlobalPolicy(GetGlobalPolicyCallback callback) override; + void GetCertificateLists(GetCertificateListsCallback callback) override; + void EnableNetworkType(const std::string& type, + BoolCallback callback) override; + void DisableNetworkType(const std::string& type, + BoolCallback callback) override; + void RequestScan(const std::string& type, BoolCallback callback) override; void AddObserver(NetworkingPrivateDelegateObserver* observer) override; void RemoveObserver(NetworkingPrivateDelegateObserver* observer) override;
diff --git a/extensions/browser/updater/extension_downloader.cc b/extensions/browser/updater/extension_downloader.cc index 9537ef7d..aa3b9d8 100644 --- a/extensions/browser/updater/extension_downloader.cc +++ b/extensions/browser/updater/extension_downloader.cc
@@ -268,6 +268,57 @@ } } +void ExtensionDownloader::AddToFetches( + std::map<FetchDataGroupKey, + std::vector<std::unique_ptr<ManifestFetchData>>>& + fetches_preparing, + ExtensionDownloaderTask task) { + std::string install_source = + extension_urls::IsWebstoreUpdateUrl(task.update_url) + ? kDefaultInstallSource + : kNotFromWebstoreInstallSource; + if (task.is_corrupt_reinstall) + install_source = kReinstallInstallSource; + + DownloadPingData ping_data; + DownloadPingData* optional_ping_data = nullptr; + if (delegate_->GetPingDataForExtension(task.id, &ping_data)) + optional_ping_data = &ping_data; + + // Find or create a ManifestFetchData to add this extension to. + bool is_new_extension_force_installed = + task.install_location == mojom::ManifestLocation::kExternalPolicyDownload; + FetchDataGroupKey key(task.request_id, task.update_url, + is_new_extension_force_installed); + auto existing_iter = fetches_preparing.find(key); + if (existing_iter != fetches_preparing.end() && + !existing_iter->second.empty()) { + // Try to add to the ManifestFetchData at the end of the list. + ManifestFetchData* existing_fetch = existing_iter->second.back().get(); + if (existing_fetch->AddExtension(task.id, task.version.GetString(), + optional_ping_data, task.update_url_data, + install_source, task.install_location, + task.fetch_priority)) { + existing_fetch->AddAssociatedTask(std::move(task)); + return; + } + } + // Otherwise add a new element to the list, if the list doesn't exist or + // if its last element is already full. + std::unique_ptr<ManifestFetchData> fetch(CreateManifestFetchData( + task.update_url, task.request_id, task.fetch_priority)); + ManifestFetchData* fetch_ptr = fetch.get(); + if (is_new_extension_force_installed) + fetch_ptr->set_is_all_external_policy_download(); + fetches_preparing[key].push_back(std::move(fetch)); + bool did_add = fetch_ptr->AddExtension( + task.id, task.version.GetString(), optional_ping_data, + task.update_url_data, install_source, task.install_location, + task.fetch_priority); + DCHECK(did_add); + fetch_ptr->AddAssociatedTask(std::move(task)); +} + void ExtensionDownloader::DoStartAllPending() { ReportStats(); url_stats_ = URLStats(); @@ -277,54 +328,8 @@ // be multiple ManifestFetchData* objects with the same update_url. std::map<FetchDataGroupKey, std::vector<std::unique_ptr<ManifestFetchData>>> fetches_preparing; - for (const ExtensionDownloaderTask& task : pending_tasks_) { - std::string install_source = - extension_urls::IsWebstoreUpdateUrl(task.update_url) - ? kDefaultInstallSource - : kNotFromWebstoreInstallSource; - if (task.is_corrupt_reinstall) - install_source = kReinstallInstallSource; - - DownloadPingData ping_data; - DownloadPingData* optional_ping_data = nullptr; - if (delegate_->GetPingDataForExtension(task.id, &ping_data)) - optional_ping_data = &ping_data; - - // Find or create a ManifestFetchData to add this extension to. - bool added = false; - bool is_new_extension_force_installed = - task.install_location == - mojom::ManifestLocation::kExternalPolicyDownload; - FetchDataGroupKey key(task.request_id, task.update_url, - is_new_extension_force_installed); - auto existing_iter = fetches_preparing.find(key); - if (existing_iter != fetches_preparing.end() && - !existing_iter->second.empty()) { - // Try to add to the ManifestFetchData at the end of the list. - ManifestFetchData* existing_fetch = existing_iter->second.back().get(); - if (existing_fetch->AddExtension(task.id, task.version.GetString(), - optional_ping_data, task.update_url_data, - install_source, task.install_location, - task.fetch_priority)) { - added = true; - } - } - if (!added) { - // Otherwise add a new element to the list, if the list doesn't exist or - // if its last element is already full. - std::unique_ptr<ManifestFetchData> fetch(CreateManifestFetchData( - task.update_url, task.request_id, task.fetch_priority)); - ManifestFetchData* fetch_ptr = fetch.get(); - if (is_new_extension_force_installed) - fetch_ptr->set_is_all_external_policy_download(); - fetches_preparing[key].push_back(std::move(fetch)); - added = fetch_ptr->AddExtension(task.id, task.version.GetString(), - optional_ping_data, task.update_url_data, - install_source, task.install_location, - task.fetch_priority); - DCHECK(added); - } - } + for (ExtensionDownloaderTask& task : pending_tasks_) + AddToFetches(fetches_preparing, std::move(task)); pending_tasks_.clear(); for (auto& fetch_list : fetches_preparing) { @@ -457,7 +462,7 @@ NotifyExtensionsDownloadStageChanged( extension_ids, ExtensionDownloaderDelegate::Stage::QUEUED_FOR_MANIFEST); - i->Merge(*fetch_data); + i->Merge(std::move(fetch_data)); return; } } @@ -467,7 +472,7 @@ NotifyExtensionsDownloadStageChanged( extension_ids, ExtensionDownloaderDelegate::Stage::DOWNLOADING_MANIFEST); - manifests_queue_.active_request()->Merge(*fetch_data); + manifests_queue_.active_request()->Merge(std::move(fetch_data)); } else { UMA_HISTOGRAM_COUNTS_1M( "Extensions.UpdateCheckUrlLength",
diff --git a/extensions/browser/updater/extension_downloader.h b/extensions/browser/updater/extension_downloader.h index 96e57c5..bb499ff 100644 --- a/extensions/browser/updater/extension_downloader.h +++ b/extensions/browser/updater/extension_downloader.h
@@ -353,6 +353,12 @@ // attempt to download. void NotifyUpdateFound(const std::string& id, const std::string& version); + // Helper method to populate lists of manifest fetch requests. + void AddToFetches(std::map<FetchDataGroupKey, + std::vector<std::unique_ptr<ManifestFetchData>>>& + fetches_preparing, + ExtensionDownloaderTask task); + // Do real work of StartAllPending. If .crx cache is used, this function // is called when cache is ready. void DoStartAllPending();
diff --git a/extensions/browser/updater/manifest_fetch_data.cc b/extensions/browser/updater/manifest_fetch_data.cc index fd79d53..785cab0 100644 --- a/extensions/browser/updater/manifest_fetch_data.cc +++ b/extensions/browser/updater/manifest_fetch_data.cc
@@ -4,6 +4,7 @@ #include "extensions/browser/updater/manifest_fetch_data.h" +#include <iterator> #include <vector> #include "base/check.h" @@ -105,8 +106,7 @@ full_url_(update_url), brand_code_(brand_code), ping_mode_(ping_mode), - fetch_priority_(fetch_priority), - is_all_external_policy_download_(false) { + fetch_priority_(fetch_priority) { UpdateFullUrl(base_query_params); request_ids_.insert(request_id); } @@ -220,6 +220,10 @@ return true; } +void ManifestFetchData::AddAssociatedTask(ExtensionDownloaderTask task) { + associated_tasks_.emplace_back(std::move(task)); +} + void ManifestFetchData::UpdateFullUrl(const std::string& base_query_params) { std::string query = full_url_.has_query() ? full_url_.query() + "&" : std::string(); @@ -278,16 +282,23 @@ return value == kNeverPinged || value > 0; } -void ManifestFetchData::Merge(const ManifestFetchData& other) { - DCHECK(full_url() == other.full_url()); +void ManifestFetchData::Merge(std::unique_ptr<ManifestFetchData> other) { + DCHECK(full_url() == other->full_url()); if (fetch_priority_ != DownloadFetchPriority::kForeground) { - fetch_priority_ = other.fetch_priority_; + fetch_priority_ = other->fetch_priority_; } - request_ids_.insert(other.request_ids_.begin(), other.request_ids_.end()); + request_ids_.insert(other->request_ids_.begin(), other->request_ids_.end()); + associated_tasks_.insert( + associated_tasks_.end(), + std::make_move_iterator(other->associated_tasks_.begin()), + std::make_move_iterator(other->associated_tasks_.end())); } void ManifestFetchData::set_is_all_external_policy_download() { is_all_external_policy_download_ = true; } +std::vector<ExtensionDownloaderTask> ManifestFetchData::TakeAssociatedTasks() { + return std::move(associated_tasks_); +} } // namespace extensions
diff --git a/extensions/browser/updater/manifest_fetch_data.h b/extensions/browser/updater/manifest_fetch_data.h index 032e71ba..5e56e4f 100644 --- a/extensions/browser/updater/manifest_fetch_data.h +++ b/extensions/browser/updater/manifest_fetch_data.h
@@ -8,8 +8,10 @@ #include <map> #include <set> #include <string> +#include <vector> #include "base/version.h" +#include "extensions/browser/updater/extension_downloader_task.h" #include "extensions/browser/updater/extension_downloader_types.h" #include "extensions/common/manifest.h" #include "extensions/common/mojom/manifest.mojom-shared.h" @@ -76,6 +78,10 @@ mojom::ManifestLocation install_location, DownloadFetchPriority fetch_priority); + // Stores a task in list of associated tasks, call this after successful + // AddExtension. + void AddAssociatedTask(ExtensionDownloaderTask task); + const GURL& base_url() const { return base_url_; } const GURL& full_url() const { return full_url_; } ExtensionIdSet GetExtensionIds() const; @@ -104,11 +110,20 @@ // full_url, this method merges the other information associated with the // fetch (in particular this adds all request ids associated with |other| // to this ManifestFetchData). - void Merge(const ManifestFetchData& other); + void Merge(std::unique_ptr<ManifestFetchData> other); // Assigns true if all the extensions are force installed. void set_is_all_external_policy_download(); + // Returns list of associated tasks, added previously by `AddAssociatedTask`. + const std::vector<ExtensionDownloaderTask>& GetAssociatedTasks() const { + return associated_tasks_; + } + + // Returns list of associated tasks. Note that the list will be moved from + // ManifestFetchData. + std::vector<ExtensionDownloaderTask> TakeAssociatedTasks(); + private: // Contains supplementary data needed to construct update manifest fetch // query. @@ -167,7 +182,10 @@ // The flag is set to true if all the extensions are force installed // extensions. - bool is_all_external_policy_download_; + bool is_all_external_policy_download_{false}; + + // List of associated tasks for ExtensionDownloader. + std::vector<ExtensionDownloaderTask> associated_tasks_; }; } // namespace extensions
diff --git a/extensions/renderer/OWNERS b/extensions/renderer/OWNERS index ff38dbb..9d2a3d1a 100644 --- a/extensions/renderer/OWNERS +++ b/extensions/renderer/OWNERS
@@ -1,5 +1,2 @@ rdevlin.cronin@chromium.org lazyboy@chromium.org - -# For V8 related changes, please consider also adding -jochen@chromium.org
diff --git a/fuchsia/engine/browser/accessibility_browsertest.cc b/fuchsia/engine/browser/accessibility_browsertest.cc index 49640ae..ce221892 100644 --- a/fuchsia/engine/browser/accessibility_browsertest.cc +++ b/fuchsia/engine/browser/accessibility_browsertest.cc
@@ -229,7 +229,7 @@ float scale_factor = 20.f; // Make the bridge use scaling in hit test calculations. - frame_impl_->set_device_scale_factor_for_test(scale_factor); + frame_impl_->OnPixelScaleUpdate(scale_factor); // Downscale the target point, since the hit test calculation will scale it // back up.
diff --git a/fuchsia/engine/browser/frame_impl.cc b/fuchsia/engine/browser/frame_impl.cc index ad0198ef..d815a97 100644 --- a/fuchsia/engine/browser/frame_impl.cc +++ b/fuchsia/engine/browser/frame_impl.cc
@@ -632,8 +632,6 @@ v2_accessibility_bridge_ = std::make_unique<ui::AccessibilityBridgeFuchsiaImpl>( root_window(), window_tree_host_->CreateViewRef(), - base::BindRepeating(&FrameImpl::GetDeviceScaleFactor, - base::Unretained(this)), base::BindRepeating(&FrameImpl::SetAccessibilityEnabled, base::Unretained(this)), base::BindRepeating(&FrameImpl::OnAccessibilityError, @@ -950,7 +948,9 @@ DCHECK(!window_tree_host_); window_tree_host_ = std::make_unique<FrameWindowTreeHost>( - std::move(view_token), std::move(view_ref_pair), web_contents_.get()); + std::move(view_token), std::move(view_ref_pair), web_contents_.get(), + base::BindRepeating(&FrameImpl::OnPixelScaleUpdate, + base::Unretained(this))); InitWindowTreeHost(); } @@ -962,7 +962,9 @@ window_tree_host_ = std::make_unique<FrameWindowTreeHost>( std::move(view_creation_token), std::move(view_ref_pair), - web_contents_.get()); + web_contents_.get(), + base::BindRepeating(&FrameImpl::OnPixelScaleUpdate, + base::Unretained(this))); InitWindowTreeHost(); } @@ -1378,13 +1380,6 @@ explicit_sites_filter_error_page_ = std::move(error_page); } -float FrameImpl::GetDeviceScaleFactor() { - if (device_scale_factor_for_test_) - return *device_scale_factor_for_test_; - - return window_tree_host_->scenic_scale_factor(); -} - void FrameImpl::SetAccessibilityEnabled(bool enabled) { auto* browser_accessibility_state = content::BrowserAccessibilityState::GetInstance(); @@ -1396,3 +1391,9 @@ ui::kAXModeComplete); } } + +void FrameImpl::OnPixelScaleUpdate(float pixel_scale) { + if (v2_accessibility_bridge_) { + v2_accessibility_bridge_->SetPixelScale(pixel_scale); + } +}
diff --git a/fuchsia/engine/browser/frame_impl.h b/fuchsia/engine/browser/frame_impl.h index f2054bc..50631a4 100644 --- a/fuchsia/engine/browser/frame_impl.h +++ b/fuchsia/engine/browser/frame_impl.h
@@ -34,6 +34,7 @@ #include "fuchsia/engine/browser/frame_permission_controller.h" #include "fuchsia/engine/browser/navigation_controller_impl.h" #include "fuchsia/engine/browser/theme_manager.h" +#include "fuchsia/engine/web_engine_export.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/web_preferences/web_preferences.h" #include "ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_impl.h" @@ -53,9 +54,9 @@ class NavigationPolicyHandler; // Implementation of fuchsia.web.Frame based on content::WebContents. -class FrameImpl : public fuchsia::web::Frame, - public content::WebContentsObserver, - public content::WebContentsDelegate { +class WEB_ENGINE_EXPORT FrameImpl : public fuchsia::web::Frame, + public content::WebContentsObserver, + public content::WebContentsDelegate { public: // Returns FrameImpl that owns the |web_contents| or nullptr if the // |web_contents| is nullptr. Returns nullptr if there is no FrameImpl that @@ -153,6 +154,7 @@ FRIEND_TEST_ALL_PREFIXES(FrameImplTest, NoNavigationObserverAttached); FRIEND_TEST_ALL_PREFIXES(FrameImplTest, ReloadFrame); FRIEND_TEST_ALL_PREFIXES(FrameImplTest, Stop); + FRIEND_TEST_ALL_PREFIXES(FuchsiaFrameAccessibilityTest, HitTest); // Used for storing awaiting popup frames in |pending_popups_| struct PendingPopup { @@ -345,7 +347,7 @@ const content::GlobalRequestID& request_id, const blink::mojom::ResourceLoadInfo& resource_load_info) override; - float GetDeviceScaleFactor(); + void OnPixelScaleUpdate(float pixel_scale); void SetAccessibilityEnabled(bool enabled); const std::unique_ptr<content::WebContents> web_contents_;
diff --git a/fuchsia/engine/browser/frame_window_tree_host.cc b/fuchsia/engine/browser/frame_window_tree_host.cc index 7eb341ba..717389f 100644 --- a/fuchsia/engine/browser/frame_window_tree_host.cc +++ b/fuchsia/engine/browser/frame_window_tree_host.cc
@@ -67,9 +67,11 @@ FrameWindowTreeHost::FrameWindowTreeHost( fuchsia::ui::views::ViewToken view_token, scenic::ViewRefPair view_ref_pair, - content::WebContents* web_contents) + content::WebContents* web_contents, + OnPixelScaleUpdateCallback on_pixel_scale_update) : view_ref_(DupViewRef(view_ref_pair.view_ref)), - web_contents_(web_contents) { + web_contents_(web_contents), + on_pixel_scale_update_(std::move(on_pixel_scale_update)) { CreateCompositor(); ui::PlatformWindowInitProperties properties = @@ -84,9 +86,11 @@ FrameWindowTreeHost::FrameWindowTreeHost( fuchsia::ui::views::ViewCreationToken view_creation_token, scenic::ViewRefPair view_ref_pair, - content::WebContents* web_contents) + content::WebContents* web_contents, + OnPixelScaleUpdateCallback on_pixel_scale_update) : view_ref_(DupViewRef(view_ref_pair.view_ref)), - web_contents_(web_contents) { + web_contents_(web_contents), + on_pixel_scale_update_(std::move(on_pixel_scale_update)) { CreateCompositor(); ui::PlatformWindowInitProperties properties = @@ -141,4 +145,6 @@ void FrameWindowTreeHost::OnScenicPixelScale(ui::PlatformWindow* window, float scale) { scenic_pixel_scale_ = scale; + if (on_pixel_scale_update_) + on_pixel_scale_update_.Run(scenic_pixel_scale_); }
diff --git a/fuchsia/engine/browser/frame_window_tree_host.h b/fuchsia/engine/browser/frame_window_tree_host.h index b66c3a6..799b08e 100644 --- a/fuchsia/engine/browser/frame_window_tree_host.h +++ b/fuchsia/engine/browser/frame_window_tree_host.h
@@ -19,12 +19,16 @@ class FrameWindowTreeHost final : public aura::WindowTreeHostPlatform, public ui::ScenicWindowDelegate { public: + using OnPixelScaleUpdateCallback = base::RepeatingCallback<void(float)>; + FrameWindowTreeHost(fuchsia::ui::views::ViewToken view_token, scenic::ViewRefPair view_ref_pair, - content::WebContents* web_contents); + content::WebContents* web_contents, + OnPixelScaleUpdateCallback on_pixel_scale_update); FrameWindowTreeHost(fuchsia::ui::views::ViewCreationToken view_creation_token, scenic::ViewRefPair view_ref_pair, - content::WebContents* web_contents); + content::WebContents* web_contents, + OnPixelScaleUpdateCallback on_pixel_scale_update); ~FrameWindowTreeHost() override; FrameWindowTreeHost(const FrameWindowTreeHost&) = delete; @@ -51,6 +55,7 @@ std::unique_ptr<WindowParentingClientImpl> window_parenting_client_; content::WebContents* const web_contents_; float scenic_pixel_scale_ = 1.0; + OnPixelScaleUpdateCallback on_pixel_scale_update_; }; #endif // FUCHSIA_ENGINE_BROWSER_FRAME_WINDOW_TREE_HOST_H_
diff --git a/gpu/command_buffer/common/activity_flags.cc b/gpu/command_buffer/common/activity_flags.cc index 01e78463..a34118b9 100644 --- a/gpu/command_buffer/common/activity_flags.cc +++ b/gpu/command_buffer/common/activity_flags.cc
@@ -4,19 +4,22 @@ #include "gpu/command_buffer/common/activity_flags.h" +#include "base/memory/shared_memory_mapping.h" +#include "base/memory/unsafe_shared_memory_region.h" + namespace gpu { ActivityFlagsBase::ActivityFlagsBase() = default; ActivityFlagsBase::ActivityFlagsBase(ActivityFlagsBase&& other) = default; ActivityFlagsBase::~ActivityFlagsBase() = default; -void ActivityFlagsBase::Initialize(mojo::ScopedSharedBufferHandle handle) { - handle_ = std::move(handle); - mapping_ = handle_->Map(sizeof(Flag)); +void ActivityFlagsBase::Initialize(base::UnsafeSharedMemoryRegion region) { + region_ = std::move(region); + mapping_ = region_.Map(); } volatile base::subtle::Atomic32* ActivityFlagsBase::AsAtomic() { - return reinterpret_cast<volatile base::subtle::Atomic32*>(mapping_.get()); + return reinterpret_cast<volatile base::subtle::Atomic32*>(mapping_.memory()); } GpuProcessActivityFlags::GpuProcessActivityFlags() = default; @@ -24,13 +27,13 @@ GpuProcessActivityFlags&& other) = default; GpuProcessActivityFlags::GpuProcessActivityFlags( - mojo::ScopedSharedBufferHandle handle) { + base::UnsafeSharedMemoryRegion region) { // In cases where we are running without a GpuProcessHost, we may not // have a valid handle. In this case, just return. - if (!handle.is_valid()) + if (!region.IsValid()) return; - Initialize(std::move(handle)); + Initialize(std::move(region)); } void GpuProcessActivityFlags::SetFlag(Flag flag) { @@ -64,7 +67,7 @@ } GpuProcessHostActivityFlags::GpuProcessHostActivityFlags() { - Initialize(mojo::SharedBufferHandle::Create(sizeof(Flag))); + Initialize(base::UnsafeSharedMemoryRegion::Create(sizeof(Flag))); } bool GpuProcessHostActivityFlags::IsFlagSet(Flag flag) {
diff --git a/gpu/command_buffer/common/activity_flags.h b/gpu/command_buffer/common/activity_flags.h index 9960c461..3a289d1 100644 --- a/gpu/command_buffer/common/activity_flags.h +++ b/gpu/command_buffer/common/activity_flags.h
@@ -7,8 +7,9 @@ #include "base/atomicops.h" #include "base/memory/raw_ptr.h" +#include "base/memory/shared_memory_mapping.h" +#include "base/memory/unsafe_shared_memory_region.h" #include "gpu/gpu_export.h" -#include "mojo/public/cpp/system/buffer.h" namespace gpu { @@ -23,16 +24,16 @@ ActivityFlagsBase(ActivityFlagsBase&& other); ~ActivityFlagsBase(); - void Initialize(mojo::ScopedSharedBufferHandle handle); - const mojo::SharedBufferHandle& handle() const { return handle_.get(); } - bool is_initialized() const { return handle().is_valid(); } + void Initialize(base::UnsafeSharedMemoryRegion region); + const base::UnsafeSharedMemoryRegion& region() const { return region_; } + bool is_initialized() const { return region().IsValid(); } protected: volatile base::subtle::Atomic32* AsAtomic(); private: - mojo::ScopedSharedBufferHandle handle_; - mojo::ScopedSharedBufferMapping mapping_; + base::UnsafeSharedMemoryRegion region_; + base::WritableSharedMemoryMapping mapping_; }; // Provides write-only access to activity flags for the gpu process. Each gpu @@ -58,7 +59,7 @@ GpuProcessActivityFlags(); GpuProcessActivityFlags(GpuProcessActivityFlags&& other); - GpuProcessActivityFlags(mojo::ScopedSharedBufferHandle handle); + explicit GpuProcessActivityFlags(base::UnsafeSharedMemoryRegion region); private: void SetFlag(Flag flag); @@ -74,9 +75,7 @@ GpuProcessHostActivityFlags(); bool IsFlagSet(Flag flag); - mojo::ScopedSharedBufferHandle CloneHandle() { - return handle().Clone(mojo::SharedBufferHandle::AccessMode::READ_WRITE); - } + base::UnsafeSharedMemoryRegion CloneRegion() { return region().Duplicate(); } }; } // namespace gpu
diff --git a/gpu/command_buffer/common/activity_flags_unittest.cc b/gpu/command_buffer/common/activity_flags_unittest.cc index 3fe9308..700093ff 100644 --- a/gpu/command_buffer/common/activity_flags_unittest.cc +++ b/gpu/command_buffer/common/activity_flags_unittest.cc
@@ -4,6 +4,7 @@ #include "gpu/command_buffer/common/activity_flags.h" +#include "base/memory/unsafe_shared_memory_region.h" #include "testing/gtest/include/gtest/gtest.h" namespace gpu { @@ -15,7 +16,7 @@ host_flags.IsFlagSet(ActivityFlagsBase::FLAG_LOADING_PROGRAM_BINARY)); // Create the service activity flags from host memory. - GpuProcessActivityFlags service_flags(host_flags.CloneHandle()); + GpuProcessActivityFlags service_flags(host_flags.CloneRegion()); // Ensure we can set and re-set flags. { @@ -30,8 +31,7 @@ TEST(ActivityFlagsTest, NotInitialized) { // Get the service activity flags without providing host memory. - auto buffer = mojo::ScopedSharedBufferHandle(); - GpuProcessActivityFlags service_flags(std::move(buffer)); + GpuProcessActivityFlags service_flags{base::UnsafeSharedMemoryRegion()}; // Set/Unset should not crash. {
diff --git a/gpu/command_buffer/service/shared_context_state.cc b/gpu/command_buffer/service/shared_context_state.cc index ea2c646..68ab028 100644 --- a/gpu/command_buffer/service/shared_context_state.cc +++ b/gpu/command_buffer/service/shared_context_state.cc
@@ -37,6 +37,7 @@ #include "components/viz/common/gpu/vulkan_context_provider.h" #include "gpu/command_buffer/service/external_semaphore_pool.h" #include "gpu/vulkan/vulkan_device_queue.h" +#include "gpu/vulkan/vulkan_implementation.h" #endif #if BUILDFLAG(IS_FUCHSIA) @@ -473,11 +474,6 @@ MakeCurrent(nullptr); } - bool is_native_vulkan = - gpu_preferences.use_vulkan == gpu::VulkanImplementationName::kNative || - gpu_preferences.use_vulkan == - gpu::VulkanImplementationName::kForcedNative; - bool gl_supports_memory_object = gl::g_current_gl_driver->ext.b_GL_EXT_memory_object_fd || gl::g_current_gl_driver->ext.b_GL_EXT_memory_object_win32 || @@ -486,10 +482,17 @@ gl::g_current_gl_driver->ext.b_GL_EXT_semaphore_fd || gl::g_current_gl_driver->ext.b_GL_EXT_semaphore_win32 || gl::g_current_gl_driver->ext.b_GL_ANGLE_semaphore_fuchsia; + bool vk_supports_external_memory = false; bool vk_supports_external_semaphore = false; + gpu::VulkanImplementationName vulkan_implementation = + gpu::VulkanImplementationName::kNone; #if BUILDFLAG(ENABLE_VULKAN) if (vk_context_provider_) { + vulkan_implementation = + vk_context_provider_->GetVulkanImplementation()->use_swiftshader() + ? gpu::VulkanImplementationName::kSwiftshader + : gpu::VulkanImplementationName::kNative; const auto& extensions = vk_context_provider_->GetDeviceQueue()->enabled_extensions(); #if BUILDFLAG(IS_WIN) @@ -525,10 +528,19 @@ } #endif // BUILDFLAG(ENABLE_VULKAN) - // Swiftshader GL and Vulkan report supporting external objects extensions, - // but they don't. + const bool is_native_vulkan_and_gl = + vulkan_implementation == gpu::VulkanImplementationName::kNative && + !gl::g_current_gl_version->is_swiftshader && + !gl::g_current_gl_version->is_angle_swiftshader; + + // Swiftshader GL reports supporting external objects extensions, but doesn't. + // However, Swiftshader Vulkan and ANGLE can interop using external objects. + const bool is_swiftshader_vulkan_and_gl = + vulkan_implementation == gpu::VulkanImplementationName::kSwiftshader && + gl::g_current_gl_version->is_angle_swiftshader; + support_vulkan_external_object_ = - !gl::g_current_gl_version->is_swiftshader && is_native_vulkan && + (is_native_vulkan_and_gl || is_swiftshader_vulkan_and_gl) && gl_supports_memory_object && gl_supports_semaphore && vk_supports_external_memory && vk_supports_external_semaphore;
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 037d2d3..7800799 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
@@ -275,15 +275,8 @@ (usage & SHARED_IMAGE_USAGE_RASTER))) { return false; } - bool needs_interop_factory = (usage & SHARED_IMAGE_USAGE_WEBGPU) || - (usage & SHARED_IMAGE_USAGE_VIDEO_DECODE); -#if BUILDFLAG(IS_ANDROID) - // Scanout on Android requires explicit fence synchronization which is only - // supported by the interop factory. - needs_interop_factory |= usage & SHARED_IMAGE_USAGE_SCANOUT; -#endif - - if (needs_interop_factory) { + if ((usage & SHARED_IMAGE_USAGE_WEBGPU) || + (usage & SHARED_IMAGE_USAGE_VIDEO_DECODE)) { // return false if it needs interop factory return false; }
diff --git a/gpu/command_buffer/service/shared_image_factory.cc b/gpu/command_buffer/service/shared_image_factory.cc index b7acfd0b..d14ade9 100644 --- a/gpu/command_buffer/service/shared_image_factory.cc +++ b/gpu/command_buffer/service/shared_image_factory.cc
@@ -329,6 +329,7 @@ } #endif // BUILDFLAG(IS_WIN) +#if !BUILDFLAG(IS_ANDROID) if (use_gl) { auto gl_image_backing_factory = std::make_unique<SharedImageBackingFactoryGLImage>( @@ -338,6 +339,7 @@ /*for_shared_memory_gmbs=*/true); factories_.push_back(std::move(gl_image_backing_factory)); } +#endif #if BUILDFLAG(ENABLE_VULKAN) // If Chrome and ANGLE are sharing the same vulkan device queue, AngleVulkan @@ -418,6 +420,7 @@ #endif // BUILDFLAG(IS_CHROMEOS_ASH) #endif // defined(USE_OZONE) +#if !BUILDFLAG(IS_ANDROID) // TODO(hitawala): Temporary factory that will be replaced with Ozone and // other backings if (use_gl) { @@ -429,6 +432,7 @@ /*for_shared_memory_gmbs=*/false); factories_.push_back(std::move(gl_image_backing_factory)); } +#endif } SharedImageFactory::~SharedImageFactory() {
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 7bbe441b..bf50498 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -75001,7 +75001,7 @@ } experiments { key: "remove_src_checkout_experiment" - value: 50 + value: 100 } resultdb { enable: true
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star index 2a2ca785..86ed7aac 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
@@ -175,7 +175,7 @@ main_list_view = "try", tryjob = try_.job(), experiments = { - "remove_src_checkout_experiment": 50, + "remove_src_checkout_experiment": 100, }, )
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb index b28ac7db..02e462c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_af.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -581,6 +581,7 @@ <translation id="6012140227487808125">Enkripteer tans …</translation> <translation id="6021332621416007159">Maak oop in …</translation> <translation id="6027945736510816438">Het jy bedoel <ph name="WEBSITE" />?</translation> +<translation id="6036215966221662377">Maak blaaierdata skoon</translation> <translation id="6036514205982097558">Al jou oortjies in een blaaier</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">Maak toe</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index 8da484b0..68706e10 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -581,6 +581,7 @@ <translation id="6012140227487808125">በመመስጠር ላይ…</translation> <translation id="6021332621416007159">ክፈት በ...</translation> <translation id="6027945736510816438"><ph name="WEBSITE" /> ለማለት ፈልገው ነው?</translation> +<translation id="6036215966221662377">የአሰሳ ውሂብን አጽዳ</translation> <translation id="6036514205982097558">ሁሉም ትሮችዎ በአንድ አሳሽ ውስጥ</translation> <translation id="6039429417015973673"><ph name="TITLE" />፣ <ph name="PUBLISHER_INFORMATION" />፣ <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">ዝጋ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index 637fd3e..2d20388a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">آخر 24 ساعة</translation> <translation id="1285320974508926690">عدم ترجمة هذا الموقع مطلقًا</translation> <translation id="1291506870746876680">بعد مغادرة الموقع الإلكتروني <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" />، ستتم إعادة ضبط أذوناته على وضع الإيقاف.</translation> +<translation id="1312721752506309252">ميزة الحماية المُحسَّنة مفعَّلة.</translation> <translation id="1321993286294231467">حدث خطأ أثناء حفظ الصورة.</translation> <translation id="1322735045095424339">تفرض مؤسستك استخدام "وضع التصفُّح المتخفي".</translation> <translation id="1323735185997015385">حذف</translation> @@ -826,6 +827,7 @@ <translation id="7966516440812255683">يسمح هذا الإجراء للمواقع الإلكترونية باستخدام ملفات تعريف الارتباط لتحسين تجربة التصفُّح، مثل إبقائك مُسجِّلاً الدخول أو تذكُّر عناصر في سلة التسوق. يسمح هذا الإجراء للمواقع الإلكترونية باستخدام ملفات تعريف الارتباط للاطّلاع على نشاط التصفُّح الخاص بك على المواقع الإلكترونية المختلفة، وذلك لتقديم إعلانات مخصَّصة لك مثلاً.</translation> +<translation id="7966904497916178308">ميزة الحماية العادية مفعَّلة.</translation> <translation id="7971521879845308059">حظر النوافذ المنبثقة</translation> <translation id="797413074872316787">للمزامنة والتخصيص على جميع الأجهزة، عليك تفعيل المزامنة.</translation> <translation id="7978018860671536736">3. النقر على AutoFill Passwords (الملء التلقائي لكلمات المرور)</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index 071b2913..59e7cdf 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -581,6 +581,7 @@ <translation id="6012140227487808125">Şifrələnir...</translation> <translation id="6021332621416007159">Burada açın...</translation> <translation id="6027945736510816438"><ph name="WEBSITE" /> nəzərdə tuturdunuz?</translation> +<translation id="6036215966221662377">Axtarış Datasını Silin</translation> <translation id="6036514205982097558">Bütün Tablarınız Bir Brauzerdə</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">Qapat</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb index e7ae2e3..fbf658a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">За апошнія 24 гадзіны</translation> <translation id="1285320974508926690">Ніколі не перакладаць гэты сайт</translation> <translation id="1291506870746876680">Пасля пераходу з сайта <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> яго дазволы будуць скінуты.</translation> +<translation id="1312721752506309252">Палепшаная абарона ўключана</translation> <translation id="1321993286294231467">Памылка пры захаванні фота.</translation> <translation id="1322735045095424339">Ваша арганізацыя патрабуе выкарыстання рэжыму інкогніта</translation> <translation id="1323735185997015385">Выдаліць</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Сайты могуць выкарыстоўваць файлы cookie для паляпшэння сваёй функцыянальнасці: напрыклад, для захавання інфармацыі пра тое, што вы ўвайшлі ва ўліковы запіс, або каб запамінаць тавары ў кошыку. Сайты могуць выкарыстоўваць файлы cookie для адсочвання вашых дзеянняў у браўзеры на розных сайтах, напрыклад, каб персаналізаваць рэкламу.</translation> +<translation id="7966904497916178308">Стандартная абарона ўключана</translation> <translation id="7971521879845308059">Блакіраваць усплывальныя вокны</translation> <translation id="797413074872316787">Каб сінхранізаваць даныя на некалькіх прыладах і персаналізаваць іх, уключыце сінхранізацыю.</translation> <translation id="7978018860671536736">3. Націсніце "Аўтазапаўненне пароляў"</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index f445d7d..8ed05e4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Последните 24 часа</translation> <translation id="1285320974508926690">Този сайт да не се превежда никога</translation> <translation id="1291506870746876680">Разрешенията за сайта <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> ще бъдат изключени, когато го напуснете.</translation> +<translation id="1312721752506309252">Режимът за подобрена защита е включен</translation> <translation id="1321993286294231467">При запазване на изображението възникна грешка.</translation> <translation id="1322735045095424339">Организацията ви изисква да сърфирате в режим „инкогнито“</translation> <translation id="1323735185997015385">Изтриване</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Сайтовете могат да използват „бисквитки“ с цел по-добро сърфиране, например за да оставате в профила си или за да запомнят артикулите в пазарската ви кошница. Сайтовете могат да използват „бисквитки“, за да следят активността ви при сърфиране в различни сайтове, например за да персонализират реклами.</translation> +<translation id="7966904497916178308">Режимът за стандартна защита е включен</translation> <translation id="7971521879845308059">Изск. прозорци: Блокиране</translation> <translation id="797413074872316787">Включете синхронизирането, за да се възползвате от синхронизиране и персонализиране на всички устройства.</translation> <translation id="7978018860671536736">3. Докоснете „Автоматично попълване на паролите“.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index 7787b5ac..e9e9065 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">গত ২৪ ঘণ্টা</translation> <translation id="1285320974508926690">কখনই এই সাইটটিকে অনুবাদ করবেন না</translation> <translation id="1291506870746876680">আপনি এই সাইট বন্ধ করে দিলে, <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> এর সাথে সম্পর্কিত অনুমতি রিসেট হয়ে বন্ধ হয়ে যাবে।</translation> +<translation id="1312721752506309252">"উন্নত সুরক্ষা" ফিচার চালু করা আছে</translation> <translation id="1321993286294231467">ছবি সেভ করার সময় কোনও সমস্যা হয়েছে।</translation> <translation id="1322735045095424339">আপনার সংস্থা আপনাকে 'ছদ্মবেশী মোড' ব্যবহার করতে বলছে</translation> <translation id="1323735185997015385">মুছুন</translation> @@ -581,6 +582,7 @@ <translation id="6012140227487808125">এনক্রিপ্ট হচ্ছে...</translation> <translation id="6021332621416007159">এতে খুলুন...</translation> <translation id="6027945736510816438">আপনি কি <ph name="WEBSITE" /> ডোমেনের কথা বলছেন?</translation> +<translation id="6036215966221662377">ব্রাউজ করা ডেটা মুছে দিন</translation> <translation id="6036514205982097558">আপনার সব ট্যাব একটি ব্রাউজারেই</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">বন্ধ</translation> @@ -826,6 +828,7 @@ <translation id="7966516440812255683">আপনি যাতে সাইন-ইন হয়ে থাকতে পারেন তার ব্যবস্থা করা বা শপিং কার্টে আপনার বেছে নেওয়া আইটেমগুলি মনে রাখার মতো আপনার ব্রাউজিং অভিজ্ঞতা আরও ভাল করার জন্য সাইট কুকি ব্যবহার করতে পারবে। আপনার জন্য পছন্দমতো বিজ্ঞাপন বেছে নেওয়ার মতো বিভিন্ন ওয়েবসাইট জুড়ে আপনার ব্রাউজিং অ্যাক্টিভিটি দেখার জন্য সাইট কুকি ব্যবহার করতে পারবে।</translation> +<translation id="7966904497916178308">'স্ট্যান্ডার্ড সুরক্ষা' ফিচারটি চালু করা আছে</translation> <translation id="7971521879845308059">পপ-আপগুলি অবরুদ্ধ করুন</translation> <translation id="797413074872316787">ডিভাইস জুড়ে সিঙ্ক করতে এবং নিজের মতো সাজিয়ে নিতে সিঙ্ক বিকল্পটি চালু করুন।</translation> <translation id="7978018860671536736">৩. অটোফিল পাসওয়ার্ড বিকল্পে ট্যাপ করুন</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb index 90e45e8..986d650 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Posljednja 24 sata</translation> <translation id="1285320974508926690">Nikada ne prevodi ovu web lokaciju</translation> <translation id="1291506870746876680">Odobrenja za web lokaciju <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> će se vratiti na zadano kada napustite ovu web lokaciju.</translation> +<translation id="1312721752506309252">Poboljšana zaštita je uključena</translation> <translation id="1321993286294231467">Greška prilikom pohranjivanja slike.</translation> <translation id="1322735045095424339">Vaša organizacija zahtijeva anonimni način rada</translation> <translation id="1323735185997015385">Izbriši</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Web lokacije mogu koristiti kolačiće da poboljšaju vaše iskustvo pregledanja, naprimjer, da ostanete prijavljeni ili da stavke u kolicima za kupovinu ostanu sačuvane. Web lokacije mogu koristiti kolačiće da vide vašu aktivnost pregledanja na različitim web lokacijama, naprimjer, radi personaliziranja oglasa.</translation> +<translation id="7966904497916178308">Standardna zaštita je uključena</translation> <translation id="7971521879845308059">Blokiranje skočnih prozora</translation> <translation id="797413074872316787">Uključite sinhronizaciju da vršite sinhronizaciju i personalizaciju na svim uređajima.</translation> <translation id="7978018860671536736">3. Dodirnite Automatsko popunjavanje lozinki</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index 369f4a5b..4911f1e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Posledních 24 hodin</translation> <translation id="1285320974508926690">Tento web nikdy nepřekládat</translation> <translation id="1291506870746876680">Až web <ph name="BEGIN_BOLD" />„<ph name="SITE_NAME" />“<ph name="END_BOLD" /> opustíte, jeho oprávnění se resetují.</translation> +<translation id="1312721752506309252">Je zapnutá vylepšená ochrana</translation> <translation id="1321993286294231467">Při ukládání obrázku došlo k chybě.</translation> <translation id="1322735045095424339">Vaše organizace vyžaduje anonymní režim</translation> <translation id="1323735185997015385">Smazat</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Weby mohou používat soubory cookie ke zlepšování prostředí při prohlížení, například si pomocí nich mohou pamatovat vaše přihlášení a položky v nákupním košíku. Weby pomocí souborů cookie mohou sledovat vaši aktivitu prohlížení na různých webech, například k personalizaci reklam.</translation> +<translation id="7966904497916178308">Je zapnutá standardní ochrana</translation> <translation id="7971521879845308059">Blokování oken</translation> <translation id="797413074872316787">Pokud chcete synchronizovat a přizpůsobit různá zařízení, zapněte synchronizaci.</translation> <translation id="7978018860671536736">3. Klepněte na Automatické vyplnění hesel.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb index 31ccce32..c864117 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">24 awr ddiwethaf</translation> <translation id="1285320974508926690">Peidio byth â chyfieithu'r wefan hon</translation> <translation id="1291506870746876680">Bydd caniatadau <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> yn ailosod i wedi'u diffodd pan fyddwch yn gadael y wefan hon.</translation> +<translation id="1312721752506309252">Mae gwell amddiffyniad wedi'i droi ymlaen</translation> <translation id="1321993286294231467">Bu gwall wrth gadw'r llun.</translation> <translation id="1322735045095424339">Mae eich sefydliad yn gofyn am y Modd Anhysbys</translation> <translation id="1323735185997015385">Dileu</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Gall gwefannau ddefnyddio cwcis i wella'ch profiad pori, er enghraifft, i'ch cadw bod wedi'ch mewngofnodi neu i gofio eitemau yn eich basged siopa. Gall gwefannau ddefnyddio cwcis i weld eich gweithgarwch pori ar draws gwahanol wefannau, er enghraifft, i bersonoleiddio hysbysebion.</translation> +<translation id="7966904497916178308">Mae amddiffyniad safonol wedi'i droi ymlaen</translation> <translation id="7971521879845308059">Rhwystro ffenestri naid</translation> <translation id="797413074872316787">I gysoni a phersonoleiddio ar draws dyfeisiau, trowch gysoni ymlaen.</translation> <translation id="7978018860671536736">3. Tapiwch Awtolenwi Cyfrineiriau</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index e0be2b1..4760350 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">De seneste 24 timer</translation> <translation id="1285320974508926690">Oversæt aldrig dette website</translation> <translation id="1291506870746876680">Tilladelser for <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> nulstilles til deres deaktiverede tilstand, når du forlader dette website.</translation> +<translation id="1312721752506309252">Forbedret beskyttelse er aktiveret</translation> <translation id="1321993286294231467">Billedet kunne ikke gemmes.</translation> <translation id="1322735045095424339">Din organisation kræver inkognitotilstand</translation> <translation id="1323735185997015385">Slet</translation> @@ -580,6 +581,7 @@ <translation id="6012140227487808125">Krypterer...</translation> <translation id="6021332621416007159">Åbn i...</translation> <translation id="6027945736510816438">Mente du <ph name="WEBSITE" />?</translation> +<translation id="6036215966221662377">Ryd browserdata</translation> <translation id="6036514205982097558">Alle dine faner i én browser</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">Luk</translation> @@ -825,6 +827,7 @@ <translation id="7966516440812255683">Websites kan bruge cookies til at forbedre din browseroplevelse ved f.eks. at sørge for, at du forbliver logget ind, eller ved at huske varerne i din kurv. Websites kan bruge cookies til at se din browseraktivitet på forskellige websites for f.eks. at tilpasse annoncer.</translation> +<translation id="7966904497916178308">Standardbeskyttelse er aktiveret</translation> <translation id="7971521879845308059">Bloker pop op-vinduer</translation> <translation id="797413074872316787">Aktivér synkronisering for at synkronisere og tilpasse på alle dine enheder.</translation> <translation id="7978018860671536736">3. Tryk på Autoudfyld adgangskoder</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index 4d1961a6..bc3e0e4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Letzte 24 Stunden</translation> <translation id="1285320974508926690">Diese Website nie übersetzen</translation> <translation id="1291506870746876680">Die Berechtigungen für <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> werden zurückgesetzt und damit deaktiviert, wenn du diese Website verlässt.</translation> +<translation id="1312721752506309252">Erweiterter Schutz ist aktiviert</translation> <translation id="1321993286294231467">Beim Speichern des Bilds ist ein Fehler aufgetreten.</translation> <translation id="1322735045095424339">Deine Organisation verlangt, dass du den Inkognitomodus verwendest</translation> <translation id="1323735185997015385">Löschen</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Websites können Cookies verwenden, um dir das Surfen zu erleichtern; zum Beispiel, damit du angemeldet bleibst oder Artikel in deinem Einkaufswagen gespeichert bleiben. Websites können Cookies verwenden, um deine Browseraktivitäten auf anderen Websites zu sehen und beispielsweise zur Personalisierung von Werbung zu nutzen.</translation> +<translation id="7966904497916178308">Standardschutz ist aktiviert</translation> <translation id="7971521879845308059">Pop-ups blockieren</translation> <translation id="797413074872316787">Aktiviere die Synchronisierung, um geräteübergreifend zu synchronisieren und zu personalisieren.</translation> <translation id="7978018860671536736">3. Tippe auf „Passwörter automatisch ausfüllen“</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index c8f5a8d9..8935612 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Τελευταίες 24 ώρες</translation> <translation id="1285320974508926690">Να μην γίνεται ποτέ μετάφραση αυτού του ιστότοπου</translation> <translation id="1291506870746876680">Οι άδειες για τον ιστότοπο <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> θα απενεργοποιηθούν μόλις αποχωρήσετε από τον ιστότοπο.</translation> +<translation id="1312721752506309252">Η Βελτιωμένη προστασία είναι ενεργή</translation> <translation id="1321993286294231467">Σφάλμα κατά την αποθήκευση εικόνας.</translation> <translation id="1322735045095424339">Ο οργανισμός σας απαιτεί τη χρήση της κατάστασης ανώνυμης περιήγησης</translation> <translation id="1323735185997015385">Διαγραφή</translation> @@ -826,6 +827,7 @@ <translation id="7966516440812255683">Οι ιστότοποι μπορούν να χρησιμοποιούν cookie για να βελτιώσουν την εμπειρία περιήγησής σας, για παράδειγμα, για να παραμείνετε συνδεδεμένοι ή να διατηρηθούν τα προϊόντα στο καλάθι αγορών σας. Οι ιστότοποι μπορούν να χρησιμοποιούν cookie για να βλέπουν τη δραστηριότητα περιήγησής σας σε διαφορετικούς ιστοτόπους, για παράδειγμα, για την εξατομίκευση των διαφημίσεων.</translation> +<translation id="7966904497916178308">Η Βασική προστασία είναι ενεργή.</translation> <translation id="7971521879845308059">Αποκ. αναδυόμ.</translation> <translation id="797413074872316787">Για συγχρονισμό και εξατομίκευση σε διάφορες συσκευές, ενεργοποιήστε τον συγχρονισμό.</translation> <translation id="7978018860671536736">3. Πατήστε Αυτόματη συμπλήρωση κωδικών πρόσβασης</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index 585cd80f..c90565f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -903,6 +903,7 @@ <translation id="8592752150819985187">Auto-fill passwords</translation> <translation id="8605219856220328675">Close tab.</translation> <translation id="8620640915598389714">Edit</translation> +<translation id="8620785403235741379">Select option</translation> <translation id="8626393685701737946">You can change the default site view to desktop in Settings > Content Settings</translation> <translation id="863090005774946393">Your browser is managed by your organisation. Some features may be disabled.</translation> <translation id="8636825310635137004">To get your tabs from your other devices, turn on sync.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb index 5550b07..1a79e8a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Últimas 24 horas</translation> <translation id="1285320974508926690">Nunca traducir este sitio</translation> <translation id="1291506870746876680">Los permisos de <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> se desactivarán cuando abandones este sitio.</translation> +<translation id="1312721752506309252">Se activó la protección mejorada</translation> <translation id="1321993286294231467">Se produjo un error al guardar la imagen.</translation> <translation id="1322735045095424339">Tu organización requiere que utilices el modo Incógnito</translation> <translation id="1323735185997015385">Borrar</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Los sitios pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar artículos en el carrito de compras. También pueden usar cookies para ver la actividad de navegación en diferentes sitios, por ejemplo, con el fin de personalizar anuncios.</translation> +<translation id="7966904497916178308">Se activó la protección estándar</translation> <translation id="7971521879845308059">Bloquear ventanas emergentes</translation> <translation id="797413074872316787">Para sincronizar diferentes dispositivos y personalizar tu experiencia, activa la sincronización.</translation> <translation id="7978018860671536736">3. Presiona Autorrelleno de contraseñas.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index b23b9f8..9c16159 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Últimas 24 horas</translation> <translation id="1285320974508926690">No traducir nunca este sitio</translation> <translation id="1291506870746876680">Los permisos de <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> se desactivarán cuando salgas de este sitio.</translation> +<translation id="1312721752506309252">La protección mejorada está activada</translation> <translation id="1321993286294231467">No se ha podido guardar la imagen.</translation> <translation id="1322735045095424339">Tu organización requiere que uses el modo Incógnito</translation> <translation id="1323735185997015385">Eliminar</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Los sitios pueden usar cookies para mejorar tu experiencia de navegación; por ejemplo, para mantener tu sesión iniciada o recordar los artículos de tu carrito de la compra. Los sitios pueden usar cookies para ver tu actividad de navegación en otros sitios con el objetivo de, por ejemplo, personalizar anuncios.</translation> +<translation id="7966904497916178308">La protección estándar está activada</translation> <translation id="7971521879845308059">Bloquear pop-ups</translation> <translation id="797413074872316787">Activa la sincronización para sincronizar y personalizar todos tus dispositivos.</translation> <translation id="7978018860671536736">3. Toca Autorrellenar contraseñas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index 596fea4..ffceb391 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Viimased 24 tundi</translation> <translation id="1285320974508926690">Ära kunagi seda saiti tõlgi</translation> <translation id="1291506870746876680">Saidi <ph name="BEGIN_BOLD" />„<ph name="SITE_NAME" />“<ph name="END_BOLD" /> load lähtestatakse väljalülitatud olekusse, kui saidilt lahkute.</translation> +<translation id="1312721752506309252">Täiustatud kaitse on sisse lülitatud</translation> <translation id="1321993286294231467">Viga pildi salvestamisel.</translation> <translation id="1322735045095424339">Teie organisatsioon nõuab inkognito režiimi kasutamist</translation> <translation id="1323735185997015385">Kustuta</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Saidid võivad kasutada küpsisefaile teie sirvimiskogemuse täiustamiseks, näiteks selleks, et hoida teid sisselogituna või jätta meelde teie ostukorvis olevad esemed. Saidid saavad küpsisefailide abil eri saitidel teie sirvimistegevust jälgida, näiteks reklaamide isikupärastamiseks.</translation> +<translation id="7966904497916178308">Tavakaitse on sisse lülitatud</translation> <translation id="7971521879845308059">Hüpikute blok.</translation> <translation id="797413074872316787">Seadmete vahel sünkroonimiseks ja isikupärastamiseks lülitage sünkroonimine sisse.</translation> <translation id="7978018860671536736">3. Puudutage valikut AutoFill Passwords</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb index 4150307..45ce7f4d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Azken 24 orduetakoak</translation> <translation id="1285320974508926690">Ez itzuli inoiz webgune hau</translation> <translation id="1291506870746876680"><ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> webgunearen baimenak desaktibatu egingo dira webgunetik irteten zarenean.</translation> +<translation id="1312721752506309252">Babes hobetua dago aktibatuta</translation> <translation id="1321993286294231467">Errore bat gertatu da irudia gordetzean.</translation> <translation id="1322735045095424339">Ezkutuko modua erabiltzeko eskatzen dizu zure erakundeak</translation> <translation id="1323735185997015385">Ezabatu</translation> @@ -580,6 +581,7 @@ <translation id="6012140227487808125">Enkriptatzen…</translation> <translation id="6021332621416007159">Ireki hemen…</translation> <translation id="6027945736510816438"><ph name="WEBSITE" /> esan nahi al zenuen?</translation> +<translation id="6036215966221662377">Garbitu arakatze-datuak</translation> <translation id="6036514205982097558">Fitxa guztiak arakatzaile berean</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" /> (<ph name="PUBLICATION_DATE" />)</translation> <translation id="6040143037577758943">Itxi</translation> @@ -825,6 +827,7 @@ <translation id="7966516440812255683">Webguneek cookieak erabil ditzakete arakatze-zerbitzua hobetzeko; adibidez, saioa hasita mantentzeko edo erosketa-saskiko produktuak gogoratzeko. Webguneek cookieak erabil ditzakete beste webguneetan egiten dituzun arakatze-jarduerak ikusteko, hala nola iragarkiak pertsonalizatzeko.</translation> +<translation id="7966904497916178308">Babes estandarra dago aktibatuta</translation> <translation id="7971521879845308059">Blokeatu leihoak</translation> <translation id="797413074872316787">Gailu guztiak sinkronizatu eta pertsonalizatzeko, aktibatu sinkronizazioa.</translation> <translation id="7978018860671536736">3. Sakatu AutoFill Passwords (pasahitzak automatikoki betetzeko aukera).</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index 0a0b11ac4..3df96f3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -581,6 +581,7 @@ <translation id="6012140227487808125">در حال رمزگذاری…</translation> <translation id="6021332621416007159">بازکردن در...</translation> <translation id="6027945736510816438">منظورتان <ph name="WEBSITE" /> بود؟</translation> +<translation id="6036215966221662377">پاک کردن دادههای مرور</translation> <translation id="6036514205982097558">همه برگههای شما در یک مرورگر</translation> <translation id="6039429417015973673"><ph name="TITLE" />، <ph name="PUBLISHER_INFORMATION" />، <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">بستن</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index 439a80d..5be1db0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Viimeiset 24 tuntia</translation> <translation id="1285320974508926690">Älä käännä tätä sivustoa</translation> <translation id="1291506870746876680">Luvat (<ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" />) nollataan, kun poistut sivustolta.</translation> +<translation id="1312721752506309252">Parannettu suojaus on päällä</translation> <translation id="1321993286294231467">Virhe tallennettaessa kuvaa</translation> <translation id="1322735045095424339">Organisaatiosi edellyttää incognito-tilaa</translation> <translation id="1323735185997015385">Poista</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Sivustot voivat käyttää evästeitä selauskokemuksesi parantamiseen, esimerkiksi pitää sinut kirjautuneena tai muistaa ostoskorisi sisällön. Sivustot voivat nähdä selaustoimintaasi eri sivustoilta evästeiden kautta esim. personoidakseen mainoksia.</translation> +<translation id="7966904497916178308">Perustason suojaus on päällä</translation> <translation id="7971521879845308059">Estä ponn.ikk.</translation> <translation id="797413074872316787">Ota synkronointi käyttöön, niin sisältö synkronoidaan ja personoidaan eri laitteilla.</translation> <translation id="7978018860671536736">3. Valitse Automaattisen täytön salasanat</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index e0e3c83..f9a1150 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -581,6 +581,7 @@ <translation id="6012140227487808125">Ine-encrypt…</translation> <translation id="6021332621416007159">Buksan sa...</translation> <translation id="6027945736510816438">Ang ibig mo bang sabihin ay <ph name="WEBSITE" />?</translation> +<translation id="6036215966221662377">I-clear ang Data sa Pag-browse</translation> <translation id="6036514205982097558">Lahat ng Iyong Tab sa Isang Browser</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">Isara</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb index cf6ac26a..40b31d3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">24 dernières heures</translation> <translation id="1285320974508926690">Ne jamais traduire ce site</translation> <translation id="1291506870746876680">Les autorisations de <ph name="BEGIN_BOLD" />« <ph name="SITE_NAME" /> »<ph name="END_BOLD" />» seront désactivées lorsque vous quitterez ce site.</translation> +<translation id="1312721752506309252">La protection renforcée est activée</translation> <translation id="1321993286294231467">Une erreur s'est produite lors de l'enregistrement de l'image.</translation> <translation id="1322735045095424339">Votre organisation vous demande d'utiliser le mode de navigation privée</translation> <translation id="1323735185997015385">Supprimer</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Les sites peuvent utiliser des témoins afin d'améliorer votre expérience de navigation, par exemple en vous permettant de rester connecté ou en mémorisant des articles de votre panier d'achats. Les sites peuvent utiliser des témoins afin de voir votre activité de navigation sur l'ensemble des différents sites (par exemple, pour personnaliser les annonces).</translation> +<translation id="7966904497916178308">La protection standard est activée</translation> <translation id="7971521879845308059">Bloq fen contex</translation> <translation id="797413074872316787">Pour profiter de la synchronisation et d'une expérience personnalisée sur tous vos appareils, activez la synchronisation.</translation> <translation id="7978018860671536736">3. Touchez Remplir automatiquement les mots de passe</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index 648643b..b138bfb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Dernières 24 heures</translation> <translation id="1285320974508926690">Ne jamais traduire ce site</translation> <translation id="1291506870746876680">Les autorisations du site <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> seront désactivées quand vous le quitterez.</translation> +<translation id="1312721752506309252">La protection renforcée est activée</translation> <translation id="1321993286294231467">Erreur lors de l'enregistrement de l'image.</translation> <translation id="1322735045095424339">Votre organisation exige d'utiliser le mode navigation privée</translation> <translation id="1323735185997015385">Supprimer</translation> @@ -826,6 +827,7 @@ <translation id="7966516440812255683">Les sites peuvent utiliser des cookies pour améliorer votre expérience de navigation (par exemple, pour maintenir votre connexion ou mémoriser les articles de votre panier). Ils peuvent également s'en servir pour voir votre activité de navigation sur l'ensemble des différents sites (par exemple, pour personnaliser les annonces).</translation> +<translation id="7966904497916178308">La protection standard est activée</translation> <translation id="7971521879845308059">Bloquer les pop-ups</translation> <translation id="797413074872316787">Activez la synchronisation pour accéder à vos données et les personnaliser sur tous vos appareils.</translation> <translation id="7978018860671536736">3. Appuyez sur "Saisir automatiquement les mots de passe"</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb index 7c8f057..52a01a2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Últimas 24 horas</translation> <translation id="1285320974508926690">Non traducir nunca este sitio</translation> <translation id="1291506870746876680">Os permisos de <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> volverán desactivarse cando saias deste sitio.</translation> +<translation id="1312721752506309252">A protección mellorada está activada</translation> <translation id="1321993286294231467">Produciuse un erro ao gardar a imaxe.</translation> <translation id="1322735045095424339">A túa organización esixe o uso do modo de incógnito</translation> <translation id="1323735185997015385">Eliminar</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Os sitios poden utilizar cookies para mellorar a túa experiencia de navegación a través de funcións como manter a sesión iniciada ou lembrar artigos da túa cesta da compra. Tamén poden utilizalas para ver a túa actividade de navegación en varios sitios (por exemplo, co fin de personalizar os anuncios).</translation> +<translation id="7966904497916178308">A protección estándar está activada</translation> <translation id="7971521879845308059">Bloq. ventás em.</translation> <translation id="797413074872316787">Para sincronizar e personalizar o contido de todos os teus dispositivos, activa a sincronización.</translation> <translation id="7978018860671536736">3. Toca AutoFill Passwords (Autocompletar contrasinais)</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index 11d94a00..43c8e70 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -581,6 +581,7 @@ <translation id="6012140227487808125">એન્ક્રિપ્ટ કરી રહ્યું છે...</translation> <translation id="6021332621416007159">આમાં ખોલો...</translation> <translation id="6027945736510816438">શું તમારો અર્થ <ph name="WEBSITE" /> હતો?</translation> +<translation id="6036215966221662377">બ્રાઉઝિંગ ડેટા સાફ કરો</translation> <translation id="6036514205982097558">એક જ બ્રાઉઝરમાં તમારી બધી ટૅબ</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">બંધ કરો</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index 2ddab4c..5ab4cb2d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Posljednja 24 sata</translation> <translation id="1285320974508926690">Nikad nemoj prevoditi ovu web-lokaciju</translation> <translation id="1291506870746876680">Dopuštenja <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> vratit će se na isključeno kad napustite ovu web-lokaciju.</translation> +<translation id="1312721752506309252">Uključena je Poboljšana zaštita</translation> <translation id="1321993286294231467">Pogreška pri spremanju slike.</translation> <translation id="1322735045095424339">Vaša organizacija zahtijeva anonimni način.</translation> <translation id="1323735185997015385">Izbriši</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Web-lokacije mogu upotrebljavati kolačiće za poboljšanje vašeg doživljaja pregledavanja, primjerice da biste ostali prijavljeni ili da bi stavke u vašoj košarici ostale zapamćene. Web-lokacije mogu upotrebljavati kolačiće za uvid u vašu aktivnost pregledavanja na različitim web-lokacijama, primjerice radi prilagođavanja oglasa.</translation> +<translation id="7966904497916178308">Uključena je Standardna zaštita</translation> <translation id="7971521879845308059">Blokiraj skočne</translation> <translation id="797413074872316787">Da biste sinkronizirali i prilagodili više uređaja, uključite sinkronizaciju.</translation> <translation id="7978018860671536736">3. Dodirnite Automatsko popunjavanje zaporki</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb index 5cb036a0..8ecb631 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Վերջին 24 ժամվա</translation> <translation id="1285320974508926690">Երբեք չթարգմանել այս կայքը</translation> <translation id="1291506870746876680">Երբ դուրս գաք <ph name="BEGIN_BOLD" />«<ph name="SITE_NAME" />»<ph name="END_BOLD" /> կայքից, դրա բոլոր թույլտվությունները կանջատվեն։</translation> +<translation id="1312721752506309252">Բարելավված պաշտպանությունը միացված է</translation> <translation id="1321993286294231467">Չհաջողվեց պահել պատկերը։</translation> <translation id="1322735045095424339">Կազմակերպության կանոնների համաձայն՝ դուք պետք է օգտագործեք ինկոգնիտո ռեժիմը</translation> <translation id="1323735185997015385">Ջնջել</translation> @@ -580,6 +581,7 @@ <translation id="6012140227487808125">Գաղտնագրում…</translation> <translation id="6021332621416007159">Բացել այս հավելվածում…</translation> <translation id="6027945736510816438">Արդյո՞ք նկատի ունեիք <ph name="WEBSITE" /></translation> +<translation id="6036215966221662377">Ջնջել այցելությունների պատմությունը</translation> <translation id="6036514205982097558">Ձեր բոլոր ներդիրները՝ մեկ դիտարկիչում</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">Փակել</translation> @@ -825,6 +827,7 @@ <translation id="7966516440812255683">Կայքերը կարող են օգտագործել քուքիներ՝ ձեր աշխատանքն ավելի հարմարավետ դարձնելու, օրինակ, ձեր մուտքը հաշիվ հիշելու կամ ձեր ընտրած ապրանքները զամբյուղում պահելու համար։ Կայքերը կարող են օգտագործել քուքիներ՝ դիտարկիչում ձեր գործողությունները տեսնելու համար, օրինակ՝ գովազդի անհատականացման նպատակով։</translation> +<translation id="7966904497916178308">Սովորական պաշտպանությունը միացված է</translation> <translation id="7971521879845308059">Արգելափակել ելնող պատուհանները</translation> <translation id="797413074872316787">Բոլոր սարքերում տվյալները համաժամացնելու և անհատականացնելու համար միացրեք համաժամացումը։</translation> <translation id="7978018860671536736">3. Հպեք «Գաղտնաբառերի ինքնալրացում»։</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index bf23de4..e3f1c1b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">24 Jam Terakhir</translation> <translation id="1285320974508926690">Jangan pernah terjemahkan situs ini</translation> <translation id="1291506870746876680">Izin <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> akan direset ke nonaktif saat Anda menutup situs ini.</translation> +<translation id="1312721752506309252">Perlindungan yang ditingkatkan aktif</translation> <translation id="1321993286294231467">Error saat menyimpan gambar.</translation> <translation id="1322735045095424339">Organisasi Anda mengharuskan mode Samaran</translation> <translation id="1323735185997015385">Hapus</translation> @@ -580,6 +581,7 @@ <translation id="6012140227487808125">Mengenkripsi…</translation> <translation id="6021332621416007159">Buka di...</translation> <translation id="6027945736510816438">Mungkin maksud Anda <ph name="WEBSITE" />?</translation> +<translation id="6036215966221662377">Hapus Data Penjelajahan</translation> <translation id="6036514205982097558">Semua Tab Anda dalam Satu Browser</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">Tutup</translation> @@ -825,6 +827,7 @@ <translation id="7966516440812255683">Situs dapat menggunakan cookie untuk menyempurnakan pengalaman penjelajahan Anda, misalnya untuk membuat Anda tetap login atau untuk mengingat item di keranjang belanja Anda. Situs dapat menggunakan cookie untuk melihat aktivitas penjelajahan Anda di berbagai situs, misalnya untuk mempersonalisasi iklan.</translation> +<translation id="7966904497916178308">Perlindungan standar aktif</translation> <translation id="7971521879845308059">Blokir Pop-up</translation> <translation id="797413074872316787">Untuk menyinkronkan dan mempersonalisasi berbagai perangkat, aktifkan sinkronisasi.</translation> <translation id="7978018860671536736">3. Ketuk AutoFill Passwords</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb index d152c54..dc7a816 100644 --- a/ios/chrome/app/strings/resources/ios_strings_is.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Síðastliðinn sólarhring</translation> <translation id="1285320974508926690">Aldrei þýða þetta vefsvæði</translation> <translation id="1291506870746876680">Heimildir <ph name="BEGIN_BOLD" />„<ph name="SITE_NAME" />“<ph name="END_BOLD" /> verða endurstilltar á „slökkt“ þegar þú yfirgefur vefsvæðið.</translation> +<translation id="1312721752506309252">Kveikt er á aukinni vörn</translation> <translation id="1321993286294231467">Villa kom upp við að vista mynd.</translation> <translation id="1322735045095424339">Fyrirtækið þitt krefst huliðsstillingar</translation> <translation id="1323735185997015385">Eyða</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Vefsvæði geta notað fótspor til að bjóða þér upp á betri vefnotkun, til dæmis að vera áfram skráð(ur) inn eða muna hvað þú setur í innkaupakörfuna. Vefsvæði geta notað fótspor til að sjá vafranotkun þína á mismunandi vefsvæðum, til dæmis til að sérsníða auglýsingar.</translation> +<translation id="7966904497916178308">Kveikt er á hefðbundinni vörn</translation> <translation id="7971521879845308059">Útiloka sprettiglugga</translation> <translation id="797413074872316787">Kveiktu á samstillingu til að hafa allt samstillt og sérsniðið í tækjunum þínum.</translation> <translation id="7978018860671536736">3. Ýttu á „Sjálfvirk útfylling aðgangsorða“</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index 27c7e70..ca3ea04 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">מ-24 השעות האחרונות</translation> <translation id="1285320974508926690">איני רוצה לקבל תרגום של אתר זה</translation> <translation id="1291506870746876680">ההרשאות לאתר <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> יאופסו לאחר היציאה ממנו.</translation> +<translation id="1312721752506309252">מופעלת הגנה משופרת</translation> <translation id="1321993286294231467">קרתה שגיאה בשמירת התמונה.</translation> <translation id="1322735045095424339">מצב אנונימי נדרש על ידי הארגון שלך</translation> <translation id="1323735185997015385">מחיקה</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">אתרים יכולים להשתמש בקובצי cookie כדי לשפר את חוויית הגלישה – למשל כדי למנוע את ניתוקך מהחשבון או כדי לזכור את הפריטים שהוספת לעגלת הקניות. אתרים יכולים להשתמש בקובצי cookie כדי לראות את פעילות הגלישה שלך באתרים שונים, למשל לצורך התאמה אישית של מודעות.</translation> +<translation id="7966904497916178308">מופעלת הגנה רגילה</translation> <translation id="7971521879845308059">חסימת חלונות קופצים</translation> <translation id="797413074872316787">כדי לסנכרן ולהתאים אישית את החוויה במכשירים שונים, צריך להפעיל את הסנכרון.</translation> <translation id="7978018860671536736">3. מקישים על 'מילוי אוטומטי של סיסמאות'</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index ea68aa2d..f221c07 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">ბოლო 24 საათი</translation> <translation id="1285320974508926690">არასდროს გადათარგმნო ეს საიტი</translation> <translation id="1291506870746876680"><ph name="BEGIN_BOLD" />„<ph name="SITE_NAME" />“<ph name="END_BOLD" />-ის ნებართვები გადაყენდება „გამორთულზე“, როცა ამ საიტიდან გახვალთ.</translation> +<translation id="1312721752506309252">გაძლიერებული დაცვა ჩართულია</translation> <translation id="1321993286294231467">სურათის შენახვისას შეცდომა მოხდა.</translation> <translation id="1322735045095424339">თქვენი ორგანიზაცია მოითხოვს ინკოგნიტო რეჟიმის გამოყენებას</translation> <translation id="1323735185997015385">წაშლა</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">საიტებს შეუძლია ქუქი-ჩანაწერების გამოყენება ვების დათვალიერების პროცესის გასაუმჯობესებლად, მაგალითად, სისტემაში შესული მდგომარეობის შესანარჩუნებლად ან საყიდლების კალათაში დამატებული ერთეულების დასამახსოვრებლად. საიტებს შეუძლია ქუქი-ჩანაწერების გამოყენება სხვადასხვა საიტის თქვენ მიერ დათვალიერების აქტივობის სანახავად, მაგალითად, რეკლამის თქვენზე მოსარგებად.</translation> +<translation id="7966904497916178308">სტანდარტული დაცვა ჩართულია</translation> <translation id="7971521879845308059">კონტექსტური ფანჯრების დაბლოკვა</translation> <translation id="797413074872316787">თქვენი ყველა მოწყობილობის სინქრონიზაციისთვისა და პერსონალიზებისთვის ჩართეთ სინქრონიზაცია.</translation> <translation id="7978018860671536736">3. შეხებით აირჩიეთ „პაროლების ავტომატური შევსება“</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index 3711a70..412e335a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Соңғы 24 сағат</translation> <translation id="1285320974508926690">Бұл сайтты ешқашан аудармау</translation> <translation id="1291506870746876680">Сайттан шыққанда, <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> рұқсаттары өшіріледі.</translation> +<translation id="1312721752506309252">Күшейтілген қорғаныс қосулы.</translation> <translation id="1321993286294231467">Сурет сақтау кезінде қате шықты.</translation> <translation id="1322735045095424339">Ұйымыңыз инкогнито режимін талап етеді.</translation> <translation id="1323735185997015385">Жою</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Сайттар шолуды жақсарту (мысалы, аккаунттан шығармау не сатып алу себетіңіздегі нәрселерді есте сақтау) үшін cookie файлдарын пайдалана алады. Сайттар түрлі сайттардағы браузерді қолдану мәліметін көру үшін (мысалы, жарнамаларды жекелендіру мақсатында) cookie файлдарын пайдалана алады.</translation> +<translation id="7966904497916178308">Стандартты қорғаныс қосулы.</translation> <translation id="7971521879845308059">Қалқымалы терезелерге тыйым салу</translation> <translation id="797413074872316787">Барлық құрылғыда синхрондау және жекелендіру үшін синхрондау функциясын қосыңыз.</translation> <translation id="7978018860671536736">3. "Құпия сөздерді автотолтыру" дегенді түртіңіз.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index 06c1346..b0723c5a8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">ಕಳೆದ 24 ಗಂಟೆಗಳು</translation> <translation id="1285320974508926690">ಈ ಸೈಟ್ ಅನ್ನು ಎಂದಿಗೂ ಭಾಷಾಂತರಿಸದಿರಿ</translation> <translation id="1291506870746876680">ನೀವು ಈ ಸೈಟ್ ಅನ್ನು ತೊರೆದಾಗ <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> ಅನುಮತಿಗಳನ್ನು ಆಫ್ಗೆ ರೀಸೆಟ್ ಮಾಡಲಾಗುತ್ತದೆ.</translation> +<translation id="1312721752506309252">ಸುಧಾರಿತ ಸುರಕ್ಷತೆ ಆನ್ ಆಗಿದೆ</translation> <translation id="1321993286294231467">ಚಿತ್ರ ಉಳಿಸುವಾಗ ದೋಷ ಉಂಟಾಗಿದೆ.</translation> <translation id="1322735045095424339">ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನೀತಿಯ ಪ್ರಕಾರ ನೀವು ಅಜ್ಞಾತ ಮೋಡ್ ಬಳಸಬೇಕಾಗುತ್ತದೆ</translation> <translation id="1323735185997015385">ಅಳಿಸಿ</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಅನುಭವವನ್ನು ಸುಧಾರಿಸಲು, ಉದಾಹರಣೆಗೆ, ನಿಮ್ಮನ್ನು ಸೈನ್ ಇನ್ ಆಗಿರಿಸಲು ಅಥವಾ ನಿಮ್ಮ ಶಾಪಿಂಗ್ ಕಾರ್ಟ್ನಲ್ಲಿರುವ ಐಟಂಗಳನ್ನು ನೆನಪಿಟ್ಟುಕೊಳ್ಳಲು ಸೈಟ್ಗಳು ಕುಕೀಗಳನ್ನು ಬಳಸಬಹುದು. ವಿವಿಧ ಸೈಟ್ಗಳಾದ್ಯಂತ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನೋಡಲು, ಉದಾಹರಣೆಗೆ, ಜಾಹೀರಾತುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ಸೈಟ್ಗಳು ಕುಕೀಗಳನ್ನು ಬಳಸಬಹುದು.</translation> +<translation id="7966904497916178308">ಪ್ರಮಾಣಿತ ಸುರಕ್ಷತೆ ಆನ್ ಆಗಿದೆ</translation> <translation id="7971521879845308059">ಪಾಪ್-ಅಪ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation> <translation id="797413074872316787">ಸಾಧನಗಳಾದ್ಯಂತ ಸಿಂಕ್ ಮಾಡಲು ಮತ್ತು ವೈಯಕ್ತೀಕರಿಸಲು, ಸಿಂಕ್ ಆನ್ ಮಾಡಿ.</translation> <translation id="7978018860671536736">3. ಸ್ವಯಂ ಭರ್ತಿ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index ed9da7e..ea1a796 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">24 ຊົ່ວໂມງຜ່ານມາ</translation> <translation id="1285320974508926690">ຢ່າແປເວັບໄຊທ໌ນີ້</translation> <translation id="1291506870746876680">ການອະນຸຍາດ <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> ຈະຖືກຣີເຊັດໄປເປັນປິດເມື່ອທ່ານອອກຈາກເວັບໄຊນີ້.</translation> +<translation id="1312721752506309252">ການປົກປ້ອງທີ່ປັບປຸງດີຂຶ້ນເປີດຢູ່</translation> <translation id="1321993286294231467">ຜິດພາດໃນການບັນທຶກຮູບພາບ.</translation> <translation id="1322735045095424339">ອົງການຂອງທ່ານກຳນົດໃຫ້ໃຊ້ໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ</translation> <translation id="1323735185997015385">ລຶບ</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">ເວັບໄຊສາມາດໃຊ້ຄຸກກີ້ເພື່ອປັບປຸງປະສົບການທ່ອງເວັບຂອງທ່ານ, ຕົວຢ່າງ: ເພື່ອໃຫ້ທ່ານສືບຕໍ່ຢູ່ໃນລະບົບ ຫຼື ຈື່ລາຍການຕ່າງໆໃນກະຕ່າຊື້ເຄື່ອງຂອງທ່ານ. ເວັບໄຊສາມາດໃຊ້ຄຸກກີ້ເພື່ອເບິ່ງການເຄື່ອນໄຫວທ່ອງເວັບຂອງທ່ານໃນທົ່ວເວັບໄຊຕ່າງໆ ເຊັ່ນ: ເພື່ອປັບແຕ່ງໂຄສະນາໃຫ້ເປັນແບບສ່ວນຕົວ.</translation> +<translation id="7966904497916178308">ການປົກປ້ອງມາດຕະຖານເປີດຢູ່</translation> <translation id="7971521879845308059">ບລັອກປັອບອັບ</translation> <translation id="797413074872316787">ເພື່ອຊິ້ງຂໍ້ມູນ ແລະ ປັບແຕ່ງເປັນແບບສ່ວນຕົວຢູ່ອຸປະກອນຕ່າງໆ, ກະລຸນາເປີດການຊິ້ງຂໍ້ມູນກ່ອນ.</translation> <translation id="7978018860671536736">3. ແຕະໃສ່ການຕື່ມຂໍ້ມູນລະຫັດຜ່ານອັດຕະໂນມັດ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index fee5488..359ac91b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Pastarosios 24 valandos</translation> <translation id="1285320974508926690">Niekada neversti šios svetainės</translation> <translation id="1291506870746876680"><ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> leidimai bus iš naujo nustatyti kaip išjungti, kai išeisite iš šios svetainės.</translation> +<translation id="1312721752506309252">Sustiprinta apsauga įjungta</translation> <translation id="1321993286294231467">Klaida išsaugant vaizdą.</translation> <translation id="1322735045095424339">Organizacija reikalauja naudoti inkognito režimą</translation> <translation id="1323735185997015385">Ištrinti</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Svetainės gali naudoti slapukus, kad pagerintų naršymo kokybę, pvz., kad liktumėte prisijungę ar būtų įsimintos pirkinių krepšelyje esančios prekės. Svetainės gali naudoti slapukus, kad sužinotų apie naršymo veiklą skirtingose svetainėse, pvz., kad galėtų suasmeninti skelbimus.</translation> +<translation id="7966904497916178308">Įprasta apsauga įjungta</translation> <translation id="7971521879845308059">Blok. iššok. l.</translation> <translation id="797413074872316787">Kad turinys būtų sinchronizuojamas ir suasmeninamas visuose įrenginiuose, įjunkite sinchronizavimą.</translation> <translation id="7978018860671536736">3. Palieskite „AutoFill Passwords“</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb index faac2d5..06215db5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -580,6 +580,7 @@ <translation id="6012140227487808125">Шифрлэж байна...</translation> <translation id="6021332621416007159">-д нээх...</translation> <translation id="6027945736510816438">Та <ph name="WEBSITE" />-г хэлж байна уу?</translation> +<translation id="6036215966221662377">Интернэтээр үзсэн өгөгдлийг арилгах</translation> <translation id="6036514205982097558">Таны бүх таб нэг хөтчид</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">Хаах</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb index 48957d4f..4cc8375 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -582,6 +582,7 @@ <translation id="6012140227487808125">कूटबद्ध करीत आहे...</translation> <translation id="6021332621416007159">यामध्ये उघडा...</translation> <translation id="6027945736510816438">तुम्हाला <ph name="WEBSITE" /> म्हणायचे आहे का?</translation> +<translation id="6036215966221662377">ब्राउझिंग डेटा साफ करा</translation> <translation id="6036514205982097558">एका ब्राउझरमध्ये तुमचे सर्व टॅब</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">बंद करा</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index b719015..47005cc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">24 Jam Yang Lalu</translation> <translation id="1285320974508926690">Jangan sekali-kali menterjemahkan tapak ini</translation> <translation id="1291506870746876680">Kebenaran <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> akan ditetapkan semula kepada dimatikan apabila anda meninggalkan laman ini.</translation> +<translation id="1312721752506309252">Perlindungan dipertingkat dihidupkan</translation> <translation id="1321993286294231467">Ralat menyimpan imej.</translation> <translation id="1322735045095424339">Organisasi anda menghendaki Mod inkognito digunakan</translation> <translation id="1323735185997015385">Padam</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Tapak boleh menggunakan kuki untuk memperbaik pengalaman penyemakan imbas anda, contohnya, untuk mengekalkan log masuk anda atau untuk mengingati item dalam troli beli-belah anda. Tapak boleh menggunakan kuki untuk melihat aktiviti penyemakan imbas anda merentas tapak lain, contohnya, untuk memperibadikan iklan.</translation> +<translation id="7966904497916178308">Perlindungan standard dihidupkan</translation> <translation id="7971521879845308059">Sekat P/Timbul</translation> <translation id="797413074872316787">Hidupkan penyegerakan untuk melakukan penyegerakan dan pemperibadian pada semua peranti.</translation> <translation id="7978018860671536736">3. Ketik Kata Laluan Autolengkap</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index c037c95..04c7765 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -580,6 +580,7 @@ <translation id="6012140227487808125">လျှို့ဝှက်သည့်အသွင်သို့ ပြောင်းနေသည်…</translation> <translation id="6021332621416007159">...တွင်ဖွင့်မည်</translation> <translation id="6027945736510816438"><ph name="WEBSITE" /> ကို ဆိုလိုသလား။</translation> +<translation id="6036215966221662377">ဖွင့်ကြည့်ထားသည့်မှတ်တမ်းဒေတာကို ရှင်းလင်းမည်</translation> <translation id="6036514205982097558">ဘရောင်ဇာတစ်ခုတည်းရှိ သင်၏တဘ်အားလုံး</translation> <translation id="6039429417015973673"><ph name="TITLE" />၊ <ph name="PUBLISHER_INFORMATION" />၊ <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">ပိတ်ရန်</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb index 1b1f42e3..3345092 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -581,6 +581,7 @@ <translation id="6012140227487808125">इन्क्रिप्सन गर्दै ...</translation> <translation id="6021332621416007159">यसमा खोल्नुहोस्...</translation> <translation id="6027945736510816438">तपाईंले <ph name="WEBSITE" /> लेख्न खोज्नुभएको हो?</translation> +<translation id="6036215966221662377">ब्राउजिङ डेटा मेटाउनुहोस्</translation> <translation id="6036514205982097558">एउटै ब्राउजरमा तपाईंका सबै ट्याबहरू</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">बन्द गर्नुहोस्</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index bb10225..0266c2c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -581,6 +581,7 @@ <translation id="6012140227487808125">Krypterer …</translation> <translation id="6021332621416007159">Åpne i…</translation> <translation id="6027945736510816438">Mente du <ph name="WEBSITE" />?</translation> +<translation id="6036215966221662377">Slett nettleserdata</translation> <translation id="6036514205982097558">Alle fanene dine i én nettleser</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">Lukk</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb index 0f54e82..bb201a1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">ਪਿਛਲੇ 24 ਘੰਟੇ</translation> <translation id="1285320974508926690">ਕਦੇ ਵੀ ਇਸ ਸਾਈਟ ਦਾ ਅਨੁਵਾਦ ਨਾ ਕਰੋ</translation> <translation id="1291506870746876680">ਤੁਹਾਡੇ ਇਸ ਸਾਈਟ ਨੂੰ ਛੱਡਣ 'ਤੇ <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> ਦੀਆ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਬੰਦ 'ਤੇ ਰੀਸੈੱਟ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ।</translation> +<translation id="1312721752506309252">ਵਿਸਤ੍ਰਿਤ ਸੁਰੱਖਿਆ ਚਾਲੂ ਹੈ</translation> <translation id="1321993286294231467">ਚਿੱਤਰ ਨੂੰ ਰੱਖਿਅਤ ਕਰਨ ਵਿੱਚ ਗੜਬੜ ਹੋਈ।</translation> <translation id="1322735045095424339">ਤੁਹਾਡੀ ਸੰਸਥਾ ਨੂੰ ਇਨਕੋਗਨਿਟੋ ਮੋਡ ਦੀ ਲੋੜ ਹੈ</translation> <translation id="1323735185997015385">ਮਿਟਾਓ</translation> @@ -578,6 +579,7 @@ <translation id="6012140227487808125">ਇਨਕ੍ਰਿਪਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…</translation> <translation id="6021332621416007159">ਇਸ ਵਿੱਚ ਖੋਲ੍ਹੋ ...</translation> <translation id="6027945736510816438">ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ <ph name="WEBSITE" /> ਸੀ?</translation> +<translation id="6036215966221662377">ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ ਕਲੀਅਰ ਕਰੋ</translation> <translation id="6036514205982097558">ਇੱਕ ਹੀ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਤੁਹਾਡੀਆਂ ਸਾਰੀਆਂ ਟੈਬਾਂ</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">ਬੰਦ ਕਰੋ</translation> @@ -823,6 +825,7 @@ <translation id="7966516440812255683">ਸਾਈਟਾਂ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਕੁਕੀਜ਼ ਨੂੰ ਵਰਤ ਸਕਦੀਆਂ ਹਨ, ਉਦਾਹਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਸਾਈਨ-ਇਨ ਜਾਂ ਤੁਹਾਡੇ ਖਰੀਦਦਾਰੀ ਕਾਰਟ ਵਿਚਲੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਯਾਦ ਰੱਖਣ ਲਈ। ਸਾਈਟਾਂ ਵੱਖ-ਵੱਖ ਸਾਈਟਾਂ ਵਿਚਲੀ ਤੁਹਾਡੀ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਰਗਰਮੀ ਦੇਖਣ ਲਈ ਕੁਕੀਜ਼ ਨੂੰ ਵਰਤ ਸਕਦੀਆਂ ਹਨ, ਉਦਾਹਰਨ ਲਈ, ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ।</translation> +<translation id="7966904497916178308">ਮਿਆਰੀ ਸੁਰੱਖਿਆ ਚਾਲੂ ਹੈ</translation> <translation id="7971521879845308059">ਪੌਪ-ਅਪਸ ਬਲੌਕ ਕਰੋ</translation> <translation id="797413074872316787">ਡੀਵਾਈਸਾਂ ਵਿਚਾਲੇ ਸਿੰਕ ਕਰਨ ਅਤੇ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ, ਸਿੰਕ ਚਾਲੂ ਕਰੋ।</translation> <translation id="7978018860671536736">3. ਆਟੋਫਿਲ ਪਾਸਵਰਡ 'ਤੇ ਟੈਪ ਕਰੋ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb index afb5b4e7..1235948d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Últimas 24 horas</translation> <translation id="1285320974508926690">Nunca traduzir este site</translation> <translation id="1291506870746876680">As permissões de <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> serão redefinidas como desativadas quando você sair desse site.</translation> +<translation id="1312721752506309252">A Proteção reforçada está ativa</translation> <translation id="1321993286294231467">Erro ao salvar a imagem.</translation> <translation id="1322735045095424339">Sua organização requer o uso do modo de navegação anônima</translation> <translation id="1323735185997015385">Excluir</translation> @@ -826,6 +827,7 @@ <translation id="7966516440812255683">Os sites podem usar cookies para melhorar sua experiência de navegação, como manter sua conta conectada ou se lembrar dos itens em um carrinho de compras. Eles também podem usar cookies para ver sua atividade de navegação em diferentes sites, por exemplo, para personalizar anúncios.</translation> +<translation id="7966904497916178308">A Proteção padrão está ativa</translation> <translation id="7971521879845308059">Bloquear pop-ups</translation> <translation id="797413074872316787">Para sincronizar e personalizar vários dispositivos, ative a sincronização.</translation> <translation id="7978018860671536736">3. Toque em "Preenchimento automático de senhas"</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb index f1bc444..f5f72600 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Últimas 24 horas</translation> <translation id="1285320974508926690">Nunca traduzir este site</translation> <translation id="1291506870746876680">As autorizações de <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> serão repostas para desativadas quando sair deste site.</translation> +<translation id="1312721752506309252">A proteção melhorada está ativada</translation> <translation id="1321993286294231467">Erro ao guardar a imagem.</translation> <translation id="1322735045095424339">A sua entidade requer o Modo de navegação anónima</translation> <translation id="1323735185997015385">Eliminar</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Os sites podem utilizar cookies para melhorar a experiência de navegação, por exemplo, para manter a sua sessão iniciada ou memorizar os artigos no seu carrinho de compras. Os sites podem utilizar cookies para ver a sua atividade de navegação em diferentes sites, por exemplo, para personalizar anúncios.</translation> +<translation id="7966904497916178308">A proteção padrão está ativada</translation> <translation id="7971521879845308059">Bloquear Pop-ups</translation> <translation id="797413074872316787">Para sincronizar e personalizar dados entre dispositivos, ative a sincronização.</translation> <translation id="7978018860671536736">3. Toque em Preenchimento automático de palavras-passe</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index 1a467d8..a0b0ec59 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Последние 24 часа</translation> <translation id="1285320974508926690">Никогда не переводить этот сайт</translation> <translation id="1291506870746876680">Когда вы покинете сайт <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" />, все разрешения для него будут отключены.</translation> +<translation id="1312721752506309252">Улучшенная защита включена</translation> <translation id="1321993286294231467">При сохранении изображения возникла ошибка.</translation> <translation id="1322735045095424339">В вашей организации обязательно использовать режим инкогнито.</translation> <translation id="1323735185997015385">Удалить</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Сайты могут использовать файлы cookie для вашего удобства, например сохранять информацию о товарах в корзине или о том, что вы вошли в аккаунт. Сайты могут использовать файлы cookie, чтобы отслеживать ваши действия в браузере, например для показа персонализированной рекламы.</translation> +<translation id="7966904497916178308">Стандартная защита включена</translation> <translation id="7971521879845308059">Блок. вспл. окна</translation> <translation id="797413074872316787">Чтобы синхронизировать и персонализировать данные на всех устройствах, включите синхронизацию.</translation> <translation id="7978018860671536736">3. Нажмите "Автозаполнение пароля".</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb index 66c755f..c78ef1aa 100644 --- a/ios/chrome/app/strings/resources/ios_strings_si.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">පසුගිය පැය 24</translation> <translation id="1285320974508926690">මෙම අඩවිය කිසිවිට පරිවර්තනය නොකරන්න</translation> <translation id="1291506870746876680"><ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> ඔබ මෙම අඩවියෙන් ඉවත් වූ විට අවසර ක්රියාවිරහිත වෙත යළි සකසනු ඇත.</translation> +<translation id="1312721752506309252">වැඩිදියුණු කළ ආරක්ෂාව ක්රියාත්මකයි</translation> <translation id="1321993286294231467">රූපය සුරැකීමේ දෝෂයකි.</translation> <translation id="1322735045095424339">ඔබගේ සංවිධානයට අප්රසිද්ධ ප්රකාරය අවශ්යයි</translation> <translation id="1323735185997015385">මකන්න</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">ඔබේ බ්රවුස් කිරීමේ අත්දැකීම වැඩිදියුණු කිරීමට, උදාහරණයක් වශයෙන්, ඔබව පුරා තබා ගැනීමට හෝ ඔබේ සාප්පු සවාරි කරත්තයේ අයිතම මතක තබා ගැනීමට වෙබ් අඩවිවලට කුකි භාවිත කළ හැකිය. විවිධ වෙබ් අඩවි හරහා ඔබේ බ්රවුස් කිරීමේ ක්රියාකාරකම් බැලීමට, උදාහරණයක් වශයෙන්, වෙළඳ දැන්වීම් පෞද්ගලීකරණය කිරීමට වෙබ් අඩවිවලට කුකි භාවිත කළ හැකිය.</translation> +<translation id="7966904497916178308">සම්මත ආරක්ෂව ක්රියාත්මකයි</translation> <translation id="7971521879845308059">උත්පතන අවහිර කරන්න</translation> <translation id="797413074872316787">උපාංග හරහා සමමුහුර්ත සහ පෞද්ගලිකකරණය කිරීමට, සමමුහුර්තය ක්රියාත්මක කරන්න.</translation> <translation id="7978018860671536736">3. ස්වයං පිරවුම් මුරපද තට්ටු කරන්න</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index 2c4af99..69ad35eb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Zadnjih 24 ur</translation> <translation id="1285320974508926690">Nikoli ne prevedi tega spletnega mesta</translation> <translation id="1291506870746876680">Dovoljenja za spletno mesto <ph name="BEGIN_BOLD" />»<ph name="SITE_NAME" />«<ph name="END_BOLD" /> bodo ponastavljena na izklopljena, ko zapustite to spletno mesto.</translation> +<translation id="1312721752506309252">Izboljšana zaščita je vklopljena.</translation> <translation id="1321993286294231467">Napaka pri shranjevanju slike.</translation> <translation id="1322735045095424339">Vaša organizacija zahteva anonimni način.</translation> <translation id="1323735185997015385">Izbriši</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Spletna mesta lahko uporabljajo piškotke za izboljšanje izkušnje brskanja, na primer tako, da poskrbijo, da ostanete prijavljeni, ali si zapomnijo izdelke v nakupovalnem vozičku. Spletna mesta lahko uporabljajo piškotke za ogled dejavnosti brskanja na različnih spletnih mestih, na primer za osebno prilagajanje oglasov.</translation> +<translation id="7966904497916178308">Standardna zaščita je vklopljena.</translation> <translation id="7971521879845308059">Blokiraj pojavna okna</translation> <translation id="797413074872316787">Če želite sinhronizirati in prilagajati v vseh napravah, vklopite sinhronizacijo.</translation> <translation id="7978018860671536736">3. Dotaknite se »Samodejno izpolnjevanje gesel«.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb index e6c2344d..9ea4d48d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">24 orët e fundit</translation> <translation id="1285320974508926690">Asnjëherë mos e përkthe këtë sajt</translation> <translation id="1291506870746876680">Lejet e <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> do të rivendosen në joaktive kur të largohesh nga ky sajt.</translation> +<translation id="1312721752506309252">Mbrojtja e përmirësuar është aktive</translation> <translation id="1321993286294231467">Gabim në ruajtjen e imazhit.</translation> <translation id="1322735045095424339">Organizata jote kërkon modalitetin "e fshehtë"</translation> <translation id="1323735185997015385">Fshi</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Sajtet mund t'i përdorin kukit për të përmirësuar përvojën e shfletimit, për shembull për të të mbajtur të identifikuar ose për të kujtuar artikujt në karrocën e blerjeve. Sajtet mund t'i përdorin kukit për të parë aktivitetin tënd të shfletimit nëpër sajte të ndryshme, për shembull për t'i personalizuar reklamat.</translation> +<translation id="7966904497916178308">Mbrojtja standarde është aktive</translation> <translation id="7971521879845308059">Blloko dritaret kërcyese</translation> <translation id="797413074872316787">Për të sinkronizuar dhe personalizuar mes pajisjeve, aktivizo sinkronizimin.</translation> <translation id="7978018860671536736">3. Trokit "Plotëso automatikisht fjalëkalimet"</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb index b0a21f06..6d9b826 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Poslednja 24 sata</translation> <translation id="1285320974508926690">Nikad ne prevodi ovaj sajt</translation> <translation id="1291506870746876680">Dozvole za <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> će se resetovati i isključiti kad napustite ovaj sajt.</translation> +<translation id="1312721752506309252">Poboljšana zaštita je uključena</translation> <translation id="1321993286294231467">Došlo je do greške pri čuvanju slike.</translation> <translation id="1322735045095424339">Organizacija zahteva režim bez arhiviranja</translation> <translation id="1323735185997015385">Izbriši</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Sajtovi mogu da koriste kolačiće za poboljšanje doživljaja pregledanja, na primer, da biste ostali prijavljeni ili da bi stavke u vašoj korpi za kupovinu ostale sačuvane. Sajtovi mogu da koriste kolačiće da bi videli vaše aktivnosti pregledanja na različitim sajtovima, na primer, za personalizaciju oglasa.</translation> +<translation id="7966904497916178308">Standardna zaštita je uključena</translation> <translation id="7971521879845308059">Blokiraj iskačuće prozore</translation> <translation id="797413074872316787">Da biste sinhronizovali i personalizovali sadržaj na uređajima, uključite sinhronizaciju.</translation> <translation id="7978018860671536736">3. Dodirnite Automatski popuni lozinke</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index ffc9c29..eb8f31fc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Последња 24 сата</translation> <translation id="1285320974508926690">Никад не преводи овај сајт</translation> <translation id="1291506870746876680">Дозволе за <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> ће се ресетовати и искључити кад напустите овај сајт.</translation> +<translation id="1312721752506309252">Побољшана заштита је укључена</translation> <translation id="1321993286294231467">Дошло је до грешке при чувању слике.</translation> <translation id="1322735045095424339">Организација захтева режим без архивирања</translation> <translation id="1323735185997015385">Избриши</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Сајтови могу да користе колачиће за побољшање доживљаја прегледања, на пример, да бисте остали пријављени или да би ставке у вашој корпи за куповину остале сачуване. Сајтови могу да користе колачиће да би видели ваше активности прегледања на различитим сајтовима, на пример, за персонализацију огласа.</translation> +<translation id="7966904497916178308">Стандардна заштита је укључена</translation> <translation id="7971521879845308059">Блокирај искачуће прозоре</translation> <translation id="797413074872316787">Да бисте синхронизовали и персонализовали садржај на уређајима, укључите синхронизацију.</translation> <translation id="7978018860671536736">3. Додирните Аутоматски попуни лозинке</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index f55fbbf..277e7233 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Senaste 24 timmarna</translation> <translation id="1285320974508926690">Översätt aldrig den här webbplatsen</translation> <translation id="1291506870746876680">Behörigheterna för <ph name="BEGIN_BOLD" /><ph name="SITE_NAME" /><ph name="END_BOLD" /> inaktiveras igen när du lämnar webbplatsen.</translation> +<translation id="1312721752506309252">Förbättrat skydd är aktiverat</translation> <translation id="1321993286294231467">Ett fel uppstod när bilden skulle sparas.</translation> <translation id="1322735045095424339">Organisationen kräver att du använder inkognitoläge</translation> <translation id="1323735185997015385">Radera</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Webbplatser får förbättra surfupplevelsen med hjälp av cookies, till exempel genom att låta dig förbli inloggad eller spara vad du har lagt till i kundvagnen. Webbplatser får se din webbaktivitet på olika webbplatser med hjälp av cookies och till exempel anpassa annonser.</translation> +<translation id="7966904497916178308">Standardskydd är aktiverat</translation> <translation id="7971521879845308059">Blockera popup-fönster</translation> <translation id="797413074872316787">Aktivera synkronisering om du vill synkronisera och anpassa alla dina enheter.</translation> <translation id="7978018860671536736">3. Tryck på Autofyll lösenord</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index 3104cc4..f6a3ebe 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Saa 24 Zilizopita</translation> <translation id="1285320974508926690">Kamwe usitafsiri tovuti hii</translation> <translation id="1291506870746876680">Ruhusa za <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> zitazimwa utakapoondoka kwenye tovuti hii.</translation> +<translation id="1312721752506309252">Kipengele cha ulinzi ulioboreshwa kimewashwa</translation> <translation id="1321993286294231467">Hitilafu imetokea wakati wa kuhifadhi picha.</translation> <translation id="1322735045095424339">Shirika lako linahitaji utumie hali Fiche</translation> <translation id="1323735185997015385">Futa</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Tovuti zinaweza kutumia vidakuzi ili kuboresha hali yako ya kuvinjari, kwa mfano, ili kufanya ubaki ukiwa umeingia katika akaunti au kukumbuka bidhaa zilizo kwenye kikapu chako cha ununuzi. Tovuti zinaweza kutumia vidakuzi kuona shughuli zako za kuvinjari kwenye tovuti mbalimbali, kwa mfano, kukuonyesha matangazo yanayokufaa zaidi.</translation> +<translation id="7966904497916178308">Kipengele cha ulinzi wa kawaida kimewashwa</translation> <translation id="7971521879845308059">Zuia Ibukizi</translation> <translation id="797413074872316787">Ili usawazishe na uweke mapendeleo kwenye vifaa mbalimbali, washa kipengele cha kusawazisha.</translation> <translation id="7978018860671536736">3. Gusa 'Jaza Manenosiri Kiotomatiki'</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index 9ea8e66..29345bd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -581,6 +581,7 @@ <translation id="6012140227487808125">గుప్తీకరిస్తోంది…</translation> <translation id="6021332621416007159">దీనిలో తెరువు...</translation> <translation id="6027945736510816438">మీరు <ph name="WEBSITE" /> గురించి అడిగారా?</translation> +<translation id="6036215966221662377">బ్రౌజింగ్ డేటాను క్లియర్ చేయండి</translation> <translation id="6036514205982097558">మీ అన్ని ట్యాబ్లు ఒకే బ్రౌజర్లో</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">మూసివేయి</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index edbf444..49c4bf1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Son 24 Saat</translation> <translation id="1285320974508926690">Bu siteyi hiçbir zaman çevirme</translation> <translation id="1291506870746876680">Bu siteden ayrıldığınızda <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> izinleri kapalı ayarına sıfırlanır.</translation> +<translation id="1312721752506309252">Gelişmiş Koruma açık</translation> <translation id="1321993286294231467">Resim kaydetme hatası.</translation> <translation id="1322735045095424339">Kuruluşunuz Gizli modu gerektiriyor</translation> <translation id="1323735185997015385">Sil</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Siteler size daha iyi bir göz atma deneyimi sunmak, örneğin, oturumunuzu açık tutmak veya alışveriş sepetinizdeki ürünleri hatırlamak için çerez kullanabilir. Siteler, örneğin reklamları kişiselleştirmek amacıyla farklı sitelerde tarama etkinliğinizi görmek için çerezler kullanabilir.</translation> +<translation id="7966904497916178308">Standart koruma açık</translation> <translation id="7971521879845308059">Pop-up'ları Engelle</translation> <translation id="797413074872316787">Cihazlar arasında senkronizasyon ve kişiselleştirme yapmak için senkronizasyonu etkinleştirin.</translation> <translation id="7978018860671536736">3. Parolaları Otomatik Doldur seçeneğine dokunun</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index a8502b43..5fa0cd06 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -581,6 +581,7 @@ <translation id="6012140227487808125">مرموز کاری ہو رہی ہے…</translation> <translation id="6021332621416007159">اس میں کھولیں…</translation> <translation id="6027945736510816438">کیا آپ کا مطلب <ph name="WEBSITE" /> ہے؟</translation> +<translation id="6036215966221662377">براؤزنگ ڈیٹا صاف کریں</translation> <translation id="6036514205982097558">ایک ہی براؤزر میں آپ کے سبھی ٹیبز</translation> <translation id="6039429417015973673"><ph name="TITLE" />، <ph name="PUBLISHER_INFORMATION" />، <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">بند کریں</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index 8598181..f4714e3d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">Oxirgi 24 soat</translation> <translation id="1285320974508926690">Bu sayt hech qachon tarjima qilinmasin</translation> <translation id="1291506870746876680">Bu sayt yopilganda <ph name="BEGIN_BOLD" />“<ph name="SITE_NAME" />”<ph name="END_BOLD" /> ruxsatlari asliga qaytariladi.</translation> +<translation id="1312721752506309252">Kengaytirilgan himoya yoniq</translation> <translation id="1321993286294231467">Rasm saqlanmadi.</translation> <translation id="1322735045095424339">Tashkilotingiz Inkognito rejimda ishlashni talab qiladi</translation> <translation id="1323735185997015385">O‘chirish</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">Saytlar sahifalarni kezishingizni yaxshilash, jumladan, kirish axborotingiz yoki xarid qutingizni eslab qolish uchun cookie fayllardan foydalanishi mumkin. Saytlar reklamalarni sizga moslashtirish uchun brauzerdagi faoliyatingizni kuzatishi mumkin</translation> +<translation id="7966904497916178308">Standart himoya yoniq</translation> <translation id="7971521879845308059">Qalqib chiquvchi oynalarni bloklash</translation> <translation id="797413074872316787">Barcha qurilmalarda sinxronlash va o‘zingizga moslash uchun sinxronizatsiyani yoqing.</translation> <translation id="7978018860671536736">3. Parollarni avtomatik kiritish uchun bosing</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index 711af72..cc04dd6c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">24 giờ qua</translation> <translation id="1285320974508926690">Không bao giờ dịch trang web này</translation> <translation id="1291506870746876680">Các quyền của <ph name="BEGIN_BOLD" />"<ph name="SITE_NAME" />"<ph name="END_BOLD" /> sẽ được đặt lại thành tắt khi bạn rời khỏi trang web này.</translation> +<translation id="1312721752506309252">Chế độ Bảo vệ nâng cao đang bật</translation> <translation id="1321993286294231467">Lỗi khi lưu hình ảnh.</translation> <translation id="1322735045095424339">Tổ chức của bạn yêu cầu Chế độ ẩn danh</translation> <translation id="1323735185997015385">Xoá</translation> @@ -580,6 +581,7 @@ <translation id="6012140227487808125">Đang mã hóa...</translation> <translation id="6021332621416007159">Mở trong...</translation> <translation id="6027945736510816438">Ý của bạn là <ph name="WEBSITE" /> phải không?</translation> +<translation id="6036215966221662377">Xoá dữ liệu duyệt web</translation> <translation id="6036514205982097558">Mọi thẻ trong một trình duyệt</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">Đóng</translation> @@ -825,6 +827,7 @@ <translation id="7966516440812255683">Các trang web có thể dùng cookie để cải thiện trải nghiệm duyệt web của bạn, chẳng hạn như để duy trì trạng thái đăng nhập hoặc ghi nhớ những mặt hàng có trong giỏ hàng. Các trang web có thể dùng cookie để giám sát hoạt động duyệt web của bạn trên nhiều trang web, chẳng hạn như để điều chỉnh quảng cáo cho phù hợp với bạn.</translation> +<translation id="7966904497916178308">Chế độ Bảo vệ thông thường đang bật</translation> <translation id="7971521879845308059">Chặn cửa sổ bật lên</translation> <translation id="797413074872316787">Để đồng bộ hóa và cá nhân hóa trên các thiết bị, hãy bật tính năng đồng bộ hóa.</translation> <translation id="7978018860671536736">3. Nhấn vào Tự động điền mật khẩu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb index e1f0c12b..31c3595 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">过去 24 小时</translation> <translation id="1285320974508926690">一律不翻译此网站</translation> <translation id="1291506870746876680">您离开<ph name="BEGIN_BOLD" />“<ph name="SITE_NAME" />”<ph name="END_BOLD" />后,这个网站的权限将重置为停用。</translation> +<translation id="1312721752506309252">增强型保护已开启</translation> <translation id="1321993286294231467">保存图片时出错。</translation> <translation id="1322735045095424339">贵单位要求使用无痕模式</translation> <translation id="1323735185997015385">删除</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">网站可以使用 Cookie 来提升您的浏览体验,例如让您保持登录状态或记住您购物车中的商品。 网站还可以使用 Cookie 查看您在各个不同网站上的浏览活动,以便实现某些功能或目的(例如为您展示个性化广告)。</translation> +<translation id="7966904497916178308">标准保护已开启</translation> <translation id="7971521879845308059">拦截弹出式窗口</translation> <translation id="797413074872316787">若要在您的所有设备上保持同步并获享个性化体验,请开启同步功能。</translation> <translation id="7978018860671536736">3. 点按“自动填充密码”</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index 2ddbe2e..93f8afd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -47,6 +47,7 @@ <translation id="1283524564873030414">過去 24 小時</translation> <translation id="1285320974508926690">一律不翻譯此網站</translation> <translation id="1291506870746876680"><ph name="BEGIN_BOLD" />「<ph name="SITE_NAME" />」<ph name="END_BOLD" />的權限會在你離開該網站後重設為停用。</translation> +<translation id="1312721752506309252">已啟用強化防護功能</translation> <translation id="1321993286294231467">儲存圖片時發生錯誤。</translation> <translation id="1322735045095424339">貴機構規定必須使用無痕模式</translation> <translation id="1323735185997015385">刪除</translation> @@ -825,6 +826,7 @@ <translation id="7966516440812255683">網站可使用 Cookie 改善瀏覽體驗,例如讓你保持登入狀態,或記住購物車中的商品。 網站可使用 Cookie 查看你在各網站的瀏覽活動,並提供個人化廣告等服務。</translation> +<translation id="7966904497916178308">已啟用標準防護功能</translation> <translation id="7971521879845308059">封鎖彈出式視窗</translation> <translation id="797413074872316787">如要在所有裝置上保持同步並享有個人化體驗,請開啟同步功能。</translation> <translation id="7978018860671536736">3. 輕觸 [自動填入密碼]</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb index 69dabf2..433468c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -581,6 +581,7 @@ <translation id="6012140227487808125">Iyabethela...</translation> <translation id="6021332621416007159">Ivula ku...</translation> <translation id="6027945736510816438">Ingabe ubukade uqonde i-<ph name="WEBSITE" />?</translation> +<translation id="6036215966221662377">Sula Idatha Yopheqululo</translation> <translation id="6036514205982097558">Wonke Amathebhu Akho Esipheqululini Esisodwa</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">Vala</translation>
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index a59490c..38d6c470 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -914,6 +914,13 @@ flag_descriptions::kAutofillEnableRankingFormulaDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableRankingFormula)}, + {"autofill-remove-card-expiry-from-downstream-suggestion", + flag_descriptions::kAutofillRemoveCardExpiryFromDownstreamSuggestionName, + flag_descriptions:: + kAutofillRemoveCardExpiryFromDownstreamSuggestionDescription, + flags_ui::kOsIos, + FEATURE_VALUE_TYPE(autofill::features:: + kAutofillRemoveCardExpiryFromDownstreamSuggestion)}, }; bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index 0b03b47..586d8fd 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -67,6 +67,12 @@ const char kAutofillPruneSuggestionsDescription[] = "Further limits the number of suggestions in the Autofill dropdown."; +const char kAutofillRemoveCardExpiryFromDownstreamSuggestionName[] = + "Remove card expiration date from the Autofill card suggestions"; +const char kAutofillRemoveCardExpiryFromDownstreamSuggestionDescription[] = + "When enabled, card expiration date will no longer be displayed in a card " + "suggestion"; + const char kAutofillSaveCardDismissOnNavigationName[] = "Save Card Dismiss on Navigation"; const char kAutofillSaveCardDismissOnNavigationDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index f6e7ffb..efb6cd0a 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -57,6 +57,12 @@ extern const char kAutofillPruneSuggestionsName[]; extern const char kAutofillPruneSuggestionsDescription[]; +// Title and description for the flag to control removing card expiration date +// from the downstream suggestions. +extern const char kAutofillRemoveCardExpiryFromDownstreamSuggestionName[]; +extern const char + kAutofillRemoveCardExpiryFromDownstreamSuggestionDescription[]; + // Title and description for the flag to control dismissing the Save Card // Infobar on Navigation. extern const char kAutofillSaveCardDismissOnNavigationName[];
diff --git a/ios/chrome/browser/https_upgrades/BUILD.gn b/ios/chrome/browser/https_upgrades/BUILD.gn index 48a0756..17b777d 100644 --- a/ios/chrome/browser/https_upgrades/BUILD.gn +++ b/ios/chrome/browser/https_upgrades/BUILD.gn
@@ -20,6 +20,7 @@ "//components/security_interstitials/core", "//ios/chrome/browser:pref_names", "//ios/chrome/browser/browser_state", + "//ios/chrome/browser/content_settings:content_settings", "//ios/chrome/browser/prerender", "//ios/components/security_interstitials", "//ios/components/security_interstitials/https_only_mode", @@ -46,6 +47,7 @@ "//ios/chrome/browser/prerender", "//ios/chrome/browser/prerender:test_support", "//ios/components/security_interstitials/https_only_mode", + "//ios/components/security_interstitials/https_only_mode:test_util", "//ios/web/public", "//ios/web/public/test", "//net",
diff --git a/ios/chrome/browser/https_upgrades/https_only_mode_upgrade_tab_helper.mm b/ios/chrome/browser/https_upgrades/https_only_mode_upgrade_tab_helper.mm index fcb9115..9baaf5fb 100644 --- a/ios/chrome/browser/https_upgrades/https_only_mode_upgrade_tab_helper.mm +++ b/ios/chrome/browser/https_upgrades/https_only_mode_upgrade_tab_helper.mm
@@ -106,7 +106,7 @@ void HttpsOnlyModeUpgradeTabHelper::ClearAllowlistForTesting() { HttpsUpgradeService* service = HttpsUpgradeServiceFactory::GetForBrowserState( web_state()->GetBrowserState()); - service->ClearAllowlist(); + service->ClearAllowlistForTesting(); } bool HttpsOnlyModeUpgradeTabHelper::IsFakeHTTPSForTesting(
diff --git a/ios/chrome/browser/https_upgrades/https_only_mode_upgrade_tab_helper_unittest.mm b/ios/chrome/browser/https_upgrades/https_only_mode_upgrade_tab_helper_unittest.mm index ff5dca8..13e4ea9 100644 --- a/ios/chrome/browser/https_upgrades/https_only_mode_upgrade_tab_helper_unittest.mm +++ b/ios/chrome/browser/https_upgrades/https_only_mode_upgrade_tab_helper_unittest.mm
@@ -16,6 +16,7 @@ #import "ios/chrome/browser/prerender/prerender_service_factory.h" #include "ios/components/security_interstitials/https_only_mode/https_only_mode_container.h" #include "ios/components/security_interstitials/https_only_mode/https_upgrade_service.h" +#include "ios/components/security_interstitials/https_only_mode/https_upgrade_test_util.h" #import "ios/web/public/navigation/web_state_policy_decider.h" #import "ios/web/public/test/fakes/fake_navigation_manager.h" #import "ios/web/public/test/fakes/fake_web_state.h" @@ -31,22 +32,6 @@ return std::make_unique<FakePrerenderService>(); } -class FakeHttpsUpgradeService : public HttpsUpgradeService { - public: - bool IsHttpAllowedForHost(const std::string& host) const override { - return base::Contains(allowed_http_hosts_, host); - } - - void AllowHttpForHost(const std::string& host) override { - allowed_http_hosts_.insert(host); - }; - - void ClearAllowlist() override { allowed_http_hosts_.clear(); } - - private: - std::set<std::string> allowed_http_hosts_; -}; - std::unique_ptr<KeyedService> BuildFakeHttpsUpgradeService( web::BrowserState* context) { return std::make_unique<FakeHttpsUpgradeService>(); @@ -76,7 +61,7 @@ HttpsUpgradeService* service = HttpsUpgradeServiceFactory::GetForBrowserState( web_state_.GetBrowserState()); - service->ClearAllowlist(); + service->ClearAllowlistForTesting(); } // Helper function that calls into WebState::ShouldAllowResponse with the
diff --git a/ios/chrome/browser/https_upgrades/https_upgrade_service_factory.mm b/ios/chrome/browser/https_upgrades/https_upgrade_service_factory.mm index a55da8e0..606c160 100644 --- a/ios/chrome/browser/https_upgrades/https_upgrade_service_factory.mm +++ b/ios/chrome/browser/https_upgrades/https_upgrade_service_factory.mm
@@ -6,6 +6,8 @@ #include "base/no_destructor.h" #include "components/keyed_service/ios/browser_state_dependency_manager.h" +#include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#include "ios/chrome/browser/content_settings/host_content_settings_map_factory.h" #include "ios/web/public/browser_state.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -28,14 +30,17 @@ HttpsUpgradeServiceFactory::HttpsUpgradeServiceFactory() : BrowserStateKeyedServiceFactory( "HttpsUpgradeService", - BrowserStateDependencyManager::GetInstance()) {} + BrowserStateDependencyManager::GetInstance()) { + DependsOn(ios::HostContentSettingsMapFactory::GetInstance()); +} HttpsUpgradeServiceFactory::~HttpsUpgradeServiceFactory() {} std::unique_ptr<KeyedService> HttpsUpgradeServiceFactory::BuildServiceInstanceFor( web::BrowserState* context) const { - return std::make_unique<HttpsUpgradeServiceImpl>(context); + return std::make_unique<HttpsUpgradeServiceImpl>( + ChromeBrowserState::FromBrowserState(context)); } web::BrowserState* HttpsUpgradeServiceFactory::GetBrowserStateToUse(
diff --git a/ios/chrome/browser/https_upgrades/https_upgrade_service_impl.h b/ios/chrome/browser/https_upgrades/https_upgrade_service_impl.h index 25e99cf..7cd4628 100644 --- a/ios/chrome/browser/https_upgrades/https_upgrade_service_impl.h +++ b/ios/chrome/browser/https_upgrades/https_upgrade_service_impl.h
@@ -5,21 +5,21 @@ #ifndef IOS_CHROME_BROWSER_HTTPS_UPGRADES_HTTPS_UPGRADE_SERVICE_IMPL_H_ #define IOS_CHROME_BROWSER_HTTPS_UPGRADES_HTTPS_UPGRADE_SERVICE_IMPL_H_ +#include <memory> #include <set> #include <string> #include "components/keyed_service/core/keyed_service.h" +#include "components/security_interstitials/core/https_only_mode_allowlist.h" #include "ios/components/security_interstitials/https_only_mode/https_upgrade_service.h" -namespace web { -class BrowserState; -} +class ChromeBrowserState; // HttpsUpgradeServiceImpl tracks the allowlist decisions for HTTPS-Only mode. // Decisions are scoped to the host. class HttpsUpgradeServiceImpl : public HttpsUpgradeService { public: - HttpsUpgradeServiceImpl(web::BrowserState* context); + HttpsUpgradeServiceImpl(ChromeBrowserState* context); ~HttpsUpgradeServiceImpl() override; // Returns whether |host| can be loaded over http://. @@ -28,13 +28,12 @@ // Allows future navigations to |host| over http://. void AllowHttpForHost(const std::string& host) override; - void ClearAllowlist() override; + void ClearAllowlistForTesting() override; private: - // Set of allowlisted hostnames. - std::set<std::string> allowed_http_hosts_; - - web::BrowserState* context_; + std::unique_ptr<base::Clock> clock_; + ChromeBrowserState* context_; + security_interstitials::HttpsOnlyModeAllowlist allowlist_; }; #endif // IOS_CHROME_BROWSER_HTTPS_UPGRADES_HTTPS_UPGRADE_SERVICE_IMPL_H_
diff --git a/ios/chrome/browser/https_upgrades/https_upgrade_service_impl.mm b/ios/chrome/browser/https_upgrades/https_upgrade_service_impl.mm index 0d5ec746..2589f9c3 100644 --- a/ios/chrome/browser/https_upgrades/https_upgrade_service_impl.mm +++ b/ios/chrome/browser/https_upgrades/https_upgrade_service_impl.mm
@@ -5,14 +5,27 @@ #import "ios/chrome/browser/https_upgrades/https_upgrade_service_impl.h" #include "base/containers/contains.h" +#include "base/time/default_clock.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" +#include "ios/chrome/browser/content_settings/host_content_settings_map_factory.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif -HttpsUpgradeServiceImpl::HttpsUpgradeServiceImpl(web::BrowserState* context) - : context_(context) { +namespace { +// The default expiration for certificate error and HTTPS-First Mode bypasses is +// one week. +const uint64_t kDeltaDefaultExpirationInSeconds = UINT64_C(604800); +} // namespace + +HttpsUpgradeServiceImpl::HttpsUpgradeServiceImpl(ChromeBrowserState* context) + : clock_(new base::DefaultClock()), + context_(context), + allowlist_( + ios::HostContentSettingsMapFactory::GetForBrowserState(context), + clock_.get(), + base::Seconds(kDeltaDefaultExpirationInSeconds)) { DCHECK(context_); } @@ -20,13 +33,13 @@ bool HttpsUpgradeServiceImpl::IsHttpAllowedForHost( const std::string& host) const { - return base::Contains(allowed_http_hosts_, host); + return allowlist_.IsHttpAllowedForHost(host, context_->IsOffTheRecord()); } void HttpsUpgradeServiceImpl::AllowHttpForHost(const std::string& host) { - allowed_http_hosts_.insert(host); + allowlist_.AllowHttpForHost(host, context_->IsOffTheRecord()); } -void HttpsUpgradeServiceImpl::ClearAllowlist() { - allowed_http_hosts_.clear(); +void HttpsUpgradeServiceImpl::ClearAllowlistForTesting() { + allowlist_.ClearInMemoryAllowlistForTesting(); }
diff --git a/ios/chrome/browser/ui/first_run/first_run_util.h b/ios/chrome/browser/ui/first_run/first_run_util.h index cc4cf3d..2b6d823 100644 --- a/ios/chrome/browser/ui/first_run/first_run_util.h +++ b/ios/chrome/browser/ui/first_run/first_run_util.h
@@ -59,6 +59,6 @@ // Returns whether the browser is managed based on the presence of policy data // in the app configuration. -bool IsApplicationManged(); +bool IsApplicationManaged(); #endif // IOS_CHROME_BROWSER_UI_FIRST_RUN_FIRST_RUN_UTIL_H_
diff --git a/ios/chrome/browser/ui/first_run/first_run_util.mm b/ios/chrome/browser/ui/first_run/first_run_util.mm index 3d692af..7aded230 100644 --- a/ios/chrome/browser/ui/first_run/first_run_util.mm +++ b/ios/chrome/browser/ui/first_run/first_run_util.mm
@@ -177,7 +177,7 @@ }); } -bool IsApplicationManged() { +bool IsApplicationManaged() { return [[[NSUserDefaults standardUserDefaults] dictionaryForKey:kPolicyLoaderIOSConfigurationKey] count] > 0; }
diff --git a/ios/chrome/browser/ui/first_run/first_run_util_unittest.mm b/ios/chrome/browser/ui/first_run/first_run_util_unittest.mm index 9625654..7e78c323 100644 --- a/ios/chrome/browser/ui/first_run/first_run_util_unittest.mm +++ b/ios/chrome/browser/ui/first_run/first_run_util_unittest.mm
@@ -12,29 +12,29 @@ using FirstRunUtilTest = PlatformTest; -// Tests IsApplicationManged() when the kPolicyLoaderIOSConfigurationKey value +// Tests IsApplicationManaged() when the kPolicyLoaderIOSConfigurationKey value // doesn't exist. TEST_F(FirstRunUtilTest, TestBrowserManagedNotExist) { NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults removeObjectForKey:kPolicyLoaderIOSConfigurationKey]; - EXPECT_FALSE(IsApplicationManged()); + EXPECT_FALSE(IsApplicationManaged()); } -// Tests IsApplicationManged() when the kPolicyLoaderIOSConfigurationKey value +// Tests IsApplicationManaged() when the kPolicyLoaderIOSConfigurationKey value // is empty. TEST_F(FirstRunUtilTest, TestBrowserManagedEmpty) { NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:@{} forKey:kPolicyLoaderIOSConfigurationKey]; - EXPECT_FALSE(IsApplicationManged()); + EXPECT_FALSE(IsApplicationManaged()); [userDefaults removeObjectForKey:kPolicyLoaderIOSConfigurationKey]; } -// Tests IsApplicationManged() when the kPolicyLoaderIOSConfigurationKey value +// Tests IsApplicationManaged() when the kPolicyLoaderIOSConfigurationKey value // is not empty. TEST_F(FirstRunUtilTest, TestBrowserManagedWithValue) { NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; NSDictionary* dict = @{@"key" : @"value"}; [userDefaults setObject:dict forKey:kPolicyLoaderIOSConfigurationKey]; - EXPECT_TRUE(IsApplicationManged()); + EXPECT_TRUE(IsApplicationManaged()); [userDefaults removeObjectForKey:kPolicyLoaderIOSConfigurationKey]; }
diff --git a/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm b/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm index 72fc7ea..f87d0e7 100644 --- a/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm +++ b/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm
@@ -248,7 +248,7 @@ _consumer.signinStatus = SigninScreenConsumerSigninStatusDisabled; break; } - self.consumer.isManaged = IsApplicationManged(); + self.consumer.isManaged = IsApplicationManaged(); if (!self.showFREConsent) { self.consumer.screenIntent = SigninScreenConsumerScreenIntentSigninOnly; } else {
diff --git a/ios/chrome/browser/ui/first_run/welcome/welcome_screen_mediator.mm b/ios/chrome/browser/ui/first_run/welcome/welcome_screen_mediator.mm index 46675910..1f9cd4a 100644 --- a/ios/chrome/browser/ui/first_run/welcome/welcome_screen_mediator.mm +++ b/ios/chrome/browser/ui/first_run/welcome/welcome_screen_mediator.mm
@@ -44,7 +44,7 @@ - (void)setConsumer:(id<WelcomeScreenConsumer>)consumer { _consumer = consumer; - self.consumer.isManaged = IsApplicationManged(); + self.consumer.isManaged = IsApplicationManaged(); } @end
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_footer.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_footer.swift index df7c225..f28ca85a 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_footer.swift +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_footer.swift
@@ -11,12 +11,12 @@ @Published public var link: String public init( - name: String, link: String, uiImage: UIImage, accessibilityIdentifier: String, + name: String, link: String, imageName: String, accessibilityIdentifier: String, handler: @escaping () -> Void ) { self.link = link super.init( - name: name, uiImage: uiImage, accessibilityIdentifier: accessibilityIdentifier, + name: name, image: .name(imageName), accessibilityIdentifier: accessibilityIdentifier, enterpriseDisabled: false, handler: handler) }
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_item.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_item.swift index f42dcda3..8596583 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_item.swift +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_item.swift
@@ -6,15 +6,27 @@ /// Represents an item in the overflow menu. @objcMembers public class OverflowMenuItem: NSObject, ObservableObject { + public enum ImageType { + case uiImage(UIImage) + case name(String) + } /// The user-visible name of the item. @Published public var name: String - /// The UIImage used to load the image for SwiftUI. - @Published public var uiImage: UIImage + /// The base data used to load the image for SwiftUI, either a `UImage` or + /// a `String`. + /// Note that SwiftUI has a bug regarding `Image`s generated from `UIImage`s + /// in Dark Mode. The image color will not adjust. + @Published public var storedImage: ImageType /// The SwiftUI `Image` for the action icon. public var image: Image { - return Image(uiImage: uiImage) + switch storedImage { + case .uiImage(let uiImage): + return Image(uiImage: uiImage) + case .name(let name): + return Image(name) + } } /// The accessibility identifier for this item. @@ -27,15 +39,45 @@ @Published public var handler: () -> Void public init( - name: String, uiImage: UIImage, accessibilityIdentifier: String, enterpriseDisabled: Bool, + name: String, image: ImageType, accessibilityIdentifier: String, enterpriseDisabled: Bool, handler: @escaping () -> Void ) { self.name = name - self.uiImage = uiImage + storedImage = image self.accessibilityIdentifier = accessibilityIdentifier self.enterpriseDisabled = enterpriseDisabled self.handler = handler } + + public convenience init( + name: String, uiImage: UIImage, accessibilityIdentifier: String, enterpriseDisabled: Bool, + handler: @escaping () -> Void + ) { + self.init( + name: name, image: .uiImage(uiImage), accessibilityIdentifier: accessibilityIdentifier, + enterpriseDisabled: enterpriseDisabled, handler: handler) + } + + public convenience init( + name: String, imageName: String, accessibilityIdentifier: String, enterpriseDisabled: Bool, + handler: @escaping () -> Void + ) { + self.init( + name: name, image: .name(imageName), accessibilityIdentifier: accessibilityIdentifier, + enterpriseDisabled: enterpriseDisabled, handler: handler) + } + + /// Objective-C-exposed method to change `storedImage`, as Objective-C cannot + /// view enums with stored values. + @objc(setStordUIImage:) public func setStoredImage(uiImage: UIImage) { + storedImage = .uiImage(uiImage) + } + + /// Objective-C-exposed method to change `storedImage`, as Objective-C cannot + /// view enums with stored values. + @objc(setStoredImageName:) public func setStoredImage(name: String) { + storedImage = .name(name) + } } // MARK: - Identifiable
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm index 8fcd9725..266dd106 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm
@@ -171,12 +171,11 @@ handler(); }; - return [[OverflowMenuDestination alloc] - initWithName:name - uiImage:[UIImage imageNamed:imageName] - accessibilityIdentifier:accessibilityID - enterpriseDisabled:NO - handler:handlerWithMetrics]; + return [[OverflowMenuDestination alloc] initWithName:name + imageName:imageName + accessibilityIdentifier:accessibilityID + enterpriseDisabled:NO + handler:handlerWithMetrics]; } OverflowMenuFooter* CreateOverflowMenuManagedFooter(int nameID, @@ -187,7 +186,7 @@ NSString* link = l10n_util::GetNSString(linkID); return [[OverflowMenuFooter alloc] initWithName:name link:link - uiImage:[UIImage imageNamed:imageName] + imageName:imageName accessibilityIdentifier:kTextMenuEnterpriseInfo handler:handler]; } @@ -1136,8 +1135,8 @@ base::SysNSStringToUTF16(domainName)) : l10n_util::GetNSStringF(IDS_IOS_TOOLS_MENU_FOLLOW, base::SysNSStringToUTF16(domainName)); - self.followAction.uiImage = [UIImage - imageNamed:status ? @"popup_menu_unfollow" : @"popup_menu_follow"]; + [self.followAction setStoredImageName:status ? @"popup_menu_unfollow" + : @"popup_menu_follow"]; __weak __typeof(self) weakSelf = self; self.followAction.handler = ^{ RecordAction(status ? UserMetricsAction("MobileMenuUnfollow")
diff --git a/ios/chrome/browser/web/BUILD.gn b/ios/chrome/browser/web/BUILD.gn index 7c043059..8efc16a5 100644 --- a/ios/chrome/browser/web/BUILD.gn +++ b/ios/chrome/browser/web/BUILD.gn
@@ -376,7 +376,9 @@ deps = [ ":constants", "//base", + "//components/content_settings/core/browser", "//components/lookalikes/core", + "//ios/chrome/browser/content_settings", "//ios/chrome/browser/https_upgrades", "//ios/chrome/test/app:test_support", "//ios/components/security_interstitials/https_only_mode",
diff --git a/ios/chrome/browser/web/https_only_mode_app_interface.mm b/ios/chrome/browser/web/https_only_mode_app_interface.mm index 276b861..0ca4359 100644 --- a/ios/chrome/browser/web/https_only_mode_app_interface.mm +++ b/ios/chrome/browser/web/https_only_mode_app_interface.mm
@@ -5,6 +5,8 @@ #import "ios/chrome/browser/web/https_only_mode_app_interface.h" #include "base/time/time.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" +#include "ios/chrome/browser/content_settings/host_content_settings_map_factory.h" #include "ios/chrome/browser/https_upgrades/https_only_mode_upgrade_tab_helper.h" #import "ios/chrome/test/app/chrome_test_util.h" #import "ios/chrome/test/app/tab_test_util.h" @@ -48,6 +50,12 @@ } + (void)clearAllowlist { + // Clear the persistent allowlist. + HostContentSettingsMap::PatternSourcePredicate pattern_filter; + ios::HostContentSettingsMapFactory::GetForBrowserState( + chrome_test_util::GetOriginalBrowserState()) + ->ClearSettingsForOneType(ContentSettingsType::HTTP_ALLOWED); + // Clear the temporary allowlist for incognito. web::WebState* web_state = chrome_test_util::GetCurrentWebState(); HttpsOnlyModeUpgradeTabHelper::FromWebState(web_state) ->ClearAllowlistForTesting();
diff --git a/ios/chrome/browser/web/https_only_mode_egtest.mm b/ios/chrome/browser/web/https_only_mode_egtest.mm index 7c375e2..8b22c2e 100644 --- a/ios/chrome/browser/web/https_only_mode_egtest.mm +++ b/ios/chrome/browser/web/https_only_mode_egtest.mm
@@ -518,8 +518,17 @@ GREYAssert(![HttpsOnlyModeAppInterface isTimerRunning], @"Timer is still running"); - // Allowlist decisions shouldn't carry over to incognito. Open an incognito - // tab and try there. + // Open a new tab and go to the same URL. Should load the page without an + // interstitial. + [ChromeEarlGrey openNewTab]; + [ChromeEarlGrey loadURL:testURL]; + [ChromeEarlGrey waitForWebStateContainingText:"HTTP_RESPONSE"]; + GREYAssert(![HttpsOnlyModeAppInterface isTimerRunning], + @"Timer is still running"); + [self assertFailedUpgrade:1]; + + // Open an incognito tab and try there. Should show the interstitial as + // allowlist decisions don't carry over to incognito. [ChromeEarlGrey openNewIncognitoTab]; [ChromeEarlGrey loadURL:testURL]; [ChromeEarlGrey @@ -533,8 +542,11 @@ // Reload. Since the URL is now allowlisted, this should immediately load // HTTP without trying to upgrade. - [ChromeEarlGrey reload]; + [ChromeEarlGreyUI reload]; [ChromeEarlGrey waitForWebStateContainingText:"HTTP_RESPONSE"]; + + // TODO(crbug.com/1302509): Clear the browsing data. This should clear all + // allowlist decisions. } // Same as testUpgrade_BadHTTPS_ProceedInterstitial_Allowlisted but uses
diff --git a/ios/chrome/test/wpt/tools/run_cwt_chromedriver.py b/ios/chrome/test/wpt/tools/run_cwt_chromedriver.py index ece697f..8061822 100755 --- a/ios/chrome/test/wpt/tools/run_cwt_chromedriver.py +++ b/ios/chrome/test/wpt/tools/run_cwt_chromedriver.py
@@ -19,6 +19,7 @@ sys.path.append(os.path.join(GetIosDir(), 'build', 'bots', 'scripts')) +import constants import iossim_util import test_apps import xcodebuild_runner @@ -64,6 +65,7 @@ host_app_path=host_app, inserted_libs=inserted_libs) launch_command = xcodebuild_runner.LaunchCommand(egtests_app, destination, - shards=1, retries=1, out_dir=output_directory) + shards=1, retries=1, readline_timeout=constants.READLINE_TIMEOUT, + out_dir=output_directory) launch_command.launch()
diff --git a/ios/components/security_interstitials/https_only_mode/BUILD.gn b/ios/components/security_interstitials/https_only_mode/BUILD.gn index ef1bf293..080e7c7 100644 --- a/ios/components/security_interstitials/https_only_mode/BUILD.gn +++ b/ios/components/security_interstitials/https_only_mode/BUILD.gn
@@ -36,12 +36,24 @@ deps = [ "//base" ] } +source_set("test_util") { + sources = [ + "https_upgrade_test_util.cc", + "https_upgrade_test_util.h", + ] + deps = [ + ":https_only_mode", + "//base", + ] +} + source_set("unit_tests") { configs += [ "//build/config/compiler:enable_arc" ] testonly = true sources = [ "https_only_mode_blocking_page_unittest.mm" ] deps = [ ":https_only_mode", + ":test_util", "//base/test:test_support", "//components/security_interstitials/core", "//ios/web/public",
diff --git a/ios/components/security_interstitials/https_only_mode/https_only_mode_blocking_page_unittest.mm b/ios/components/security_interstitials/https_only_mode/https_only_mode_blocking_page_unittest.mm index 3aade014..d4ae261 100644 --- a/ios/components/security_interstitials/https_only_mode/https_only_mode_blocking_page_unittest.mm +++ b/ios/components/security_interstitials/https_only_mode/https_only_mode_blocking_page_unittest.mm
@@ -14,6 +14,7 @@ #include "components/security_interstitials/core/metrics_helper.h" #include "ios/components/security_interstitials/https_only_mode/https_only_mode_controller_client.h" #include "ios/components/security_interstitials/https_only_mode/https_upgrade_service.h" +#include "ios/components/security_interstitials/https_only_mode/https_upgrade_test_util.h" #import "ios/web/public/navigation/navigation_item.h" #import "ios/web/public/test/fakes/fake_navigation_manager.h" #import "ios/web/public/test/fakes/fake_web_state.h" @@ -59,22 +60,6 @@ } // namespace -class FakeHttpsUpgradeService : public HttpsUpgradeService { - public: - bool IsHttpAllowedForHost(const std::string& host) const override { - return base::Contains(allowed_http_hosts_, host); - } - - void AllowHttpForHost(const std::string& host) override { - allowed_http_hosts_.insert(host); - }; - - void ClearAllowlist() override { allowed_http_hosts_.clear(); } - - private: - std::set<std::string> allowed_http_hosts_; -}; - // Test fixture for HttpsOnlyModeBlockingPage. class HttpsOnlyModeBlockingPageTest : public PlatformTest { public:
diff --git a/ios/components/security_interstitials/https_only_mode/https_upgrade_service.h b/ios/components/security_interstitials/https_only_mode/https_upgrade_service.h index 23810bb..afd6ec099 100644 --- a/ios/components/security_interstitials/https_only_mode/https_upgrade_service.h +++ b/ios/components/security_interstitials/https_only_mode/https_upgrade_service.h
@@ -18,7 +18,8 @@ // Allows future navigations to |host| over http://. virtual void AllowHttpForHost(const std::string& host) = 0; - virtual void ClearAllowlist() = 0; + // Clears persistent and non-persistent allowlist decisions. + virtual void ClearAllowlistForTesting() = 0; }; #endif // IOS_COMPONENTS_SECURITY_INTERSTITIALS_HTTPS_ONLY_MODE_HTTPS_UPGRADE_SERVICE_H_
diff --git a/ios/components/security_interstitials/https_only_mode/https_upgrade_test_util.cc b/ios/components/security_interstitials/https_only_mode/https_upgrade_test_util.cc new file mode 100644 index 0000000..0b8993d --- /dev/null +++ b/ios/components/security_interstitials/https_only_mode/https_upgrade_test_util.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 "ios/components/security_interstitials/https_only_mode/https_upgrade_test_util.h" +#include "base/containers/contains.h" + +FakeHttpsUpgradeService::FakeHttpsUpgradeService() = default; +FakeHttpsUpgradeService::~FakeHttpsUpgradeService() = default; + +bool FakeHttpsUpgradeService::IsHttpAllowedForHost( + const std::string& host) const { + return base::Contains(allowed_http_hosts_, host); +} + +void FakeHttpsUpgradeService::AllowHttpForHost(const std::string& host) { + allowed_http_hosts_.insert(host); +}; + +void FakeHttpsUpgradeService::ClearAllowlistForTesting() { + allowed_http_hosts_.clear(); +} \ No newline at end of file
diff --git a/ios/components/security_interstitials/https_only_mode/https_upgrade_test_util.h b/ios/components/security_interstitials/https_only_mode/https_upgrade_test_util.h new file mode 100644 index 0000000..0418120 --- /dev/null +++ b/ios/components/security_interstitials/https_only_mode/https_upgrade_test_util.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 IOS_COMPONENTS_SECURITY_INTERSTITIALS_HTTPS_ONLY_MODE_HTTPS_UPGRADE_TEST_UTIL_H_ +#define IOS_COMPONENTS_SECURITY_INTERSTITIALS_HTTPS_ONLY_MODE_HTTPS_UPGRADE_TEST_UTIL_H_ + +#include <set> +#include <string> +#include "ios/components/security_interstitials/https_only_mode/https_upgrade_service.h" + +// Fake service that stores allowlist decisions in memory. +class FakeHttpsUpgradeService : public HttpsUpgradeService { + public: + FakeHttpsUpgradeService(); + ~FakeHttpsUpgradeService() override; + + // HttpsUpgradeService methods: + bool IsHttpAllowedForHost(const std::string& host) const override; + void AllowHttpForHost(const std::string& host) override; + void ClearAllowlistForTesting() override; + + private: + std::set<std::string> allowed_http_hosts_; +}; + +#endif // IOS_COMPONENTS_SECURITY_INTERSTITIALS_HTTPS_ONLY_MODE_HTTPS_UPGRADE_TEST_UTIL_H_
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index 8db3277..87aed522 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -d1fc6aa3308eb5bfd5d93a8486e44269d5c2c9d4 \ No newline at end of file +621b47b69cc3e4b97bed548ae35a52ee5e9a16c4 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index 6b426d9..787eb2c 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -0b7695d1f19a2dfa7a12b0c5d511fafbdf51cc62 \ No newline at end of file +bcfc0404759dad80c548736bd71d18ee7a2d29c1 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index 697f8be9..0256c01d 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -1f78b24fd2d2e6c88f7666468070445bb7519f07 \ No newline at end of file +84c8a76a223e0bfe4daf48d5666ad1e92c34c8ea \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index 378d51e..c785b3d0 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -eae37b18f0cf8ab6f5725671c422094b6d161a6b \ No newline at end of file +c693cfadca00822192e2e417f472b1e16585c769 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 index 0d3aa79..2f6d5c8 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -21847acfbd519316d26667c7572b4496d6b61b6b \ No newline at end of file +4aeac54558d3688aaf19ab9dfe5a497d110137ad \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 index 1a32f13..9c0b1858 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -b78e2c0f1a1bb7fbb8da4d0d08104a5c124fe854 \ No newline at end of file +9907d6723b83c926a37ee11436183d61cd50fb4d \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index d0dd5531..e5bf0e73 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -7a9e50bbb45adccdf1f77f4ad3775d09bf078111 \ No newline at end of file +a4aa6cadea5109360de8429458796ba783d4ba77 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index b76608e..35fcfb2 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -8a4997952bccf4a9372e45f32cec5feaf889b847 \ No newline at end of file +27112d05f6d7ded43a6659c844eee9b41a9a783a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index e4b19b5..428d466f 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -93054abedc3d3b47a16b529bf6705042712397e6 \ No newline at end of file +56c2d355d595c7ff1a2cc943494b25ab2df93617 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index 75078ac..51372b2 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -72477b801958607ecd7e695bf5ff4861f69addc2 \ No newline at end of file +ed3cbe64beafd6ce2389a896b3abac058132a164 \ No newline at end of file
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index 1559ee3..0c8b45e 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc
@@ -252,12 +252,6 @@ namespace media { -#if BUILDFLAG(ENABLE_PLATFORM_HEVC) && BUILDFLAG(IS_ANDROID) -// Enables android HW decoding of HEVC content. -const base::Feature kMediaCodecHEVC{"MediaCodecHEVC", - base::FEATURE_DISABLED_BY_DEFAULT}; -#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) && BUILDFLAG(IS_ANDROID) - // Prefer FFmpeg to LibVPX for Vp8 decoding with opaque alpha mode. const base::Feature kFFmpegDecodeOpaqueVP8{"FFmpegDecodeOpaqueVP8", base::FEATURE_ENABLED_BY_DEFAULT}; @@ -280,6 +274,15 @@ #endif }; +#if BUILDFLAG(ENABLE_PLATFORM_HEVC) && \ + (BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || \ + BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)) +// Enables HEVC hardware accelerated decoding. +const base::Feature kPlatformHEVCDecoderSupport{ + "PlatformHEVCDecoderSupport", base::FEATURE_DISABLED_BY_DEFAULT}; +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) && (IS_ANDROID || IS_WIN || IS_CROS + // || IS_MAC || IS_LINUX) + // Only decode preload=metadata elements upon visibility. // TODO(crbug.com/879406): Remove this after M76 ships to stable const base::Feature kPreloadMetadataLazyLoad{"PreloadMetadataLazyLoad", @@ -800,12 +803,6 @@ #endif // BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION) #if BUILDFLAG(IS_MAC) - -#if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) -const base::Feature kVideoToolboxHEVCDecoding{ - "VideoToolboxHEVCDecoding", base::FEATURE_DISABLED_BY_DEFAULT}; -#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) - // Enable binding multiple shared images to a single GpuMemoryBuffer for // accelerated video decode using VideoToolbox. const base::Feature kMultiPlaneVideoToolboxSharedImages{ @@ -871,10 +868,6 @@ const base::Feature MEDIA_EXPORT kWasapiRawAudioCapture{ "WASAPIRawAudioCapture", base::FEATURE_ENABLED_BY_DEFAULT}; -// Enables HEVC hardware accelerated decoding. -const base::Feature kD3D11HEVCDecoding{"D3D11HEVCDecoding", - base::FEATURE_DISABLED_BY_DEFAULT}; - // Enable VP9 kSVC decoding with HW decoder for webrtc use case on Windows. const base::Feature kD3D11Vp9kSVCHWDecoding{"D3D11Vp9kSVCHWDecoding", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/media/base/media_switches.h b/media/base/media_switches.h index e06826d..754bf03 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h
@@ -161,9 +161,6 @@ MEDIA_EXPORT extern const base::Feature kMediaCapabilitiesQueryGpuFactories; MEDIA_EXPORT extern const base::Feature kMediaCapabilitiesWithParameters; MEDIA_EXPORT extern const base::Feature kMediaCastOverlayButton; -#if BUILDFLAG(ENABLE_PLATFORM_HEVC) && BUILDFLAG(IS_ANDROID) -MEDIA_EXPORT extern const base::Feature kMediaCodecHEVC; -#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) && BUILDFLAG(IS_ANDROID) MEDIA_EXPORT extern const base::Feature kMediaEngagementBypassAutoplayPolicies; MEDIA_EXPORT extern const base::Feature kMediaEngagementHTTPSOnly; MEDIA_EXPORT extern const base::Feature kMediaLearningExperiment; @@ -177,6 +174,12 @@ MEDIA_EXPORT extern const base::Feature kOverlayFullscreenVideo; MEDIA_EXPORT extern const base::Feature kPictureInPicture; MEDIA_EXPORT extern const base::Feature kPlatformAudioEncoder; +#if BUILDFLAG(ENABLE_PLATFORM_HEVC) && \ + (BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || \ + BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)) +MEDIA_EXPORT extern const base::Feature kPlatformHEVCDecoderSupport; +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) && (IS_ANDROID || IS_WIN || IS_CROS + // || IS_MAC || IS_LINUX) MEDIA_EXPORT extern const base::Feature kPlaybackSpeedButton; MEDIA_EXPORT extern const base::Feature kPreloadMediaEngagementData; MEDIA_EXPORT extern const base::Feature kPreloadMetadataLazyLoad; @@ -249,9 +252,6 @@ #endif // BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION) #if BUILDFLAG(IS_MAC) -#if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) -MEDIA_EXPORT extern const base::Feature kVideoToolboxHEVCDecoding; -#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) MEDIA_EXPORT extern const base::Feature kMultiPlaneVideoToolboxSharedImages; #endif // BUILDFLAG(IS_MAC) @@ -277,7 +277,6 @@ MEDIA_EXPORT extern const base::Feature kMediaFoundationClearPlayback; MEDIA_EXPORT extern const base::Feature kAllowMediaFoundationFrameServerMode; MEDIA_EXPORT extern const base::Feature kWasapiRawAudioCapture; -MEDIA_EXPORT extern const base::Feature kD3D11HEVCDecoding; MEDIA_EXPORT extern const base::Feature kD3D11Vp9kSVCHWDecoding; // Strategy affecting how Media Foundation Renderer determines its rendering
diff --git a/media/base/supported_types.cc b/media/base/supported_types.cc index 15e3376..e6b9a1cd 100644 --- a/media/base/supported_types.cc +++ b/media/base/supported_types.cc
@@ -209,7 +209,7 @@ return GetSupplementalProfileCache()->IsProfileSupported(type.profile); #elif BUILDFLAG(IS_MAC) if (__builtin_available(macOS 11.0, *)) - return base::FeatureList::IsEnabled(kVideoToolboxHEVCDecoding) && + return base::FeatureList::IsEnabled(kPlatformHEVCDecoderSupport) && (type.profile == HEVCPROFILE_MAIN || type.profile == HEVCPROFILE_MAIN10 || type.profile == HEVCPROFILE_MAIN_STILL_PICTURE || @@ -219,7 +219,7 @@ // Technically android 5.0 mandates support for only HEVC main profile, // however some platforms (like chromecast) have had more profiles supported // so we'll see what happens if we just enable them all. - return base::FeatureList::IsEnabled(kMediaCodecHEVC); + return base::FeatureList::IsEnabled(kPlatformHEVCDecoderSupport); #else return true; #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
diff --git a/media/base/video_util.h b/media/base/video_util.h index 5e09b2c..c451a57a 100644 --- a/media/base/video_util.h +++ b/media/base/video_util.h
@@ -84,6 +84,9 @@ // have color distortions around the edges in a letterboxed video frame. Note // that, in cases where ComputeLetterboxRegion() would return a 1x1-sized Rect, // this function could return either a 0x0-sized Rect or a 2x2-sized Rect. +// Note that calling this function with `bounds` that already have the aspect +// ratio of `content` is not guaranteed to be a no-op (for context, see +// https://crbug.com/1323367). MEDIA_EXPORT gfx::Rect ComputeLetterboxRegionForI420(const gfx::Rect& bounds, const gfx::Size& content);
diff --git a/media/capabilities/webrtc_video_stats_db_impl.h b/media/capabilities/webrtc_video_stats_db_impl.h index ac9b2e1..3506905 100644 --- a/media/capabilities/webrtc_video_stats_db_impl.h +++ b/media/capabilities/webrtc_video_stats_db_impl.h
@@ -60,7 +60,9 @@ void ClearStats(base::OnceClosure clear_done_cb) override; private: + // Test classes are friends, see comment below. friend class WebrtcVideoStatsDBImplTest; + friend class WebrtcVideoPerfLPMFuzzerHelper; using PendingOpId = int;
diff --git a/media/capture/video/DEPS b/media/capture/video/DEPS index aa779c9..267cdf3 100644 --- a/media/capture/video/DEPS +++ b/media/capture/video/DEPS
@@ -1,4 +1,5 @@ include_rules = [ + "+ash/constants/ash_features.h", "+chromeos/dbus", "+components/device_event_log", "+mojo/public/cpp",
diff --git a/media/capture/video/video_capture_buffer_pool_util.cc b/media/capture/video/video_capture_buffer_pool_util.cc index ed0a3089..26363105 100644 --- a/media/capture/video/video_capture_buffer_pool_util.cc +++ b/media/capture/video/video_capture_buffer_pool_util.cc
@@ -8,6 +8,10 @@ #include "build/chromeos_buildflags.h" #include "media/capture/capture_switches.h" +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "ash/constants/ash_features.h" +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + namespace media { int DeviceVideoCaptureMaxBufferPoolSize() { @@ -26,7 +30,16 @@ // here to take into account the delay caused by the consumer (e.g. display or // video encoder). if (switches::IsVideoCaptureUseGpuMemoryBufferEnabled()) { - max_buffer_count = 36; + if (base::FeatureList::IsEnabled( + chromeos::features::kMoreVideoCaptureBuffers)) { + // Some devices might need more buffers to enable advanced features and + // might report pipeline depth as 8 for preview, 8 for video snapshot and + // 36 for recording. And some extra buffers are needed for the possible + // delay of display and video encoder, and also a few for spare usage. + max_buffer_count = 76; + } else { + max_buffer_count = 36; + } } #elif BUILDFLAG(IS_WIN) // On Windows, for GMB backed zero-copy more buffers are needed because it's
diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc index 4e3918a..feca618 100644 --- a/media/ffmpeg/ffmpeg_common.cc +++ b/media/ffmpeg/ffmpeg_common.cc
@@ -526,6 +526,14 @@ // TODO(chcunningham): We need real profiles for all of the codecs below to // actually handle capabilities requests correctly. http://crbug.com/784610 VideoCodecProfile profile = VIDEO_CODEC_PROFILE_UNKNOWN; + + // Prefer the color space found by libavcodec if available + VideoColorSpace color_space = + VideoColorSpace(codec_context->color_primaries, codec_context->color_trc, + codec_context->colorspace, + codec_context->color_range == AVCOL_RANGE_JPEG + ? gfx::ColorSpace::RangeID::FULL + : gfx::ColorSpace::RangeID::LIMITED); switch (codec) { #if BUILDFLAG(USE_PROPRIETARY_CODECS) case VideoCodec::kH264: { @@ -547,32 +555,41 @@ } #if BUILDFLAG(ENABLE_PLATFORM_HEVC) case VideoCodec::kHEVC: { - int hevc_profile = FF_PROFILE_UNKNOWN; - if ((codec_context->profile < FF_PROFILE_HEVC_MAIN || - codec_context->profile > FF_PROFILE_HEVC_REXT) && - codec_context->extradata && codec_context->extradata_size) { + int hevc_profile = -1; + // We need to parse extradata each time, because we wont add ffmpeg + // hevc decoder & parser to chromium and codec_context->profile + // should always be FF_PROFILE_UNKNOWN (-99) here + if (codec_context->extradata && codec_context->extradata_size) { mp4::HEVCDecoderConfigurationRecord hevc_config; if (hevc_config.Parse(codec_context->extradata, codec_context->extradata_size)) { hevc_profile = hevc_config.general_profile_idc; +#if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) + if (!color_space.IsSpecified()) { + // We should try to parsed color space from SPS if the + // result from libavcodec is not specified in case + // that some encoder not write extra colorspace info to + // the container + color_space = hevc_config.GetColorSpace(); + } +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) } - } else { - hevc_profile = codec_context->profile; } + // The values of general_profile_idc are taken from the HEVC standard, see + // the latest https://www.itu.int/rec/T-REC-H.265/en switch (hevc_profile) { - case FF_PROFILE_HEVC_MAIN: + case 1: profile = HEVCPROFILE_MAIN; break; - case FF_PROFILE_HEVC_MAIN_10: + case 2: profile = HEVCPROFILE_MAIN10; break; - case FF_PROFILE_HEVC_MAIN_STILL_PICTURE: + case 3: profile = HEVCPROFILE_MAIN_STILL_PICTURE; break; - case FF_PROFILE_HEVC_REXT: + case 4: profile = HEVCPROFILE_REXT; break; - // FF will treat the following profiles as FF_PROFILE_UNKNOWN case 5: profile = HEVCPROFILE_HIGH_THROUGHPUT; break; @@ -647,13 +664,6 @@ static_cast<int32_t*>(display_matrix)); } - // Prefer the color space found by libavcodec if available. - VideoColorSpace color_space = - VideoColorSpace(codec_context->color_primaries, codec_context->color_trc, - codec_context->colorspace, - codec_context->color_range == AVCOL_RANGE_JPEG - ? gfx::ColorSpace::RangeID::FULL - : gfx::ColorSpace::RangeID::LIMITED); if (!color_space.IsSpecified()) { // VP9 frames may have color information, but that information cannot // express new color spaces, like HDR. For that reason, color space
diff --git a/media/formats/mp4/avc.cc b/media/formats/mp4/avc.cc index a91f43b..c3a3b29e 100644 --- a/media/formats/mp4/avc.cc +++ b/media/formats/mp4/avc.cc
@@ -17,8 +17,8 @@ namespace media { namespace mp4 { -static const uint8_t kAnnexBStartCode[] = {0, 0, 0, 1}; -static const int kAnnexBStartCodeSize = 4; +static constexpr uint8_t kAnnexBStartCode[] = {0, 0, 0, 1}; +static constexpr int kAnnexBStartCodeSize = 4; static bool ConvertAVCToAnnexBInPlaceForLengthSize4(std::vector<uint8_t>* buf) { const size_t kLengthSize = 4;
diff --git a/media/formats/mp4/box_definitions.cc b/media/formats/mp4/box_definitions.cc index 4e99b0f..5b94e6f 100644 --- a/media/formats/mp4/box_definitions.cc +++ b/media/formats/mp4/box_definitions.cc
@@ -1126,6 +1126,9 @@ RCHECK(reader->ReadChild(hevcConfig.get())); video_codec = VideoCodec::kHEVC; video_codec_profile = hevcConfig->GetVideoProfile(); +#if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) + video_color_space = hevcConfig->GetColorSpace(); +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) frame_bitstream_converter = base::MakeRefCounted<HEVCBitstreamConverter>(std::move(hevcConfig)); #if BUILDFLAG(ENABLE_PLATFORM_DOLBY_VISION) @@ -1166,6 +1169,9 @@ std::unique_ptr<HEVCDecoderConfigurationRecord> hevcConfig( new HEVCDecoderConfigurationRecord()); RCHECK(reader->ReadChild(hevcConfig.get())); +#if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) + video_color_space = hevcConfig->GetColorSpace(); +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) frame_bitstream_converter = base::MakeRefCounted<HEVCBitstreamConverter>(std::move(hevcConfig)); DVLOG(2) << __func__ << " reading DolbyVisionConfiguration (dvcC/dvvC)";
diff --git a/media/formats/mp4/hevc.cc b/media/formats/mp4/hevc.cc index be9aa80..7249313 100644 --- a/media/formats/mp4/hevc.cc +++ b/media/formats/mp4/hevc.cc
@@ -15,11 +15,18 @@ #include "media/formats/mp4/avc.h" #include "media/formats/mp4/box_definitions.h" #include "media/formats/mp4/box_reader.h" +#if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) +#include "media/video/h265_parser.h" +#else #include "media/video/h265_nalu_parser.h" +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) namespace media { namespace mp4 { +static constexpr uint8_t kAnnexBStartCode[] = {0, 0, 0, 1}; +static constexpr int kAnnexBStartCodeSize = 4; + HEVCDecoderConfigurationRecord::HEVCDecoderConfigurationRecord() : configurationVersion(0), general_profile_space(0), @@ -151,8 +158,46 @@ return VIDEO_CODEC_PROFILE_UNKNOWN; } -static const uint8_t kAnnexBStartCode[] = {0, 0, 0, 1}; -static const int kAnnexBStartCodeSize = 4; +#if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) +VideoColorSpace HEVCDecoderConfigurationRecord::GetColorSpace() { + if (!arrays.size()) { + DVLOG(1) << "HVCCNALArray not found, fallback to default colorspace"; + return VideoColorSpace(); + } + + std::vector<uint8_t> param_sets; + if (!HEVC::ConvertConfigToAnnexB(*this, ¶m_sets)) + return VideoColorSpace(); + + H265Parser parser; + H265NALU nalu; + parser.SetStream(param_sets.data(), param_sets.size()); + while (true) { + H265Parser::Result result = parser.AdvanceToNextNALU(&nalu); + + if (result != H265Parser::kOk) + return VideoColorSpace(); + + switch (nalu.nal_unit_type) { + case H265NALU::SPS_NUT: { + int sps_id = -1; + result = parser.ParseSPS(&sps_id); + if (result != H265Parser::kOk) { + DVLOG(1) << "Could not parse SPS, fallback to default colorspace"; + return VideoColorSpace(); + } + + const H265SPS* sps = parser.GetSPS(sps_id); + DCHECK(sps); + return sps->GetColorSpace(); + } + default: + break; + } + } + NOTREACHED(); +} +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) // static bool HEVC::InsertParamSetsAnnexB(
diff --git a/media/formats/mp4/hevc.h b/media/formats/mp4/hevc.h index 7ec661a..3e189546 100644 --- a/media/formats/mp4/hevc.h +++ b/media/formats/mp4/hevc.h
@@ -62,6 +62,9 @@ std::vector<HVCCNALArray> arrays; VideoCodecProfile GetVideoProfile() const; +#if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) + VideoColorSpace GetColorSpace(); +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) private: bool ParseInternal(BufferReader* reader, MediaLog* media_log);
diff --git a/media/formats/mp4/nalu_test_helper.cc b/media/formats/mp4/nalu_test_helper.cc index 4949f032..ea0f2d5 100644 --- a/media/formats/mp4/nalu_test_helper.cc +++ b/media/formats/mp4/nalu_test_helper.cc
@@ -10,7 +10,7 @@ #include "media/video/h264_parser.h" #if BUILDFLAG(ENABLE_PLATFORM_HEVC) -#include "media/video/h265_parser.h" +#include "media/video/h265_nalu_parser.h" #endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) namespace media {
diff --git a/media/gpu/android/media_codec_video_decoder.cc b/media/gpu/android/media_codec_video_decoder.cc index 2a90cd3..48b37c7 100644 --- a/media/gpu/android/media_codec_video_decoder.cc +++ b/media/gpu/android/media_codec_video_decoder.cc
@@ -169,7 +169,7 @@ false); // require_encrypted #if BUILDFLAG(ENABLE_PLATFORM_HEVC) - if (base::FeatureList::IsEnabled(kMediaCodecHEVC)) { + if (base::FeatureList::IsEnabled(kPlatformHEVCDecoderSupport)) { supported_configs.emplace_back(HEVCPROFILE_MIN, HEVCPROFILE_MAX, gfx::Size(0, 0), gfx::Size(3840, 2160), true, // allow_encrypted
diff --git a/media/gpu/mac/vt_video_decode_accelerator_mac.cc b/media/gpu/mac/vt_video_decode_accelerator_mac.cc index a2abeca8..f5f98c0 100644 --- a/media/gpu/mac/vt_video_decode_accelerator_mac.cc +++ b/media/gpu/mac/vt_video_decode_accelerator_mac.cc
@@ -395,7 +395,7 @@ } #if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) - if (base::FeatureList::IsEnabled(media::kVideoToolboxHEVCDecoding)) { + if (base::FeatureList::IsEnabled(media::kPlatformHEVCDecoderSupport)) { // Only macOS >= 11.0 will support hevc if we use // CMVideoFormatDescriptionCreateFromHEVCParameterSets // API to create video format @@ -2348,7 +2348,7 @@ supported_profile == HEVCPROFILE_REXT) { #if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) if (!workarounds.disable_accelerated_hevc_decode && - base::FeatureList::IsEnabled(kVideoToolboxHEVCDecoding)) { + base::FeatureList::IsEnabled(kPlatformHEVCDecoderSupport)) { if (__builtin_available(macOS 11.0, *)) { // Success! We have HEVC hardware decoding (or software // decoding if the hardware is not good enough) support too.
diff --git a/media/gpu/windows/d3d11_video_decoder.cc b/media/gpu/windows/d3d11_video_decoder.cc index ad84677..6420b11 100644 --- a/media/gpu/windows/d3d11_video_decoder.cc +++ b/media/gpu/windows/d3d11_video_decoder.cc
@@ -191,7 +191,7 @@ profile_, config.color_space_info()); } else if (config.codec() == VideoCodec::kHEVC) { #if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) - DCHECK(base::FeatureList::IsEnabled(kD3D11HEVCDecoding)); + DCHECK(base::FeatureList::IsEnabled(kPlatformHEVCDecoderSupport)); accelerated_video_decoder_ = std::make_unique<H265Decoder>( std::make_unique<D3D11H265Accelerator>( this, media_log_.get(), video_device_, std::move(video_context)), @@ -212,13 +212,14 @@ D3D11Status::Or<ComD3D11VideoDecoder> D3D11VideoDecoder::CreateD3D11Decoder() { // By default we assume outputs are 8-bit for SDR color spaces and 10 bit for - // HDR color spaces (or VP9.2) with HBD capable codecs (the decoder doesn't - // support H264PROFILE_HIGH10PROFILE). We'll get a config change once we know - // the real bit depth if this turns out to be wrong. + // HDR color spaces (or VP9.2, or HEVC Main10) with HBD capable codecs (the + // decoder doesn't support H264PROFILE_HIGH10PROFILE). We'll get a config + // change once we know the real bit depth if this turns out to be wrong. bit_depth_ = accelerated_video_decoder_ ? accelerated_video_decoder_->GetBitDepth() : (config_.profile() == VP9PROFILE_PROFILE2 || + config_.profile() == HEVCPROFILE_MAIN10 || (config_.color_space_info().ToGfxColorSpace().IsHDR() && config_.codec() != VideoCodec::kH264) ? 10
diff --git a/media/gpu/windows/supported_profile_helpers.cc b/media/gpu/windows/supported_profile_helpers.cc index d395ab0..d37d66a6 100644 --- a/media/gpu/windows/supported_profile_helpers.cc +++ b/media/gpu/windows/supported_profile_helpers.cc
@@ -224,7 +224,7 @@ #if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) if (!workarounds.disable_accelerated_hevc_decode && - base::FeatureList::IsEnabled(kD3D11HEVCDecoding)) { + base::FeatureList::IsEnabled(kPlatformHEVCDecoderSupport)) { if (profile_id == D3D11_DECODER_PROFILE_HEVC_VLD_MAIN) { supported_resolutions[HEVCPROFILE_MAIN] = GetResolutionsForGUID( video_device.Get(), profile_id, kModernResolutions);
diff --git a/media/gpu/windows/supported_profile_helpers_unittest.cc b/media/gpu/windows/supported_profile_helpers_unittest.cc index 266306b..8a5d181 100644 --- a/media/gpu/windows/supported_profile_helpers_unittest.cc +++ b/media/gpu/windows/supported_profile_helpers_unittest.cc
@@ -329,10 +329,10 @@ kSquare8k, kSquare8k, kSquare8k); } +#if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) TEST_F(SupportedResolutionResolverTest, H265Supports8kIfEnabled) { DONT_RUN_ON_WIN_7(); -#if BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) EnableDecoders({D3D11_DECODER_PROFILE_HEVC_VLD_MAIN}); base::test::ScopedFeatureList scoped_feature_list; @@ -343,8 +343,8 @@ ASSERT_EQ(3u, no_feature_resolutions.size()); // enable the feature and try again - scoped_feature_list.InitAndEnableFeature(kD3D11HEVCDecoding); SetMaxResolution(D3D11_DECODER_PROFILE_HEVC_VLD_MAIN, kSquare8k); + scoped_feature_list.InitAndEnableFeature(kPlatformHEVCDecoderSupport); const auto resolutions_for_feature = GetSupportedD3D11VideoDecoderResolutions( mock_d3d11_device_, gpu_workarounds_); ASSERT_EQ(4u, resolutions_for_feature.size()); @@ -352,19 +352,7 @@ ASSERT_NE(it, resolutions_for_feature.end()); ASSERT_EQ(it->second.max_landscape_resolution, kSquare8k); ASSERT_EQ(it->second.max_portrait_resolution, kSquare8k); -#else - { - // Even with the flag enabled and decoder supported, we shouldn't support - // HEVC unless the buildflag is enabled. - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature(kD3D11HEVCDecoding); - EnableDecoders({D3D11_DECODER_PROFILE_HEVC_VLD_MAIN}); - const auto supported_resolutions = GetSupportedD3D11VideoDecoderResolutions( - mock_d3d11_device_, gpu_workarounds_); - // H264 always is supported, and it adds three profile entries. - ASSERT_EQ(3u, supported_resolutions.size()); - } -#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) } +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC_DECODING) } // namespace media
diff --git a/media/media_options.gni b/media/media_options.gni index 57ae313..442dba2 100644 --- a/media/media_options.gni +++ b/media/media_options.gni
@@ -117,6 +117,10 @@ !enable_platform_encrypted_hevc || enable_platform_hevc, "enable_platform_hevc=true is required for enable_platform_encrypted_hevc=true.") +assert( + !enable_platform_hevc_decoding || enable_platform_hevc, + "enable_platform_hevc=true is required for enable_platform_hevc_decoding=true.") + # Use a second declare_args() to pick up possible overrides of |use_cras|. declare_args() { # Enables runtime selection of PulseAudio library.
diff --git a/media/mojo/services/BUILD.gn b/media/mojo/services/BUILD.gn index 8fccbb4..36e8e5f 100644 --- a/media/mojo/services/BUILD.gn +++ b/media/mojo/services/BUILD.gn
@@ -6,6 +6,7 @@ import("//build/config/chromeos/ui_mode.gni") import("//media/gpu/args.gni") import("//media/media_options.gni") +import("//mojo/public/tools/fuzzers/mojolpm.gni") import("//testing/test.gni") component("services") { @@ -258,3 +259,27 @@ ] } } + +mojolpm_fuzzer_test("webrtc_video_perf_mojolpm_fuzzer") { + sources = [ "webrtc_video_perf_mojolpm_fuzzer.cc" ] + + proto_source = "webrtc_video_perf_mojolpm_fuzzer.proto" + testcase_proto_kind = "media.fuzzing.webrtc_video_perf.proto.Testcase" + + seed_corpus_sources = [ + "webrtc_video_perf_fuzzer_seed_corpus/update_record_and_get_perf.textproto", + ] + + proto_deps = [ "//third_party/blink/public/mojom:mojom_platform_mojolpm" ] + + deps = [ + ":services", + "//base", + "//base/test:test_support", + "//components/leveldb_proto:test_support", + "//content/public/browser", + "//media", + "//media/capabilities:webrtc_video_stats_proto", + "//third_party/libprotobuf-mutator", + ] +}
diff --git a/media/mojo/services/DEPS b/media/mojo/services/DEPS index 418719a3..a3c15af 100644 --- a/media/mojo/services/DEPS +++ b/media/mojo/services/DEPS
@@ -5,5 +5,9 @@ "media_manifest\.cc": [ "+chromecast/common/mojom", ], + "webrtc_video_perf_mojolpm_fuzzer\.cc": [ + "+third_party/libprotobuf-mutator/src/src", + "+components/leveldb_proto/testing/fake_db.h", + ] }
diff --git a/media/mojo/services/webrtc_video_perf_fuzzer_seed_corpus/update_record_and_get_perf.textproto b/media/mojo/services/webrtc_video_perf_fuzzer_seed_corpus/update_record_and_get_perf.textproto new file mode 100644 index 0000000..45a109a --- /dev/null +++ b/media/mojo/services/webrtc_video_perf_fuzzer_seed_corpus/update_record_and_get_perf.textproto
@@ -0,0 +1,77 @@ +actions { + update_record { + features { + new { + id: 1 + m_is_decode_stats: true + m_profile: 12 + m_video_pixels: 2073600 + m_hardware_accelerated: false + } + } + video_stats { + new { + id: 1 + m_frames_processed: 400 + m_key_frames_processed: 3 + m_p99_processing_time_ms: 11.0 + } + } + } +} +actions { + update_record { + features { + new { + id: 1 + m_is_decode_stats: true + m_profile: 12 + m_video_pixels: 8294400 + m_hardware_accelerated: false + } + } + video_stats { + new { + id: 1 + m_frames_processed: 600 + m_key_frames_processed: 5 + m_p99_processing_time_ms: 14.0 + } + } + } +} +actions { + update_record { + features { + new { + id: 1 + m_is_decode_stats: true + m_profile: 12 + m_video_pixels: 0 + m_hardware_accelerated: false + } + } + video_stats { + new { + id: 1 + m_frames_processed: 0 + m_key_frames_processed: 0 + m_p99_processing_time_ms: 0.0 + } + } + } +} +actions { + get_perf_info { + features { + new { + id: 1 + m_is_decode_stats: true + m_profile: 12 + m_video_pixels: 2073600 + m_hardware_accelerated: false + } + } + frames_per_second: 60 + } +} \ No newline at end of file
diff --git a/media/mojo/services/webrtc_video_perf_history.cc b/media/mojo/services/webrtc_video_perf_history.cc index a746b03..a27489f3 100644 --- a/media/mojo/services/webrtc_video_perf_history.cc +++ b/media/mojo/services/webrtc_video_perf_history.cc
@@ -167,6 +167,7 @@ video_stats.frames_processed > WebrtcVideoStatsDB::kFramesProcessedMaxValue || video_stats.key_frames_processed > video_stats.frames_processed || + isnan(video_stats.p99_processing_time_ms) || video_stats.p99_processing_time_ms < WebrtcVideoStatsDB::kP99ProcessingTimeMinValueMs || video_stats.p99_processing_time_ms > @@ -206,9 +207,9 @@ // initialized during their lifetime. DCHECK_EQ(db_init_status_, UNINITIALIZED); + db_init_status_ = PENDING; db_->Initialize(base::BindOnce(&WebrtcVideoPerfHistory::OnDatabaseInit, weak_ptr_factory_.GetWeakPtr())); - db_init_status_ = PENDING; } void WebrtcVideoPerfHistory::OnDatabaseInit(bool success) {
diff --git a/media/mojo/services/webrtc_video_perf_mojolpm_fuzzer.cc b/media/mojo/services/webrtc_video_perf_mojolpm_fuzzer.cc new file mode 100644 index 0000000..8883946 --- /dev/null +++ b/media/mojo/services/webrtc_video_perf_mojolpm_fuzzer.cc
@@ -0,0 +1,226 @@ +// 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 <stdint.h> +#include <utility> + +#include "base/command_line.h" +#include "base/logging.h" +#include "base/notreached.h" +#include "base/test/task_environment.h" +#include "base/test/test_timeouts.h" +#include "components/leveldb_proto/testing/fake_db.h" +#include "media/capabilities/webrtc_video_stats.pb.h" +#include "media/capabilities/webrtc_video_stats_db_impl.h" +#include "media/mojo/mojom/webrtc_video_perf.mojom-mojolpm.h" +#include "media/mojo/services/webrtc_video_perf_history.h" +#include "media/mojo/services/webrtc_video_perf_mojolpm_fuzzer.pb.h" +#include "media/mojo/services/webrtc_video_perf_recorder.h" +#include "third_party/libprotobuf-mutator/src/src/libfuzzer/libfuzzer_macro.h" + +namespace media { + +// Helper class to call private constructor of friend class. +class WebrtcVideoPerfLPMFuzzerHelper { + public: + static std::unique_ptr<WebrtcVideoStatsDBImpl> CreateWebrtcVideoStatsDbImpl( + std::unique_ptr<leveldb_proto::ProtoDatabase<WebrtcVideoStatsEntryProto>> + proto_db) { + return base::WrapUnique(new WebrtcVideoStatsDBImpl(std::move(proto_db))); + } +}; + +namespace { + +struct InitGlobals { + InitGlobals() { + // The call to CommandLine::Init is needed so that TestTimeouts::Initialize + // does not fail. + bool success = base::CommandLine::Init(0, nullptr); + DCHECK(success); + // TaskEnvironment requires TestTimeouts initialization to watch for + // problematic long-running tasks. + TestTimeouts::Initialize(); + + // Mark this thread as an IO_THREAD with MOCK_TIME, and ensure that Now() + // is driven from the same mock clock. + task_environment = std::make_unique<base::test::TaskEnvironment>( + base::test::TaskEnvironment::MainThreadType::IO, + base::test::TaskEnvironment::TimeSource::MOCK_TIME); + } + + // This allows us to mock time for all threads. + std::unique_ptr<base::test::TaskEnvironment> task_environment; +}; + +InitGlobals* init_globals = new InitGlobals(); + +base::test::TaskEnvironment& GetEnvironment() { + return *init_globals->task_environment; +} + +scoped_refptr<base::SingleThreadTaskRunner> GetFuzzerTaskRunner() { + return GetEnvironment().GetMainThreadTaskRunner(); +} + +// This in-memory database uses the FakeDB proto implementation as the +// underlying storage. The underlying FakeDB class requires that all callbacks +// are triggered manually. This class is used as a convenience class triggering +// the callbacks with success=true. +class InMemoryWebrtcVideoPerfDb + : public leveldb_proto::test::FakeDB<WebrtcVideoStatsEntryProto> { + public: + explicit InMemoryWebrtcVideoPerfDb(EntryMap* db) : FakeDB(db) {} + + // Partial ProtoDatabase implementation. + void Init(leveldb_proto::Callbacks::InitStatusCallback callback) override { + FakeDB::Init(std::move(callback)); + InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK); + } + + void GetEntry( + const std::string& key, + typename leveldb_proto::Callbacks::Internal< + WebrtcVideoStatsEntryProto>::GetCallback callback) override { + FakeDB::GetEntry(key, std::move(callback)); + // Run callback. + GetCallback(true); + } + + void LoadKeysAndEntriesWhile( + const std::string& start, + const leveldb_proto::KeyIteratorController& controller, + typename leveldb_proto::Callbacks::Internal<WebrtcVideoStatsEntryProto>:: + LoadKeysAndEntriesCallback callback) override { + FakeDB::LoadKeysAndEntriesWhile(start, controller, std::move(callback)); + // Run callback. + LoadCallback(true); + } + + void UpdateEntries( + std::unique_ptr<typename ProtoDatabase< + WebrtcVideoStatsEntryProto>::KeyEntryVector> entries_to_save, + std::unique_ptr<std::vector<std::string>> keys_to_remove, + leveldb_proto::Callbacks::UpdateCallback callback) override { + FakeDB::UpdateEntries(std::move(entries_to_save), std::move(keys_to_remove), + std::move(callback)); + // Run callback. + UpdateCallback(true); + } + + void UpdateEntriesWithRemoveFilter( + std::unique_ptr<typename leveldb_proto::Util::Internal< + WebrtcVideoStatsEntryProto>::KeyEntryVector> entries_to_save, + const leveldb_proto::KeyFilter& filter, + leveldb_proto::Callbacks::UpdateCallback callback) override { + FakeDB::UpdateEntriesWithRemoveFilter(std::move(entries_to_save), filter, + std::move(callback)); + // Run callback. + UpdateCallback(true); + } +}; + +class WebrtcVideoPerfLPMFuzzer { + public: + WebrtcVideoPerfLPMFuzzer( + const fuzzing::webrtc_video_perf::proto::Testcase& testcase) + : testcase_(testcase) { + // Create all objects that are needed and connect everything. + in_memory_db_ = new InMemoryWebrtcVideoPerfDb(&in_memory_db_map_); + std::unique_ptr<WebrtcVideoStatsDBImpl> stats_db = + WebrtcVideoPerfLPMFuzzerHelper::CreateWebrtcVideoStatsDbImpl( + std::unique_ptr<InMemoryWebrtcVideoPerfDb>(in_memory_db_)); + perf_history_ = + std::make_unique<WebrtcVideoPerfHistory>(std::move(stats_db)); + perf_recorder_ = std::make_unique<WebrtcVideoPerfRecorder>( + perf_history_->GetSaveCallback()); + } + + void NextAction() { + const auto& action = testcase_.actions(action_index_); + switch (action.action_case()) { + case fuzzing::webrtc_video_perf::proto::Action::kUpdateRecord: { + const auto& update_record = action.update_record(); + auto features_ptr = media::mojom::WebrtcPredictionFeatures::New(); + auto video_stats_ptr = media::mojom::WebrtcVideoStats::New(); + mojolpm::FromProto(update_record.features(), features_ptr); + mojolpm::FromProto(update_record.video_stats(), video_stats_ptr); + perf_recorder_->UpdateRecord(std::move(features_ptr), + std::move(video_stats_ptr)); + break; + } + case fuzzing::webrtc_video_perf::proto::Action::kGetPerfInfo: { + const auto& get_perf_info = action.get_perf_info(); + auto features_ptr = media::mojom::WebrtcPredictionFeatures::New(); + mojolpm::FromProto(get_perf_info.features(), features_ptr); + perf_history_->GetPerfInfo(std::move(features_ptr), + get_perf_info.frames_per_second(), + base::DoNothing()); + break; + } + default: { + // Do nothing. + } + } + ++action_index_; + } + + bool IsFinished() { return action_index_ >= testcase_.actions_size(); } + + private: + const fuzzing::webrtc_video_perf::proto::Testcase& testcase_; + int action_index_ = 0; + + // Database storage. + InMemoryWebrtcVideoPerfDb::EntryMap in_memory_db_map_; + // Proto buffer database implementation that uses `in_memory_db_map_` as + // storage. + raw_ptr<InMemoryWebrtcVideoPerfDb> in_memory_db_; + std::unique_ptr<WebrtcVideoPerfHistory> perf_history_; + std::unique_ptr<WebrtcVideoPerfRecorder> perf_recorder_; +}; + +void NextAction(WebrtcVideoPerfLPMFuzzer* testcase, + base::OnceClosure fuzzer_run_loop) { + if (!testcase->IsFinished()) { + testcase->NextAction(); + GetFuzzerTaskRunner()->PostTask( + FROM_HERE, base::BindOnce(NextAction, base::Unretained(testcase), + std::move(fuzzer_run_loop))); + } else { + std::move(fuzzer_run_loop).Run(); + } +} + +void RunTestcase(WebrtcVideoPerfLPMFuzzer* testcase) { + base::RunLoop fuzzer_run_loop; + GetFuzzerTaskRunner()->PostTask( + FROM_HERE, base::BindOnce(NextAction, base::Unretained(testcase), + fuzzer_run_loop.QuitClosure())); + // Make sure that all callbacks have completed. + constexpr base::TimeDelta kTimeout = base::Seconds(5); + GetEnvironment().FastForwardBy(kTimeout); + fuzzer_run_loop.Run(); +} + +} // namespace + +DEFINE_BINARY_PROTO_FUZZER( + const fuzzing::webrtc_video_perf::proto::Testcase& testcase) { + if (!testcase.actions_size()) { + return; + } + + WebrtcVideoPerfLPMFuzzer webtc_video_perf_fuzzer_instance(testcase); + base::RunLoop main_run_loop; + + GetFuzzerTaskRunner()->PostTaskAndReply( + FROM_HERE, + base::BindOnce(RunTestcase, + base::Unretained(&webtc_video_perf_fuzzer_instance)), + main_run_loop.QuitClosure()); + main_run_loop.Run(); +} + +} // namespace media \ No newline at end of file
diff --git a/media/mojo/services/webrtc_video_perf_mojolpm_fuzzer.proto b/media/mojo/services/webrtc_video_perf_mojolpm_fuzzer.proto new file mode 100644 index 0000000..1f5b264 --- /dev/null +++ b/media/mojo/services/webrtc_video_perf_mojolpm_fuzzer.proto
@@ -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. + +// Message format for the MojoLPM fuzzer for the WebrtcVideoPerf interface. + +syntax = "proto2"; + +package media.fuzzing.webrtc_video_perf.proto; + +import "media/mojo/mojom/webrtc_video_perf.mojom.mojolpm.proto"; + +// Update the record for the specified features. +message UpdateRecordAction { + required mojolpm.media.mojom.WebrtcPredictionFeatures features = 1; + required mojolpm.media.mojom.WebrtcVideoStats video_stats = 2; +} + +// Get perf info for the specified features. +message GetPerfInfoAction { + required mojolpm.media.mojom.WebrtcPredictionFeatures features = 1; + required int32 frames_per_second = 2; +} + +// Actions that can be performed by the fuzzer. +message Action { + oneof action { + UpdateRecordAction update_record = 1; + GetPerfInfoAction get_perf_info = 2; + } +} + +// Testcase is the top-level message type interpreted by the fuzzer. +message Testcase { + repeated Action actions = 1; +} \ No newline at end of file
diff --git a/media/video/renderable_gpu_memory_buffer_video_frame_pool.cc b/media/video/renderable_gpu_memory_buffer_video_frame_pool.cc index b714eb8..dbf2b3e1 100644 --- a/media/video/renderable_gpu_memory_buffer_video_frame_pool.cc +++ b/media/video/renderable_gpu_memory_buffer_video_frame_pool.cc
@@ -179,6 +179,8 @@ return false; } + gpu_memory_buffer_->SetColorSpace(color_space_); + // Bind SharedImages to each plane. constexpr size_t kNumPlanes = 2; constexpr gfx::BufferPlane kPlanes[kNumPlanes] = {gfx::BufferPlane::Y,
diff --git a/net/BUILD.gn b/net/BUILD.gn index c2905c5..f35dde2 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -893,6 +893,8 @@ "socket/transport_client_socket_pool.h", "socket/transport_connect_job.cc", "socket/transport_connect_job.h", + "socket/transport_connect_sub_job.cc", + "socket/transport_connect_sub_job.h", "socket/udp_client_socket.cc", "socket/udp_client_socket.h", "socket/udp_net_log_parameters.cc", @@ -906,10 +908,6 @@ "socket/websocket_endpoint_lock_manager.h", "socket/websocket_transport_client_socket_pool.cc", "socket/websocket_transport_client_socket_pool.h", - "socket/websocket_transport_connect_job.cc", - "socket/websocket_transport_connect_job.h", - "socket/websocket_transport_connect_sub_job.cc", - "socket/websocket_transport_connect_sub_job.h", "spdy/alps_decoder.cc", "spdy/alps_decoder.h", "spdy/bidirectional_stream_spdy_impl.cc",
diff --git a/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java b/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java index 573319a..ed70a7e 100644 --- a/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java +++ b/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java
@@ -275,6 +275,18 @@ return ""; } + // For testing, turn Wifi on/off. Only for testing but we can not append + // "ForTest" hooter because jni generator creates code for @CalledByNative + // regardless of the hooter but Chromium Binary Size checker warns + // "XXXForTest" is included in the production binary. + @CalledByNative + public static void setWifiEnabled(boolean enabled) { + WifiManager wifiManager = + (WifiManager) ContextUtils.getApplicationContext().getSystemService( + Context.WIFI_SERVICE); + wifiManager.setWifiEnabled(enabled); + } + /** * Gets the signal strength from the currently associated WiFi access point if there is one, and * it is available. Signal strength may not be available if the app does not have permissions to
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java index f53927a..ad88cc75 100644 --- a/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java +++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java
@@ -151,10 +151,12 @@ * Note that passing true here requires the embedding app have the platform ACCESS_NETWORK_STATE * permission. Also note that in this case the auto detection is enabled based on the status of * the application (@see ApplicationStatus). + * Declare @CalledByNative only for testing. * * @param shouldAutoDetect true if the NetworkChangeNotifier should listen for system changes in * network connectivity. */ + @CalledByNative public static void setAutoDetectConnectivityState(boolean shouldAutoDetect) { getInstance().setAutoDetectConnectivityStateInternal( shouldAutoDetect, new RegistrationPolicyApplicationStatus());
diff --git a/net/android/network_change_notifier_delegate_android.cc b/net/android/network_change_notifier_delegate_android.cc index 3d37738..00925d0b 100644 --- a/net/android/network_change_notifier_delegate_android.cc +++ b/net/android/network_change_notifier_delegate_android.cc
@@ -510,4 +510,10 @@ env, java_network_active_notifier_); } +void NetworkChangeNotifierDelegateAndroid:: + EnableNetworkChangeNotifierAutoDetectForTest() { + JNIEnv* env = base::android::AttachCurrentThread(); + Java_NetworkChangeNotifier_setAutoDetectConnectivityState(env, true); +} + } // namespace net
diff --git a/net/android/network_change_notifier_delegate_android.h b/net/android/network_change_notifier_delegate_android.h index 71685e4..b03763b 100644 --- a/net/android/network_change_notifier_delegate_android.h +++ b/net/android/network_change_notifier_delegate_android.h
@@ -165,6 +165,8 @@ return register_network_callback_failed_; } + static void EnableNetworkChangeNotifierAutoDetectForTest(); + private: friend class BaseNetworkChangeNotifierAndroidTest;
diff --git a/net/android/network_library.cc b/net/android/network_library.cc index ef03285..4faba271 100644 --- a/net/android/network_library.cc +++ b/net/android/network_library.cc
@@ -122,6 +122,11 @@ base::android::AttachCurrentThread())); } +void SetWifiEnabledForTesting(bool enabled) { + Java_AndroidNetworkLibrary_setWifiEnabled( + base::android::AttachCurrentThread(), enabled); +} + absl::optional<int32_t> GetWifiSignalLevel() { const int count_buckets = 5; int signal_strength = Java_AndroidNetworkLibrary_getWifiSignalLevel(
diff --git a/net/android/network_library.h b/net/android/network_library.h index 7ae59051..f1ada46 100644 --- a/net/android/network_library.h +++ b/net/android/network_library.h
@@ -82,6 +82,9 @@ // point or its SSID is unavailable, an empty string is returned. NET_EXPORT_PRIVATE std::string GetWifiSSID(); +// Call WifiManager.setWifiEnabled. +NET_EXPORT_PRIVATE void SetWifiEnabledForTesting(bool enabled); + // Returns the signal strength level (between 0 and 4, both inclusive) of the // currently registered Wifi connection. If the value is unavailable, an // empty value is returned.
diff --git a/net/base/sockaddr_util_posix.cc b/net/base/sockaddr_util_posix.cc index 31ea836..c184cbe 100644 --- a/net/base/sockaddr_util_posix.cc +++ b/net/base/sockaddr_util_posix.cc
@@ -6,6 +6,7 @@ #include <stddef.h> #include <string.h> +#include <stddef.h> #include <sys/socket.h> #include <sys/un.h>
diff --git a/net/http/http_proxy_connect_job.cc b/net/http/http_proxy_connect_job.cc index ca6bde8..7715ac3 100644 --- a/net/http/http_proxy_connect_job.cc +++ b/net/http/http_proxy_connect_job.cc
@@ -441,9 +441,9 @@ int HttpProxyConnectJob::DoTransportConnect() { ProxyServer::Scheme scheme = GetProxyServerScheme(); if (scheme == ProxyServer::SCHEME_HTTP) { - nested_connect_job_ = TransportConnectJob::CreateTransportConnectJob( - params_->transport_params(), priority(), socket_tag(), - common_connect_job_params(), this, &net_log()); + nested_connect_job_ = std::make_unique<TransportConnectJob>( + priority(), socket_tag(), common_connect_job_params(), + params_->transport_params(), this, &net_log()); } else { DCHECK_EQ(scheme, ProxyServer::SCHEME_HTTPS); DCHECK(params_->ssl_params());
diff --git a/net/log/net_log_event_type_list.h b/net/log/net_log_event_type_list.h index 14ddbf4..cc76d87 100644 --- a/net/log/net_log_event_type_list.h +++ b/net/log/net_log_event_type_list.h
@@ -785,9 +785,6 @@ // The start/end of the HttpProxyConnectJob::Connect(). EVENT_TYPE(HTTP_PROXY_CONNECT_JOB_CONNECT) -// The start/end of the WebSocketConnectJob::Connect(). -EVENT_TYPE(WEB_SOCKET_TRANSPORT_CONNECT_JOB_CONNECT) - // A TLS connection attempt failed because ECH was not negotiated. The // connection will be retried with a new ECHConfigList from the client-facing // server. If the new ECHConfigList is the empty string, the server has rolled
diff --git a/net/log/net_log_source_type_list.h b/net/log/net_log_source_type_list.h index e9432bd..55a66fc 100644 --- a/net/log/net_log_source_type_list.h +++ b/net/log/net_log_source_type_list.h
@@ -18,7 +18,6 @@ SOURCE_TYPE(SOCKS_CONNECT_JOB) SOURCE_TYPE(SSL_CONNECT_JOB) SOURCE_TYPE(TRANSPORT_CONNECT_JOB) -SOURCE_TYPE(WEB_SOCKET_TRANSPORT_CONNECT_JOB) SOURCE_TYPE(SOCKET) SOURCE_TYPE(HTTP2_SESSION) SOURCE_TYPE(QUIC_CONNECTION_MIGRATION)
diff --git a/net/nqe/network_quality_estimator.cc b/net/nqe/network_quality_estimator.cc index 10bfd84c..f5f02357 100644 --- a/net/nqe/network_quality_estimator.cc +++ b/net/nqe/network_quality_estimator.cc
@@ -842,6 +842,11 @@ return EFFECTIVE_CONNECTION_TYPE_OFFLINE; } + if (force_report_wifi_as_slow_2g_for_testing_ && + current_network_id_.type == NetworkChangeNotifier::CONNECTION_WIFI) { + return EFFECTIVE_CONNECTION_TYPE_SLOW_2G; + } + if (!GetRecentRTT(nqe::internal::OBSERVATION_CATEGORY_HTTP, base::TimeTicks(), http_rtt, nullptr)) { *http_rtt = nqe::internal::InvalidRTT(); @@ -1486,6 +1491,11 @@ ComputeEffectiveConnectionType(); } +void NetworkQualityEstimator::ForceReportWifiAsSlow2GForTesting() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + force_report_wifi_as_slow_2g_for_testing_ = true; +} + void NetworkQualityEstimator::RecordSpdyPingLatency( const HostPortPair& host_port_pair, base::TimeDelta rtt) {
diff --git a/net/nqe/network_quality_estimator.h b/net/nqe/network_quality_estimator.h index e15c0f5..1f1fa80 100644 --- a/net/nqe/network_quality_estimator.h +++ b/net/nqe/network_quality_estimator.h
@@ -282,6 +282,12 @@ // latency. uint32_t GetPeerToPeerConnectionsCountChange() const; + // Forces NetworkQualityEstimator reports + // NetworkChangeNotifier::CONNECTION_WIFI(2) as + // EFFECTIVE_CONNECTION_TYPE_SLOW_2G(2) since EffectiveConnectionType and the + // production receivers doesn't notice Wifi. + void ForceReportWifiAsSlow2GForTesting(); + typedef nqe::internal::Observation Observation; typedef nqe::internal::ObservationBuffer ObservationBuffer; @@ -641,6 +647,8 @@ bool get_network_id_asynchronously_ = false; #endif + bool force_report_wifi_as_slow_2g_for_testing_ = false; + base::WeakPtrFactory<NetworkQualityEstimator> weak_ptr_factory_{this}; };
diff --git a/net/socket/connect_job_factory.cc b/net/socket/connect_job_factory.cc index 6ad4af4..2288f51 100644 --- a/net/socket/connect_job_factory.cc +++ b/net/socket/connect_job_factory.cc
@@ -23,7 +23,6 @@ #include "net/socket/socks_connect_job.h" #include "net/socket/ssl_connect_job.h" #include "net/socket/transport_connect_job.h" -#include "net/socket/websocket_transport_connect_job.h" #include "net/ssl/ssl_config.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -92,9 +91,7 @@ http_proxy_connect_job_factory, std::unique_ptr<SOCKSConnectJob::Factory> socks_connect_job_factory, std::unique_ptr<SSLConnectJob::Factory> ssl_connect_job_factory, - std::unique_ptr<TransportConnectJob::Factory> transport_connect_job_factory, - std::unique_ptr<WebSocketTransportConnectJob::Factory> - websocket_transport_connect_job_factory) + std::unique_ptr<TransportConnectJob::Factory> transport_connect_job_factory) : http_proxy_connect_job_factory_( CreateFactoryIfNull(std::move(http_proxy_connect_job_factory))), socks_connect_job_factory_( @@ -102,9 +99,7 @@ ssl_connect_job_factory_( CreateFactoryIfNull(std::move(ssl_connect_job_factory))), transport_connect_job_factory_( - CreateFactoryIfNull(std::move(transport_connect_job_factory))), - websocket_transport_connect_job_factory_(CreateFactoryIfNull( - std::move(websocket_transport_connect_job_factory))) {} + CreateFactoryIfNull(std::move(transport_connect_job_factory))) {} ConnectJobFactory::~ConnectJobFactory() = default; @@ -253,13 +248,7 @@ auto tcp_params = base::MakeRefCounted<TransportSocketParams>( ToTransportEndpoint(endpoint), network_isolation_key, secure_dns_policy, resolution_callback, no_alpn_protocols); - if (!common_connect_job_params->websocket_endpoint_lock_manager) { - return transport_connect_job_factory_->Create( - request_priority, socket_tag, common_connect_job_params, tcp_params, - delegate, /*net_log=*/nullptr); - } - - return websocket_transport_connect_job_factory_->Create( + return transport_connect_job_factory_->Create( request_priority, socket_tag, common_connect_job_params, tcp_params, delegate, /*net_log=*/nullptr); }
diff --git a/net/socket/connect_job_factory.h b/net/socket/connect_job_factory.h index 98979a1..3c8b1a0b 100644 --- a/net/socket/connect_job_factory.h +++ b/net/socket/connect_job_factory.h
@@ -18,7 +18,6 @@ #include "net/socket/socks_connect_job.h" #include "net/socket/ssl_connect_job.h" #include "net/socket/transport_connect_job.h" -#include "net/socket/websocket_transport_connect_job.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/abseil-cpp/absl/types/variant.h" #include "url/scheme_host_port.h" @@ -53,9 +52,7 @@ nullptr, std::unique_ptr<SSLConnectJob::Factory> ssl_connect_job_factory = nullptr, std::unique_ptr<TransportConnectJob::Factory> - transport_connect_job_factory = nullptr, - std::unique_ptr<WebSocketTransportConnectJob::Factory> - websocket_transport_connect_job_factory = nullptr); + transport_connect_job_factory = nullptr); // Not copyable/movable. Intended for polymorphic use via pointer. ConnectJobFactory(const ConnectJobFactory&) = delete; @@ -121,8 +118,6 @@ std::unique_ptr<SOCKSConnectJob::Factory> socks_connect_job_factory_; std::unique_ptr<SSLConnectJob::Factory> ssl_connect_job_factory_; std::unique_ptr<TransportConnectJob::Factory> transport_connect_job_factory_; - std::unique_ptr<WebSocketTransportConnectJob::Factory> - websocket_transport_connect_job_factory_; // Use a single NetworkIsolationKey for looking up proxy hostnames. Proxies // are typically used across sites, but cached proxy IP addresses don't
diff --git a/net/socket/connect_job_factory_unittest.cc b/net/socket/connect_job_factory_unittest.cc index 4b30081b..60bc865 100644 --- a/net/socket/connect_job_factory_unittest.cc +++ b/net/socket/connect_job_factory_unittest.cc
@@ -25,7 +25,6 @@ #include "net/socket/ssl_connect_job.h" #include "net/socket/transport_connect_job.h" #include "net/socket/websocket_endpoint_lock_manager.h" -#include "net/socket/websocket_transport_connect_job.h" #include "net/ssl/ssl_config.h" #include "net/test/test_with_task_environment.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" @@ -138,32 +137,6 @@ std::vector<scoped_refptr<TransportSocketParams>> params_; }; -// Mock WebSocketTransportConnectJob::Factory that records the `params` used and -// then passes on to a real factory. -class TestWebsocketConnectJobFactory - : public WebSocketTransportConnectJob::Factory { - public: - std::unique_ptr<WebSocketTransportConnectJob> Create( - RequestPriority priority, - const SocketTag& socket_tag, - const CommonConnectJobParams* common_connect_job_params, - const scoped_refptr<TransportSocketParams>& params, - ConnectJob::Delegate* delegate, - const NetLogWithSource* net_log) override { - params_.push_back(params); - return WebSocketTransportConnectJob::Factory::Create( - priority, socket_tag, common_connect_job_params, params, delegate, - net_log); - } - - const std::vector<scoped_refptr<TransportSocketParams>>& params() const { - return params_; - } - - private: - std::vector<scoped_refptr<TransportSocketParams>> params_; -}; - class ConnectJobFactoryTest : public TestWithTaskEnvironment { public: ConnectJobFactoryTest() { @@ -181,14 +154,9 @@ std::make_unique<TestTransportConnectJobFactory>(); transport_job_factory_ = transport_job_factory.get(); - auto websocket_job_factory = - std::make_unique<TestWebsocketConnectJobFactory>(); - websocket_job_factory_ = websocket_job_factory.get(); - factory_ = std::make_unique<ConnectJobFactory>( std::move(http_proxy_job_factory), std::move(socks_job_factory), - std::move(ssl_job_factory), std::move(transport_job_factory), - std::move(websocket_job_factory)); + std::move(ssl_job_factory), std::move(transport_job_factory)); } protected: @@ -197,8 +165,7 @@ return http_proxy_job_factory_->params().size() + socks_job_factory_->params().size() + ssl_job_factory_->params().size() + - transport_job_factory_->params().size() + - websocket_job_factory_->params().size(); + transport_job_factory_->params().size(); } const CommonConnectJobParams common_connect_job_params_{ @@ -222,7 +189,6 @@ raw_ptr<TestSocksConnectJobFactory> socks_job_factory_; raw_ptr<TestSslConnectJobFactory> ssl_job_factory_; raw_ptr<TestTransportConnectJobFactory> transport_job_factory_; - raw_ptr<TestWebsocketConnectJobFactory> websocket_job_factory_; std::unique_ptr<ConnectJobFactory> factory_; }; @@ -582,9 +548,9 @@ &common_connect_job_params, &delegate_); EXPECT_EQ(GetCreationCount(), 1u); - ASSERT_THAT(websocket_job_factory_->params(), testing::SizeIs(1)); + ASSERT_THAT(transport_job_factory_->params(), testing::SizeIs(1)); const TransportSocketParams& params = - *websocket_job_factory_->params().front(); + *transport_job_factory_->params().front(); EXPECT_THAT(params.destination(), testing::VariantWith<url::SchemeHostPort>(kEndpoint)); } @@ -608,9 +574,9 @@ &common_connect_job_params, &delegate_); EXPECT_EQ(GetCreationCount(), 1u); - ASSERT_THAT(websocket_job_factory_->params(), testing::SizeIs(1)); + ASSERT_THAT(transport_job_factory_->params(), testing::SizeIs(1)); const TransportSocketParams& params = - *websocket_job_factory_->params().front(); + *transport_job_factory_->params().front(); EXPECT_THAT(params.destination(), testing::VariantWith<HostPortPair>(kEndpoint)); }
diff --git a/net/socket/socks_connect_job.cc b/net/socket/socks_connect_job.cc index 2c93200..5436afa0d 100644 --- a/net/socket/socks_connect_job.cc +++ b/net/socket/socks_connect_job.cc
@@ -156,9 +156,9 @@ DCHECK(!transport_connect_job_); next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; - transport_connect_job_ = TransportConnectJob::CreateTransportConnectJob( - socks_params_->transport_params(), priority(), socket_tag(), - common_connect_job_params(), this, &net_log()); + transport_connect_job_ = std::make_unique<TransportConnectJob>( + priority(), socket_tag(), common_connect_job_params(), + socks_params_->transport_params(), this, &net_log()); return transport_connect_job_->Connect(); }
diff --git a/net/socket/ssl_connect_job.cc b/net/socket/ssl_connect_job.cc index 24c9eb1..8528080 100644 --- a/net/socket/ssl_connect_job.cc +++ b/net/socket/ssl_connect_job.cc
@@ -30,7 +30,6 @@ #include "net/socket/socks_connect_job.h" #include "net/socket/ssl_client_socket.h" #include "net/socket/transport_connect_job.h" -#include "net/socket/websocket_transport_connect_job.h" #include "net/ssl/ssl_cert_request_info.h" #include "net/ssl/ssl_connection_status_flags.h" #include "net/ssl/ssl_info.h" @@ -276,26 +275,18 @@ DCHECK(!TimerIsRunning()); next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; - if (!common_connect_job_params()->websocket_endpoint_lock_manager) { - // If this is an ECH retry, connect to the same server as before. - absl::optional<TransportConnectJob::EndpointResultOverride> - endpoint_result_override; - if (ech_retry_configs_) { - DCHECK(base::FeatureList::IsEnabled(features::kEncryptedClientHello)); - DCHECK(endpoint_result_); - endpoint_result_override.emplace(*endpoint_result_, dns_aliases_); - } - nested_connect_job_ = std::make_unique<TransportConnectJob>( - priority(), socket_tag(), common_connect_job_params(), - params_->GetDirectConnectionParams(), this, &net_log(), - std::move(endpoint_result_override)); - } else { - // TODO(https://crbug.com/1291352): Support ECH for WebSockets. - DCHECK(!ech_retry_configs_); - nested_connect_job_ = std::make_unique<WebSocketTransportConnectJob>( - priority(), socket_tag(), common_connect_job_params(), - params_->GetDirectConnectionParams(), this, &net_log()); + // If this is an ECH retry, connect to the same server as before. + absl::optional<TransportConnectJob::EndpointResultOverride> + endpoint_result_override; + if (ech_retry_configs_) { + DCHECK(base::FeatureList::IsEnabled(features::kEncryptedClientHello)); + DCHECK(endpoint_result_); + endpoint_result_override.emplace(*endpoint_result_, dns_aliases_); } + nested_connect_job_ = std::make_unique<TransportConnectJob>( + priority(), socket_tag(), common_connect_job_params(), + params_->GetDirectConnectionParams(), this, &net_log(), + std::move(endpoint_result_override)); return nested_connect_job_->Connect(); } @@ -412,8 +403,6 @@ // Overriding the DNS lookup only works for direct connections. We // currently do not support ECH with other connection types. DCHECK_EQ(params_->GetConnectionType(), SSLSocketParams::DIRECT); - // TODO(https://crbug.com/1291352): Support ECH for WebSockets. - DCHECK(!common_connect_job_params()->websocket_endpoint_lock_manager); } }
diff --git a/net/socket/transport_connect_job.cc b/net/socket/transport_connect_job.cc index 196b5ba..8024299 100644 --- a/net/socket/transport_connect_job.cc +++ b/net/socket/transport_connect_job.cc
@@ -4,19 +4,20 @@ #include "net/socket/transport_connect_job.h" -#include <algorithm> #include <memory> #include <utility> #include "base/bind.h" #include "base/check_op.h" -#include "base/compiler_specific.h" #include "base/containers/contains.h" +#include "base/feature_list.h" +#include "base/location.h" +#include "base/logging.h" #include "base/metrics/histogram_macros.h" #include "base/notreached.h" #include "base/stl_util.h" -#include "base/strings/string_util.h" #include "base/threading/thread_task_runner_handle.h" +#include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "base/values.h" #include "net/base/features.h" @@ -26,16 +27,10 @@ #include "net/base/trace_constants.h" #include "net/dns/host_resolver_results.h" #include "net/dns/public/secure_dns_policy.h" -#include "net/log/net_log.h" #include "net/log/net_log_event_type.h" -#include "net/log/net_log_source_type.h" -#include "net/log/net_log_with_source.h" -#include "net/socket/client_socket_factory.h" -#include "net/socket/client_socket_handle.h" -#include "net/socket/socket_performance_watcher.h" -#include "net/socket/socket_performance_watcher_factory.h" -#include "net/socket/tcp_client_socket.h" -#include "net/socket/websocket_transport_connect_job.h" +#include "net/log/net_log_source.h" +#include "net/socket/socket_tag.h" +#include "net/socket/transport_connect_sub_job.h" #include "third_party/abseil-cpp/absl/types/variant.h" #include "url/scheme_host_port.h" #include "url/url_constants.h" @@ -44,16 +39,6 @@ namespace { -// Returns true iff all addresses in |list| are in the IPv6 family. -bool AddressListOnlyContainsIPv6(const AddressList& list) { - DCHECK(!list.empty()); - for (auto iter = list.begin(); iter != list.end(); ++iter) { - if (iter->GetFamily() != ADDRESS_FAMILY_IPV6) - return false; - } - return true; -} - // TODO(crbug.com/1206799): Delete once endpoint usage is converted to using // url::SchemeHostPort when available. HostPortPair ToLegacyDestinationEndpoint( @@ -120,24 +105,6 @@ params, delegate, net_log); } -std::unique_ptr<ConnectJob> TransportConnectJob::CreateTransportConnectJob( - scoped_refptr<TransportSocketParams> transport_client_params, - RequestPriority priority, - const SocketTag& socket_tag, - const CommonConnectJobParams* common_connect_job_params, - ConnectJob::Delegate* delegate, - const NetLogWithSource* net_log) { - if (!common_connect_job_params->websocket_endpoint_lock_manager) { - return std::make_unique<TransportConnectJob>( - priority, socket_tag, common_connect_job_params, - transport_client_params, delegate, net_log); - } - - return std::make_unique<WebSocketTransportConnectJob>( - priority, socket_tag, common_connect_job_params, transport_client_params, - delegate, net_log); -} - TransportConnectJob::EndpointResultOverride::EndpointResultOverride( HostResolverEndpointResult result, std::set<std::string> dns_aliases) @@ -148,12 +115,6 @@ const EndpointResultOverride&) = default; TransportConnectJob::EndpointResultOverride::~EndpointResultOverride() = default; -TransportConnectJob::EndpointResultOverride& -TransportConnectJob::EndpointResultOverride::operator=( - EndpointResultOverride&&) = default; -TransportConnectJob::EndpointResultOverride& -TransportConnectJob::EndpointResultOverride::operator=( - const EndpointResultOverride&) = default; TransportConnectJob::TransportConnectJob( RequestPriority priority, @@ -173,9 +134,6 @@ NetLogEventType::TRANSPORT_CONNECT_JOB_CONNECT), params_(params), next_state_(STATE_NONE) { - // This is only set for WebSockets. - DCHECK(!common_connect_job_params->websocket_endpoint_lock_manager); - if (endpoint_result_override) { has_dns_override_ = true; endpoint_results_ = {std::move(endpoint_result_override->result)}; @@ -187,24 +145,33 @@ } // We don't worry about cancelling the host resolution and TCP connect, since -// ~HostResolver::Request and ~StreamSocket will take care of it. +// ~HostResolver::Request and ~TransportConnectSubJob will take care of it. TransportConnectJob::~TransportConnectJob() = default; LoadState TransportConnectJob::GetLoadState() const { switch (next_state_) { case STATE_RESOLVE_HOST: case STATE_RESOLVE_HOST_COMPLETE: - return LOAD_STATE_RESOLVING_HOST; case STATE_RESOLVE_HOST_CALLBACK_COMPLETE: + return LOAD_STATE_RESOLVING_HOST; case STATE_TRANSPORT_CONNECT: - case STATE_TRANSPORT_CONNECT_COMPLETE: - case STATE_FALLBACK_CONNECT_COMPLETE: - return LOAD_STATE_CONNECTING; + case STATE_TRANSPORT_CONNECT_COMPLETE: { + LoadState load_state = LOAD_STATE_IDLE; + if (ipv6_job_ && ipv6_job_->started()) { + load_state = ipv6_job_->GetLoadState(); + } + // This method should return LOAD_STATE_CONNECTING in preference to + // LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET when possible because "waiting + // for available socket" implies that nothing is happening. + if (ipv4_job_ && ipv4_job_->started() && + load_state != LOAD_STATE_CONNECTING) { + load_state = ipv4_job_->GetLoadState(); + } + return load_state; + } case STATE_NONE: return LOAD_STATE_IDLE; } - NOTREACHED(); - return LOAD_STATE_IDLE; } bool TransportConnectJob::HasEstablishedConnection() const { @@ -227,33 +194,6 @@ return endpoint_results_[current_endpoint_result_]; } -// static -void TransportConnectJob::MakeAddressListStartWithIPv4(AddressList* list) { - for (auto i = list->begin(); i != list->end(); ++i) { - if (i->GetFamily() == ADDRESS_FAMILY_IPV4) { - std::rotate(list->begin(), i, list->end()); - break; - } - } -} - -// static -void TransportConnectJob::HistogramDuration( - const LoadTimingInfo::ConnectTiming& connect_timing) { - DCHECK(!connect_timing.connect_start.is_null()); - DCHECK(!connect_timing.dns_start.is_null()); - base::TimeTicks now = base::TimeTicks::Now(); - base::TimeDelta total_duration = now - connect_timing.dns_start; - UMA_HISTOGRAM_CUSTOM_TIMES("Net.DNS_Resolution_And_TCP_Connection_Latency2", - total_duration, base::Milliseconds(1), - base::Minutes(10), 100); - - base::TimeDelta connect_duration = now - connect_timing.connect_start; - UMA_HISTOGRAM_CUSTOM_TIMES("Net.TCP_Connection_Latency", connect_duration, - base::Milliseconds(1), base::Minutes(10), 100); -} - -// static base::TimeDelta TransportConnectJob::ConnectionTimeout() { // TODO(eroman): The use of this constant needs to be re-evaluated. The time // needed for TCPClientSocketXXX::Connect() can be arbitrarily long, since @@ -294,10 +234,7 @@ rv = DoTransportConnect(); break; case STATE_TRANSPORT_CONNECT_COMPLETE: - rv = DoTransportConnectComplete(/*is_fallback=*/false, rv); - break; - case STATE_FALLBACK_CONNECT_COMPLETE: - rv = DoTransportConnectComplete(/*is_fallback=*/true, rv); + rv = DoTransportConnectComplete(rv); break; default: NOTREACHED(); @@ -423,65 +360,77 @@ int TransportConnectJob::DoTransportConnect() { next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; - AddressList addresses = GetCurrentAddressList(); - // Create a |SocketPerformanceWatcher|, and pass the ownership. - std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher; - if (socket_performance_watcher_factory()) { - socket_performance_watcher = - socket_performance_watcher_factory()->CreateSocketPerformanceWatcher( - SocketPerformanceWatcherFactory::PROTOCOL_TCP, addresses); + const HostResolverEndpointResult& endpoint = + GetEndpointResultForCurrentSubJobs(); + std::vector<IPEndPoint> ipv4_addresses, ipv6_addresses; + for (const auto& ip_endpoint : endpoint.ip_endpoints) { + switch (ip_endpoint.GetFamily()) { + case ADDRESS_FAMILY_IPV4: + ipv4_addresses.push_back(ip_endpoint); + break; + + case ADDRESS_FAMILY_IPV6: + ipv6_addresses.push_back(ip_endpoint); + break; + + default: + DVLOG(1) << "Unexpected ADDRESS_FAMILY: " << ip_endpoint.GetFamily(); + break; + } } - transport_socket_ = client_socket_factory()->CreateTransportClientSocket( - addresses, std::move(socket_performance_watcher), - network_quality_estimator(), net_log().net_log(), net_log().source()); - // If the list contains IPv6 and IPv4 addresses, and the first address - // is IPv6, the IPv4 addresses will be tried as fallback addresses, per - // "Happy Eyeballs" (RFC 6555). - bool try_ipv6_connect_with_ipv4_fallback = - addresses.front().GetFamily() == ADDRESS_FAMILY_IPV6 && - !AddressListOnlyContainsIPv6(addresses); - - transport_socket_->ApplySocketTag(socket_tag()); - - int rv = transport_socket_->Connect(base::BindOnce( - &TransportConnectJob::OnIOComplete, base::Unretained(this))); - if (rv == ERR_IO_PENDING && try_ipv6_connect_with_ipv4_fallback) { - fallback_timer_.Start(FROM_HERE, kIPv6FallbackTime, this, - &TransportConnectJob::OnIPv6FallbackTimerComplete); + if (!ipv4_addresses.empty()) { + ipv4_job_ = std::make_unique<TransportConnectSubJob>( + std::move(ipv4_addresses), this, SUB_JOB_IPV4); } - return rv; + + if (!ipv6_addresses.empty()) { + ipv6_job_ = std::make_unique<TransportConnectSubJob>( + std::move(ipv6_addresses), this, SUB_JOB_IPV6); + int result = ipv6_job_->Start(); + if (result != ERR_IO_PENDING) + return HandleSubJobComplete(result, ipv6_job_.get()); + if (ipv4_job_) { + // This use of base::Unretained is safe because |fallback_timer_| is + // owned by this object. + fallback_timer_.Start( + FROM_HERE, kIPv6FallbackTime, + base::BindOnce(&TransportConnectJob::StartIPv4JobAsync, + base::Unretained(this))); + } + return ERR_IO_PENDING; + } + + DCHECK(!ipv6_job_); + DCHECK(ipv4_job_); + int result = ipv4_job_->Start(); + if (result != ERR_IO_PENDING) + return HandleSubJobComplete(result, ipv4_job_.get()); + return ERR_IO_PENDING; } -int TransportConnectJob::DoTransportConnectComplete(bool is_fallback, - int result) { - // Either the main socket or the fallback one completed. - std::unique_ptr<TransportClientSocket>& completed_socket = - is_fallback ? fallback_transport_socket_ : transport_socket_; - std::unique_ptr<TransportClientSocket>& other_socket = - is_fallback ? transport_socket_ : fallback_transport_socket_; - DCHECK(completed_socket); - // Save the connection attempts from each socket. On failure, these will be - // returned via |GetAdditionalErrorState|. - SaveConnectionAttempts(*completed_socket); - if (other_socket) { - SaveConnectionAttempts(*other_socket); - } - if (is_fallback) { - connect_timing_.connect_start = fallback_connect_start_time_; - } - - // Cancel any completion events from the callback timer and other socket. +int TransportConnectJob::DoTransportConnectComplete(int result) { + // Make sure nothing else calls back into this object. + ipv4_job_.reset(); + ipv6_job_.reset(); fallback_timer_.Stop(); - other_socket.reset(); if (result == OK) { - HistogramDuration(connect_timing_); - SetSocket(std::move(completed_socket), dns_aliases_); - } else { - completed_socket.reset(); + DCHECK(!connect_timing_.connect_start.is_null()); + DCHECK(!connect_timing_.dns_start.is_null()); + // `HandleSubJobComplete` should have called `SetSocket`. + DCHECK(socket()); + base::TimeTicks now = base::TimeTicks::Now(); + base::TimeDelta total_duration = now - connect_timing_.dns_start; + UMA_HISTOGRAM_CUSTOM_TIMES("Net.DNS_Resolution_And_TCP_Connection_Latency2", + total_duration, base::Milliseconds(1), + base::Minutes(10), 100); + base::TimeDelta connect_duration = now - connect_timing_.connect_start; + UMA_HISTOGRAM_CUSTOM_TIMES("Net.TCP_Connection_Latency", connect_duration, + base::Milliseconds(1), base::Minutes(10), 100); + } else { // Don't try the next route if entering suspend mode. if (result != ERR_NETWORK_IO_SUSPENDED) { // If there is another endpoint available, try it. @@ -496,49 +445,58 @@ return result; } -void TransportConnectJob::OnIPv6FallbackTimerComplete() { - // The timer should only fire while we're waiting for the main connect to - // succeed. - if (next_state_ != STATE_TRANSPORT_CONNECT_COMPLETE) { - NOTREACHED(); - return; +int TransportConnectJob::HandleSubJobComplete(int result, + TransportConnectSubJob* job) { + DCHECK_NE(result, ERR_IO_PENDING); + if (result == OK) { + SetSocket(job->PassSocket(), dns_aliases_); + return result; } - DCHECK(!fallback_transport_socket_.get()); - - AddressList fallback_addresses = GetCurrentAddressList(); - MakeAddressListStartWithIPv4(&fallback_addresses); - - // Create a |SocketPerformanceWatcher|, and pass the ownership. - std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher; - if (socket_performance_watcher_factory()) { - socket_performance_watcher = - socket_performance_watcher_factory()->CreateSocketPerformanceWatcher( - SocketPerformanceWatcherFactory::PROTOCOL_TCP, fallback_addresses); + if (result == ERR_NETWORK_IO_SUSPENDED) { + // Don't try other jobs if entering suspend mode. + return result; } - fallback_transport_socket_ = - client_socket_factory()->CreateTransportClientSocket( - fallback_addresses, std::move(socket_performance_watcher), - network_quality_estimator(), net_log().net_log(), net_log().source()); - fallback_connect_start_time_ = base::TimeTicks::Now(); - fallback_transport_socket_->ApplySocketTag(socket_tag()); - int rv = fallback_transport_socket_->Connect(base::BindOnce( - base::BindOnce(&TransportConnectJob::OnIPv6FallbackConnectComplete, - base::Unretained(this)))); - if (rv != ERR_IO_PENDING) - OnIPv6FallbackConnectComplete(rv); + switch (job->type()) { + case SUB_JOB_IPV4: + ipv4_job_.reset(); + break; + + case SUB_JOB_IPV6: + ipv6_job_.reset(); + // Start the other job, rather than wait for the fallback timer. + if (ipv4_job_ && !ipv4_job_->started()) { + fallback_timer_.Stop(); + result = ipv4_job_->Start(); + if (result != ERR_IO_PENDING) { + return HandleSubJobComplete(result, ipv4_job_.get()); + } + } + break; + } + + if (ipv4_job_ || ipv6_job_) { + // Wait for the other job to complete, rather than reporting |result|. + return ERR_IO_PENDING; + } + + return result; } -void TransportConnectJob::OnIPv6FallbackConnectComplete(int result) { - // This should only happen when we're waiting for the main connect to succeed. - if (next_state_ != STATE_TRANSPORT_CONNECT_COMPLETE) { - NOTREACHED(); - return; +void TransportConnectJob::OnSubJobComplete(int result, + TransportConnectSubJob* job) { + result = HandleSubJobComplete(result, job); + if (result != ERR_IO_PENDING) { + OnIOComplete(result); } +} - next_state_ = STATE_FALLBACK_CONNECT_COMPLETE; - OnIOComplete(result); +void TransportConnectJob::StartIPv4JobAsync() { + DCHECK(ipv4_job_); + int result = ipv4_job_->Start(); + if (result != ERR_IO_PENDING) + OnSubJobComplete(result, ipv4_job_.get()); } int TransportConnectJob::ConnectInternal() { @@ -605,23 +563,10 @@ return false; } -AddressList TransportConnectJob::GetCurrentAddressList() const { +const HostResolverEndpointResult& +TransportConnectJob::GetEndpointResultForCurrentSubJobs() const { CHECK_LT(current_endpoint_result_, endpoint_results_.size()); - const HostResolverEndpointResult& endpoint_result = - endpoint_results_[current_endpoint_result_]; - // TODO(crbug.com/126134): `HostResolverEndpointResult` has a - // `vector<IPEndPoint>`, while all these classes expect an `AddressList`. - // Align these after DNS aliases are fully moved out of `AddressList`. - // https://crbug.com/1291352 will also likely move the `AddressList` iteration - // out of `TCPClientSocket`, which will also avoid the conversion. - return AddressList(endpoint_result.ip_endpoints); -} - -void TransportConnectJob::SaveConnectionAttempts( - const TransportClientSocket& socket) { - ConnectionAttempts attempts = socket.GetConnectionAttempts(); - connection_attempts_.insert(connection_attempts_.end(), attempts.begin(), - attempts.end()); + return endpoint_results_[current_endpoint_result_]; } } // namespace net
diff --git a/net/socket/transport_connect_job.h b/net/socket/transport_connect_job.h index a2a06b3..cb97bcb 100644 --- a/net/socket/transport_connect_job.h +++ b/net/socket/transport_connect_job.h
@@ -10,7 +10,6 @@ #include <string> #include <vector> -#include "base/callback.h" #include "base/containers/flat_set.h" #include "base/containers/span.h" #include "base/memory/ref_counted.h" @@ -26,7 +25,6 @@ #include "net/dns/public/secure_dns_policy.h" #include "net/socket/connect_job.h" #include "net/socket/connection_attempts.h" -#include "net/socket/socket_tag.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/abseil-cpp/absl/types/variant.h" #include "url/scheme_host_port.h" @@ -35,7 +33,7 @@ class NetLogWithSource; class SocketTag; -class TransportClientSocket; +class TransportConnectSubJob; class NET_EXPORT_PRIVATE TransportSocketParams : public base::RefCounted<TransportSocketParams> { @@ -117,26 +115,14 @@ // they don't synchronize. static constexpr base::TimeDelta kIPv6FallbackTime = base::Milliseconds(300); - // Creates a TransportConnectJob or WebSocketTransportConnectJob, depending on - // whether or not |common_connect_job_params.web_socket_endpoint_lock_manager| - // is nullptr. - // TODO(mmenke): Merge those two ConnectJob classes, and remove this method. - static std::unique_ptr<ConnectJob> CreateTransportConnectJob( - scoped_refptr<TransportSocketParams> transport_client_params, - RequestPriority priority, - const SocketTag& socket_tag, - const CommonConnectJobParams* common_connect_job_params, - ConnectJob::Delegate* delegate, - const NetLogWithSource* net_log); - struct NET_EXPORT_PRIVATE EndpointResultOverride { EndpointResultOverride(HostResolverEndpointResult result, std::set<std::string> dns_aliases); EndpointResultOverride(EndpointResultOverride&&); EndpointResultOverride(const EndpointResultOverride&); ~EndpointResultOverride(); - EndpointResultOverride& operator=(EndpointResultOverride&&); - EndpointResultOverride& operator=(const EndpointResultOverride&); + EndpointResultOverride& operator=(EndpointResultOverride&&) = default; + EndpointResultOverride& operator=(const EndpointResultOverride&) = default; HostResolverEndpointResult result; std::set<std::string> dns_aliases; @@ -164,33 +150,24 @@ absl::optional<HostResolverEndpointResult> GetHostResolverEndpointResult() const override; - // Skips DNS resolution and instead connects to `endpoint_result`, reporting - // `dns_aliases` as the list of DNS aliases. Must be called before `Connect`. - void SetDnsResultOverride(const HostResolverEndpointResult& endpoint_result, - const std::set<std::string>& dns_aliases); - - // Rolls |addrlist| forward until the first IPv4 address, if any. - // WARNING: this method should only be used to implement the prefer-IPv4 hack. - static void MakeAddressListStartWithIPv4(AddressList* addrlist); - - // Record the histograms Net.DNS_Resolution_And_TCP_Connection_Latency2 and - // Net.TCP_Connection_Latency and return the connect duration. - static void HistogramDuration( - const LoadTimingInfo::ConnectTiming& connect_timing); - static base::TimeDelta ConnectionTimeout(); private: + friend class TransportConnectSubJob; + enum State { STATE_RESOLVE_HOST, STATE_RESOLVE_HOST_COMPLETE, STATE_RESOLVE_HOST_CALLBACK_COMPLETE, STATE_TRANSPORT_CONNECT, STATE_TRANSPORT_CONNECT_COMPLETE, - STATE_FALLBACK_CONNECT_COMPLETE, STATE_NONE, }; + // Although it is not strictly necessary, it makes the code simpler if each + // subjob knows what type it is. + enum SubJobType { SUB_JOB_IPV4, SUB_JOB_IPV6 }; + void OnIOComplete(int result); int DoLoop(int result); @@ -198,19 +175,26 @@ int DoResolveHostComplete(int result); int DoResolveHostCallbackComplete(); int DoTransportConnect(); - int DoTransportConnectComplete(bool is_fallback, int result); + int DoTransportConnectComplete(int result); - // Not part of the state machine. - void OnIPv6FallbackTimerComplete(); - void OnIPv6FallbackConnectComplete(int rv); + // Helper method called called when a SubJob completes, synchronously + // or asynchronously. Returns `ERR_IO_PENDING` if there is more work to + // do and another error if completed. It's up to the caller to manage + // advancing `DoLoop` if a value other than `ERR_IO_PENDING` is returned. + int HandleSubJobComplete(int result, TransportConnectSubJob* job); + // Called back from a SubJob when it completes. Invokes `OnIOComplete`, + // re-entering `DoLoop`, if there is no more work to do. Must not + // be called from within `DoLoop`. + void OnSubJobComplete(int result, TransportConnectSubJob* job); + + // Called from |fallback_timer_|. + void StartIPv4JobAsync(); // Begins the host resolution and the TCP connect. Returns OK on success // and ERR_IO_PENDING if it cannot immediately service the request. // Otherwise, it returns a net error code. int ConnectInternal() override; - // If host resolution is currently underway, change the priority of the host - // resolver request. void ChangePriorityInternal(RequestPriority priority) override; // Returns whether the client should be SVCB-optional when connecting to @@ -223,13 +207,8 @@ bool IsEndpointResultUsable(const HostResolverEndpointResult& result, bool svcb_optional) const; - // Returns an `AddressList` containing the IP endpoints for the current route. - // May only be called if the current route is usable for this connection. - AddressList GetCurrentAddressList() const; - - // Appends connection attempts from `socket` to `connection_attempts_`. Should - // be called when discarding a failed socket. - void SaveConnectionAttempts(const TransportClientSocket& socket); + // Returns the `HostResolverEndpointResult` for the current subjobs. + const HostResolverEndpointResult& GetEndpointResultForCurrentSubJobs() const; scoped_refptr<TransportSocketParams> params_; std::unique_ptr<HostResolver::ResolveHostRequest> request_; @@ -240,19 +219,17 @@ State next_state_; - std::unique_ptr<TransportClientSocket> transport_socket_; + // The addresses are divided into IPv4 and IPv6, which are performed partially + // in parallel. If the list of IPv6 addresses is non-empty, then the IPv6 jobs + // go first, followed after `kIPv6FallbackTime` by the IPv4 addresses. The + // first sub-job to establish a connection wins. If one sub-job fails, the + // other one is launched if needed, and we wait for it to complete. + std::unique_ptr<TransportConnectSubJob> ipv4_job_; + std::unique_ptr<TransportConnectSubJob> ipv6_job_; - std::unique_ptr<TransportClientSocket> fallback_transport_socket_; - base::TimeTicks fallback_connect_start_time_; base::OneShotTimer fallback_timer_; ResolveErrorInfo resolve_error_info_; - - // Used in the failure case to save connection attempts made on the main and - // fallback sockets and pass them on in |GetAdditionalErrorState|. (In the - // success case, connection attempts are passed through the returned socket; - // attempts are copied from the other socket, if one exists, into it before - // it is returned.) ConnectionAttempts connection_attempts_; base::WeakPtrFactory<TransportConnectJob> weak_ptr_factory_{this};
diff --git a/net/socket/transport_connect_job_unittest.cc b/net/socket/transport_connect_job_unittest.cc index c866e0a..a30b1195 100644 --- a/net/socket/transport_connect_job_unittest.cc +++ b/net/socket/transport_connect_job_unittest.cc
@@ -90,75 +90,6 @@ const CommonConnectJobParams common_connect_job_params_; }; -TEST_F(TransportConnectJobTest, MakeAddrListStartWithIPv4) { - IPEndPoint addrlist_v4_1(IPAddress(192, 168, 1, 1), 80); - IPEndPoint addrlist_v4_2(IPAddress(192, 168, 1, 2), 80); - IPAddress ip_address; - ASSERT_TRUE(ip_address.AssignFromIPLiteral("2001:4860:b006::64")); - IPEndPoint addrlist_v6_1(ip_address, 80); - ASSERT_TRUE(ip_address.AssignFromIPLiteral("2001:4860:b006::66")); - IPEndPoint addrlist_v6_2(ip_address, 80); - - AddressList addrlist; - - // Test 1: IPv4 only. Expect no change. - addrlist.clear(); - addrlist.push_back(addrlist_v4_1); - addrlist.push_back(addrlist_v4_2); - TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist); - ASSERT_EQ(2u, addrlist.size()); - EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[0].GetFamily()); - EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[1].GetFamily()); - - // Test 2: IPv6 only. Expect no change. - addrlist.clear(); - addrlist.push_back(addrlist_v6_1); - addrlist.push_back(addrlist_v6_2); - TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist); - ASSERT_EQ(2u, addrlist.size()); - EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[0].GetFamily()); - EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[1].GetFamily()); - - // Test 3: IPv4 then IPv6. Expect no change. - addrlist.clear(); - addrlist.push_back(addrlist_v4_1); - addrlist.push_back(addrlist_v4_2); - addrlist.push_back(addrlist_v6_1); - addrlist.push_back(addrlist_v6_2); - TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist); - ASSERT_EQ(4u, addrlist.size()); - EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[0].GetFamily()); - EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[1].GetFamily()); - EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[2].GetFamily()); - EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[3].GetFamily()); - - // Test 4: IPv6, IPv4, IPv6, IPv4. Expect first IPv6 moved to the end. - addrlist.clear(); - addrlist.push_back(addrlist_v6_1); - addrlist.push_back(addrlist_v4_1); - addrlist.push_back(addrlist_v6_2); - addrlist.push_back(addrlist_v4_2); - TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist); - ASSERT_EQ(4u, addrlist.size()); - EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[0].GetFamily()); - EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[1].GetFamily()); - EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[2].GetFamily()); - EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[3].GetFamily()); - - // Test 5: IPv6, IPv6, IPv4, IPv4. Expect first two IPv6's moved to the end. - addrlist.clear(); - addrlist.push_back(addrlist_v6_1); - addrlist.push_back(addrlist_v6_2); - addrlist.push_back(addrlist_v4_1); - addrlist.push_back(addrlist_v4_2); - TransportConnectJob::MakeAddressListStartWithIPv4(&addrlist); - ASSERT_EQ(4u, addrlist.size()); - EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[0].GetFamily()); - EXPECT_EQ(ADDRESS_FAMILY_IPV4, addrlist[1].GetFamily()); - EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[2].GetFamily()); - EXPECT_EQ(ADDRESS_FAMILY_IPV6, addrlist[3].GetFamily()); -} - TEST_F(TransportConnectJobTest, HostResolutionFailure) { host_resolver_.rules()->AddSimulatedTimeoutFailure(kHostName); @@ -281,6 +212,34 @@ } } +TEST_F(TransportConnectJobTest, LoadState) { + client_socket_factory_.set_default_client_socket_type( + MockTransportClientSocketFactory::Type::kStalled); + host_resolver_.set_ondemand_mode(true); + host_resolver_.rules()->AddIPLiteralRule(kHostName, "1:abcd::3:4:ff,1.1.1.1", + std::string()); + + TestConnectJobDelegate test_delegate; + TransportConnectJob transport_connect_job( + DEFAULT_PRIORITY, SocketTag(), &common_connect_job_params_, + DefaultParams(), &test_delegate, /*net_log=*/nullptr); + EXPECT_THAT(transport_connect_job.Connect(), test::IsError(ERR_IO_PENDING)); + + // The job is initially waiting on DNS. + EXPECT_EQ(transport_connect_job.GetLoadState(), LOAD_STATE_RESOLVING_HOST); + + // Complete DNS. It is now waiting on a TCP connection. + host_resolver_.ResolveOnlyRequestNow(); + RunUntilIdle(); + EXPECT_EQ(transport_connect_job.GetLoadState(), LOAD_STATE_CONNECTING); + + // Wait for the IPv4 job to start. The job is still waiting on a TCP + // connection. + FastForwardBy(TransportConnectJob::kIPv6FallbackTime + + base::Milliseconds(50)); + EXPECT_EQ(transport_connect_job.GetLoadState(), LOAD_STATE_CONNECTING); +} + // TODO(crbug.com/1206799): Set up `host_resolver_` to require the expected // scheme. TEST_F(TransportConnectJobTest, HandlesHttpsEndpoint) { @@ -334,23 +293,24 @@ // socket which finishes first. TEST_F(TransportConnectJobTest, IPv6FallbackSocketIPv4FinishesFirst) { MockTransportClientSocketFactory::Rule rules[] = { - // This is the IPv6-preferring socket. It stalls, but presents one failed - // connection attempt on GetConnectionAttempts. + // The first IPv6 attempt fails. MockTransportClientSocketFactory::Rule( - MockTransportClientSocketFactory::Type::kStalledFailing, - std::vector{IPEndPoint(ParseIP("2:abcd::3:4:ff"), 80), - IPEndPoint(ParseIP("2.2.2.2"), 80)}), - // This is the IPv4-preferring socket. + MockTransportClientSocketFactory::Type::kFailing, + std::vector{IPEndPoint(ParseIP("1:abcd::3:4:ff"), 80)}), + // The second IPv6 attempt stalls. + MockTransportClientSocketFactory::Rule( + MockTransportClientSocketFactory::Type::kStalled, + std::vector{IPEndPoint(ParseIP("2:abcd::3:4:ff"), 80)}), + // After a timeout, we try the IPv4 address. MockTransportClientSocketFactory::Rule( MockTransportClientSocketFactory::Type::kPending, - std::vector{IPEndPoint(ParseIP("2.2.2.2"), 80), - IPEndPoint(ParseIP("2:abcd::3:4:ff"), 80)})}; + std::vector{IPEndPoint(ParseIP("2.2.2.2"), 80)})}; client_socket_factory_.SetRules(rules); - // Resolve an AddressList with a IPv6 address first and then a IPv4 address. - host_resolver_.rules()->AddIPLiteralRule(kHostName, "2:abcd::3:4:ff,2.2.2.2", - std::string()); + // Resolve an AddressList with two IPv6 addresses and then a IPv4 address. + host_resolver_.rules()->AddIPLiteralRule( + kHostName, "1:abcd::3:4:ff,2:abcd::3:4:ff,2.2.2.2", std::string()); TestConnectJobDelegate test_delegate; TransportConnectJob transport_connect_job( @@ -363,13 +323,13 @@ test_delegate.socket()->GetLocalAddress(&endpoint); EXPECT_TRUE(endpoint.address().IsIPv4()); - // Check that the failed connection attempt on the main socket is collected. + // Check that the failed connection attempt is collected. ConnectionAttempts attempts = transport_connect_job.GetConnectionAttempts(); ASSERT_EQ(1u, attempts.size()); EXPECT_THAT(attempts[0].result, test::IsError(ERR_CONNECTION_FAILED)); - EXPECT_TRUE(attempts[0].endpoint.address().IsIPv6()); + EXPECT_EQ(attempts[0].endpoint, IPEndPoint(ParseIP("1:abcd::3:4:ff"), 80)); - EXPECT_EQ(2, client_socket_factory_.allocation_count()); + EXPECT_EQ(3, client_socket_factory_.allocation_count()); } // Test the case of the IPv6 address being slow, thus falling back to trying to @@ -377,25 +337,26 @@ // finish first. TEST_F(TransportConnectJobTest, IPv6FallbackSocketIPv6FinishesFirst) { MockTransportClientSocketFactory::Rule rules[] = { - // This is the IPv6 socket. + // The first IPv6 attempt ultimately succeeds, but is delayed. MockTransportClientSocketFactory::Rule( MockTransportClientSocketFactory::Type::kDelayed, - std::vector{IPEndPoint(ParseIP("2:abcd::3:4:ff"), 80), - IPEndPoint(ParseIP("2.2.2.2"), 80)}), - // This is the IPv4 socket. It stalls, but presents one failed connection - // attempt on GetConnectionAttempts. + std::vector{IPEndPoint(ParseIP("2:abcd::3:4:ff"), 80)}), + // The first IPv4 attempt fails. MockTransportClientSocketFactory::Rule( - MockTransportClientSocketFactory::Type::kStalledFailing, - std::vector{IPEndPoint(ParseIP("2.2.2.2"), 80), - IPEndPoint(ParseIP("2:abcd::3:4:ff"), 80)})}; + MockTransportClientSocketFactory::Type::kFailing, + std::vector{IPEndPoint(ParseIP("2.2.2.2"), 80)}), + // The second IPv4 attempt stalls. + MockTransportClientSocketFactory::Rule( + MockTransportClientSocketFactory::Type::kStalled, + std::vector{IPEndPoint(ParseIP("3.3.3.3"), 80)})}; client_socket_factory_.SetRules(rules); client_socket_factory_.set_delay(TransportConnectJob::kIPv6FallbackTime + base::Milliseconds(50)); // Resolve an AddressList with a IPv6 address first and then a IPv4 address. - host_resolver_.rules()->AddIPLiteralRule(kHostName, "2:abcd::3:4:ff,2.2.2.2", - std::string()); + host_resolver_.rules()->AddIPLiteralRule( + kHostName, "2:abcd::3:4:ff,2.2.2.2,3.3.3.3", std::string()); TestConnectJobDelegate test_delegate; TransportConnectJob transport_connect_job( @@ -413,9 +374,9 @@ ConnectionAttempts attempts = transport_connect_job.GetConnectionAttempts(); ASSERT_EQ(1u, attempts.size()); EXPECT_THAT(attempts[0].result, test::IsError(ERR_CONNECTION_FAILED)); - EXPECT_TRUE(attempts[0].endpoint.address().IsIPv4()); + EXPECT_EQ(attempts[0].endpoint, IPEndPoint(ParseIP("2.2.2.2"), 80)); - EXPECT_EQ(2, client_socket_factory_.allocation_count()); + EXPECT_EQ(3, client_socket_factory_.allocation_count()); } TEST_F(TransportConnectJobTest, IPv6NoIPv4AddressesToFallbackTo) { @@ -520,10 +481,10 @@ endpoint.metadata.supported_protocol_alpns = {"h2"}; host_resolver_.rules()->AddRule(kHostName, std::vector{endpoint}); + // The first access succeeds. MockTransportClientSocketFactory::Rule rule( MockTransportClientSocketFactory::Type::kSynchronous, - std::vector{IPEndPoint(ParseIP("1::"), 8443), - IPEndPoint(ParseIP("1.1.1.1"), 8443)}); + std::vector{IPEndPoint(ParseIP("1::"), 8443)}); client_socket_factory_.SetRules(base::make_span(&rule, 1)); TestConnectJobDelegate test_delegate; @@ -559,15 +520,18 @@ host_resolver_.rules()->AddRule(kHostName, endpoints); MockTransportClientSocketFactory::Rule rules[] = { - // `endpoints[0]`'s IPv6-prefering socket. + // `endpoints[0]`'s addresses each fail. MockTransportClientSocketFactory::Rule( MockTransportClientSocketFactory::Type::kFailing, - endpoints[0].ip_endpoints), + std::vector{endpoints[0].ip_endpoints[0]}), + MockTransportClientSocketFactory::Rule( + MockTransportClientSocketFactory::Type::kFailing, + std::vector{endpoints[0].ip_endpoints[1]}), // `endpoints[1]` is skipped because the ALPN is not compatible. - // `endpoints[2]`'s IPv6-preferring socket. + // `endpoints[2]`'s first address succeeds. MockTransportClientSocketFactory::Rule( MockTransportClientSocketFactory::Type::kSynchronous, - endpoints[2].ip_endpoints), + std::vector{endpoints[2].ip_endpoints[0]}), }; client_socket_factory_.SetRules(rules); @@ -608,33 +572,36 @@ std::vector{endpoint1, endpoint2, endpoint3}); MockTransportClientSocketFactory::Rule rules[] = { - // `endpoint1`'s IPv6-prefering socket. + // `endpoint1`'s IPv6 address fails, but takes long enough that the IPv4 + // fallback runs. + // + // TODO(davidben): If the network is such that IPv6 connection attempts + // always stall, we will never try `endpoint2`. Should Happy Eyeballs + // logic happen before HTTPS RR. Or perhaps we should implement a more + // Happy-Eyeballs-v2-like strategy. MockTransportClientSocketFactory::Rule( - MockTransportClientSocketFactory::Type::kStalled, - std::vector{IPEndPoint(ParseIP("1::"), 8441), - IPEndPoint(ParseIP("1.1.1.1"), 8441)}), + MockTransportClientSocketFactory::Type::kDelayedFailing, + std::vector{IPEndPoint(ParseIP("1::"), 8441)}), - // `endpoint1`'s IPv4-prefering socket. + // `endpoint1`'s IPv4 address fails immediately. MockTransportClientSocketFactory::Rule( MockTransportClientSocketFactory::Type::kFailing, - std::vector{IPEndPoint(ParseIP("1.1.1.1"), 8441), - IPEndPoint(ParseIP("1::"), 8441)}), + std::vector{IPEndPoint(ParseIP("1.1.1.1"), 8441)}), // `endpoint2` is skipped because the ALPN is not compatible. - // `endpoint3`'s IPv6-preferring socket. + // `endpoint3`'s IPv6 address never completes. MockTransportClientSocketFactory::Rule( MockTransportClientSocketFactory::Type::kStalled, - std::vector{IPEndPoint(ParseIP("3::"), 443), - IPEndPoint(ParseIP("3.3.3.3"), 443)}), - // `endpoint3`'s IPv4-preferring socket. + std::vector{IPEndPoint(ParseIP("3::"), 443)}), + // `endpoint3`'s IPv4 address succeeds. MockTransportClientSocketFactory::Rule( MockTransportClientSocketFactory::Type::kSynchronous, - std::vector{IPEndPoint(ParseIP("3.3.3.3"), 443), - IPEndPoint(ParseIP("3::"), 443)}), + std::vector{IPEndPoint(ParseIP("3.3.3.3"), 443)}), }; - client_socket_factory_.SetRules(rules); + client_socket_factory_.set_delay(TransportConnectJob::kIPv6FallbackTime + + base::Milliseconds(50)); TestConnectJobDelegate test_delegate; TransportConnectJob transport_connect_job( @@ -702,10 +669,10 @@ IPEndPoint(ParseIP("3.3.3.3"), 80)}; host_resolver_.rules()->AddRule(kHostName, endpoints); - // `endpoints[2]`'s IPv6-preferring socket. + // `endpoints[2]`'s first address succeeds. MockTransportClientSocketFactory::Rule rule( MockTransportClientSocketFactory::Type::kSynchronous, - endpoints[2].ip_endpoints); + std::vector{endpoints[2].ip_endpoints[0]}); client_socket_factory_.SetRules(base::make_span(&rule, 1)); // Use `DefaultParams()`, an http scheme. That it is http is not very @@ -741,15 +708,21 @@ host_resolver_.rules()->AddRule(kHostName, endpoints); MockTransportClientSocketFactory::Rule rules[] = { - // `endpoints[0]`'s IPv6-prefering socket. + // `endpoints[0]`'s addresses each fail. MockTransportClientSocketFactory::Rule( MockTransportClientSocketFactory::Type::kFailing, - endpoints[0].ip_endpoints), + std::vector{endpoints[0].ip_endpoints[0]}), + MockTransportClientSocketFactory::Rule( + MockTransportClientSocketFactory::Type::kFailing, + std::vector{endpoints[0].ip_endpoints[1]}), // `endpoints[1]` is skipped because the ALPN is not compatible. - // `endpoints[2]`'s IPv6-preferring socket. + // `endpoints[2]`'s addresses each fail. MockTransportClientSocketFactory::Rule( MockTransportClientSocketFactory::Type::kFailing, - endpoints[2].ip_endpoints), + std::vector{endpoints[2].ip_endpoints[0]}), + MockTransportClientSocketFactory::Rule( + MockTransportClientSocketFactory::Type::kFailing, + std::vector{endpoints[2].ip_endpoints[1]}), }; client_socket_factory_.SetRules(rules); @@ -813,10 +786,13 @@ host_resolver_.rules()->AddRule(kHostName, endpoints); MockTransportClientSocketFactory::Rule rules[] = { - // `endpoints[0]`'s IPv6-prefering socket. + // `endpoints[0]`'s addresses each fail. MockTransportClientSocketFactory::Rule( MockTransportClientSocketFactory::Type::kFailing, - endpoints[0].ip_endpoints), + std::vector{endpoints[0].ip_endpoints[0]}), + MockTransportClientSocketFactory::Rule( + MockTransportClientSocketFactory::Type::kFailing, + std::vector{endpoints[0].ip_endpoints[1]}), // `endpoints[1]` is skipped because the ALPN is not compatible. }; @@ -1073,21 +1049,28 @@ host_resolver_.rules()->AddRule(kHostName, endpoints); MockTransportClientSocketFactory::Rule rules[] = { - // `endpoints[0]`'s IPv6-prefering socket. + // First, try `endpoints[0]`'s addresses. MockTransportClientSocketFactory::Rule( MockTransportClientSocketFactory::Type::kFailing, - endpoints[0].ip_endpoints), + std::vector{IPEndPoint(ParseIP("1::"), 443)}), + MockTransportClientSocketFactory::Rule( + MockTransportClientSocketFactory::Type::kFailing, + std::vector{IPEndPoint(ParseIP("1.1.1.1"), 443)}), // `endpoints[1]` is unusable, so it is ignored, including for purposes of // duplicate endpoints. // Only new IP endpoints from `endpoints[2]` should be considered. Note - // different ports count as different. + // different ports count as different endpoints. MockTransportClientSocketFactory::Rule( MockTransportClientSocketFactory::Type::kFailing, - std::vector{IPEndPoint(ParseIP("1::"), 444), - IPEndPoint(ParseIP("2::"), 443), - IPEndPoint(ParseIP("2.2.2.2"), 443)}), + std::vector{IPEndPoint(ParseIP("1::"), 444)}), + MockTransportClientSocketFactory::Rule( + MockTransportClientSocketFactory::Type::kFailing, + std::vector{IPEndPoint(ParseIP("2::"), 443)}), + MockTransportClientSocketFactory::Rule( + MockTransportClientSocketFactory::Type::kFailing, + std::vector{IPEndPoint(ParseIP("2.2.2.2"), 443)}), // `endpoints[3]` only contains duplicate IP endpoints and should be // skipped.
diff --git a/net/socket/transport_connect_sub_job.cc b/net/socket/transport_connect_sub_job.cc new file mode 100644 index 0000000..28c9834d --- /dev/null +++ b/net/socket/transport_connect_sub_job.cc
@@ -0,0 +1,271 @@ +// 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 "net/socket/transport_connect_sub_job.h" + +#include <set> +#include <string> +#include <utility> + +#include "base/bind.h" +#include "base/check_op.h" +#include "base/notreached.h" +#include "net/base/ip_endpoint.h" +#include "net/base/net_errors.h" +#include "net/log/net_log_with_source.h" +#include "net/socket/client_socket_factory.h" +#include "net/socket/connection_attempts.h" +#include "net/socket/socket_performance_watcher.h" +#include "net/socket/socket_performance_watcher_factory.h" +#include "net/socket/websocket_endpoint_lock_manager.h" + +namespace net { + +namespace { + +// StreamSocket wrapper that registers/unregisters the wrapped StreamSocket with +// a WebSocketEndpointLockManager on creation/destruction. +class WebSocketStreamSocket final : public StreamSocket { + public: + WebSocketStreamSocket( + std::unique_ptr<StreamSocket> wrapped_socket, + WebSocketEndpointLockManager* websocket_endpoint_lock_manager, + const IPEndPoint& address) + : wrapped_socket_(std::move(wrapped_socket)), + lock_releaser_(websocket_endpoint_lock_manager, address) {} + + WebSocketStreamSocket(const WebSocketStreamSocket&) = delete; + WebSocketStreamSocket& operator=(const WebSocketStreamSocket&) = delete; + + ~WebSocketStreamSocket() override = default; + + // Socket implementation: + int Read(IOBuffer* buf, + int buf_len, + CompletionOnceCallback callback) override { + return wrapped_socket_->Read(buf, buf_len, std::move(callback)); + } + int ReadIfReady(IOBuffer* buf, + int buf_len, + CompletionOnceCallback callback) override { + return wrapped_socket_->ReadIfReady(buf, buf_len, std::move(callback)); + } + int CancelReadIfReady() override { + return wrapped_socket_->CancelReadIfReady(); + } + int Write(IOBuffer* buf, + int buf_len, + CompletionOnceCallback callback, + const NetworkTrafficAnnotationTag& traffic_annotation) override { + return wrapped_socket_->Write(buf, buf_len, std::move(callback), + traffic_annotation); + } + int SetReceiveBufferSize(int32_t size) override { + return wrapped_socket_->SetReceiveBufferSize(size); + } + int SetSendBufferSize(int32_t size) override { + return wrapped_socket_->SetSendBufferSize(size); + } + void SetDnsAliases(std::set<std::string> aliases) override { + wrapped_socket_->SetDnsAliases(std::move(aliases)); + } + const std::set<std::string>& GetDnsAliases() const override { + return wrapped_socket_->GetDnsAliases(); + } + + // StreamSocket implementation: + int Connect(CompletionOnceCallback callback) override { + return wrapped_socket_->Connect(std::move(callback)); + } + void Disconnect() override { wrapped_socket_->Disconnect(); } + bool IsConnected() const override { return wrapped_socket_->IsConnected(); } + bool IsConnectedAndIdle() const override { + return wrapped_socket_->IsConnectedAndIdle(); + } + int GetPeerAddress(IPEndPoint* address) const override { + return wrapped_socket_->GetPeerAddress(address); + } + int GetLocalAddress(IPEndPoint* address) const override { + return wrapped_socket_->GetLocalAddress(address); + } + const NetLogWithSource& NetLog() const override { + return wrapped_socket_->NetLog(); + } + bool WasEverUsed() const override { return wrapped_socket_->WasEverUsed(); } + bool WasAlpnNegotiated() const override { + return wrapped_socket_->WasAlpnNegotiated(); + } + NextProto GetNegotiatedProtocol() const override { + return wrapped_socket_->GetNegotiatedProtocol(); + } + bool GetSSLInfo(SSLInfo* ssl_info) override { + return wrapped_socket_->GetSSLInfo(ssl_info); + } + int64_t GetTotalReceivedBytes() const override { + return wrapped_socket_->GetTotalReceivedBytes(); + } + void ApplySocketTag(const SocketTag& tag) override { + wrapped_socket_->ApplySocketTag(tag); + } + + private: + std::unique_ptr<StreamSocket> wrapped_socket_; + WebSocketEndpointLockManager::LockReleaser lock_releaser_; +}; + +} // namespace + +TransportConnectSubJob::TransportConnectSubJob( + std::vector<IPEndPoint> addresses, + TransportConnectJob* parent_job, + SubJobType type) + : parent_job_(parent_job), + addresses_(std::move(addresses)), + current_address_index_(0), + next_state_(STATE_NONE), + type_(type) {} + +TransportConnectSubJob::~TransportConnectSubJob() = default; + +// Start connecting. +int TransportConnectSubJob::Start() { + DCHECK_EQ(STATE_NONE, next_state_); + next_state_ = STATE_OBTAIN_LOCK; + return DoLoop(OK); +} + +// Called by WebSocketEndpointLockManager when the lock becomes available. +void TransportConnectSubJob::GotEndpointLock() { + DCHECK_EQ(STATE_OBTAIN_LOCK_COMPLETE, next_state_); + OnIOComplete(OK); +} + +LoadState TransportConnectSubJob::GetLoadState() const { + switch (next_state_) { + case STATE_OBTAIN_LOCK: + case STATE_OBTAIN_LOCK_COMPLETE: + // TODO(ricea): Add a WebSocket-specific LOAD_STATE ? + return LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET; + case STATE_TRANSPORT_CONNECT_COMPLETE: + case STATE_DONE: + return LOAD_STATE_CONNECTING; + case STATE_NONE: + return LOAD_STATE_IDLE; + } + NOTREACHED(); + return LOAD_STATE_IDLE; +} + +const IPEndPoint& TransportConnectSubJob::CurrentAddress() const { + DCHECK_LT(current_address_index_, addresses_.size()); + return addresses_[current_address_index_]; +} + +void TransportConnectSubJob::OnIOComplete(int result) { + int rv = DoLoop(result); + if (rv != ERR_IO_PENDING) + parent_job_->OnSubJobComplete(rv, this); // |this| deleted +} + +int TransportConnectSubJob::DoLoop(int result) { + DCHECK_NE(next_state_, STATE_NONE); + + int rv = result; + do { + State state = next_state_; + next_state_ = STATE_NONE; + switch (state) { + case STATE_OBTAIN_LOCK: + DCHECK_EQ(OK, rv); + rv = DoEndpointLock(); + break; + case STATE_OBTAIN_LOCK_COMPLETE: + DCHECK_EQ(OK, rv); + rv = DoEndpointLockComplete(); + break; + case STATE_TRANSPORT_CONNECT_COMPLETE: + rv = DoTransportConnectComplete(rv); + break; + default: + NOTREACHED(); + rv = ERR_FAILED; + break; + } + } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE && + next_state_ != STATE_DONE); + + return rv; +} + +int TransportConnectSubJob::DoEndpointLock() { + next_state_ = STATE_OBTAIN_LOCK_COMPLETE; + if (!parent_job_->websocket_endpoint_lock_manager()) { + return OK; + } + return parent_job_->websocket_endpoint_lock_manager()->LockEndpoint( + CurrentAddress(), this); +} + +int TransportConnectSubJob::DoEndpointLockComplete() { + next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; + AddressList one_address(CurrentAddress()); + + // Create a `SocketPerformanceWatcher`, and pass the ownership. + std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher; + if (auto* factory = parent_job_->socket_performance_watcher_factory(); + factory != nullptr) { + socket_performance_watcher = factory->CreateSocketPerformanceWatcher( + SocketPerformanceWatcherFactory::PROTOCOL_TCP, one_address); + } + + const NetLogWithSource& net_log = parent_job_->net_log(); + transport_socket_ = + parent_job_->client_socket_factory()->CreateTransportClientSocket( + one_address, std::move(socket_performance_watcher), + parent_job_->network_quality_estimator(), net_log.net_log(), + net_log.source()); + + // If `websocket_endpoint_lock_manager_` is non-null, this class now owns an + // endpoint lock. Wrap `socket` in a `WebSocketStreamSocket` to take ownership + // of the lock and release it when the socket goes out of scope. This must + // happen before any early returns in this method. + if (parent_job_->websocket_endpoint_lock_manager()) { + transport_socket_ = std::make_unique<WebSocketStreamSocket>( + std::move(transport_socket_), + parent_job_->websocket_endpoint_lock_manager(), CurrentAddress()); + } + + transport_socket_->ApplySocketTag(parent_job_->socket_tag()); + + // This use of base::Unretained() is safe because transport_socket_ is + // destroyed in the destructor. + return transport_socket_->Connect(base::BindOnce( + &TransportConnectSubJob::OnIOComplete, base::Unretained(this))); +} + +int TransportConnectSubJob::DoTransportConnectComplete(int result) { + next_state_ = STATE_DONE; + if (result != OK) { + // Drop the socket to release the endpoint lock, if any. + transport_socket_.reset(); + + parent_job_->connection_attempts_.push_back( + ConnectionAttempt(CurrentAddress(), result)); + + // Don't try the next address if entering suspend mode. + if (result != ERR_NETWORK_IO_SUSPENDED && + current_address_index_ + 1 < addresses_.size()) { + // Try falling back to the next address in the list. + next_state_ = STATE_OBTAIN_LOCK; + ++current_address_index_; + result = OK; + } + + return result; + } + + return result; +} + +} // namespace net
diff --git a/net/socket/transport_connect_sub_job.h b/net/socket/transport_connect_sub_job.h new file mode 100644 index 0000000..09682264 --- /dev/null +++ b/net/socket/transport_connect_sub_job.h
@@ -0,0 +1,88 @@ +// 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. + +#ifndef NET_SOCKET_TRANSPORT_CONNECT_SUB_JOB_H_ +#define NET_SOCKET_TRANSPORT_CONNECT_SUB_JOB_H_ + +#include <stddef.h> + +#include <memory> +#include <utility> +#include <vector> + +#include "base/memory/raw_ptr.h" +#include "net/base/address_list.h" +#include "net/base/load_states.h" +#include "net/socket/transport_connect_job.h" +#include "net/socket/websocket_endpoint_lock_manager.h" + +namespace net { + +class IPEndPoint; +class StreamSocket; + +// Attempts to connect to a subset of the addresses required by a +// TransportConnectJob, specifically either the IPv4 or IPv6 addresses. Each +// address is tried in turn, and parent_job->OnSubJobComplete() is called when +// the first address succeeds or the last address fails. +class TransportConnectSubJob : public WebSocketEndpointLockManager::Waiter { + public: + using SubJobType = TransportConnectJob::SubJobType; + + TransportConnectSubJob(std::vector<IPEndPoint> addresses, + TransportConnectJob* parent_job, + SubJobType type); + + TransportConnectSubJob(const TransportConnectSubJob&) = delete; + TransportConnectSubJob& operator=(const TransportConnectSubJob&) = delete; + + ~TransportConnectSubJob() override; + + // Start connecting. + int Start(); + + bool started() { return next_state_ != STATE_NONE; } + + LoadState GetLoadState() const; + + SubJobType type() const { return type_; } + + std::unique_ptr<StreamSocket> PassSocket() { + return std::move(transport_socket_); + } + + // Implementation of WebSocketEndpointLockManager::EndpointWaiter. + void GotEndpointLock() override; + + private: + enum State { + STATE_NONE, + STATE_OBTAIN_LOCK, + STATE_OBTAIN_LOCK_COMPLETE, + STATE_TRANSPORT_CONNECT_COMPLETE, + STATE_DONE, + }; + + const IPEndPoint& CurrentAddress() const; + + void OnIOComplete(int result); + int DoLoop(int result); + int DoEndpointLock(); + int DoEndpointLockComplete(); + int DoTransportConnectComplete(int result); + + const raw_ptr<TransportConnectJob> parent_job_; + + std::vector<IPEndPoint> addresses_; + size_t current_address_index_; + + State next_state_; + const SubJobType type_; + + std::unique_ptr<StreamSocket> transport_socket_; +}; + +} // namespace net + +#endif // NET_SOCKET_TRANSPORT_CONNECT_SUB_JOB_H_
diff --git a/net/socket/websocket_transport_client_socket_pool.cc b/net/socket/websocket_transport_client_socket_pool.cc index 9d9851b9..efeaf6e 100644 --- a/net/socket/websocket_transport_client_socket_pool.cc +++ b/net/socket/websocket_transport_client_socket_pool.cc
@@ -24,7 +24,6 @@ #include "net/socket/connect_job.h" #include "net/socket/connect_job_factory.h" #include "net/socket/websocket_endpoint_lock_manager.h" -#include "net/socket/websocket_transport_connect_job.h" #include "net/traffic_annotation/network_traffic_annotation.h" namespace net {
diff --git a/net/socket/websocket_transport_client_socket_pool.h b/net/socket/websocket_transport_client_socket_pool.h index 4901813d..67c4a22 100644 --- a/net/socket/websocket_transport_client_socket_pool.h +++ b/net/socket/websocket_transport_client_socket_pool.h
@@ -28,7 +28,6 @@ struct CommonConnectJobParams; struct NetworkTrafficAnnotationTag; -class WebSocketTransportConnectJob; class NET_EXPORT_PRIVATE WebSocketTransportClientSocketPool : public ClientSocketPool { @@ -174,8 +173,8 @@ StalledRequestMap; // Tries to hand out the socket connected by |job|. |result| must be (async) - // result of WebSocketTransportConnectJob::Connect(). Returns true iff it has - // handed out a socket. + // result of TransportConnectJob::Connect(). Returns true iff it has handed + // out a socket. bool TryHandOutSocket(int result, ConnectJobDelegate* connect_job_delegate); void OnConnectJobComplete(int result, ConnectJobDelegate* connect_job_delegate);
diff --git a/net/socket/websocket_transport_client_socket_pool_unittest.cc b/net/socket/websocket_transport_client_socket_pool_unittest.cc index 78c9136..679e5d3c 100644 --- a/net/socket/websocket_transport_client_socket_pool_unittest.cc +++ b/net/socket/websocket_transport_client_socket_pool_unittest.cc
@@ -41,7 +41,6 @@ #include "net/socket/transport_client_socket_pool_test_util.h" #include "net/socket/transport_connect_job.h" #include "net/socket/websocket_endpoint_lock_manager.h" -#include "net/socket/websocket_transport_connect_job.h" #include "net/test/gtest_util.h" #include "net/test/test_with_task_environment.h" #include "testing/gmock/include/gmock/gmock.h" @@ -182,8 +181,8 @@ TestLoadTimingInfoConnectedNotReused(handle); } -// Make sure that WebSocketTransportConnectJob passes on its priority to its -// HostResolver request on Init. +// Make sure that the ConnectJob passes on its priority to its HostResolver +// request on Init. TEST_F(WebSocketTransportClientSocketPoolTest, SetResolvePriorityOnInit) { for (int i = MINIMUM_PRIORITY; i <= MAXIMUM_PRIORITY; ++i) { RequestPriority priority = static_cast<RequestPriority>(i); @@ -1276,7 +1275,7 @@ } TEST_F(WebSocketTransportClientSocketPoolTest, - WebSocketTransportConnectJobWithDnsAliases) { + TransportConnectJobWithDnsAliases) { host_resolver_->set_synchronous_mode(true); client_socket_factory_.set_default_client_socket_type( MockTransportClientSocketFactory::Type::kSynchronous); @@ -1294,7 +1293,7 @@ SecureDnsPolicy::kAllow, OnHostResolutionCallback(), /*supported_alpns=*/base::flat_set<std::string>()); - WebSocketTransportConnectJob transport_connect_job( + TransportConnectJob transport_connect_job( DEFAULT_PRIORITY, SocketTag(), &common_connect_job_params_, params, &test_delegate, nullptr /* net_log */); @@ -1308,7 +1307,7 @@ } TEST_F(WebSocketTransportClientSocketPoolTest, - WebSocketTransportConnectJobWithNoAdditionalDnsAliases) { + TransportConnectJobWithNoAdditionalDnsAliases) { host_resolver_->set_synchronous_mode(true); client_socket_factory_.set_default_client_socket_type( MockTransportClientSocketFactory::Type::kSynchronous); @@ -1327,7 +1326,7 @@ SecureDnsPolicy::kAllow, OnHostResolutionCallback(), /*supported_alpns=*/base::flat_set<std::string>()); - WebSocketTransportConnectJob transport_connect_job( + TransportConnectJob transport_connect_job( DEFAULT_PRIORITY, SocketTag(), &common_connect_job_params_, params, &test_delegate, nullptr /* net_log */); @@ -1339,6 +1338,59 @@ testing::ElementsAre(kHostName)); } +TEST_F(WebSocketTransportClientSocketPoolTest, LoadState) { + host_resolver_->rules()->AddRule("v6-only.test", "1:abcd::3:4:ff"); + host_resolver_->rules()->AddRule("v6-and-v4.test", "1:abcd::3:4:ff,2.2.2.2"); + host_resolver_->set_ondemand_mode(true); + + client_socket_factory_.set_default_client_socket_type( + MockTransportClientSocketFactory::Type::kDelayedFailing); + + auto params_v6_only = base::MakeRefCounted<TransportSocketParams>( + HostPortPair("v6-only.test", 80), NetworkIsolationKey(), + SecureDnsPolicy::kAllow, OnHostResolutionCallback(), + /*supported_alpns=*/base::flat_set<std::string>()); + auto params_v6_and_v4 = base::MakeRefCounted<TransportSocketParams>( + HostPortPair("v6-and-v4.test", 80), NetworkIsolationKey(), + SecureDnsPolicy::kAllow, OnHostResolutionCallback(), + /*supported_alpns=*/base::flat_set<std::string>()); + + // v6-only.test will first block on DNS. + TestConnectJobDelegate test_delegate_v6_only; + TransportConnectJob connect_job_v6_only( + DEFAULT_PRIORITY, SocketTag(), &common_connect_job_params_, + params_v6_only, &test_delegate_v6_only, /*net_log=*/nullptr); + EXPECT_THAT(connect_job_v6_only.Connect(), test::IsError(ERR_IO_PENDING)); + EXPECT_THAT(connect_job_v6_only.GetLoadState(), LOAD_STATE_RESOLVING_HOST); + + // When DNS is resolved, it should block on making a connection. + host_resolver_->ResolveOnlyRequestNow(); + base::RunLoop().RunUntilIdle(); + EXPECT_THAT(connect_job_v6_only.GetLoadState(), LOAD_STATE_CONNECTING); + + // v6-and-v4.test will also first block on DNS. + TestConnectJobDelegate test_delegate_v6_and_v4; + TransportConnectJob connect_job_v6_and_v4( + DEFAULT_PRIORITY, SocketTag(), &common_connect_job_params_, + params_v6_and_v4, &test_delegate_v6_and_v4, /*net_log=*/nullptr); + EXPECT_THAT(connect_job_v6_and_v4.Connect(), test::IsError(ERR_IO_PENDING)); + EXPECT_THAT(connect_job_v6_and_v4.GetLoadState(), LOAD_STATE_RESOLVING_HOST); + + // When DNS is resolved, it should attempt to connect to the IPv6 address, but + // `connect_job_v6_only` holds the lock. + host_resolver_->ResolveOnlyRequestNow(); + RunUntilIdle(); + EXPECT_THAT(connect_job_v6_and_v4.GetLoadState(), + LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET); + + // After the IPv6 fallback timeout, it should attempt to connect to the IPv4 + // address. This lock is available, so `GetLoadState` should report it is now + // actively connecting. + RunLoopForTimePeriod(TransportConnectJob::kIPv6FallbackTime + + base::Milliseconds(50)); + EXPECT_THAT(connect_job_v6_and_v4.GetLoadState(), LOAD_STATE_CONNECTING); +} + } // namespace } // namespace net
diff --git a/net/socket/websocket_transport_connect_job.cc b/net/socket/websocket_transport_connect_job.cc deleted file mode 100644 index e0bf16d..0000000 --- a/net/socket/websocket_transport_connect_job.cc +++ /dev/null
@@ -1,344 +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 "net/socket/websocket_transport_connect_job.h" - -#include <memory> - -#include "base/bind.h" -#include "base/location.h" -#include "base/logging.h" -#include "base/stl_util.h" -#include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" -#include "base/trace_event/trace_event.h" -#include "base/values.h" -#include "net/base/address_list.h" -#include "net/base/host_port_pair.h" -#include "net/base/net_errors.h" -#include "net/base/trace_constants.h" -#include "net/dns/public/secure_dns_policy.h" -#include "net/log/net_log_event_type.h" -#include "net/log/net_log_source.h" -#include "net/socket/socket_tag.h" -#include "net/socket/transport_connect_job.h" -#include "net/socket/websocket_endpoint_lock_manager.h" -#include "net/socket/websocket_transport_connect_sub_job.h" -#include "third_party/abseil-cpp/absl/types/variant.h" -#include "url/scheme_host_port.h" - -namespace net { - -namespace { - -// TODO(crbug.com/1206799): Delete once endpoint usage is converted to using -// url::SchemeHostPort when available. -HostPortPair ToLegacyDestinationEndpoint( - const TransportSocketParams::Endpoint& endpoint) { - if (absl::holds_alternative<url::SchemeHostPort>(endpoint)) { - return HostPortPair::FromSchemeHostPort( - absl::get<url::SchemeHostPort>(endpoint)); - } - - DCHECK(absl::holds_alternative<HostPortPair>(endpoint)); - return absl::get<HostPortPair>(endpoint); -} - -} // namespace - -std::unique_ptr<WebSocketTransportConnectJob> -WebSocketTransportConnectJob::Factory::Create( - RequestPriority priority, - const SocketTag& socket_tag, - const CommonConnectJobParams* common_connect_job_params, - const scoped_refptr<TransportSocketParams>& params, - Delegate* delegate, - const NetLogWithSource* net_log) { - return std::make_unique<WebSocketTransportConnectJob>( - priority, socket_tag, common_connect_job_params, params, delegate, - net_log); -} - -WebSocketTransportConnectJob::WebSocketTransportConnectJob( - RequestPriority priority, - const SocketTag& socket_tag, - const CommonConnectJobParams* common_connect_job_params, - const scoped_refptr<TransportSocketParams>& params, - Delegate* delegate, - const NetLogWithSource* net_log) - : ConnectJob(priority, - socket_tag, - TransportConnectJob::ConnectionTimeout(), - common_connect_job_params, - delegate, - net_log, - NetLogSourceType::WEB_SOCKET_TRANSPORT_CONNECT_JOB, - NetLogEventType::WEB_SOCKET_TRANSPORT_CONNECT_JOB_CONNECT), - params_(params), - next_state_(STATE_NONE) { - DCHECK(common_connect_job_params->websocket_endpoint_lock_manager); -} - -WebSocketTransportConnectJob::~WebSocketTransportConnectJob() = default; - -LoadState WebSocketTransportConnectJob::GetLoadState() const { - LoadState load_state = LOAD_STATE_RESOLVING_HOST; - if (ipv6_job_) - load_state = ipv6_job_->GetLoadState(); - // This method should return LOAD_STATE_CONNECTING in preference to - // LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET when possible because "waiting for - // available socket" implies that nothing is happening. - if (ipv4_job_ && load_state != LOAD_STATE_CONNECTING) - load_state = ipv4_job_->GetLoadState(); - return load_state; -} - -bool WebSocketTransportConnectJob::HasEstablishedConnection() const { - // No need to ever return true, since NotifyComplete() is called as soon as a - // connection is established. - return false; -} - -ConnectionAttempts WebSocketTransportConnectJob::GetConnectionAttempts() const { - return connection_attempts_; -} - -ResolveErrorInfo WebSocketTransportConnectJob::GetResolveErrorInfo() const { - return resolve_error_info_; -} - -void WebSocketTransportConnectJob::OnIOComplete(int result) { - result = DoLoop(result); - if (result != ERR_IO_PENDING) - NotifyDelegateOfCompletion(result); // Deletes |this| -} - -int WebSocketTransportConnectJob::DoLoop(int result) { - DCHECK_NE(next_state_, STATE_NONE); - - int rv = result; - do { - State state = next_state_; - next_state_ = STATE_NONE; - switch (state) { - case STATE_RESOLVE_HOST: - DCHECK_EQ(OK, rv); - rv = DoResolveHost(); - break; - case STATE_RESOLVE_HOST_COMPLETE: - rv = DoResolveHostComplete(rv); - break; - case STATE_TRANSPORT_CONNECT: - DCHECK_EQ(OK, rv); - rv = DoTransportConnect(); - break; - case STATE_TRANSPORT_CONNECT_COMPLETE: - rv = DoTransportConnectComplete(rv); - break; - default: - NOTREACHED(); - rv = ERR_FAILED; - break; - } - } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); - - return rv; -} - -int WebSocketTransportConnectJob::DoResolveHost() { - next_state_ = STATE_RESOLVE_HOST_COMPLETE; - connect_timing_.dns_start = base::TimeTicks::Now(); - - HostResolver::ResolveHostParameters parameters; - parameters.initial_priority = priority(); - DCHECK_EQ(SecureDnsPolicy::kAllow, params_->secure_dns_policy()); - if (absl::holds_alternative<url::SchemeHostPort>(params_->destination())) { - request_ = host_resolver()->CreateRequest( - absl::get<url::SchemeHostPort>(params_->destination()), - params_->network_isolation_key(), net_log(), parameters); - } else { - request_ = host_resolver()->CreateRequest( - absl::get<HostPortPair>(params_->destination()), - params_->network_isolation_key(), net_log(), parameters); - } - - return request_->Start(base::BindOnce( - &WebSocketTransportConnectJob::OnIOComplete, base::Unretained(this))); -} - -int WebSocketTransportConnectJob::DoResolveHostComplete(int result) { - TRACE_EVENT0(NetTracingCategory(), - "WebSocketTransportConnectJob::DoResolveHostComplete"); - connect_timing_.dns_end = base::TimeTicks::Now(); - // Overwrite connection start time, since for connections that do not go - // through proxies, |connect_start| should not include dns lookup time. - connect_timing_.connect_start = connect_timing_.dns_end; - resolve_error_info_ = request_->GetResolveErrorInfo(); - - if (result != OK) { - // If hostname resolution failed, record an empty endpoint and the result. - connection_attempts_.push_back(ConnectionAttempt(IPEndPoint(), result)); - return result; - } - DCHECK(request_->GetAddressResults()); - - next_state_ = STATE_TRANSPORT_CONNECT; - - // Invoke callback. If it indicates |this| may be slated for deletion, then - // only continue after a PostTask. - if (!params_->host_resolution_callback().is_null()) { - OnHostResolutionCallbackResult callback_result = - params_->host_resolution_callback().Run( - ToLegacyDestinationEndpoint(params_->destination()), - *request_->GetAddressResults()); - if (callback_result == OnHostResolutionCallbackResult::kMayBeDeletedAsync) { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::BindOnce(&WebSocketTransportConnectJob::OnIOComplete, - weak_ptr_factory_.GetWeakPtr(), OK)); - return ERR_IO_PENDING; - } - } - - return result; -} - -int WebSocketTransportConnectJob::DoTransportConnect() { - DCHECK(request_->GetAddressResults()); - - AddressList ipv4_addresses; - AddressList ipv6_addresses; - next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; - - for (AddressList::const_iterator it = request_->GetAddressResults()->begin(); - it != request_->GetAddressResults()->end(); ++it) { - switch (it->GetFamily()) { - case ADDRESS_FAMILY_IPV4: - ipv4_addresses.push_back(*it); - break; - - case ADDRESS_FAMILY_IPV6: - ipv6_addresses.push_back(*it); - break; - - default: - DVLOG(1) << "Unexpected ADDRESS_FAMILY: " << it->GetFamily(); - break; - } - } - - if (!ipv4_addresses.empty()) { - ipv4_job_ = std::make_unique<WebSocketTransportConnectSubJob>( - ipv4_addresses, this, SUB_JOB_IPV4); - } - - if (!ipv6_addresses.empty()) { - ipv6_job_ = std::make_unique<WebSocketTransportConnectSubJob>( - ipv6_addresses, this, SUB_JOB_IPV6); - int result = ipv6_job_->Start(); - if (result != ERR_IO_PENDING) - return HandleSubJobComplete(result, ipv6_job_.get()); - if (ipv4_job_) { - // This use of base::Unretained is safe because |fallback_timer_| is - // owned by this object. - fallback_timer_.Start( - FROM_HERE, TransportConnectJob::kIPv6FallbackTime, - base::BindOnce(&WebSocketTransportConnectJob::StartIPv4JobAsync, - base::Unretained(this))); - } - return ERR_IO_PENDING; - } - - DCHECK(!ipv6_job_); - if (ipv4_job_) { - int result = ipv4_job_->Start(); - if (result != ERR_IO_PENDING) - return HandleSubJobComplete(result, ipv4_job_.get()); - return ERR_IO_PENDING; - } - - return ERR_UNEXPECTED; -} - -int WebSocketTransportConnectJob::DoTransportConnectComplete(int result) { - // Make sure nothing else calls back into this object. - ipv4_job_.reset(); - ipv6_job_.reset(); - fallback_timer_.Stop(); - - if (result == OK) - TransportConnectJob::HistogramDuration(connect_timing_); - return result; -} - -int WebSocketTransportConnectJob::HandleSubJobComplete( - int result, - WebSocketTransportConnectSubJob* job) { - DCHECK_NE(result, ERR_IO_PENDING); - if (result == OK) { - DCHECK(request_); - SetSocket(job->PassSocket(), - base::OptionalFromPtr(request_->GetDnsAliasResults())); - return result; - } - - if (result == ERR_NETWORK_IO_SUSPENDED) { - // Don't try other jobs if entering suspend mode. - return result; - } - - switch (job->type()) { - case SUB_JOB_IPV4: - ipv4_job_.reset(); - break; - - case SUB_JOB_IPV6: - ipv6_job_.reset(); - // Start the other job, rather than wait for the fallback timer. - if (ipv4_job_ && !ipv4_job_->started()) { - fallback_timer_.Stop(); - result = ipv4_job_->Start(); - if (result != ERR_IO_PENDING) { - return HandleSubJobComplete(result, ipv4_job_.get()); - } - } - break; - } - - if (ipv4_job_ || ipv6_job_) { - // Wait for the other job to complete, rather than reporting |result|. - return ERR_IO_PENDING; - } - - return result; -} - -void WebSocketTransportConnectJob::OnSubJobComplete( - int result, - WebSocketTransportConnectSubJob* job) { - result = HandleSubJobComplete(result, job); - if (result != ERR_IO_PENDING) { - OnIOComplete(result); - } -} - -void WebSocketTransportConnectJob::StartIPv4JobAsync() { - DCHECK(ipv4_job_); - int result = ipv4_job_->Start(); - if (result != ERR_IO_PENDING) - OnSubJobComplete(result, ipv4_job_.get()); -} - -int WebSocketTransportConnectJob::ConnectInternal() { - next_state_ = STATE_RESOLVE_HOST; - return DoLoop(OK); -} - -// Nothing to do here because WebSocket priorities are not changed and -// stalled_request_{queue, map} don't take priority into account anyway. -// TODO(chlily): If that ever changes, make the host resolver request reflect -// the new priority. -void WebSocketTransportConnectJob::ChangePriorityInternal( - RequestPriority priority) {} - -} // namespace net
diff --git a/net/socket/websocket_transport_connect_job.h b/net/socket/websocket_transport_connect_job.h deleted file mode 100644 index 8243cb0..0000000 --- a/net/socket/websocket_transport_connect_job.h +++ /dev/null
@@ -1,136 +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. - -#ifndef NET_SOCKET_WEBSOCKET_TRANSPORT_CONNECT_JOB_H_ -#define NET_SOCKET_WEBSOCKET_TRANSPORT_CONNECT_JOB_H_ - -#include <memory> -#include <set> - -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "base/timer/timer.h" -#include "net/base/net_export.h" -#include "net/dns/host_resolver.h" -#include "net/dns/public/resolve_error_info.h" -#include "net/log/net_log_with_source.h" -#include "net/socket/transport_connect_job.h" - -namespace net { - -class SocketTag; -class WebSocketTransportConnectSubJob; - -// WebSocketTransportConnectJob handles the host resolution necessary for socket -// creation and the TCP connect. WebSocketTransportConnectJob also has fallback -// logic for IPv6 connect() timeouts (which may happen due to networks / routers -// with broken IPv6 support). Those timeouts take 20s, so rather than make the -// user wait 20s for the timeout to fire, we use a fallback timer -// (kIPv6FallbackTime) and start a connect() to an IPv4 address if the -// timer fires. Then we race the IPv4 connect(s) against the IPv6 connect(s) and -// use the socket that completes successfully first or fails last. -// -// TODO(mmenke): Look into merging this with TransportConnectJob. That would -// bring all the features supported by TransportConnectJob to WebSockets: -// Happy eyeballs, socket tagging, error reporting (Used by network error -// logging), and provide performance information to SocketPerformanceWatcher. -class NET_EXPORT_PRIVATE WebSocketTransportConnectJob : public ConnectJob { - public: - class NET_EXPORT_PRIVATE Factory { - public: - Factory() = default; - virtual ~Factory() = default; - - virtual std::unique_ptr<WebSocketTransportConnectJob> Create( - RequestPriority priority, - const SocketTag& socket_tag, - const CommonConnectJobParams* common_connect_job_params, - const scoped_refptr<TransportSocketParams>& params, - Delegate* delegate, - const NetLogWithSource* net_log); - }; - - WebSocketTransportConnectJob( - RequestPriority priority, - const SocketTag& socket_tag, - const CommonConnectJobParams* common_connect_job_params, - const scoped_refptr<TransportSocketParams>& params, - Delegate* delegate, - const NetLogWithSource* net_log); - - WebSocketTransportConnectJob(const WebSocketTransportConnectJob&) = delete; - WebSocketTransportConnectJob& operator=(const WebSocketTransportConnectJob&) = - delete; - - ~WebSocketTransportConnectJob() override; - - // ConnectJob methods. - LoadState GetLoadState() const override; - bool HasEstablishedConnection() const override; - ConnectionAttempts GetConnectionAttempts() const override; - ResolveErrorInfo GetResolveErrorInfo() const override; - - private: - friend class WebSocketTransportConnectSubJob; - - enum State { - STATE_RESOLVE_HOST, - STATE_RESOLVE_HOST_COMPLETE, - STATE_TRANSPORT_CONNECT, - STATE_TRANSPORT_CONNECT_COMPLETE, - STATE_NONE, - }; - - // Although it is not strictly necessary, it makes the code simpler if each - // subjob knows what type it is. - enum SubJobType { SUB_JOB_IPV4, SUB_JOB_IPV6 }; - - void OnIOComplete(int result); - int DoLoop(int result); - - int DoResolveHost(); - int DoResolveHostComplete(int result); - int DoTransportConnect(); - int DoTransportConnectComplete(int result); - - // Called back from a SubJob when it completes. - void OnSubJobComplete(int result, WebSocketTransportConnectSubJob* job); - // Called when a SubJob completes, synchronously or asynchronously. Returns - // |ERR_IO_PENDING| if there is more work to do and another error if - // completed. - int HandleSubJobComplete(int result, WebSocketTransportConnectSubJob* job); - - // Called from |fallback_timer_|. - void StartIPv4JobAsync(); - - // Begins the host resolution and the TCP connect. Returns OK on success - // and ERR_IO_PENDING if it cannot immediately service the request. - // Otherwise, it returns a net error code. - int ConnectInternal() override; - - void ChangePriorityInternal(RequestPriority priority) override; - - scoped_refptr<TransportSocketParams> params_; - std::unique_ptr<HostResolver::ResolveHostRequest> request_; - - State next_state_; - - // The addresses are divided into IPv4 and IPv6, which are performed partially - // in parallel. If the list of IPv6 addresses is non-empty, then the IPv6 jobs - // go first, followed after |kIPv6FallbackTime| by the IPv4 addresses. First - // sub-job to establish a connection wins. - std::unique_ptr<WebSocketTransportConnectSubJob> ipv4_job_; - std::unique_ptr<WebSocketTransportConnectSubJob> ipv6_job_; - - base::OneShotTimer fallback_timer_; - - ResolveErrorInfo resolve_error_info_; - ConnectionAttempts connection_attempts_; - - base::WeakPtrFactory<WebSocketTransportConnectJob> weak_ptr_factory_{this}; -}; - -} // namespace net - -#endif // NET_SOCKET_WEBSOCKET_TRANSPORT_CONNECT_JOB_H_
diff --git a/net/socket/websocket_transport_connect_sub_job.cc b/net/socket/websocket_transport_connect_sub_job.cc deleted file mode 100644 index 420c144..0000000 --- a/net/socket/websocket_transport_connect_sub_job.cc +++ /dev/null
@@ -1,265 +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 "net/socket/websocket_transport_connect_sub_job.h" - -#include <set> -#include <string> -#include <utility> - -#include "base/bind.h" -#include "base/check_op.h" -#include "base/notreached.h" -#include "net/base/ip_endpoint.h" -#include "net/base/net_errors.h" -#include "net/log/net_log_with_source.h" -#include "net/socket/client_socket_factory.h" -#include "net/socket/connection_attempts.h" -#include "net/socket/socket_performance_watcher.h" -#include "net/socket/socket_performance_watcher_factory.h" -#include "net/socket/websocket_endpoint_lock_manager.h" - -namespace net { - -namespace { - -// StreamSocket wrapper that registers/unregisters the wrapped StreamSocket with -// a WebSocketEndpointLockManager on creation/destruction. -class WebSocketStreamSocket final : public StreamSocket { - public: - WebSocketStreamSocket( - std::unique_ptr<StreamSocket> wrapped_socket, - WebSocketEndpointLockManager* websocket_endpoint_lock_manager, - const IPEndPoint& address) - : wrapped_socket_(std::move(wrapped_socket)), - lock_releaser_(websocket_endpoint_lock_manager, address) {} - - WebSocketStreamSocket(const WebSocketStreamSocket&) = delete; - WebSocketStreamSocket& operator=(const WebSocketStreamSocket&) = delete; - - ~WebSocketStreamSocket() override = default; - - // Socket implementation: - int Read(IOBuffer* buf, - int buf_len, - CompletionOnceCallback callback) override { - return wrapped_socket_->Read(buf, buf_len, std::move(callback)); - } - int ReadIfReady(IOBuffer* buf, - int buf_len, - CompletionOnceCallback callback) override { - return wrapped_socket_->ReadIfReady(buf, buf_len, std::move(callback)); - } - int CancelReadIfReady() override { - return wrapped_socket_->CancelReadIfReady(); - } - int Write(IOBuffer* buf, - int buf_len, - CompletionOnceCallback callback, - const NetworkTrafficAnnotationTag& traffic_annotation) override { - return wrapped_socket_->Write(buf, buf_len, std::move(callback), - traffic_annotation); - } - int SetReceiveBufferSize(int32_t size) override { - return wrapped_socket_->SetReceiveBufferSize(size); - } - int SetSendBufferSize(int32_t size) override { - return wrapped_socket_->SetSendBufferSize(size); - } - void SetDnsAliases(std::set<std::string> aliases) override { - wrapped_socket_->SetDnsAliases(std::move(aliases)); - } - const std::set<std::string>& GetDnsAliases() const override { - return wrapped_socket_->GetDnsAliases(); - } - - // StreamSocket implementation: - int Connect(CompletionOnceCallback callback) override { - return wrapped_socket_->Connect(std::move(callback)); - } - void Disconnect() override { wrapped_socket_->Disconnect(); } - bool IsConnected() const override { return wrapped_socket_->IsConnected(); } - bool IsConnectedAndIdle() const override { - return wrapped_socket_->IsConnectedAndIdle(); - } - int GetPeerAddress(IPEndPoint* address) const override { - return wrapped_socket_->GetPeerAddress(address); - } - int GetLocalAddress(IPEndPoint* address) const override { - return wrapped_socket_->GetLocalAddress(address); - } - const NetLogWithSource& NetLog() const override { - return wrapped_socket_->NetLog(); - } - bool WasEverUsed() const override { return wrapped_socket_->WasEverUsed(); } - bool WasAlpnNegotiated() const override { - return wrapped_socket_->WasAlpnNegotiated(); - } - NextProto GetNegotiatedProtocol() const override { - return wrapped_socket_->GetNegotiatedProtocol(); - } - bool GetSSLInfo(SSLInfo* ssl_info) override { - return wrapped_socket_->GetSSLInfo(ssl_info); - } - int64_t GetTotalReceivedBytes() const override { - return wrapped_socket_->GetTotalReceivedBytes(); - } - void ApplySocketTag(const SocketTag& tag) override { - wrapped_socket_->ApplySocketTag(tag); - } - - private: - std::unique_ptr<StreamSocket> wrapped_socket_; - WebSocketEndpointLockManager::LockReleaser lock_releaser_; -}; - -} // namespace - -WebSocketTransportConnectSubJob::WebSocketTransportConnectSubJob( - const AddressList& addresses, - WebSocketTransportConnectJob* parent_job, - SubJobType type) - : parent_job_(parent_job), - addresses_(addresses), - current_address_index_(0), - next_state_(STATE_NONE), - type_(type) {} - -WebSocketTransportConnectSubJob::~WebSocketTransportConnectSubJob() = default; - -// Start connecting. -int WebSocketTransportConnectSubJob::Start() { - DCHECK_EQ(STATE_NONE, next_state_); - next_state_ = STATE_OBTAIN_LOCK; - return DoLoop(OK); -} - -// Called by WebSocketEndpointLockManager when the lock becomes available. -void WebSocketTransportConnectSubJob::GotEndpointLock() { - DCHECK_EQ(STATE_OBTAIN_LOCK_COMPLETE, next_state_); - OnIOComplete(OK); -} - -LoadState WebSocketTransportConnectSubJob::GetLoadState() const { - switch (next_state_) { - case STATE_OBTAIN_LOCK: - case STATE_OBTAIN_LOCK_COMPLETE: - // TODO(ricea): Add a WebSocket-specific LOAD_STATE ? - return LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET; - case STATE_TRANSPORT_CONNECT_COMPLETE: - case STATE_DONE: - return LOAD_STATE_CONNECTING; - case STATE_NONE: - return LOAD_STATE_IDLE; - } - NOTREACHED(); - return LOAD_STATE_IDLE; -} - -const IPEndPoint& WebSocketTransportConnectSubJob::CurrentAddress() const { - DCHECK_LT(current_address_index_, addresses_.size()); - return addresses_[current_address_index_]; -} - -void WebSocketTransportConnectSubJob::OnIOComplete(int result) { - int rv = DoLoop(result); - if (rv != ERR_IO_PENDING) - parent_job_->OnSubJobComplete(rv, this); // |this| deleted -} - -int WebSocketTransportConnectSubJob::DoLoop(int result) { - DCHECK_NE(next_state_, STATE_NONE); - - int rv = result; - do { - State state = next_state_; - next_state_ = STATE_NONE; - switch (state) { - case STATE_OBTAIN_LOCK: - DCHECK_EQ(OK, rv); - rv = DoEndpointLock(); - break; - case STATE_OBTAIN_LOCK_COMPLETE: - DCHECK_EQ(OK, rv); - rv = DoEndpointLockComplete(); - break; - case STATE_TRANSPORT_CONNECT_COMPLETE: - rv = DoTransportConnectComplete(rv); - break; - default: - NOTREACHED(); - rv = ERR_FAILED; - break; - } - } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE && - next_state_ != STATE_DONE); - - return rv; -} - -int WebSocketTransportConnectSubJob::DoEndpointLock() { - int rv = parent_job_->websocket_endpoint_lock_manager()->LockEndpoint( - CurrentAddress(), this); - next_state_ = STATE_OBTAIN_LOCK_COMPLETE; - return rv; -} - -int WebSocketTransportConnectSubJob::DoEndpointLockComplete() { - next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; - AddressList one_address(CurrentAddress()); - - // Create a `SocketPerformanceWatcher`, and pass the ownership. - std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher; - if (auto* factory = parent_job_->socket_performance_watcher_factory(); - factory != nullptr) { - socket_performance_watcher = factory->CreateSocketPerformanceWatcher( - SocketPerformanceWatcherFactory::PROTOCOL_TCP, one_address); - } - - // This class now owns an endpoint lock. Wrap `socket` in a - // `WebSocketStreamSocket` to take ownership of the lock and release it when - // the socket goes out of scope. - const NetLogWithSource& net_log = parent_job_->net_log(); - std::unique_ptr<StreamSocket> socket = - parent_job_->client_socket_factory()->CreateTransportClientSocket( - one_address, std::move(socket_performance_watcher), - parent_job_->network_quality_estimator(), net_log.net_log(), - net_log.source()); - transport_socket_ = std::make_unique<WebSocketStreamSocket>( - std::move(socket), parent_job_->websocket_endpoint_lock_manager(), - CurrentAddress()); - - transport_socket_->ApplySocketTag(parent_job_->socket_tag()); - - // This use of base::Unretained() is safe because transport_socket_ is - // destroyed in the destructor. - return transport_socket_->Connect(base::BindOnce( - &WebSocketTransportConnectSubJob::OnIOComplete, base::Unretained(this))); -} - -int WebSocketTransportConnectSubJob::DoTransportConnectComplete(int result) { - next_state_ = STATE_DONE; - if (result != OK) { - // Drop the socket to release the endpoint lock. - transport_socket_.reset(); - - parent_job_->connection_attempts_.push_back( - ConnectionAttempt(CurrentAddress(), result)); - - // Don't try the next address if entering suspend mode. - if (result != ERR_NETWORK_IO_SUSPENDED && - current_address_index_ + 1 < addresses_.size()) { - // Try falling back to the next address in the list. - next_state_ = STATE_OBTAIN_LOCK; - ++current_address_index_; - result = OK; - } - - return result; - } - - return result; -} - -} // namespace net
diff --git a/net/socket/websocket_transport_connect_sub_job.h b/net/socket/websocket_transport_connect_sub_job.h deleted file mode 100644 index ce4b009..0000000 --- a/net/socket/websocket_transport_connect_sub_job.h +++ /dev/null
@@ -1,91 +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. - -#ifndef NET_SOCKET_WEBSOCKET_TRANSPORT_CONNECT_SUB_JOB_H_ -#define NET_SOCKET_WEBSOCKET_TRANSPORT_CONNECT_SUB_JOB_H_ - -#include <stddef.h> - -#include <memory> -#include <utility> - -#include "base/compiler_specific.h" -#include "base/memory/raw_ptr.h" -#include "net/base/address_list.h" -#include "net/base/load_states.h" -#include "net/socket/websocket_endpoint_lock_manager.h" -#include "net/socket/websocket_transport_connect_job.h" - -namespace net { - -class IPEndPoint; -class StreamSocket; - -// Attempts to connect to a subset of the addresses required by a -// WebSocketTransportConnectJob, specifically either the IPv4 or IPv6 -// addresses. Each address is tried in turn, and parent_job->OnSubJobComplete() -// is called when the first address succeeds or the last address fails. -class WebSocketTransportConnectSubJob - : public WebSocketEndpointLockManager::Waiter { - public: - typedef WebSocketTransportConnectJob::SubJobType SubJobType; - - WebSocketTransportConnectSubJob(const AddressList& addresses, - WebSocketTransportConnectJob* parent_job, - SubJobType type); - - WebSocketTransportConnectSubJob(const WebSocketTransportConnectSubJob&) = - delete; - WebSocketTransportConnectSubJob& operator=( - const WebSocketTransportConnectSubJob&) = delete; - - ~WebSocketTransportConnectSubJob() override; - - // Start connecting. - int Start(); - - bool started() { return next_state_ != STATE_NONE; } - - LoadState GetLoadState() const; - - SubJobType type() const { return type_; } - - std::unique_ptr<StreamSocket> PassSocket() { - return std::move(transport_socket_); - } - - // Implementation of WebSocketEndpointLockManager::EndpointWaiter. - void GotEndpointLock() override; - - private: - enum State { - STATE_NONE, - STATE_OBTAIN_LOCK, - STATE_OBTAIN_LOCK_COMPLETE, - STATE_TRANSPORT_CONNECT_COMPLETE, - STATE_DONE, - }; - - const IPEndPoint& CurrentAddress() const; - - void OnIOComplete(int result); - int DoLoop(int result); - int DoEndpointLock(); - int DoEndpointLockComplete(); - int DoTransportConnectComplete(int result); - - const raw_ptr<WebSocketTransportConnectJob> parent_job_; - - const AddressList addresses_; - size_t current_address_index_; - - State next_state_; - const SubJobType type_; - - std::unique_ptr<StreamSocket> transport_socket_; -}; - -} // namespace net - -#endif // NET_SOCKET_WEBSOCKET_TRANSPORT_CONNECT_SUB_JOB_H_
diff --git a/net/websockets/websocket_end_to_end_test.cc b/net/websockets/websocket_end_to_end_test.cc index 7fe4d5d..2871ba0 100644 --- a/net/websockets/websocket_end_to_end_test.cc +++ b/net/websockets/websocket_end_to_end_test.cc
@@ -54,6 +54,7 @@ #include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_response.h" #include "net/test/spawned_test_server/spawned_test_server.h" +#include "net/test/ssl_test_util.h" #include "net/test/test_data_directory.h" #include "net/test/test_with_task_environment.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" @@ -671,6 +672,88 @@ EXPECT_EQ(event_interface_->response()->url, wss_url); } +// Test that wss connections can use HostResolverEndpointResults from DNS. +TEST_F(WebSocketEndToEndTest, HostResolverEndpointResult) { + base::test::ScopedFeatureList features; + features.InitAndEnableFeature(features::kUseDnsHttpsSvcb); + + SpawnedTestServer wss_server(SpawnedTestServer::TYPE_WSS, + SpawnedTestServer::SSLOptions(base::FilePath( + FILE_PATH_LITERAL("test_names.pem"))), + GetWebSocketTestDataDirectory()); + ASSERT_TRUE(wss_server.Start()); + + uint16_t port = wss_server.host_port_pair().port(); + GURL wss_url("wss://a.test:" + base::NumberToString(port) + "/" + + kEchoServer); + + auto host_resolver = std::make_unique<MockHostResolver>(); + MockHostResolverBase::RuleResolver::RuleKey resolve_key; + // The DNS query itself is made with the https scheme rather than wss. + resolve_key.scheme = url::kHttpsScheme; + resolve_key.hostname_pattern = "a.test"; + resolve_key.port = port; + HostResolverEndpointResult result; + result.ip_endpoints = {IPEndPoint(IPAddress::IPv4Localhost(), port)}; + result.metadata.supported_protocol_alpns = {"http/1.1"}; + host_resolver->rules()->AddRule(std::move(resolve_key), std::vector{result}); + context_builder_->set_host_resolver(std::move(host_resolver)); + + EXPECT_TRUE(ConnectAndWait(wss_url)); + + // Expect request to have reached the server using the upgraded URL. + EXPECT_EQ(event_interface_->response()->url, wss_url); +} + +// Test that wss connections can use EncryptedClientHello. +TEST_F(WebSocketEndToEndTest, EncryptedClientHello) { + base::test::ScopedFeatureList features; + features.InitWithFeatures( + {features::kUseDnsHttpsSvcb, features::kEncryptedClientHello}, {}); + + // SpawnedTestServer does not support ECH, while EmbeddedTestServer does not + // support WebSockets (https://crbug.com/1281277). Until that is fixed, test + // ECH by configuring a non-WebSockets HTTPS server. The WebSockets handshake + // will fail, but getting that far tests that ECH worked. + + // Configure a test server that speaks ECH. + static constexpr char kRealName[] = "secret.example"; + static constexpr char kPublicName[] = "public.example"; + EmbeddedTestServer::ServerCertificateConfig server_cert_config; + server_cert_config.dns_names = {kRealName}; + SSLServerConfig ssl_server_config; + std::vector<uint8_t> ech_config_list; + ssl_server_config.ech_keys = + MakeTestEchKeys(kPublicName, /*max_name_len=*/128, &ech_config_list); + ASSERT_TRUE(ssl_server_config.ech_keys); + + EmbeddedTestServer test_server(EmbeddedTestServer::TYPE_HTTPS); + test_server.SetSSLConfig(server_cert_config, ssl_server_config); + ASSERT_TRUE(test_server.Start()); + + GURL https_url = test_server.GetURL(kRealName, "/"); + GURL::Replacements replacements; + replacements.SetSchemeStr(url::kWssScheme); + GURL wss_url = https_url.ReplaceComponents(replacements); + + auto host_resolver = std::make_unique<MockHostResolver>(); + MockHostResolverBase::RuleResolver::RuleKey resolve_key; + // The DNS query itself is made with the https scheme rather than wss. + resolve_key.scheme = url::kHttpsScheme; + resolve_key.hostname_pattern = wss_url.host(); + resolve_key.port = wss_url.IntPort(); + HostResolverEndpointResult result; + result.ip_endpoints = { + IPEndPoint(IPAddress::IPv4Localhost(), wss_url.IntPort())}; + result.metadata.supported_protocol_alpns = {"http/1.1"}; + result.metadata.ech_config_list = ech_config_list; + host_resolver->rules()->AddRule(std::move(resolve_key), std::vector{result}); + context_builder_->set_host_resolver(std::move(host_resolver)); + + EXPECT_FALSE(ConnectAndWait(wss_url)); + EXPECT_EQ("Error during WebSocket handshake: Unexpected response code: 404", + event_interface_->failure_message()); +} } // namespace } // namespace net
diff --git a/pdf/OWNERS b/pdf/OWNERS index 3955287c..1fe0f93 100644 --- a/pdf/OWNERS +++ b/pdf/OWNERS
@@ -7,4 +7,4 @@ tsepez@chromium.org # V8/gin-related questions/reviews only. -jochen@chromium.org +mlippautz@chromium.org
diff --git a/pdf/pdf_view_plugin_base.cc b/pdf/pdf_view_plugin_base.cc index d1772973..cf742853 100644 --- a/pdf/pdf_view_plugin_base.cc +++ b/pdf/pdf_view_plugin_base.cc
@@ -25,7 +25,6 @@ #include "base/feature_list.h" #include "base/i18n/rtl.h" #include "base/location.h" -#include "base/logging.h" #include "base/memory/weak_ptr.h" #include "base/notreached.h" #include "base/numerics/safe_conversions.h" @@ -347,24 +346,6 @@ InvokePrintDialog(); } -void PdfViewPluginBase::SubmitForm(const std::string& url, - const void* data, - int length) { - // `url` might be a relative URL. Resolve it against the document's URL. - GURL resolved_url = GURL(GetURL()).Resolve(url); - if (!resolved_url.is_valid()) - return; - - UrlRequest request; - request.url = resolved_url.spec(); - request.method = "POST"; - request.body.assign(static_cast<const char*>(data), length); - - form_loader_ = CreateUrlLoaderInternal(); - form_loader_->Open( - request, base::BindOnce(&PdfViewPluginBase::DidFormOpen, GetWeakPtr())); -} - std::unique_ptr<UrlLoader> PdfViewPluginBase::CreateUrlLoader() { if (full_frame_) { DidStartLoading(); @@ -1543,12 +1524,6 @@ preview_engine_->HandleDocumentLoad(std::move(loader), GetURL()); } -void PdfViewPluginBase::DidFormOpen(int32_t result) { - // TODO(crbug.com/719344): Process response. - LOG_IF(ERROR, result != kSuccess) << "DidFormOpen failed: " << result; - form_loader_.reset(); -} - void PdfViewPluginBase::OnPrintPreviewLoaded() { // Scroll location is retained across document loads in print preview mode, so // there's no need to override the scroll position by scrolling again.
diff --git a/pdf/pdf_view_plugin_base.h b/pdf/pdf_view_plugin_base.h index 4a4abd4..743aa62 100644 --- a/pdf/pdf_view_plugin_base.h +++ b/pdf/pdf_view_plugin_base.h
@@ -118,9 +118,6 @@ const std::string& subject, const std::string& body) override; void Print() override; - void SubmitForm(const std::string& url, - const void* data, - int length) override; std::unique_ptr<UrlLoader> CreateUrlLoader() override; void DocumentLoadComplete() override; void DocumentLoadFailed() override; @@ -461,9 +458,6 @@ // Handles `LoadUrl()` result for print preview. void DidOpenPreview(std::unique_ptr<UrlLoader> loader, int32_t result); - // Handles `Open()` result for `form_loader_`. - void DidFormOpen(int32_t result); - // Performs tasks necessary when the document is loaded in print preview mode. void OnPrintPreviewLoaded(); @@ -595,9 +589,6 @@ // Whether the document is in edit mode. bool edit_mode_ = false; - // Used for submitting forms. - std::unique_ptr<UrlLoader> form_loader_; - // Assigned a value only between `PrintBegin()` and `PrintEnd()` calls. absl::optional<blink::WebPrintParams> print_params_;
diff --git a/pdf/pdf_view_plugin_base_unittest.cc b/pdf/pdf_view_plugin_base_unittest.cc index ead742f..56f3e9a 100644 --- a/pdf/pdf_view_plugin_base_unittest.cc +++ b/pdf/pdf_view_plugin_base_unittest.cc
@@ -10,7 +10,6 @@ #include <vector> #include "base/memory/weak_ptr.h" -#include "base/strings/string_piece.h" #include "base/test/icu_test_util.h" #include "base/test/values_test_util.h" #include "base/time/time.h" @@ -52,7 +51,6 @@ using ::testing::NiceMock; using ::testing::Return; using ::testing::SaveArg; -using ::testing::StrEq; // Keep it in-sync with the `kFinalFallbackName` returned by // net::GetSuggestedFilename(). @@ -1278,74 +1276,4 @@ EXPECT_TRUE(doc_info.text_copyable); } -class PdfViewPluginBaseSubmitFormTest : public PdfViewPluginBaseTest { - public: - void SubmitForm(const std::string& url, - base::StringPiece form_data = "data") { - EXPECT_CALL(fake_plugin_, CreateUrlLoaderInternal).WillOnce([this]() { - auto mock_loader = std::make_unique<NiceMock<MockUrlLoader>>(); - EXPECT_CALL(*mock_loader, Open).WillOnce(testing::SaveArg<0>(&request_)); - return mock_loader; - }); - - fake_plugin_.SubmitForm(url, form_data.data(), form_data.size()); - } - - void SubmitFailingForm(const std::string& url) { - EXPECT_CALL(fake_plugin_, CreateUrlLoaderInternal).Times(0); - constexpr char kFormData[] = "form data"; - fake_plugin_.SubmitForm(url, kFormData, std::size(kFormData)); - } - - protected: - UrlRequest request_; -}; - -TEST_F(PdfViewPluginBaseSubmitFormTest, RequestMethodAndBody) { - EXPECT_CALL(fake_plugin_, GetURL) - .WillOnce(Return("https://www.example.com/path/to/the.pdf")); - constexpr char kFormData[] = "form data"; - SubmitForm(/*url=*/"", kFormData); - EXPECT_EQ(request_.method, "POST"); - EXPECT_THAT(request_.body, StrEq(kFormData)); -} - -TEST_F(PdfViewPluginBaseSubmitFormTest, RelativeUrl) { - EXPECT_CALL(fake_plugin_, GetURL) - .WillOnce(Return("https://www.example.com/path/to/the.pdf")); - SubmitForm("relative_endpoint"); - EXPECT_EQ(request_.url, "https://www.example.com/path/to/relative_endpoint"); -} - -TEST_F(PdfViewPluginBaseSubmitFormTest, NoRelativeUrl) { - EXPECT_CALL(fake_plugin_, GetURL) - .WillOnce(Return("https://www.example.com/path/to/the.pdf")); - SubmitForm(""); - EXPECT_EQ(request_.url, "https://www.example.com/path/to/the.pdf"); -} - -TEST_F(PdfViewPluginBaseSubmitFormTest, AbsoluteUrl) { - EXPECT_CALL(fake_plugin_, GetURL) - .WillOnce(Return("https://a.example.com/path/to/the.pdf")); - SubmitForm("https://b.example.com/relative_endpoint"); - EXPECT_EQ(request_.url, "https://b.example.com/relative_endpoint"); -} - -TEST_F(PdfViewPluginBaseSubmitFormTest, EmptyDocumentUrl) { - EXPECT_CALL(fake_plugin_, GetURL).WillOnce(Return(std::string())); - SubmitFailingForm("relative_endpoint"); -} - -TEST_F(PdfViewPluginBaseSubmitFormTest, RelativeUrlInvalidDocumentUrl) { - EXPECT_CALL(fake_plugin_, GetURL) - .WillOnce(Return(R"(https://www.%B%Ad.com/path/to/the.pdf)")); - SubmitFailingForm("relative_endpoint"); -} - -TEST_F(PdfViewPluginBaseSubmitFormTest, AbsoluteUrlInvalidDocumentUrl) { - EXPECT_CALL(fake_plugin_, GetURL) - .WillOnce(Return(R"(https://www.%B%Ad.com/path/to/the.pdf)")); - SubmitFailingForm("https://wwww.example.com"); -} - } // namespace chrome_pdf
diff --git a/pdf/pdf_view_web_plugin.cc b/pdf/pdf_view_web_plugin.cc index c23af6e7..536b31aa 100644 --- a/pdf/pdf_view_web_plugin.cc +++ b/pdf/pdf_view_web_plugin.cc
@@ -17,6 +17,7 @@ #include "base/i18n/char_iterator.h" #include "base/i18n/string_search.h" #include "base/i18n/time_formatting.h" +#include "base/logging.h" #include "base/memory/raw_ptr.h" #include "base/no_destructor.h" #include "base/notreached.h" @@ -173,9 +174,7 @@ } bool PdfViewWebPlugin::InitializeForTesting( - std::unique_ptr<PDFiumEngine> engine, - std::unique_ptr<UrlLoader> loader) { - test_loader_ = std::move(loader); + std::unique_ptr<PDFiumEngine> engine) { return InitializeCommon(std::move(engine)); } @@ -638,6 +637,31 @@ .Utf8(); } +void PdfViewWebPlugin::SubmitForm(const std::string& url, + const void* data, + int length) { + // `url` might be a relative URL. Resolve it against the document's URL. + // TODO(crbug.com/1322928): Probably redundant with `Client::CompleteURL()`. + GURL resolved_url = GURL(GetURL()).Resolve(url); + if (!resolved_url.is_valid()) + return; + + UrlRequest request; + request.url = resolved_url.spec(); + request.method = "POST"; + request.body.assign(static_cast<const char*>(data), length); + + form_loader_ = CreateUrlLoaderInternal(); + form_loader_->Open(request, base::BindOnce(&PdfViewWebPlugin::DidFormOpen, + weak_factory_.GetWeakPtr())); +} + +void PdfViewWebPlugin::DidFormOpen(int32_t result) { + // TODO(crbug.com/719344): Process response. + LOG_IF(ERROR, result != kSuccess) << "DidFormOpen failed: " << result; + form_loader_.reset(); +} + std::vector<PDFEngine::Client::SearchStringResult> PdfViewWebPlugin::SearchString(const char16_t* string, const char16_t* term, @@ -759,9 +783,6 @@ } std::unique_ptr<UrlLoader> PdfViewWebPlugin::CreateUrlLoaderInternal() { - if (test_loader_) - return std::move(test_loader_); - auto loader = std::make_unique<BlinkUrlLoader>(weak_factory_.GetWeakPtr()); loader->GrantUniversalAccess(); return loader;
diff --git a/pdf/pdf_view_web_plugin.h b/pdf/pdf_view_web_plugin.h index 6506ae8..b6679419 100644 --- a/pdf/pdf_view_web_plugin.h +++ b/pdf/pdf_view_web_plugin.h
@@ -252,6 +252,9 @@ bool Confirm(const std::string& message) override; std::string Prompt(const std::string& question, const std::string& default_answer) override; + void SubmitForm(const std::string& url, + const void* data, + int length) override; std::vector<SearchStringResult> SearchString(const char16_t* string, const char16_t* term, bool case_sensitive) override; @@ -289,10 +292,8 @@ void HandleAccessibilityAction( const AccessibilityActionData& action_data) override; - // Initializes the plugin using the `engine` provided by tests. Lets - // `CreateUrlLoaderInternal()` return `loader` on its first call. - bool InitializeForTesting(std::unique_ptr<PDFiumEngine> engine, - std::unique_ptr<UrlLoader> loader); + // Initializes the plugin using the `engine` provided by tests. + bool InitializeForTesting(std::unique_ptr<PDFiumEngine> engine); const gfx::Rect& GetPluginRectForTesting() const { return plugin_rect(); } @@ -337,6 +338,9 @@ // Sends whether to do smooth scrolling. void SendSetSmoothScrolling(); + // Handles `Open()` result for `form_loader_`. + void DidFormOpen(int32_t result); + // Recalculates values that depend on scale factors. void UpdateScaledValues(); @@ -443,6 +447,9 @@ // The plugin rect in CSS pixels. gfx::Rect css_plugin_rect_; + // Used for submitting forms. + std::unique_ptr<UrlLoader> form_loader_; + // May be null in unit tests. std::unique_ptr<PdfAccessibilityDataHandler> const pdf_accessibility_data_handler_; @@ -464,10 +471,6 @@ // The indices of pages to print. std::vector<int> pages_to_print_; - // If non-null, the UrlLoader that CreateUrlLoaderInternal() returns for - // testing purposes. - std::unique_ptr<UrlLoader> test_loader_; - base::WeakPtrFactory<PdfViewWebPlugin> weak_factory_{this}; };
diff --git a/pdf/pdf_view_web_plugin_unittest.cc b/pdf/pdf_view_web_plugin_unittest.cc index c9edb2d2..555edae 100644 --- a/pdf/pdf_view_web_plugin_unittest.cc +++ b/pdf/pdf_view_web_plugin_unittest.cc
@@ -33,11 +33,16 @@ #include "third_party/blink/public/common/input/web_keyboard_event.h" #include "third_party/blink/public/common/input/web_mouse_event.h" #include "third_party/blink/public/common/input/web_pointer_properties.h" +#include "third_party/blink/public/common/loader/http_body_element_type.h" +#include "third_party/blink/public/platform/web_data.h" +#include "third_party/blink/public/platform/web_http_body.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/platform/web_text_input_type.h" #include "third_party/blink/public/platform/web_url.h" -#include "third_party/blink/public/platform/web_vector.h" +#include "third_party/blink/public/platform/web_url_request.h" +#include "third_party/blink/public/platform/web_url_response.h" #include "third_party/blink/public/web/web_associated_url_loader.h" +#include "third_party/blink/public/web/web_associated_url_loader_client.h" #include "third_party/blink/public/web/web_plugin_container.h" #include "third_party/blink/public/web/web_plugin_params.h" #include "third_party/skia/include/core/SkBitmap.h" @@ -58,11 +63,13 @@ #include "ui/gfx/geometry/vector2d_f.h" #include "ui/gfx/range/range.h" #include "ui/latency/latency_info.h" +#include "url/gurl.h" namespace chrome_pdf { namespace { +using ::testing::ElementsAreArray; using ::testing::Eq; using ::testing::InSequence; using ::testing::Invoke; @@ -149,14 +156,49 @@ return web_event; } +class MockWebAssociatedURLLoader : public blink::WebAssociatedURLLoader { + public: + MockWebAssociatedURLLoader() { + ON_CALL(*this, LoadAsynchronously) + .WillByDefault([](const blink::WebURLRequest& /*request*/, + blink::WebAssociatedURLLoaderClient* client) { + // TODO(crbug.com/1322928): Must trigger callback to free `UrlLoader`. + client->DidReceiveResponse(blink::WebURLResponse()); + client->DidFinishLoading(); + }); + } + + // blink::WebAssociatedURLLoader: + MOCK_METHOD(void, + LoadAsynchronously, + (const blink::WebURLRequest&, + blink::WebAssociatedURLLoaderClient*), + (override)); + MOCK_METHOD(void, Cancel, (), (override)); + MOCK_METHOD(void, SetDefersLoading, (bool), (override)); + MOCK_METHOD(void, + SetLoadingTaskRunner, + (base::SingleThreadTaskRunner*), + (override)); +}; + class FakePdfViewWebPluginClient : public PdfViewWebPlugin::Client { public: void SetPlugin(PdfViewWebPlugin* web_plugin) { web_plugin_ = web_plugin; + ON_CALL(*this, CompleteURL) + .WillByDefault([this](const blink::WebString& partial_url) { + return GURL(web_plugin_->GetURL()).Resolve(partial_url.Utf8()); + }); + ON_CALL(*this, CreateAssociatedURLLoader).WillByDefault([]() { + return std::make_unique<NiceMock<MockWebAssociatedURLLoader>>(); + }); ON_CALL(*this, UpdateTextInputState) .WillByDefault(Invoke( this, &FakePdfViewWebPluginClient::UpdateTextInputStateFromPlugin)); + ON_CALL(*this, HasFrame).WillByDefault(Return(true)); + UpdateTextInputStateFromPlugin(); } @@ -265,29 +307,9 @@ base::WeakPtrFactory<FakePdfViewWebPluginClient> weak_factory_{this}; }; -class MockUrlLoader : public UrlLoader { - public: - MOCK_METHOD(void, GrantUniversalAccess, (), (override)); - MOCK_METHOD(void, - Open, - (const UrlRequest&, base::OnceCallback<void(int)>), - (override)); - MOCK_METHOD(void, - ReadResponseBody, - (base::span<char>, base::OnceCallback<void(int)>), - (override)); - MOCK_METHOD(void, Close, (), (override)); -}; - } // namespace class PdfViewWebPluginWithoutInitializeTest : public testing::Test { - public: - PdfViewWebPluginWithoutInitializeTest( - const PdfViewWebPluginWithoutInitializeTest&) = delete; - PdfViewWebPluginWithoutInitializeTest& operator=( - const PdfViewWebPluginWithoutInitializeTest&) = delete; - protected: // Custom deleter for `plugin_`. PdfViewWebPlugin must be destroyed by // PdfViewWebPlugin::Destroy() instead of its destructor. @@ -295,15 +317,7 @@ void operator()(PdfViewWebPlugin* ptr) { ptr->Destroy(); } }; - PdfViewWebPluginWithoutInitializeTest() = default; - ~PdfViewWebPluginWithoutInitializeTest() override = default; - - void SetUp() override { - // Set a dummy URL for initializing the plugin. - blink::WebPluginParams params; - params.attribute_names.push_back(blink::WebString("src")); - params.attribute_values.push_back(blink::WebString("dummy.pdf")); - + void SetUpPlugin(const blink::WebPluginParams& params) { auto client = std::make_unique<NiceMock<FakePdfViewWebPluginClient>>(); client_ptr_ = client.get(); @@ -315,6 +329,13 @@ client_ptr_->SetPlugin(plugin_.get()); } + void SetUpPluginWithUrl(const std::string& url) { + blink::WebPluginParams params; + params.attribute_names.push_back("src"); + params.attribute_values.push_back(blink::WebString::FromUTF8(url)); + SetUpPlugin(params); + } + void TearDown() override { plugin_.reset(); } raw_ptr<FakePdfViewWebPluginClient> client_ptr_; @@ -324,12 +345,11 @@ class PdfViewWebPluginTest : public PdfViewWebPluginWithoutInitializeTest { protected: void SetUp() override { - PdfViewWebPluginWithoutInitializeTest::SetUp(); + SetUpPluginWithUrl("dummy.pdf"); auto engine = CreateEngine(); engine_ptr_ = engine.get(); - EXPECT_TRUE( - plugin_->InitializeForTesting(std::move(engine), CreateLoader())); + EXPECT_TRUE(plugin_->InitializeForTesting(std::move(engine))); } // Allow derived test classes to create their own custom TestPDFiumEngine. @@ -337,9 +357,6 @@ return std::make_unique<NiceMock<TestPDFiumEngine>>(plugin_.get()); } - // Allow derived test classes to create their own custom loaders. - virtual std::unique_ptr<UrlLoader> CreateLoader() { return nullptr; } - void SetDocumentDimensions(const gfx::Size& dimensions) { EXPECT_CALL(*engine_ptr_, ApplyDocumentLayout) .WillRepeatedly(Return(dimensions)); @@ -440,13 +457,17 @@ }; TEST_F(PdfViewWebPluginWithoutInitializeTest, Initialize) { - auto engine = std::make_unique<NiceMock<TestPDFiumEngine>>(plugin_.get()); - EXPECT_CALL(*client_ptr_, - RequestTouchEventType( - blink::WebPluginContainer::kTouchEventRequestTypeRaw)); + SetUpPluginWithUrl("dummy.pdf"); - EXPECT_TRUE( - plugin_->InitializeForTesting(std::move(engine), /*loader=*/nullptr)); + EXPECT_TRUE(plugin_->InitializeForTesting( + std::make_unique<NiceMock<TestPDFiumEngine>>(plugin_.get()))); +} + +TEST_F(PdfViewWebPluginWithoutInitializeTest, InitializeWithEmptyUrl) { + SetUpPluginWithUrl(""); + + EXPECT_FALSE(plugin_->InitializeForTesting( + std::make_unique<NiceMock<TestPDFiumEngine>>(plugin_.get()))); } TEST_F(PdfViewWebPluginTest, UpdateGeometrySetsPluginRect) { @@ -906,30 +927,19 @@ plugin_->NotifyNumberOfFindResultsChanged(/*total=*/5, /*final_result=*/true); } -class PdfViewWebPluginWithoutDocInfoTest : public PdfViewWebPluginTest { - public: - std::unique_ptr<UrlLoader> CreateLoader() override { - return std::make_unique<NiceMock<MockUrlLoader>>(); - } +TEST_F(PdfViewWebPluginTest, DocumentLoadCompletePostMessages) { + base::Value::Dict metadata; + metadata.Set("fileSize", "0 B"); + metadata.Set("linearized", false); + metadata.Set("pageSize", "Varies"); + metadata.Set("canSerializeDocument", true); - static base::Value::Dict CreateExpectedNoMetadataResponse() { - base::Value::Dict metadata; - metadata.Set("fileSize", "0 B"); - metadata.Set("linearized", false); - metadata.Set("pageSize", "Varies"); - metadata.Set("canSerializeDocument", true); + base::Value::Dict message; + message.Set("type", "metadata"); + message.Set("metadataData", std::move(metadata)); - base::Value::Dict message; - message.Set("type", "metadata"); - message.Set("metadataData", std::move(metadata)); - return message; - } -}; - -TEST_F(PdfViewWebPluginWithoutDocInfoTest, DocumentLoadCompletePostMessages) { - const base::Value::Dict expect_metadata = CreateExpectedNoMetadataResponse(); EXPECT_CALL(*client_ptr_, PostMessage); - EXPECT_CALL(*client_ptr_, PostMessage(Eq(std::ref(expect_metadata)))); + EXPECT_CALL(*client_ptr_, PostMessage(Eq(std::ref(message)))); plugin_->DocumentLoadComplete(); } @@ -1019,9 +1029,6 @@ std::unique_ptr<TestPDFiumEngine> CreateEngine() override { return std::make_unique<TestPDFiumEngineWithDocInfo>(plugin_.get()); } - std::unique_ptr<UrlLoader> CreateLoader() override { - return std::make_unique<NiceMock<MockUrlLoader>>(); - } static base::Value::Dict CreateExpectedAttachmentsResponse() { base::Value::List attachments; @@ -1098,4 +1105,102 @@ plugin_->DocumentLoadComplete(); } +class PdfViewWebPluginSubmitFormTest + : public PdfViewWebPluginWithoutInitializeTest { + protected: + void SubmitForm(const std::string& url, + base::StringPiece form_data = "data") { + EXPECT_TRUE(plugin_->InitializeForTesting( + std::make_unique<NiceMock<TestPDFiumEngine>>(plugin_.get()))); + + EXPECT_CALL(*client_ptr_, CreateAssociatedURLLoader).WillOnce([this]() { + auto associated_loader = + std::make_unique<NiceMock<MockWebAssociatedURLLoader>>(); + EXPECT_CALL(*associated_loader, LoadAsynchronously) + .WillOnce([this](const blink::WebURLRequest& request, + blink::WebAssociatedURLLoaderClient* /*client*/) { + // TODO(crbug.com/1322928): The `UrlLoader` created by `LoadUrl()` + // and `SubmitForm()` shouldn't use different ownership semantics. + // The loader created by `SubmitForm()` is owned by the plugin, and + // cannot leak past the destruction of the plugin. + request_.CopyFrom(request); + }); + return associated_loader; + }); + + plugin_->SubmitForm(url, form_data.data(), form_data.size()); + } + + void SubmitFailingForm(const std::string& url) { + EXPECT_TRUE(plugin_->InitializeForTesting( + std::make_unique<NiceMock<TestPDFiumEngine>>(plugin_.get()))); + + EXPECT_CALL(*client_ptr_, CreateAssociatedURLLoader).Times(0); + + constexpr base::StringPiece kFormData = "form data"; + plugin_->SubmitForm(url, kFormData.data(), kFormData.size()); + } + + blink::WebURLRequest request_; +}; + +TEST_F(PdfViewWebPluginSubmitFormTest, RequestMethod) { + SetUpPluginWithUrl("https://www.example.com/path/to/the.pdf"); + + SubmitForm(/*url=*/""); + + EXPECT_EQ(request_.HttpMethod(), blink::WebString::FromASCII("POST")); +} + +TEST_F(PdfViewWebPluginSubmitFormTest, RequestBody) { + SetUpPluginWithUrl("https://www.example.com/path/to/the.pdf"); + + constexpr base::StringPiece kFormData = "form data"; + SubmitForm(/*url=*/"", kFormData); + + blink::WebHTTPBody::Element element; + ASSERT_TRUE(request_.HttpBody().ElementAt(0, element)); + ASSERT_EQ(element.type, blink::HTTPBodyElementType::kTypeData); + EXPECT_THAT(element.data.Copy(), testing::ElementsAreArray(kFormData)); +} + +TEST_F(PdfViewWebPluginSubmitFormTest, RelativeUrl) { + SetUpPluginWithUrl("https://www.example.com/path/to/the.pdf"); + + SubmitForm("relative_endpoint"); + + EXPECT_EQ(request_.Url().GetString(), + "https://www.example.com/path/to/relative_endpoint"); +} + +TEST_F(PdfViewWebPluginSubmitFormTest, NoRelativeUrl) { + SetUpPluginWithUrl("https://www.example.com/path/to/the.pdf"); + + SubmitForm(""); + + EXPECT_EQ(request_.Url().GetString(), + "https://www.example.com/path/to/the.pdf"); +} + +TEST_F(PdfViewWebPluginSubmitFormTest, AbsoluteUrl) { + SetUpPluginWithUrl("https://a.example.com/path/to/the.pdf"); + + SubmitForm("https://b.example.com/relative_endpoint"); + + EXPECT_EQ(request_.Url().GetString(), + "https://b.example.com/relative_endpoint"); +} + +TEST_F(PdfViewWebPluginSubmitFormTest, RelativeUrlInvalidDocumentUrl) { + SetUpPluginWithUrl("https://www.%B%Ad.com/path/to/the.pdf"); + + SubmitFailingForm("relative_endpoint"); +} + +TEST_F(PdfViewWebPluginSubmitFormTest, AbsoluteUrlInvalidDocumentUrl) { + SetUpPluginWithUrl("https://www.%B%Ad.com/path/to/the.pdf"); + + SubmitFailingForm("https://wwww.example.com"); +} + } // namespace chrome_pdf
diff --git a/printing/printing_context.cc b/printing/printing_context.cc index acffe19..93db1a8 100644 --- a/printing/printing_context.cc +++ b/printing/printing_context.cc
@@ -101,8 +101,9 @@ pdf_settings.Set(kSettingCollate, true); pdf_settings.Set(kSettingCopies, 1); pdf_settings.Set(kSettingColor, static_cast<int>(mojom::ColorModel::kColor)); - pdf_settings.Set(kSettingDpiHorizontal, kPointsPerInch); - pdf_settings.Set(kSettingDpiVertical, kPointsPerInch); + // DPI value should match GetPdfCapabilities(). + pdf_settings.Set(kSettingDpiHorizontal, kDefaultPdfDpi); + pdf_settings.Set(kSettingDpiVertical, kDefaultPdfDpi); pdf_settings.Set(kSettingDuplexMode, static_cast<int>(printing::mojom::DuplexMode::kSimplex)); pdf_settings.Set(kSettingLandscape, false); @@ -152,7 +153,8 @@ if (!open_in_external_preview && (printer_type == mojom::PrinterType::kPdf || printer_type == mojom::PrinterType::kExtension)) { - settings_->set_dpi(kDefaultPdfDpi); + if (printer_type == mojom::PrinterType::kExtension) + settings_->set_dpi(kDefaultPdfDpi); gfx::Size paper_size(GetPdfPaperSizeDeviceUnits()); if (!settings_->requested_media().size_microns.IsEmpty()) { float device_microns_per_device_unit =
diff --git a/sandbox/policy/BUILD.gn b/sandbox/policy/BUILD.gn index 3cfc7a36..9a9c8714 100644 --- a/sandbox/policy/BUILD.gn +++ b/sandbox/policy/BUILD.gn
@@ -6,7 +6,7 @@ import("//build/config/chromecast_build.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/sanitizers/sanitizers.gni") -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") import("//components/services/screen_ai/buildflags/features.gni") import("//printing/buildflags/buildflags.gni") import("//testing/test.gni") @@ -104,7 +104,7 @@ "linux/bpf_tts_policy_linux.cc", "linux/bpf_tts_policy_linux.h", ] - deps += [ "//chromeos/assistant:buildflags" ] + deps += [ "//chromeos/ash/components/assistant:buildflags" ] if (enable_cros_libassistant) { sources += [
diff --git a/sandbox/policy/DEPS b/sandbox/policy/DEPS index a5d1e2d..c5e17f3 100644 --- a/sandbox/policy/DEPS +++ b/sandbox/policy/DEPS
@@ -1,5 +1,5 @@ include_rules = [ - "+chromeos/assistant/buildflags.h", + "+chromeos/ash/components/assistant/buildflags.h", "+components/services/screen_ai/buildflags", "+ppapi/buildflags", "+printing/buildflags",
diff --git a/sandbox/policy/linux/sandbox_seccomp_bpf_linux.cc b/sandbox/policy/linux/sandbox_seccomp_bpf_linux.cc index c01f257a..36b2147 100644 --- a/sandbox/policy/linux/sandbox_seccomp_bpf_linux.cc +++ b/sandbox/policy/linux/sandbox_seccomp_bpf_linux.cc
@@ -61,7 +61,7 @@ #include "sandbox/policy/linux/bpf_ime_policy_linux.h" #include "sandbox/policy/linux/bpf_tts_policy_linux.h" -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #if BUILDFLAG(ENABLE_CROS_LIBASSISTANT) #include "sandbox/policy/linux/bpf_libassistant_policy_linux.h" #endif // BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
diff --git a/sandbox/policy/mojom/BUILD.gn b/sandbox/policy/mojom/BUILD.gn index 1ec0a73c2..e47917a4 100644 --- a/sandbox/policy/mojom/BUILD.gn +++ b/sandbox/policy/mojom/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//chromeos/assistant/assistant.gni") +import("//chromeos/ash/components/assistant/assistant.gni") import("//components/services/screen_ai/buildflags/features.gni") import("//mojo/public/tools/bindings/mojom.gni") import("//ppapi/buildflags/buildflags.gni")
diff --git a/sandbox/policy/switches.h b/sandbox/policy/switches.h index 6ba6d2b..76b3dae0 100644 --- a/sandbox/policy/switches.h +++ b/sandbox/policy/switches.h
@@ -12,7 +12,7 @@ #include "sandbox/policy/export.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "chromeos/assistant/buildflags.h" +#include "chromeos/ash/components/assistant/buildflags.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) namespace sandbox {
diff --git a/services/network/cors/cors_url_loader_factory.cc b/services/network/cors/cors_url_loader_factory.cc index 4c9db3bd..8ddf6ba9b 100644 --- a/services/network/cors/cors_url_loader_factory.cc +++ b/services/network/cors/cors_url_loader_factory.cc
@@ -322,8 +322,6 @@ } void CorsURLLoaderFactory::DeleteIfNeeded() { - if (!context_) - return; if (receivers_.empty() && url_loaders_.empty() && cors_url_loaders_.empty()) context_->DestroyURLLoaderFactory(this); } @@ -508,7 +506,7 @@ return false; } - if (context_ && !GetAllowAnyCorsExemptHeaderForBrowser() && + if (!GetAllowAnyCorsExemptHeaderForBrowser() && !IsValidCorsExemptHeaders(*context_->cors_exempt_header_list(), request.cors_exempt_headers)) { return false; @@ -612,7 +610,7 @@ } bool CorsURLLoaderFactory::GetAllowAnyCorsExemptHeaderForBrowser() const { - return context_ && process_id_ == mojom::kBrowserProcessId && + return process_id_ == mojom::kBrowserProcessId && context_->allow_any_cors_exempt_header_for_browser(); }
diff --git a/services/network/cors/cors_url_loader_factory.h b/services/network/cors/cors_url_loader_factory.h index cb959d79..71e70747 100644 --- a/services/network/cors/cors_url_loader_factory.h +++ b/services/network/cors/cors_url_loader_factory.h
@@ -111,8 +111,7 @@ void OnLoaderCreated( std::unique_ptr<T> loader, std::set<std::unique_ptr<T>, base::UniquePtrComparator>& loaders) { - if (context_) - context_->LoaderCreated(process_id_); + context_->LoaderCreated(process_id_); loaders.insert(std::move(loader)); } @@ -120,8 +119,7 @@ void DestroyLoader( T* loader, std::set<std::unique_ptr<T>, base::UniquePtrComparator>& loaders) { - if (context_) - context_->LoaderDestroyed(process_id_); + context_->LoaderDestroyed(process_id_); auto it = loaders.find(loader); DCHECK(it != loaders.end()); loaders.erase(it); @@ -131,10 +129,9 @@ mojo::ReceiverSet<mojom::URLLoaderFactory> receivers_; - // Used when constructed by NetworkContext. - // The NetworkContext owns `this`. + // The NetworkContext owns `this`. Initialized in the construct and must be + // non-null. const raw_ptr<NetworkContext> context_ = nullptr; - scoped_refptr<ResourceSchedulerClient> resource_scheduler_client_; // If false, ResourceRequests cannot have their `trusted_params` fields set. bool is_trusted_;
diff --git a/services/network/public/mojom/network_service_test.mojom b/services/network/public/mojom/network_service_test.mojom index 364a7469..8a7140f 100644 --- a/services/network/public/mojom/network_service_test.mojom +++ b/services/network/public/mojom/network_service_test.mojom
@@ -128,6 +128,11 @@ // NetworkQualityEstimatorManagerClient implementations. SimulateNetworkQualityChange(EffectiveConnectionType type) => (); + // Let NetworkQualityEstimator reports NetworkChangeNotifier::CONNECTION_WIFI + // as EFFECTIVE_CONNECTION_TYPE_SLOW_2G since EffectiveConnectionType and + // the production receivers doesn't notice Wifi. + ForceNetworkQualityEstimatorReportWifiAsSlow2G() => (); + // Crash the process where network service is running. SimulateCrash();
diff --git a/services/viz/privileged/mojom/viz_main.mojom b/services/viz/privileged/mojom/viz_main.mojom index f5a445a..c239702 100644 --- a/services/viz/privileged/mojom/viz_main.mojom +++ b/services/viz/privileged/mojom/viz_main.mojom
@@ -6,6 +6,7 @@ import "components/discardable_memory/public/mojom/discardable_shared_memory_manager.mojom"; import "mojo/public/mojom/base/values.mojom"; +import "mojo/public/mojom/base/shared_memory.mojom"; import "services/viz/public/mojom/compositing/compositing_mode_watcher.mojom"; import "services/viz/privileged/mojom/compositing/frame_sink_manager.mojom"; import "services/viz/privileged/mojom/compositing/renderer_settings.mojom"; @@ -51,7 +52,7 @@ pending_remote<GpuHost> gpu_host, pending_remote<discardable_memory.mojom.DiscardableSharedMemoryManager> discardable_memory_manager, - handle<shared_buffer>? activity_flags, + mojo_base.mojom.UnsafeSharedMemoryRegion? activity_flags, gfx.mojom.SubpixelRendering subpixel_rendering); // Create a GPU info collection service provided by the info-collection GPU
diff --git a/skia/ext/rgba_to_yuva.cc b/skia/ext/rgba_to_yuva.cc index 8559a66..3479d10 100644 --- a/skia/ext/rgba_to_yuva.cc +++ b/skia/ext/rgba_to_yuva.cc
@@ -4,24 +4,45 @@ #include "skia/ext/rgba_to_yuva.h" +#include <array> + #include "base/logging.h" #include "base/notreached.h" +#include "third_party/skia/include/core/SkBlendMode.h" #include "third_party/skia/include/core/SkCanvas.h" +#include "third_party/skia/include/core/SkClipOp.h" +#include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkColorFilter.h" #include "third_party/skia/include/core/SkPaint.h" +#include "third_party/skia/include/core/SkRect.h" #include "third_party/skia/include/effects/SkColorMatrix.h" namespace skia { +namespace { + +SkRect GetSubsampledRect(const SkRect& rect, + const std::array<float, 2>& subsampling_factors) { + return SkRect::MakeXYWH(rect.x() * subsampling_factors[0], + rect.y() * subsampling_factors[1], + rect.width() * subsampling_factors[0], + rect.height() * subsampling_factors[1]); +} + +} // namespace + void BlitRGBAToYUVA(SkImage* src_image, SkSurface* dst_surfaces[SkYUVAInfo::kMaxPlanes], const SkYUVAInfo& dst_yuva_info, - const SkRect& dst_region) { + const SkRect& dst_region, + bool clear_destination) { + // Rectangle representing the entire destination image: + const SkRect dst_image_rect = SkRect::Make(dst_yuva_info.dimensions()); const SkRect src_rect = SkRect::Make(src_image->bounds()); - const SkRect dst_rect = - dst_region.isEmpty() - ? SkRect::MakeSize(SkSize::Make(dst_yuva_info.dimensions())) - : dst_region; + // Region of destination image that is supposed to be populated: + const SkRect dst_rect = dst_region.isEmpty() ? dst_image_rect : dst_region; + + DCHECK(dst_image_rect.contains(dst_rect)); // Permutation matrices to select the appropriate YUVA channels for each // output plane. @@ -50,6 +71,8 @@ // Blit each plane. for (int plane = 0; plane < dst_yuva_info.numPlanes(); ++plane) { + SkCanvas* plane_canvas = dst_surfaces[plane]->getCanvas(); + SkColorMatrix color_matrix = rgb_to_yuv_matrix; color_matrix.postConcat(permutation_matrices[plane]); @@ -67,21 +90,29 @@ // Subsampling factors are determined by the ratios of the entire image's // width & height to the dimensions of the passed in surfaces (which should // also span the entire logical image): - float subsampling_factors[2] = { + std::array<float, 2> subsampling_factors = { static_cast<float>(dst_surfaces[plane]->width()) / dst_yuva_info.dimensions().width(), static_cast<float>(dst_surfaces[plane]->height()) / dst_yuva_info.dimensions().height(), }; - SkRect plane_dst_rect = - SkRect::MakeXYWH(dst_rect.x() * subsampling_factors[0], - dst_rect.y() * subsampling_factors[1], - dst_rect.width() * subsampling_factors[0], - dst_rect.height() * subsampling_factors[1]); - dst_surfaces[plane]->getCanvas()->drawImageRect( - src_image, src_rect, plane_dst_rect, sampling_options, &paint, - SkCanvas::kFast_SrcRectConstraint); + if (clear_destination && dst_image_rect != dst_rect) { + // If we were told to clear the destination prior to blitting and we know + // the blit won't populate the entire destination image, issue the draw + // call that fills the destination with black and takes into account the + // color conversion needed. + SkPaint clear_paint(paint); + clear_paint.setColor(SK_ColorBLACK); + + plane_canvas->drawPaint(clear_paint); + } + + const SkRect plane_dst_rect = + GetSubsampledRect(dst_rect, subsampling_factors); + plane_canvas->drawImageRect(src_image, src_rect, plane_dst_rect, + sampling_options, &paint, + SkCanvas::kFast_SrcRectConstraint); } }
diff --git a/skia/ext/rgba_to_yuva.h b/skia/ext/rgba_to_yuva.h index c6b6d84..61becb9 100644 --- a/skia/ext/rgba_to_yuva.h +++ b/skia/ext/rgba_to_yuva.h
@@ -6,6 +6,7 @@ #define SKIA_EXT_RGBA_TO_YUVA_H_ #include "third_party/skia/include/core/SkImage.h" +#include "third_party/skia/include/core/SkRect.h" #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/core/SkYUVAInfo.h" @@ -16,11 +17,13 @@ // `dst_yuva_info`. `dst_yuva_info` describes the entire destination image - the // results of the blit operation will be placed in its subregion, described by // `dst_region`. If a default-constructed `dst_region` is passed in, the entire -// destination image will be written to. +// destination image will be written to. If `clear_destination` is true, the +// entire destination image will be cleared with black before the blit. SK_API void BlitRGBAToYUVA(SkImage* src_image, SkSurface* dst_surfaces[SkYUVAInfo::kMaxPlanes], const SkYUVAInfo& dst_yuva_info, - const SkRect& dst_region = SkRect::MakeEmpty()); + const SkRect& dst_region = SkRect::MakeEmpty(), + bool clear_destination = false); } // namespace skia
diff --git a/storage/browser/quota/quota_database.cc b/storage/browser/quota/quota_database.cc index 44e6f30..09c45e82 100644 --- a/storage/browser/quota/quota_database.cc +++ b/storage/browser/quota/quota_database.cc
@@ -49,8 +49,9 @@ // Version 6 - 2021-04-27 - https://crrev.com/c/2757450 // Version 7 - 2021-05-20 - https://crrev.com/c/2910136 // Version 8 - 2021-09-01 - https://crrev.com/c/3119831 -const int kQuotaDatabaseCurrentSchemaVersion = 8; -const int kQuotaDatabaseCompatibleVersion = 8; +// Version 9 - 2022-05-13 - https://crrev.com/c/3601253 +const int kQuotaDatabaseCurrentSchemaVersion = 9; +const int kQuotaDatabaseCompatibleVersion = 9; // Definitions for database schema. const char kHostQuotaTable[] = "quota"; @@ -83,7 +84,7 @@ " PRIMARY KEY(host, type))" " WITHOUT ROWID"}, {kBucketTable, - "(id INTEGER PRIMARY KEY," + "(id INTEGER PRIMARY KEY AUTOINCREMENT," " storage_key TEXT NOT NULL," " host TEXT NOT NULL," " type INTEGER NOT NULL," @@ -92,13 +93,16 @@ " last_accessed INTEGER NOT NULL," " last_modified INTEGER NOT NULL," " expiration INTEGER NOT NULL," - " quota INTEGER NOT NULL)"}}; + " quota INTEGER NOT NULL," + " persistent INTEGER NOT NULL," + " durability INTEGER NOT NULL)" + " STRICT"}}; const size_t QuotaDatabase::kTableCount = std::size(QuotaDatabase::kTables); // static const QuotaDatabase::IndexSchema QuotaDatabase::kIndexes[] = { {"buckets_by_storage_key", kBucketTable, "(storage_key, type, name)", true}, - {"buckets_by_host", kBucketTable, "(type, host)", false}, + {"buckets_by_host", kBucketTable, "(host, type)", false}, {"buckets_by_last_accessed", kBucketTable, "(type, last_accessed)", false}, {"buckets_by_last_modified", kBucketTable, "(type, last_modified)", false}, {"buckets_by_expiration", kBucketTable, "(expiration)", false}, @@ -483,15 +487,17 @@ "last_accessed," "last_modified," "expiration," - "quota) " - "VALUES (?, ?, ?, ?, 0, 0, 0, ?, 0)"; + "quota," + "persistent," + "durability) " + "VALUES (?, ?, ?, ?, 0, 0, 0, ?, 0, 0, 0)"; // clang-format on sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); statement.BindString(0, storage_key.Serialize()); statement.BindString(1, storage_key.origin().host()); statement.BindInt(2, static_cast<int>(storage_type)); statement.BindString(3, kDefaultBucketName); - statement.BindTime(4, base::Time::Max()); + statement.BindTime(4, base::Time()); if (!statement.Run()) return QuotaError::kDatabaseError; @@ -1101,8 +1107,10 @@ "last_accessed," "last_modified," "expiration," - "quota) " - "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + "quota," + "persistent," + "durability) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 0)"; // clang-format on sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql)); statement.BindString(0, storage_key.Serialize()); @@ -1112,7 +1120,7 @@ statement.BindInt(4, use_count); statement.BindTime(5, last_accessed); statement.BindTime(6, last_modified); - const base::Time expires = expiration.value_or(base::Time::Max()); + const base::Time expires = expiration.value_or(base::Time()); statement.BindTime(7, expires); statement.BindInt64(8, quota);
diff --git a/storage/browser/quota/quota_database_migrations.cc b/storage/browser/quota/quota_database_migrations.cc index 9402fb2..acc6a68 100644 --- a/storage/browser/quota/quota_database_migrations.cc +++ b/storage/browser/quota/quota_database_migrations.cc
@@ -8,15 +8,66 @@ #include "base/sequence_checker.h" #include "components/services/storage/public/cpp/buckets/bucket_id.h" +#include "components/services/storage/public/cpp/buckets/constants.h" #include "sql/database.h" #include "sql/meta_table.h" #include "sql/statement.h" #include "sql/transaction.h" #include "storage/browser/quota/quota_database.h" #include "third_party/blink/public/common/storage_key/storage_key.h" +#include "third_party/blink/public/mojom/buckets/bucket_manager_host.mojom.h" namespace storage { +namespace { + +// Overwrites the buckets table with the new_buckets table after data has been +// copied from the former into the latter. +bool OverwriteBucketsTableSetUpIndexes(sql::Database* db) { + // Replace buckets table with new table. + static constexpr char kDeleteBucketTableSql[] = "DROP TABLE buckets"; + if (!db->Execute(kDeleteBucketTableSql)) + return false; + + static constexpr char kRenameBucketTableSql[] = + "ALTER TABLE new_buckets RENAME to buckets"; + if (!db->Execute(kRenameBucketTableSql)) + return false; + + // Create indices on new table. + // clang-format off + static constexpr char kStorageKeyIndexSql[] = + "CREATE UNIQUE INDEX buckets_by_storage_key " + "ON buckets(storage_key, type, name)"; + // clang-format on + if (!db->Execute(kStorageKeyIndexSql)) + return false; + + static constexpr char kHostIndexSql[] = + "CREATE INDEX buckets_by_host ON buckets(host, type)"; + if (!db->Execute(kHostIndexSql)) + return false; + + static constexpr char kLastAccessedIndexSql[] = + "CREATE INDEX buckets_by_last_accessed ON buckets(type, last_accessed)"; + if (!db->Execute(kLastAccessedIndexSql)) + return false; + + static constexpr char kLastModifiedIndexSql[] = + "CREATE INDEX buckets_by_last_modified ON buckets(type, last_modified)"; + if (!db->Execute(kLastModifiedIndexSql)) + return false; + + static constexpr char kExpirationIndexSql[] = + "CREATE INDEX buckets_by_expiration ON buckets(expiration)"; + if (!db->Execute(kExpirationIndexSql)) + return false; + + return true; +} + +} // namespace + // static bool QuotaDatabaseMigrations::UpgradeSchema(QuotaDatabase& quota_database) { DCHECK_CALLED_ON_VALID_SEQUENCE(quota_database.sequence_checker_); @@ -41,7 +92,12 @@ return false; } - return quota_database.meta_table_->GetVersionNumber() == 8; + if (quota_database.meta_table_->GetVersionNumber() == 8) { + if (!MigrateFromVersion8ToVersion9(quota_database)) + return false; + } + + return quota_database.meta_table_->GetVersionNumber() == 9; } bool QuotaDatabaseMigrations::MigrateFromVersion5ToVersion7( @@ -219,9 +275,9 @@ db->GetCachedStatement(SQL_FROM_HERE, kInsertBucketSql)); // Transfer bucket data to the new table one at a time with new host data. - BucketId lastBucketId(0); + BucketId last_bucket_id(0); while (true) { - select_statement.BindInt64(0, lastBucketId.value()); + select_statement.BindInt64(0, last_bucket_id.value()); if (!select_statement.Step()) break; @@ -255,46 +311,10 @@ select_statement.Reset(/*clear_bound_vars=*/true); insert_statement.Reset(/*clear_bound_vars=*/true); - lastBucketId = bucket_id; + last_bucket_id = bucket_id; } - // Replace buckets table with new table. - static constexpr char kDeleteBucketTableSql[] = "DROP TABLE buckets"; - if (!db->Execute(kDeleteBucketTableSql)) - return false; - - static constexpr char kRenameBucketTableSql[] = - "ALTER TABLE new_buckets RENAME to buckets"; - if (!db->Execute(kRenameBucketTableSql)) - return false; - - // Create indices on new table. - // clang-format off - static constexpr char kStorageKeyIndexSql[] = - "CREATE UNIQUE INDEX buckets_by_storage_key " - "ON buckets(storage_key, type, name)"; - // clang-format on - if (!db->Execute(kStorageKeyIndexSql)) - return false; - - static constexpr char kHostIndexSql[] = - "CREATE INDEX buckets_by_host ON buckets(host, type)"; - if (!db->Execute(kHostIndexSql)) - return false; - - static constexpr char kLastAccessedIndexSql[] = - "CREATE INDEX buckets_by_last_accessed ON buckets(type, last_accessed)"; - if (!db->Execute(kLastAccessedIndexSql)) - return false; - - static constexpr char kLastModifiedIndexSql[] = - "CREATE INDEX buckets_by_last_modified ON buckets(type, last_modified)"; - if (!db->Execute(kLastModifiedIndexSql)) - return false; - - static constexpr char kExpirationIndexSql[] = - "CREATE INDEX buckets_by_expiration ON buckets(expiration)"; - if (!db->Execute(kExpirationIndexSql)) + if (!OverwriteBucketsTableSetUpIndexes(db)) return false; // Mark database as up to date. @@ -303,4 +323,106 @@ return transaction.Commit(); } +bool QuotaDatabaseMigrations::MigrateFromVersion8ToVersion9( + QuotaDatabase& quota_database) { + DCHECK_CALLED_ON_VALID_SEQUENCE(quota_database.sequence_checker_); + + sql::Database* db = quota_database.db_.get(); + sql::Transaction transaction(db); + if (!transaction.Begin()) + return false; + + // Create new buckets table. + // clang-format off + static constexpr char kNewBucketsTableSql[] = + "CREATE TABLE IF NOT EXISTS new_buckets(" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "storage_key TEXT NOT NULL, " + "host TEXT NOT NULL, " + "type INTEGER NOT NULL, " + "name TEXT NOT NULL, " + "use_count INTEGER NOT NULL, " + "last_accessed INTEGER NOT NULL, " + "last_modified INTEGER NOT NULL, " + "expiration INTEGER NOT NULL, " + "quota INTEGER NOT NULL, " + "persistent INTEGER NOT NULL, " + "durability INTEGER NOT NULL) " + "STRICT"; + // clang-format on + if (!db->Execute(kNewBucketsTableSql)) + return false; + + // clang-format off + static constexpr char kSelectBucketSql[] = + "SELECT " + "id,storage_key,host,type,name,use_count,last_accessed,last_modified," + "expiration,quota " + "FROM buckets " + "WHERE id > ? " + "ORDER BY id " + "LIMIT 1"; + // clang-format on + sql::Statement select_statement( + db->GetCachedStatement(SQL_FROM_HERE, kSelectBucketSql)); + + // clang-format off + static constexpr char kInsertBucketSql[] = + "INSERT into new_buckets(" + "id,storage_key,host,type,name,use_count,last_accessed,last_modified," + "expiration,quota,persistent,durability)" + "VALUES(?,?,?,?,?,?,?,?,?,?,?,?)"; + // clang-format on + sql::Statement insert_statement( + db->GetCachedStatement(SQL_FROM_HERE, kInsertBucketSql)); + + // Transfer bucket data to the new table one at a time with new + // persistence/durability (default) values. + BucketId last_bucket_id(0); + while (true) { + select_statement.BindInt64(0, last_bucket_id.value()); + if (!select_statement.Step()) + break; + + last_bucket_id = BucketId(select_statement.ColumnInt64(0)); + + insert_statement.BindInt64(0, select_statement.ColumnInt64(0)); + insert_statement.BindString(1, select_statement.ColumnString(1)); + insert_statement.BindString(2, select_statement.ColumnString(2)); + insert_statement.BindInt(3, select_statement.ColumnInt(3)); + const std::string bucket_name = select_statement.ColumnString(4); + insert_statement.BindString(4, bucket_name); + insert_statement.BindInt(5, select_statement.ColumnInt(5)); + insert_statement.BindTime(6, select_statement.ColumnTime(6)); + insert_statement.BindTime(7, select_statement.ColumnTime(7)); + // Prior to version 9, the default value for `expiration` was + // base::Time::Max(), and the value was unused. For version 9+, the default + // value is base::Time(). Reset old values to the new default. + insert_statement.BindTime(8, base::Time()); + insert_statement.BindInt(9, select_statement.ColumnInt(9)); + insert_statement.BindBool(10, false); + // The default durability depends on whether the bucket is default. As of + // the time of this migration, non-default buckets are not supported without + // a flag, but check the name anyway for correctness. + insert_statement.BindInt( + 11, static_cast<int>(bucket_name == kDefaultBucketName + ? blink::mojom::BucketDurability::kStrict + : blink::mojom::BucketDurability::kRelaxed)); + + if (!insert_statement.Run()) + return false; + + select_statement.Reset(/*clear_bound_vars=*/true); + insert_statement.Reset(/*clear_bound_vars=*/true); + } + + if (!OverwriteBucketsTableSetUpIndexes(db)) + return false; + + // Mark database as up to date. + quota_database.meta_table_->SetVersionNumber(9); + quota_database.meta_table_->SetCompatibleVersionNumber(9); + return transaction.Commit(); +} + } // namespace storage
diff --git a/storage/browser/quota/quota_database_migrations.h b/storage/browser/quota/quota_database_migrations.h index 2806597..28fdbc9 100644 --- a/storage/browser/quota/quota_database_migrations.h +++ b/storage/browser/quota/quota_database_migrations.h
@@ -26,6 +26,7 @@ static bool MigrateFromVersion5ToVersion7(QuotaDatabase& quota_database); static bool MigrateFromVersion6ToVersion7(QuotaDatabase& quota_database); static bool MigrateFromVersion7ToVersion8(QuotaDatabase& quota_database); + static bool MigrateFromVersion8ToVersion9(QuotaDatabase& quota_database); }; } // namespace storage
diff --git a/storage/browser/quota/quota_database_migrations_unittest.cc b/storage/browser/quota/quota_database_migrations_unittest.cc index 220d4d2..6eeeb9e 100644 --- a/storage/browser/quota/quota_database_migrations_unittest.cc +++ b/storage/browser/quota/quota_database_migrations_unittest.cc
@@ -17,8 +17,8 @@ namespace { -const int kCurrentSchemaVersion = 8; -const int kCurrentCompatibleVersion = 8; +const int kCurrentSchemaVersion = 9; +const int kCurrentCompatibleVersion = 9; std::string RemoveQuotes(std::string input) { std::string output; @@ -80,15 +80,28 @@ std::string GetCurrentSchema() { base::FilePath current_version_path = temp_directory_.GetPath().AppendASCII("current_version.db"); - EXPECT_TRUE(LoadDatabase("version_8.sql", current_version_path)); + EXPECT_TRUE(LoadDatabase("version_9.sql", current_version_path)); sql::Database db; EXPECT_TRUE(db.Open(current_version_path)); return db.GetSchema(); } + std::string GetQuotaDatabaseSchema() { + QuotaDatabase db(ProfilePath()); + EXPECT_EQ(db.EnsureOpened(), QuotaError::kNone); + DCHECK_CALLED_ON_VALID_SEQUENCE(db.sequence_checker_); + return db.db_->GetSchema(); + } + base::ScopedTempDir temp_directory_; }; +// Verify that the schema created by a new `QuotaDatabase` instance matches the +// current test schema file. +TEST_F(QuotaDatabaseMigrationsTest, QuotaDatabaseSchemaMatchesTestSchema) { + EXPECT_EQ(GetCurrentSchema(), GetQuotaDatabaseSchema()); +} + TEST_F(QuotaDatabaseMigrationsTest, UpgradeSchemaFromV5) { ASSERT_TRUE(LoadDatabase("version_5.sql", DbPath())); @@ -145,11 +158,11 @@ // Check that OriginInfoTable data is migrated to bucket table. EXPECT_EQ( "1|http://a/|a|0|default|123|13260644621105493|13242931862595604|" - "9223372036854775807|0," + "0|0|0|1," "2|http://b/|b|0|default|111|13250042735631065|13260999511438890|" - "9223372036854775807|0," + "0|0|0|1," "3|http://c/|c|1|default|321|13261163582572088|13261079941303629|" - "9223372036854775807|0", + "0|0|0|1", sql::test::ExecuteWithResults( &db, "SELECT * FROM buckets ORDER BY storage_key ASC", "|", ",")); @@ -217,11 +230,11 @@ // Check that buckets data is still present. EXPECT_EQ( "1|http://a/|a|0|bucket_a|123|13260644621105493|13242931862595604|" - "9223372036854775807|0," + "0|0|0|0," "2|http://b/|b|0|bucket_b|111|13250042735631065|13260999511438890|" - "9223372036854775807|1000," + "0|1000|0|0," "3|http://c/|c|1|bucket_c|321|13261163582572088|13261079941303629|" - "9223372036854775807|10000", + "0|10000|0|0", sql::test::ExecuteWithResults( &db, "SELECT * FROM buckets ORDER BY id ASC", "|", ",")); @@ -288,14 +301,91 @@ // Check that buckets data is still present. EXPECT_EQ( "1|http://a/|a|0|bucket_a|123|13260644621105493|13242931862595604|" - "9223372036854775807|0," + "0|0|0|0," "2|http://b/|b|0|bucket_b|111|13250042735631065|13260999511438890|" - "9223372036854775807|1000," + "0|1000|0|0," "3|chrome-extension://abc/||1|default|321|13261163582572088|" + "13261079941303629|0|10000|0|1", + sql::test::ExecuteWithResults( + &db, "SELECT * FROM buckets ORDER BY id ASC", "|", ",")); + + // Check that quota data is still present. + EXPECT_EQ("a.com,b.com,c.com", + sql::test::ExecuteWithResults( + &db, "SELECT host FROM quota ORDER BY host ASC", "|", ",")); + + EXPECT_EQ(GetCurrentSchema(), RemoveQuotes(db.GetSchema())); + } +} + +TEST_F(QuotaDatabaseMigrationsTest, UpgradeSchemaFromV8) { + ASSERT_TRUE(LoadDatabase("version_8.sql", DbPath())); + + { + sql::Database db; + ASSERT_TRUE(db.Open(DbPath())); + + ASSERT_TRUE(sql::MetaTable::DoesTableExist(&db)); + sql::MetaTable meta_table; + ASSERT_TRUE( + meta_table.Init(&db, kCurrentSchemaVersion, kCurrentCompatibleVersion)); + ASSERT_EQ(meta_table.GetVersionNumber(), 8); + ASSERT_EQ(meta_table.GetCompatibleVersionNumber(), 8); + + ASSERT_TRUE(db.DoesTableExist("quota")); + ASSERT_TRUE(db.DoesTableExist("buckets")); + + // Check populated data. + EXPECT_EQ( + "1|http://a/|http://a/" + "|0|bucket_a|123|13260644621105493|13242931862595604|" + "9223372036854775807|0," + "2|http://b/|http://b/" + "|0|bucket_b|111|13250042735631065|13260999511438890|" + "9223372036854775807|1000," + "3|chrome-extension://abc/|chrome-extension://abc/" + "|1|default|321|13261163582572088|" "13261079941303629|9223372036854775807|10000", sql::test::ExecuteWithResults( &db, "SELECT * FROM buckets ORDER BY id ASC", "|", ",")); + EXPECT_EQ("a.com,b.com,c.com", + sql::test::ExecuteWithResults( + &db, "SELECT host FROM quota ORDER BY host ASC", "|", ",")); + } + + MigrateDatabase(); + + // Verify upgraded schema. + { + sql::Database db; + ASSERT_TRUE(db.Open(DbPath())); + + ASSERT_TRUE(sql::MetaTable::DoesTableExist(&db)); + sql::MetaTable meta_table; + ASSERT_TRUE( + meta_table.Init(&db, kCurrentSchemaVersion, kCurrentCompatibleVersion)); + EXPECT_EQ(meta_table.GetVersionNumber(), kCurrentSchemaVersion); + EXPECT_EQ(meta_table.GetCompatibleVersionNumber(), kCurrentSchemaVersion); + + ASSERT_TRUE(db.DoesTableExist("quota")); + ASSERT_TRUE(db.DoesTableExist("buckets")); + ASSERT_FALSE(db.DoesTableExist("eviction_info")); + + // Check that buckets data is still present. + EXPECT_EQ( + "1|http://a/|http://a/" + "|0|bucket_a|123|13260644621105493|13242931862595604|" + "0|0|0|0," + "2|http://b/|http://b/" + "|0|bucket_b|111|13250042735631065|13260999511438890|" + "0|1000|0|0," + "3|chrome-extension://abc/|chrome-extension://abc/" + "|1|default|321|13261163582572088|" + "13261079941303629|0|10000|0|1", + sql::test::ExecuteWithResults( + &db, "SELECT * FROM buckets ORDER BY id ASC", "|", ",")); + // Check that quota data is still present. EXPECT_EQ("a.com,b.com,c.com", sql::test::ExecuteWithResults(
diff --git a/storage/browser/quota/quota_database_unittest.cc b/storage/browser/quota/quota_database_unittest.cc index dee16533..b28cd27 100644 --- a/storage/browser/quota/quota_database_unittest.cc +++ b/storage/browser/quota/quota_database_unittest.cc
@@ -153,8 +153,10 @@ "last_accessed," "last_modified," "expiration," - "quota) " - "VALUES (?, ?, ?, ?, ?, ?, ?, ?, 0, 0)"; + "quota," + "persistent," + "durability) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, 0, 0, 0, 0)"; // clang-format on sql::Statement statement; statement.Assign(
diff --git a/storage/browser/quota/quota_manager_impl.cc b/storage/browser/quota/quota_manager_impl.cc index 10a41dd..0394c71 100644 --- a/storage/browser/quota/quota_manager_impl.cc +++ b/storage/browser/quota/quota_manager_impl.cc
@@ -1648,18 +1648,6 @@ usage_tracker->GetGlobalUsage(std::move(callback)); } -void QuotaManagerImpl::GetHostUsageWithBreakdown( - const std::string& host, - StorageType type, - UsageWithBreakdownCallback callback) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - EnsureDatabaseOpened(); - - UsageTracker* usage_tracker = GetUsageTracker(type); - DCHECK(usage_tracker); - usage_tracker->GetHostUsageWithBreakdown(host, std::move(callback)); -} - void QuotaManagerImpl::GetStorageKeyUsageWithBreakdown( const blink::StorageKey& storage_key, StorageType type,
diff --git a/storage/browser/quota/quota_manager_impl.h b/storage/browser/quota/quota_manager_impl.h index 23c636b..83efb94 100644 --- a/storage/browser/quota/quota_manager_impl.h +++ b/storage/browser/quota/quota_manager_impl.h
@@ -384,9 +384,6 @@ int64_t new_quota, QuotaCallback callback); void GetGlobalUsage(blink::mojom::StorageType type, UsageCallback callback); - void GetHostUsageWithBreakdown(const std::string& host, - blink::mojom::StorageType type, - UsageWithBreakdownCallback callback); void GetStorageKeyUsageWithBreakdown(const blink::StorageKey& storage_key, blink::mojom::StorageType type, UsageWithBreakdownCallback callback);
diff --git a/storage/browser/quota/quota_manager_proxy.cc b/storage/browser/quota/quota_manager_proxy.cc index 23b2c6d..c14458ec 100644 --- a/storage/browser/quota/quota_manager_proxy.cc +++ b/storage/browser/quota/quota_manager_proxy.cc
@@ -18,6 +18,7 @@ #include "base/sequence_checker.h" #include "base/strings/string_number_conversions.h" #include "base/synchronization/waitable_event.h" +#include "base/task/bind_post_task.h" #include "base/task/sequenced_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" @@ -36,26 +37,6 @@ namespace storage { -namespace { - -template <typename T> -void RunCallbackOnCorrectSequence( - scoped_refptr<base::SequencedTaskRunner> callback_task_runner, - base::OnceCallback<void(T)> callback, - T value) { - DCHECK(callback_task_runner); - DCHECK(callback); - - auto closure = base::BindOnce(std::move(callback), std::move(value)); - if (callback_task_runner->RunsTasksInCurrentSequence()) { - std::move(closure).Run(); - return; - } - callback_task_runner->PostTask(FROM_HERE, std::move(closure)); -} - -} // namespace - QuotaManagerProxy::QuotaManagerProxy( QuotaManagerImpl* quota_manager_impl, scoped_refptr<base::SequencedTaskRunner> quota_manager_impl_task_runner, @@ -130,8 +111,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_); auto respond = - base::BindOnce(&RunCallbackOnCorrectSequence<QuotaErrorOr<BucketInfo>>, - std::move(callback_task_runner), std::move(callback)); + base::BindPostTask(std::move(callback_task_runner), std::move(callback)); if (!quota_manager_impl_) { std::move(respond).Run(QuotaError::kUnknownError); return; @@ -201,8 +181,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_); auto respond = - base::BindOnce(&RunCallbackOnCorrectSequence<QuotaErrorOr<BucketInfo>>, - std::move(callback_task_runner), std::move(callback)); + base::BindPostTask(std::move(callback_task_runner), std::move(callback)); if (!quota_manager_impl_) { std::move(respond).Run(QuotaError::kUnknownError); return; @@ -233,8 +212,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_); auto respond = - base::BindOnce(&RunCallbackOnCorrectSequence<QuotaErrorOr<BucketInfo>>, - std::move(callback_task_runner), std::move(callback)); + base::BindPostTask(std::move(callback_task_runner), std::move(callback)); if (!quota_manager_impl_) { std::move(respond).Run(QuotaError::kUnknownError); return; @@ -265,8 +243,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_); auto respond = - base::BindOnce(&RunCallbackOnCorrectSequence<QuotaErrorOr<BucketInfo>>, - std::move(callback_task_runner), std::move(callback)); + base::BindPostTask(std::move(callback_task_runner), std::move(callback)); if (!quota_manager_impl_) { std::move(respond).Run(QuotaError::kUnknownError); return; @@ -294,8 +271,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_); auto respond = - base::BindOnce(&RunCallbackOnCorrectSequence<QuotaErrorOr<BucketInfo>>, - std::move(callback_task_runner), std::move(callback)); + base::BindPostTask(std::move(callback_task_runner), std::move(callback)); if (!quota_manager_impl_) { std::move(respond).Run(QuotaError::kUnknownError); return; @@ -323,9 +299,8 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_); - auto respond = base::BindOnce( - &RunCallbackOnCorrectSequence<blink::mojom::QuotaStatusCode>, - std::move(callback_task_runner), std::move(callback)); + auto respond = + base::BindPostTask(std::move(callback_task_runner), std::move(callback)); if (!quota_manager_impl_) { std::move(respond).Run(blink::mojom::QuotaStatusCode::kUnknown); return; @@ -388,16 +363,8 @@ if (quota_manager_impl_) { base::OnceClosure manager_callback; if (callback) { - manager_callback = base::BindOnce( - [](scoped_refptr<base::SequencedTaskRunner> callback_task_runner, - base::OnceClosure callback) { - if (callback_task_runner->RunsTasksInCurrentSequence()) { - std::move(callback).Run(); - return; - } - callback_task_runner->PostTask(FROM_HERE, std::move(callback)); - }, - std::move(callback_task_runner), std::move(callback)); + manager_callback = base::BindPostTask(std::move(callback_task_runner), + std::move(callback)); } quota_manager_impl_->NotifyStorageModified(client_id, storage_key, type, delta, modification_time, @@ -428,16 +395,8 @@ if (quota_manager_impl_) { base::OnceClosure manager_callback; if (callback) { - manager_callback = base::BindOnce( - [](scoped_refptr<base::SequencedTaskRunner> callback_task_runner, - base::OnceClosure callback) { - if (callback_task_runner->RunsTasksInCurrentSequence()) { - std::move(callback).Run(); - return; - } - callback_task_runner->PostTask(FROM_HERE, std::move(callback)); - }, - std::move(callback_task_runner), std::move(callback)); + manager_callback = base::BindPostTask(std::move(callback_task_runner), + std::move(callback)); } quota_manager_impl_->NotifyBucketModified(client_id, bucket_id, delta, modification_time, @@ -475,27 +434,6 @@ enabled); } -namespace { - -void DidGetUsageAndQuota( - scoped_refptr<base::SequencedTaskRunner> callback_task_runner, - QuotaManagerProxy::UsageAndQuotaCallback callback, - blink::mojom::QuotaStatusCode status, - int64_t usage, - int64_t quota) { - DCHECK(callback_task_runner); - DCHECK(callback); - - if (callback_task_runner->RunsTasksInCurrentSequence()) { - std::move(callback).Run(status, usage, quota); - return; - } - callback_task_runner->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), status, usage, quota)); -} - -} // namespace - void QuotaManagerProxy::GetUsageAndQuota( const StorageKey& storage_key, blink::mojom::StorageType type, @@ -514,16 +452,15 @@ } DCHECK_CALLED_ON_VALID_SEQUENCE(quota_manager_impl_sequence_checker_); + + auto respond = + base::BindPostTask(std::move(callback_task_runner), std::move(callback)); if (!quota_manager_impl_) { - DidGetUsageAndQuota(std::move(callback_task_runner), std::move(callback), - blink::mojom::QuotaStatusCode::kErrorAbort, 0, 0); + std::move(respond).Run(blink::mojom::QuotaStatusCode::kErrorAbort, 0, 0); return; } - quota_manager_impl_->GetUsageAndQuota( - storage_key, type, - base::BindOnce(&DidGetUsageAndQuota, std::move(callback_task_runner), - std::move(callback))); + quota_manager_impl_->GetUsageAndQuota(storage_key, type, std::move(respond)); } void QuotaManagerProxy::IsStorageUnlimited( @@ -549,12 +486,9 @@ ? quota_manager_impl_->IsStorageUnlimited(storage_key, type) : false; - if (callback_task_runner->RunsTasksInCurrentSequence()) { - std::move(callback).Run(is_storage_unlimited); - return; - } - callback_task_runner->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), is_storage_unlimited)); + auto respond = + base::BindPostTask(std::move(callback_task_runner), std::move(callback)); + std::move(respond).Run(is_storage_unlimited); } std::unique_ptr<QuotaOverrideHandle> @@ -585,11 +519,9 @@ quota_manager_impl_->OverrideQuotaForStorageKey(handle_id, storage_key, quota_size); - if (callback_task_runner->RunsTasksInCurrentSequence()) { - std::move(callback).Run(); - return; - } - callback_task_runner->PostTask(FROM_HERE, std::move(callback)); + auto respond = + base::BindPostTask(std::move(callback_task_runner), std::move(callback)); + std::move(respond).Run(); } void QuotaManagerProxy::WithdrawOverridesForHandle(int handle_id) { @@ -621,12 +553,9 @@ int handle_id = quota_manager_impl_ ? quota_manager_impl_->GetOverrideHandleId() : 0; - if (callback_task_runner->RunsTasksInCurrentSequence()) { - std::move(callback).Run(handle_id); - return; - } - callback_task_runner->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), handle_id)); + auto respond = + base::BindPostTask(std::move(callback_task_runner), std::move(callback)); + std::move(respond).Run(handle_id); } QuotaManagerProxy::~QuotaManagerProxy() = default;
diff --git a/storage/browser/quota/quota_manager_unittest.cc b/storage/browser/quota/quota_manager_unittest.cc index 025c0f5..3457d0a 100644 --- a/storage/browser/quota/quota_manager_unittest.cc +++ b/storage/browser/quota/quota_manager_unittest.cc
@@ -355,16 +355,6 @@ return {future.Get<0>(), future.Get<1>()}; } - void GetHostUsageWithBreakdown(const std::string& host, StorageType type) { - base::RunLoop run_loop; - usage_ = -1; - quota_manager_impl_->GetHostUsageWithBreakdown( - host, type, - base::BindOnce(&QuotaManagerImplTest::DidGetHostUsageBreakdown, - weak_factory_.GetWeakPtr(), run_loop.QuitClosure())); - run_loop.Run(); - } - UsageWithBreakdown GetStorageKeyUsageWithBreakdown( const blink::StorageKey& storage_key, StorageType type) { @@ -1055,12 +1045,6 @@ EXPECT_EQ(result.status, QuotaStatusCode::kOk); EXPECT_EQ(result.usage, 0); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(0, usage()); - - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(0, usage()); - EXPECT_EQ( 0, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage); @@ -1089,12 +1073,6 @@ EXPECT_EQ(result.status, QuotaStatusCode::kOk); EXPECT_EQ(result.usage, 0); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(0, usage()); - - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(0, usage()); - EXPECT_EQ( 0, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage); @@ -1275,14 +1253,6 @@ EXPECT_EQ(0, usage()); EXPECT_TRUE(usage_breakdown_expected.Equals(usage_breakdown())); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(0, usage()); - EXPECT_TRUE(usage_breakdown_expected.Equals(usage_breakdown())); - - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(0, usage()); - EXPECT_TRUE(usage_breakdown_expected.Equals(usage_breakdown())); - auto usage = GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp); EXPECT_EQ(0, usage.usage); @@ -1882,12 +1852,6 @@ EXPECT_EQ(300 + 4000 + 50000 + 7000000, global_usage_result.usage); EXPECT_EQ(global_usage_result.unlimited_usage, 0); - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(usage(), 1 + 20); - - GetHostUsageWithBreakdown("buz.com", kTemp); - EXPECT_EQ(usage(), 4000 + 50000); - EXPECT_EQ( 1, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kPerm) .usage); @@ -1938,9 +1902,6 @@ EXPECT_EQ(global_usage_result.usage, 300 + 4000 + 50000 + 7000000 + 1); EXPECT_EQ(global_usage_result.unlimited_usage, 0); - GetHostUsageWithBreakdown("buz.com", kTemp); - EXPECT_EQ(usage(), 4000 + 50000); - EXPECT_EQ(4000, GetStorageKeyUsageWithBreakdown( ToStorageKey("https://buz.com/"), kTemp) .usage); @@ -1951,9 +1912,6 @@ client->ModifyStorageKeyAndNotify(ToStorageKey("http://buz.com/"), kTemp, 900000000); - GetHostUsageWithBreakdown("buz.com", kTemp); - EXPECT_EQ(usage(), 4000 + 50000 + 900000000); - EXPECT_EQ(4000, GetStorageKeyUsageWithBreakdown( ToStorageKey("https://buz.com/"), kTemp) .usage); @@ -1999,9 +1957,6 @@ EXPECT_EQ(global_usage_result.usage, 50 + 200); EXPECT_EQ(global_usage_result.unlimited_usage, 0); - GetHostUsageWithBreakdown("bar.com", kTemp); - EXPECT_EQ(usage(), 100); - EXPECT_EQ(100, GetStorageKeyUsageWithBreakdown( ToStorageKey("http://bar.com/"), kTemp) .usage); @@ -2011,9 +1966,6 @@ ASSERT_TRUE(bar_temp_bucket.ok()); client->ModifyBucketAndNotify(bar_temp_bucket->id, 900000000); - GetHostUsageWithBreakdown("bar.com", kTemp); - EXPECT_EQ(usage(), 100 + 900000000); - EXPECT_EQ(100 + 900000000, GetStorageKeyUsageWithBreakdown( ToStorageKey("http://bar.com/"), kTemp) .usage); @@ -2034,12 +1986,6 @@ auto global_usage_result = GetGlobalUsage(kTemp); int64_t predelete_global_tmp = global_usage_result.usage; - GetHostUsageWithBreakdown("foo.com", kTemp); - int64_t predelete_host_tmp = usage(); - - GetHostUsageWithBreakdown("foo.com", kPerm); - int64_t predelete_host_pers = usage(); - const int64_t predelete_storage_key_tmp = GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage; @@ -2058,12 +2004,6 @@ global_usage_result = GetGlobalUsage(kTemp); EXPECT_EQ(global_usage_result.usage, predelete_global_tmp - 1); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_host_tmp - 1, usage()); - - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(predelete_host_pers, usage()); - EXPECT_EQ( predelete_storage_key_tmp - 1, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) @@ -2105,12 +2045,6 @@ auto global_usage_result = GetGlobalUsage(kTemp); int64_t predelete_global_tmp = global_usage_result.usage; - GetHostUsageWithBreakdown("foo.com", kTemp); - int64_t predelete_host_tmp = usage(); - - GetHostUsageWithBreakdown("foo.com", kPerm); - int64_t predelete_host_pers = usage(); - const int64_t predelete_storage_key_tmp = GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage; @@ -2143,12 +2077,6 @@ global_usage_result = GetGlobalUsage(kTemp); EXPECT_EQ(predelete_global_tmp - (1 + 50000), global_usage_result.usage); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_host_tmp - (1 + 50000), usage()); - - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(predelete_host_pers, usage()); - EXPECT_EQ( predelete_storage_key_tmp - (1 + 50000), GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) @@ -2170,12 +2098,6 @@ global_usage_result = GetGlobalUsage(kTemp); EXPECT_EQ(predelete_global_tmp - (1 + 20 + 50000), global_usage_result.usage); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_host_tmp - (1 + 20 + 50000), usage()); - - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(predelete_host_pers, usage()); - EXPECT_EQ( predelete_storage_key_tmp - (1 + 20 + 50000), GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) @@ -2248,12 +2170,6 @@ auto global_usage_result = GetGlobalUsage(kTemp); EXPECT_EQ(global_usage_result.usage, (1 + 20 + 4000)); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ((1 + 20), usage()); - - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(300, usage()); - EXPECT_EQ( 1, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage); @@ -2302,12 +2218,6 @@ global_usage_result = GetGlobalUsage(kTemp); EXPECT_EQ(global_usage_result.usage, 1); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(1, usage()); - - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(300, usage()); - EXPECT_EQ( 1, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage); @@ -2359,12 +2269,6 @@ auto global_usage_result = GetGlobalUsage(kTemp); const int64_t predelete_global_tmp = global_usage_result.usage; - GetHostUsageWithBreakdown("foo.com", kTemp); - int64_t predelete_host_tmp = usage(); - - GetHostUsageWithBreakdown("foo.com", kPerm); - int64_t predelete_host_pers = usage(); - const int64_t predelete_storage_key_tmp = GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage; @@ -2377,12 +2281,6 @@ global_usage_result = GetGlobalUsage(kTemp); EXPECT_EQ(global_usage_result.usage, predelete_global_tmp); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_host_tmp, usage()); - - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(predelete_host_pers, usage()); - EXPECT_EQ( predelete_storage_key_tmp, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) @@ -2397,12 +2295,6 @@ global_usage_result = GetGlobalUsage(kTemp); EXPECT_EQ(predelete_global_tmp - 1, global_usage_result.usage); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_host_tmp - 1, usage()); - - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(predelete_host_pers, usage()); - EXPECT_EQ( predelete_storage_key_tmp - 1, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) @@ -2437,18 +2329,6 @@ auto global_usage_result = GetGlobalUsage(kTemp); const int64_t predelete_global_tmp = global_usage_result.usage; - GetHostUsageWithBreakdown("foo.com", kTemp); - const int64_t predelete_foo_tmp = usage(); - - GetHostUsageWithBreakdown("bar.com", kTemp); - const int64_t predelete_bar_tmp = usage(); - - GetHostUsageWithBreakdown("foo.com", kPerm); - const int64_t predelete_foo_pers = usage(); - - GetHostUsageWithBreakdown("bar.com", kPerm); - const int64_t predelete_bar_pers = usage(); - const int64_t predelete_sk_foo_tmp = GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage; @@ -2491,18 +2371,6 @@ EXPECT_EQ(global_usage_result.usage, predelete_global_tmp - (1 + 20 + 4000 + 50000 + 6000 + 80 + 9)); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_foo_tmp - (1 + 20 + 50000 + 6000 + 80), usage()); - - GetHostUsageWithBreakdown("bar.com", kTemp); - EXPECT_EQ(predelete_bar_tmp - (4000 + 9), usage()); - - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(predelete_foo_pers, usage()); - - GetHostUsageWithBreakdown("bar.com", kPerm); - EXPECT_EQ(predelete_bar_pers, usage()); - EXPECT_EQ( predelete_sk_foo_tmp - (1 + 50000), GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) @@ -2550,12 +2418,6 @@ auto global_usage_result = GetGlobalUsage(kTemp); const int64_t predelete_global_tmp = global_usage_result.usage; - GetHostUsageWithBreakdown("foo.com", kTemp); - const int64_t predelete_foo_tmp = usage(); - - GetHostUsageWithBreakdown("bar.com", kTemp); - const int64_t predelete_bar_tmp = usage(); - const int64_t predelete_sk_foo_tmp = GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage; @@ -2569,12 +2431,6 @@ global_usage_result = GetGlobalUsage(kPerm); EXPECT_EQ(global_usage_result.usage, (1000 + 10 + 1)); - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ((10 + 1), usage()); - - GetHostUsageWithBreakdown("bar.com", kPerm); - EXPECT_EQ(1000, usage()); - EXPECT_EQ( 1, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kPerm) .usage); @@ -2606,12 +2462,6 @@ global_usage_result = GetGlobalUsage(kTemp); EXPECT_EQ(global_usage_result.usage, predelete_global_tmp); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_foo_tmp, usage()); - - GetHostUsageWithBreakdown("bar.com", kTemp); - EXPECT_EQ(predelete_bar_tmp, usage()); - EXPECT_EQ(predelete_sk_foo_tmp, GetStorageKeyUsageWithBreakdown( ToStorageKey("http://foo.com/"), kTemp) .usage); @@ -2625,12 +2475,6 @@ global_usage_result = GetGlobalUsage(kPerm); EXPECT_EQ(global_usage_result.usage, 0); - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(0, usage()); - - GetHostUsageWithBreakdown("bar.com", kPerm); - EXPECT_EQ(0, usage()); - EXPECT_EQ( 0, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kPerm) .usage); @@ -2683,18 +2527,6 @@ auto global_usage_result = GetGlobalUsage(kTemp); const int64_t predelete_global_tmp = global_usage_result.usage; - GetHostUsageWithBreakdown("foo.com", kTemp); - const int64_t predelete_foo_tmp = usage(); - - GetHostUsageWithBreakdown("bar.com", kTemp); - const int64_t predelete_bar_tmp = usage(); - - GetHostUsageWithBreakdown("foo.com", kPerm); - const int64_t predelete_foo_pers = usage(); - - GetHostUsageWithBreakdown("bar.com", kPerm); - const int64_t predelete_bar_pers = usage(); - const int64_t predelete_sk_foo_tmp = GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage; @@ -2744,18 +2576,6 @@ EXPECT_EQ(global_usage_result.usage, predelete_global_tmp - (1 + 4000 + 50000 + 9)); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_foo_tmp - (1 + 50000), usage()); - - GetHostUsageWithBreakdown("bar.com", kTemp); - EXPECT_EQ(predelete_bar_tmp - (4000 + 9), usage()); - - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(predelete_foo_pers, usage()); - - GetHostUsageWithBreakdown("bar.com", kPerm); - EXPECT_EQ(predelete_bar_pers, usage()); - EXPECT_EQ( predelete_sk_foo_tmp - (1 + 50000), GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) @@ -2809,21 +2629,9 @@ auto global_usage_result = GetGlobalUsage(kTemp); const int64_t predelete_global_tmp = global_usage_result.usage; - GetHostUsageWithBreakdown("foo.com", kTemp); - const int64_t predelete_foo_tmp = usage(); - - GetHostUsageWithBreakdown("bar.com", kTemp); - const int64_t predelete_bar_tmp = usage(); - global_usage_result = GetGlobalUsage(kPerm); const int64_t predelete_global_pers = global_usage_result.usage; - GetHostUsageWithBreakdown("foo.com", kPerm); - const int64_t predelete_foo_pers = usage(); - - GetHostUsageWithBreakdown("bar.com", kPerm); - const int64_t predelete_bar_pers = usage(); - const int64_t predelete_sk_foo_tmp = GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage; @@ -2872,12 +2680,6 @@ global_usage_result = GetGlobalUsage(kTemp); EXPECT_EQ(global_usage_result.usage, predelete_global_tmp); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_foo_tmp, usage()); - - GetHostUsageWithBreakdown("bar.com", kTemp); - EXPECT_EQ(predelete_bar_tmp, usage()); - EXPECT_EQ(predelete_sk_foo_tmp, GetStorageKeyUsageWithBreakdown( ToStorageKey("http://foo.com/"), kTemp) .usage); @@ -2894,12 +2696,6 @@ global_usage_result = GetGlobalUsage(kPerm); EXPECT_EQ(global_usage_result.usage, predelete_global_pers - (1 + 1000)); - GetHostUsageWithBreakdown("foo.com", kPerm); - EXPECT_EQ(predelete_foo_pers - 1, usage()); - - GetHostUsageWithBreakdown("bar.com", kPerm); - EXPECT_EQ(predelete_bar_pers - 1000, usage()); - EXPECT_EQ( predelete_sk_foo_pers - 1, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kPerm) @@ -2939,12 +2735,6 @@ ASSERT_EQ((1 + 9 + 4000 + 50000), global_usage_result.usage); const int64_t predelete_global_tmp = global_usage_result.usage; - GetHostUsageWithBreakdown("foo.com", kTemp); - ASSERT_EQ((1 + 50000), usage()); - - GetHostUsageWithBreakdown("bar.com", kTemp); - ASSERT_EQ((9 + 4000), usage()); - ASSERT_EQ((1 + 50000), GetStorageKeyUsageWithBreakdown( ToStorageKey("http://foo.com/"), kTemp) .usage); @@ -2964,8 +2754,6 @@ global_usage_result = GetGlobalUsage(kTemp); EXPECT_EQ(global_usage_result.usage, predelete_global_tmp - (1 + 50000)); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(0, usage()); EXPECT_EQ( 0, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage); @@ -2982,8 +2770,6 @@ global_usage_result = GetGlobalUsage(kTemp); EXPECT_EQ(global_usage_result.usage, 0); - GetHostUsageWithBreakdown("bar.com", kTemp); - EXPECT_EQ(0, usage()); EXPECT_EQ( 0, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://bar.com/"), kTemp) .usage); @@ -2999,8 +2785,6 @@ RegisterClientBucketData(fs_client, kData); // Check usage data before deletion. - GetHostUsageWithBreakdown("foo.com", kTemp); - ASSERT_EQ(123, usage()); ASSERT_EQ(123, GetStorageKeyUsageWithBreakdown( ToStorageKey("http://foo.com/"), kTemp) .usage); @@ -3023,8 +2807,6 @@ auto global_usage_result = GetGlobalUsage(kTemp); EXPECT_EQ(global_usage_result.usage, 0); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(0, usage()); EXPECT_EQ( 0, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage); @@ -3342,16 +3124,12 @@ GetBucket(ToStorageKey("http://foo.com"), kDefaultBucketName, kTemp); ASSERT_TRUE(foo_bucket.ok()); - GetHostUsageWithBreakdown("foo.com", kTemp); - const int64_t predelete_foo_tmp = usage(); const int64_t predelete_sk_foo_tmp = GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage; DeleteBucketData(foo_bucket->ToBucketLocator(), {QuotaClientType::kFileSystem}); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_foo_tmp - 1, usage()); EXPECT_EQ( predelete_sk_foo_tmp - 1, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) @@ -3359,16 +3137,12 @@ DeleteBucketData(foo_bucket->ToBucketLocator(), {QuotaClientType::kServiceWorkerCache}); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_foo_tmp - 2 - 1, usage()); EXPECT_EQ( predelete_sk_foo_tmp - 2 - 1, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage); DeleteBucketData(foo_bucket->ToBucketLocator(), {QuotaClientType::kDatabase}); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_foo_tmp - 4 - 2 - 1, usage()); EXPECT_EQ( predelete_sk_foo_tmp - 4 - 2 - 1, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) @@ -3376,8 +3150,6 @@ DeleteBucketData(foo_bucket->ToBucketLocator(), {QuotaClientType::kIndexedDatabase}); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_foo_tmp - 8 - 4 - 2 - 1, usage()); EXPECT_EQ( predelete_sk_foo_tmp - 8 - 4 - 2 - 1, GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) @@ -3414,17 +3186,12 @@ GetBucket(ToStorageKey("http://foo.com/"), kDefaultBucketName, kTemp); ASSERT_TRUE(foo_bucket.ok()); - GetHostUsageWithBreakdown("foo.com", kTemp); - const int64_t predelete_foo_tmp = usage(); - const int64_t predelete_sk_foo_tmp = GetStorageKeyUsageWithBreakdown(ToStorageKey("http://foo.com/"), kTemp) .usage; DeleteBucketData(foo_bucket->ToBucketLocator(), {QuotaClientType::kFileSystem, QuotaClientType::kDatabase}); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_foo_tmp - 4 - 1, usage()); EXPECT_EQ( predelete_sk_foo_tmp - 4 - 1, @@ -3434,8 +3201,6 @@ DeleteBucketData(foo_bucket->ToBucketLocator(), {QuotaClientType::kServiceWorkerCache, QuotaClientType::kIndexedDatabase}); - GetHostUsageWithBreakdown("foo.com", kTemp); - EXPECT_EQ(predelete_foo_tmp - 8 - 4 - 2 - 1, usage()); EXPECT_EQ( predelete_sk_foo_tmp - 8 - 4 - 2 - 1,
diff --git a/storage/test/data/quota_database/version_8.sql b/storage/test/data/quota_database/version_8.sql index efc8b54a..ee53315 100644 --- a/storage/test/data/quota_database/version_8.sql +++ b/storage/test/data/quota_database/version_8.sql
@@ -9,8 +9,19 @@ CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); INSERT INTO meta VALUES ('mmap_status', '-1'); -INSERT INTO meta VALUES ('last_compatible_version', '7'); -INSERT INTO meta VALUES ('version', '7'); +INSERT INTO meta VALUES ('last_compatible_version', '8'); +INSERT INTO meta VALUES ('version', '8'); + +INSERT INTO quota(host, type, quota) VALUES('a.com', 0, 0); +INSERT INTO quota(host, type, quota) VALUES('b.com', 0, 1); +INSERT INTO quota(host, type, quota) VALUES('c.com', 1, 123); + +INSERT INTO buckets(storage_key, host, type, name, use_count, last_accessed, last_modified, expiration, quota) + VALUES('http://a/', 'http://a/', 0, 'bucket_a', 123, 13260644621105493, 13242931862595604, 9223372036854775807, 0); +INSERT INTO buckets(storage_key, host, type, name, use_count, last_accessed, last_modified, expiration, quota) + VALUES('http://b/', 'http://b/', 0, 'bucket_b', 111, 13250042735631065, 13260999511438890, 9223372036854775807, 1000); +INSERT INTO buckets(storage_key, host, type, name, use_count, last_accessed, last_modified, expiration, quota) + VALUES('chrome-extension://abc/', 'chrome-extension://abc/', 1, 'default', 321, 13261163582572088, 13261079941303629, 9223372036854775807, 10000); CREATE UNIQUE INDEX buckets_by_storage_key ON buckets(storage_key, type, name);
diff --git a/storage/test/data/quota_database/version_9.sql b/storage/test/data/quota_database/version_9.sql new file mode 100644 index 0000000..9e61d8b --- /dev/null +++ b/storage/test/data/quota_database/version_9.sql
@@ -0,0 +1,25 @@ +PRAGMA foreign_keys=OFF; + +BEGIN TRANSACTION; + +CREATE TABLE quota(host TEXT NOT NULL, type INTEGER NOT NULL, quota INTEGER NOT NULL, PRIMARY KEY(host, type)) WITHOUT ROWID; + +CREATE TABLE buckets(id INTEGER PRIMARY KEY AUTOINCREMENT, storage_key TEXT NOT NULL, host TEXT NOT NULL, type INTEGER NOT NULL, name TEXT NOT NULL, use_count INTEGER NOT NULL, last_accessed INTEGER NOT NULL, last_modified INTEGER NOT NULL, expiration INTEGER NOT NULL, quota INTEGER NOT NULL, persistent INTEGER NOT NULL, durability INTEGER NOT NULL) STRICT; + +CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); + +INSERT INTO meta VALUES ('mmap_status', '-1'); +INSERT INTO meta VALUES ('last_compatible_version', '9'); +INSERT INTO meta VALUES ('version', '9'); + +CREATE UNIQUE INDEX buckets_by_storage_key ON buckets(storage_key, type, name); + +CREATE INDEX buckets_by_host ON buckets(host, type); + +CREATE INDEX buckets_by_last_accessed ON buckets(type, last_accessed); + +CREATE INDEX buckets_by_last_modified ON buckets(type, last_modified); + +CREATE INDEX buckets_by_expiration ON buckets(expiration); + +COMMIT;
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json index 72d543d..e9a604b 100644 --- a/testing/buildbot/chrome.json +++ b/testing/buildbot/chrome.json
@@ -1911,7 +1911,7 @@ { "args": [], "cros_board": "atlas", - "cros_img": "atlas-release/R103-14803.0.0", + "cros_img": "atlas-release/R104-14829.0.0", "name": "lacros_all_tast_tests ATLAS_RELEASE_LKGM", "resultdb": { "enable": true, @@ -1943,7 +1943,7 @@ { "args": [], "cros_board": "eve", - "cros_img": "eve-release/R103-14803.0.0", + "cros_img": "eve-release/R104-14829.0.0", "name": "lacros_all_tast_tests EVE_RELEASE_LKGM", "resultdb": { "enable": true, @@ -2020,7 +2020,7 @@ { "args": [], "cros_board": "hana", - "cros_img": "hana-release/R103-14803.0.0", + "cros_img": "hana-release/R104-14829.0.0", "name": "lacros_all_tast_tests HANA_RELEASE_LKGM", "resultdb": { "enable": true, @@ -2052,7 +2052,7 @@ { "args": [], "cros_board": "jacuzzi", - "cros_img": "jacuzzi-release/R103-14803.0.0", + "cros_img": "jacuzzi-release/R104-14829.0.0", "name": "lacros_all_tast_tests JACUZZI_RELEASE_LKGM", "resultdb": { "enable": true, @@ -2086,7 +2086,7 @@ "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter" ], "cros_board": "hana", - "cros_img": "hana-release/R103-14803.0.0", + "cros_img": "hana-release/R104-14829.0.0", "name": "ozone_unittests HANA_RELEASE_LKGM", "resultdb": { "enable": true, @@ -2120,7 +2120,7 @@ "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter" ], "cros_board": "jacuzzi", - "cros_img": "jacuzzi-release/R103-14803.0.0", + "cros_img": "jacuzzi-release/R104-14829.0.0", "name": "ozone_unittests JACUZZI_RELEASE_LKGM", "resultdb": { "enable": true, @@ -2154,7 +2154,7 @@ "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter" ], "cros_board": "hana", - "cros_img": "hana-release/R103-14803.0.0", + "cros_img": "hana-release/R104-14829.0.0", "name": "viz_unittests HANA_RELEASE_LKGM", "resultdb": { "enable": true, @@ -2188,7 +2188,7 @@ "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter" ], "cros_board": "jacuzzi", - "cros_img": "jacuzzi-release/R103-14803.0.0", + "cros_img": "jacuzzi-release/R104-14829.0.0", "name": "viz_unittests JACUZZI_RELEASE_LKGM", "resultdb": { "enable": true,
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index 9367e2321..278398f 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -8154,15 +8154,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", - "--client-outdir", - "../../weblayer_instrumentation_test_M101/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M101/out/Release", "--client-version=101", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -8239,15 +8239,100 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", - "--client-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M102/out/Release", + "--client-version=102", + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android30.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "weblayer_skew_tests with_client_from_102" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "weblayer_skew_tests with_client_from_102", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "chromium/testing/weblayer-x86", + "location": "weblayer_instrumentation_test_M102", + "revision": "version:102.0.5005.55" + }, + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "generic_android30", + "path": ".android_emulator/generic_android30" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "generic_android30" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "weblayer_skew_tests", + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_102" + }, + { + "args": [ + "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--test-runner-outdir", + ".", + "--implementation-outdir", + ".", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--client-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -8273,7 +8358,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.3" + "revision": "version:103.0.5060.6" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -8332,91 +8417,6 @@ "../../weblayer/browser/android/javatests/skew/expectations.txt", "--webview-apk-path=apks/SystemWebView.apk", "--client-outdir", - "../../weblayer_instrumentation_test_M97/out/Release", - "--client-version=97", - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android30.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_skew_tests with_client_from_97" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "weblayer_skew_tests with_client_from_97", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.102" - }, - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android30", - "path": ".android_emulator/generic_android30" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android30" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", - "variant_id": "with_client_from_97" - }, - { - "args": [ - "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--test-runner-outdir", - ".", - "--implementation-outdir", - ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", - "--client-outdir", "../../weblayer_instrumentation_test_M98/out/Release", "--client-version=98", "--gs-results-bucket=chromium-result-details", @@ -8664,15 +8664,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--implementation-outdir", - "../../weblayer_instrumentation_test_M101/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/AOSP_SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M101/out/Release", "--impl-version=101", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -8749,15 +8749,100 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--implementation-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/AOSP_SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M102/out/Release", + "--impl-version=102", + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android30.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "weblayer_skew_tests with_impl_from_102" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "weblayer_skew_tests with_impl_from_102", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "chromium/testing/weblayer-x86", + "location": "weblayer_instrumentation_test_M102", + "revision": "version:102.0.5005.55" + }, + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "generic_android30", + "path": ".android_emulator/generic_android30" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "generic_android30" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "weblayer_skew_tests", + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_102" + }, + { + "args": [ + "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--test-runner-outdir", + ".", + "--client-outdir", + ".", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/AOSP_SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--impl-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -8783,7 +8868,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.3" + "revision": "version:103.0.5060.6" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -8842,91 +8927,6 @@ "../../weblayer/browser/android/javatests/skew/expectations.txt", "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--implementation-outdir", - "../../weblayer_instrumentation_test_M97/out/Release", - "--impl-version=97", - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android30.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_skew_tests with_impl_from_97" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "weblayer_skew_tests with_impl_from_97", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.102" - }, - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android30", - "path": ".android_emulator/generic_android30" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android30" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", - "variant_id": "with_impl_from_97" - }, - { - "args": [ - "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--test-runner-outdir", - ".", - "--client-outdir", - ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/AOSP_SystemWebView.apk", - "--implementation-outdir", "../../weblayer_instrumentation_test_M98/out/Release", "--impl-version=98", "--gs-results-bucket=chromium-result-details",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 60768ab13..c9b3456 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -46128,15 +46128,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", - "--client-outdir", - "../../weblayer_instrumentation_test_M101/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M101/out/Release", "--client-version=101", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -46213,15 +46213,100 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", - "--client-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M102/out/Release", + "--client-version=102", + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android29.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "weblayer_skew_tests with_client_from_102" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "weblayer_skew_tests with_client_from_102", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "chromium/testing/weblayer-x86", + "location": "weblayer_instrumentation_test_M102", + "revision": "version:102.0.5005.55" + }, + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "generic_android29", + "path": ".android_emulator/generic_android29" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "generic_android29" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "weblayer_skew_tests", + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_102" + }, + { + "args": [ + "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--test-runner-outdir", + ".", + "--implementation-outdir", + ".", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--client-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -46247,7 +46332,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.3" + "revision": "version:103.0.5060.6" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -46306,91 +46391,6 @@ "../../weblayer/browser/android/javatests/skew/expectations.txt", "--webview-apk-path=apks/SystemWebView.apk", "--client-outdir", - "../../weblayer_instrumentation_test_M97/out/Release", - "--client-version=97", - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android29.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_skew_tests with_client_from_97" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "weblayer_skew_tests with_client_from_97", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.102" - }, - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android29", - "path": ".android_emulator/generic_android29" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android29" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", - "variant_id": "with_client_from_97" - }, - { - "args": [ - "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--test-runner-outdir", - ".", - "--implementation-outdir", - ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", - "--client-outdir", "../../weblayer_instrumentation_test_M98/out/Release", "--client-version=98", "--gs-results-bucket=chromium-result-details", @@ -46638,15 +46638,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--implementation-outdir", - "../../weblayer_instrumentation_test_M101/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/AOSP_SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M101/out/Release", "--impl-version=101", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -46723,15 +46723,100 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--implementation-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/AOSP_SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M102/out/Release", + "--impl-version=102", + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android29.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "weblayer_skew_tests with_impl_from_102" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "weblayer_skew_tests with_impl_from_102", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "chromium/testing/weblayer-x86", + "location": "weblayer_instrumentation_test_M102", + "revision": "version:102.0.5005.55" + }, + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "generic_android29", + "path": ".android_emulator/generic_android29" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "generic_android29" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "weblayer_skew_tests", + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_102" + }, + { + "args": [ + "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--test-runner-outdir", + ".", + "--client-outdir", + ".", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/AOSP_SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--impl-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -46757,7 +46842,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.3" + "revision": "version:103.0.5060.6" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -46816,91 +46901,6 @@ "../../weblayer/browser/android/javatests/skew/expectations.txt", "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--implementation-outdir", - "../../weblayer_instrumentation_test_M97/out/Release", - "--impl-version=97", - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android29.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_skew_tests with_impl_from_97" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "weblayer_skew_tests with_impl_from_97", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.102" - }, - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android29", - "path": ".android_emulator/generic_android29" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android29" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", - "variant_id": "with_impl_from_97" - }, - { - "args": [ - "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--test-runner-outdir", - ".", - "--client-outdir", - ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/AOSP_SystemWebView.apk", - "--implementation-outdir", "../../weblayer_instrumentation_test_M98/out/Release", "--impl-version=98", "--gs-results-bucket=chromium-result-details", @@ -47152,15 +47152,15 @@ { "args": [ "--additional-apk=apks/ChromePublic.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", - "--client-outdir", - "../../weblayer_instrumentation_test_M101/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M101/out/Release", "--client-version=101", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -47237,15 +47237,100 @@ { "args": [ "--additional-apk=apks/ChromePublic.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", - "--client-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M102/out/Release", + "--client-version=102", + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "weblayer_skew_tests_with_chrome with_client_from_102" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "weblayer_skew_tests_with_chrome with_client_from_102", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "chromium/testing/weblayer-x86", + "location": "weblayer_instrumentation_test_M102", + "revision": "version:102.0.5005.55" + }, + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "generic_android23", + "path": ".android_emulator/generic_android23" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "generic_android23" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "weblayer_skew_tests_with_chrome", + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_client_from_102" + }, + { + "args": [ + "--additional-apk=apks/ChromePublic.apk", + "--test-runner-outdir", + ".", + "--implementation-outdir", + ".", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--client-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -47271,7 +47356,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.3" + "revision": "version:103.0.5060.6" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -47330,91 +47415,6 @@ "../../weblayer/browser/android/javatests/skew/expectations.txt", "--webview-apk-path=apks/SystemWebView.apk", "--client-outdir", - "../../weblayer_instrumentation_test_M97/out/Release", - "--client-version=97", - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_skew_tests_with_chrome with_client_from_97" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "weblayer_skew_tests_with_chrome with_client_from_97", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.102" - }, - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android23", - "path": ".android_emulator/generic_android23" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android23" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", - "variant_id": "with_client_from_97" - }, - { - "args": [ - "--additional-apk=apks/ChromePublic.apk", - "--test-runner-outdir", - ".", - "--implementation-outdir", - ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", - "--client-outdir", "../../weblayer_instrumentation_test_M98/out/Release", "--client-version=98", "--gs-results-bucket=chromium-result-details", @@ -47662,15 +47662,15 @@ { "args": [ "--additional-apk=apks/ChromePublic.apk", - "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--implementation-outdir", - "../../weblayer_instrumentation_test_M101/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/AOSP_SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M101/out/Release", "--impl-version=101", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -47747,15 +47747,100 @@ { "args": [ "--additional-apk=apks/ChromePublic.apk", - "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--implementation-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/AOSP_SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M102/out/Release", + "--impl-version=102", + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "weblayer_skew_tests_with_chrome with_impl_from_102" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "weblayer_skew_tests_with_chrome with_impl_from_102", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "chromium/testing/weblayer-x86", + "location": "weblayer_instrumentation_test_M102", + "revision": "version:102.0.5005.55" + }, + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "generic_android23", + "path": ".android_emulator/generic_android23" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "generic_android23" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "weblayer_skew_tests_with_chrome", + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", + "variant_id": "with_impl_from_102" + }, + { + "args": [ + "--additional-apk=apks/ChromePublic.apk", + "--test-runner-outdir", + ".", + "--client-outdir", + ".", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/AOSP_SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--impl-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -47781,7 +47866,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.3" + "revision": "version:103.0.5060.6" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -47840,91 +47925,6 @@ "../../weblayer/browser/android/javatests/skew/expectations.txt", "--webview-apk-path=apks/AOSP_SystemWebView.apk", "--implementation-outdir", - "../../weblayer_instrumentation_test_M97/out/Release", - "--impl-version=97", - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_skew_tests_with_chrome with_impl_from_97" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "weblayer_skew_tests_with_chrome with_impl_from_97", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.102" - }, - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android23", - "path": ".android_emulator/generic_android23" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android23" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "weblayer_skew_tests_with_chrome", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests_with_chrome/", - "variant_id": "with_impl_from_97" - }, - { - "args": [ - "--additional-apk=apks/ChromePublic.apk", - "--test-runner-outdir", - ".", - "--client-outdir", - ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/AOSP_SystemWebView.apk", - "--implementation-outdir", "../../weblayer_instrumentation_test_M98/out/Release", "--impl-version=98", "--gs-results-bucket=chromium-result-details", @@ -48244,15 +48244,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", - "--client-outdir", - "../../weblayer_instrumentation_test_M101/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M101/out/Release", "--client-version=101", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -48329,15 +48329,100 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", - "--client-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M102/out/Release", + "--client-version=102", + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android27.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "weblayer_skew_tests with_client_from_102" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "weblayer_skew_tests with_client_from_102", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "chromium/testing/weblayer-x86", + "location": "weblayer_instrumentation_test_M102", + "revision": "version:102.0.5005.55" + }, + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "generic_android27", + "path": ".android_emulator/generic_android27" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "generic_android27" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "weblayer_skew_tests", + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_102" + }, + { + "args": [ + "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--test-runner-outdir", + ".", + "--implementation-outdir", + ".", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--client-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -48363,7 +48448,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.3" + "revision": "version:103.0.5060.6" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -48422,91 +48507,6 @@ "../../weblayer/browser/android/javatests/skew/expectations.txt", "--webview-apk-path=apks/SystemWebView.apk", "--client-outdir", - "../../weblayer_instrumentation_test_M97/out/Release", - "--client-version=97", - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android27.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_skew_tests with_client_from_97" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "weblayer_skew_tests with_client_from_97", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.102" - }, - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android27", - "path": ".android_emulator/generic_android27" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android27" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", - "variant_id": "with_client_from_97" - }, - { - "args": [ - "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--test-runner-outdir", - ".", - "--implementation-outdir", - ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", - "--client-outdir", "../../weblayer_instrumentation_test_M98/out/Release", "--client-version=98", "--gs-results-bucket=chromium-result-details", @@ -48754,15 +48754,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--implementation-outdir", - "../../weblayer_instrumentation_test_M101/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M101/out/Release", "--impl-version=101", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -48839,15 +48839,100 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--implementation-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M102/out/Release", + "--impl-version=102", + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android27.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "weblayer_skew_tests with_impl_from_102" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "weblayer_skew_tests with_impl_from_102", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "chromium/testing/weblayer-x86", + "location": "weblayer_instrumentation_test_M102", + "revision": "version:102.0.5005.55" + }, + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "generic_android27", + "path": ".android_emulator/generic_android27" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "generic_android27" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "weblayer_skew_tests", + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_102" + }, + { + "args": [ + "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--test-runner-outdir", + ".", + "--client-outdir", + ".", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--impl-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -48873,7 +48958,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.3" + "revision": "version:103.0.5060.6" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -48932,91 +49017,6 @@ "../../weblayer/browser/android/javatests/skew/expectations.txt", "--webview-apk-path=apks/SystemWebView.apk", "--implementation-outdir", - "../../weblayer_instrumentation_test_M97/out/Release", - "--impl-version=97", - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android27.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_skew_tests with_impl_from_97" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "weblayer_skew_tests with_impl_from_97", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.102" - }, - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android27", - "path": ".android_emulator/generic_android27" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android27" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", - "variant_id": "with_impl_from_97" - }, - { - "args": [ - "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--test-runner-outdir", - ".", - "--client-outdir", - ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", - "--implementation-outdir", "../../weblayer_instrumentation_test_M98/out/Release", "--impl-version=98", "--gs-results-bucket=chromium-result-details", @@ -49336,15 +49336,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", - "--client-outdir", - "../../weblayer_instrumentation_test_M101/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M101/out/Release", "--client-version=101", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -49421,15 +49421,100 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", - "--client-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--implementation-outdir", ".", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M102/out/Release", + "--client-version=102", + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "weblayer_skew_tests with_client_from_102" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "weblayer_skew_tests with_client_from_102", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "chromium/testing/weblayer-x86", + "location": "weblayer_instrumentation_test_M102", + "revision": "version:102.0.5005.55" + }, + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "generic_android28", + "path": ".android_emulator/generic_android28" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "generic_android28" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "weblayer_skew_tests", + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_client_from_102" + }, + { + "args": [ + "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--test-runner-outdir", + ".", + "--implementation-outdir", + ".", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--client-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--client-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -49455,7 +49540,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.3" + "revision": "version:103.0.5060.6" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -49514,91 +49599,6 @@ "../../weblayer/browser/android/javatests/skew/expectations.txt", "--webview-apk-path=apks/SystemWebView.apk", "--client-outdir", - "../../weblayer_instrumentation_test_M97/out/Release", - "--client-version=97", - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_skew_tests with_client_from_97" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "weblayer_skew_tests with_client_from_97", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.102" - }, - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android28", - "path": ".android_emulator/generic_android28" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android28" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", - "variant_id": "with_client_from_97" - }, - { - "args": [ - "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--test-runner-outdir", - ".", - "--implementation-outdir", - ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", - "--client-outdir", "../../weblayer_instrumentation_test_M98/out/Release", "--client-version=98", "--gs-results-bucket=chromium-result-details", @@ -49846,15 +49846,15 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--implementation-outdir", - "../../weblayer_instrumentation_test_M101/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M101/out/Release", "--impl-version=101", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -49931,15 +49931,100 @@ { "args": [ "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--webview-apk-path=apks/SystemWebView.apk", "--test-runner-outdir", ".", "--client-outdir", ".", - "--implementation-outdir", - "../../weblayer_instrumentation_test_M103/out/Release", "--test-expectations", "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M102/out/Release", + "--impl-version=102", + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "weblayer_skew_tests with_impl_from_102" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "weblayer_skew_tests with_impl_from_102", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "chromium/testing/weblayer-x86", + "location": "weblayer_instrumentation_test_M102", + "revision": "version:102.0.5005.55" + }, + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "machine_type": "n1-standard-4|e2-standard-4", + "os": "Ubuntu-18.04", + "pool": "chromium.tests.avd" + } + ], + "named_caches": [ + { + "name": "generic_android28", + "path": ".android_emulator/generic_android28" + } + ], + "optional_dimensions": { + "60": [ + { + "caches": "generic_android28" + } + ] + }, + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "weblayer_skew_tests", + "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", + "variant_id": "with_impl_from_102" + }, + { + "args": [ + "--additional-apk=apks/WebLayerShellSystemWebView.apk", + "--test-runner-outdir", + ".", + "--client-outdir", + ".", + "--test-expectations", + "../../weblayer/browser/android/javatests/skew/expectations.txt", + "--webview-apk-path=apks/SystemWebView.apk", + "--implementation-outdir", + "../../weblayer_instrumentation_test_M103/out/Release", "--impl-version=103", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -49965,7 +50050,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M103", - "revision": "version:103.0.5060.3" + "revision": "version:103.0.5060.6" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -50024,91 +50109,6 @@ "../../weblayer/browser/android/javatests/skew/expectations.txt", "--webview-apk-path=apks/SystemWebView.apk", "--implementation-outdir", - "../../weblayer_instrumentation_test_M97/out/Release", - "--impl-version=97", - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_skew_tests with_impl_from_97" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "weblayer_skew_tests with_impl_from_97", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "chromium/testing/weblayer-x86", - "location": "weblayer_instrumentation_test_M97", - "revision": "version:97.0.4692.102" - }, - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android28", - "path": ".android_emulator/generic_android28" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android28" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "weblayer_skew_tests", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_skew_tests/", - "variant_id": "with_impl_from_97" - }, - { - "args": [ - "--additional-apk=apks/WebLayerShellSystemWebView.apk", - "--test-runner-outdir", - ".", - "--client-outdir", - ".", - "--test-expectations", - "../../weblayer/browser/android/javatests/skew/expectations.txt", - "--webview-apk-path=apks/SystemWebView.apk", - "--implementation-outdir", "../../weblayer_instrumentation_test_M98/out/Release", "--impl-version=98", "--gs-results-bucket=chromium-result-details",
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index b784c5b1..71ec730 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -5793,21 +5793,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 102.0.5005.22", + "name": "interactive_ui_tests Lacros version skew testing ash 102.0.5005.48", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.5005.22", - "revision": "version:102.0.5005.22" + "location": "lacros_version_skew_tests_v102.0.5005.48", + "revision": "version:102.0.5005.48" } ], "dimension_sets": [ @@ -5820,7 +5820,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 102.0.5005.22" + "variant_id": "Lacros version skew testing ash 102.0.5005.48" }, { "args": [ @@ -5857,21 +5857,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 103.0.5059.0", + "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5065.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5059.0", - "revision": "version:103.0.5059.0" + "location": "lacros_version_skew_tests_v104.0.5065.0", + "revision": "version:104.0.5065.0" } ], "dimension_sets": [ @@ -5884,7 +5884,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 103.0.5059.0" + "variant_id": "Lacros version skew testing ash 104.0.5065.0" }, { "isolate_profile_data": true, @@ -5960,21 +5960,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 102.0.5005.22", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 102.0.5005.48", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.5005.22", - "revision": "version:102.0.5005.22" + "location": "lacros_version_skew_tests_v102.0.5005.48", + "revision": "version:102.0.5005.48" } ], "dimension_sets": [ @@ -5986,7 +5986,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 102.0.5005.22" + "variant_id": "Lacros version skew testing ash 102.0.5005.48" }, { "args": [ @@ -6022,21 +6022,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5059.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5065.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5059.0", - "revision": "version:103.0.5059.0" + "location": "lacros_version_skew_tests_v104.0.5065.0", + "revision": "version:104.0.5065.0" } ], "dimension_sets": [ @@ -6048,7 +6048,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 103.0.5059.0" + "variant_id": "Lacros version skew testing ash 104.0.5065.0" }, { "args": [ @@ -6106,21 +6106,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 102.0.5005.22", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 102.0.5005.48", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.5005.22", - "revision": "version:102.0.5005.22" + "location": "lacros_version_skew_tests_v102.0.5005.48", + "revision": "version:102.0.5005.48" } ], "dimension_sets": [ @@ -6132,7 +6132,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 102.0.5005.22" + "variant_id": "Lacros version skew testing ash 102.0.5005.48" }, { "args": [ @@ -6168,21 +6168,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5059.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5065.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5059.0", - "revision": "version:103.0.5059.0" + "location": "lacros_version_skew_tests_v104.0.5065.0", + "revision": "version:104.0.5065.0" } ], "dimension_sets": [ @@ -6194,7 +6194,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 103.0.5059.0" + "variant_id": "Lacros version skew testing ash 104.0.5065.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 62ff6b8..07a369c 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -6151,6 +6151,24 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "color_unittests", + "test_id_prefix": "ninja://ui/color:color_unittests/" + }, + { + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-12" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "components_browsertests", "test_id_prefix": "ninja://components:components_browsertests/" }, @@ -87841,21 +87859,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 102.0.5005.22", + "name": "interactive_ui_tests Lacros version skew testing ash 102.0.5005.48", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.5005.22", - "revision": "version:102.0.5005.22" + "location": "lacros_version_skew_tests_v102.0.5005.48", + "revision": "version:102.0.5005.48" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -87863,7 +87881,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 102.0.5005.22" + "variant_id": "Lacros version skew testing ash 102.0.5005.48" }, { "args": [ @@ -87895,21 +87913,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 103.0.5059.0", + "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5065.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5059.0", - "revision": "version:103.0.5059.0" + "location": "lacros_version_skew_tests_v104.0.5065.0", + "revision": "version:104.0.5065.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -87917,7 +87935,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 103.0.5059.0" + "variant_id": "Lacros version skew testing ash 104.0.5065.0" }, { "isolate_profile_data": true, @@ -87978,28 +87996,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 102.0.5005.22", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 102.0.5005.48", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.5005.22", - "revision": "version:102.0.5005.22" + "location": "lacros_version_skew_tests_v102.0.5005.48", + "revision": "version:102.0.5005.48" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 102.0.5005.22" + "variant_id": "Lacros version skew testing ash 102.0.5005.48" }, { "args": [ @@ -88030,28 +88048,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5059.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5065.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5059.0", - "revision": "version:103.0.5059.0" + "location": "lacros_version_skew_tests_v104.0.5065.0", + "revision": "version:104.0.5065.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 103.0.5059.0" + "variant_id": "Lacros version skew testing ash 104.0.5065.0" }, { "args": [ @@ -88099,28 +88117,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 102.0.5005.22", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 102.0.5005.48", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.5005.22", - "revision": "version:102.0.5005.22" + "location": "lacros_version_skew_tests_v102.0.5005.48", + "revision": "version:102.0.5005.48" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 102.0.5005.22" + "variant_id": "Lacros version skew testing ash 102.0.5005.48" }, { "args": [ @@ -88151,28 +88169,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5059.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5065.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5059.0", - "revision": "version:103.0.5059.0" + "location": "lacros_version_skew_tests_v104.0.5065.0", + "revision": "version:104.0.5065.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 103.0.5059.0" + "variant_id": "Lacros version skew testing ash 104.0.5065.0" }, { "isolate_profile_data": true, @@ -89446,20 +89464,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 102.0.5005.22", + "name": "interactive_ui_tests Lacros version skew testing ash 102.0.5005.48", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.5005.22", - "revision": "version:102.0.5005.22" + "location": "lacros_version_skew_tests_v102.0.5005.48", + "revision": "version:102.0.5005.48" } ], "dimension_sets": [ @@ -89473,7 +89491,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 102.0.5005.22" + "variant_id": "Lacros version skew testing ash 102.0.5005.48" }, { "args": [ @@ -89510,20 +89528,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 103.0.5059.0", + "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5065.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5059.0", - "revision": "version:103.0.5059.0" + "location": "lacros_version_skew_tests_v104.0.5065.0", + "revision": "version:104.0.5065.0" } ], "dimension_sets": [ @@ -89537,7 +89555,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 103.0.5059.0" + "variant_id": "Lacros version skew testing ash 104.0.5065.0" }, { "merge": { @@ -89613,20 +89631,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 102.0.5005.22", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 102.0.5005.48", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.5005.22", - "revision": "version:102.0.5005.22" + "location": "lacros_version_skew_tests_v102.0.5005.48", + "revision": "version:102.0.5005.48" } ], "dimension_sets": [ @@ -89639,7 +89657,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 102.0.5005.22" + "variant_id": "Lacros version skew testing ash 102.0.5005.48" }, { "args": [ @@ -89675,20 +89693,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5059.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5065.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5059.0", - "revision": "version:103.0.5059.0" + "location": "lacros_version_skew_tests_v104.0.5065.0", + "revision": "version:104.0.5065.0" } ], "dimension_sets": [ @@ -89701,7 +89719,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 103.0.5059.0" + "variant_id": "Lacros version skew testing ash 104.0.5065.0" }, { "args": [ @@ -89759,20 +89777,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 102.0.5005.22", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 102.0.5005.48", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.5005.22", - "revision": "version:102.0.5005.22" + "location": "lacros_version_skew_tests_v102.0.5005.48", + "revision": "version:102.0.5005.48" } ], "dimension_sets": [ @@ -89785,7 +89803,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 102.0.5005.22" + "variant_id": "Lacros version skew testing ash 102.0.5005.48" }, { "args": [ @@ -89821,20 +89839,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5059.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5065.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5059.0", - "revision": "version:103.0.5059.0" + "location": "lacros_version_skew_tests_v104.0.5065.0", + "revision": "version:104.0.5065.0" } ], "dimension_sets": [ @@ -89847,7 +89865,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 103.0.5059.0" + "variant_id": "Lacros version skew testing ash 104.0.5065.0" }, { "merge": { @@ -91279,20 +91297,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 102.0.5005.22", + "name": "interactive_ui_tests Lacros version skew testing ash 102.0.5005.48", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.5005.22", - "revision": "version:102.0.5005.22" + "location": "lacros_version_skew_tests_v102.0.5005.48", + "revision": "version:102.0.5005.48" } ], "dimension_sets": [ @@ -91306,7 +91324,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 102.0.5005.22" + "variant_id": "Lacros version skew testing ash 102.0.5005.48" }, { "args": [ @@ -91343,20 +91361,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 103.0.5059.0", + "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5065.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5059.0", - "revision": "version:103.0.5059.0" + "location": "lacros_version_skew_tests_v104.0.5065.0", + "revision": "version:104.0.5065.0" } ], "dimension_sets": [ @@ -91370,7 +91388,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 103.0.5059.0" + "variant_id": "Lacros version skew testing ash 104.0.5065.0" }, { "merge": { @@ -91446,20 +91464,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 102.0.5005.22", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 102.0.5005.48", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.5005.22", - "revision": "version:102.0.5005.22" + "location": "lacros_version_skew_tests_v102.0.5005.48", + "revision": "version:102.0.5005.48" } ], "dimension_sets": [ @@ -91472,7 +91490,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 102.0.5005.22" + "variant_id": "Lacros version skew testing ash 102.0.5005.48" }, { "args": [ @@ -91508,20 +91526,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5059.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5065.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5059.0", - "revision": "version:103.0.5059.0" + "location": "lacros_version_skew_tests_v104.0.5065.0", + "revision": "version:104.0.5065.0" } ], "dimension_sets": [ @@ -91534,7 +91552,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 103.0.5059.0" + "variant_id": "Lacros version skew testing ash 104.0.5065.0" }, { "args": [ @@ -91592,20 +91610,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 102.0.5005.22", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 102.0.5005.48", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.5005.22", - "revision": "version:102.0.5005.22" + "location": "lacros_version_skew_tests_v102.0.5005.48", + "revision": "version:102.0.5005.48" } ], "dimension_sets": [ @@ -91618,7 +91636,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 102.0.5005.22" + "variant_id": "Lacros version skew testing ash 102.0.5005.48" }, { "args": [ @@ -91654,20 +91672,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5059.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5065.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5059.0", - "revision": "version:103.0.5059.0" + "location": "lacros_version_skew_tests_v104.0.5065.0", + "revision": "version:104.0.5065.0" } ], "dimension_sets": [ @@ -91680,7 +91698,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 103.0.5059.0" + "variant_id": "Lacros version skew testing ash 104.0.5065.0" }, { "merge": { @@ -92353,20 +92371,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 102.0.5005.22", + "name": "interactive_ui_tests Lacros version skew testing ash 102.0.5005.48", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.5005.22", - "revision": "version:102.0.5005.22" + "location": "lacros_version_skew_tests_v102.0.5005.48", + "revision": "version:102.0.5005.48" } ], "dimension_sets": [ @@ -92379,7 +92397,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 102.0.5005.22" + "variant_id": "Lacros version skew testing ash 102.0.5005.48" }, { "args": [ @@ -92415,20 +92433,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 103.0.5059.0", + "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5065.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5059.0", - "revision": "version:103.0.5059.0" + "location": "lacros_version_skew_tests_v104.0.5065.0", + "revision": "version:104.0.5065.0" } ], "dimension_sets": [ @@ -92441,7 +92459,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 103.0.5059.0" + "variant_id": "Lacros version skew testing ash 104.0.5065.0" } ] }, @@ -94739,6 +94757,25 @@ "expiration": 21600, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "color_unittests", + "test_id_prefix": "ninja://ui/color:color_unittests/" + }, + { + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "expiration": 21600, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "components_browsertests", "test_id_prefix": "ninja://components:components_browsertests/" },
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json index 74204a13..4141cfb2 100644 --- a/testing/buildbot/chromium.mac.json +++ b/testing/buildbot/chromium.mac.json
@@ -362,6 +362,24 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "color_unittests", + "test_id_prefix": "ninja://ui/color:color_unittests/" + }, + { + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-10.11" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "components_browsertests", "test_id_prefix": "ninja://components:components_browsertests/" }, @@ -2013,6 +2031,24 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "color_unittests", + "test_id_prefix": "ninja://ui/color:color_unittests/" + }, + { + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-10.12.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "components_browsertests", "test_id_prefix": "ninja://components:components_browsertests/" }, @@ -3758,6 +3794,24 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "color_unittests", + "test_id_prefix": "ninja://ui/color:color_unittests/" + }, + { + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-10.13.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "components_browsertests", "test_id_prefix": "ninja://components:components_browsertests/" }, @@ -5494,6 +5548,24 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "color_unittests", + "test_id_prefix": "ninja://ui/color:color_unittests/" + }, + { + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-10.14.6" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "components_browsertests", "test_id_prefix": "ninja://components:components_browsertests/" }, @@ -7238,6 +7310,24 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "color_unittests", + "test_id_prefix": "ninja://ui/color:color_unittests/" + }, + { + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-10.15" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "components_browsertests", "test_id_prefix": "ninja://components:components_browsertests/" }, @@ -8994,6 +9084,25 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "color_unittests", + "test_id_prefix": "ninja://ui/color:color_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-11|Mac-10.16" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "components_browsertests", "test_id_prefix": "ninja://components:components_browsertests/" }, @@ -23042,6 +23151,25 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "color_unittests", + "test_id_prefix": "ninja://ui/color:color_unittests/" + }, + { + "ci_only": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "arm64", + "os": "Mac-11" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "components_browsertests", "test_id_prefix": "ninja://components:components_browsertests/" },
diff --git a/testing/buildbot/filters/fuchsia.browser_tests.filter b/testing/buildbot/filters/fuchsia.browser_tests.filter index 8108e1ef..a863e6c0 100644 --- a/testing/buildbot/filters/fuchsia.browser_tests.filter +++ b/testing/buildbot/filters/fuchsia.browser_tests.filter
@@ -125,8 +125,6 @@ -CrossProfileDebuggerApiTest.Attach -CrossProfileDebuggerApiTest.GetTargets -DebuggerExtensionApiTest.AttachToPdf --DesktopMediaPickerViewsBrowserTest.InvokeUi_default --DesktopMediaPickerViewsBrowserTest.InvokeUi_tabs -DestroyProfileOnBrowserClose/ProfileHelperTestWithDestroyProfile.DeleteInactiveProfile/0 -DestroyProfileOnBrowserClose/ProfileHelperTestWithDestroyProfile.DeleteInactiveProfile/1 -DestroyProfileOnBrowserClose/ProfileManagerBrowserTest.DeleteAllProfiles/0
diff --git a/testing/buildbot/internal.chromeos.fyi.json b/testing/buildbot/internal.chromeos.fyi.json index 3d1391e..801ffb4 100644 --- a/testing/buildbot/internal.chromeos.fyi.json +++ b/testing/buildbot/internal.chromeos.fyi.json
@@ -1126,7 +1126,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R103-14803.0.0", + "cros_img": "octopus-release/R104-14829.0.0", "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_LKGM", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1150,7 +1150,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R102-14695.25.0", + "cros_img": "octopus-release/R102-14695.55.0", "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_BETA", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1174,7 +1174,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R103-14803.0.0", + "cros_img": "octopus-release/R104-14829.0.0", "name": "ozone_unittests OCTOPUS_RELEASE_LKGM", "swarming": {}, "test": "ozone_unittests", @@ -1196,7 +1196,7 @@ { "args": [], "cros_board": "octopus", - "cros_img": "octopus-release/R102-14695.25.0", + "cros_img": "octopus-release/R102-14695.55.0", "name": "ozone_unittests OCTOPUS_RELEASE_BETA", "swarming": {}, "test": "ozone_unittests", @@ -1226,7 +1226,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R103-14803.0.0", + "cros_img": "strongbad-release/R104-14829.0.0", "name": "lacros_all_tast_tests STRONGBAD_RELEASE_LKGM", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1250,7 +1250,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R102-14695.25.0", + "cros_img": "strongbad-release/R102-14695.55.0", "name": "lacros_all_tast_tests STRONGBAD_RELEASE_BETA", "swarming": {}, "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)", @@ -1274,7 +1274,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R103-14803.0.0", + "cros_img": "strongbad-release/R104-14829.0.0", "name": "ozone_unittests STRONGBAD_RELEASE_LKGM", "swarming": {}, "test": "ozone_unittests", @@ -1296,7 +1296,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R102-14695.25.0", + "cros_img": "strongbad-release/R102-14695.55.0", "name": "ozone_unittests STRONGBAD_RELEASE_BETA", "swarming": {}, "test": "ozone_unittests", @@ -1318,7 +1318,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R103-14803.0.0", + "cros_img": "strongbad-release/R104-14829.0.0", "name": "viz_unittests STRONGBAD_RELEASE_LKGM", "swarming": {}, "test": "viz_unittests", @@ -1340,7 +1340,7 @@ { "args": [], "cros_board": "strongbad", - "cros_img": "strongbad-release/R102-14695.25.0", + "cros_img": "strongbad-release/R102-14695.55.0", "name": "viz_unittests STRONGBAD_RELEASE_BETA", "swarming": {}, "test": "viz_unittests",
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 4d9b523..f6f2f8c7 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -4439,6 +4439,7 @@ }, 'chrome_app_unittests': {}, 'chromedriver_unittests': {}, + 'color_unittests': {}, 'extensions_browsertests': {}, 'extensions_unittests': {}, 'filesystem_service_unittests': {}, # https://crbug.com/862712
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index 2f22d7a..2880d2e 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -22,15 +22,15 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5059.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5065.0/test_ash_chrome', ], - 'identifier': 'Lacros version skew testing ash 103.0.5059.0', + 'identifier': 'Lacros version skew testing ash 104.0.5065.0', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v103.0.5059.0', - 'revision': 'version:103.0.5059.0', + 'location': 'lacros_version_skew_tests_v104.0.5065.0', + 'revision': 'version:104.0.5065.0', }, ], }, @@ -52,15 +52,15 @@ }, 'LACROS_VERSION_SKEW_BETA': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.22/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.5005.48/test_ash_chrome', ], - 'identifier': 'Lacros version skew testing ash 102.0.5005.22', + 'identifier': 'Lacros version skew testing ash 102.0.5005.48', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v102.0.5005.22', - 'revision': 'version:102.0.5005.22', + 'location': 'lacros_version_skew_tests_v102.0.5005.48', + 'revision': 'version:102.0.5005.48', }, ], }, @@ -462,16 +462,16 @@ }, 'WEBLAYER_10_AND_M_IMPL_SKEW_TESTS_NTH_MILESTONE': { 'args': [ - '--webview-apk-path=apks/AOSP_SystemWebView.apk', '--test-runner-outdir', '.', '--client-outdir', '.', - '--implementation-outdir', - '../../weblayer_instrumentation_test_M103/out/Release', '--test-expectations', '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--impl-version=103', + '--webview-apk-path=apks/AOSP_SystemWebView.apk', + '--implementation-outdir', + '../../weblayer_instrumentation_test_M103/out/Release', + '--impl-version=103' ], 'identifier': 'with_impl_from_103', 'swarming': { @@ -479,34 +479,34 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M103', - 'revision': 'version:103.0.5060.3', + 'revision': 'version:103.0.5060.6' } - ], - }, + ] + } }, 'WEBLAYER_10_AND_M_IMPL_SKEW_TESTS_NTH_MINUS_ONE_MILESTONE': { 'args': [ - '--webview-apk-path=apks/AOSP_SystemWebView.apk', '--test-runner-outdir', '.', '--client-outdir', '.', - '--implementation-outdir', - '../../weblayer_instrumentation_test_M101/out/Release', '--test-expectations', '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--impl-version=101', + '--webview-apk-path=apks/AOSP_SystemWebView.apk', + '--implementation-outdir', + '../../weblayer_instrumentation_test_M102/out/Release', + '--impl-version=102' ], - 'identifier': 'with_impl_from_101', + 'identifier': 'with_impl_from_102', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', - 'location': 'weblayer_instrumentation_test_M101', - 'revision': 'version:101.0.4951.69', + 'location': 'weblayer_instrumentation_test_M102', + 'revision': 'version:102.0.5005.55' } - ], - }, + ] + } }, 'WEBLAYER_10_AND_M_IMPL_SKEW_TESTS_NTH_MINUS_TWO_MILESTONE': { 'args': [ @@ -518,16 +518,16 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--webview-apk-path=apks/AOSP_SystemWebView.apk', '--implementation-outdir', - '../../weblayer_instrumentation_test_M100/out/Release', - '--impl-version=100' + '../../weblayer_instrumentation_test_M101/out/Release', + '--impl-version=101' ], - 'identifier': 'with_impl_from_100', + 'identifier': 'with_impl_from_101', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/weblayer-x86', - 'location': 'weblayer_instrumentation_test_M100', - 'revision': 'version:100.0.4896.134' + 'location': 'weblayer_instrumentation_test_M101', + 'revision': 'version:101.0.4951.69' } ] } @@ -542,6 +542,30 @@ '../../weblayer/browser/android/javatests/skew/expectations.txt', '--webview-apk-path=apks/AOSP_SystemWebView.apk', '--implementation-outdir', + '../../weblayer_instrumentation_test_M100/out/Release', + '--impl-version=100' + ], + 'identifier': 'with_impl_from_100', + 'swarming': { + 'cipd_packages': [ + { + 'cipd_package': 'chromium/testing/weblayer-x86', + 'location': 'weblayer_instrumentation_test_M100', + 'revision': 'version:100.0.4896.134' + } + ] + } + }, + 'WEBLAYER_10_AND_M_IMPL_SKEW_TESTS_NTH_MINUS_FOUR_MILESTONE': { + 'args': [ + '--test-runner-outdir', + '.', + '--client-outdir', + '.', + '--test-expectations', + '../../weblayer/browser/android/javatests/skew/expectations.txt', + '--webview-apk-path=apks/AOSP_SystemWebView.apk', + '--implementation-outdir', '../../weblayer_instrumentation_test_M99/out/Release', '--impl-version=99' ], @@ -556,7 +580,7 @@ ] } }, - 'WEBLAYER_10_AND_M_IMPL_SKEW_TESTS_NTH_MINUS_FOUR_MILESTONE': { + 'WEBLAYER_10_AND_M_IMPL_SKEW_TESTS_NTH_MINUS_FIVE_MILESTONE': { 'args': [ '--test-runner-outdir', '.', @@ -580,42 +604,18 @@ ] } }, - 'WEBLAYER_10_AND_M_IMPL_SKEW_TESTS_NTH_MINUS_FIVE_MILESTONE': { - 'args': [ - '--test-runner-outdir', - '.', - '--client-outdir', - '.', - '--test-expectations', - '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--webview-apk-path=apks/AOSP_SystemWebView.apk', - '--implementation-outdir', - '../../weblayer_instrumentation_test_M97/out/Release', - '--impl-version=97' - ], - 'identifier': 'with_impl_from_97', - 'swarming': { - 'cipd_packages': [ - { - 'cipd_package': 'chromium/testing/weblayer-x86', - 'location': 'weblayer_instrumentation_test_M97', - 'revision': 'version:97.0.4692.102' - } - ] - } - }, 'WEBLAYER_IMPL_SKEW_TESTS_NTH_MILESTONE': { 'args': [ - '--webview-apk-path=apks/SystemWebView.apk', '--test-runner-outdir', '.', '--client-outdir', '.', - '--implementation-outdir', - '../../weblayer_instrumentation_test_M103/out/Release', '--test-expectations', '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--impl-version=103', + '--webview-apk-path=apks/SystemWebView.apk', + '--implementation-outdir', + '../../weblayer_instrumentation_test_M103/out/Release', + '--impl-version=103' ], 'identifier': 'with_impl_from_103', 'swarming': { @@ -623,23 +623,47 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M103', - 'revision': 'version:103.0.5060.3', + 'revision': 'version:103.0.5060.6' } - ], - }, + ] + } }, 'WEBLAYER_IMPL_SKEW_TESTS_NTH_MINUS_ONE_MILESTONE': { 'args': [ - '--webview-apk-path=apks/SystemWebView.apk', '--test-runner-outdir', '.', '--client-outdir', '.', - '--implementation-outdir', - '../../weblayer_instrumentation_test_M101/out/Release', '--test-expectations', '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--impl-version=101', + '--webview-apk-path=apks/SystemWebView.apk', + '--implementation-outdir', + '../../weblayer_instrumentation_test_M102/out/Release', + '--impl-version=102' + ], + 'identifier': 'with_impl_from_102', + 'swarming': { + 'cipd_packages': [ + { + 'cipd_package': 'chromium/testing/weblayer-x86', + 'location': 'weblayer_instrumentation_test_M102', + 'revision': 'version:102.0.5005.55' + } + ] + } + }, + 'WEBLAYER_IMPL_SKEW_TESTS_NTH_MINUS_TWO_MILESTONE': { + 'args': [ + '--test-runner-outdir', + '.', + '--client-outdir', + '.', + '--test-expectations', + '../../weblayer/browser/android/javatests/skew/expectations.txt', + '--webview-apk-path=apks/SystemWebView.apk', + '--implementation-outdir', + '../../weblayer_instrumentation_test_M101/out/Release', + '--impl-version=101' ], 'identifier': 'with_impl_from_101', 'swarming': { @@ -647,12 +671,12 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M101', - 'revision': 'version:101.0.4951.69', + 'revision': 'version:101.0.4951.69' } - ], - }, + ] + } }, - 'WEBLAYER_IMPL_SKEW_TESTS_NTH_MINUS_TWO_MILESTONE': { + 'WEBLAYER_IMPL_SKEW_TESTS_NTH_MINUS_THREE_MILESTONE': { 'args': [ '--test-runner-outdir', '.', @@ -676,7 +700,7 @@ ] } }, - 'WEBLAYER_IMPL_SKEW_TESTS_NTH_MINUS_THREE_MILESTONE': { + 'WEBLAYER_IMPL_SKEW_TESTS_NTH_MINUS_FOUR_MILESTONE': { 'args': [ '--test-runner-outdir', '.', @@ -700,7 +724,7 @@ ] } }, - 'WEBLAYER_IMPL_SKEW_TESTS_NTH_MINUS_FOUR_MILESTONE': { + 'WEBLAYER_IMPL_SKEW_TESTS_NTH_MINUS_FIVE_MILESTONE': { 'args': [ '--test-runner-outdir', '.', @@ -724,42 +748,18 @@ ] } }, - 'WEBLAYER_IMPL_SKEW_TESTS_NTH_MINUS_FIVE_MILESTONE': { - 'args': [ - '--test-runner-outdir', - '.', - '--client-outdir', - '.', - '--test-expectations', - '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--webview-apk-path=apks/SystemWebView.apk', - '--implementation-outdir', - '../../weblayer_instrumentation_test_M97/out/Release', - '--impl-version=97' - ], - 'identifier': 'with_impl_from_97', - 'swarming': { - 'cipd_packages': [ - { - 'cipd_package': 'chromium/testing/weblayer-x86', - 'location': 'weblayer_instrumentation_test_M97', - 'revision': 'version:97.0.4692.102' - } - ] - } - }, 'WEBLAYER_CLIENT_SKEW_TESTS_NTH_MILESTONE': { 'args': [ - '--webview-apk-path=apks/SystemWebView.apk', '--test-runner-outdir', '.', - '--client-outdir', - '../../weblayer_instrumentation_test_M103/out/Release', '--implementation-outdir', '.', '--test-expectations', '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--client-version=103', + '--webview-apk-path=apks/SystemWebView.apk', + '--client-outdir', + '../../weblayer_instrumentation_test_M103/out/Release', + '--client-version=103' ], 'identifier': 'with_client_from_103', 'swarming': { @@ -767,23 +767,47 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M103', - 'revision': 'version:103.0.5060.3', + 'revision': 'version:103.0.5060.6' } - ], - }, + ] + } }, 'WEBLAYER_CLIENT_SKEW_TESTS_NTH_MINUS_ONE_MILESTONE': { 'args': [ - '--webview-apk-path=apks/SystemWebView.apk', '--test-runner-outdir', '.', - '--client-outdir', - '../../weblayer_instrumentation_test_M101/out/Release', '--implementation-outdir', '.', '--test-expectations', '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--client-version=101', + '--webview-apk-path=apks/SystemWebView.apk', + '--client-outdir', + '../../weblayer_instrumentation_test_M102/out/Release', + '--client-version=102' + ], + 'identifier': 'with_client_from_102', + 'swarming': { + 'cipd_packages': [ + { + 'cipd_package': 'chromium/testing/weblayer-x86', + 'location': 'weblayer_instrumentation_test_M102', + 'revision': 'version:102.0.5005.55' + } + ] + } + }, + 'WEBLAYER_CLIENT_SKEW_TESTS_NTH_MINUS_TWO_MILESTONE': { + 'args': [ + '--test-runner-outdir', + '.', + '--implementation-outdir', + '.', + '--test-expectations', + '../../weblayer/browser/android/javatests/skew/expectations.txt', + '--webview-apk-path=apks/SystemWebView.apk', + '--client-outdir', + '../../weblayer_instrumentation_test_M101/out/Release', + '--client-version=101' ], 'identifier': 'with_client_from_101', 'swarming': { @@ -791,12 +815,12 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M101', - 'revision': 'version:101.0.4951.69', + 'revision': 'version:101.0.4951.69' } - ], - }, + ] + } }, - 'WEBLAYER_CLIENT_SKEW_TESTS_NTH_MINUS_TWO_MILESTONE': { + 'WEBLAYER_CLIENT_SKEW_TESTS_NTH_MINUS_THREE_MILESTONE': { 'args': [ '--test-runner-outdir', '.', @@ -820,7 +844,7 @@ ] } }, - 'WEBLAYER_CLIENT_SKEW_TESTS_NTH_MINUS_THREE_MILESTONE': { + 'WEBLAYER_CLIENT_SKEW_TESTS_NTH_MINUS_FOUR_MILESTONE': { 'args': [ '--test-runner-outdir', '.', @@ -844,7 +868,7 @@ ] } }, - 'WEBLAYER_CLIENT_SKEW_TESTS_NTH_MINUS_FOUR_MILESTONE': { + 'WEBLAYER_CLIENT_SKEW_TESTS_NTH_MINUS_FIVE_MILESTONE': { 'args': [ '--test-runner-outdir', '.', @@ -868,35 +892,11 @@ ] } }, - 'WEBLAYER_CLIENT_SKEW_TESTS_NTH_MINUS_FIVE_MILESTONE': { - 'args': [ - '--test-runner-outdir', - '.', - '--implementation-outdir', - '.', - '--test-expectations', - '../../weblayer/browser/android/javatests/skew/expectations.txt', - '--webview-apk-path=apks/SystemWebView.apk', - '--client-outdir', - '../../weblayer_instrumentation_test_M97/out/Release', - '--client-version=97' - ], - 'identifier': 'with_client_from_97', - 'swarming': { - 'cipd_packages': [ - { - 'cipd_package': 'chromium/testing/weblayer-x86', - 'location': 'weblayer_instrumentation_test_M97', - 'revision': 'version:97.0.4692.102' - } - ] - } - }, 'CROS_ATLAS_RELEASE_LKGM': { 'skylab': { 'cros_board': 'atlas', - 'cros_chrome_version': '103.0.5045.0', - 'cros_img': 'atlas-release/R103-14803.0.0', + 'cros_chrome_version': '104.0.5061.0', + 'cros_img': 'atlas-release/R104-14829.0.0', }, 'enabled': True, 'identifier': 'ATLAS_RELEASE_LKGM', @@ -913,8 +913,8 @@ 'CROS_EVE_RELEASE_LKGM': { 'skylab': { 'cros_board': 'eve', - 'cros_chrome_version': '103.0.5045.0', - 'cros_img': 'eve-release/R103-14803.0.0', + 'cros_chrome_version': '104.0.5061.0', + 'cros_img': 'eve-release/R104-14829.0.0', }, 'enabled': True, 'identifier': 'EVE_RELEASE_LKGM', @@ -940,8 +940,8 @@ 'CROS_HANA_RELEASE_LKGM': { 'skylab': { 'cros_board': 'hana', - 'cros_chrome_version': '103.0.5045.0', - 'cros_img': 'hana-release/R103-14803.0.0', + 'cros_chrome_version': '104.0.5061.0', + 'cros_img': 'hana-release/R104-14829.0.0', }, 'enabled': True, 'identifier': 'HANA_RELEASE_LKGM', @@ -958,8 +958,8 @@ 'CROS_JACUZZI_RELEASE_LKGM': { 'skylab': { 'cros_board': 'jacuzzi', - 'cros_chrome_version': '103.0.5045.0', - 'cros_img': 'jacuzzi-release/R103-14803.0.0', + 'cros_chrome_version': '104.0.5061.0', + 'cros_img': 'jacuzzi-release/R104-14829.0.0', }, 'enabled': True, 'identifier': 'JACUZZI_RELEASE_LKGM', @@ -985,8 +985,8 @@ 'CROS_OCTOPUS_RELEASE_LKGM': { 'skylab': { 'cros_board': 'octopus', - 'cros_chrome_version': '103.0.5045.0', - 'cros_img': 'octopus-release/R103-14803.0.0', + 'cros_chrome_version': '104.0.5061.0', + 'cros_img': 'octopus-release/R104-14829.0.0', }, 'enabled': True, 'identifier': 'OCTOPUS_RELEASE_LKGM', @@ -1003,8 +1003,8 @@ 'CROS_OCTOPUS_RELEASE_BETA': { 'skylab': { 'cros_board': 'octopus', - 'cros_chrome_version': '102.0.5005.22', - 'cros_img': 'octopus-release/R102-14695.25.0', + 'cros_chrome_version': '102.0.5005.48', + 'cros_img': 'octopus-release/R102-14695.55.0', }, 'enabled': True, 'identifier': 'OCTOPUS_RELEASE_BETA', @@ -1021,8 +1021,8 @@ 'CROS_STRONGBAD_RELEASE_LKGM': { 'skylab': { 'cros_board': 'strongbad', - 'cros_chrome_version': '103.0.5045.0', - 'cros_img': 'strongbad-release/R103-14803.0.0', + 'cros_chrome_version': '104.0.5061.0', + 'cros_img': 'strongbad-release/R104-14829.0.0', }, 'enabled': True, 'identifier': 'STRONGBAD_RELEASE_LKGM', @@ -1039,8 +1039,8 @@ 'CROS_STRONGBAD_RELEASE_BETA': { 'skylab': { 'cros_board': 'strongbad', - 'cros_chrome_version': '102.0.5005.22', - 'cros_img': 'strongbad-release/R102-14695.25.0', + 'cros_chrome_version': '102.0.5005.48', + 'cros_img': 'strongbad-release/R102-14695.55.0', }, 'enabled': True, 'identifier': 'STRONGBAD_RELEASE_BETA',
diff --git a/testing/rust_gtest_interop/gtest_attribute.rs b/testing/rust_gtest_interop/gtest_attribute.rs index d62887a2..bde5295 100644 --- a/testing/rust_gtest_interop/gtest_attribute.rs +++ b/testing/rust_gtest_interop/gtest_attribute.rs
@@ -341,6 +341,11 @@ /// #[extern_test_suite("GoatTestSuite")] /// unsafe impl rust_gtest_interop::TestSuite for ffi::GoatTestSuite {} /// ``` +/// +/// # Internals +/// The #[cpp_prefix("STRING_")] attribute can follow `#[extern_test_suite()]` to control the +/// path to the C++ Gtest factory function. This is used for connecting to different C++ macros +/// than the usual RUST_GTEST_TEST_SUITE_FACTORY(). #[proc_macro_attribute] pub fn extern_test_suite( arg_stream: proc_macro::TokenStream, @@ -377,13 +382,56 @@ } }; - let trait_impl = syn::parse_macro_input!(input as syn::ItemImpl); + /// Parses `#[cpp_prefix("PREFIX_STRING_")]` and returns `"PREFIX_STRING_"`. + fn parse_cpp_prefix(attr: &syn::Attribute) -> Result<String, TokenStream> { + let parsed = match attr.parse_meta() { + Ok(syn::Meta::List(list)) if list.nested.len() == 1 => match &list.nested[0] { + syn::NestedMeta::Lit(syn::Lit::Str(lit_str)) => Ok(lit_str.value()), + x => Err(x.span()), + }, + Ok(x) => Err(x.span()), + Err(x) => Err(x.span()), + }; + parsed.map_err(|span| { + quote_spanned! { span => + compile_error!( + "invalid syntax for extern_test_suite macro, \ + expected `#[cpp_prefix("PREFIX_STRING_")]`"); + } + }) + } + + let mut trait_impl = syn::parse_macro_input!(input as syn::ItemImpl); if !trait_impl.items.is_empty() { return quote_spanned! {trait_impl.items[0].span() => compile_error!( "expected empty trait impl" )} .into(); } + + let mut cpp_prefix = RUST_GTEST_FACTORY_PREFIX.to_owned(); + + // Look through other attributes on `trait_impl`, parse the ones related to Gtests, and put + // the rest back into `attrs`. + trait_impl.attrs = { + let mut keep = Vec::new(); + for attr in std::mem::take(&mut trait_impl.attrs) { + if attr.path.is_ident("cpp_prefix") { + cpp_prefix = match parse_cpp_prefix(&attr) { + Ok(tokens) => tokens, + Err(error_tokens) => return error_tokens.into(), + }; + } else { + keep.push(attr) + } + } + keep + }; + + // No longer mut. + let trait_impl = trait_impl; + let cpp_prefix = cpp_prefix; + let trait_name = match &trait_impl.trait_ { Some((_, path, _)) => path, None => { @@ -406,8 +454,7 @@ // TODO(danakj): We should generate a C++ mangled name here, then we don't require // the function to be `extern "C"` (or have the author write the mangled name // themselves). - let cpp_fn_name = - format_ident!("{}{}", RUST_GTEST_FACTORY_PREFIX, cpp_type.into_token_stream().to_string()); + let cpp_fn_name = format_ident!("{}{}", cpp_prefix, cpp_type.into_token_stream().to_string()); let output = quote! { unsafe impl #trait_name for #rust_type {
diff --git a/testing/rust_gtest_interop/rust_gtest_interop.h b/testing/rust_gtest_interop/rust_gtest_interop.h index 155fd84..b4a4f65 100644 --- a/testing/rust_gtest_interop/rust_gtest_interop.h +++ b/testing/rust_gtest_interop/rust_gtest_interop.h
@@ -15,10 +15,13 @@ } // Macro to make an extern "C" function which acts as a Gtest factory for a -// testing::Test subclass T. The function generated by the macro is used by the +// testing::Test subclass T. Invoke this macro once for each subclass of +// testing::Test that should be used as a TestSuite class from a Rust test, +// which can be specified with `#[gtest_suite(T)]`. +// +// The function generated by the macro is used by the // rust_gtest_interop::TestSuite trait implementation to connect a Rust test to -// the C++ class, allowing the test to use a Rust wrapper type around T in -// `#[gtest_suite(T)]`. +// the C++ class. #define RUST_GTEST_TEST_SUITE_FACTORY(T) \ extern "C" T* RustGtestFactory_##T(void (*f)(T*)) { \ return rust_gtest_interop::rust_gtest_factory_for_subclass<T>(f); \
diff --git a/testing/rust_gtest_interop/rust_gtest_interop_unittest.rs b/testing/rust_gtest_interop/rust_gtest_interop_unittest.rs index 2f1bb91..249aaa0 100644 --- a/testing/rust_gtest_interop/rust_gtest_interop_unittest.rs +++ b/testing/rust_gtest_interop/rust_gtest_interop_unittest.rs
@@ -95,3 +95,13 @@ expect_false!(suite.as_mut().get_false()); expect_eq!(2, suite.as_ref().num_calls()); } + +#[gtest(Test, WithCustomTemplateTestSuite)] +#[gtest_suite(rust_gtest_interop_test_support::TestSubclassWithCustomTemplate)] +fn test(mut suite: Pin<&mut rust_gtest_interop_test_support::TestSubclassWithCustomTemplate>) { + expect_eq!(0, suite.as_ref().num_calls()); + expect_eq!(3, suite.as_mut().get_three()); + expect_eq!(1, suite.as_ref().num_calls()); + expect_eq!(4, suite.as_mut().get_four()); + expect_eq!(2, suite.as_ref().num_calls()); +}
diff --git a/testing/rust_gtest_interop/rust_gtest_interop_unittest_main.cc b/testing/rust_gtest_interop/rust_gtest_interop_unittest_main.cc index fb9ae5b..d190ff5 100644 --- a/testing/rust_gtest_interop/rust_gtest_interop_unittest_main.cc +++ b/testing/rust_gtest_interop/rust_gtest_interop_unittest_main.cc
@@ -12,7 +12,7 @@ #include <iostream> // Update this when adding a new test to rust_test_interop_unittest.rs. -int kNumTests = 9; +int kNumTests = 10; bool is_subprocess() { // The test launching process spawns a subprocess to run tests, and it
diff --git a/testing/rust_gtest_interop/test/test_subclass.cc b/testing/rust_gtest_interop/test/test_subclass.cc index 7533da8..9b1cbf7 100644 --- a/testing/rust_gtest_interop/test/test_subclass.cc +++ b/testing/rust_gtest_interop/test/test_subclass.cc
@@ -4,16 +4,14 @@ #include "testing/rust_gtest_interop/test/test_subclass.h" -namespace { -size_t g_num_subclass_created = 0; -} - namespace rust_gtest_interop { -TestSubclass::TestSubclass() { - ++g_num_subclass_created; -} +TestSubclass::TestSubclass() = default; RUST_GTEST_TEST_SUITE_FACTORY(TestSubclass); +TestSubclassWithCustomTemplate::TestSubclassWithCustomTemplate() = default; + +RUST_CUSTOM_TEMPLATE_TEST_SUITE_FACTORY(TestSubclassWithCustomTemplate); + } // namespace rust_gtest_interop
diff --git a/testing/rust_gtest_interop/test/test_subclass.h b/testing/rust_gtest_interop/test/test_subclass.h index 85bef09..bf60255 100644 --- a/testing/rust_gtest_interop/test/test_subclass.h +++ b/testing/rust_gtest_interop/test/test_subclass.h
@@ -10,6 +10,9 @@ namespace rust_gtest_interop { +// A TestSuite that can be used from #[gtest_suite], and which uses the default +// setup through the `RustTest` class and `RUST_GTEST_TEST_SUITE_FACTORY()` +// macro (which is called in the .cc file). class TestSubclass : public testing::Test { public: TestSubclass(); @@ -28,6 +31,64 @@ int32_t calls_ = 0; }; +// A TestSuite that can be used from #[gtest_suite], and which uses a custom C++ +// class, `RunTestFromSetup`, to run the test function, instead of the +// `RustTest` class. The `RUST_CUSTOM_TEMPLATE_TEST_SUITE_FACTORY()` macro +// (which is called in the .cc file) will allow use of this class with the +// `RustTestFromSetup` class, and allow the Rust wrapper to request that macro's +// factory when implementing the rust_gtest_interop::TestSuite trait. +class TestSubclassWithCustomTemplate : public testing::Test { + public: + TestSubclassWithCustomTemplate(); + + int32_t get_three() { + ++calls_; + return 3; + } + int32_t get_four() { + ++calls_; + return 4; + } + int32_t num_calls() const { return calls_; } + + private: + int32_t calls_ = 0; +}; + +// It's possible to not be able to use the RustTest class from +// rust_gtest_interop. In that case a different macro with a different factory +// function name should be used to provide some type safety. +#define RUST_CUSTOM_TEMPLATE_TEST_SUITE_FACTORY(T) \ + extern "C" T* RunTestFromSetupTestFactory_##T(void (*f)(T*)) { \ + return ::rust_gtest_interop::run_test_from_setup_factory_for_subclass<T>( \ + f); \ + } + +// This class runs the test from SetUp instead of from TestBody, so the RustTest +// class can't be used with it. +template <class Subclass> +class RunTestFromSetup : public Subclass { + public: + explicit RunTestFromSetup(void (&test_fn)(Subclass*)) : test_fn_(test_fn) { + static_assert(std::is_convertible_v<Subclass*, testing::Test*>, + "The Subclass parameter must be a testing::Test or a " + "subclass of it"); + } + + void SetUp() override { test_fn_(this); } + + private: + void TestBody() override {} + + void (&test_fn_)(Subclass*); +}; + +// Factory method called via `RUST_CUSTOM_TEMPLATE_TEST_SUITE_FACTORY()`. +template <class Subclass> +Subclass* run_test_from_setup_factory_for_subclass(void (*body)(Subclass*)) { + return new RunTestFromSetup<Subclass>(*body); +} + } // namespace rust_gtest_interop #endif // TESTING_RUST_GTEST_INTEROP_TEST_TEST_SUBCLASS_H_
diff --git a/testing/rust_gtest_interop/test/test_subclass.rs b/testing/rust_gtest_interop/test/test_subclass.rs index dad1080..95563ddc 100644 --- a/testing/rust_gtest_interop/test/test_subclass.rs +++ b/testing/rust_gtest_interop/test/test_subclass.rs
@@ -4,26 +4,40 @@ use rust_gtest_interop::prelude::*; -pub use ffi::TestSubclass; +pub use ffi::rust_gtest_interop::{TestSubclass, TestSubclassWithCustomTemplate}; -// TODO(adetaylor): Use autcxx here, but since TestSubclass is an abstract class it falls over -// trying to make a unique_ptr constructor for the type. +// TODO(adetaylor): Use autcxx here, but it is failing to work on android. +// use autocxx::prelude::*; // include_cpp! { // #include "testing/rust_gtest_interop/test/test_subclass.h" // generate!("rust_gtest_interop::TestSubclass") +// generate!("rust_gtest_interop::TestSubclassWithCustomTemplate") // safety!(unsafe_ffi) // } -#[cxx::bridge] + mod ffi { - unsafe extern "C++" { - include!("testing/rust_gtest_interop/test/test_subclass.h"); - #[namespace = "rust_gtest_interop"] - type TestSubclass; - fn get_true(self: Pin<&mut TestSubclass>) -> bool; - fn get_false(self: Pin<&mut TestSubclass>) -> bool; - fn num_calls(self: &TestSubclass) -> i32; + #[cxx::bridge(namespace = "rust_gtest_interop")] + pub mod rust_gtest_interop { + unsafe extern "C++" { + include!("testing/rust_gtest_interop/test/test_subclass.h"); + type TestSubclass; + fn get_true(self: Pin<&mut TestSubclass>) -> bool; + fn get_false(self: Pin<&mut TestSubclass>) -> bool; + fn num_calls(self: &TestSubclass) -> i32; + + type TestSubclassWithCustomTemplate; + fn get_three(self: Pin<&mut TestSubclassWithCustomTemplate>) -> i32; + fn get_four(self: Pin<&mut TestSubclassWithCustomTemplate>) -> i32; + fn num_calls(self: &TestSubclassWithCustomTemplate) -> i32; + } } } #[extern_test_suite("rust_gtest_interop::TestSubclass")] -unsafe impl rust_gtest_interop::TestSuite for ffi::TestSubclass {} +unsafe impl rust_gtest_interop::TestSuite for TestSubclass {} + +// This type uses a custom testing::Test subclass, instead of `RustTest`. The macro that constructs +// the C++ type uses the prefix "RunTestFromSetupTestFactory_" for the factory function. +#[extern_test_suite("rust_gtest_interop::TestSubclassWithCustomTemplate")] +#[cpp_prefix("RunTestFromSetupTestFactory_")] +unsafe impl rust_gtest_interop::TestSuite for TestSubclassWithCustomTemplate {}
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 2a493be..2f7988f 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -62,26 +62,6 @@ ] } ], - "AnchorElementInteractionPreloader": [ - { - "platforms": [ - "android", - "chromeos", - "chromeos_lacros", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled_20220428", - "enable_features": [ - "AnchorElementInteraction" - ] - } - ] - } - ], "AndroidContextualSearchM95": [ { "platforms": [ @@ -3424,6 +3404,9 @@ "SafeBrowsingExtensionTelemetry", "SafeBrowsingExtensionTelemetryReportContactedHosts", "SafeBrowsingExtensionTelemetryTabsExecuteScriptSignal" + ], + "disable_features": [ + "SafeBrowsingExtensionTelemetryPersistence" ] }, { @@ -3433,6 +3416,11 @@ }, "enable_features": [ "SafeBrowsingExtensionTelemetry" + ], + "disable_features": [ + "SafeBrowsingExtensionTelemetryPersistence", + "SafeBrowsingExtensionTelemetryReportContactedHosts", + "SafeBrowsingExtensionTelemetryTabsExecuteScriptSignal" ] }, { @@ -3443,6 +3431,10 @@ "enable_features": [ "SafeBrowsingExtensionTelemetry", "SafeBrowsingExtensionTelemetryTabsExecuteScriptSignal" + ], + "disable_features": [ + "SafeBrowsingExtensionTelemetryPersistence", + "SafeBrowsingExtensionTelemetryReportContactedHosts" ] }, { @@ -3453,6 +3445,10 @@ "enable_features": [ "SafeBrowsingExtensionTelemetry", "SafeBrowsingExtensionTelemetryReportContactedHosts" + ], + "disable_features": [ + "SafeBrowsingExtensionTelemetryPersistence", + "SafeBrowsingExtensionTelemetryTabsExecuteScriptSignal" ] }, { @@ -5297,6 +5293,21 @@ ] } ], + "OneCopyCanvasCaptureWin": [ + { + "platforms": [ + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "OneCopyCanvasCapture" + ] + } + ] + } + ], "OneTimeGeolocationPermission": [ { "platforms": [
diff --git a/third_party/abseil-cpp/symbols_arm64_rel.def b/third_party/abseil-cpp/symbols_arm64_rel.def index 8fd13d5..f355317 100644 --- a/third_party/abseil-cpp/symbols_arm64_rel.def +++ b/third_party/abseil-cpp/symbols_arm64_rel.def
@@ -121,7 +121,6 @@ ??0ByAnyChar@absl@@QEAA@Vstring_view@1@@Z ??0ByLength@absl@@QEAA@_J@Z ??0ByString@absl@@QEAA@Vstring_view@1@@Z - ??0ChunkIterator@Cord@absl@@AEAA@PEAUCordRep@cord_internal@2@@Z ??0ChunkIterator@Cord@absl@@AEAA@PEBV12@@Z ??0Condition@absl@@AEAA@XZ ??0Condition@absl@@QEAA@P6A_NPEAX@Z0@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def index 517fcc6..f9e0966 100644 --- a/third_party/abseil-cpp/symbols_x64_rel.def +++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -76,8 +76,6 @@ ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@0@AEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@3@@Z ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@2@@Z - ??$ToChronoDuration@V?$duration@JV?$ratio@$0DM@$00@__1@std@@@chrono@__1@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__1@std@@@chrono@__1@std@@VDuration@1@@Z - ??$ToChronoDuration@V?$duration@JV?$ratio@$0OBA@$00@__1@std@@@chrono@__1@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__1@std@@@chrono@__1@std@@VDuration@1@@Z ??$__construct_node_hash@AEBUpiecewise_construct_t@__1@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$__emplace_back_slow_path@AEAVstring_view@absl@@AEBV12@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAVstring_view@absl@@AEBV34@AEA_K@Z ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QEAV?$tuple@$$V@12@@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def index 094ff26..344d791a 100644 --- a/third_party/abseil-cpp/symbols_x64_rel_asan.def +++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -75,8 +75,6 @@ ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@0@AEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@3@@Z ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@2@@Z - ??$ToChronoDuration@V?$duration@JV?$ratio@$0DM@$00@__1@std@@@chrono@__1@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__1@std@@@chrono@__1@std@@VDuration@1@@Z - ??$ToChronoDuration@V?$duration@JV?$ratio@$0OBA@$00@__1@std@@@chrono@__1@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__1@std@@@chrono@__1@std@@VDuration@1@@Z ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z ??$__construct_node_hash@AEBUpiecewise_construct_t@__1@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QEAV?$tuple@$$V@12@@Z ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QEAV?$tuple@$$V@12@@Z @@ -406,7 +404,6 @@ ?Find@ByChar@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByLength@absl@@QEBA?AVstring_view@2@V32@_K@Z ?Find@ByString@absl@@QEBA?AVstring_view@2@V32@_K@Z - ?FindFlatStartPiece@InlineRep@Cord@absl@@QEBA?AVstring_view@3@XZ ?FindPath@GraphCycles@synchronization_internal@absl@@QEBAHUGraphId@23@0HQEAU423@@Z ?FindSlow@CordRepRing@cord_internal@absl@@AEBA?AUPosition@123@I_K@Z ?FindTailSlow@CordRepRing@cord_internal@absl@@AEBA?AUPosition@123@I_K@Z
diff --git a/third_party/blink/OWNERS b/third_party/blink/OWNERS index 3daffc1e..ba16155 100644 --- a/third_party/blink/OWNERS +++ b/third_party/blink/OWNERS
@@ -5,7 +5,6 @@ bratell.d@gmail.com chrishtr@chromium.org foolip@chromium.org -jochen@chromium.org mkwst@chromium.org rbyers@chromium.org tkent@chromium.org
diff --git a/third_party/blink/common/privacy_budget/identifiability_metric_builder_unittest.cc b/third_party/blink/common/privacy_budget/identifiability_metric_builder_unittest.cc index 9d7c3e14..824554f 100644 --- a/third_party/blink/common/privacy_budget/identifiability_metric_builder_unittest.cc +++ b/third_party/blink/common/privacy_budget/identifiability_metric_builder_unittest.cc
@@ -16,7 +16,7 @@ #include "third_party/blink/common/privacy_budget/test_ukm_recorder.h" #include "third_party/blink/public/common/privacy_budget/identifiable_surface.h" #include "third_party/blink/public/common/privacy_budget/scoped_identifiability_test_sample_collector.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h" namespace blink {
diff --git a/third_party/blink/common/storage_key/storage_key_unittest.cc b/third_party/blink/common/storage_key/storage_key_unittest.cc index 9e16b0ac..9b64d73e 100644 --- a/third_party/blink/common/storage_key/storage_key_unittest.cc +++ b/third_party/blink/common/storage_key/storage_key_unittest.cc
@@ -59,71 +59,52 @@ url::Origin origin1 = url::Origin::Create(GURL("https://example.com")); url::Origin origin2 = url::Origin::Create(GURL("https://test.example")); url::Origin origin3 = url::Origin(); - url::Origin origin4 = - url::Origin(); // Creates a different opaque origin than origin3. - + // Create another opaque origin different from origin3. + url::Origin origin4 = url::Origin(); base::UnguessableToken nonce1 = base::UnguessableToken::Create(); base::UnguessableToken nonce2 = base::UnguessableToken::Create(); - StorageKey key1_origin1 = StorageKey(origin1); - StorageKey key2_origin1 = StorageKey(origin1); - StorageKey key3_origin2 = StorageKey(origin2); + // Ensure that the opaque origins produce opaque StorageKeys + EXPECT_TRUE(IsOpaque(StorageKey(origin3))); + EXPECT_TRUE(IsOpaque(StorageKey(origin4))); - StorageKey key4_origin3 = StorageKey(origin3); - StorageKey key5_origin3 = StorageKey(origin3); - StorageKey key6_origin4 = StorageKey(origin4); - EXPECT_TRUE(IsOpaque(key4_origin3)); - EXPECT_TRUE(IsOpaque(key5_origin3)); - EXPECT_TRUE(IsOpaque(key6_origin4)); - - StorageKey key7_origin1_nonce1 = StorageKey::CreateWithNonce(origin1, nonce1); - StorageKey key8_origin1_nonce1 = StorageKey::CreateWithNonce(origin1, nonce1); - StorageKey key9_origin1_nonce2 = StorageKey::CreateWithNonce(origin1, nonce2); - StorageKey key10_origin2_nonce1 = - StorageKey::CreateWithNonce(origin2, nonce1); - - StorageKey key11_origin1_origin2 = StorageKey(origin1, origin2); - StorageKey key12_origin2_origin1 = StorageKey(origin2, origin1); - // TODO(https://crbug.com/1287130): Change or remove this expectation once the - // full ancestor tree has been properly searched to determine AncestorChainBit - // value. - EXPECT_EQ(key11_origin1_origin2.ancestor_chain_bit(), - blink::mojom::AncestorChainBit::kSameSite); - - // All are equivalent to themselves - EXPECT_EQ(key1_origin1, key1_origin1); - EXPECT_EQ(key2_origin1, key2_origin1); - EXPECT_EQ(key3_origin2, key3_origin2); - EXPECT_EQ(key4_origin3, key4_origin3); - EXPECT_EQ(key5_origin3, key5_origin3); - EXPECT_EQ(key6_origin4, key6_origin4); - EXPECT_EQ(key7_origin1_nonce1, key7_origin1_nonce1); - EXPECT_EQ(key8_origin1_nonce1, key8_origin1_nonce1); - EXPECT_EQ(key9_origin1_nonce2, key9_origin1_nonce2); - EXPECT_EQ(key10_origin2_nonce1, key10_origin2_nonce1); - - // StorageKeys created from the same origins are equivalent. - EXPECT_EQ(key1_origin1, key2_origin1); - EXPECT_EQ(key4_origin3, key5_origin3); - - // StorageKeys created from different origins are not equivalent. - EXPECT_NE(key1_origin1, key3_origin2); - EXPECT_NE(key4_origin3, key6_origin4); - EXPECT_NE(key7_origin1_nonce1, key10_origin2_nonce1); - - // StorageKeys created from the same origins and nonces are equivalent. - EXPECT_EQ(key7_origin1_nonce1, key8_origin1_nonce1); - - // StorageKeys created from different nonces are not equivalent. - EXPECT_NE(key7_origin1_nonce1, key9_origin1_nonce2); - - // StorageKeys created from different origin and different nonces are not - // equivalent. - EXPECT_NE(key9_origin1_nonce2, key10_origin2_nonce1); - - // The top-level site doesn't factor in when storage partitioning is disabled. - EXPECT_EQ(key11_origin1_origin2, key1_origin1); - EXPECT_EQ(key12_origin2_origin1, key3_origin2); + const struct { + StorageKey storage_key1; + StorageKey storage_key2; + bool expected_equivalent; + } kTestCases[] = { + // StorageKeys made from the same origin are equivalent. + {StorageKey(origin1), StorageKey(origin1), true}, + {StorageKey(origin2), StorageKey(origin2), true}, + {StorageKey(origin3), StorageKey(origin3), true}, + {StorageKey(origin4), StorageKey(origin4), true}, + // StorageKeys made from the same origin and nonce are equivalent. + {StorageKey::CreateWithNonce(origin1, nonce1), + StorageKey::CreateWithNonce(origin1, nonce1), true}, + {StorageKey::CreateWithNonce(origin1, nonce2), + StorageKey::CreateWithNonce(origin1, nonce2), true}, + {StorageKey::CreateWithNonce(origin2, nonce1), + StorageKey::CreateWithNonce(origin2, nonce1), true}, + // StorageKeys made from different origins are not equivalent. + {StorageKey(origin1), StorageKey(origin2), false}, + {StorageKey(origin3), StorageKey(origin4), false}, + {StorageKey::CreateWithNonce(origin1, nonce1), + StorageKey::CreateWithNonce(origin2, nonce1), false}, + // StorageKeys made from different nonces are not equivalent. + {StorageKey::CreateWithNonce(origin1, nonce1), + StorageKey::CreateWithNonce(origin1, nonce2), false}, + // StorageKeys made from different origins and nonce are not equivalent. + {StorageKey::CreateWithNonce(origin1, nonce1), + StorageKey::CreateWithNonce(origin2, nonce2), false}, + // When storage partitioning is disabled, the top-level site isn't taken + // into account for equivalence. + {StorageKey(origin1, origin2), StorageKey(origin1), true}, + {StorageKey(origin2, origin1), StorageKey(origin2), true}, + }; + for (const auto& test_case : kTestCases) { + ASSERT_EQ(test_case.storage_key1 == test_case.storage_key2, + test_case.expected_equivalent); + } } // Test that StorageKeys are/aren't equivalent as expected when storage
diff --git a/third_party/blink/common/use_counter/use_counter_feature.cc b/third_party/blink/common/use_counter/use_counter_feature.cc index 0bdcb36c..3e5a0f88 100644 --- a/third_party/blink/common/use_counter/use_counter_feature.cc +++ b/third_party/blink/common/use_counter/use_counter_feature.cc
@@ -6,8 +6,8 @@ #include "third_party/blink/public/common/user_agent/user_agent_metadata.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h" -#include "third_party/blink/public/mojom/use_counter/css_property_id.mojom-shared.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" namespace blink {
diff --git a/third_party/blink/common/use_counter/use_counter_feature_mojom_traits.cc b/third_party/blink/common/use_counter/use_counter_feature_mojom_traits.cc index 31b5fa3d..41242c7 100644 --- a/third_party/blink/common/use_counter/use_counter_feature_mojom_traits.cc +++ b/third_party/blink/common/use_counter/use_counter_feature_mojom_traits.cc
@@ -5,8 +5,8 @@ #include "third_party/blink/common/use_counter/use_counter_feature_mojom_traits.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h" -#include "third_party/blink/public/mojom/use_counter/css_property_id.mojom-shared.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" namespace mojo { namespace {
diff --git a/third_party/blink/perf_tests/css/HighlightInheritanceRecalc.html b/third_party/blink/perf_tests/css/HighlightInheritanceRecalc.html index 947558a..447fc7e 100644 --- a/third_party/blink/perf_tests/css/HighlightInheritanceRecalc.html +++ b/third_party/blink/perf_tests/css/HighlightInheritanceRecalc.html
@@ -16,7 +16,7 @@ <script> createDOMTree(document.querySelector("main"), 4, 6); PerfTestRunner.measureTime({ - description: 'Measure impact of highlight inheritance on content with universal ::selection rules', + description: 'Measure impact of highlight inheritance on content with universal ::selection rules (no selection, no paint)', run: () => { document.documentElement.classList.toggle("green"); forceStyleRecalc(document.documentElement);
diff --git a/third_party/blink/perf_tests/css/HighlightInheritanceSelected.html b/third_party/blink/perf_tests/css/HighlightInheritanceSelected.html new file mode 100644 index 0000000..be23560 --- /dev/null +++ b/third_party/blink/perf_tests/css/HighlightInheritanceSelected.html
@@ -0,0 +1,40 @@ +<!DOCTYPE html> +<script src="../resources/runner.js"></script> +<script src="resources/utils.js"></script> +<body> +<main></main> +<style> +main { word-wrap: break-word; } +main div { display: inline; } +/* non-::selection rules required when HighlightInheritance is disabled */ +:root, :root::selection { --bg: blue; } +.green:root, .green:root::selection { --bg: green; } +*::selection /* same as ::selection */ { + /* explicitly inherit all for worst case scenario */ + all: inherit; + background-color: var(--bg); +} +</style> +<script> +createDOMTree(document.querySelector("main"), 4, 6); +for (const leaf of document.querySelectorAll("div:empty")) + leaf.append("."); +const r = new Range; +r.selectNodeContents(document.querySelector("main")); +getSelection().removeAllRanges(); +getSelection().addRange(r); +PerfTestRunner.measureFrameTime({ + description: 'Measure impact of highlight inheritance on content with universal ::selection rules (select all, with paint)', + tracingCategories: "blink", + traceEventsToMeasure: [ + "Document::updateStyle", + "Document::recalcStyle", + "LocalFrameView::RunPaintLifecyclePhase", + ], + run: () => { + document.documentElement.classList.toggle("green"); + forceStyleRecalc(document.documentElement); + }, +}); +</script> +</body>
diff --git a/third_party/blink/public/OWNERS b/third_party/blink/public/OWNERS index 869406c..5c1665a 100644 --- a/third_party/blink/public/OWNERS +++ b/third_party/blink/public/OWNERS
@@ -9,7 +9,6 @@ haraken@chromium.org japhet@chromium.org jbroman@chromium.org -jochen@chromium.org kinuko@chromium.org mkwst@chromium.org pdr@chromium.org
diff --git a/third_party/blink/public/common/privacy_budget/identifiability_metric_builder.h b/third_party/blink/public/common/privacy_budget/identifiability_metric_builder.h index 95b2c0a..430d7c10 100644 --- a/third_party/blink/public/common/privacy_budget/identifiability_metric_builder.h +++ b/third_party/blink/public/common/privacy_budget/identifiability_metric_builder.h
@@ -14,7 +14,7 @@ #include "third_party/blink/public/common/privacy_budget/identifiable_sample.h" #include "third_party/blink/public/common/privacy_budget/identifiable_surface.h" #include "third_party/blink/public/common/privacy_budget/identifiable_token.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-forward.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-forward.h" namespace blink { @@ -82,7 +82,7 @@ // // 1. A simple web exposed API that's represented using a |WebFeature| // constant. Values are defined in -// blink/public/mojom/web_feature/web_feature.mojom. +// blink/public/mojom/use_counter/metrics/web_feature.mojom. // // identifiable_surface = IdentifiableSurface::FromTypeAndToken( // IdentifiableSurface::Type::kWebFeature,
diff --git a/third_party/blink/public/common/privacy_budget/identifiability_study_settings.h b/third_party/blink/public/common/privacy_budget/identifiability_study_settings.h index e172263e..72c0bab 100644 --- a/third_party/blink/public/common/privacy_budget/identifiability_study_settings.h +++ b/third_party/blink/public/common/privacy_budget/identifiability_study_settings.h
@@ -10,7 +10,7 @@ #include "third_party/blink/public/common/common_export.h" #include "third_party/blink/public/common/privacy_budget/identifiability_study_settings_provider.h" #include "third_party/blink/public/common/privacy_budget/identifiable_surface.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-forward.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-forward.h" namespace blink {
diff --git a/third_party/blink/public/common/privacy_budget/identifiable_surface.h b/third_party/blink/public/common/privacy_budget/identifiable_surface.h index 8f51ff0..7236ed4 100644 --- a/third_party/blink/public/common/privacy_budget/identifiable_surface.h +++ b/third_party/blink/public/common/privacy_budget/identifiable_surface.h
@@ -95,7 +95,7 @@ // IdentifiableSurface = { mojom::WebFeature, kWebFeature } // Value = IdentifiableToken( $(output of the attribute or method) ) // - // [1]: //blink/public/mojom/web_feature/web_feature.mojom + // [1]: //blink/public/mojom/use_counter/metrics/web_feature.mojom kWebFeature = 1, // Reserved 2.
diff --git a/third_party/blink/public/common/security/address_space_feature.h b/third_party/blink/public/common/security/address_space_feature.h index 43e8da4b..c924e04 100644 --- a/third_party/blink/public/common/security/address_space_feature.h +++ b/third_party/blink/public/common/security/address_space_feature.h
@@ -34,7 +34,7 @@ #include "services/network/public/mojom/ip_address_space.mojom-shared.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/common_export.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" namespace blink {
diff --git a/third_party/blink/public/common/use_counter/use_counter_feature_tracker.h b/third_party/blink/public/common/use_counter/use_counter_feature_tracker.h index 29627a9..49bd0b61 100644 --- a/third_party/blink/public/common/use_counter/use_counter_feature_tracker.h +++ b/third_party/blink/public/common/use_counter/use_counter_feature_tracker.h
@@ -12,8 +12,8 @@ #include "third_party/blink/public/common/use_counter/use_counter_feature.h" #include "third_party/blink/public/common/user_agent/user_agent_metadata.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h" -#include "third_party/blink/public/mojom/use_counter/css_property_id.mojom-shared.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" namespace blink {
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index 80189790..500b8fd 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -1420,8 +1420,8 @@ mojom_component("web_feature_mojo_bindings") { generate_java = true sources = [ - "use_counter/css_property_id.mojom", - "web_feature/web_feature.mojom", + "use_counter/metrics/css_property_id.mojom", + "use_counter/metrics/web_feature.mojom", ] macro_prefix = "WEB_FEATURE_MOJO_BINDINGS_MOJOM"
diff --git a/third_party/blink/public/mojom/buckets/bucket_manager_host.mojom b/third_party/blink/public/mojom/buckets/bucket_manager_host.mojom index 2bcdb947..8e23b6a 100644 --- a/third_party/blink/public/mojom/buckets/bucket_manager_host.mojom +++ b/third_party/blink/public/mojom/buckets/bucket_manager_host.mojom
@@ -10,10 +10,11 @@ // // Proposal: https://github.com/WICG/storage-buckets -// The durability policy to apply to a single StorageBucket. +// The durability policy to apply to a single StorageBucket. The values are +// persisted to the quota DB and must not be changed. enum BucketDurability { - kRelaxed, - kStrict, + kRelaxed = 0, + kStrict = 1, }; // The policies applied to a StorageBucket upon its creation.
diff --git a/third_party/blink/public/mojom/frame/frame.mojom b/third_party/blink/public/mojom/frame/frame.mojom index 2eec98d..2597671 100644 --- a/third_party/blink/public/mojom/frame/frame.mojom +++ b/third_party/blink/public/mojom/frame/frame.mojom
@@ -64,7 +64,7 @@ import "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom"; import "third_party/blink/public/mojom/timing/resource_timing.mojom"; import "third_party/blink/public/mojom/tokens/tokens.mojom"; -import "third_party/blink/public/mojom/web_feature/web_feature.mojom"; +import "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom"; import "ui/base/mojom/window_open_disposition.mojom"; import "ui/events/mojom/scroll_granularity.mojom"; import "ui/gfx/geometry/mojom/geometry.mojom";
diff --git a/third_party/blink/public/mojom/service_worker/controller_service_worker.mojom b/third_party/blink/public/mojom/service_worker/controller_service_worker.mojom index bbd8885b..5c6bc647d 100644 --- a/third_party/blink/public/mojom/service_worker/controller_service_worker.mojom +++ b/third_party/blink/public/mojom/service_worker/controller_service_worker.mojom
@@ -13,7 +13,7 @@ import "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom"; import "third_party/blink/public/mojom/service_worker/service_worker_fetch_response_callback.mojom"; import "third_party/blink/public/mojom/service_worker/service_worker_object.mojom"; -import "third_party/blink/public/mojom/web_feature/web_feature.mojom"; +import "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom"; // Represents a service worker that is a 'controller'. // (https://w3c.github.io/ServiceWorker/#navigator-service-worker-controller)
diff --git a/third_party/blink/public/mojom/service_worker/embedded_worker.mojom b/third_party/blink/public/mojom/service_worker/embedded_worker.mojom index b006447..1ef6199 100644 --- a/third_party/blink/public/mojom/service_worker/embedded_worker.mojom +++ b/third_party/blink/public/mojom/service_worker/embedded_worker.mojom
@@ -26,7 +26,7 @@ import "third_party/blink/public/mojom/user_agent/user_agent_metadata.mojom"; import "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom"; import "third_party/blink/public/mojom/worker/worker_main_script_load_params.mojom"; -import "third_party/blink/public/mojom/web_feature/web_feature.mojom"; +import "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom"; import "url/mojom/url.mojom"; // Parameters to launch a service worker. This is passed from the browser to the
diff --git a/third_party/blink/public/mojom/service_worker/service_worker_container.mojom b/third_party/blink/public/mojom/service_worker/service_worker_container.mojom index 14e6ea0a..bb911e0 100644 --- a/third_party/blink/public/mojom/service_worker/service_worker_container.mojom +++ b/third_party/blink/public/mojom/service_worker/service_worker_container.mojom
@@ -13,7 +13,7 @@ import "third_party/blink/public/mojom/service_worker/service_worker_object.mojom"; import "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom"; import "third_party/blink/public/mojom/service_worker/service_worker_registration_options.mojom"; -import "third_party/blink/public/mojom/web_feature/web_feature.mojom"; +import "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom"; import "url/mojom/url.mojom"; // Used for EnsureControllerServiceWorker() to indicate why a controllee needs
diff --git a/third_party/blink/public/mojom/shared_storage/shared_storage.mojom b/third_party/blink/public/mojom/shared_storage/shared_storage.mojom index 16f9afb..b3308f8 100644 --- a/third_party/blink/public/mojom/shared_storage/shared_storage.mojom +++ b/third_party/blink/public/mojom/shared_storage/shared_storage.mojom
@@ -51,10 +51,11 @@ // Handle sharedStorage.runURLSelectionOperation(): run the operation // previously registered by registerURLSelectionOperation() with matching - // `name`. The length of the `urls` array should be checked at the renderer - // and be enforced at the browser to ensure it's below the configured limit - // number `kSharedStorageURLSelectionOperationInputURLSizeLimit`. - // `serialized_data` is the serialization result of JavaScript value + // `name`. Restrictions be checked at the renderer and be enforced at the + // browser: 1) This is not allowed in fenced frame. 2) The length of the + // `urls` array is below the configured limit number + // `kSharedStorageURLSelectionOperationInputURLSizeLimit`. `serialized_data` + // is the serialization result of JavaScript value // SharedStorageRunOperationMethodOptions.data using v8::ValueSerializer. // There's no need to sanitize `serialized_data` at the browser process as the // data will be only consumed in an environment (i.e. the worklet) in control
diff --git a/third_party/blink/public/mojom/use_counter/OWNERS b/third_party/blink/public/mojom/use_counter/OWNERS index 3d34b06..588a397 100644 --- a/third_party/blink/public/mojom/use_counter/OWNERS +++ b/third_party/blink/public/mojom/use_counter/OWNERS
@@ -1,7 +1,4 @@ dcheng@chromium.org -# Changes in css_property_id.mojom are always mechanical updates to -# kMaximumCSSSampleId, so no IPC security review is required; all committers can -# approve changes. See also UseCounterHelperTest.MaximumCSSSampleId, which -# verifies the correctness of kMaximumCSSSampleId. -per-file css_property_id.mojom=* +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/public/mojom/use_counter/PRESUBMIT.py b/third_party/blink/public/mojom/use_counter/PRESUBMIT.py deleted file mode 100644 index a662d343..0000000 --- a/third_party/blink/public/mojom/use_counter/PRESUBMIT.py +++ /dev/null
@@ -1,68 +0,0 @@ -# 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. -"""Blink frame presubmit script - -See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts -for more details about the presubmit API built into gcl. - -This script generates enums.xml based on the css_property_id.mojom and verifies -that it is equivalent with the expected file in the patch otherwise warns the -user. -""" - -import sys - - -USE_PYTHON3 = True - - -def _RunUmaHistogramChecks(input_api, output_api): - original_sys_path = sys.path - try: - sys.path = sys.path + [ - input_api.os_path.join(input_api.PresubmitLocalPath(), '..', '..', - '..', '..', '..', 'tools', 'metrics', - 'histograms') - ] - import update_histogram_enum # pylint: disable=F0401 - import update_use_counter_css # pylint: disable=F0401 - - finally: - sys.path = original_sys_path - - source_path = 'third_party/blink/public/mojom/use_counter/'\ - 'css_property_id.mojom' - - if not source_path in [f.LocalPath() for f in input_api.AffectedFiles()]: - return [] - - # Note: This is similar to update_histogram_enum.CheckPresubmitErrors except - # that we use the logic in update_use_counter_css to produce the enum - # values. - - histogram_enum_name = 'MappedCSSProperties' - update_script_name = 'update_use_counter_css.py' - - def read_values(source_path, start_marker, end_marker, strip_k_prefix): - return update_use_counter_css.ReadCssProperties(source_path) - - error = update_histogram_enum.CheckPresubmitErrors( - histogram_enum_name, - update_script_name, - source_path, - '', - '', - histogram_value_reader=read_values) - - if error: - return [output_api.PresubmitPromptWarning(error, items=[source_path])] - return [] - - -def CheckChangeOnUpload(input_api, output_api): - return _RunUmaHistogramChecks(input_api, output_api) - - -def CheckChangeOnCommit(input_api, output_api): - return _RunUmaHistogramChecks(input_api, output_api)
diff --git a/third_party/blink/public/mojom/use_counter/metrics/OWNERS b/third_party/blink/public/mojom/use_counter/metrics/OWNERS new file mode 100644 index 0000000..57c04482 --- /dev/null +++ b/third_party/blink/public/mojom/use_counter/metrics/OWNERS
@@ -0,0 +1,12 @@ +# Changes in css_property_id.mojom are always mechanical updates to +# kMaximumCSSSampleId, so no IPC security review is required; all committers can +# approve changes. See also UseCounterHelperTest.MaximumCSSSampleId, which +# verifies the correctness of kMaximumCSSSampleId. +per-file css_property_id.mojom=* + +# OWNERS review for adding / removing UseCounters already happens as part of +# reviewing the actual implementation changes (which is often, but not always +# in blink/renderer/core). No additional review (including IPC security review) +# is required for adding/removing entries from this enum (consistent with +# metrics/histograms/enums.xml). +per-file web_feature.mojom=*
diff --git a/third_party/blink/public/mojom/use_counter/metrics/PRESUBMIT.py b/third_party/blink/public/mojom/use_counter/metrics/PRESUBMIT.py new file mode 100644 index 0000000..9ccacd1 --- /dev/null +++ b/third_party/blink/public/mojom/use_counter/metrics/PRESUBMIT.py
@@ -0,0 +1,61 @@ +# Copyright 2017 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. +"""Blink presubmit script for use counter metrics enums. + +See https://www.chromium.org/developers/how-tos/depottools/presubmit-scripts/ +for more details about the presubmit API built into gcl. +""" + +PRESUBMIT_VERSION = '2.0.0' +USE_PYTHON3 = True + + +def CheckHistograms(input_api, output_api): # pylint: disable=C0103 + import sys + + original_sys_path = sys.path.copy() + try: + sys.path.append( + input_api.os_path.join(input_api.change.RepositoryRoot(), 'tools', + 'metrics', 'histograms')) + import update_histogram_enum # pylint: disable=F0401 + import update_use_counter_css # pylint: disable=F0401 + finally: + sys.path = original_sys_path + + def _CssPropertyValueReader(source_path, start_marker, end_marker, + strip_k_prefix): + return update_use_counter_css.ReadCssProperties(source_path) + + _VALIDATE_HISTOGRAM_ARGS = { + 'third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom': + { + 'update_script_name': 'update_use_counter_feature_enum.py', + 'histogram_enum_name': 'FeatureObserver', + 'start_marker': '^enum WebFeature {', + 'end_marker': '^kNumberOfFeatures', + 'strip_k_prefix': True, + }, + 'third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom': + { + 'update_script_name': 'update_use_counter_css.py', + 'histogram_enum_name': 'MappedCSSProperties', + 'start_marker': '', + 'end_marker': '', + 'histogram_value_reader': _CssPropertyValueReader, + }, + } + + results = [] + for f in input_api.AffectedFiles(): + if f.LocalPath() not in _VALIDATE_HISTOGRAM_ARGS: + continue + presubmit_error = update_histogram_enum.CheckPresubmitErrors( + source_enum_path=f.LocalPath(), + **_VALIDATE_HISTOGRAM_ARGS[f.LocalPath()]) + if presubmit_error: + results.append( + output_api.PresubmitPromptWarning(presubmit_error, + items=[f.LocalPath()])) + return results
diff --git a/third_party/blink/public/mojom/use_counter/css_property_id.mojom b/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom similarity index 100% rename from third_party/blink/public/mojom/use_counter/css_property_id.mojom rename to third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom similarity index 100% rename from third_party/blink/public/mojom/web_feature/web_feature.mojom rename to third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
diff --git a/third_party/blink/public/mojom/web_feature/OWNERS b/third_party/blink/public/mojom/web_feature/OWNERS deleted file mode 100644 index 20da615..0000000 --- a/third_party/blink/public/mojom/web_feature/OWNERS +++ /dev/null
@@ -1,6 +0,0 @@ -# OWNERS review for adding / removing UseCounters already happens as part of -# reviewing the actual implementation changes (which is often, but not always -# in blink/renderer/core). No additional review (including IPC security review) -# is required for adding/removing entries from this enum (consistent with -# metrics/histograms/enums.xml). -per-file web_feature.mojom=*
diff --git a/third_party/blink/public/mojom/web_feature/PRESUBMIT.py b/third_party/blink/public/mojom/web_feature/PRESUBMIT.py deleted file mode 100644 index 3e18b11a0..0000000 --- a/third_party/blink/public/mojom/web_feature/PRESUBMIT.py +++ /dev/null
@@ -1,60 +0,0 @@ -# Copyright 2017 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. -"""Blink frame presubmit script - -See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts -for more details about the presubmit API built into gcl. -""" - -USE_PYTHON3 = True - - -def _RunUmaHistogramChecks(input_api, output_api): # pylint: disable=C0103 - import sys - - original_sys_path = sys.path - try: - sys.path = sys.path + [ - input_api.os_path.join(input_api.PresubmitLocalPath(), '..', '..', - '..', '..', '..', 'tools', 'metrics', - 'histograms') - ] - import update_histogram_enum # pylint: disable=F0401 - finally: - sys.path = original_sys_path - - for f in input_api.AffectedFiles(): - if f.LocalPath().endswith('web_feature.mojom'): - break - else: - return [] - - source_path = 'third_party/blink/public/mojom/web_feature/web_feature.mojom' - start_marker = '^enum WebFeature {' - end_marker = '^kNumberOfFeatures' - presubmit_error = update_histogram_enum.CheckPresubmitErrors( - histogram_enum_name='FeatureObserver', - update_script_name='update_use_counter_feature_enum.py', - source_enum_path=source_path, - start_marker=start_marker, - end_marker=end_marker, - strip_k_prefix=True) - if presubmit_error: - return [ - output_api.PresubmitPromptWarning( - presubmit_error, items=[source_path]) - ] - return [] - - -def CheckChangeOnUpload(input_api, output_api): # pylint: disable=C0103 - results = [] - results.extend(_RunUmaHistogramChecks(input_api, output_api)) - return results - - -def CheckChangeOnCommit(input_api, output_api): # pylint: disable=C0103 - results = [] - results.extend(_RunUmaHistogramChecks(input_api, output_api)) - return results
diff --git a/third_party/blink/public/mojom/worker/shared_worker_client.mojom b/third_party/blink/public/mojom/worker/shared_worker_client.mojom index dd9e61d..97e94f80 100644 --- a/third_party/blink/public/mojom/worker/shared_worker_client.mojom +++ b/third_party/blink/public/mojom/worker/shared_worker_client.mojom
@@ -5,7 +5,7 @@ module blink.mojom; import "third_party/blink/public/mojom/worker/shared_worker_creation_context_type.mojom"; -import "third_party/blink/public/mojom/web_feature/web_feature.mojom"; +import "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom"; // An interface used by clients (e.g., the renderer where "new SharedWorker()" // was invoked) to observe events from a shared worker.
diff --git a/third_party/blink/public/mojom/worker/shared_worker_host.mojom b/third_party/blink/public/mojom/worker/shared_worker_host.mojom index a0b1745b..9d0ec04 100644 --- a/third_party/blink/public/mojom/worker/shared_worker_host.mojom +++ b/third_party/blink/public/mojom/worker/shared_worker_host.mojom
@@ -4,7 +4,7 @@ module blink.mojom; -import "third_party/blink/public/mojom/web_feature/web_feature.mojom"; +import "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom"; import "third_party/blink/public/mojom/devtools/devtools_agent.mojom"; // Each shared worker has a corresponding host. The host controls the lifetime
diff --git a/third_party/blink/public/platform/modules/service_worker/web_service_worker_provider_client.h b/third_party/blink/public/platform/modules/service_worker/web_service_worker_provider_client.h index 6b3edf7e..af1f1f36 100644 --- a/third_party/blink/public/platform/modules/service_worker/web_service_worker_provider_client.h +++ b/third_party/blink/public/platform/modules/service_worker/web_service_worker_provider_client.h
@@ -32,7 +32,7 @@ #define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_SERVICE_WORKER_WEB_SERVICE_WORKER_PROVIDER_CLIENT_H_ #include "third_party/blink/public/common/messaging/transferable_message.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_object_info.h" #include "third_party/blink/public/platform/web_common.h" #include "third_party/blink/public/platform/web_vector.h"
diff --git a/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h b/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h index c26a418..5d73b43 100644 --- a/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h +++ b/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h
@@ -36,7 +36,7 @@ #include "third_party/blink/public/mojom/devtools/console_message.mojom-shared.h" #include "third_party/blink/public/mojom/devtools/devtools_agent.mojom-shared.h" #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom-shared.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/public/platform/cross_variant_mojo_util.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_fetch_context.h" #include "third_party/blink/public/platform/web_url.h"
diff --git a/third_party/blink/public/web/web_local_frame.h b/third_party/blink/public/web/web_local_frame.h index ce1714e..ca80bd6 100644 --- a/third_party/blink/public/web/web_local_frame.h +++ b/third_party/blink/public/web/web_local_frame.h
@@ -37,7 +37,7 @@ #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-shared.h" #include "third_party/blink/public/mojom/portal/portal.mojom-shared.h" #include "third_party/blink/public/mojom/selection_menu/selection_menu_behavior.mojom-shared.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/public/platform/cross_variant_mojo_util.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/web_common.h"
diff --git a/third_party/blink/renderer/bindings/OWNERS b/third_party/blink/renderer/bindings/OWNERS index 5e4e3ad..1ac6e19 100644 --- a/third_party/blink/renderer/bindings/OWNERS +++ b/third_party/blink/renderer/bindings/OWNERS
@@ -2,7 +2,6 @@ haraken@chromium.org japhet@chromium.org jbroman@chromium.org -jochen@chromium.org kouhei@chromium.org mkwst@chromium.org mlippautz@chromium.org
diff --git a/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc b/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc index 233e664..aa1d9cc6 100644 --- a/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc +++ b/third_party/blink/renderer/bindings/core/v8/scheduled_action.cc
@@ -32,7 +32,7 @@ #include <tuple> -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/binding_security.h" #include "third_party/blink/renderer/bindings/core/v8/script_evaluation_result.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc index 3dc1a4bf..c3a86c4 100644 --- a/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc +++ b/third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.cc
@@ -5,7 +5,7 @@ #include "third_party/blink/renderer/bindings/core/v8/serialization/v8_script_value_serializer.h" #include "base/auto_reset.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/web_blob_info.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" #include "third_party/blink/renderer/bindings/core/v8/to_v8_for_core.h"
diff --git a/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.cc.tmpl b/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.cc.tmpl index 08dbc57..24dd57b 100644 --- a/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.cc.tmpl +++ b/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.cc.tmpl
@@ -6,7 +6,7 @@ #include "third_party/blink/renderer/core/css/{{file_basename}}.h" #include <string.h> -#include "third_party/blink/public/mojom/use_counter/css_property_id.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom-blink.h" #include "third_party/blink/renderer/core/css/hash_tools.h" #include "third_party/blink/renderer/platform/wtf/text/ascii_ctype.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
diff --git a/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.h.tmpl b/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.h.tmpl index b6eac5d6..e731f25 100644 --- a/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.h.tmpl +++ b/third_party/blink/renderer/build/scripts/core/css/templates/css_property_names.h.tmpl
@@ -5,7 +5,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_PROPERTY_NAMES_H_ #include <stddef.h> -#include "third_party/blink/public/mojom/use_counter/css_property_id.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom-blink-forward.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/hash_functions.h"
diff --git a/third_party/blink/renderer/core/css/css_gradient_value.cc b/third_party/blink/renderer/core/css/css_gradient_value.cc index ee77427..23c2d843 100644 --- a/third_party/blink/renderer/core/css/css_gradient_value.cc +++ b/third_party/blink/renderer/core/css/css_gradient_value.cc
@@ -1096,10 +1096,28 @@ return false; } +static bool IsUsingContainerRelativeUnits(const CSSValue* value) { + const auto* primitive_value = DynamicTo<CSSPrimitiveValue>(value); + return primitive_value && primitive_value->HasContainerRelativeUnits(); +} + +static bool IsUsingContainerRelativeUnits( + const HeapVector<CSSGradientColorStop, 2>& stops) { + for (const CSSGradientColorStop& stop : stops) { + if (IsUsingContainerRelativeUnits(stop.offset_.Get())) + return true; + } + return false; +} + bool CSSLinearGradientValue::IsUsingCurrentColor() const { return blink::cssvalue::IsUsingCurrentColor(stops_); } +bool CSSLinearGradientValue::IsUsingContainerRelativeUnits() const { + return blink::cssvalue::IsUsingContainerRelativeUnits(stops_); +} + void CSSLinearGradientValue::TraceAfterDispatch(blink::Visitor* visitor) const { visitor->Trace(first_x_); visitor->Trace(first_y_); @@ -1505,6 +1523,10 @@ return blink::cssvalue::IsUsingCurrentColor(stops_); } +bool CSSRadialGradientValue::IsUsingContainerRelativeUnits() const { + return blink::cssvalue::IsUsingContainerRelativeUnits(stops_); +} + void CSSRadialGradientValue::TraceAfterDispatch(blink::Visitor* visitor) const { visitor->Trace(first_x_); visitor->Trace(first_y_); @@ -1590,6 +1612,12 @@ return blink::cssvalue::IsUsingCurrentColor(stops_); } +bool CSSConicGradientValue::IsUsingContainerRelativeUnits() const { + return blink::cssvalue::IsUsingContainerRelativeUnits(stops_) || + blink::cssvalue::IsUsingContainerRelativeUnits(x_.Get()) || + blink::cssvalue::IsUsingContainerRelativeUnits(y_.Get()); +} + void CSSConicGradientValue::TraceAfterDispatch(blink::Visitor* visitor) const { visitor->Trace(x_); visitor->Trace(y_);
diff --git a/third_party/blink/renderer/core/css/css_gradient_value.h b/third_party/blink/renderer/core/css/css_gradient_value.h index e6541ec..d6806c6 100644 --- a/third_party/blink/renderer/core/css/css_gradient_value.h +++ b/third_party/blink/renderer/core/css/css_gradient_value.h
@@ -184,6 +184,7 @@ bool allow_visited_style) const; bool IsUsingCurrentColor() const; + bool IsUsingContainerRelativeUnits() const; void TraceAfterDispatch(blink::Visitor*) const; @@ -284,6 +285,7 @@ bool allow_visited_style) const; bool IsUsingCurrentColor() const; + bool IsUsingContainerRelativeUnits() const; void TraceAfterDispatch(blink::Visitor*) const; @@ -332,6 +334,7 @@ bool allow_visited_style) const; bool IsUsingCurrentColor() const; + bool IsUsingContainerRelativeUnits() const; void TraceAfterDispatch(blink::Visitor*) const;
diff --git a/third_party/blink/renderer/core/css/css_gradient_value_test.cc b/third_party/blink/renderer/core/css/css_gradient_value_test.cc index 3b0bd08f5..d905393 100644 --- a/third_party/blink/renderer/core/css/css_gradient_value_test.cc +++ b/third_party/blink/renderer/core/css/css_gradient_value_test.cc
@@ -18,16 +18,31 @@ namespace { +using CSSGradientValue = cssvalue::CSSGradientValue; + +const CSSGradientValue* ParseSingleGradient(const char* text) { + const CSSValue* value = CSSParser::ParseSingleValue( + CSSPropertyID::kBackgroundImage, text, + StrictCSSParserContext(SecureContextMode::kInsecureContext)); + if (const auto* list = DynamicTo<CSSValueList>(value)) { + DCHECK_EQ(list->length(), 1u); + return &To<CSSGradientValue>(list->Item(0)); + } + NOTREACHED(); + return nullptr; +} + bool CompareGradients(const char* gradient1, const char* gradient2) { - const CSSValue* value1 = CSSParser::ParseSingleValue( - CSSPropertyID::kBackgroundImage, gradient1, - StrictCSSParserContext(SecureContextMode::kInsecureContext)); - const CSSValue* value2 = CSSParser::ParseSingleValue( - CSSPropertyID::kBackgroundImage, gradient2, - StrictCSSParserContext(SecureContextMode::kInsecureContext)); + const CSSValue* value1 = ParseSingleGradient(gradient1); + const CSSValue* value2 = ParseSingleGradient(gradient2); return *value1 == *value2; } +bool IsUsingContainerRelativeUnits(const char* text) { + const CSSGradientValue* gradient = ParseSingleGradient(text); + return gradient->IsUsingContainerRelativeUnits(); +} + TEST(CSSGradientValueTest, RadialGradient_Equals) { // Trivially identical. EXPECT_TRUE(CompareGradients( @@ -90,6 +105,46 @@ document.ComputedStyleRef()); } +TEST(CSSGradientValueTest, IsUsingContainerRelativeUnits) { + ScopedCSSContainerQueriesForTest scoped_feature(true); + + EXPECT_TRUE( + IsUsingContainerRelativeUnits("linear-gradient(green 5cqw, blue 10cqh)")); + EXPECT_TRUE( + IsUsingContainerRelativeUnits("linear-gradient(green 5cqi, blue 10cqb)")); + EXPECT_TRUE(IsUsingContainerRelativeUnits( + "linear-gradient(green 5cqmin, blue 10cqmax)")); + EXPECT_TRUE( + IsUsingContainerRelativeUnits("linear-gradient(green 10px, blue 10cqh)")); + EXPECT_TRUE( + IsUsingContainerRelativeUnits("linear-gradient(green 5cqw, blue 10px)")); + EXPECT_TRUE( + IsUsingContainerRelativeUnits("radial-gradient(green 5cqw, blue 10cqh)")); + EXPECT_TRUE( + IsUsingContainerRelativeUnits("radial-gradient(green 10px, blue 10cqh)")); + EXPECT_TRUE( + IsUsingContainerRelativeUnits("radial-gradient(green 5cqw, blue 10px)")); + EXPECT_TRUE(IsUsingContainerRelativeUnits( + "conic-gradient(from 180deg at 10cqh 20cqw, green, blue)")); + EXPECT_TRUE(IsUsingContainerRelativeUnits( + "conic-gradient(from 180deg at 10px 20cqw, green, blue)")); + EXPECT_TRUE(IsUsingContainerRelativeUnits( + "conic-gradient(from 180deg at 10cqh 20px, green, blue)")); + EXPECT_TRUE(IsUsingContainerRelativeUnits( + "linear-gradient(green calc(10px + 5cqw), blue 10px)")); + + EXPECT_FALSE( + IsUsingContainerRelativeUnits("linear-gradient(green 10px, blue 10vh)")); + EXPECT_FALSE( + IsUsingContainerRelativeUnits("linear-gradient(green 10px, blue 10em)")); + EXPECT_FALSE(IsUsingContainerRelativeUnits( + "linear-gradient(green calc(10px + 20em), blue 10px)")); + EXPECT_FALSE( + IsUsingContainerRelativeUnits("radial-gradient(green 5px, blue 10px)")); + EXPECT_FALSE(IsUsingContainerRelativeUnits( + "conic-gradient(from 180deg at 10px 20px, green, blue)")); +} + } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_image_generator_value.cc b/third_party/blink/renderer/core/css/css_image_generator_value.cc index e845f2c..524fa57 100644 --- a/third_party/blink/renderer/core/css/css_image_generator_value.cc +++ b/third_party/blink/renderer/core/css/css_image_generator_value.cc
@@ -184,6 +184,19 @@ } } +bool CSSImageGeneratorValue::IsUsingContainerRelativeUnits() const { + switch (GetClassType()) { + case kLinearGradientClass: + return To<CSSLinearGradientValue>(this)->IsUsingContainerRelativeUnits(); + case kRadialGradientClass: + return To<CSSRadialGradientValue>(this)->IsUsingContainerRelativeUnits(); + case kConicGradientClass: + return To<CSSConicGradientValue>(this)->IsUsingContainerRelativeUnits(); + default: + return false; + } +} + bool CSSImageGeneratorValue::KnownToBeOpaque(const Document& document, const ComputedStyle& style) const { switch (GetClassType()) {
diff --git a/third_party/blink/renderer/core/css/css_image_generator_value.h b/third_party/blink/renderer/core/css/css_image_generator_value.h index 0d63d77..23030e5 100644 --- a/third_party/blink/renderer/core/css/css_image_generator_value.h +++ b/third_party/blink/renderer/core/css/css_image_generator_value.h
@@ -107,6 +107,7 @@ bool IsUsingCustomProperty(const AtomicString& custom_property_name, const Document&) const; bool IsUsingCurrentColor() const; + bool IsUsingContainerRelativeUnits() const; void TraceAfterDispatch(blink::Visitor*) const;
diff --git a/third_party/blink/renderer/core/css/css_primitive_value.cc b/third_party/blink/renderer/core/css/css_primitive_value.cc index 8d3b1d8..31e5d9f 100644 --- a/third_party/blink/renderer/core/css/css_primitive_value.cc +++ b/third_party/blink/renderer/core/css/css_primitive_value.cc
@@ -201,6 +201,19 @@ return To<CSSMathFunctionValue>(this)->IsComputationallyIndependent(); } +bool CSSPrimitiveValue::HasContainerRelativeUnits() const { + CSSPrimitiveValue::LengthTypeFlags units; + AccumulateLengthUnitTypes(units); + const CSSPrimitiveValue::LengthTypeFlags container_units( + (1ull << CSSPrimitiveValue::kUnitTypeContainerWidth) | + (1ull << CSSPrimitiveValue::kUnitTypeContainerHeight) | + (1ull << CSSPrimitiveValue::kUnitTypeContainerInlineSize) | + (1ull << CSSPrimitiveValue::kUnitTypeContainerBlockSize) | + (1ull << CSSPrimitiveValue::kUnitTypeContainerMin) | + (1ull << CSSPrimitiveValue::kUnitTypeContainerMax)); + return (units & container_units).any(); +} + CSSPrimitiveValue::CSSPrimitiveValue(ClassType class_type) : CSSValue(class_type) {}
diff --git a/third_party/blink/renderer/core/css/css_primitive_value.h b/third_party/blink/renderer/core/css/css_primitive_value.h index 416c792..857f49b 100644 --- a/third_party/blink/renderer/core/css/css_primitive_value.h +++ b/third_party/blink/renderer/core/css/css_primitive_value.h
@@ -308,6 +308,9 @@ // "global" information that cannot be changed by CSS. bool IsComputationallyIndependent() const; + // True if this value contains any of cq[w,h,i,b,min,max], false otherwise. + bool HasContainerRelativeUnits() const; + // Creates either a |CSSNumericLiteralValue| or a |CSSMathFunctionValue|, // depending on whether |value| is calculated or not. We should never create a // |CSSPrimitiveValue| that's not of any of its subclasses.
diff --git a/third_party/blink/renderer/core/css/css_primitive_value_test.cc b/third_party/blink/renderer/core/css/css_primitive_value_test.cc index c4aae6c..b3a0111 100644 --- a/third_party/blink/renderer/core/css/css_primitive_value_test.cc +++ b/third_party/blink/renderer/core/css/css_primitive_value_test.cc
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/core/css/css_math_expression_node.h" #include "third_party/blink/renderer/core/css/css_math_function_value.h" #include "third_party/blink/renderer/core/css/css_numeric_literal_value.h" +#include "third_party/blink/renderer/core/css/css_test_helpers.h" #include "third_party/blink/renderer/core/css/css_to_length_conversion_data.h" #include "third_party/blink/renderer/core/testing/page_test_base.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" @@ -18,6 +19,12 @@ class CSSPrimitiveValueTest : public PageTestBase, private ScopedCSSCalcInfinityAndNaNForTest { public: + bool HasContainerRelativeUnits(const char* text) { + return To<CSSPrimitiveValue>( + css_test_helpers::ParseValue(GetDocument(), "<length>", text)) + ->HasContainerRelativeUnits(); + } + CSSPrimitiveValueTest() : ScopedCSSCalcInfinityAndNaNForTest(true) {} }; @@ -215,5 +222,27 @@ UnitType canonicalized_from_int = ToCanonicalUnit(UnitType::kInteger); EXPECT_EQ(canonicalized_from_int, UnitType::kNumber); } + +TEST_F(CSSPrimitiveValueTest, HasContainerRelativeUnits) { + ScopedCSSContainerQueriesForTest scoped_feature(true); + + EXPECT_TRUE(HasContainerRelativeUnits("1cqw")); + EXPECT_TRUE(HasContainerRelativeUnits("1cqh")); + EXPECT_TRUE(HasContainerRelativeUnits("1cqi")); + EXPECT_TRUE(HasContainerRelativeUnits("1cqb")); + EXPECT_TRUE(HasContainerRelativeUnits("1cqmin")); + EXPECT_TRUE(HasContainerRelativeUnits("1cqmax")); + EXPECT_TRUE(HasContainerRelativeUnits("calc(1px + 1cqw)")); + EXPECT_TRUE(HasContainerRelativeUnits("min(1px, 1cqw)")); + + EXPECT_FALSE(HasContainerRelativeUnits("1px")); + EXPECT_FALSE(HasContainerRelativeUnits("1em")); + EXPECT_FALSE(HasContainerRelativeUnits("1vh")); + EXPECT_FALSE(HasContainerRelativeUnits("1svh")); + EXPECT_FALSE(HasContainerRelativeUnits("calc(1px + 1px)")); + EXPECT_FALSE(HasContainerRelativeUnits("calc(1px + 1em)")); + EXPECT_FALSE(HasContainerRelativeUnits("calc(1px + 1svh)")); +} + } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5 index 7b2753f..cee2e989 100644 --- a/third_party/blink/renderer/core/css/css_properties.json5 +++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -4846,6 +4846,7 @@ property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"], style_builder_custom_functions: ["value"], valid_for_first_letter: true, + affected_by_all: false, }, { name: "-webkit-border-vertical-spacing", @@ -5217,6 +5218,7 @@ interpolable: true, converter: "ConvertLength", computable: false, + affected_by_all: false, }, { name: "-webkit-perspective-origin-y", @@ -5224,6 +5226,7 @@ interpolable: true, converter: "ConvertLength", computable: false, + affected_by_all: false, }, { name: "-webkit-print-color-adjust", @@ -5376,6 +5379,7 @@ interpolable: true, converter: "ConvertLength", computable: false, + affected_by_all: false, }, { name: "-webkit-transform-origin-y", @@ -5383,6 +5387,7 @@ interpolable: true, converter: "ConvertLength", computable: false, + affected_by_all: false, }, { name: "-webkit-transform-origin-z", @@ -5390,6 +5395,7 @@ interpolable: true, converter: "ConvertComputedLength<float>", computable: false, + affected_by_all: false, }, { name: "-webkit-user-drag",
diff --git a/third_party/blink/renderer/core/css/css_selector.cc b/third_party/blink/renderer/core/css/css_selector.cc index d71b8ba1..aefc69cb 100644 --- a/third_party/blink/renderer/core/css/css_selector.cc +++ b/third_party/blink/renderer/core/css/css_selector.cc
@@ -920,7 +920,11 @@ builder.Append(')'); break; } - case kPseudoHighlight: { + case kPseudoHighlight: + case kPseudoPageTransitionContainer: + case kPseudoPageTransitionImageWrapper: + case kPseudoPageTransitionIncomingImage: + case kPseudoPageTransitionOutgoingImage: { builder.Append('('); builder.Append(simple_selector->Argument()); builder.Append(')');
diff --git a/third_party/blink/renderer/core/css/css_to_length_conversion_data.cc b/third_party/blink/renderer/core/css/css_to_length_conversion_data.cc index 09c7382..7fa557a 100644 --- a/third_party/blink/renderer/core/css/css_to_length_conversion_data.cc +++ b/third_party/blink/renderer/core/css/css_to_length_conversion_data.cc
@@ -72,6 +72,11 @@ return absl::nullopt; } +void SetHasContainerRelativeUnits(const ComputedStyle* style) { + const_cast<ComputedStyle*>(style)->SetHasContainerRelativeUnits(); + const_cast<ComputedStyle*>(style)->SetDependsOnContainerQueries(true); +} + } // namespace CSSToLengthConversionData::FontSizes::FontSizes(float em, @@ -144,6 +149,11 @@ visitor->Trace(nearest_container_); } +bool CSSToLengthConversionData::ContainerSizes::SizesEqual( + const ContainerSizes& other) const { + return (Width() == other.Width()) && (Height() == other.Height()); +} + absl::optional<double> CSSToLengthConversionData::ContainerSizes::Width() const { CacheSizeIfNeeded(PhysicalAxes(kPhysicalAxisHorizontal), cached_width_); @@ -360,7 +370,7 @@ double CSSToLengthConversionData::ContainerWidthPercent() const { if (style_) - const_cast<ComputedStyle*>(style_)->SetHasContainerRelativeUnits(); + SetHasContainerRelativeUnits(style_); if (absl::optional<double> size = container_sizes_.Width()) return *size / 100; return SmallViewportWidthPercent(); @@ -368,7 +378,7 @@ double CSSToLengthConversionData::ContainerHeightPercent() const { if (style_) - const_cast<ComputedStyle*>(style_)->SetHasContainerRelativeUnits(); + SetHasContainerRelativeUnits(style_); if (absl::optional<double> size = container_sizes_.Height()) return *size / 100; return SmallViewportHeightPercent(); @@ -416,6 +426,12 @@ return font_sizes_.Ch(); } +CSSToLengthConversionData::ContainerSizes +CSSToLengthConversionData::PreCachedContainerSizesCopy() const { + SetHasContainerRelativeUnits(style_); + return container_sizes_.PreCachedCopy(); +} + double CSSToLengthConversionData::ZoomedComputedPixels( double value, CSSPrimitiveValue::UnitType type) const {
diff --git a/third_party/blink/renderer/core/css/css_to_length_conversion_data.h b/third_party/blink/renderer/core/css/css_to_length_conversion_data.h index 8fa2719..88a65bc 100644 --- a/third_party/blink/renderer/core/css/css_to_length_conversion_data.h +++ b/third_party/blink/renderer/core/css/css_to_length_conversion_data.h
@@ -130,6 +130,10 @@ // generated images). ContainerSizes PreCachedCopy() const; + // Note that this will eagerly compute width/height for both `this` and + // the incoming object. + bool SizesEqual(const ContainerSizes&) const; + void Trace(Visitor*) const; absl::optional<double> Width() const; @@ -206,7 +210,11 @@ zoom_ = zoom; } - const ContainerSizes& GetContainerSizes() const { return container_sizes_; } + // See ContainerSizes::PreCachedCopy. + // + // Calling this function will mark the associated ComputedStyle as + // dependent on container-relative units. + ContainerSizes PreCachedContainerSizesCopy() const; CSSToLengthConversionData CopyWithAdjustedZoom(float new_zoom) const { return CSSToLengthConversionData(style_, writing_mode_, font_sizes_,
diff --git a/third_party/blink/renderer/core/css/element_rule_collector.cc b/third_party/blink/renderer/core/css/element_rule_collector.cc index e1a953b..2dd233f 100644 --- a/third_party/blink/renderer/core/css/element_rule_collector.cc +++ b/third_party/blink/renderer/core/css/element_rule_collector.cc
@@ -829,23 +829,18 @@ dynamic_pseudo == kPseudoIdAfter) && !rule_data->Rule()->Properties().HasProperty(CSSPropertyID::kContent)) return; - if (!rule_data->Rule()->Properties().IsEmpty()) { - style_->SetHasPseudoElementStyle(dynamic_pseudo); - if (dynamic_pseudo == kPseudoIdHighlight) { - DCHECK(result.custom_highlight_name); - style_->SetHasCustomHighlightName(result.custom_highlight_name); - } - } - } else { - matched_rules_.push_back(MatchedRule(rule_data, layer_order, proximity, - style_sheet_index, style_sheet)); + if (rule_data->Rule()->Properties().IsEmpty()) + return; - if (IsHighlightPseudoElement(GetPseudoId())) { + style_->SetHasPseudoElementStyle(dynamic_pseudo); + + if (IsHighlightPseudoElement(dynamic_pseudo)) { // Determine whether the selector definitely matches the highlight pseudo // of all elements, without any namespace limits or other conditions. bool universal = false; const CSSSelector& selector = rule_data->Selector(); - if (CSSSelector::GetPseudoId(selector.GetPseudoType()) == GetPseudoId()) { + if (CSSSelector::GetPseudoId(selector.GetPseudoType()) == + dynamic_pseudo) { // When there is no default @namespace, *::selection and *|*::selection // are stored without the star, so we are universal if there’s nothing // before (e.g. x::selection) and nothing after (e.g. y ::selection). @@ -857,15 +852,23 @@ // (the only universal form) is stored as g_star_atom|*::selection. universal = next->IsLastInTagHistory() && - CSSSelector::GetPseudoId(next->GetPseudoType()) == GetPseudoId() && + CSSSelector::GetPseudoId(next->GetPseudoType()) == dynamic_pseudo && selector.Match() == CSSSelector::kTag && selector.TagQName().LocalName().IsNull() && selector.TagQName().Prefix() == g_star_atom; } if (!universal) - result_.SetMatchesNonUniversalHighlights(); + style_->SetHasNonUniversalHighlightPseudoStyles(true); + + if (dynamic_pseudo == kPseudoIdHighlight) { + DCHECK(result.custom_highlight_name); + style_->SetHasCustomHighlightName(result.custom_highlight_name); + } } + } else { + matched_rules_.push_back(MatchedRule(rule_data, layer_order, proximity, + style_sheet_index, style_sheet)); } }
diff --git a/third_party/blink/renderer/core/css/element_rule_collector_test.cc b/third_party/blink/renderer/core/css/element_rule_collector_test.cc index d5440f9..f33e8c4c 100644 --- a/third_party/blink/renderer/core/css/element_rule_collector_test.cc +++ b/third_party/blink/renderer/core/css/element_rule_collector_test.cc
@@ -264,14 +264,15 @@ scoped_refptr<SharedBuffer> data = SharedBuffer::Create(markup.Utf8().data(), markup.length()); GetFrame().ForceSynchronousDocumentInstall("text/xml", data); - auto style = GetDocument().GetStyleResolver().CreateComputedStyle(); - // Creates a StyleSheetContents with selector and optional default @namespace. - auto sheet = [&](String selector, - absl::optional<AtomicString> defaultNamespace) { - auto* context = MakeGarbageCollected<CSSParserContext>( + // Creates a StyleSheetContents with selector and optional default @namespace, + // matches rules for originating element, then returns the non-universal flag + // for ::highlight(x) or the given PseudoId. + auto run = [&](Element& element, String selector, + absl::optional<AtomicString> defaultNamespace) { + auto* parser_context = MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext); - auto* sheet = MakeGarbageCollected<StyleSheetContents>(context); + auto* sheet = MakeGarbageCollected<StyleSheetContents>(parser_context); sheet->ParserAddNamespace("bar", "http://example.org/bar"); if (defaultNamespace) sheet->ParserAddNamespace(g_null_atom, *defaultNamespace); @@ -280,20 +281,29 @@ auto* rule = To<StyleRule>(CSSParser::ParseRule( sheet->ParserContext(), sheet, selector + " { color: green }")); rules.AddStyleRule(rule, kRuleHasNoSpecialState); - return sheet; - }; - // Matches the element and pseudo and returns MatchesNonUniversalHighlights. - auto test = [&](Element& element, StyleSheetContents* sheet, - PseudoId pseudo = kPseudoIdSelection) { MatchResult result; + auto style = GetDocument().GetStyleResolver().CreateComputedStyle(); ElementResolveContext context{element}; ElementRuleCollector collector(context, StyleRecalcContext(), SelectorFilter(), result, style.get(), EInsideLink::kNotInsideLink); - collector.SetPseudoElementStyleRequest(StyleRequest{pseudo, nullptr}); collector.CollectMatchingRules(MatchRequest{&sheet->GetRuleSet(), nullptr}); - return result.MatchesNonUniversalHighlights(); + + // Pretty-print the arguments for debugging. + StringBuilder args{}; + args.Append("(<"); + args.Append(element.ToString()); + args.Append(">, "); + args.Append(selector); + args.Append(", "); + if (defaultNamespace) + args.Append(String("\"" + *defaultNamespace + "\"")); + else + args.Append("{}"); + args.Append(")"); + + return style->HasNonUniversalHighlightPseudoStyles(); }; Element& body = *GetDocument().body(); @@ -302,32 +312,28 @@ Element& def = *body.QuerySelector("default"); AtomicString defNs = "http://example.org/default"; - // MatchesNonUniversalHighlights is only ever set for highlight pseudos. - EXPECT_FALSE(test(body, sheet("::before", {}), kPseudoIdBefore)); - EXPECT_FALSE(test(body, sheet("body::before", {}), kPseudoIdBefore)); - // Cases that only make sense without a default @namespace. // ::selection kSubSelector :window-inactive - EXPECT_TRUE(test(body, sheet("::selection:window-inactive", {}))); - EXPECT_TRUE(test(body, sheet("body::selection", {}))); // body::selection - EXPECT_TRUE(test(body, sheet(".foo::selection", {}))); // .foo::selection - EXPECT_TRUE(test(body, sheet("* ::selection", {}))); // ::selection * - EXPECT_TRUE(test(body, sheet("* body::selection", {}))); // body::selection * + EXPECT_TRUE(run(body, "::selection:window-inactive", {})); + EXPECT_TRUE(run(body, "body::highlight(x)", {})); // body::highlight(x) + EXPECT_TRUE(run(body, ".foo::highlight(x)", {})); // .foo::highlight(x) + EXPECT_TRUE(run(body, "* ::highlight(x)", {})); // ::highlight(x) * + EXPECT_TRUE(run(body, "* body::highlight(x)", {})); // body::highlight(x) * // Cases that depend on whether there is a default @namespace. - EXPECT_FALSE(test(def, sheet("::selection", {}))); // ::selection - EXPECT_FALSE(test(def, sheet("*::selection", {}))); // ::selection - EXPECT_TRUE(test(def, sheet("::selection", defNs))); // null|*::selection - EXPECT_TRUE(test(def, sheet("*::selection", defNs))); // null|*::selection + EXPECT_FALSE(run(def, "::highlight(x)", {})); // ::highlight(x) + EXPECT_FALSE(run(def, "*::highlight(x)", {})); // ::highlight(x) + EXPECT_TRUE(run(def, "::highlight(x)", defNs)); // null|*::highlight(x) + EXPECT_TRUE(run(def, "*::highlight(x)", defNs)); // null|*::highlight(x) // Cases that are independent of whether there is a default @namespace. for (auto& ns : Vector<absl::optional<AtomicString>>{{}, defNs}) { - // no default ::selection, default *|*::selection - EXPECT_FALSE(test(body, sheet("*|*::selection", ns))); - // no default .foo::selection, default *|*.foo::selection - EXPECT_TRUE(test(body, sheet("*|*.foo::selection", ns))); - EXPECT_TRUE(test(none, sheet("|*::selection", ns))); // empty|*::selection - EXPECT_TRUE(test(bar, sheet("bar|*::selection", ns))); // bar|*::selection + // no default ::highlight(x), default *|*::highlight(x) + EXPECT_FALSE(run(body, "*|*::highlight(x)", ns)); + // no default .foo::highlight(x), default *|*.foo::highlight(x) + EXPECT_TRUE(run(body, "*|*.foo::highlight(x)", ns)); + EXPECT_TRUE(run(none, "|*::highlight(x)", ns)); // empty|*::highlight(x) + EXPECT_TRUE(run(bar, "bar|*::highlight(x)", ns)); // bar|*::highlight(x) } }
diff --git a/third_party/blink/renderer/core/css/media_query_set_test.cc b/third_party/blink/renderer/core/css/media_query_set_test.cc index 31903eb..ef246b2 100644 --- a/third_party/blink/renderer/core/css/media_query_set_test.cc +++ b/third_party/blink/renderer/core/css/media_query_set_test.cc
@@ -185,7 +185,7 @@ {"only and", "not all"}, {"only only", "not all"}, {"only or", "not all"}, - {"not (orientation)", "not all"}, + {"not (orientation)", nullptr}, {"only (orientation)", "not all"}, {"(max-width: 800px()), (max-width: 800px)", "not all, (max-width: 800px)"}, @@ -231,8 +231,11 @@ for (const MediaQuerySetTestCase& test : test_cases) { SCOPED_TRACE(String(test.input)); + // This test was originally written for mediaqueries-3, and does not + // differentiate between real parse errors ("not all") and queries which + // have parts which match the <general-enclosed> production. TestMediaQuery(test.input, test.output, - *MediaQuerySet::Create(test.input, nullptr)); + *MediaQuerySet::Create(test.input, nullptr), "not all"); } } @@ -390,6 +393,7 @@ ScopedMediaQueryNavigationControlsForTest navigation_controls_flag(false); ScopedCSSFoldablesForTest foldables_flag(false); ScopedDevicePostureForTest device_posture_flag(false); + ScopedCSSMediaQueries4ForTest media_queries_4_flag(false); // The first string represents the input string, the second string represents // the output string.
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc b/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc index 9c8fc0969..a3890fd1 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc
@@ -484,7 +484,7 @@ auto* parsed = DynamicTo<StyleRuleImport>(ParseRule(*document, rule)); ASSERT_TRUE(parsed); EXPECT_FALSE(parsed->IsLayered()); - EXPECT_EQ("not all", parsed->MediaQueries()->MediaText()); + EXPECT_TRUE(parsed->MediaQueries()->HasUnknown()); } { @@ -492,7 +492,7 @@ auto* parsed = DynamicTo<StyleRuleImport>(ParseRule(*document, rule)); ASSERT_TRUE(parsed); EXPECT_FALSE(parsed->IsLayered()); - EXPECT_EQ("not all", parsed->MediaQueries()->MediaText()); + EXPECT_TRUE(parsed->MediaQueries()->HasUnknown()); } { @@ -500,7 +500,7 @@ auto* parsed = DynamicTo<StyleRuleImport>(ParseRule(*document, rule)); ASSERT_TRUE(parsed); EXPECT_FALSE(parsed->IsLayered()); - EXPECT_EQ("not all", parsed->MediaQueries()->MediaText()); + EXPECT_TRUE(parsed->MediaQueries()->HasUnknown()); } } @@ -529,7 +529,7 @@ ASSERT_TRUE(parsed->IsLayered()); ASSERT_EQ(1u, parsed->GetLayerName().size()); EXPECT_EQ(g_empty_atom, parsed->GetLayerName()[0]); - EXPECT_EQ("not all", parsed->MediaQueries()->MediaText()); + EXPECT_TRUE(parsed->MediaQueries()->HasUnknown()); } {
diff --git a/third_party/blink/renderer/core/css/parser/media_condition_test.cc b/third_party/blink/renderer/core/css/parser/media_condition_test.cc index 144c003f..9224b3d 100644 --- a/third_party/blink/renderer/core/css/parser/media_condition_test.cc +++ b/third_party/blink/renderer/core/css/parser/media_condition_test.cc
@@ -26,12 +26,12 @@ {"screen and (color)", "not all"}, {"all and (min-width:500px)", "not all"}, {"(min-width:500px)", "(min-width: 500px)"}, - {"(min-width: -100px)", "not all"}, + {"(min-width : -100px)", "(min-width : -100px)"}, // <general-enclosed> {"(min-width: 100px) and print", "not all"}, {"(min-width: 100px) and (max-width: 900px)", nullptr}, {"(min-width: [100px) and (max-width: 900px)", "not all"}, {"not (min-width: 900px)", "not (min-width: 900px)"}, - {"not (blabla)", "not all"}, + {"not ( blabla)", "not ( blabla)"}, // <general-enclosed> {"", ""}, {" ", ""}, {",(min-width: 500px)", "not all"},
diff --git a/third_party/blink/renderer/core/css/resolver/cascade_map.h b/third_party/blink/renderer/core/css/resolver/cascade_map.h index 104e6dc..962fee4 100644 --- a/third_party/blink/renderer/core/css/resolver/cascade_map.h +++ b/third_party/blink/renderer/core/css/resolver/cascade_map.h
@@ -36,6 +36,16 @@ CascadePriority* Find(const CSSPropertyName&); const CascadePriority* Find(const CSSPropertyName&) const; const CascadePriority* Find(const CSSPropertyName&, CascadeOrigin) const; + CascadePriority* FindKnownToExist(const CSSPropertyID id) { + DCHECK(native_properties_.Bits().Has(id)); + return &native_properties_.Buffer()[static_cast<size_t>(id)].Top( + backing_vector_); + } + const CascadePriority* FindKnownToExist(const CSSPropertyID id) const { + DCHECK(native_properties_.Bits().Has(id)); + return &native_properties_.Buffer()[static_cast<size_t>(id)].Top( + backing_vector_); + } // Similar to Find(name, origin), but returns the CascadePriority from cascade // layers below the given priority. const CascadePriority* FindRevertLayer(const CSSPropertyName&,
diff --git a/third_party/blink/renderer/core/css/resolver/element_style_resources.cc b/third_party/blink/renderer/core/css/resolver/element_style_resources.cc index 25f9a70..41e9777 100644 --- a/third_party/blink/renderer/core/css/resolver/element_style_resources.cc +++ b/third_party/blink/renderer/core/css/resolver/element_style_resources.cc
@@ -61,6 +61,12 @@ namespace { +bool IsUsingContainerRelativeUnits(const CSSValue& value) { + const auto* image_generator_value = DynamicTo<CSSImageGeneratorValue>(value); + return image_generator_value && + image_generator_value->IsUsingContainerRelativeUnits(); +} + class StyleImageLoader { STACK_ALLOCATED(); @@ -94,14 +100,18 @@ CSSValue& value, FetchParameters::ImageRequestBehavior image_request_behavior, CrossOriginAttributeValue cross_origin) { + const ContainerSizes& container_sizes = + IsUsingContainerRelativeUnits(value) ? pre_cached_container_sizes_.Get() + : ContainerSizes(); + if (auto* image_value = DynamicTo<CSSImageValue>(value)) { return image_value->CacheImage(document_, image_request_behavior, cross_origin); } if (auto* paint_value = DynamicTo<CSSPaintValue>(value)) { - auto* image = MakeGarbageCollected<StyleGeneratedImage>( - *paint_value, pre_cached_container_sizes_.Get()); + auto* image = MakeGarbageCollected<StyleGeneratedImage>(*paint_value, + container_sizes); style_.AddPaintImage(image); return image; } @@ -115,8 +125,8 @@ if (auto* image_gradient_value = DynamicTo<cssvalue::CSSGradientValue>(value)) { - return MakeGarbageCollected<StyleGeneratedImage>( - *image_gradient_value, pre_cached_container_sizes_.Get()); + return MakeGarbageCollected<StyleGeneratedImage>(*image_gradient_value, + container_sizes); } if (auto* image_set_value = DynamicTo<CSSImageSetValue>(value)) { @@ -149,15 +159,10 @@ const PreCachedContainerSizes::ContainerSizes& PreCachedContainerSizes::Get() const { + DCHECK(RuntimeEnabledFeatures::CSSContainerRelativeUnitsEnabled()); if (!cache_) { - // Finding container sizes eagerly means traversing the entire - // ancestor chain (in the worse case). Avoid if CSSContainerRelativeUnits - // is not enabled. - // - // TODO(crbug.com/1324901): Avoid based on units within CSSValue instead. - if (RuntimeEnabledFeatures::CSSContainerRelativeUnitsEnabled() && - conversion_data_) { - cache_ = conversion_data_->GetContainerSizes().PreCachedCopy(); + if (conversion_data_) { + cache_ = conversion_data_->PreCachedContainerSizesCopy(); } else { cache_ = ContainerSizes(); } @@ -207,8 +212,12 @@ // Gradient functions are never pending (but don't cache StyleImages). if (auto* gradient_value = DynamicTo<cssvalue::CSSGradientValue>(value)) { - return MakeGarbageCollected<StyleGeneratedImage>( - *gradient_value, pre_cached_container_sizes_.Get()); + using ContainerSizes = CSSToLengthConversionData::ContainerSizes; + const ContainerSizes& container_sizes = + IsUsingContainerRelativeUnits(value) ? pre_cached_container_sizes_.Get() + : ContainerSizes(); + return MakeGarbageCollected<StyleGeneratedImage>(*gradient_value, + container_sizes); } if (auto* img_set_value = DynamicTo<CSSImageSetValue>(value))
diff --git a/third_party/blink/renderer/core/css/resolver/match_result.h b/third_party/blink/renderer/core/css/resolver/match_result.h index 9752af7..ceb36730 100644 --- a/third_party/blink/renderer/core/css/resolver/match_result.h +++ b/third_party/blink/renderer/core/css/resolver/match_result.h
@@ -169,12 +169,6 @@ bool ConditionallyAffectsAnimations() const { return conditionally_affects_animations_; } - void SetMatchesNonUniversalHighlights() { - matches_non_universal_highlights_ = true; - } - bool MatchesNonUniversalHighlights() const { - return matches_non_universal_highlights_; - } const MatchedPropertiesVector& GetMatchedProperties() const { return matched_properties_; @@ -197,7 +191,6 @@ bool depends_on_viewport_container_queries_{false}; bool depends_on_rem_container_queries_{false}; bool conditionally_affects_animations_{false}; - bool matches_non_universal_highlights_{false}; CascadeOrigin current_origin_{CascadeOrigin::kUserAgent}; uint16_t current_tree_order_{0}; };
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.cc b/third_party/blink/renderer/core/css/resolver/style_cascade.cc index a72af66..3c3ad01 100644 --- a/third_party/blink/renderer/core/css/resolver/style_cascade.cc +++ b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
@@ -207,8 +207,6 @@ // high-priority properties. LookupAndApply(GetCSSPropertyMathDepth(), resolver); - ApplyWebkitBorderImage(resolver); - // -webkit-mask-image needs to be applied before -webkit-mask-composite, // otherwise -webkit-mask-composite has no effect. LookupAndApply(GetCSSPropertyWebkitMaskImage(), resolver); @@ -219,6 +217,8 @@ ApplyHighPriority(resolver); + ApplyWideOverlapping(resolver); + ApplyMatchResult(resolver); ApplyInterpolations(resolver); @@ -423,61 +423,105 @@ state_.SetConversionZoom(state_.Style()->EffectiveZoom()); } -void StyleCascade::ApplyWebkitBorderImage(CascadeResolver& resolver) { - const CascadePriority* priority = - map_.Find(CSSPropertyName(CSSPropertyID::kWebkitBorderImage)); - if (!priority) - return; +void StyleCascade::ApplyWideOverlapping(CascadeResolver& resolver) { + // Overlapping properties are handled as follows: + // + // 1. Apply the "wide" longhand which represents the entire computed value + // first. This is not always the non-legacy property, + // e.g.-webkit-border-image is one such longhand. + // 2. For the other overlapping longhands (each of which represent a *part* + // of that computed value), *skip* applying that longhand if the wide + // longhand has a higher priority. + // + // This allows us to always apply the "wide" longhand in a fixed order versus + // the other overlapping longhands, but still produce the same result as if + // everything was applied in the order the properties were specified. - // -webkit-border-image is a surrogate for the border-image (shorthand). - // By applying -webkit-border-image first, we avoid having to "partially" - // apply -webkit-border-image depending on the border-image-* longhands that - // have already been applied. - // See also crbug.com/1056600 - LookupAndApply(GetCSSPropertyWebkitBorderImage(), resolver); - - const auto& shorthand = borderImageShorthand(); - const CSSProperty** longhands = shorthand.properties(); - for (unsigned i = 0; i < shorthand.length(); ++i) { - const CSSProperty& longhand = *longhands[i]; - if (CascadePriority* p = map_.Find(longhand.GetCSSPropertyName())) { - // If -webkit-border-image has higher priority than a border-image - // longhand, we skip applying that longhand. - if (*p < *priority) + // Skip `property` if its priority is lower than the incoming priority. + // Skipping basically means pretending it's already applied by setting the + // generation. + auto maybe_skip = [this, &resolver](const CSSProperty& property, + CascadePriority priority) { + if (CascadePriority* p = map_.Find(property.GetCSSPropertyName())) { + if (*p < priority) *p = CascadePriority(*p, resolver.generation_); } + }; + + if (const CascadePriority* priority = + map_.Find(CSSPropertyName(CSSPropertyID::kWebkitBorderImage))) { + LookupAndApply(GetCSSPropertyWebkitBorderImage(), resolver); + + const auto& shorthand = borderImageShorthand(); + const CSSProperty** longhands = shorthand.properties(); + for (unsigned i = 0; i < shorthand.length(); ++i) { + maybe_skip(*longhands[i], *priority); + } + } + + if (const CascadePriority* priority = + map_.Find(CSSPropertyName(CSSPropertyID::kPerspectiveOrigin))) { + LookupAndApply(GetCSSPropertyPerspectiveOrigin(), resolver); + maybe_skip(GetCSSPropertyWebkitPerspectiveOriginX(), *priority); + maybe_skip(GetCSSPropertyWebkitPerspectiveOriginY(), *priority); + } + + if (const CascadePriority* priority = + map_.Find(CSSPropertyName(CSSPropertyID::kTransformOrigin))) { + LookupAndApply(GetCSSPropertyTransformOrigin(), resolver); + maybe_skip(GetCSSPropertyWebkitTransformOriginX(), *priority); + maybe_skip(GetCSSPropertyWebkitTransformOriginY(), *priority); + maybe_skip(GetCSSPropertyWebkitTransformOriginZ(), *priority); } } +// Go through all properties that were found during the analyze phase +// (e.g. in AnalyzeMatchResult()) and actually apply them. We need to do this +// in a second phase so that we know which ones actually won the cascade +// before we start applying, as some properties can affect others. +// +// TODO(sesse): See if we can make this more efficient by iterating +// directly over the BackingVector instead. In particular, that would +// remove the Find() calls into map_. void StyleCascade::ApplyMatchResult(CascadeResolver& resolver) { - int index = 0; - for (const MatchedProperties& properties : - match_result_.GetMatchedProperties()) { - ExpandCascade( - properties, GetDocument(), resolver.filter_, index++, - [this, &resolver](CascadePriority cascade_priority, - const CSSProperty& css_property, - const CSSValue& css_value, uint16_t tree_order) { - auto priority = - CascadePriority(cascade_priority, resolver.generation_); - const CSSProperty& property = ResolveSurrogate(css_property); - CascadePriority* p = map_.Find(property.GetCSSPropertyName()); - if (!p || *p >= priority) - return; - *p = priority; - CascadeOrigin origin = priority.GetOrigin(); - const CSSValue* value = - Resolve(property, css_value, priority, origin, resolver); - // TODO(futhark): Use a user scope TreeScope to support tree-scoped - // names for animations in user stylesheets. - const TreeScope* tree_scope = nullptr; - if (origin == CascadeOrigin::kAuthor) - tree_scope = &match_result_.ScopeFromTreeOrder(tree_order); - else if (origin == CascadeOrigin::kAuthorPresentationalHint) - tree_scope = &GetDocument(); - StyleBuilder::ApplyProperty(property, state_, - ScopedCSSValue(*value, tree_scope)); - }); + // We only need to apply the resolver part of the filter here; + // the rest have been applied in the previous pass. + CascadeFilter filter = resolver.filter_; + for (CSSPropertyID id : map_.NativeBitset()) { + CascadePriority* p = map_.FindKnownToExist(id); + const CascadePriority priority = *p; + if (priority.GetGeneration() >= resolver.generation_) { + // Already applied this generation. + // Also checked in LookupAndApplyDeclaration, + // but done here to get a fast exit. + continue; + } + if (IsInterpolation(priority)) { + continue; + } + + const CSSProperty& property = CSSProperty::Get(id); + if (filter.Rejects(property)) { + continue; + } + LookupAndApplyDeclaration(property, p, resolver); + } + + for (const auto& [name, priority_list] : map_.GetCustomMap()) { + CascadePriority* p = map_.Find(name); + CascadePriority priority = *p; + if (priority.GetGeneration() >= resolver.generation_) { + continue; + } + if (IsInterpolation(priority)) { + continue; + } + + CustomProperty property(name.ToAtomicString(), GetDocument()); + if (filter.Rejects(property)) { + continue; + } + LookupAndApplyDeclaration(property, p, resolver); } } @@ -567,13 +611,9 @@ CSSPropertyName name = property.GetCSSPropertyName(); DCHECK(!resolver.IsLocked(property)); - CascadePriority* p = map_.Find(name); - if (!p) + CascadePriority* priority = map_.Find(name); + if (!priority) return; - CascadePriority priority(*p, resolver.generation_); - if (*p >= priority) - return; - *p = priority; if (resolver.filter_.Rejects(property)) return; @@ -582,30 +622,35 @@ } void StyleCascade::LookupAndApplyValue(const CSSProperty& property, - CascadePriority priority, + CascadePriority* priority, CascadeResolver& resolver) { DCHECK(!property.IsSurrogate()); - if (priority.GetOrigin() < CascadeOrigin::kAnimation) + if (priority->GetOrigin() < CascadeOrigin::kAnimation) LookupAndApplyDeclaration(property, priority, resolver); - else if (priority.GetOrigin() >= CascadeOrigin::kAnimation) + else if (priority->GetOrigin() >= CascadeOrigin::kAnimation) LookupAndApplyInterpolation(property, priority, resolver); } void StyleCascade::LookupAndApplyDeclaration(const CSSProperty& property, - CascadePriority priority, + CascadePriority* priority, CascadeResolver& resolver) { + if (priority->GetGeneration() >= resolver.generation_) { + // Already applied this generation. + return; + } + *priority = CascadePriority(*priority, resolver.generation_); DCHECK(!property.IsSurrogate()); - DCHECK(priority.GetOrigin() < CascadeOrigin::kAnimation); - const CSSValue* value = ValueAt(match_result_, priority.GetPosition()); + DCHECK(priority->GetOrigin() < CascadeOrigin::kAnimation); + const CSSValue* value = ValueAt(match_result_, priority->GetPosition()); DCHECK(value); - CascadeOrigin origin = priority.GetOrigin(); - value = Resolve(property, *value, priority, origin, resolver); + CascadeOrigin origin = priority->GetOrigin(); + value = Resolve(property, *value, *priority, origin, resolver); DCHECK(!value->IsVariableReferenceValue()); DCHECK(!value->IsPendingSubstitutionValue()); const TreeScope* tree_scope{nullptr}; if (origin == CascadeOrigin::kAuthor) - tree_scope = &TreeScopeAt(match_result_, priority.GetPosition()); + tree_scope = &TreeScopeAt(match_result_, priority->GetPosition()); else if (origin == CascadeOrigin::kAuthorPresentationalHint) tree_scope = &GetDocument(); StyleBuilder::ApplyProperty(property, state_, @@ -613,8 +658,14 @@ } void StyleCascade::LookupAndApplyInterpolation(const CSSProperty& property, - CascadePriority priority, + CascadePriority* priority, CascadeResolver& resolver) { + if (priority->GetGeneration() >= resolver.generation_) { + // Already applied this generation. + return; + } + *priority = CascadePriority(*priority, resolver.generation_); + DCHECK(!property.IsSurrogate()); // Interpolations for -internal-visited properties are applied via the @@ -623,14 +674,14 @@ // TODO(crbug.com/1062217): Interpolate visited colors separately if (property.IsVisited()) return; - DCHECK(priority.GetOrigin() >= CascadeOrigin::kAnimation); - wtf_size_t index = DecodeInterpolationIndex(priority.GetPosition()); + DCHECK(priority->GetOrigin() >= CascadeOrigin::kAnimation); + wtf_size_t index = DecodeInterpolationIndex(priority->GetPosition()); DCHECK_LE(index, interpolations_.GetEntries().size()); const ActiveInterpolationsMap& map = *interpolations_.GetEntries()[index].map; - PropertyHandle handle = ToPropertyHandle(property, priority); + PropertyHandle handle = ToPropertyHandle(property, *priority); const auto& entry = map.find(handle); DCHECK_NE(entry, map.end()); - ApplyInterpolation(property, priority, *entry->value, resolver); + ApplyInterpolation(property, *priority, *entry->value, resolver); } bool StyleCascade::IsRootElement() const {
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.h b/third_party/blink/renderer/core/css/resolver/style_cascade.h index 2514f60..58c9853 100644 --- a/third_party/blink/renderer/core/css/resolver/style_cascade.h +++ b/third_party/blink/renderer/core/css/resolver/style_cascade.h
@@ -190,13 +190,22 @@ // we don't have an appearance. void ApplyAppearance(CascadeResolver&); - // Applies -webkit-border-image (if present), and skips any border-image - // longhands found with lower priority than -webkit-border-image. + // Some legacy properties are "overlapping", in that they share parts of + // a computed value with other properties. // - // The -webkit-border-image property is unique (in a bad way), since it's - // a surrogate of a shorthand. Therefore it needs special treatment to - // behave correctly. - void ApplyWebkitBorderImage(CascadeResolver&); + // * -webkit-border-image (longhand) overlaps with border-image (shorthand). + // * -webkit-perspective-origin-x/y overlaps with perspective-origin. + // * -webkit-transform-origin-x/y/z overlaps with transform-origin. + // + // This overlap breaks the general rule that properties can be applied in + // any order (they need to be applied in the order they are declared). + // + // This function applies the "widest" of those overlapping properties + // (that is, properties which represent an entire computed-value), + // and conditionally marks narrow ones with a lower priority as already done, + // so that later apply steps do not apply them (ie., effectively causes them + // to be skipped). + void ApplyWideOverlapping(CascadeResolver&); void ApplyMatchResult(CascadeResolver&); void ApplyInterpolations(CascadeResolver&); @@ -213,13 +222,13 @@ void LookupAndApply(const CSSPropertyName&, CascadeResolver&); void LookupAndApply(const CSSProperty&, CascadeResolver&); void LookupAndApplyValue(const CSSProperty&, - CascadePriority, + CascadePriority*, CascadeResolver&); void LookupAndApplyDeclaration(const CSSProperty&, - CascadePriority, + CascadePriority*, CascadeResolver&); void LookupAndApplyInterpolation(const CSSProperty&, - CascadePriority, + CascadePriority*, CascadeResolver&); // Whether or not we are calculating the style for the root element.
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc b/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc index 3a76484..f50a1f20 100644 --- a/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc +++ b/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
@@ -2816,6 +2816,110 @@ EXPECT_EQ("space", cascade.ComputedValue("border-image-repeat")); } +TEST_F(StyleCascadeTest, WebkitPerspectiveOriginCascadeOrder) { + TestCascade cascade(GetDocument()); + cascade.Add("-webkit-perspective-origin-x:10px"); + cascade.Add("-webkit-perspective-origin-y:20px"); + cascade.Add("perspective-origin:30px 40px"); + cascade.Apply(); + + EXPECT_EQ("30px 40px", cascade.ComputedValue("perspective-origin")); + + // The -webkit-perspective-origin-x/y properties are not "computable". + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-perspective-origin-x")); + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-perspective-origin-y")); +} + +TEST_F(StyleCascadeTest, WebkitPerspectiveOriginReverseCascadeOrder) { + TestCascade cascade(GetDocument()); + cascade.Add("perspective-origin:30px 40px"); + cascade.Add("-webkit-perspective-origin-x:10px"); + cascade.Add("-webkit-perspective-origin-y:20px"); + cascade.Apply(); + + EXPECT_EQ("10px 20px", cascade.ComputedValue("perspective-origin")); + + // The -webkit-perspective-origin-x/y properties are not "computable". + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-perspective-origin-x")); + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-perspective-origin-y")); +} + +TEST_F(StyleCascadeTest, WebkitPerspectiveOriginMixedCascadeOrder) { + TestCascade cascade(GetDocument()); + cascade.Add("-webkit-perspective-origin-x:10px"); + cascade.Add("perspective-origin:30px 40px"); + cascade.Add("-webkit-perspective-origin-y:20px"); + cascade.Apply(); + + EXPECT_EQ("30px 20px", cascade.ComputedValue("perspective-origin")); + + // The -webkit-perspective-origin-x/y properties are not "computable". + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-perspective-origin-x")); + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-perspective-origin-y")); +} + +TEST_F(StyleCascadeTest, WebkitPerspectiveOriginRevert) { + TestCascade cascade(GetDocument()); + cascade.Add("-webkit-perspective-origin-x:10px"); + cascade.Add("perspective-origin:30px 40px"); + cascade.Add("-webkit-perspective-origin-y:20px"); + cascade.Apply(); + + EXPECT_EQ("30px 20px", cascade.ComputedValue("perspective-origin")); + + // The -webkit-perspective-origin-x/y properties are not "computable". + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-perspective-origin-x")); + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-perspective-origin-y")); +} + +TEST_F(StyleCascadeTest, WebkitTransformOriginCascadeOrder) { + TestCascade cascade(GetDocument()); + cascade.Add("-webkit-transform-origin-x:10px"); + cascade.Add("-webkit-transform-origin-y:20px"); + cascade.Add("-webkit-transform-origin-z:30px"); + cascade.Add("transform-origin:40px 50px 60px"); + cascade.Apply(); + + EXPECT_EQ("40px 50px 60px", cascade.ComputedValue("transform-origin")); + + // The -webkit-transform-origin-x/y/z properties are not "computable". + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-transform-origin-x")); + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-transform-origin-y")); + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-transform-origin-z")); +} + +TEST_F(StyleCascadeTest, WebkitTransformOriginReverseCascadeOrder) { + TestCascade cascade(GetDocument()); + cascade.Add("transform-origin:40px 50px 60px"); + cascade.Add("-webkit-transform-origin-x:10px"); + cascade.Add("-webkit-transform-origin-y:20px"); + cascade.Add("-webkit-transform-origin-z:30px"); + cascade.Apply(); + + EXPECT_EQ("10px 20px 30px", cascade.ComputedValue("transform-origin")); + + // The -webkit-transform-origin-x/y/z properties are not "computable". + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-transform-origin-x")); + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-transform-origin-y")); + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-transform-origin-z")); +} + +TEST_F(StyleCascadeTest, WebkitTransformOriginMixedCascadeOrder) { + TestCascade cascade(GetDocument()); + cascade.Add("-webkit-transform-origin-x:10px"); + cascade.Add("transform-origin:40px 50px 60px"); + cascade.Add("-webkit-transform-origin-y:20px"); + cascade.Add("-webkit-transform-origin-z:30px"); + cascade.Apply(); + + EXPECT_EQ("40px 20px 30px", cascade.ComputedValue("transform-origin")); + + // The -webkit-transform-origin-x/y/z properties are not "computable". + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-transform-origin-x")); + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-transform-origin-y")); + EXPECT_EQ(nullptr, cascade.ComputedValue("-webkit-transform-origin-z")); +} + TEST_F(StyleCascadeTest, InitialDirection) { TestCascade cascade(GetDocument()); cascade.Add("margin-inline-start:10px");
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc index ff6d19014..d22bf76 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -30,7 +30,7 @@ #include "third_party/blink/renderer/core/css/resolver/style_resolver.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/animation/css/compositor_keyframe_value_factory.h" #include "third_party/blink/renderer/core/animation/css/css_animations.h" #include "third_party/blink/renderer/core/animation/document_animations.h" @@ -913,9 +913,6 @@ GetDocument().AddViewportUnitFlags(state.StyleRef().ViewportUnitFlags()); - if (state.Style()->HasContainerRelativeUnits()) - state.Style()->SetDependsOnContainerQueries(true); - if (state.Style()->HasRemUnits()) GetDocument().GetStyleEngine().SetUsesRemUnit(true); @@ -1217,40 +1214,6 @@ state.SetHadNoMatchedProperties(); return; } - - bool skip_apply_highlight = false; - - // Highlight pseudos inherit all properties from the corresponding highlight - // in the parent, but virtually all existing content uses universal rules - // like *::selection. To ensure copy-on-write inheritance still works, avoid - // reapplying styles if both parent and child only matched universal rules. - if (RuntimeEnabledFeatures::HighlightInheritanceEnabled() && - IsHighlightPseudoElement(style_request.pseudo_id)) { - // If the parent matched any non-universal highlight rules, then we need - // to apply, in case there are universal highlight rules. - bool parent_non_universal = - state.Style()->DidMatchNonUniversalHighlights(); - - // If we matched any non-universal highlight rules, then we need to apply - // and our children also need to apply (see above). - bool self_non_universal = - collector.MatchedResult().MatchesNonUniversalHighlights(); - - if (parent_non_universal || self_non_universal) { - // Set or reset the did-match-non-universal flag only if necessary. - state.Style()->SetDidMatchNonUniversalHighlights(self_non_universal); - } else if (element->parentNode() != - element->ContainingTreeScope().RootNode()) { - // The root node of the tree scope needs to apply, in case there are - // only universal highlight rules. - skip_apply_highlight = true; - } - } - - if (skip_apply_highlight) { - StyleAdjuster::AdjustComputedStyle(state, nullptr /* element */); - return; - } } // Preserve the text autosizing multiplier on style recalc. Autosizer will @@ -1555,7 +1518,7 @@ selector_filter_, match_result, state.Style(), EInsideLink::kNotInsideLink); collector.SetMode(SelectorChecker::kCollectingStyleRules); - CollectPseudoRulesForElement(*element, collector, kPseudoIdNone, + CollectPseudoRulesForElement(*element, collector, kPseudoIdNone, g_null_atom, rules_to_include); return collector.MatchedStyleRuleList(); } @@ -1587,6 +1550,7 @@ RuleIndexList* StyleResolver::PseudoCSSRulesForElement( Element* element, PseudoId pseudo_id, + const AtomicString& document_transition_tag, unsigned rules_to_include) { DCHECK(element); StyleResolverState state(GetDocument(), *element); @@ -1600,7 +1564,7 @@ // TODO(obrufau): support collecting rules for nested ::marker if (!element->IsPseudoElement()) { CollectPseudoRulesForElement(*element, collector, pseudo_id, - rules_to_include); + document_transition_tag, rules_to_include); } if (tracker_) @@ -1610,15 +1574,18 @@ RuleIndexList* StyleResolver::CssRulesForElement(Element* element, unsigned rules_to_include) { - return PseudoCSSRulesForElement(element, kPseudoIdNone, rules_to_include); + return PseudoCSSRulesForElement(element, kPseudoIdNone, g_null_atom, + rules_to_include); } void StyleResolver::CollectPseudoRulesForElement( const Element& element, ElementRuleCollector& collector, PseudoId pseudo_id, + const AtomicString& document_transition_tag, unsigned rules_to_include) { - collector.SetPseudoElementStyleRequest(StyleRequest(pseudo_id, nullptr)); + collector.SetPseudoElementStyleRequest( + StyleRequest(pseudo_id, nullptr, document_transition_tag)); if (rules_to_include & kUACSSRules) MatchUARules(element, collector); @@ -1834,8 +1801,20 @@ is_inherited_cache_hit = true; } if (!IsForcedColorsModeEnabled() || is_inherited_cache_hit) { + bool non_universal_highlights = + state.Style()->HasNonUniversalHighlightPseudoStyles(); + state.Style()->CopyNonInheritedFromCached( *cached_matched_properties->computed_style); + + // Restore the non-universal highlight pseudo flag that was set while + // collecting matching rules. These fields are in a raredata field group, + // so CopyNonInheritedFromCached will clobber them despite custom_copy. + // TODO(crbug.com/1024156): do this for CustomHighlightNames too, so we + // can remove the cache-busting for ::highlight() in IsStyleCacheable + state.Style()->SetHasNonUniversalHighlightPseudoStyles( + non_universal_highlights); + // If the child style is a cache hit, we'll never reach StyleBuilder:: // ApplyProperty, hence we'll never set the flag on the parent. if (state.Style()->HasExplicitInheritance())
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.h b/third_party/blink/renderer/core/css/resolver/style_resolver.h index 935407c..8994ffb 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver.h +++ b/third_party/blink/renderer/core/css/resolver/style_resolver.h
@@ -149,6 +149,7 @@ RuleIndexList* PseudoCSSRulesForElement( Element*, PseudoId, + const AtomicString& document_transition_tag, unsigned rules_to_include = kAllButEmptyCSSRules); StyleRuleList* StyleRulesForElement(Element*, unsigned rules_to_include); HeapHashMap<CSSPropertyName, Member<const CSSValue>> CascadedValuesForElement( @@ -233,6 +234,7 @@ void CollectPseudoRulesForElement(const Element&, ElementRuleCollector&, PseudoId, + const AtomicString& document_transition_tag, unsigned rules_to_include); void MatchRuleSet(ElementRuleCollector&, RuleSet*); void MatchUARules(const Element&, ElementRuleCollector&);
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc b/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc index fd093687..7f3fb8c0 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc
@@ -22,7 +22,7 @@ #include "third_party/blink/renderer/core/css/resolver/style_resolver_state.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/animation/css/css_animations.h" #include "third_party/blink/renderer/core/css/css_light_dark_value_pair.h" #include "third_party/blink/renderer/core/css/css_property_value_set.h"
diff --git a/third_party/blink/renderer/core/css/rule_set.cc b/third_party/blink/renderer/core/css/rule_set.cc index 2f8ce06..dce61afb 100644 --- a/third_party/blink/renderer/core/css/rule_set.cc +++ b/third_party/blink/renderer/core/css/rule_set.cc
@@ -148,13 +148,13 @@ } void RuleSet::AddToRuleSet(const AtomicString& key, - PendingRuleMap& map, + RuleMap& map, const RuleData* rule_data) { - Member<HeapLinkedStack<Member<const RuleData>>>& rules = + Member<HeapVector<Member<const RuleData>>>& rules = map.insert(key, nullptr).stored_value->value; if (!rules) - rules = MakeGarbageCollected<HeapLinkedStack<Member<const RuleData>>>(); - rules->Push(rule_data); + rules = MakeGarbageCollected<HeapVector<Member<const RuleData>>>(); + rules->push_back(rule_data); } static void ExtractSelectorValues(const CSSSelector* selector, @@ -288,17 +288,20 @@ // Prefer rule sets in order of most likely to apply infrequently. if (!id.IsEmpty()) { - AddToRuleSet(id, EnsurePendingRules()->id_rules, rule_data); + need_compaction_ = true; + AddToRuleSet(id, id_rules_, rule_data); return true; } if (!class_name.IsEmpty()) { - AddToRuleSet(class_name, EnsurePendingRules()->class_rules, rule_data); + need_compaction_ = true; + AddToRuleSet(class_name, class_rules_, rule_data); return true; } if (!attr_name.IsEmpty()) { - AddToRuleSet(attr_name, EnsurePendingRules()->attr_rules, rule_data); + need_compaction_ = true; + AddToRuleSet(attr_name, attr_rules_, rule_data); if (attr_name == html_names::kStyleAttr) { has_bucket_for_style_attr_ = true; } @@ -310,10 +313,10 @@ // and have a relation of ShadowPseudo between them. Therefore we should // never be a situation where ExtractSelectorValues finds id and // className in addition to custom pseudo. + need_compaction_ = true; DCHECK(id.IsEmpty()); DCHECK(class_name.IsEmpty()); - AddToRuleSet(custom_pseudo_element_name, - EnsurePendingRules()->ua_shadow_pseudo_element_rules, + AddToRuleSet(custom_pseudo_element_name, ua_shadow_pseudo_element_rules_, rule_data); return true; } @@ -348,6 +351,7 @@ case CSSSelector::kPseudoPlaceholder: case CSSSelector::kPseudoFileSelectorButton: if (it->FollowsPart()) { + need_compaction_ = true; part_pseudo_rules_.push_back(rule_data); } else if (it->FollowsSlotted()) { slotted_pseudo_element_rules_.push_back(rule_data); @@ -355,8 +359,8 @@ const auto& name = pseudo_type == CSSSelector::kPseudoFileSelectorButton ? shadow_element_names::kPseudoFileUploadButton : shadow_element_names::kPseudoInputPlaceholder; - AddToRuleSet(name, EnsurePendingRules()->ua_shadow_pseudo_element_rules, - rule_data); + need_compaction_ = true; + AddToRuleSet(name, ua_shadow_pseudo_element_rules_, rule_data); } return true; case CSSSelector::kPseudoHost: @@ -371,7 +375,8 @@ } if (!tag_name.IsEmpty()) { - AddToRuleSet(tag_name, EnsurePendingRules()->tag_rules, rule_data); + need_compaction_ = true; + AddToRuleSet(tag_name, tag_rules_, rule_data); return true; } @@ -437,38 +442,37 @@ } void RuleSet::AddPageRule(StyleRulePage* rule) { - EnsurePendingRules(); // So that page_rules_.ShrinkToFit() gets called. + need_compaction_ = true; page_rules_.push_back(rule); } void RuleSet::AddFontFaceRule(StyleRuleFontFace* rule) { - EnsurePendingRules(); // So that font_face_rules_.ShrinkToFit() gets called. + need_compaction_ = true; font_face_rules_.push_back(rule); } void RuleSet::AddKeyframesRule(StyleRuleKeyframes* rule) { - EnsurePendingRules(); // So that keyframes_rules_.ShrinkToFit() gets called. + need_compaction_ = true; keyframes_rules_.push_back(rule); } void RuleSet::AddPropertyRule(StyleRuleProperty* rule) { - EnsurePendingRules(); // So that property_rules_.ShrinkToFit() gets called. + need_compaction_ = true; property_rules_.push_back(rule); } void RuleSet::AddCounterStyleRule(StyleRuleCounterStyle* rule) { - EnsurePendingRules(); // So that counter_style_rules_.ShrinkToFit() gets - // called. + need_compaction_ = true; counter_style_rules_.push_back(rule); } void RuleSet::AddFontPaletteValuesRule(StyleRuleFontPaletteValues* rule) { - EnsurePendingRules(); + need_compaction_ = true; font_palette_values_rules_.push_back(rule); } void RuleSet::AddScrollTimelineRule(StyleRuleScrollTimeline* rule) { - EnsurePendingRules(); // So that property_rules_.ShrinkToFit() gets called. + need_compaction_ = true; scroll_timeline_rules_.push_back(rule); } @@ -618,28 +622,9 @@ return cascade_layer->GetOrAddSubLayer(name); } -void RuleSet::CompactPendingRules(PendingRuleMap& pending_map, - CompactRuleMap& compact_map) { - for (auto& item : pending_map) { - HeapLinkedStack<Member<const RuleData>>* pending_rules = - item.value.Release(); - Member<HeapVector<Member<const RuleData>>>& rules = - compact_map.insert(item.key, nullptr).stored_value->value; - if (!rules) { - rules = MakeGarbageCollected<HeapVector<Member<const RuleData>>>(); - rules->ReserveInitialCapacity(pending_rules->size()); - } else { - rules->ReserveCapacity(pending_rules->size()); - } - // Since pending_rules is a stack, we need to insert in the reversed - // ordering so that the resulting vector is sorted by rule position - wtf_size_t num_pending_rules = pending_rules->size(); - rules->Grow(rules->size() + num_pending_rules); - for (auto iter = rules->rbegin(); !pending_rules->IsEmpty(); ++iter) { - DCHECK(iter != rules->rend()); - *iter = pending_rules->Peek(); - pending_rules->Pop(); - } +void RuleSet::CompactRuleMap(RuleMap& map) { + for (auto& [key, value] : map) { + value->ShrinkToFit(); } } @@ -665,7 +650,6 @@ const HeapVector<Member<const RuleData>>* list, const AtomicString& key, const AtomicString& value) const { - DCHECK(!pending_rules_); DCHECK_EQ(attr_rules_.find(key)->value, list); if (list->size() < GetMinimumRulesetSizeForSubstringMatcher()) { // Too small to build up a tree, so always check. @@ -688,7 +672,7 @@ } void RuleSet::CreateSubstringMatchers( - CompactRuleMap& attr_map, + RuleMap& attr_map, RuleSet::SubstringMatcherMap& substring_matcher_map) { for (const auto& [/*AtomicString*/ attr, /*Member<RuleSet>*/ ruleset] : attr_map) { @@ -744,15 +728,13 @@ } void RuleSet::CompactRules() { - DCHECK(pending_rules_); - PendingRuleMaps* pending_rules = pending_rules_.Release(); - CompactPendingRules(pending_rules->id_rules, id_rules_); - CompactPendingRules(pending_rules->class_rules, class_rules_); - CompactPendingRules(pending_rules->attr_rules, attr_rules_); + DCHECK(need_compaction_); + CompactRuleMap(id_rules_); + CompactRuleMap(class_rules_); + CompactRuleMap(attr_rules_); CreateSubstringMatchers(attr_rules_, attr_substring_matchers_); - CompactPendingRules(pending_rules->tag_rules, tag_rules_); - CompactPendingRules(pending_rules->ua_shadow_pseudo_element_rules, - ua_shadow_pseudo_element_rules_); + CompactRuleMap(tag_rules_); + CompactRuleMap(ua_shadow_pseudo_element_rules_); link_pseudo_class_rules_.ShrinkToFit(); cue_pseudo_rules_.ShrinkToFit(); focus_pseudo_class_rules_.ShrinkToFit(); @@ -776,6 +758,7 @@ #if EXPENSIVE_DCHECKS_ARE_ON() AssertRuleListsSorted(); #endif + need_compaction_ = false; } #if EXPENSIVE_DCHECKS_ARE_ON() @@ -885,14 +868,6 @@ visitor->Trace(style_scope_); } -void RuleSet::PendingRuleMaps::Trace(Visitor* visitor) const { - visitor->Trace(id_rules); - visitor->Trace(class_rules); - visitor->Trace(attr_rules); - visitor->Trace(tag_rules); - visitor->Trace(ua_shadow_pseudo_element_rules); -} - void RuleSet::LayerInterval::Trace(Visitor* visitor) const { visitor->Trace(layer); } @@ -921,7 +896,6 @@ visitor->Trace(property_rules_); visitor->Trace(counter_style_rules_); visitor->Trace(scroll_timeline_rules_); - visitor->Trace(pending_rules_); visitor->Trace(implicit_outer_layer_); visitor->Trace(layer_intervals_); #ifndef NDEBUG
diff --git a/third_party/blink/renderer/core/css/rule_set.h b/third_party/blink/renderer/core/css/rule_set.h index 05b5e501..c4103d6c 100644 --- a/third_party/blink/renderer/core/css/rule_set.h +++ b/third_party/blink/renderer/core/css/rule_set.h
@@ -244,20 +244,17 @@ const HeapVector<Member<const RuleData>>* IdRules( const AtomicString& key) const { - DCHECK(!pending_rules_); auto it = id_rules_.find(key); return it != id_rules_.end() ? it->value : nullptr; } const HeapVector<Member<const RuleData>>* ClassRules( const AtomicString& key) const { - DCHECK(!pending_rules_); auto it = class_rules_.find(key); return it != class_rules_.end() ? it->value : nullptr; } bool HasAnyAttrRules() const { return !attr_rules_.IsEmpty(); } const HeapVector<Member<const RuleData>>* AttrRules( const AtomicString& key) const { - DCHECK(!pending_rules_); auto it = attr_rules_.find(key); return it != attr_rules_.end() ? it->value : nullptr; } @@ -266,61 +263,48 @@ const AtomicString& value) const; const HeapVector<Member<const RuleData>>* TagRules( const AtomicString& key) const { - DCHECK(!pending_rules_); auto it = tag_rules_.find(key); return it != tag_rules_.end() ? it->value : nullptr; } const HeapVector<Member<const RuleData>>* UAShadowPseudoElementRules( const AtomicString& key) const { - DCHECK(!pending_rules_); auto it = ua_shadow_pseudo_element_rules_.find(key); return it != ua_shadow_pseudo_element_rules_.end() ? it->value : nullptr; } const HeapVector<Member<const RuleData>>* LinkPseudoClassRules() const { - DCHECK(!pending_rules_); return &link_pseudo_class_rules_; } const HeapVector<Member<const RuleData>>* CuePseudoRules() const { - DCHECK(!pending_rules_); return &cue_pseudo_rules_; } const HeapVector<Member<const RuleData>>* FocusPseudoClassRules() const { - DCHECK(!pending_rules_); return &focus_pseudo_class_rules_; } const HeapVector<Member<const RuleData>>* FocusVisiblePseudoClassRules() const { - DCHECK(!pending_rules_); return &focus_visible_pseudo_class_rules_; } const HeapVector<Member<const RuleData>>* SpatialNavigationInterestPseudoClassRules() const { - DCHECK(!pending_rules_); return &spatial_navigation_interest_class_rules_; } const HeapVector<Member<const RuleData>>* UniversalRules() const { - DCHECK(!pending_rules_); return &universal_rules_; } const HeapVector<Member<const RuleData>>* ShadowHostRules() const { - DCHECK(!pending_rules_); return &shadow_host_rules_; } const HeapVector<Member<const RuleData>>* PartPseudoRules() const { - DCHECK(!pending_rules_); return &part_pseudo_rules_; } const HeapVector<Member<const RuleData>>* VisitedDependentRules() const { - DCHECK(!pending_rules_); return &visited_dependent_rules_; } const HeapVector<Member<const RuleData>>* SelectorFragmentAnchorRules() const { - DCHECK(!pending_rules_); return &selector_fragment_anchor_rules_; } const HeapVector<Member<StyleRulePage>>& PageRules() const { - DCHECK(!pending_rules_); return page_rules_; } const HeapVector<Member<StyleRuleFontFace>>& FontFaceRules() const { @@ -344,7 +328,6 @@ return scroll_timeline_rules_; } const HeapVector<Member<const RuleData>>* SlottedPseudoElementRules() const { - DCHECK(!pending_rules_); return &slotted_pseudo_element_rules_; } @@ -357,9 +340,8 @@ unsigned RuleCount() const { return rule_count_; } void CompactRulesIfNeeded() { - if (!pending_rules_) - return; - CompactRules(); + if (need_compaction_) + CompactRules(); } bool HasSlottedRules() const { @@ -403,15 +385,12 @@ FRIEND_TEST_ALL_PREFIXES(RuleSetTest, RuleCountNotIncreasedByInvalidRuleData); friend class RuleSetCascadeLayerTest; - using PendingRuleMap = - HeapHashMap<AtomicString, - Member<HeapLinkedStack<Member<const RuleData>>>>; - using CompactRuleMap = + using RuleMap = HeapHashMap<AtomicString, Member<HeapVector<Member<const RuleData>>>>; using SubstringMatcherMap = HashMap<AtomicString, std::unique_ptr<base::SubstringSetMatcher>>; - void AddToRuleSet(const AtomicString& key, PendingRuleMap&, const RuleData*); + void AddToRuleSet(const AtomicString& key, RuleMap&, const RuleData*); void AddPageRule(StyleRulePage*); void AddViewportRule(StyleRuleViewport*); void AddFontFaceRule(StyleRuleFontFace*); @@ -440,30 +419,11 @@ void SortKeyframesRulesIfNeeded(); void CompactRules(); - static void CompactPendingRules(PendingRuleMap&, CompactRuleMap&); + static void CompactRuleMap(RuleMap&); static void CreateSubstringMatchers( - CompactRuleMap& attr_map, + RuleMap& attr_map, SubstringMatcherMap& substring_matcher_map); - class PendingRuleMaps : public GarbageCollected<PendingRuleMaps> { - public: - PendingRuleMaps() = default; - - PendingRuleMap id_rules; - PendingRuleMap class_rules; - PendingRuleMap attr_rules; - PendingRuleMap tag_rules; - PendingRuleMap ua_shadow_pseudo_element_rules; - - void Trace(Visitor*) const; - }; - - PendingRuleMaps* EnsurePendingRules() { - if (!pending_rules_) - pending_rules_ = MakeGarbageCollected<PendingRuleMaps>(); - return pending_rules_.Get(); - } - #if DCHECK_IS_ON() void AssertRuleListsSorted() const; #endif @@ -481,9 +441,9 @@ // May return nullptr for the implicit outer layer. const CascadeLayer* GetLayerForTest(const RuleData&) const; - CompactRuleMap id_rules_; - CompactRuleMap class_rules_; - CompactRuleMap attr_rules_; + RuleMap id_rules_; + RuleMap class_rules_; + RuleMap attr_rules_; // A structure for quickly rejecting an entire attribute rule set // (from attr_rules_). If we have many rules in the same bucket, // we build up a case-insensitive substring-matching structure of all @@ -506,8 +466,8 @@ // doing a simple match.) Check GetMinimumRulesetSizeForSubstringMatcher() // before looking up for a cheaper test. SubstringMatcherMap attr_substring_matchers_; - CompactRuleMap tag_rules_; - CompactRuleMap ua_shadow_pseudo_element_rules_; + RuleMap tag_rules_; + RuleMap ua_shadow_pseudo_element_rules_; HeapVector<Member<const RuleData>> link_pseudo_class_rules_; HeapVector<Member<const RuleData>> cue_pseudo_rules_; HeapVector<Member<const RuleData>> focus_pseudo_class_rules_; @@ -536,7 +496,7 @@ bool has_bucket_for_style_attr_ = false; unsigned rule_count_ = 0; - Member<PendingRuleMaps> pending_rules_; + bool need_compaction_ = false; // nullptr if the stylesheet doesn't explicitly declare any layer. Member<CascadeLayer> implicit_outer_layer_;
diff --git a/third_party/blink/renderer/core/css/selector_checker.cc b/third_party/blink/renderer/core/css/selector_checker.cc index c87996ad..d3fa97b 100644 --- a/third_party/blink/renderer/core/css/selector_checker.cc +++ b/third_party/blink/renderer/core/css/selector_checker.cc
@@ -351,14 +351,6 @@ result.has_argument_leftmost_compound_matches->push_back(context.element); [[fallthrough]]; case CSSSelector::kChild: { - if (next_context.selector->GetPseudoType() == CSSSelector::kPseudoScope) { - if (next_context.selector->IsLastInTagHistory()) { - if (context.element->parentNode() == context.scope && - context.scope->IsDocumentFragment()) - return kSelectorMatches; - } - } - next_context.element = ParentElement(next_context); if (!next_context.element) return kSelectorFailsCompletely; @@ -1709,11 +1701,9 @@ } if (!context.scope) return false; - if (context.scope == &element.GetDocument()) - return element == element.GetDocument().documentElement(); - if (auto* shadow_root = DynamicTo<ShadowRoot>(context.scope)) - return element == shadow_root->host(); - return context.scope == &element; + if (context.scope->IsElementNode()) + return context.scope == &element; + return element == element.GetDocument().documentElement(); } bool SelectorChecker::CheckScrollbarPseudoClass(
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc b/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc index b5320121..cbe9d46 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc
@@ -4,7 +4,7 @@ #include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/display_lock/display_lock_context.h" #include "third_party/blink/renderer/core/display_lock/display_lock_document_state.h" #include "third_party/blink/renderer/core/dom/element.h"
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 c7382d5..51385dd 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
@@ -83,11 +83,6 @@ int bottom_offset = reference_bounding_rect.bottom() - target_rect.bottom(); int left_offset = target_rect.x() - reference_bounding_rect.x(); - DCHECK_GE(top_offset, 0); - DCHECK_GE(right_offset, 0); - DCHECK_GE(bottom_offset, 0); - DCHECK_GE(left_offset, 0); - return String::Format("inset(%dpx %dpx %dpx %dpx)", top_offset, right_offset, bottom_offset, left_offset); } @@ -103,6 +98,10 @@ child_box->MapToVisualRectInAncestorSpace(box, overflow_rect); result.Unite(overflow_rect); } + // Clip self painting descendant overflow by the clipping rect, then add in + // the visual overflow from the own painting layer. + // TODO(vmpstr): After these steps, we should also clip by the clip-path. + result.Intersect(box->OverflowClipRect(PhysicalOffset())); result.Unite(box->PhysicalVisualOverflowRectIncludingFilters()); return result; }
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_test.cc b/third_party/blink/renderer/core/document_transition/document_transition_test.cc index be67a481..948ee3bd 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_test.cc +++ b/third_party/blink/renderer/core/document_transition/document_transition_test.cc
@@ -26,7 +26,9 @@ #include "third_party/blink/renderer/core/dom/pseudo_element.h" #include "third_party/blink/renderer/core/frame/frame_test_helpers.h" #include "third_party/blink/renderer/core/html/html_element.h" +#include "third_party/blink/renderer/core/inspector/inspector_style_resolver.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" +#include "third_party/blink/renderer/core/style/computed_style_constants.h" #include "third_party/blink/renderer/core/testing/mock_function_scope.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" @@ -799,4 +801,123 @@ UpdateAllLifecyclePhasesAndFinishDirectives(); } + +TEST_P(DocumentTransitionTest, InspectorStyleResolver) { + SetHtmlInnerHTML(R"HTML( + <style> + ::page-transition { + background-color: red; + } + ::page-transition-container(foo) { + background-color: blue; + } + ::page-transition-image-wrapper(foo) { + background-color: lightblue; + } + ::page-transition-incoming-image(foo) { + background-color: black; + } + ::page-transition-outgoing-image(foo) { + background-color: grey; + } + div { + page-transition-tag: foo; + width: 100px; + height: 100px; + contain: paint; + } + </style> + <div></div> + )HTML"); + auto* transition = + DocumentTransitionSupplement::EnsureDocumentTransition(GetDocument()); + ASSERT_TRUE(transition->StartNewTransition()); + + V8TestingScope v8_scope; + ScriptState* script_state = v8_scope.GetScriptState(); + ExceptionState& exception_state = v8_scope.GetExceptionState(); + + auto start_setup_lambda = + [](const v8::FunctionCallbackInfo<v8::Value>& info) {}; + + // This callback sets the elements for the start phase of the transition. + auto start_setup_callback = + v8::Function::New(v8_scope.GetContext(), start_setup_lambda, {}) + .ToLocalChecked(); + + transition->start(script_state, + V8DocumentTransitionCallback::Create(start_setup_callback), + exception_state); + ASSERT_FALSE(exception_state.HadException()); + UpdateAllLifecyclePhasesForTest(); + + // Finish the prepare phase, mutate the DOM and start the animation. + UpdateAllLifecyclePhasesAndFinishDirectives(); + test::RunPendingTasks(); + EXPECT_EQ(GetState(transition), State::kStarted); + + struct TestCase { + PseudoId pseudo_id; + bool uses_tags; + String user_rule; + }; + TestCase test_cases[] = { + {kPseudoIdPageTransition, false, + "::page-transition { background-color: red; }"}, + {kPseudoIdPageTransitionContainer, true, + "::page-transition-container(foo) { background-color: blue; }"}, + {kPseudoIdPageTransitionImageWrapper, true, + "::page-transition-image-wrapper(foo) { background-color: lightblue; }"}, + {kPseudoIdPageTransitionIncomingImage, true, + "::page-transition-incoming-image(foo) { background-color: black; }"}, + {kPseudoIdPageTransitionOutgoingImage, true, + "::page-transition-outgoing-image(foo) { background-color: grey; }"}}; + + for (const auto& test_case : test_cases) { + InspectorStyleResolver resolver(GetDocument().documentElement(), + test_case.pseudo_id, + test_case.uses_tags ? "foo" : g_null_atom); + auto* pseudo_element_rules = resolver.MatchedRules(); + + // The resolver collects developer and UA rules. + EXPECT_GT(pseudo_element_rules->size(), 1u); + EXPECT_EQ(pseudo_element_rules->back().first->cssText(), + test_case.user_rule); + } + + InspectorStyleResolver parent_resolver(GetDocument().documentElement(), + kPseudoIdNone, g_null_atom); + for (const auto& test_case : test_cases) { + SCOPED_TRACE(PseudoElementTagName(test_case.pseudo_id)); + Member<InspectorCSSMatchedRules> matched_rules_for_pseudo; + + bool found_rule_for_root = false; + for (const auto& matched_rules : parent_resolver.PseudoElementRules()) { + if (matched_rules->pseudo_id != test_case.pseudo_id) + continue; + if (matched_rules->document_transition_tag == "root") { + EXPECT_FALSE(found_rule_for_root); + found_rule_for_root = true; + continue; + } + + EXPECT_FALSE(matched_rules_for_pseudo); + matched_rules_for_pseudo = matched_rules; + } + + ASSERT_TRUE(matched_rules_for_pseudo); + // Pseudo elements which are generated for each tag should include the root + // by default. + EXPECT_EQ(found_rule_for_root, test_case.uses_tags); + EXPECT_EQ(matched_rules_for_pseudo->document_transition_tag, + test_case.uses_tags ? "foo" : g_null_atom); + + auto pseudo_element_rules = matched_rules_for_pseudo->matched_rules; + // The resolver collects developer and UA rules. + EXPECT_GT(pseudo_element_rules->size(), 1u); + EXPECT_EQ(pseudo_element_rules->back().first->cssText(), + test_case.user_rule); + } +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_utils.h b/third_party/blink/renderer/core/document_transition/document_transition_utils.h index eeb92a2c..8fec88f 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_utils.h +++ b/third_party/blink/renderer/core/document_transition/document_transition_utils.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_DOCUMENT_TRANSITION_DOCUMENT_TRANSITION_UTILS_H_ #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/css/style_engine.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/pseudo_element.h" #include "third_party/blink/renderer/core/style/computed_style_constants.h"
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h index 2321002..621389ab 100644 --- a/third_party/blink/renderer/core/dom/document.h +++ b/third_party/blink/renderer/core/dom/document.h
@@ -1593,10 +1593,6 @@ return *root_scroller_controller_; } - AnchorElementInteractionTracker* GetAnchorElementInteractionTracker() const { - return anchor_element_interaction_tracker_.Get(); - } - // Returns true if this document has a frame and it is a main frame. // See `Frame::IsMainFrame`. bool IsInMainFrame() const;
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 77bf910..21ed5006 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -3827,7 +3827,7 @@ if (new_style && !ShouldStoreComputedStyle(*new_style)) new_style = nullptr; - if (new_style) { + if (new_style && !CanSkipRecalcForHighlightPseudos(*new_style)) { const StyleHighlightData* parent_highlights = parent_style ? parent_style->HighlightData().get() : nullptr; @@ -3874,16 +3874,13 @@ } // Use new inheritance model for custom highlights even if it is not enabled // for other types of highlights. - if (new_style && new_style->HasPseudoElementStyle(kPseudoIdHighlight)) { - const StyleHighlightData* parent_highlights = - parent_style ? parent_style->HighlightData().get() : nullptr; - StyleHighlightData& highlights = new_style->MutableHighlightData(); - + if (new_style->HasPseudoElementStyle(kPseudoIdHighlight)) { const HashSet<AtomicString>* custom_highlight_names = new_style->CustomHighlightNames(); if (custom_highlight_names) { for (const AtomicString& custom_highlight_name : *custom_highlight_names) { + StyleHighlightData& highlights = new_style->MutableHighlightData(); const ComputedStyle* highlight_parent = parent_highlights ? parent_highlights->CustomHighlight(custom_highlight_name) @@ -4345,6 +4342,27 @@ affected_by_pseudo.ancestors_or_siblings); } +bool Element::CanSkipRecalcForHighlightPseudos( + const ComputedStyle& new_style) const { + // If we are a root element (our parent is a Document or ShadowRoot), we need + // to recalc iff there are any highlight rules for the pseudo in question, + // regardless of whether or not they are non-universal. + if (parentNode() == ContainingTreeScope().RootNode()) + return false; + + // If the parent matched any non-universal highlight rules, then we need + // to recalc, in case there are universal highlight rules. + bool parent_non_universal = + ParentComputedStyle() != nullptr && + ParentComputedStyle()->HasNonUniversalHighlightPseudoStyles(); + + // If we matched any non-universal highlight rules, then we need to recalc + // and our children also need to recalc (see above). + bool self_non_universal = new_style.HasNonUniversalHighlightPseudoStyles(); + + return !parent_non_universal && !self_non_universal; +} + void Element::SetAnimationStyleChange(bool animation_style_change) { if (animation_style_change && GetDocument().InStyleRecalc()) return; @@ -8265,4 +8283,8 @@ RemoveAttributeInternal(index, kNotInSynchronizationOfLazyAttribute); } +bool Element::IsDocumentElement() const { + return this == GetDocument().documentElement(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h index 322af19..022d9d9 100644 --- a/third_party/blink/renderer/core/dom/element.h +++ b/third_party/blink/renderer/core/dom/element.h
@@ -1129,6 +1129,8 @@ bool isVisible(IsVisibleOptions* options) const; + bool IsDocumentElement() const; + protected: const ElementData* GetElementData() const { return element_data_.Get(); } UniqueElementData& EnsureUniqueElementData(); @@ -1532,6 +1534,12 @@ void PseudoStateChanged(CSSSelector::PseudoType pseudo, AffectedByPseudoStateChange&&); + // Highlight pseudos inherit all properties from the corresponding highlight + // in the parent, but virtually all existing content uses universal rules + // like *::selection. To improve runtime and keep copy-on-write inheritance, + // avoid recalc if neither parent nor child matched any non-universal rules. + bool CanSkipRecalcForHighlightPseudos(const ComputedStyle& new_style) const; + Member<ElementData> element_data_; };
diff --git a/third_party/blink/renderer/core/dom/pseudo_element.h b/third_party/blink/renderer/core/dom/pseudo_element.h index 2ac5137..268a4d7 100644 --- a/third_party/blink/renderer/core/dom/pseudo_element.h +++ b/third_party/blink/renderer/core/dom/pseudo_element.h
@@ -99,7 +99,7 @@ const AtomicString document_transition_tag_; }; -const QualifiedName& PseudoElementTagName(PseudoId); +CORE_EXPORT const QualifiedName& PseudoElementTagName(PseudoId); bool PseudoElementLayoutObjectIsNeeded(const ComputedStyle* pseudo_style, const Element* originating_element);
diff --git a/third_party/blink/renderer/core/events/pointer_event.cc b/third_party/blink/renderer/core/events/pointer_event.cc index fe131ef..ef2f8e47 100644 --- a/third_party/blink/renderer/core/events/pointer_event.cc +++ b/third_party/blink/renderer/core/events/pointer_event.cc
@@ -4,7 +4,7 @@ #include "third_party/blink/renderer/core/events/pointer_event.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/v8_pointer_event_init.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/events/event_dispatcher.h"
diff --git a/third_party/blink/renderer/core/execution_context/security_context.cc b/third_party/blink/renderer/core/execution_context/security_context.cc index 0de46d6..8e75c93 100644 --- a/third_party/blink/renderer/core/execution_context/security_context.cc +++ b/third_party/blink/renderer/core/execution_context/security_context.cc
@@ -34,7 +34,7 @@ #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-blink.h" #include "third_party/blink/public/mojom/permissions_policy/policy_value.mojom-blink.h" #include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/platform/weborigin/scheme_registry.h"
diff --git a/third_party/blink/renderer/core/fileapi/public_url_manager.cc b/third_party/blink/renderer/core/fileapi/public_url_manager.cc index a079dfcfa..6030dfc 100644 --- a/third_party/blink/renderer/core/fileapi/public_url_manager.cc +++ b/third_party/blink/renderer/core/fileapi/public_url_manager.cc
@@ -32,7 +32,7 @@ #include "mojo/public/cpp/bindings/pending_remote.h" #include "third_party/blink/public/common/blob/blob_utils.h" #include "third_party/blink/public/mojom/blob/blob_registry.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/fileapi/url_registry.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h"
diff --git a/third_party/blink/renderer/core/frame/child_frame_compositing_helper.cc b/third_party/blink/renderer/core/frame/child_frame_compositing_helper.cc index a1445ee..ca8c8fa9 100644 --- a/third_party/blink/renderer/core/frame/child_frame_compositing_helper.cc +++ b/third_party/blink/renderer/core/frame/child_frame_compositing_helper.cc
@@ -91,7 +91,7 @@ auto layer_size = crash_ui_layer_->bounds(); auto display_list = base::MakeRefCounted<cc::DisplayItemList>(); display_list->StartPaint(); - display_list->push<cc::DrawColorOp>(SK_ColorGRAY, SkBlendMode::kSrc); + display_list->push<cc::DrawColorOp>(SkColors::kGray, SkBlendMode::kSrc); SkBitmap* sad_bitmap = child_frame_compositor_->GetSadPageBitmap(); if (sad_bitmap) {
diff --git a/third_party/blink/renderer/core/frame/dom_window.h b/third_party/blink/renderer/core/frame/dom_window.h index 682a6b41..0423e58a 100644 --- a/third_party/blink/renderer/core/frame/dom_window.h +++ b/third_party/blink/renderer/core/frame/dom_window.h
@@ -10,7 +10,7 @@ #include "third_party/blink/public/common/messaging/message_port_channel.h" #include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/mojom/messaging/delegated_capability.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink-forward.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/transferables.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/events/event_target.h"
diff --git a/third_party/blink/renderer/core/frame/frame.cc b/third_party/blink/renderer/core/frame/frame.cc index 601192e8..d23d4bc9 100644 --- a/third_party/blink/renderer/core/frame/frame.cc +++ b/third_party/blink/renderer/core/frame/frame.cc
@@ -371,6 +371,21 @@ } } +bool Frame::IsFencedFrameRoot() const { + if (!blink::features::IsFencedFramesEnabled()) + return false; + + switch (blink::features::kFencedFramesImplementationTypeParam.Get()) { + case blink::features::FencedFramesImplementationType::kMPArch: + return IsInFencedFrameTree() && IsMainFrame(); + case blink::features::FencedFramesImplementationType::kShadowDOM: + return IsInFencedFrameTree() && + this == &Tree().Top(FrameTreeBoundary::kFenced); + default: + return false; + } +} + absl::optional<mojom::blink::FencedFrameMode> Frame::GetFencedFrameMode() const { DCHECK(!IsDetached());
diff --git a/third_party/blink/renderer/core/frame/frame.h b/third_party/blink/renderer/core/frame/frame.h index 9aa6541..d1550b3 100644 --- a/third_party/blink/renderer/core/frame/frame.h +++ b/third_party/blink/renderer/core/frame/frame.h
@@ -427,6 +427,11 @@ // FrameTree. bool IsInFencedFrameTree() const; + // Returns false if fenced frames are disabled. Otherwise, returns true if + // this frame is the main frame of a fenced frame tree. Works for both MPArch + // and ShadowDOM based fenced frames. + bool IsFencedFrameRoot() const; + // Returns the mode set on the fenced frame if the frame is inside a fenced // frame tree. Otherwise returns `absl::nullopt`. This should not be called // on a detached frame.
diff --git a/third_party/blink/renderer/core/frame/history.cc b/third_party/blink/renderer/core/frame/history.cc index d52b383..a8e3456b 100644 --- a/third_party/blink/renderer/core/frame/history.cc +++ b/third_party/blink/renderer/core/frame/history.cc
@@ -25,7 +25,7 @@ #include "third_party/blink/renderer/core/frame/history.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/history_util.h"
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h index 725d5f8..d619569 100644 --- a/third_party/blink/renderer/core/frame/local_frame.h +++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -58,7 +58,7 @@ #include "third_party/blink/public/mojom/loader/pause_subresource_loading_handle.mojom-blink-forward.h" #include "third_party/blink/public/mojom/navigation/renderer_eviction_reason.mojom-blink-forward.h" #include "third_party/blink/public/mojom/reporting/reporting.mojom-blink-forward.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink-forward.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/web/web_script_execution_callback.h" #include "third_party/blink/renderer/core/core_export.h"
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 c639651..94acf5c 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -3858,7 +3858,13 @@ const PhysicalRect& rect_to_scroll, mojom::blink::ScrollIntoViewParamsPtr params) { DCHECK(GetFrame().IsLocalRoot()); - DCHECK(!GetFrame().IsMainFrame()); + DCHECK(!GetFrame().IsOutermostMainFrame()); + + // If the scroll doesn't cross origin boundaries then it must already have + // been blocked for a scroll crossing an embedded frame tree boundary. + DCHECK(params->cross_origin_boundaries || + (!GetFrame().IsMainFrame() || GetFrame().IsOutermostMainFrame())); + DCHECK(params->cross_origin_boundaries || GetFrame() .Tree() @@ -3871,26 +3877,6 @@ gfx::RectF(new_rect), std::move(params)); } -bool LocalFrameView::AllowedToPropagateScrollIntoView( - const mojom::blink::ScrollIntoViewParamsPtr& params) { - if (!params->cross_origin_boundaries) { - Frame* parent_frame = GetFrame().Tree().Parent(); - if (parent_frame && - !parent_frame->GetSecurityContext()->GetSecurityOrigin()->CanAccess( - GetFrame().GetSecurityContext()->GetSecurityOrigin())) { - return false; - } - } - - if (params->type != mojom::blink::ScrollType::kProgrammatic) - return true; - - if (!GetFrame().GetDocument()) - return true; - - return !GetFrame().GetDocument()->IsVerticalScrollEnforced(); -} - void LocalFrameView::NotifyFrameRectsChangedIfNeeded() { if (root_layer_did_scroll_) { root_layer_did_scroll_ = false;
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 351ea559..897b66f 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -730,11 +730,6 @@ void ScrollRectToVisibleInRemoteParent(const PhysicalRect&, mojom::blink::ScrollIntoViewParamsPtr); - // Returns true if a scroll into view can continue to cause scrolling in the - // parent frame. - bool AllowedToPropagateScrollIntoView( - const mojom::blink::ScrollIntoViewParamsPtr&); - PaintArtifactCompositor* GetPaintArtifactCompositor() const; cc::Layer* RootCcLayer();
diff --git a/third_party/blink/renderer/core/frame/navigator_device_memory.cc b/third_party/blink/renderer/core/frame/navigator_device_memory.cc index eab5029..5ef2c47 100644 --- a/third_party/blink/renderer/core/frame/navigator_device_memory.cc +++ b/third_party/blink/renderer/core/frame/navigator_device_memory.cc
@@ -5,9 +5,9 @@ #include "third_party/blink/renderer/core/frame/navigator_device_memory.h" #include "third_party/blink/public/common/device_memory/approximated_device_memory.h" -#include "third_party/blink/public/common/privacy_budget/identifiability_metrics.h" #include "third_party/blink/public/common/privacy_budget/identifiability_metric_builder.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/common/privacy_budget/identifiability_metrics.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h"
diff --git a/third_party/blink/renderer/core/frame/navigator_ua_data.cc b/third_party/blink/renderer/core/frame/navigator_ua_data.cc index 7ca23bb60..3793dd1 100644 --- a/third_party/blink/renderer/core/frame/navigator_ua_data.cc +++ b/third_party/blink/renderer/core/frame/navigator_ua_data.cc
@@ -11,7 +11,7 @@ #include "third_party/blink/public/common/privacy_budget/identifiable_surface.h" #include "third_party/blink/public/common/privacy_budget/identifiable_token.h" #include "third_party/blink/public/common/privacy_budget/identifiable_token_builder.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/core/v8/v8_ua_data_values.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h"
diff --git a/third_party/blink/renderer/core/frame/use_counter_impl_test.cc b/third_party/blink/renderer/core/frame/use_counter_impl_test.cc index 37e5e82..27fb29c 100644 --- a/third_party/blink/renderer/core/frame/use_counter_impl_test.cc +++ b/third_party/blink/renderer/core/frame/use_counter_impl_test.cc
@@ -4,7 +4,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/scheme_registry.h" -#include "third_party/blink/public/mojom/use_counter/css_property_id.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom-blink.h" #include "third_party/blink/renderer/core/css/css_property_names.h" #include "third_party/blink/renderer/core/css/properties/css_property.h" #include "third_party/blink/renderer/core/dom/shadow_root.h"
diff --git a/third_party/blink/renderer/core/frame/web_feature.h b/third_party/blink/renderer/core/frame/web_feature.h index c5b655e7..3bf025d 100644 --- a/third_party/blink/renderer/core/frame/web_feature.h +++ b/third_party/blink/renderer/core/frame/web_feature.h
@@ -9,7 +9,7 @@ // is heavy on the compiler. Those who do not need the definition, but could do // with just a forward-declaration, should include WebFeatureForward.h instead. -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" namespace blink { using WebFeature = mojom::WebFeature;
diff --git a/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.cc b/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.cc index b212c5e..63873cb 100644 --- a/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.cc +++ b/third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.cc
@@ -9,7 +9,7 @@ #include "third_party/blink/public/common/fenced_frame/fenced_frame_utils.h" #include "third_party/blink/public/common/frame/fenced_frame_sandbox_flags.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/css/style_change_reason.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/shadow_root.h"
diff --git a/third_party/blink/renderer/core/html/portal/html_portal_element.cc b/third_party/blink/renderer/core/html/portal/html_portal_element.cc index c90c095..756e4458 100644 --- a/third_party/blink/renderer/core/html/portal/html_portal_element.cc +++ b/third_party/blink/renderer/core/html/portal/html_portal_element.cc
@@ -6,7 +6,7 @@ #include <utility> #include "third_party/blink/public/mojom/loader/referrer.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/js_event_handler_for_content_attribute.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
diff --git a/third_party/blink/renderer/core/input/event_handler.cc b/third_party/blink/renderer/core/input/event_handler.cc index b05331f..869b1fb 100644 --- a/third_party/blink/renderer/core/input/event_handler.cc +++ b/third_party/blink/renderer/core/input/event_handler.cc
@@ -35,7 +35,7 @@ #include "third_party/blink/public/common/input/web_input_event.h" #include "third_party/blink/public/common/input/web_mouse_wheel_event.h" #include "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/core/clipboard/data_transfer.h" #include "third_party/blink/renderer/core/dom/document.h"
diff --git a/third_party/blink/renderer/core/input/mouse_event_manager_test.cc b/third_party/blink/renderer/core/input/mouse_event_manager_test.cc index 9f23d19..7f98e734 100644 --- a/third_party/blink/renderer/core/input/mouse_event_manager_test.cc +++ b/third_party/blink/renderer/core/input/mouse_event_manager_test.cc
@@ -50,7 +50,8 @@ } }; -TEST_F(MouseEventManagerTest, MousePressNodeRemoved) { +// TODO(crbug.com/1325058): Re-enable this test +TEST_F(MouseEventManagerTest, DISABLED_MousePressNodeRemoved) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML(
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 f992e8b..292a062c 100644 --- a/third_party/blink/renderer/core/input/pointer_event_manager.cc +++ b/third_party/blink/renderer/core/input/pointer_event_manager.cc
@@ -25,7 +25,6 @@ #include "third_party/blink/renderer/core/input/touch_action_util.h" #include "third_party/blink/renderer/core/layout/hit_test_canvas_result.h" #include "third_party/blink/renderer/core/layout/layout_object.h" -#include "third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.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/pointer_lock_controller.h" @@ -190,14 +189,6 @@ if (frame_ && frame_->DomWindow()) event_timing = EventTiming::Create(frame_->DomWindow(), *pointer_event); - if (event_type == event_type_names::kPointerdown) { - AnchorElementInteractionTracker* tracker = - frame_->GetDocument()->GetAnchorElementInteractionTracker(); - if (tracker) { - tracker->OnPointerDown(*target, *pointer_event); - } - } - if (should_filter && !HasPointerEventListener(frame_->GetEventHandlerRegistry())) return WebInputEventResult::kNotHandled;
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc index 3c0b7ef..10ce707 100644 --- a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
@@ -103,6 +103,7 @@ #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h" #include "third_party/blink/renderer/core/loader/document_loader.h" #include "third_party/blink/renderer/core/page/page.h" +#include "third_party/blink/renderer/core/style/computed_style_constants.h" #include "third_party/blink/renderer/core/style/style_generated_image.h" #include "third_party/blink/renderer/core/style/style_image.h" #include "third_party/blink/renderer/core/style_property_shorthand.h" @@ -116,6 +117,8 @@ #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/text/text_run.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" +#include "third_party/blink/renderer/platform/wtf/casting.h" +#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" #include "third_party/blink/renderer/platform/wtf/text/string_concatenate.h" namespace blink { @@ -134,6 +137,24 @@ ~FrontendOperationScope() { --g_frontend_operation_counter; } }; +Element* GetPseudoIdAndTag(Element* element, + PseudoId& element_pseudo_id, + AtomicString& document_transition_tag) { + auto* resolved_element = element; + if (auto* pseudo_element = DynamicTo<PseudoElement>(element)) { + resolved_element = IsTransitionPseudoElement(pseudo_element->GetPseudoId()) + ? pseudo_element->OriginatingElement() + : pseudo_element->ParentOrShadowHostElement(); + // TODO(khushalsagar) : This should never be null. + if (!resolved_element) + return nullptr; + + element_pseudo_id = pseudo_element->GetPseudoId(); + document_transition_tag = pseudo_element->document_transition_tag(); + } + return resolved_element; +} + String CreateShorthandValue(Document& document, const String& shorthand, const String& old_text, @@ -956,12 +977,13 @@ return response; Element* animating_element = element; - PseudoId element_pseudo_id = element->GetPseudoId(); - if (element_pseudo_id) { - element = element->ParentOrShadowHostElement(); - if (!element) - return Response::ServerError("Pseudo element has no parent"); - } + + PseudoId element_pseudo_id = kPseudoIdNone; + AtomicString document_transition_tag = g_null_atom; + element = + GetPseudoIdAndTag(element, element_pseudo_id, document_transition_tag); + if (!element) + return Response::ServerError("Pseudo element has no parent"); Document& document = element->GetDocument(); // A non-active document has no styles. @@ -976,7 +998,8 @@ } CheckPseudoHasCacheScope check_pseudo_has_cache_scope(&document); - InspectorStyleResolver resolver(element, element_pseudo_id); + InspectorStyleResolver resolver(element, element_pseudo_id, + document_transition_tag); // Matched rules. *matched_css_rules = BuildArrayForMatchedRuleList(resolver.MatchedRules()); @@ -2459,9 +2482,12 @@ HeapVector<Member<CSSStyleDeclaration>> InspectorCSSAgent::MatchingStyles( Element* element) { - PseudoId pseudo_id = element->GetPseudoId(); - if (pseudo_id) - element = element->parentElement(); + PseudoId pseudo_id = kPseudoIdNone; + AtomicString document_transition_tag = g_null_atom; + element = GetPseudoIdAndTag(element, pseudo_id, document_transition_tag); + if (!element) + return {}; + StyleResolver& style_resolver = element->GetDocument().GetStyleResolver(); // TODO(masonf,futhark): We need to update slot assignments here, so that @@ -2479,7 +2505,8 @@ HeapVector<Member<CSSStyleRule>> rules = FilterDuplicateRules(style_resolver.PseudoCSSRulesForElement( - element, pseudo_id, StyleResolver::kAllCSSRules)); + element, pseudo_id, document_transition_tag, + StyleResolver::kAllCSSRules)); HeapVector<Member<CSSStyleDeclaration>> styles; if (!pseudo_id && element->style()) styles.push_back(element->style());
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc index 776c83e..15a72e9 100644 --- a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
@@ -41,6 +41,7 @@ #include "third_party/blink/renderer/core/css/css_container_rule.h" #include "third_party/blink/renderer/core/css/css_property_name.h" #include "third_party/blink/renderer/core/css/resolver/style_resolver.h" +#include "third_party/blink/renderer/core/document_transition/document_transition_utils.h" #include "third_party/blink/renderer/core/dom/attr.h" #include "third_party/blink/renderer/core/dom/character_data.h" #include "third_party/blink/renderer/core/dom/container_node.h" @@ -108,6 +109,21 @@ const size_t kMaxTextSize = 10000; const UChar kEllipsisUChar[] = {0x2026, 0}; +template <typename Functor> +void ForEachSupportedPseudo(const Element* element, Functor& func) { + for (PseudoId pseudo_id : + {kPseudoIdBefore, kPseudoIdAfter, kPseudoIdMarker}) { + if (!PseudoElement::IsWebExposed(pseudo_id, element)) + continue; + if (PseudoElement* pseudo_element = element->GetPseudoElement(pseudo_id)) + func(pseudo_element); + } + if (element == element->GetDocument().documentElement()) { + DocumentTransitionUtils::ForEachTransitionPseudo(element->GetDocument(), + func); + } +} + } // namespace class InspectorRevalidateDOMTask final @@ -369,12 +385,10 @@ auto* element = DynamicTo<Element>(node); if (element) { - if (element->GetPseudoElement(kPseudoIdBefore)) - Unbind(element->GetPseudoElement(kPseudoIdBefore)); - if (element->GetPseudoElement(kPseudoIdAfter)) - Unbind(element->GetPseudoElement(kPseudoIdAfter)); - if (element->GetPseudoElement(kPseudoIdMarker)) - Unbind(element->GetPseudoElement(kPseudoIdMarker)); + auto unbind_pseudo = [&](PseudoElement* pseudo_element) { + Unbind(pseudo_element); + }; + ForEachSupportedPseudo(element, unbind_pseudo); } NotifyWillRemoveDOMNode(node); @@ -1909,15 +1923,12 @@ InspectorDOMAgent::BuildArrayForPseudoElements(Element* element, NodeToIdMap* nodes_map) { protocol::Array<protocol::DOM::Node> pseudo_elements; - for (PseudoId pseudo_id : - {kPseudoIdBefore, kPseudoIdAfter, kPseudoIdMarker}) { - if (!PseudoElement::IsWebExposed(pseudo_id, element)) - continue; - if (PseudoElement* pseudo_element = element->GetPseudoElement(pseudo_id)) { - pseudo_elements.emplace_back( - BuildObjectForNode(pseudo_element, 0, false, nodes_map)); - } - } + auto add_pseudo = [&](PseudoElement* pseudo_element) { + pseudo_elements.emplace_back( + BuildObjectForNode(pseudo_element, 0, false, nodes_map)); + }; + ForEachSupportedPseudo(element, add_pseudo); + if (pseudo_elements.empty()) return nullptr; return std::make_unique<protocol::Array<protocol::DOM::Node>>(
diff --git a/third_party/blink/renderer/core/inspector/inspector_style_resolver.cc b/third_party/blink/renderer/core/inspector/inspector_style_resolver.cc index 912df118..30ffa628 100644 --- a/third_party/blink/renderer/core/inspector/inspector_style_resolver.cc +++ b/third_party/blink/renderer/core/inspector/inspector_style_resolver.cc
@@ -9,17 +9,21 @@ #include "third_party/blink/renderer/core/css/css_style_rule.h" #include "third_party/blink/renderer/core/css/css_value.h" #include "third_party/blink/renderer/core/css/resolver/style_resolver.h" +#include "third_party/blink/renderer/core/css/style_engine.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/flat_tree_traversal.h" #include "third_party/blink/renderer/core/dom/pseudo_element.h" #include "third_party/blink/renderer/core/style/computed_style_constants.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" +#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" namespace blink { -InspectorStyleResolver::InspectorStyleResolver(Element* element, - PseudoId element_pseudo_id) +InspectorStyleResolver::InspectorStyleResolver( + Element* element, + PseudoId element_pseudo_id, + const AtomicString& document_transition_tag) : element_(element) { DCHECK(element_); @@ -32,37 +36,44 @@ // to get this information without grabbing at internal style classes! StyleResolver& style_resolver = element_->GetDocument().GetStyleResolver(); + DCHECK(!IsTransitionPseudoElement(element_pseudo_id) || + element_->IsDocumentElement()); matched_rules_ = style_resolver.PseudoCSSRulesForElement( - element_, element_pseudo_id, StyleResolver::kAllCSSRules); + element_, element_pseudo_id, document_transition_tag, + StyleResolver::kAllCSSRules); if (element_pseudo_id) return; + const bool has_active_document_transition = + element_->IsDocumentElement() && !element_->GetDocument() + .GetStyleEngine() + .DocumentTransitionTags() + .IsEmpty(); for (PseudoId pseudo_id = kFirstPublicPseudoId; pseudo_id < kAfterLastInternalPseudoId; pseudo_id = static_cast<PseudoId>(pseudo_id + 1)) { if (!PseudoElement::IsWebExposed(pseudo_id, element_)) continue; - // TODO(khushalsagar) : Support querying rules for transition pseudo - // elements. - if (IsTransitionPseudoElement(pseudo_id)) + // The ::page-transition* pseudo elements are only generated for the root + // element. + if (IsTransitionPseudoElement(pseudo_id) && + !has_active_document_transition) { continue; + } - // If the pseudo-element doesn't exist, exclude UA rules to avoid cluttering - // all elements. - unsigned rules_to_include = element_->GetPseudoElement(pseudo_id) - ? StyleResolver::kAllCSSRules - : StyleResolver::kAllButUACSSRules; - RuleIndexList* matched_rules = style_resolver.PseudoCSSRulesForElement( - element_, pseudo_id, rules_to_include); - if (matched_rules && matched_rules->size()) { - InspectorCSSMatchedRules* match = - MakeGarbageCollected<InspectorCSSMatchedRules>(); - match->element = element_; - match->matched_rules = matched_rules; - match->pseudo_id = pseudo_id; - pseudo_element_rules_.push_back(match); + const bool has_document_transition_tags = + IsTransitionPseudoElement(pseudo_id) && + PseudoElementHasArguments(pseudo_id); + if (!has_document_transition_tags) { + AddPseudoElementRules(pseudo_id, g_null_atom); + continue; + } + + for (const auto& tag : + element_->GetDocument().GetStyleEngine().DocumentTransitionTags()) { + AddPseudoElementRules(pseudo_id, tag); } } @@ -92,7 +103,8 @@ continue; RuleIndexList* matched_rules = style_resolver.PseudoCSSRulesForElement( - parent_element, pseudo_id, StyleResolver::kAllButUACSSRules); + parent_element, pseudo_id, g_null_atom, + StyleResolver::kAllButUACSSRules); if (matched_rules && matched_rules->size()) { InspectorCSSMatchedRules* pseudo_match = MakeGarbageCollected<InspectorCSSMatchedRules>(); @@ -111,6 +123,29 @@ } } +void InspectorStyleResolver::AddPseudoElementRules( + PseudoId pseudo_id, + const AtomicString& document_transition_tag) { + StyleResolver& style_resolver = element_->GetDocument().GetStyleResolver(); + // If the pseudo-element doesn't exist, exclude UA rules to avoid cluttering + // all elements. + unsigned rules_to_include = + element_->GetNestedPseudoElement(pseudo_id, document_transition_tag) + ? StyleResolver::kAllCSSRules + : StyleResolver::kAllButUACSSRules; + RuleIndexList* matched_rules = style_resolver.PseudoCSSRulesForElement( + element_, pseudo_id, document_transition_tag, rules_to_include); + if (matched_rules && matched_rules->size()) { + InspectorCSSMatchedRules* match = + MakeGarbageCollected<InspectorCSSMatchedRules>(); + match->element = element_; + match->matched_rules = matched_rules; + match->pseudo_id = pseudo_id; + match->document_transition_tag = document_transition_tag; + pseudo_element_rules_.push_back(match); + } +} + RuleIndexList* InspectorStyleResolver::MatchedRules() const { return matched_rules_; }
diff --git a/third_party/blink/renderer/core/inspector/inspector_style_resolver.h b/third_party/blink/renderer/core/inspector/inspector_style_resolver.h index 87ddfc5..e5959b6e 100644 --- a/third_party/blink/renderer/core/inspector/inspector_style_resolver.h +++ b/third_party/blink/renderer/core/inspector/inspector_style_resolver.h
@@ -13,6 +13,7 @@ #include "third_party/blink/renderer/core/css/properties/css_property.h" #include "third_party/blink/renderer/core/style/computed_style_constants.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" +#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" namespace blink { @@ -25,6 +26,7 @@ Member<Element> element; Member<RuleIndexList> matched_rules; PseudoId pseudo_id; + AtomicString document_transition_tag = g_null_atom; void Trace(Visitor* visitor) const { visitor->Trace(element); @@ -50,7 +52,9 @@ STACK_ALLOCATED(); public: - explicit InspectorStyleResolver(Element*, PseudoId); + InspectorStyleResolver(Element*, + PseudoId, + const AtomicString& document_transition_tag); RuleIndexList* MatchedRules() const; HeapVector<Member<InspectorCSSMatchedRules>> PseudoElementRules(); HeapVector<Member<InspectorCSSMatchedRules>> ParentRules(); @@ -58,6 +62,9 @@ ParentPseudoElementRules(); private: + void AddPseudoElementRules(PseudoId pseudo_id, + const AtomicString& document_transition_tag); + Element* element_; RuleIndexList* matched_rules_; HeapVector<Member<InspectorCSSMatchedRules>> parent_rules_;
diff --git a/third_party/blink/renderer/core/inspector/inspector_style_resolver_test.cc b/third_party/blink/renderer/core/inspector/inspector_style_resolver_test.cc index 667bd48..882a1a1 100644 --- a/third_party/blink/renderer/core/inspector/inspector_style_resolver_test.cc +++ b/third_party/blink/renderer/core/inspector/inspector_style_resolver_test.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/core/css/css_value.h" #include "third_party/blink/renderer/core/css/css_value_list.h" #include "third_party/blink/renderer/core/css/style_engine.h" +#include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/html/html_element.h" #include "third_party/blink/renderer/core/style/computed_style_constants.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" @@ -43,7 +44,7 @@ </div> )HTML"); Element* grid = GetDocument().getElementById("grid"); - InspectorStyleResolver resolver(grid, kPseudoIdNone); + InspectorStyleResolver resolver(grid, kPseudoIdNone, g_null_atom); RuleIndexList* matched_rules = resolver.MatchedRules(); // Some rules are coming for UA. EXPECT_EQ(2u, matched_rules->size()); @@ -73,7 +74,7 @@ </div> )HTML"); Element* grid = GetDocument().getElementById("grid"); - InspectorStyleResolver resolver(grid, kPseudoIdNone); + InspectorStyleResolver resolver(grid, kPseudoIdNone, g_null_atom); HeapVector<Member<InspectorCSSMatchedRules>> parent_rules = resolver.ParentRules(); Element* grid_container = GetDocument().getElementById("grid-container"); @@ -130,7 +131,7 @@ Element* middle = GetDocument().getElementById("middle"); Element* outer = GetDocument().getElementById("outer"); Element* body = GetDocument().QuerySelector("body"); - InspectorStyleResolver resolver(target, kPseudoIdNone); + InspectorStyleResolver resolver(target, kPseudoIdNone, g_null_atom); HeapVector<Member<InspectorCSSMatchedPseudoElements>> parent_pseudos = resolver.ParentPseudoElementRules(); EXPECT_EQ(5u, parent_pseudos.size());
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc b/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc index 3aef0ba..038f7ba 100644 --- a/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc +++ b/third_party/blink/renderer/core/intersection_observer/intersection_observer.cc
@@ -9,7 +9,7 @@ #include "base/numerics/clamped_math.h" #include "base/time/time.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/v8_intersection_observer_callback.h" #include "third_party/blink/renderer/bindings/core/v8/v8_intersection_observer_delegate.h" #include "third_party/blink/renderer/bindings/core/v8/v8_intersection_observer_init.h"
diff --git a/third_party/blink/renderer/core/layout/deferred_shaping_test.cc b/third_party/blink/renderer/core/layout/deferred_shaping_test.cc index dab8fcd3..22a6d46 100644 --- a/third_party/blink/renderer/core/layout/deferred_shaping_test.cc +++ b/third_party/blink/renderer/core/layout/deferred_shaping_test.cc
@@ -350,6 +350,20 @@ EXPECT_FALSE(IsLocked("target")); } +// crbug.com/1324458 +TEST_F(DeferredShapingTest, UnlockOnSwithcingToBfcByChildPositionChange) { + SetBodyInnerHTML(R"HTML(<div style="height:1800px"></div> +<li id="target">\n<div id="abs" style="position:absolute"></div></li>)HTML"); + UpdateAllLifecyclePhasesForTest(); + EXPECT_TRUE(IsDefer("target")); + EXPECT_TRUE(IsLocked("target")); + + GetElementById("abs")->setAttribute("style", "position:static"); + UpdateAllLifecyclePhasesForTest(); + EXPECT_FALSE(IsDefer("target")); + EXPECT_FALSE(IsLocked("target")); +} + TEST_F(DeferredShapingTest, ScrollIntoView) { SetBodyInnerHTML(R"HTML(<div style="height:1800px"></div> <div><p id="prior">IFC</p></div>
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.cc b/third_party/blink/renderer/core/layout/layout_block_flow.cc index 0fda044..dace2e3 100644 --- a/third_party/blink/renderer/core/layout/layout_block_flow.cc +++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -2858,10 +2858,6 @@ if (ChildrenInline()) { if (child_is_block_level) { - if (GetDisplayLockContext() && IsShapingDeferred()) { - GetDisplayLockContext()->SetRequestedState( - EContentVisibility::kVisible); - } // Wrap the inline content in anonymous blocks, to allow for the new block // child to be inserted. MakeChildrenNonInline(before_child); @@ -3319,6 +3315,10 @@ void LayoutBlockFlow::MakeChildrenNonInline(LayoutObject* insertion_point) { NOT_DESTROYED(); + + if (GetDisplayLockContext() && IsShapingDeferred()) + GetDisplayLockContext()->SetRequestedState(EContentVisibility::kVisible); + // makeChildrenNonInline takes a block whose children are *all* inline and it // makes sure that inline children are coalesced under anonymous blocks. // If |insertionPoint| is defined, then it represents the insertion point for
diff --git a/third_party/blink/renderer/core/layout/layout_grid.cc b/third_party/blink/renderer/core/layout/layout_grid.cc index 63b0295f..cac7b6ea 100644 --- a/third_party/blink/renderer/core/layout/layout_grid.cc +++ b/third_party/blink/renderer/core/layout/layout_grid.cc
@@ -29,7 +29,7 @@ #include <memory> #include <utility> -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/layout/grid_layout_utils.h" #include "third_party/blink/renderer/core/layout/layout_state.h"
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index cd8f46d..7c36ac8 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -3946,7 +3946,13 @@ if (BehavesLikeBlockContainer()) { if (const ComputedStyle* cached = StyleRef().GetCachedPseudoElementStyle(kPseudoIdFirstLine)) { - return cached; + // If the style is cached by getComputedStyle(element, "::first-line"), it + // is marked with IsEnsuredInDisplayNone(). In that case we might not have + // the correct ::first-line style for laying out the ::first-line. Ignore + // the cached ComputedStyle and overwrite it using + // ReplaceCachedPseudoElementStyle() below. + if (!cached->IsEnsuredInDisplayNone()) + return cached; } if (Element* element = DynamicTo<Element>(GetNode())) { @@ -3980,7 +3986,7 @@ if (scoped_refptr<ComputedStyle> first_line_style = first_line_block->GetUncachedPseudoElementStyle( StyleRequest(kPseudoIdFirstLine, Style()))) { - return StyleRef().AddCachedPseudoElementStyle( + return StyleRef().ReplaceCachedPseudoElementStyle( std::move(first_line_style), kPseudoIdFirstLine, g_null_atom); } }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc index a8917c9..326c5637 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
@@ -1528,20 +1528,24 @@ return nullptr; } - // Find the available inline-size which should be given to the child. - LayoutUnit line_left_offset = opportunity.rect.start_offset.line_offset; - LayoutUnit line_right_offset = opportunity.rect.end_offset.line_offset; - - LayoutUnit line_left_margin = child_data.margins.LineLeft(direction); - LayoutUnit line_right_margin = child_data.margins.LineRight(direction); - - // When the inline dimensions of layout opportunity match the available - // inline-size, a new formatting context can expand outside of the - // opportunity if negative margins are present. + // Determine which sides of the opportunity have floats we should avoid. + // We can detect this when the opportunity-rect sides match the + // available-rect sides. + bool has_floats_on_line_left = + opportunity.rect.LineStartOffset() != origin_offset.line_offset; + bool has_floats_on_line_right = + opportunity.rect.LineEndOffset() != + (origin_offset.line_offset + ChildAvailableSize().inline_size); bool can_expand_outside_opportunity = - opportunity.rect.start_offset.line_offset == - origin_offset.line_offset && - opportunity.rect.InlineSize() == ChildAvailableSize().inline_size; + !has_floats_on_line_left && !has_floats_on_line_right; + + const LayoutUnit line_left_margin = child_data.margins.LineLeft(direction); + const LayoutUnit line_right_margin = + child_data.margins.LineRight(direction); + + // Find the available inline-size which should be given to the child. + LayoutUnit line_left_offset = opportunity.rect.LineStartOffset(); + LayoutUnit line_right_offset = opportunity.rect.LineEndOffset(); if (can_expand_outside_opportunity) { // No floats have affected the available inline-size, adjust the @@ -1599,13 +1603,9 @@ return layout_result; } + // Check if we can fit in the opportunity block direction. NGFragment fragment(writing_direction, layout_result->PhysicalFragment()); - - // Check if the fragment will fit in this layout opportunity, if not proceed - // to the next opportunity. - if ((fragment.InlineSize() > opportunity.rect.InlineSize() && - !can_expand_outside_opportunity) || - fragment.BlockSize() > opportunity.rect.BlockSize()) + if (fragment.BlockSize() > opportunity.rect.BlockSize()) continue; // Now find the fragment's (final) position calculating the auto margins. @@ -1635,13 +1635,40 @@ fragment.InlineSize(), &auto_margins); } - // |auto_margins| are initialized as a copy of the child's initial margins. - // To determine the effect of the auto-margins we only apply the difference. - LayoutUnit auto_margin_line_left = - auto_margins.LineLeft(direction) - line_left_margin; + // Determine our final BFC offset. + // + // NOTE: |auto_margins| are initialized as a copy of the child's initial + // margins. To determine the effect of the auto-margins we apply only the + // difference. + NGBfcOffset child_bfc_offset = {LayoutUnit(), + opportunity.rect.BlockStartOffset()}; + if (ConstraintSpace().Direction() == TextDirection::kLtr) { + LayoutUnit auto_margin_line_left = + auto_margins.LineLeft(direction) - line_left_margin; + child_bfc_offset.line_offset = line_left_offset + auto_margin_line_left; + } else { + LayoutUnit auto_margin_line_right = + auto_margins.LineRight(direction) - line_right_margin; + child_bfc_offset.line_offset = + line_right_offset - auto_margin_line_right - fragment.InlineSize(); + } - *out_child_bfc_offset = {line_left_offset + auto_margin_line_left, - opportunity.rect.start_offset.block_offset}; + // Check if we'll intersect any floats on our line-left/line-right. + if (has_floats_on_line_left && + child_bfc_offset.line_offset < opportunity.rect.LineStartOffset()) + continue; + if (has_floats_on_line_right && + child_bfc_offset.line_offset + fragment.InlineSize() > + opportunity.rect.LineEndOffset()) + continue; + + // If we can't expand outside our opportunity, check if we fit in the + // inline direction. + if (!can_expand_outside_opportunity && + fragment.InlineSize() > opportunity.rect.InlineSize()) + continue; + + *out_child_bfc_offset = child_bfc_offset; return layout_result; }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h index 4f670a6..2c8d22c 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h +++ b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h
@@ -138,6 +138,7 @@ bool IsNGTable() const { return IsTable() && box_->IsLayoutNGObject(); } bool IsTableCaption() const { return IsBlock() && box_->IsTableCaption(); } + bool IsTableSection() const { return IsBlock() && box_->IsTableSection(); } // Section with empty rows is considered empty. bool IsEmptyTableSection() const;
diff --git a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc index fd3b0f10..1db509a5 100644 --- a/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/table/ng_table_layout_algorithm.cc
@@ -418,6 +418,38 @@ table_border_padding.InlineSum() + border_spacing.inline_size; } +// Border-box block extent of what CSS calls the "table box" [1] +// (i.e. everything except for captions). +// +// [1] https://www.w3.org/TR/CSS22/tables.html#model +struct TableBoxExtent { + LayoutUnit start; + LayoutUnit end; +}; + +// Call when beginning layout of the table box (typically right before laying +// out the first section). +TableBoxExtent BeginTableBoxLayout(LayoutUnit block_start_border_edge, + const NGBoxStrut& table_border_padding) { + return {block_start_border_edge, + block_start_border_edge + table_border_padding.block_start}; +} + +// Call when done with layout of the table box (typically right after having +// laid out the last table section). +LayoutUnit EndTableBoxLayout(const NGBoxStrut& table_border_padding, + LayoutUnit border_spacing_after_last_section, + LayoutUnit minimal_table_grid_block_size, + TableBoxExtent* extent, + LayoutUnit* grid_block_size) { + DCHECK_LE(extent->start, extent->end); + extent->end += + border_spacing_after_last_section + table_border_padding.block_end; + *grid_block_size = + std::max(extent->end - extent->start, minimal_table_grid_block_size); + return extent->start + *grid_block_size; +} + } // namespace LayoutUnit NGTableLayoutAlgorithm::ComputeTableInlineSize( @@ -782,7 +814,7 @@ // +--------------------------------+ const NGLayoutResult* NGTableLayoutAlgorithm::GenerateFragment( const LayoutUnit table_inline_size, - const LayoutUnit minimal_table_grid_block_size, + LayoutUnit minimal_table_grid_block_size, const NGTableGroupedChildren& grouped_children, const Vector<NGTableColumnLocation>& column_locations, const NGTableTypes::Rows& rows, @@ -791,14 +823,28 @@ const HeapVector<CaptionResult>& captions, const NGTableBorders& table_borders, const LogicalSize& border_spacing) { + if (IsResumingLayout(BreakToken())) + minimal_table_grid_block_size = LayoutUnit(); + const auto table_writing_direction = Style().GetWritingDirection(); scoped_refptr<const NGTableConstraintSpaceData> constraint_space_data = CreateConstraintSpaceData(Style(), column_locations, sections, rows, cell_block_constraints, border_spacing); const NGBoxStrut border_padding = container_builder_.BorderPadding(); + + // The current layout position. LayoutUnit child_block_offset; - bool needs_end_border_spacing = false; + + // border-spacing that was added before the first table section in this + // fragment. We may want to omit it in some cases, in which case it will be + // set to 0. + LayoutUnit border_spacing_before_first_section; + + // border-spacing to add after the last table section in this fragment. We may + // want to omit it in some cases, in which case it will be set to 0. + LayoutUnit border_spacing_after_last_section; + bool has_processed_first_child = false; auto AddCaptionResult = [&](const CaptionResult& caption, @@ -874,36 +920,23 @@ return section_space_builder.ToConstraintSpace(); }; - auto GridBlockSize = [&border_padding, &minimal_table_grid_block_size, this]( - LayoutUnit start_offset, - LayoutUnit end_offset) -> LayoutUnit { - DCHECK_GE(end_offset, start_offset); - LayoutUnit grid_block_size = end_offset - start_offset; - grid_block_size += border_padding.block_end; - if (!IsResumingLayout(BreakToken())) { - grid_block_size = - std::max(grid_block_size, minimal_table_grid_block_size); - } - return grid_block_size; - }; + const LayoutUnit section_inline_offset = + border_padding.inline_start + border_spacing.inline_size; - // Generate section fragments, and also caption fragments, if we need to - // regenerate them (block fragmentation). - LogicalOffset section_offset = { - border_padding.inline_start + border_spacing.inline_size, - border_padding.block_start + child_block_offset}; - + absl::optional<TableBoxExtent> table_box_extent; absl::optional<LayoutUnit> table_baseline; - LayoutUnit first_section_block_offset = child_block_offset; LayoutUnit grid_block_size; bool broke_inside = false; - bool is_past_first_section_start = false; bool is_past_last_section_end = false; NGTableChildIterator child_iterator(grouped_children, BreakToken()); + // Generate section fragments; and also caption fragments, if we need to + // regenerate them (block fragmentation). for (auto entry = child_iterator.NextChild(); NGBlockNode child = entry.GetNode(); entry = child_iterator.NextChild()) { + DCHECK(child.IsTableCaption() || child.IsTableSection()); + const NGEarlyBreak* early_break_in_child = nullptr; if (UNLIKELY(early_break_)) { if (IsEarlyBreakTarget(*early_break_, container_builder_, child)) { @@ -927,11 +960,18 @@ // sections. We need to calculate the grid size now, so that we set the // block-offset for the caption correctly. is_past_last_section_end = true; - if (needs_end_border_spacing) - section_offset.block_offset += border_spacing.block_size; - grid_block_size = GridBlockSize(first_section_block_offset, - section_offset.block_offset); - child_block_offset = first_section_block_offset + grid_block_size; + + if (!table_box_extent) { + // There was no section to kick off "table box" extent calculation. Do + // it now. + table_box_extent = + BeginTableBoxLayout(child_block_offset, border_padding); + } + + child_block_offset = + EndTableBoxLayout(border_padding, border_spacing_after_last_section, + minimal_table_grid_block_size, + &(*table_box_extent), &grid_block_size); } LogicalSize available_size(container_builder_.InlineSize(), @@ -946,26 +986,27 @@ child_block_offset += caption.margins.block_start; child_inline_offset = caption.margins.inline_start; } else { - if (!is_past_first_section_start) { - is_past_first_section_start = true; - first_section_block_offset = child_block_offset; - child_block_offset += border_padding.block_start; - } - - if (ConstraintSpace().HasBlockFragmentation()) { - // TODO(mstensho): Border-spacing should only be included if there are - // table parts inside, but currently we need to lay out before we can - // check that. Always assume that we need border spacing for now (as - // long as we're not resuming inside the section). + DCHECK(child.IsTableSection()); + if (table_box_extent) { + // This is not the first section. Just add border-spacing. + child_block_offset += border_spacing.block_size; + } else { + // Entering the first section in this fragment. This is where the "table + // box" starts. + table_box_extent = + BeginTableBoxLayout(child_block_offset, border_padding); + // Only include border-spacing if we're at the start of the section. if (!IsResumingLayout(child_break_token)) - child_block_offset += border_spacing.block_size; + border_spacing_before_first_section = border_spacing.block_size; + child_block_offset += + border_padding.block_start + border_spacing_before_first_section; } NGConstraintSpace child_space = CreateSectionConstraintSpace( child, child_block_offset, entry.GetSectionIndex()); child_result = child.Layout(child_space, child_break_token, early_break_in_child); - child_inline_offset = section_offset.inline_offset; + child_inline_offset = section_inline_offset; } if (ConstraintSpace().HasBlockFragmentation()) { LayoutUnit fragmentainer_block_offset = @@ -987,18 +1028,24 @@ const auto& physical_fragment = To<NGPhysicalBoxFragment>(child_result->PhysicalFragment()); NGBoxFragment fragment(table_writing_direction, physical_fragment); - if (!child.IsTableCaption()) { + if (child.IsTableSection()) { + border_spacing_after_last_section = border_spacing.block_size; if (fragment.HasDescendantsForTablePart()) { - // Border-spacing has pre-emptively been added if we're participating in - // block fragmentation. Otherwise add it now. - if (!ConstraintSpace().HasBlockFragmentation()) - child_block_offset += border_spacing.block_size; // We want to add border-spacing after this section, but not if the // current fragment is past the block-end of the section. This might // happen if there are overflowing descendants, and this section should // just create an zero-sized fragment. - needs_end_border_spacing = - !child_break_token || !child_break_token->IsAtBlockEnd(); + if (child_break_token && child_break_token->IsAtBlockEnd()) + border_spacing_after_last_section = LayoutUnit(); + } else { + // There were no children inside. Omit the border-spacing previously + // added. Note that we should ideally re-lay out now if we're + // block-fragmented and ran out of space (the section may have had a + // non-zero block-size, for instance), since that would mean that we've + // used less space than actually turned out to be available. However, + // nobody will probably notice, and besides, our "empty section + // handling" isn't identical to other engines anyway. + child_block_offset -= border_spacing.block_size; } if (!table_baseline) { if (const auto& section_baseline = fragment.Baseline()) @@ -1010,8 +1057,10 @@ *child_result, LogicalOffset(child_inline_offset, child_block_offset)); child_block_offset += fragment.BlockSize(); - if (!child.IsTableCaption()) - section_offset.block_offset = child_block_offset; + if (child.IsTableSection()) { + // Update the "table box" extent, now that we're past one section. + table_box_extent->end = child_block_offset; + } if (ConstraintSpace().HasBlockFragmentation()) { has_processed_first_child = true; @@ -1025,32 +1074,36 @@ if (!child_iterator.NextChild()) container_builder_.SetHasSeenAllChildren(); + if (!table_box_extent) { + // There was no section to kick off "table box" extent calculation. Do it + // now. + table_box_extent = BeginTableBoxLayout(child_block_offset, border_padding); + } + // If we had (any) break inside, we don't need end border-spacing, and should // be at-least the fragmentainer size (if definite). if (broke_inside) { if (ConstraintSpace().HasKnownFragmentainerBlockSize()) { - section_offset.block_offset = - std::max(section_offset.block_offset, + table_box_extent->end = + std::max(table_box_extent->end, FragmentainerSpaceAtBfcStart(ConstraintSpace())); } - needs_end_border_spacing = false; + border_spacing_after_last_section = LayoutUnit(); } - if (needs_end_border_spacing) - section_offset.block_offset += border_spacing.block_size; - LayoutUnit column_block_size = - section_offset.block_offset - border_padding.block_start; - if (needs_end_border_spacing) - column_block_size -= border_spacing.block_size * 2; - if (!is_past_last_section_end) { - // If we haven't already calculated the grid size, do so now. - grid_block_size = - GridBlockSize(first_section_block_offset, section_offset.block_offset); - child_block_offset = first_section_block_offset + grid_block_size; + child_block_offset = EndTableBoxLayout( + border_padding, border_spacing_after_last_section, + minimal_table_grid_block_size, &(*table_box_extent), &grid_block_size); } - const LogicalRect table_grid_rect(LayoutUnit(), first_section_block_offset, + LayoutUnit column_block_size = + table_box_extent->end - table_box_extent->start; + column_block_size -= border_spacing_before_first_section + + border_spacing_after_last_section + + border_padding.BlockSum(); + + const LogicalRect table_grid_rect(LayoutUnit(), table_box_extent->start, container_builder_.InlineSize(), grid_block_size);
diff --git a/third_party/blink/renderer/core/layout/svg/transform_helper.cc b/third_party/blink/renderer/core/layout/svg/transform_helper.cc index 44f488c..ab77f61 100644 --- a/third_party/blink/renderer/core/layout/svg/transform_helper.cc +++ b/third_party/blink/renderer/core/layout/svg/transform_helper.cc
@@ -4,7 +4,7 @@ #include "third_party/blink/renderer/core/layout/svg/transform_helper.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/core/style/computed_style.h" #include "third_party/blink/renderer/core/svg/svg_element.h"
diff --git a/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc b/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc index 29526fd4..8eb4c5442 100644 --- a/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc +++ b/third_party/blink/renderer/core/loader/anchor_element_interaction_test.cc
@@ -7,14 +7,12 @@ #include "base/test/scoped_feature_list.h" #include "mojo/public/cpp/system/message_pipe.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/common/input/web_input_event.h" -#include "third_party/blink/public/common/input/web_mouse_event.h" #include "third_party/blink/public/mojom/loader/anchor_element_interaction_host.mojom-blink.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/html/html_anchor_element.h" -#include "third_party/blink/renderer/core/input/event_handler.h" #include "third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.h" +#include "third_party/blink/renderer/core/loader/anchor_element_listener.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" #include "third_party/blink/renderer/core/testing/sim/sim_test.h" #include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h" @@ -51,7 +49,6 @@ mojom::blink::AnchorElementInteractionHost::Name_, WTF::BindRepeating(&AnchorElementInteractionTest::Bind, WTF::Unretained(this))); - WebView().MainFrameViewWidget()->Resize(gfx::Size(400, 400)); } void TearDown() override { @@ -68,47 +65,58 @@ hosts_.push_back(std::move(host)); } - void SendMouseDownEvent() { - gfx::PointF coordinates(100, 100); - WebMouseEvent event(WebInputEvent::Type::kMouseDown, coordinates, - coordinates, WebPointerProperties::Button::kLeft, 0, - WebInputEvent::kLeftButtonDown, - WebInputEvent::GetStaticTimeStampForTests()); - GetDocument().GetFrame()->GetEventHandler().HandleMousePressEvent(event); - } - base::test::ScopedFeatureList feature_list_; std::vector<std::unique_ptr<MockAnchorElementInteractionHost>> hosts_; }; -TEST_F(AnchorElementInteractionTest, SingleAnchor) { - String source("https://example.com/p1"); - SimRequest main_resource(source, "text/html"); - LoadURL(source); - main_resource.Complete(R"HTML( - <a href='https://anchor1.com/'> - <div style='padding: 0px; width: 400px; height: 400px;'></div> - </a> - )HTML"); - SendMouseDownEvent(); - base::RunLoop().RunUntilIdle(); - KURL expected_url = KURL("https://anchor1.com/"); - EXPECT_EQ(1u, hosts_.size()); - absl::optional<KURL> url_received = hosts_[0]->url_received_; - EXPECT_TRUE(url_received.has_value()); - EXPECT_EQ(expected_url, url_received); -} - TEST_F(AnchorElementInteractionTest, InvalidHref) { String source("https://example.com/p1"); SimRequest main_resource(source, "text/html"); LoadURL(source); main_resource.Complete(R"HTML( - <a href='about:blank'> - <div style='padding: 0px; width: 400px; height: 400px;'></div> - </a> + <a id='anchor1' href='about:blank'>example</a> + <script> + const a = document.getElementById('anchor1'); + var event = new PointerEvent('pointerdown', {isPrimary: true}); + a.dispatchEvent(event); + </script> )HTML"); - SendMouseDownEvent(); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1u, hosts_.size()); + absl::optional<KURL> url_received = hosts_[0]->url_received_; + EXPECT_FALSE(url_received.has_value()); +} + +TEST_F(AnchorElementInteractionTest, NonPointerEventType) { + String source("https://example.com/p1"); + SimRequest main_resource(source, "text/html"); + LoadURL(source); + main_resource.Complete(R"HTML( + <a id='anchor1' href='https://anchor1.com/'>example</a> + <script> + const a = document.getElementById('anchor1'); + var event = new Event('pointerdown'); + a.dispatchEvent(event); + </script> + )HTML"); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(1u, hosts_.size()); + absl::optional<KURL> url_received = hosts_[0]->url_received_; + EXPECT_FALSE(url_received.has_value()); +} + +TEST_F(AnchorElementInteractionTest, NonPrimary) { + String source("https://example.com/p1"); + SimRequest main_resource(source, "text/html"); + LoadURL(source); + main_resource.Complete(R"HTML( + <a id='anchor1' href='https://anchor1.com/'>example</a> + <script> + const a = document.getElementById('anchor1'); + var event = new PointerEvent('pointerdown', {isPrimary: false}); + a.dispatchEvent(event); + </script> + )HTML"); base::RunLoop().RunUntilIdle(); EXPECT_EQ(1u, hosts_.size()); absl::optional<KURL> url_received = hosts_[0]->url_received_; @@ -120,16 +128,16 @@ SimRequest main_resource(source, "text/html"); LoadURL(source); main_resource.Complete(R"HTML( - <a href='https://anchor1.com/'> - <div style='padding: 0px; width: 400px; height: 400px;'></div> - </a> + <a id='anchor1' href='https://anchor1.com/'>example</a> + <script> + const a = document.getElementById('anchor1'); + var event = new PointerEvent('pointerdown', { + isPrimary: true, + button: 2 + }); + a.dispatchEvent(event); + </script> )HTML"); - gfx::PointF coordinates(100, 100); - WebMouseEvent event(WebInputEvent::Type::kMouseDown, coordinates, coordinates, - WebPointerProperties::Button::kLeft, 0, - WebInputEvent::kRightButtonDown, - WebInputEvent::GetStaticTimeStampForTests()); - GetDocument().GetFrame()->GetEventHandler().HandleMousePressEvent(event); base::RunLoop().RunUntilIdle(); EXPECT_EQ(1u, hosts_.size()); absl::optional<KURL> url_received = hosts_[0]->url_received_; @@ -141,13 +149,14 @@ SimRequest main_resource(source, "text/html"); LoadURL(source); main_resource.Complete(R"HTML( - <a href='https://anchor1.com/'> - <a href='https://anchor2.com/'> - <div style='padding: 0px; width: 400px; height: 400px;'></div> - </a> - </a> + <a id='anchor1' href='https://anchor1.com/'><a id='anchor2' + href='https://anchor2.com/'></a></a> + <script> + const a = document.getElementById('anchor2'); + var event = new PointerEvent('pointerdown', {isPrimary: true}); + a.dispatchEvent(event); + </script> )HTML"); - SendMouseDownEvent(); base::RunLoop().RunUntilIdle(); KURL expected_url = KURL("https://anchor2.com/"); EXPECT_EQ(1u, hosts_.size()); @@ -156,19 +165,19 @@ EXPECT_EQ(expected_url, url_received); } -TEST_F(AnchorElementInteractionTest, SiblingAnchorElements) { +TEST_F(AnchorElementInteractionTest, NestedDivAnchorElementCheck) { String source("https://example.com/p1"); SimRequest main_resource(source, "text/html"); LoadURL(source); main_resource.Complete(R"HTML( - <a href='https://anchor1.com/'> - <div style='padding: 0px; width: 400px; height: 400px;'></div> - </a> - <a href='https://anchor2.com/'> - <div style='padding: 0px; width: 400px; height: 400px;'></div> - </a> + <a id='anchor1' href='https://anchor1.com/'><div + id='div1id'></div></a> + <script> + const a = document.getElementById('div1id'); + var event = new PointerEvent('pointerdown', {isPrimary: true}); + a.dispatchEvent(event); + </script> )HTML"); - SendMouseDownEvent(); base::RunLoop().RunUntilIdle(); KURL expected_url = KURL("https://anchor1.com/"); EXPECT_EQ(1u, hosts_.size()); @@ -177,40 +186,57 @@ EXPECT_EQ(expected_url, url_received); } -TEST_F(AnchorElementInteractionTest, NoAnchorElement) { +TEST_F(AnchorElementInteractionTest, MultipleNestedAnchorElementCheck) { String source("https://example.com/p1"); SimRequest main_resource(source, "text/html"); LoadURL(source); main_resource.Complete(R"HTML( - <div style='padding: 0px; width: 400px; height: 400px;'></div> + <a id='anchor1' href='https://anchor1.com/'><p id='paragraph1id'><div + id='div1id'><div id='div2id'></div></div></p></a> + <script> + const a = document.getElementById('div2id'); + var event = new PointerEvent('pointerdown', {isPrimary: true}); + a.dispatchEvent(event); + </script> )HTML"); - SendMouseDownEvent(); + base::RunLoop().RunUntilIdle(); + KURL expected_url = KURL("https://anchor1.com/"); + EXPECT_EQ(1u, hosts_.size()); + absl::optional<KURL> url_received = hosts_[0]->url_received_; + EXPECT_TRUE(url_received.has_value()); + EXPECT_EQ(expected_url, url_received); +} + +TEST_F(AnchorElementInteractionTest, NoAnchorElementCheck) { + String source("https://example.com/p1"); + SimRequest main_resource(source, "text/html"); + LoadURL(source); + main_resource.Complete(R"HTML( + <div id='div1id'></div> + <script> + const a = document.getElementById('div2id'); + var event = new PointerEvent('pointerdown', {isPrimary: true}); + a.dispatchEvent(event); + </script> + )HTML"); base::RunLoop().RunUntilIdle(); EXPECT_EQ(1u, hosts_.size()); absl::optional<KURL> url_received = hosts_[0]->url_received_; EXPECT_FALSE(url_received.has_value()); } -TEST_F(AnchorElementInteractionTest, TouchEvent) { +TEST_F(AnchorElementInteractionTest, OneAnchorElementCheck) { String source("https://example.com/p1"); SimRequest main_resource(source, "text/html"); LoadURL(source); main_resource.Complete(R"HTML( - <a href='https://anchor1.com/'> - <div style='padding: 0px; width: 400px; height: 400px;'></div> - </a> + <a id="anchor1" href="https://anchor1.com/">foo</a> + <script> + const a = document.getElementById('anchor1'); + var event = new PointerEvent('pointerdown', {isPrimary: true}); + a.dispatchEvent(event); + </script> )HTML"); - - WebPointerEvent event( - WebInputEvent::Type::kPointerDown, - WebPointerProperties(1, WebPointerProperties::PointerType::kTouch, - WebPointerProperties::Button::kLeft, - gfx::PointF(100, 100), gfx::PointF(100, 100)), - 1, 1); - GetDocument().GetFrame()->GetEventHandler().HandlePointerEvent( - event, Vector<WebPointerEvent>(), Vector<WebPointerEvent>()); - GetDocument().GetFrame()->GetEventHandler().DispatchBufferedTouchEvents(); - base::RunLoop().RunUntilIdle(); KURL expected_url = KURL("https://anchor1.com/"); EXPECT_EQ(1u, hosts_.size());
diff --git a/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.cc b/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.cc index d1ff5a2a..04daab3 100644 --- a/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.cc +++ b/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.cc
@@ -5,13 +5,12 @@ #include "third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/common/input/web_pointer_properties.h" #include "third_party/blink/public/mojom/loader/anchor_element_interaction_host.mojom-blink.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/event_type_names.h" -#include "third_party/blink/renderer/core/events/pointer_event.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/local_frame.h" +#include "third_party/blink/renderer/core/loader/anchor_element_listener.h" #include "third_party/blink/renderer/platform/heap/persistent.h" namespace blink { @@ -19,6 +18,16 @@ AnchorElementInteractionTracker::AnchorElementInteractionTracker( Document& document) : interaction_host_(document.GetExecutionContext()) { + base::RepeatingCallback<void(const KURL&)> callback = + WTF::BindRepeating(&AnchorElementInteractionTracker::OnPointerDown, + WrapWeakPersistent(this)); + + anchor_element_listener_ = + MakeGarbageCollected<AnchorElementListener>(callback); + + document.addEventListener(event_type_names::kPointerdown, + anchor_element_listener_, true); + document.GetFrame()->GetBrowserInterfaceBroker().GetInterface( interaction_host_.BindNewPipeAndPassReceiver( document.GetExecutionContext()->GetTaskRunner( @@ -26,6 +35,7 @@ } void AnchorElementInteractionTracker::Trace(Visitor* visitor) const { + visitor->Trace(anchor_element_listener_); visitor->Trace(interaction_host_); } @@ -34,50 +44,8 @@ return base::FeatureList::IsEnabled(features::kAnchorElementInteraction); } -void AnchorElementInteractionTracker::OnPointerDown( - EventTarget& target, - const PointerEvent& pointer_event) { - if (!target.ToNode()) { - return; - } - if (!pointer_event.isPrimary()) { - return; - } - // TODO(crbug.com/1297312): Check if user changed the default mouse settings - if (pointer_event.button() != - static_cast<int>(WebPointerProperties::Button::kLeft) && - pointer_event.button() != - static_cast<int>(WebPointerProperties::Button::kMiddle)) { - return; - } - HTMLAnchorElement* anchor = FirstAnchorElementIncludingSelf(target.ToNode()); - if (!anchor) { - return; - } - KURL url = GetHrefEligibleForPreloading(*anchor); - if (url.IsEmpty()) { - return; - } +void AnchorElementInteractionTracker::OnPointerDown(const KURL& url) { interaction_host_->OnPointerDown(url); } -HTMLAnchorElement* -AnchorElementInteractionTracker::FirstAnchorElementIncludingSelf(Node* node) { - HTMLAnchorElement* anchor = nullptr; - while (node && !anchor) { - anchor = DynamicTo<HTMLAnchorElement>(node); - node = node->parentNode(); - } - return anchor; -} - -KURL AnchorElementInteractionTracker::GetHrefEligibleForPreloading( - const HTMLAnchorElement& anchor) { - KURL url = anchor.Href(); - if (url.ProtocolIsInHTTPFamily()) { - return url; - } - return KURL(); -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.h b/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.h index 2029987..44d8d097 100644 --- a/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.h +++ b/third_party/blink/renderer/core/loader/anchor_element_interaction_tracker.h
@@ -6,25 +6,22 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_ANCHOR_ELEMENT_INTERACTION_TRACKER_H_ #include "third_party/blink/public/mojom/loader/anchor_element_interaction_host.mojom-blink.h" -#include "third_party/blink/renderer/core/html/html_anchor_element.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/member.h" #include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h" namespace blink { +class AnchorElementListener; class Document; -class EventTarget; -class HTMLAnchorElement; class KURL; -class Node; -class PointerEvent; -// Tracks pointerdown events anywhere on a document. On receiving a pointerdown -// event, the tracker will retrieve the valid href from the anchor element from -// the event and will report the href value to the browser process via Mojo. The -// browser process can use this information to preload (e.g. preconnect to the -// origin) the URL in order to improve performance. +// Creates an event listener for mousedown events anywhere on a document. +// If there is one, the listener will retrieve the valid href from the anchor +// element from the event. The tracker will report the href value to the +// browser process via Mojo. The browser process can use this information +// to preload (e.g. preconnect the origin) the URL in order to improve +// performance. class AnchorElementInteractionTracker : public GarbageCollected<AnchorElementInteractionTracker> { public: @@ -32,17 +29,12 @@ static bool IsFeatureEnabled(); - void OnPointerDown(EventTarget& target, const PointerEvent& pointer_event); + void OnPointerDown(const KURL& url); void Trace(Visitor* visitor) const; private: - HTMLAnchorElement* FirstAnchorElementIncludingSelf(Node* node); - - // Gets the `anchor's` href attribute if it is part - // of the HTTP family - KURL GetHrefEligibleForPreloading(const HTMLAnchorElement& anchor); - + Member<AnchorElementListener> anchor_element_listener_; HeapMojoRemote<mojom::blink::AnchorElementInteractionHost> interaction_host_; };
diff --git a/third_party/blink/renderer/core/loader/anchor_element_listener.cc b/third_party/blink/renderer/core/loader/anchor_element_listener.cc new file mode 100644 index 0000000..7770745 --- /dev/null +++ b/third_party/blink/renderer/core/loader/anchor_element_listener.cc
@@ -0,0 +1,78 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/loader/anchor_element_listener.h" +#include "third_party/blink/public/common/input/web_pointer_properties.h" +#include "third_party/blink/renderer/core/dom/events/event.h" +#include "third_party/blink/renderer/core/events/pointer_event.h" +#include "third_party/blink/renderer/core/html/html_anchor_element.h" +#include "third_party/blink/renderer/platform/weborigin/kurl.h" + +namespace blink { + +AnchorElementListener::AnchorElementListener( + base::RepeatingCallback<void(const KURL&)> callback) + : tracker_callback_(std::move(callback)) {} + +void AnchorElementListener::Invoke(ExecutionContext* execution_context, + Event* event) { + if (!event->target()) { + return; + } + if (!event->target()->ToNode()) { + return; + } + if (!event->target()->ToNode()->IsHTMLElement()) { + return; + } + PointerEvent* pointer_event = DynamicTo<PointerEvent>(event); + if (!pointer_event) { + // Pages are allowed to dispatch any event to the 'pointerdown' type, which + // may result in this code running with an |event| that is not of type + // PointerEvent. + return; + } + if (!pointer_event->isPrimary()) { + return; + } + // TODO(crbug.com/1297312): Check if user changed the default mouse settings + if (pointer_event->button() != + static_cast<int>(WebPointerProperties::Button::kLeft) && + pointer_event->button() != + static_cast<int>(WebPointerProperties::Button::kMiddle)) { + return; + } + Node* node = event->srcElement()->ToNode(); + HTMLAnchorElement* html_anchor_element = + FirstAnchorElementIncludingSelf(node); + if (!html_anchor_element) { + return; + } + KURL anchor_url = GetHrefEligibleForPreloading(*html_anchor_element); + if (anchor_url.IsEmpty()) { + return; + } + tracker_callback_.Run(anchor_url); +} + +HTMLAnchorElement* AnchorElementListener::FirstAnchorElementIncludingSelf( + Node* node) { + HTMLAnchorElement* html_anchor_element = nullptr; + while (node && !html_anchor_element) { + html_anchor_element = DynamicTo<HTMLAnchorElement>(node); + node = node->parentNode(); + } + return html_anchor_element; +} + +KURL AnchorElementListener::GetHrefEligibleForPreloading( + const HTMLAnchorElement& html_anchor_element) { + KURL url = html_anchor_element.Href(); + if (url.ProtocolIsInHTTPFamily()) { + return url; + } + return KURL(""); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/loader/anchor_element_listener.h b/third_party/blink/renderer/core/loader/anchor_element_listener.h new file mode 100644 index 0000000..dac0832b --- /dev/null +++ b/third_party/blink/renderer/core/loader/anchor_element_listener.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 THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_ANCHOR_ELEMENT_LISTENER_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_ANCHOR_ELEMENT_LISTENER_H_ + +#include "base/callback.h" +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/dom/events/native_event_listener.h" + +namespace blink { + +class Node; +class Event; +class HTMLAnchorElement; +class KURL; +class ExecutionContext; + +// Listens for kPointerdown events, and checks to see if an anchor +// element is clicked with a valid href to be eligible for preloading. +class CORE_EXPORT AnchorElementListener : public NativeEventListener { + public: + explicit AnchorElementListener( + base::RepeatingCallback<void(const KURL&)> callback); + + void Invoke(ExecutionContext* execution_context, Event* event) override; + + private: + HTMLAnchorElement* FirstAnchorElementIncludingSelf(Node* node); + + // Gets the `html_anchor_element's` href attribute if it is part + // of the HTTP family + KURL GetHrefEligibleForPreloading( + const HTMLAnchorElement& html_anchor_element); + + base::RepeatingCallback<void(const KURL&)> tracker_callback_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_ANCHOR_ELEMENT_LISTENER_H_
diff --git a/third_party/blink/renderer/core/loader/build.gni b/third_party/blink/renderer/core/loader/build.gni index f524f57..ade2715a 100644 --- a/third_party/blink/renderer/core/loader/build.gni +++ b/third_party/blink/renderer/core/loader/build.gni
@@ -5,6 +5,8 @@ blink_core_sources_loader = [ "alternate_signed_exchange_resource_info.cc", "alternate_signed_exchange_resource_info.h", + "anchor_element_listener.cc", + "anchor_element_listener.h", "anchor_element_interaction_tracker.cc", "anchor_element_interaction_tracker.h", "back_forward_cache_loader_helper_impl.cc",
diff --git a/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.cc b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.cc index 76149b1..933cac6 100644 --- a/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.cc +++ b/third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.cc
@@ -4,7 +4,7 @@ #include "third_party/blink/renderer/core/loader/web_bundle/script_web_bundle.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/html/cross_origin_attribute.h"
diff --git a/third_party/blink/renderer/core/paint/theme_painter.cc b/third_party/blink/renderer/core/paint/theme_painter.cc index 60a3ee0e..0fee24e 100644 --- a/third_party/blink/renderer/core/paint/theme_painter.cc +++ b/third_party/blink/renderer/core/paint/theme_painter.cc
@@ -22,7 +22,7 @@ #include "third_party/blink/renderer/core/paint/theme_painter.h" #include "build/build_config.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/core/dom/shadow_root.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h"
diff --git a/third_party/blink/renderer/core/script/pending_script.cc b/third_party/blink/renderer/core/script/pending_script.cc index 0002265..acf09dc 100644 --- a/third_party/blink/renderer/core/script/pending_script.cc +++ b/third_party/blink/renderer/core/script/pending_script.cc
@@ -27,7 +27,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/mojom/script/script_type.mojom-shared.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_controller.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" #include "third_party/blink/renderer/core/dom/document.h"
diff --git a/third_party/blink/renderer/core/script/value_wrapper_synthetic_module_script.cc b/third_party/blink/renderer/core/script/value_wrapper_synthetic_module_script.cc index 140fd8e..59d1ca63 100644 --- a/third_party/blink/renderer/core/script/value_wrapper_synthetic_module_script.cc +++ b/third_party/blink/renderer/core/script/value_wrapper_synthetic_module_script.cc
@@ -5,7 +5,7 @@ #include "third_party/blink/renderer/core/script/value_wrapper_synthetic_module_script.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/web_vector.h" #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
diff --git a/third_party/blink/renderer/core/scroll/scroll_into_view_util.cc b/third_party/blink/renderer/core/scroll/scroll_into_view_util.cc index d8f3f64f..049aca8d 100644 --- a/third_party/blink/renderer/core/scroll/scroll_into_view_util.cc +++ b/third_party/blink/renderer/core/scroll/scroll_into_view_util.cc
@@ -6,6 +6,9 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink.h" +#include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/execution_context/security_context.h" +#include "third_party/blink/renderer/core/frame/frame.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/visual_viewport.h" #include "third_party/blink/renderer/core/html/html_frame_owner_element.h" @@ -14,14 +17,54 @@ #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/page/chrome_client.h" +#include "third_party/blink/renderer/core/page/frame_tree.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/scroll/smooth_scroll_sequencer.h" +#include "third_party/blink/renderer/platform/weborigin/security_origin.h" #include "ui/gfx/geometry/rect_f.h" namespace blink { namespace { +// Returns true if a scroll into view can continue to cause scrolling in the +// parent frame. +bool AllowedToPropagateToParent( + const LocalFrame& from_frame, + const mojom::blink::ScrollIntoViewParamsPtr& params) { + // Focused editable scrolling (i.e. scroll an input the user tapped on) + // always originates from a user action in the browser so it should always be + // allowed to cross origins and we shouldn't stop it for policy or other + // reasons. + DCHECK(!params->for_focused_editable || params->cross_origin_boundaries); + if (params->for_focused_editable) + return true; + + // TODO(bokan): For now, we'll do the safe thing and just block all other + // types of scrollIntoView from propagating out of a fenced frame but we may + // need to loosen this if we find other critical use cases. + // https://crbug.com/1324816. + if (from_frame.IsFencedFrameRoot()) + return false; + + if (!params->cross_origin_boundaries) { + Frame* parent_frame = from_frame.Tree().Parent(); + if (parent_frame && + !parent_frame->GetSecurityContext()->GetSecurityOrigin()->CanAccess( + from_frame.GetSecurityContext()->GetSecurityOrigin())) { + return false; + } + } + + if (params->type != mojom::blink::ScrollType::kProgrammatic) + return true; + + if (!from_frame.GetDocument()) + return true; + + return !from_frame.GetDocument()->IsVerticalScrollEnforced(); +} + // Helper to return the parent LayoutBox, crossing local frame boundaries, that // a scroll should bubble up to or nullptr if the local root has been reached. // The return optional will be empty if the scroll is blocked from bubbling to @@ -42,7 +85,7 @@ // Otherwise, we're bubbling across a frame boundary. We may be // prevented from doing so for security or policy reasons. If so, we're // done. - if (!box.GetFrame()->View()->AllowedToPropagateScrollIntoView(params)) + if (!AllowedToPropagateToParent(*box.GetFrame(), params)) return absl::nullopt; if (!box.GetFrame()->IsLocalRoot()) { @@ -68,9 +111,9 @@ // Helper that reveals the given rect, given in absolute coordinates, by // scrolling the given `box` LayoutBox and then all its ancestors up to the // local root frame. To continue the reveal through remote ancestors, use -// LayoutObject::ScrollRectToVisible. Returns the updated absolute rect, in the -// absolute coordinates of the frame in which the scroll stopped (either due to -// reaching a local root or a frame which isn't allowed to bubble scrolls. +// LayoutObject::ScrollRectToVisible. If the scroll bubbled up to the local +// root successfully, returns the updated absolute rect in the absolute +// coordinates of the local root. Otherwise returns an empty optional. absl::optional<PhysicalRect> PerformBubblingScrollIntoView( const LayoutBox& box, const PhysicalRect& absolute_rect, @@ -95,10 +138,13 @@ // if the stop_at_main_frame_layout_viewport option is set. We do this so // that we can allow a smooth "scroll and zoom" animation to do the final // scroll in cases like scrolling a focused editable box into view. - // TODO(bokan): This may need to account for fenced frames. + // TODO(bokan): Ensure a fenced frame doesn't get a global root scroller + // and then remove the !IsInFencedFrameTree condition. // https://crbug.com/1314858 - if (params->for_focused_editable && current_box->IsGlobalRootScroller()) + if (!current_box->GetFrame()->IsInFencedFrameTree() && + params->for_focused_editable && current_box->IsGlobalRootScroller()) { break; + } ScrollableArea* area_to_scroll = nullptr; @@ -168,6 +214,54 @@ namespace scroll_into_view_util { +void ScrollRectToVisible(const LayoutObject& layout_object, + const PhysicalRect& absolute_rect, + mojom::blink::ScrollIntoViewParamsPtr params) { + LayoutBox* enclosing_box = layout_object.EnclosingBox(); + if (!enclosing_box) + return; + + LocalFrame* frame = layout_object.GetFrame(); + + frame->GetSmoothScrollSequencer().AbortAnimations(); + frame->GetSmoothScrollSequencer().SetScrollType(params->type); + params->is_for_scroll_sequence |= + params->type == mojom::blink::ScrollType::kProgrammatic; + + absl::optional<PhysicalRect> updated_absolute_rect = + PerformBubblingScrollIntoView(*enclosing_box, absolute_rect, params); + + frame->GetSmoothScrollSequencer().RunQueuedAnimations(); + + // If the scroll into view stopped early (i.e. before the local root), + // there's no need to continue bubbling or finishing a scroll focused + // editable into view. + if (!updated_absolute_rect) + return; + + LocalFrame& local_root = frame->LocalFrameRoot(); + LocalFrameView* local_root_view = local_root.View(); + + if (!local_root_view) + return; + + if (!local_root.IsOutermostMainFrame()) { + // Continue the scroll via IPC if there's a remote ancestor. + if (AllowedToPropagateToParent(local_root, params)) { + local_root_view->ScrollRectToVisibleInRemoteParent(*updated_absolute_rect, + std::move(params)); + } + } else if (params->for_focused_editable) { + // If we're scrolling a focused editable into view, once we reach the main + // frame we need to perform an animated scroll and zoom to bring the + // editable into a legible size. + gfx::RectF caret_rect_in_root_frame(*updated_absolute_rect); + DCHECK(!caret_rect_in_root_frame.IsEmpty()); + local_root.GetPage()->GetChromeClient().FinishScrollFocusedEditableIntoView( + caret_rect_in_root_frame, std::move(params)); + } +} + gfx::RectF FocusedEditableBoundsFromParams( const gfx::RectF& caret_rect, const mojom::blink::ScrollIntoViewParamsPtr& params) { @@ -206,56 +300,6 @@ params->for_focused_editable->size = gfx::SizeF(editable_bounds_in_dest.size); } -void ScrollRectToVisible(const LayoutObject& layout_object, - const PhysicalRect& absolute_rect, - mojom::blink::ScrollIntoViewParamsPtr params) { - LayoutBox* enclosing_box = layout_object.EnclosingBox(); - if (!enclosing_box) - return; - - LocalFrame* frame = layout_object.GetFrame(); - - frame->GetSmoothScrollSequencer().AbortAnimations(); - frame->GetSmoothScrollSequencer().SetScrollType(params->type); - params->is_for_scroll_sequence |= - params->type == mojom::blink::ScrollType::kProgrammatic; - - absl::optional<PhysicalRect> updated_absolute_rect = - PerformBubblingScrollIntoView(*enclosing_box, absolute_rect, params); - - frame->GetSmoothScrollSequencer().RunQueuedAnimations(); - - // If the scroll into view stopped early (i.e. before the local root), - // there's no need to continue bubbling or finishing a scroll focused - // editable into view. - if (!updated_absolute_rect) - return; - - LocalFrame& local_root = frame->LocalFrameRoot(); - LocalFrameView* local_root_view = local_root.View(); - - if (!local_root_view) - return; - - if (!local_root.IsMainFrame()) { - // Continue the scroll via IPC if there's a remote ancestor. - // TODO(bokan): This probably needs to happen fenced frames in at least some - // cases. crbug.com/1314858. - if (local_root_view->AllowedToPropagateScrollIntoView(params)) { - local_root_view->ScrollRectToVisibleInRemoteParent(*updated_absolute_rect, - std::move(params)); - } - } else if (params->for_focused_editable) { - // If we're scrolling a focused editable into view, once we reach the main - // frame we need to perform an animated scroll and zoom to bring the - // editable into a legible size. - gfx::RectF caret_rect_in_root_frame(*updated_absolute_rect); - DCHECK(!caret_rect_in_root_frame.IsEmpty()); - local_root.GetPage()->GetChromeClient().FinishScrollFocusedEditableIntoView( - caret_rect_in_root_frame, std::move(params)); - } -} - } // namespace scroll_into_view_util } // namespace blink
diff --git a/third_party/blink/renderer/core/scroll/scroll_into_view_util.h b/third_party/blink/renderer/core/scroll/scroll_into_view_util.h index c5226c9..9ef1c3b 100644 --- a/third_party/blink/renderer/core/scroll/scroll_into_view_util.h +++ b/third_party/blink/renderer/core/scroll/scroll_into_view_util.h
@@ -20,6 +20,14 @@ namespace scroll_into_view_util { +// Takes the given rect, in absolute coordinates of the frame of the given +// LayoutObject, and scrolls the LayoutObject and all its containers such that +// the child content of the LayoutObject at that rect is visible in the +// viewport. +void CORE_EXPORT ScrollRectToVisible(const LayoutObject&, + const PhysicalRect&, + mojom::blink::ScrollIntoViewParamsPtr); + // ScrollFocusedEditableIntoView uses the caret rect for ScrollIntoView but // stores enough information in `params` so that the editable element's bounds // can be reconstructed. Given `caret_rect`, this will return the editable @@ -36,14 +44,6 @@ const LayoutObject& src_frame, const LayoutView& dest_frame); -// Takes the given rect, in absolute coordinates of the frame of the given -// LayoutObject, and scrolls the LayoutObject and all its containers such that -// the child content of the LayoutObject at that rect is visible in the -// viewport. -void CORE_EXPORT ScrollRectToVisible(const LayoutObject&, - const PhysicalRect&, - mojom::blink::ScrollIntoViewParamsPtr); - } // namespace scroll_into_view_util } // namespace blink
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc index ab10fb9..0357826 100644 --- a/third_party/blink/renderer/core/style/computed_style.cc +++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -560,10 +560,6 @@ if (!HasCachedPseudoElementStyles()) return nullptr; - if (StyleType() != kPseudoIdNone && - StyleType() != kPseudoIdFirstLineInherited) - return nullptr; - for (const auto& pseudo_style : *GetPseudoElementStyleCache()) { if (pseudo_style->StyleType() == pseudo_id && (!PseudoElementHasArguments(pseudo_id) || @@ -613,6 +609,26 @@ return result; } +const ComputedStyle* ComputedStyle::ReplaceCachedPseudoElementStyle( + scoped_refptr<const ComputedStyle> pseudo_style, + PseudoId pseudo_id, + const AtomicString& pseudo_argument) const { + DCHECK(pseudo_style->StyleType() != kPseudoIdNone && + pseudo_style->StyleType() != kPseudoIdFirstLineInherited); + if (HasCachedPseudoElementStyles()) { + for (auto& cached_style : *GetPseudoElementStyleCache()) { + if (cached_style->StyleType() == pseudo_id && + (!PseudoElementHasArguments(pseudo_id) || + cached_style->PseudoArgument() == pseudo_argument)) { + SECURITY_CHECK(cached_style->IsEnsuredInDisplayNone()); + cached_style = pseudo_style; + return pseudo_style.get(); + } + } + } + return AddCachedPseudoElementStyle(pseudo_style, pseudo_id, pseudo_argument); +} + void ComputedStyle::ClearCachedPseudoElementStyles() const { if (cached_data_ && cached_data_->pseudo_element_styles_) cached_data_->pseudo_element_styles_->clear();
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h index 9c32287d..872aea1 100644 --- a/third_party/blink/renderer/core/style/computed_style.h +++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -425,6 +425,10 @@ scoped_refptr<const ComputedStyle>, PseudoId, const AtomicString&) const; + const ComputedStyle* ReplaceCachedPseudoElementStyle( + scoped_refptr<const ComputedStyle> pseudo_style, + PseudoId pseudo_id, + const AtomicString& pseudo_argument) const; void ClearCachedPseudoElementStyles() const; // If this ComputedStyle is affected by animation/transitions, then the
diff --git a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 index 24996ea..4de8821f 100644 --- a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 +++ b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
@@ -250,6 +250,15 @@ custom_compare: true, computed_style_custom_functions: ["getter", "setter"], }, + { + name: "HasNonUniversalHighlightPseudoStyles", + field_template: "primitive", + field_group: "*", + default_value: "false", + type_name: "bool", + custom_copy: true, + custom_compare: true, + }, // Used by ::highlight { name: "PseudoArgument", @@ -777,17 +786,6 @@ field_template: "monotonic_flag", default_value: "false", }, - // If this highlight pseudo matches only universal highlight rules (like - // ::selection) for both this element and our child, then the child need - // not apply any matched properties, because the result will be the same. - { - name: "DidMatchNonUniversalHighlights", - field_template: "primitive", - field_group: "inherited", - type_name: "bool", - default_value: "false", - inherited: true, - }, { name: "ColorIsCurrentColor", field_template: "primitive",
diff --git a/third_party/blink/renderer/core/style/style_generated_image.cc b/third_party/blink/renderer/core/style/style_generated_image.cc index 7f71027..e1d9ed3 100644 --- a/third_party/blink/renderer/core/style/style_generated_image.cc +++ b/third_party/blink/renderer/core/style/style_generated_image.cc
@@ -45,6 +45,8 @@ if (!other.IsGeneratedImage()) return false; const auto& other_generated = To<StyleGeneratedImage>(other); + if (!container_sizes_.SizesEqual(other_generated.container_sizes_)) + return false; return image_generator_value_ == other_generated.image_generator_value_; }
diff --git a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc index 04138a1..7d7d9e7d 100644 --- a/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc +++ b/third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.cc
@@ -4,7 +4,7 @@ #include "third_party/blink/renderer/core/trustedtypes/trusted_type_policy_factory.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/v8_trusted_html.h" #include "third_party/blink/renderer/bindings/core/v8/v8_trusted_script.h"
diff --git a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc index 35d265d..e08920bf 100644 --- a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc +++ b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
@@ -35,7 +35,7 @@ #include "services/metrics/public/cpp/mojo_ukm_recorder.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/source_location.h" #include "third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h" #include "third_party/blink/renderer/core/event_target_names.h"
diff --git a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc index ce37cda..47f919d 100644 --- a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc +++ b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc
@@ -13,7 +13,7 @@ #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" #include "third_party/blink/public/mojom/loader/content_security_notifier.mojom-blink.h" #include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/web_content_security_policy_struct.h"
diff --git a/third_party/blink/renderer/core/workers/worklet.cc b/third_party/blink/renderer/core/workers/worklet.cc index 074968e..0bd475c 100644 --- a/third_party/blink/renderer/core/workers/worklet.cc +++ b/third_party/blink/renderer/core/workers/worklet.cc
@@ -7,7 +7,7 @@ #include "base/task/single_thread_task_runner.h" #include "services/network/public/mojom/fetch_api.mojom-blink.h" #include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
diff --git a/third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.cc b/third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.cc index f6b1916..010c5d6 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.cc
@@ -4,7 +4,7 @@ #include "third_party/blink/renderer/modules/accessibility/ax_sparse_attribute_setter.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/dom/qualified_name.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h"
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc index ab98620b..5b99f53 100644 --- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc +++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
@@ -533,7 +533,19 @@ "cannot be resolved to a valid URL.")); return false; } - // TODO(https://crbug.com/1271540): Validate against seller origin. + + // Need to check scheme of the URL in addition to comparing origins because + // FLEDGE currently only supports HTTPS URLs, and some non-HTTPS URLs can have + // HTTPS origins. + if (decision_logic_url.Protocol() != url::kHttpsScheme || + !output.seller->IsSameOriginWith( + SecurityOrigin::Create(decision_logic_url).get())) { + exception_state.ThrowTypeError(ErrorInvalidAuctionConfig( + input, "decisionLogicUrl", input.decisionLogicUrl(), + "must match seller origin.")); + return false; + } + output.decision_logic_url = decision_logic_url; return true; } @@ -553,7 +565,19 @@ "cannot be resolved to a valid URL.")); return false; } - // TODO(https://crbug.com/1271540): Validate against seller origin. + + // Need to check scheme of the URL in addition to comparing origins because + // FLEDGE currently only supports HTTPS URLs, and some non-HTTPS URLs can have + // HTTPS origins. + if (trusted_scoring_signals_url.Protocol() != url::kHttpsScheme || + !output.seller->IsSameOriginWith( + SecurityOrigin::Create(trusted_scoring_signals_url).get())) { + exception_state.ThrowTypeError(ErrorInvalidAuctionConfig( + input, "trustedScoringSignalsUrl", input.trustedScoringSignalsUrl(), + "must match seller origin.")); + return false; + } + output.trusted_scoring_signals_url = trusted_scoring_signals_url; return true; } @@ -1345,20 +1369,20 @@ auto mojo_config = mojom::blink::AuctionAdConfig::New(); // For finalizing an Ad PARAKEET only really cares about the decisionLogicUrl, - // auctionSignals, sellerSignals, and perBuyerSignals. We can ignore + // auctionSignals, sellerSignals, and perBuyerSignals. Also need seller, since + // it's used to validate the decision logic URL. We can ignore // copying/validating other fields on AuctionAdConfig. - if (!CopyDecisionLogicUrlFromIdlToMojo(*context, exception_state, *config, - *mojo_config)) + if (!CopySellerFromIdlToMojo(exception_state, *config, *mojo_config) || + !CopyDecisionLogicUrlFromIdlToMojo(*context, exception_state, *config, + *mojo_config) || + !CopyAuctionSignalsFromIdlToMojo(*script_state, exception_state, *config, + *mojo_config) || + !CopySellerSignalsFromIdlToMojo(*script_state, exception_state, *config, + *mojo_config) || + !CopyPerBuyerSignalsFromIdlToMojo(*script_state, exception_state, *config, + *mojo_config)) { return ScriptPromise(); - if (!CopyAuctionSignalsFromIdlToMojo(*script_state, exception_state, *config, - *mojo_config)) - return ScriptPromise(); - if (!CopySellerSignalsFromIdlToMojo(*script_state, exception_state, *config, - *mojo_config)) - return ScriptPromise(); - if (!CopyPerBuyerSignalsFromIdlToMojo(*script_state, exception_state, *config, - *mojo_config)) - return ScriptPromise(); + } if (!ValidateAdsObject(exception_state, ads)) return ScriptPromise();
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc index 1a9980d2d..701546d 100644 --- a/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc +++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc
@@ -11,7 +11,7 @@ #include "third_party/blink/public/common/privacy_budget/identifiability_metric_builder.h" #include "third_party/blink/public/common/privacy_budget/identifiable_surface.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/core/v8/v8_union_request_usvstring.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_cache_query_options.h"
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.cc index f9adee8..447d8303 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.cc +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.cc
@@ -4,7 +4,7 @@ #include "third_party/blink/renderer/modules/breakout_box/media_stream_track_generator.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_stream_track_generator_init.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h"
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_track_processor.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_track_processor.cc index 267be57..2e52c83 100644 --- a/third_party/blink/renderer/modules/breakout_box/media_stream_track_processor.cc +++ b/third_party/blink/renderer/modules/breakout_box/media_stream_track_processor.cc
@@ -4,7 +4,7 @@ #include "third_party/blink/renderer/modules/breakout_box/media_stream_track_processor.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_stream_track_processor_init.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/streams/readable_stream.h"
diff --git a/third_party/blink/renderer/modules/breakout_box/video_track_generator.cc b/third_party/blink/renderer/modules/breakout_box/video_track_generator.cc index d01c659..9d43d76f 100644 --- a/third_party/blink/renderer/modules/breakout_box/video_track_generator.cc +++ b/third_party/blink/renderer/modules/breakout_box/video_track_generator.cc
@@ -4,7 +4,7 @@ #include "third_party/blink/renderer/modules/breakout_box/video_track_generator.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_video_track_generator.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h"
diff --git a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc index ac53b00..0e7c1b13 100644 --- a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc +++ b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc
@@ -8,7 +8,7 @@ #include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h" #include "third_party/blink/renderer/core/event_target_names.h"
diff --git a/third_party/blink/renderer/modules/browsing_topics/browsing_topics_document_supplement.cc b/third_party/blink/renderer/modules/browsing_topics/browsing_topics_document_supplement.cc index 80f742e..8b0db2d6 100644 --- a/third_party/blink/renderer/modules/browsing_topics/browsing_topics_document_supplement.cc +++ b/third_party/blink/renderer/modules/browsing_topics/browsing_topics_document_supplement.cc
@@ -9,7 +9,7 @@ #include "third_party/blink/public/mojom/permissions_policy/document_policy_feature.mojom-blink.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-blink.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h"
diff --git a/third_party/blink/renderer/modules/device_orientation/device_orientation_absolute_controller.cc b/third_party/blink/renderer/modules/device_orientation/device_orientation_absolute_controller.cc index 4b9fcda3..48e095e 100644 --- a/third_party/blink/renderer/modules/device_orientation/device_orientation_absolute_controller.cc +++ b/third_party/blink/renderer/modules/device_orientation/device_orientation_absolute_controller.cc
@@ -5,7 +5,7 @@ #include "third_party/blink/renderer/modules/device_orientation/device_orientation_absolute_controller.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/modules/device_orientation/device_orientation_event_pump.h"
diff --git a/third_party/blink/renderer/modules/donottrack/OWNERS b/third_party/blink/renderer/modules/donottrack/OWNERS deleted file mode 100644 index d691287..0000000 --- a/third_party/blink/renderer/modules/donottrack/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -jochen@chromium.org
diff --git a/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc b/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc index efaca465..7c6f3b3 100644 --- a/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc +++ b/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc
@@ -27,7 +27,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/web_encrypted_media_client.h"
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.cc b/third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.cc index 6fe841b3..11f61392 100644 --- a/third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.cc +++ b/third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.cc
@@ -5,7 +5,7 @@ #include "third_party/blink/renderer/modules/media_controls/media_controls_shared_helper.h" #include <cmath> -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/dom/events/event.h" #include "third_party/blink/renderer/core/fullscreen/fullscreen.h" #include "third_party/blink/renderer/core/html/media/html_media_element.h"
diff --git a/third_party/blink/renderer/modules/payments/payment_instruments.cc b/third_party/blink/renderer/modules/payments/payment_instruments.cc index ae80b84..c9d8b9c8 100644 --- a/third_party/blink/renderer/modules/payments/payment_instruments.cc +++ b/third_party/blink/renderer/modules/payments/payment_instruments.cc
@@ -10,7 +10,7 @@ #include "third_party/blink/public/common/permissions_policy/permissions_policy.h" #include "third_party/blink/public/mojom/manifest/manifest.mojom-blink.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/web_icon_sizes_parser.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
diff --git a/third_party/blink/renderer/modules/payments/payment_request.cc b/third_party/blink/renderer/modules/payments/payment_request.cc index 5cedec1b..58200da 100644 --- a/third_party/blink/renderer/modules/payments/payment_request.cc +++ b/third_party/blink/renderer/modules/payments/payment_request.cc
@@ -14,7 +14,7 @@ #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h"
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc index 650b074f..e52a22f 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -45,7 +45,7 @@ #include "services/metrics/public/cpp/ukm_builders.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/features.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/web_crypto_algorithm_params.h"
diff --git a/third_party/blink/renderer/modules/plugins/navigator_plugins.cc b/third_party/blink/renderer/modules/plugins/navigator_plugins.cc index 22e5f26..731abb7 100644 --- a/third_party/blink/renderer/modules/plugins/navigator_plugins.cc +++ b/third_party/blink/renderer/modules/plugins/navigator_plugins.cc
@@ -7,7 +7,7 @@ #include "third_party/blink/public/common/privacy_budget/identifiability_metric_builder.h" #include "third_party/blink/public/common/privacy_budget/identifiability_study_settings.h" #include "third_party/blink/public/common/privacy_budget/identifiable_token_builder.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/navigator.h" #include "third_party/blink/renderer/core/frame/settings.h"
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc index 1a0706c..03f13bfa 100644 --- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc +++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc
@@ -4,7 +4,7 @@ #include "sanitizer.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/v8_node_filter.h" #include "third_party/blink/renderer/bindings/core/v8/v8_parse_from_string_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_union_document_documentfragment.h"
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc index 7c1b2c7..ad37b694 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
@@ -52,7 +52,7 @@ #include "third_party/blink/public/mojom/service_worker/service_worker_fetch_response_callback.mojom-blink.h" #include "third_party/blink/public/mojom/service_worker/service_worker_stream_handle.mojom-blink.h" #include "third_party/blink/public/mojom/timing/worker_timing_container.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_error.h" #include "third_party/blink/public/platform/platform.h"
diff --git a/third_party/blink/renderer/modules/shapedetection/barcode_detector_statics.cc b/third_party/blink/renderer/modules/shapedetection/barcode_detector_statics.cc index 31dac78..0b3cedb 100644 --- a/third_party/blink/renderer/modules/shapedetection/barcode_detector_statics.cc +++ b/third_party/blink/renderer/modules/shapedetection/barcode_detector_statics.cc
@@ -8,7 +8,7 @@ #include "third_party/blink/public/common/privacy_budget/identifiability_metric_builder.h" #include "third_party/blink/public/common/privacy_budget/identifiability_study_settings.h" #include "third_party/blink/public/common/privacy_budget/identifiable_token_builder.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h"
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage.cc b/third_party/blink/renderer/modules/shared_storage/shared_storage.cc index 2d54f79..98ff373 100644 --- a/third_party/blink/renderer/modules/shared_storage/shared_storage.cc +++ b/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
@@ -8,7 +8,6 @@ #include <tuple> #include <utility> -#include "base/threading/sequence_local_storage_slot.h" #include "base/threading/thread_task_runner_handle.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" @@ -123,6 +122,12 @@ ExecutionContext* execution_context = ExecutionContext::From(script_state); CHECK(execution_context->IsWindow()); + if (!script_state->ContextIsValid()) { + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidAccessError, + "A browsing context is required."); + return ScriptPromise(); + } + ScriptPromiseResolver* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise promise = resolver->Promise(); @@ -159,6 +164,12 @@ ExecutionContext* execution_context = ExecutionContext::From(script_state); CHECK(execution_context->IsWindow()); + if (!script_state->ContextIsValid()) { + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidAccessError, + "A browsing context is required."); + return ScriptPromise(); + } + ScriptPromiseResolver* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise promise = resolver->Promise(); @@ -192,6 +203,12 @@ ExecutionContext* execution_context = ExecutionContext::From(script_state); CHECK(execution_context->IsWindow()); + if (!script_state->ContextIsValid()) { + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidAccessError, + "A browsing context is required."); + return ScriptPromise(); + } + ScriptPromiseResolver* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise promise = resolver->Promise(); @@ -216,6 +233,12 @@ ExecutionContext* execution_context = ExecutionContext::From(script_state); CHECK(execution_context->IsWindow()); + if (!script_state->ContextIsValid()) { + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidAccessError, + "A browsing context is required."); + return ScriptPromise(); + } + ScriptPromiseResolver* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise promise = resolver->Promise(); @@ -228,17 +251,16 @@ return promise; } -ScriptPromise SharedStorage::runURLSelectionOperation( - ScriptState* script_state, - const String& name, - const Vector<String>& urls, - ExceptionState& exception_state) { - return runURLSelectionOperation( - script_state, name, urls, - SharedStorageRunOperationMethodOptions::Create(), exception_state); +ScriptPromise SharedStorage::selectURL(ScriptState* script_state, + const String& name, + const Vector<String>& urls, + ExceptionState& exception_state) { + return selectURL(script_state, name, urls, + SharedStorageRunOperationMethodOptions::Create(), + exception_state); } -ScriptPromise SharedStorage::runURLSelectionOperation( +ScriptPromise SharedStorage::selectURL( ScriptState* script_state, const String& name, const Vector<String>& urls, @@ -247,10 +269,27 @@ ExecutionContext* execution_context = ExecutionContext::From(script_state); CHECK(execution_context->IsWindow()); + if (!script_state->ContextIsValid()) { + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidAccessError, + "A browsing context is required."); + return ScriptPromise(); + } + + LocalFrame* frame = To<LocalDOMWindow>(execution_context)->GetFrame(); + DCHECK(frame); + ScriptPromiseResolver* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state); ScriptPromise promise = resolver->Promise(); + if (frame->IsInFencedFrameTree()) { + // https://github.com/pythagoraskitty/shared-storage/blob/main/README.md#url-selection + resolver->Reject(V8ThrowDOMException::CreateOrEmpty( + script_state->GetIsolate(), DOMExceptionCode::kInvalidAccessError, + "sharedStorage.selectURL() is not allowed in fenced frame.")); + return promise; + } + if (!IsValidSharedStorageURLsArrayLength(urls.size())) { resolver->Reject(V8ThrowDOMException::CreateOrEmpty( script_state->GetIsolate(), DOMExceptionCode::kDataError, @@ -302,15 +341,14 @@ return promise; } -ScriptPromise SharedStorage::runOperation(ScriptState* script_state, - const String& name, - ExceptionState& exception_state) { - return runOperation(script_state, name, - SharedStorageRunOperationMethodOptions::Create(), - exception_state); +ScriptPromise SharedStorage::run(ScriptState* script_state, + const String& name, + ExceptionState& exception_state) { + return run(script_state, name, + SharedStorageRunOperationMethodOptions::Create(), exception_state); } -ScriptPromise SharedStorage::runOperation( +ScriptPromise SharedStorage::run( ScriptState* script_state, const String& name, const SharedStorageRunOperationMethodOptions* options, @@ -318,6 +356,12 @@ ExecutionContext* execution_context = ExecutionContext::From(script_state); CHECK(execution_context->IsWindow()); + if (!script_state->ContextIsValid()) { + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidAccessError, + "A browsing context is required."); + return ScriptPromise(); + } + Vector<uint8_t> serialized_data; if (!Serialize(script_state, options, exception_state, serialized_data)) return ScriptPromise(); @@ -350,31 +394,14 @@ ExecutionContext* execution_context) { CHECK(execution_context->IsWindow()); if (!shared_storage_document_service_.is_bound()) { - LocalDOMWindow* window = To<LocalDOMWindow>(execution_context); - if (!window->GetFrame()) - return GetEmptySharedStorageDocumentService(); + LocalFrame* frame = To<LocalDOMWindow>(execution_context)->GetFrame(); + DCHECK(frame); - window->GetFrame()->GetRemoteNavigationAssociatedInterfaces()->GetInterface( + frame->GetRemoteNavigationAssociatedInterfaces()->GetInterface( shared_storage_document_service_.BindNewEndpointAndPassReceiver( execution_context->GetTaskRunner(TaskType::kMiscPlatformAPI))); } return shared_storage_document_service_.get(); } -mojom::blink::SharedStorageDocumentService* -SharedStorage::GetEmptySharedStorageDocumentService() { - static base::SequenceLocalStorageSlot< - mojo::Remote<mojom::blink::SharedStorageDocumentService>> - slot; - - if (!slot.GetValuePointer()) { - auto& remote = slot.GetOrCreateValue(); - mojo::PendingRemote<mojom::blink::SharedStorageDocumentService> - pending_remote; - std::ignore = pending_remote.InitWithNewPipeAndPassReceiver(); - remote.Bind(std::move(pending_remote), base::ThreadTaskRunnerHandle::Get()); - } - return slot.GetOrCreateValue().get(); -} - } // namespace blink
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage.h b/third_party/blink/renderer/modules/shared_storage/shared_storage.h index 9c7b858..c3d0a7f5 100644 --- a/third_party/blink/renderer/modules/shared_storage/shared_storage.h +++ b/third_party/blink/renderer/modules/shared_storage/shared_storage.h
@@ -51,23 +51,21 @@ ScriptPromise clear(ScriptState*, ExceptionState&); - ScriptPromise runURLSelectionOperation(ScriptState*, - const String& name, - const Vector<String>& urls, - ExceptionState&); - ScriptPromise runURLSelectionOperation( - ScriptState*, - const String& name, - const Vector<String>& urls, - const SharedStorageRunOperationMethodOptions* options, - ExceptionState&); + ScriptPromise selectURL(ScriptState*, + const String& name, + const Vector<String>& urls, + ExceptionState&); + ScriptPromise selectURL(ScriptState*, + const String& name, + const Vector<String>& urls, + const SharedStorageRunOperationMethodOptions* options, + ExceptionState&); - ScriptPromise runOperation(ScriptState*, const String& name, ExceptionState&); - ScriptPromise runOperation( - ScriptState*, - const String& name, - const SharedStorageRunOperationMethodOptions* options, - ExceptionState&); + ScriptPromise run(ScriptState*, const String& name, ExceptionState&); + ScriptPromise run(ScriptState*, + const String& name, + const SharedStorageRunOperationMethodOptions* options, + ExceptionState&); SharedStorageWorklet* worklet(ScriptState*, ExceptionState&);
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage.idl b/third_party/blink/renderer/modules/shared_storage/shared_storage.idl index c9b0353..7f9cb0f 100644 --- a/third_party/blink/renderer/modules/shared_storage/shared_storage.idl +++ b/third_party/blink/renderer/modules/shared_storage/shared_storage.idl
@@ -28,13 +28,13 @@ [ CallWith=ScriptState, RaisesException - ] Promise<USVString> runURLSelectionOperation(DOMString name, FrozenArray<USVString> urls, - optional SharedStorageRunOperationMethodOptions options); + ] Promise<USVString> selectURL(DOMString name, FrozenArray<USVString> urls, + optional SharedStorageRunOperationMethodOptions options); [ CallWith=ScriptState, RaisesException - ] Promise<any> runOperation(DOMString name, optional SharedStorageRunOperationMethodOptions options); + ] Promise<any> run(DOMString name, optional SharedStorageRunOperationMethodOptions options); [CallWith=ScriptState, RaisesException] readonly attribute SharedStorageWorklet worklet; };
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.cc b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.cc index 08204cad..a8e6d61 100644 --- a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.cc +++ b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.cc
@@ -29,6 +29,12 @@ ExecutionContext* execution_context = ExecutionContext::From(script_state); CHECK(execution_context->IsWindow()); + if (!script_state->ContextIsValid()) { + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidAccessError, + "A browsing context is required."); + return ScriptPromise(); + } + KURL script_source_url = execution_context->CompleteURL(module_url); auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_decoder.cc b/third_party/blink/renderer/modules/webcodecs/audio_decoder.cc index 0ffccdae..02dcb12 100644 --- a/third_party/blink/renderer/modules/webcodecs/audio_decoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/audio_decoder.cc
@@ -14,7 +14,7 @@ #include "media/base/mime_util.h" #include "media/base/supported_types.h" #include "media/base/waiting.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_audio_decoder_config.h"
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc b/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc index 3d218f9..3f61d6c 100644 --- a/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/audio_encoder.cc
@@ -22,7 +22,7 @@ #include "media/mojo/mojom/audio_encoder.mojom-blink.h" #include "media/mojo/mojom/interface_factory.mojom.h" #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h" #include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h"
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc index 7334521..3ab60d66 100644 --- a/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc +++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc
@@ -8,7 +8,7 @@ #include "base/metrics/histogram_functions.h" #include "base/task/thread_pool.h" #include "third_party/blink/public/common/mime_util/mime_util.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybufferallowshared_arraybufferviewallowshared_readablestream.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_image_decode_options.h"
diff --git a/third_party/blink/renderer/modules/webcodecs/video_decoder.cc b/third_party/blink/renderer/modules/webcodecs/video_decoder.cc index fa34d5d..3d0c902 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_decoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_decoder.cc
@@ -17,7 +17,7 @@ #include "media/base/video_aspect_ratio.h" #include "media/base/video_decoder.h" #include "media/media_buildflags.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
diff --git a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc index 47100bb..7f52e3a 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc
@@ -33,7 +33,7 @@ #include "media/video/gpu_video_accelerator_factories.h" #include "media/video/video_encode_accelerator_adapter.h" #include "media/video/video_encoder_fallback.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h"
diff --git a/third_party/blink/renderer/modules/webcodecs/video_frame.cc b/third_party/blink/renderer/modules/webcodecs/video_frame.cc index 5f618d1..a8ce91f 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_frame.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_frame.cc
@@ -22,7 +22,7 @@ #include "media/base/video_frame_pool.h" #include "media/base/video_types.h" #include "media/base/video_util.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_graphics_context_3d_provider.h" #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h"
diff --git a/third_party/blink/renderer/modules/webgpu/gpu.cc b/third_party/blink/renderer/modules/webgpu/gpu.cc index 7aa5ea9..2d38961 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu.cc
@@ -14,7 +14,7 @@ #include "third_party/blink/public/common/privacy_budget/identifiable_token_builder.h" #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/gpu/gpu.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_graphics_context_3d_provider.h" #include "third_party/blink/public/platform/web_url.h"
diff --git a/third_party/blink/renderer/platform/OWNERS b/third_party/blink/renderer/platform/OWNERS index 61e8b6c..d35f1e2d 100644 --- a/third_party/blink/renderer/platform/OWNERS +++ b/third_party/blink/renderer/platform/OWNERS
@@ -7,7 +7,6 @@ haraken@chromium.org ikilpatrick@chromium.org jbroman@chromium.org -jochen@chromium.org junov@chromium.org kbr@chromium.org kinuko@chromium.org
diff --git a/third_party/blink/renderer/platform/fonts/font_selector.cc b/third_party/blink/renderer/platform/fonts/font_selector.cc index 0108837..0df0d4f 100644 --- a/third_party/blink/renderer/platform/fonts/font_selector.cc +++ b/third_party/blink/renderer/platform/fonts/font_selector.cc
@@ -5,7 +5,7 @@ #include "third_party/blink/renderer/platform/fonts/font_selector.h" #include "build/build_config.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/platform/fonts/alternate_font_family.h" #include "third_party/blink/renderer/platform/fonts/font_cache.h" #include "third_party/blink/renderer/platform/fonts/font_description.h"
diff --git a/third_party/blink/renderer/platform/graphics/bitmap_image_metrics.cc b/third_party/blink/renderer/platform/graphics/bitmap_image_metrics.cc index 805b41c..dd90dd22 100644 --- a/third_party/blink/renderer/platform/graphics/bitmap_image_metrics.cc +++ b/third_party/blink/renderer/platform/graphics/bitmap_image_metrics.cc
@@ -9,7 +9,7 @@ #include "base/numerics/safe_conversions.h" #include "media/media_buildflags.h" #include "third_party/blink/public/common/buildflags.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/platform/graphics/color_space_gamut.h" #include "third_party/blink/renderer/platform/instrumentation/histogram.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
diff --git a/third_party/blink/renderer/platform/instrumentation/use_counter.h b/third_party/blink/renderer/platform/instrumentation/use_counter.h index 38d64973..ab51fd2f 100644 --- a/third_party/blink/renderer/platform/instrumentation/use_counter.h +++ b/third_party/blink/renderer/platform/instrumentation/use_counter.h
@@ -5,7 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_INSTRUMENTATION_USE_COUNTER_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_INSTRUMENTATION_USE_COUNTER_H_ -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink-forward.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -14,7 +14,7 @@ using WebFeature = mojom::WebFeature; // Definition for UseCounter features can be found in: -// third_party/blink/public/mojom/web_feature/web_feature.mojom +// third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom // // UseCounter is used for counting the number of times features of // Blink are used on real web pages and help us know commonly
diff --git a/third_party/blink/renderer/platform/loader/allowed_by_nosniff.cc b/third_party/blink/renderer/platform/loader/allowed_by_nosniff.cc index 1d45872..5ed1f8c 100644 --- a/third_party/blink/renderer/platform/loader/allowed_by_nosniff.cc +++ b/third_party/blink/renderer/platform/loader/allowed_by_nosniff.cc
@@ -6,7 +6,7 @@ #include "services/network/public/mojom/fetch_api.mojom-blink.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" #include "third_party/blink/renderer/platform/loader/fetch/console_logger.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_response.h"
diff --git a/third_party/blink/renderer/platform/loader/allowed_by_nosniff_test.cc b/third_party/blink/renderer/platform/loader/allowed_by_nosniff_test.cc index 23e359b..3aa1ed2b 100644 --- a/third_party/blink/renderer/platform/loader/allowed_by_nosniff_test.cc +++ b/third_party/blink/renderer/platform/loader/allowed_by_nosniff_test.cc
@@ -6,7 +6,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" #include "third_party/blink/renderer/platform/loader/fetch/console_logger.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc index a523845..99c913e 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -45,7 +45,7 @@ #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h" #include "third_party/blink/public/platform/web_back_forward_cache_loader_helper.h"
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc index eea0b75a..695bf719 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc
@@ -105,10 +105,16 @@ class ResourceFetcherTest : public testing::Test { public: - ResourceFetcherTest() = default; + ResourceFetcherTest() { + Resource::SetClockForTesting(platform_->test_task_runner()->GetMockClock()); + } + ~ResourceFetcherTest() override { + GetMemoryCache()->EvictResources(); + Resource::SetClockForTesting(nullptr); + } + ResourceFetcherTest(const ResourceFetcherTest&) = delete; ResourceFetcherTest& operator=(const ResourceFetcherTest&) = delete; - ~ResourceFetcherTest() override { GetMemoryCache()->EvictResources(); } class TestResourceLoadObserver final : public ResourceLoadObserver { public:
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc index ad737d2..7793a02 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -49,7 +49,7 @@ #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/blob/blob_registry.mojom-blink.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" -#include "third_party/blink/public/mojom/web_feature/web_feature.mojom-shared.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-shared.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_blob_info.h" #include "third_party/blink/public/platform/web_code_cache_loader.h"
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 243635c6..461f1f4 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -649,6 +649,7 @@ // // https://drafts.csswg.org/mediaqueries-4/#mq-syntax name: "CSSMediaQueries4", + status: "stable", }, { name: "CSSMixBlendModePlusLighter",
diff --git a/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc b/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc index d502f77..08aebbfb 100644 --- a/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc +++ b/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc
@@ -387,13 +387,6 @@ delegate_->RunPaintBenchmark(repeat_count, result); } -void LayerTreeView::ReportEventLatency( - std::vector<cc::EventLatencyTracker::LatencyData> latencies) { - // EventLatency metrics for the renderers are reported in - // `CompositorFrameReporter`, so this functions should not be called. - NOTREACHED(); -} - void LayerTreeView::DidRunBeginMainFrame() { if (!delegate_ || !web_main_thread_scheduler_) return;
diff --git a/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h b/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h index aba6751..de3c905 100644 --- a/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h +++ b/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.h
@@ -108,8 +108,6 @@ base::TimeTicks first_scroll_timestamp) override; void RunPaintBenchmark(int repeat_count, cc::PaintBenchmarkResult& result) override; - void ReportEventLatency( - std::vector<cc::EventLatencyTracker::LatencyData> latencies) override; // cc::LayerTreeHostSingleThreadClient implementation. void DidSubmitCompositorFrame() override;
diff --git a/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer.py b/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer.py index 08c4426..9592212 100644 --- a/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer.py +++ b/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer.py
@@ -39,6 +39,15 @@ def __init__(self, host, default_port, port_names): self._filesystem = host.filesystem self._default_port = default_port + # To ensure the flag-specific baselines join the fallback graph in the + # same location each time the optimizer runs, we create a separate port + # fixed to Linux. Flag-specific suites only run on Linux builders at + # this time. + # TODO(crbug/1291020): Allow non-Linux flag-specific suites. We can do + # this by reading 'builders.json'. + self._flag_spec_port = host.port_factory.get('linux-trusty') + self._flag_spec_port.set_option_default( + 'flag_specific', self._default_port.flag_specific_config_name()) self._ports = {} for port_name in port_names: self._ports[port_name] = host.port_factory.get(port_name) @@ -89,10 +98,80 @@ non_virtual_baseline_name) self._remove_extra_result_at_root(test_name, non_virtual_baseline_name) + flag_specific = self._flag_spec_port.flag_specific_config_name() + if flag_specific: + self._optimize_flag_specific_baselines(test_name, extension) + if not succeeded: _log.error('Heuristics failed to optimize %s', baseline_name) return succeeded + def _optimize_flag_specific_baselines(self, test_name, extension): + """Optimize flag-specific baselines.""" + flag_specific = self._flag_spec_port.flag_specific_config_name() + non_virtual_test_name = self._virtual_base(test_name) + if non_virtual_test_name: + _log.debug( + 'Optimizing flag-specific virtual fallback path ' + 'for "%s".', flag_specific) + self._optimize_single_baseline(test_name, extension, + self._flag_spec_port) + else: + non_virtual_test_name = test_name + _log.debug( + 'Optimizing flag-specific non-virtual fallback path ' + 'for "%s".', flag_specific) + self._optimize_single_baseline(non_virtual_test_name, extension, + self._flag_spec_port) + + def _get_baseline_paths(self, test_name, extension, port): + """Get paths to baselines that the provided port would search. + + Returns: + list[str]: A list of absolute paths (symbolically generated, may + not actually exist on disk). + """ + baselines = port.expected_baselines(test_name, + extension, + all_baselines=True) + non_virtual_test_name = self._virtual_base(test_name) + if non_virtual_test_name: + baselines.extend( + port.expected_baselines(non_virtual_test_name, + extension, + all_baselines=True)) + # `baseline_dir` is `None` when the search path is empty and the generic + # baseline is also missing. + baseline_paths = [ + self._filesystem.join(baseline_dir, baseline_filename) + for baseline_dir, baseline_filename in baselines if baseline_dir + ] + return baseline_paths + + def _optimize_single_baseline(self, test_name, extension, port): + """Optimize a baseline directly by simulating the fallback algorithm.""" + baseline_paths = self._get_baseline_paths(test_name, extension, port) + if not baseline_paths: + # The baseline for this test does not exist. + return + baseline_to_optimize = baseline_paths[0] + basename = self._filesystem.basename(baseline_to_optimize) + if len(baseline_paths) < 2: + _log.debug(' %s: (no baselines found)', basename) + return + fallback_baseline = baseline_paths[1] + is_reftest = self._is_reftest(test_name) + target_digest = ResultDigest(self._filesystem, baseline_to_optimize, + is_reftest) + fallback_digest = ResultDigest(self._filesystem, fallback_baseline, + is_reftest) + if target_digest == fallback_digest: + _log.debug(' %s:', basename) + _log.debug(' Deleting (file system): %s', baseline_to_optimize) + self._filesystem.remove(baseline_to_optimize) + else: + _log.debug(' %s: (already optimal)', basename) + def write_by_directory(self, results_by_directory, writer, indent): """Logs results_by_directory in a pretty format.""" for path in sorted(results_by_directory):
diff --git a/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer_unittest.py b/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer_unittest.py index c61b742..81045fe 100644 --- a/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer_unittest.py +++ b/third_party/blink/tools/blinkpy/common/checkout/baseline_optimizer_unittest.py
@@ -26,6 +26,7 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import optparse import unittest from blinkpy.common.checkout.baseline_optimizer import BaselineOptimizer, ResultDigest @@ -104,7 +105,8 @@ results_by_directory, directory_to_new_results, baseline_dirname='', - suffix='txt'): + suffix='txt', + options=None): web_tests_dir = PathFinder(self.fs).web_tests_dir() test_name = 'mock-test.html' baseline_name = 'mock-test-expected.' + suffix @@ -112,13 +114,19 @@ self.fs.join(web_tests_dir, 'VirtualTestSuites'), '[{"prefix": "gpu", "platforms": ["Linux", "Mac", "Win"], ' '"bases": ["fast/canvas"], "args": ["--foo"]}]') + self.fs.write_text_file( + self.fs.join(web_tests_dir, 'FlagSpecificConfig'), + '[{"name": "highdpi", "args": ["--force-device-scale-factor=1.5"]}]' + ) for dirname, contents in results_by_directory.items(): self.fs.write_text_file( self.fs.join(web_tests_dir, dirname, baseline_name), contents) + if options: + options = optparse.Values(options) baseline_optimizer = BaselineOptimizer( - self.host, self.host.port_factory.get(), + self.host, self.host.port_factory.get(options=options), self.host.port_factory.all_port_names()) self.assertTrue( baseline_optimizer.optimize( @@ -508,6 +516,57 @@ test_path='fast/canvas', baseline_dirname='virtual/gpu/fast/canvas') + def test_flag_specific_falls_back_to_base(self): + self._assert_optimization( + { + 'platform/generic/fast/canvas': '1', + 'flag-specific/highdpi/fast/canvas': '1', + }, { + 'platform/generic/fast/canvas': '1', + }, + baseline_dirname='fast/canvas', + options={'flag_specific': 'highdpi'}) + + def test_flag_specific_virtual_falls_back_to_virtual_base(self): + self._assert_optimization( + { + 'platform/generic/fast/canvas': '1', + 'platform/generic/virtual/gpu/fast/canvas': '2', + 'flag-specific/highdpi/fast/canvas': '3', + 'flag-specific/highdpi/virtual/gpu/fast/canvas': '2', + }, { + 'platform/generic/fast/canvas': '1', + 'platform/generic/virtual/gpu/fast/canvas': '2', + 'flag-specific/highdpi/fast/canvas': '3', + }, + baseline_dirname='virtual/gpu/fast/canvas', + options={'flag_specific': 'highdpi'}) + + def test_flag_specific_virtual_falls_back_to_flag_specific(self): + self._assert_optimization( + { + 'platform/generic/fast/canvas': '1', + 'flag-specific/highdpi/fast/canvas': '2', + 'flag-specific/highdpi/virtual/gpu/fast/canvas': '2', + }, { + 'platform/generic/fast/canvas': '1', + 'flag-specific/highdpi/fast/canvas': '2', + }, + baseline_dirname='virtual/gpu/fast/canvas', + options={'flag_specific': 'highdpi'}) + + def test_both_flag_specific_falls_back_to_base(self): + self._assert_optimization( + { + 'platform/generic/fast/canvas': '1', + 'flag-specific/highdpi/fast/canvas': '1', + 'flag-specific/highdpi/virtual/gpu/fast/canvas': '1', + }, { + 'platform/generic/fast/canvas': '1', + }, + baseline_dirname='virtual/gpu/fast/canvas', + options={'flag_specific': 'highdpi'}) + # Tests for protected methods - pylint: disable=protected-access def test_move_baselines(self):
diff --git a/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines.py b/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines.py index cf96d1b..0a4c58c 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines.py +++ b/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines.py
@@ -12,7 +12,8 @@ class OptimizeBaselines(AbstractRebaseliningCommand): name = 'optimize-baselines' - help_text = 'Reshuffles the baselines for the given tests to use as little space on disk as possible.' + help_text = ('Reshuffles the baselines for the given tests to use ' + 'as little space on disk as possible.') show_in_main_help = True argument_names = 'TEST_NAMES' @@ -20,6 +21,7 @@ super(OptimizeBaselines, self).__init__(options=[ self.suffixes_option, self.port_name_option, + self.flag_specific_option, ] + self.platform_options + self.wpt_options) def _optimize_baseline(self, optimizer, test_name):
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py index 84b956d..0387375 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py
@@ -94,7 +94,10 @@ flag_specific_option = optparse.make_option( '--flag-specific', # TODO: build the list from builders.json - choices=["disable-layout-ng", "highdpi"], + choices=[ + "disable-layout-ng", "disable-site-isolation-trials", "highdpi", + "skia-vulkan-swiftshader" + ], default=None, action='store', help=(
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py b/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py index 6b1f8c2..80b7db9 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/base_unittest.py
@@ -239,7 +239,9 @@ port.FALLBACK_PATHS = {'': ['foo']} test_file = 'fast/test.html' port.host.filesystem.write_text_file( - MOCK_WEB_TESTS + 'VirtualTestSuites', '[]') + MOCK_WEB_TESTS + 'VirtualTestSuites', + '[{ "prefix": "bar", "platforms": ["Linux", "Mac", "Win"],' + ' "bases": ["fast"], "args": ["--bar"]}]') # pylint: disable=protected-access port._options.additional_platform_directory = [] @@ -274,6 +276,30 @@ port.fallback_expected_filename(test_file, '.txt'), MOCK_WEB_TESTS + 'platform/foo/fast/test-expected.txt') + # Before the flag-specific and virtual baseline exists, fall back to + # the flag-specific but nonvirtual baseline. + fs = port.host.filesystem + self.assertEqual( + port.expected_filename('virtual/bar/fast/test.html', '.txt'), + fs.join(MOCK_WEB_TESTS, + 'flag-specific/special-flag/fast/test-expected.txt')) + fs.write_text_file( + fs.join( + MOCK_WEB_TESTS, + 'flag-specific/special-flag/virtual/bar/fast/test-expected.txt' + ), 'foo') + # Switch to the most specific baseline. + self.assertEqual( + port.expected_filename('virtual/bar/fast/test.html', '.txt'), + fs.join( + MOCK_WEB_TESTS, + 'flag-specific/special-flag/virtual/bar/fast/test-expected.txt' + )) + self.assertEqual( + port.expected_baselines('virtual/bar/fast/test.html', '.txt'), + [(fs.join(MOCK_WEB_TESTS, 'flag-specific/special-flag'), + 'virtual/bar/fast/test-expected.txt')]) + # Flag-specific platform-specific baseline port.host.filesystem.write_text_file( MOCK_WEB_TESTS +
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng index 1e637a3..7967b7ee 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng +++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -83,6 +83,9 @@ ### external/wpt/css/CSS2/floats/ crbug.com/591099 external/wpt/css/CSS2/floats/float-nowrap-3.html [ Failure ] crbug.com/591099 external/wpt/css/CSS2/floats/floats-line-wrap-shifted-001.html [ Failure ] +crbug.com/591099 external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-003.tentative.html [ Failure ] +crbug.com/591099 external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-004.html [ Failure ] +crbug.com/591099 external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-005.html [ Failure ] crbug.com/591099 external/wpt/css/CSS2/floats/overhanging-float-paint-order.html [ Failure ] crbug.com/591099 external/wpt/css/CSS2/floats/zero-width-floats-positioning.tentative.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index f15edbfb..a5f55cb 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -296,6 +296,7 @@ # Document transition tests crbug.com/1276999 document-transition/* [ Skip ] +crbug.com/1316157 inspector-protocol/css/css-get-styles-for-document-transition.js [ Skip ] crbug.com/1276999 wpt_internal/document-transition/* [ Skip ] crbug.com/1276999 virtual/document-transition/* [ Pass ] @@ -403,10 +404,7 @@ crbug.com/1086591 external/wpt/css/mediaqueries/device-aspect-ratio-002.html [ Failure ] crbug.com/1002049 external/wpt/css/mediaqueries/aspect-ratio-005.html [ Failure ] crbug.com/1002049 external/wpt/css/mediaqueries/aspect-ratio-006.html [ Failure ] -crbug.com/946762 external/wpt/css/mediaqueries/mq-gamut-004.html [ Failure ] -crbug.com/946762 external/wpt/css/mediaqueries/mq-gamut-002.html [ Failure ] crbug.com/962417 external/wpt/css/mediaqueries/mq-negative-range-001.html [ Failure ] -crbug.com/442449 external/wpt/css/mediaqueries/mq-range-001.html [ Failure ] crbug.com/1007134 external/wpt/intersection-observer/v2/delay-test.html [ Failure Pass ] crbug.com/1004547 external/wpt/intersection-observer/cross-origin-iframe.sub.html [ Failure Pass ] @@ -909,7 +907,6 @@ crbug.com/711704 external/wpt/css/CSS2/floats/floats-rule7-outside-left-001.xht [ Failure ] crbug.com/711704 external/wpt/css/CSS2/floats/floats-rule7-outside-right-001.xht [ Failure ] crbug.com/711704 external/wpt/css/CSS2/floats/floats-wrap-bfc-006.xht [ Failure ] -crbug.com/1322774 external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-003.tentative.html [ Failure ] crbug.com/711709 external/wpt/css/CSS2/floats-clear/floating-replaced-height-008.xht [ Skip ] crbug.com/711709 external/wpt/css/CSS2/floats-clear/floats-108.xht [ Skip ] @@ -6896,6 +6893,3 @@ # Throttling a hidden-cross origin frame may stall animations. crbug.com/1323246 external/wpt/web-animations/timing-model/timelines/sibling-iframe-timeline.html [ Failure Pass ] - -# Temp disable tests to merge DevTools show non-color CSS variable previews in the autocomplete dropdown feature -crbug.com/1285091 http/tests/devtools/elements/styles-3/style-autocomplete-swatches.js [ Skip ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index ed55171..dc02eee 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1019,7 +1019,9 @@ { "prefix": "document-transition", "platforms": ["Linux", "Mac", "Win"], - "bases": ["wpt_internal/document-transition", "document-transition"], + "bases": ["wpt_internal/document-transition", + "document-transition", + "inspector-protocol/css/css-get-styles-for-document-transition.js"], "args": ["--enable-features=DocumentTransition", "--enable-threaded-compositing", "--enable-gpu-rasterization"]
diff --git a/third_party/blink/web_tests/WebDriverExpectations b/third_party/blink/web_tests/WebDriverExpectations index fd41571..3dd9095 100644 --- a/third_party/blink/web_tests/WebDriverExpectations +++ b/third_party/blink/web_tests/WebDriverExpectations
@@ -519,3 +519,15 @@ crbug.com/1123907 [ Linux ] external/wpt/webdriver/tests/fullscreen_window/stress.py>>test_stress [ Failure Pass ] crbug.com/1128104 [ Linux ] external/wpt/webdriver/tests/release_actions/sequence.py>>test_no_release_mouse_sequence_keeps_dblclick_state [ Failure ] crbug.com/626703 [ Linux ] external/wpt/webdriver/tests/perform_actions/pointer_origin.py>>test_element_larger_than_viewport [ Failure ] +crbug.com/1325690 [ Linux ] external/wpt/webdriver/tests/take_element_screenshot/user_prompts.py>>test_accept[capabilities0-alert-None] [ Failure Pass ] +crbug.com/1325690 [ Linux ] external/wpt/webdriver/tests/take_element_screenshot/user_prompts.py>>test_accept[capabilities0-confirm-True] [ Failure Pass ] +crbug.com/1325690 [ Linux ] external/wpt/webdriver/tests/take_element_screenshot/user_prompts.py>>test_accept[capabilities0-prompt-] [ Failure Pass ] +crbug.com/1325690 [ Linux ] external/wpt/webdriver/tests/take_element_screenshot/user_prompts.py>>test_dismiss[capabilities0-alert-None] [ Failure Pass ] +crbug.com/1325690 [ Linux ] external/wpt/webdriver/tests/take_element_screenshot/user_prompts.py>>test_dismiss[capabilities0-confirm-False] [ Failure Pass ] +crbug.com/1325690 [ Linux ] external/wpt/webdriver/tests/take_element_screenshot/user_prompts.py>>test_dismiss[capabilities0-prompt-None] [ Failure Pass ] +crbug.com/1325690 [ Linux ] external/wpt/webdriver/tests/take_screenshot/user_prompts.py>>test_accept[capabilities0-alert-None] [ Failure Pass ] +crbug.com/1325690 [ Linux ] external/wpt/webdriver/tests/take_screenshot/user_prompts.py>>test_accept[capabilities0-confirm-True] [ Failure Pass ] +crbug.com/1325690 [ Linux ] external/wpt/webdriver/tests/take_screenshot/user_prompts.py>>test_accept[capabilities0-prompt-] [ Failure Pass ] +crbug.com/1325690 [ Linux ] external/wpt/webdriver/tests/take_screenshot/user_prompts.py>>test_dismiss[capabilities0-alert-None] [ Failure Pass ] +crbug.com/1325690 [ Linux ] external/wpt/webdriver/tests/take_screenshot/user_prompts.py>>test_dismiss[capabilities0-confirm-False] [ Failure Pass ] +crbug.com/1325690 [ Linux ] external/wpt/webdriver/tests/take_screenshot/user_prompts.py>>test_dismiss[capabilities0-prompt-None] [ Failure Pass ]
diff --git a/third_party/blink/web_tests/android/ChromeWPTOverrideExpectations b/third_party/blink/web_tests/android/ChromeWPTOverrideExpectations index 13d4824..63bb1962 100644 --- a/third_party/blink/web_tests/android/ChromeWPTOverrideExpectations +++ b/third_party/blink/web_tests/android/ChromeWPTOverrideExpectations
@@ -1531,7 +1531,6 @@ crbug.com/1050754 external/wpt/storage-access-api/requestStorageAccess.sub.window.html [ Failure ] crbug.com/1050754 external/wpt/storage-access-api/storageAccess.testdriver.sub.html [ Failure ] crbug.com/1050754 external/wpt/streams/piping/abort.any.js [ Skip ] -crbug.com/1050754 external/wpt/streams/piping/abort.any.sharedworker.html [ Failure ] crbug.com/1050754 external/wpt/streams/piping/close-propagation-backward.any.js [ Skip ] crbug.com/1050754 external/wpt/streams/piping/close-propagation-backward.any.sharedworker.html [ Failure ] crbug.com/1050754 external/wpt/streams/piping/close-propagation-forward.any.js [ Skip ]
diff --git a/third_party/blink/web_tests/android/WebLayerWPTOverrideExpectations b/third_party/blink/web_tests/android/WebLayerWPTOverrideExpectations index 5efe2fc..fa6ea5c 100644 --- a/third_party/blink/web_tests/android/WebLayerWPTOverrideExpectations +++ b/third_party/blink/web_tests/android/WebLayerWPTOverrideExpectations
@@ -1652,7 +1652,6 @@ crbug.com/1050754 external/wpt/storage-access-api/requestStorageAccess.sub.window.html [ Failure ] crbug.com/1050754 external/wpt/storage-access-api/storageAccess.testdriver.sub.html [ Failure ] crbug.com/1050754 external/wpt/storage/estimate-indexeddb.https.any.html [ Failure Pass ] -crbug.com/1050754 external/wpt/streams/piping/abort.any.sharedworker.html [ Failure ] crbug.com/1050754 external/wpt/streams/piping/close-propagation-backward.any.sharedworker.html [ Failure ] crbug.com/1050754 external/wpt/streams/piping/close-propagation-forward.any.sharedworker.html [ Failure ] crbug.com/1050754 external/wpt/streams/piping/error-propagation-backward.any.sharedworker.html [ Failure ]
diff --git a/third_party/blink/web_tests/android/WebviewWPTExpectations b/third_party/blink/web_tests/android/WebviewWPTExpectations index 0552de7..6ae9ece 100644 --- a/third_party/blink/web_tests/android/WebviewWPTExpectations +++ b/third_party/blink/web_tests/android/WebviewWPTExpectations
@@ -4593,7 +4593,6 @@ crbug.com/1050754 external/wpt/storage/permission-query.https.any.html [ Failure ] crbug.com/1050754 external/wpt/storage/permission-query.https.any.worker.html [ Failure ] crbug.com/1050754 external/wpt/streams/idlharness.any.sharedworker.html [ Failure ] -crbug.com/1050754 external/wpt/streams/piping/abort.any.sharedworker.html [ Failure ] crbug.com/1050754 external/wpt/streams/piping/close-propagation-backward.any.sharedworker.html [ Failure ] crbug.com/1050754 external/wpt/streams/piping/close-propagation-forward.any.sharedworker.html [ Failure ] crbug.com/1050754 external/wpt/streams/piping/error-propagation-backward.any.sharedworker.html [ Failure ]
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 09c6bf726..b17874f 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
@@ -38545,6 +38545,32 @@ {} ] ], + "floats-wrap-bfc-with-margin-004.html": [ + "cab9e00087931f9b887efb767f2af29c4e7e91b2", + [ + null, + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], + "floats-wrap-bfc-with-margin-005.html": [ + "5c0bc4f931a7374e525ed8fffd458c69009656ce", + [ + null, + [ + [ + "/css/CSS2/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "floats-wrap-top-below-bfc-001l.xht": [ "17bec33eb143ce14f13c439e83f433c3fef74fdd", [ @@ -96422,6 +96448,19 @@ {} ] ], + "container-units-gradient.html": [ + "3d6f5378c22fd33554309420fee047c68eaa51e2", + [ + null, + [ + [ + "/css/css-contain/container-queries/container-units-gradient-ref.html", + "==" + ] + ], + {} + ] + ], "counters-in-container-dynamic.html": [ "d85ab6cb425ba792914b39901cd3f3ba3943b606", [ @@ -149093,6 +149132,19 @@ {} ] ], + "first-line-nested-gcs.html": [ + "6777e5468f57b507f96f4e92fbba4393002d15e7", + [ + null, + [ + [ + "/css/css-pseudo/first-line-green-ref.html", + "==" + ] + ], + {} + ] + ], "first-line-on-ancestor-block.html": [ "6b797107df80156b511b9dc58c5ee40d6114cfc4", [ @@ -261166,6 +261218,10 @@ "8dd3b8b2c1dea6230357f8ff6ec1225154650094", [] ], + "container-units-gradient-ref.html": [ + "dbdabd9bc4ecee3eec34406e7fd13a1e04141978", + [] + ], "counters-ref.html": [ "303c1e89bdfe5449177a2d144f4be1e1760a80d5", [] @@ -261196,7 +261252,7 @@ ], "support": { "cq-testcommon.js": [ - "2eaca1dd091cbf7c3a406fa02c2696d7a9c258e4", + "673c3176baebf8f8963098cd7113b68634f1a1ef", [] ] }, @@ -278549,6 +278605,10 @@ "84becd9a78d186ba3c0e658746fd56aef8039b74", [] ], + "first-line-green-ref.html": [ + "99e9c334bf2c856535c7643911a3050390658a6f", + [] + ], "first-line-line-height-001-ref.html": [ "13e9b20f34d44cbe436b6bbcbdd6e85884ee71ca", [] @@ -293496,6 +293556,14 @@ [] ] }, + "tools": { + "_virtualenv": { + ".gitignore": [ + "ede80b85f0f30f7d19ce1a46d6b421fac3c1f82f", + [] + ] + } + }, "vendor-imports": { "mozilla": { "mozilla-central-reftests": { @@ -328772,6 +328840,18 @@ "399fd5ce7d6710670374d122c7f35cd64bd58b98", [] ] + }, + "timelines": { + "resources": { + "target-frame.html": [ + "18ee4fd8a23e6a9b4f95068b418d4da1bdef1679", + [] + ], + "timeline-frame.html": [ + "9c8cdabc9da65e9f069155ab8e7304e7b36e871d", + [] + ] + } } } }, @@ -369684,7 +369764,7 @@ ] ], "container-for-shadow-dom.html": [ - "d69ec9e4aeff5ea4c24c5c9d21f48c5e21e189df", + "b8caeafc77b52f391e8a8423978f4633e574d277", [ null, {} @@ -369837,6 +369917,13 @@ {} ] ], + "container-units-shadow.html": [ + "e605a53616baf351aa03f7a4fa37d0ec63539e95", + [ + null, + {} + ] + ], "container-units-small-viewport-fallback.html": [ "6c8851681fb62fc133a2635796e38c367e866dcb", [ @@ -484714,7 +484801,7 @@ "mediacapture-handle": { "identity": { "MediaDevices-setCaptureHandleConfig.https.window.js": [ - "735380260f9df42a290cd5307f75ab69fde91062", + "6fa01ad2b955c90e594054c0cb47a9e8249a8881", [ "mediacapture-handle/identity/MediaDevices-setCaptureHandleConfig.https.window.html", {} @@ -520119,7 +520206,7 @@ ], "piping": { "abort.any.js": [ - "bb62dc8c41448e04773a39d8ef43a76ff656131c", + "45a358d5993d70a2008a84083095dbda962c40e9", [ null, { @@ -528627,13 +528714,6 @@ {} ] ], - "trusted-types-event-handlers.tentative.html": [ - "57f8d3d90c4162949832ec0b48f62c0511007c93", - [ - null, - {} - ] - ], "trusted-types-navigation.tentative.html": [ "4e784611dd64ecf2f9995403b1d4e5a19f8b4548", [ @@ -536897,6 +536977,13 @@ {} ] ], + "sibling-iframe-timeline.html": [ + "8a611c8579943a6ec3038bdadde967596afcfd2a", + [ + null, + {} + ] + ], "timelines.html": [ "d570eed5c28637c001b1d1c178630bdb424afd31", [
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-004.html b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-004.html new file mode 100644 index 0000000..cab9e000 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-004.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1323004"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht" /> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="width:100px; height:100px; background:red;"> + <div style="display:flow-root; background:green;"> + <div style="float:right; width:50px; height:40px;"></div> + <div style="display:flow-root; height:60px; margin-left:51px;"></div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-005.html b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-005.html new file mode 100644 index 0000000..5c0bc4f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-005.html
@@ -0,0 +1,10 @@ +<!DOCTYPE html> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1323004"> +<link rel="match" href="../reference/ref-filled-green-100px-square.xht" /> +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> +<div style="width:100px; height:100px; background:red;"> + <div style="display:flow-root; background:green; direction:rtl;"> + <div style="float:left; width:50px; height:40px;"></div> + <div style="display:flow-root; height:60px; margin-right:51px;"></div> + </div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/container-units-gradient-invalidation.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/container-units-gradient-invalidation.html new file mode 100644 index 0000000..665a14dc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/container-units-gradient-invalidation.html
@@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<title>Container Relative Units in gradients</title> +<link rel="help" href="https://drafts.csswg.org/css-contain-3/#container-lengths"> +<link rel="match" href="container-units-gradient-ref.html"> +<script src="/common/reftest-wait.js"></script> +<script src="/common/rendering-utils.js"></script> +<style> + .container { + container-type: size; + width: 500px; + height: 400px; + display: flex; + flex-wrap: wrap; + } + .smaller { + width: 400px; + height: 300px; + } + .box { + width: 100px; + height: 100px; + margin: 5px; + } +</style> +<div class=container> + <div class=box style="background:linear-gradient(green 5cqw, blue 10cqh)"></div> + <div class=box style="background:linear-gradient(green 5cqi, blue 10cqb)"></div> + <div class=box style="background:linear-gradient(green 5cqmin, blue 10cqmax)"></div> + <div class=box style="background:radial-gradient(green 5cqw, blue 10cqh)"></div> + <div class=box style="background:conic-gradient(from 180deg at 10cqh, green, blue)"></div> +</div> +<script> + document.body.offsetTop; + document.querySelector('.container').classList.add('smaller'); + waitForAtLeastOneFrame().then(takeScreenshot); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-green-ref.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-green-ref.html new file mode 100644 index 0000000..99e9c334 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-green-ref.html
@@ -0,0 +1,3 @@ +<!doctype html> +<title>CSS Test Reference</title> +<div style="color:green">This text should be green.</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-nested-gcs.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-nested-gcs.html new file mode 100644 index 0000000..6777e54 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-nested-gcs.html
@@ -0,0 +1,14 @@ +<!doctype html> +<title>CSS Pseudo Test: Query ::first-line computed style before outer block ::first-line matches</title> +<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#first-line-pseudo"> +<link rel="match" href="first-line-green-ref.html"> +<style> + #outer::first-line { color: green } +</style> +<div id="outer"> + <div id="inner"></div> +</div> +<script> + getComputedStyle(inner, "::first-line").color; + inner.appendChild(document.createTextNode("This text should be green.")); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/dynamic-range.html b/third_party/blink/web_tests/external/wpt/css/mediaqueries/dynamic-range.html index f423efbe..babe1b9 100644 --- a/third_party/blink/web_tests/external/wpt/css/mediaqueries/dynamic-range.html +++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/dynamic-range.html
@@ -5,33 +5,19 @@ <script type="text/javascript" src="resources/matchmedia-utils.js"></script> <script> -query_should_be_css_parseable("(dynamic-range: standard)"); -query_should_be_css_parseable("(dynamic-range: high)"); -query_should_be_css_parseable("(video-dynamic-range: standard)"); -query_should_be_css_parseable("(video-dynamic-range: high)"); +query_should_be_known("(dynamic-range: standard)"); +query_should_be_known("(dynamic-range: high)"); +query_should_be_known("(video-dynamic-range: standard)"); +query_should_be_known("(video-dynamic-range: high)"); -query_should_not_be_css_parseable("(dynamic-range)"); -query_should_not_be_css_parseable("(dynamic-range: 0)"); -query_should_not_be_css_parseable("(dynamic-range: 10px)"); -query_should_not_be_css_parseable("(dynamic-range: invalid)"); -query_should_not_be_css_parseable("(video-dynamic-range)"); -query_should_not_be_css_parseable("(video-dynamic-range: 0)"); -query_should_not_be_css_parseable("(video-dynamic-range: 10px)"); -query_should_not_be_css_parseable("(video-dynamic-range: invalid)"); - -query_should_be_js_parseable("(dynamic-range: standard)"); -query_should_be_js_parseable("(dynamic-range: high)"); -query_should_be_js_parseable("(video-dynamic-range: standard)"); -query_should_be_js_parseable("(video-dynamic-range: high)"); - -query_should_not_be_js_parseable("(dynamic-range)"); -query_should_not_be_js_parseable("(dynamic-range: 0)"); -query_should_not_be_js_parseable("(dynamic-range: 10px)"); -query_should_not_be_js_parseable("(dynamic-range: invalid)"); -query_should_not_be_js_parseable("(video-dynamic-range)"); -query_should_not_be_js_parseable("(video-dynamic-range: 0)"); -query_should_not_be_js_parseable("(video-dynamic-range: 10px)"); -query_should_not_be_js_parseable("(video-dynamic-range: invalid)"); +query_should_be_unknown("(dynamic-range)"); +query_should_be_unknown("(dynamic-range: 0)"); +query_should_be_unknown("(dynamic-range: 10px)"); +query_should_be_unknown("(dynamic-range: invalid)"); +query_should_be_unknown("(video-dynamic-range)"); +query_should_be_unknown("(video-dynamic-range: 0)"); +query_should_be_unknown("(video-dynamic-range: 10px)"); +query_should_be_unknown("(video-dynamic-range: invalid)"); test(() => { let match_standard = window.matchMedia("(dynamic-range: standard)");
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/forced-colors.html b/third_party/blink/web_tests/external/wpt/css/mediaqueries/forced-colors.html index 005b5cf..ac917c9 100644 --- a/third_party/blink/web_tests/external/wpt/css/mediaqueries/forced-colors.html +++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/forced-colors.html
@@ -5,27 +5,16 @@ <script type="text/javascript" src="resources/matchmedia-utils.js"></script> <script> -query_should_be_css_parseable("(forced-colors)"); -query_should_be_css_parseable("(forced-colors: none)"); -query_should_be_css_parseable("(forced-colors: active)"); +query_should_be_known("(forced-colors)"); +query_should_be_known("(forced-colors: none)"); +query_should_be_known("(forced-colors: active)"); -query_should_not_be_css_parseable("(forced-colors: 0)"); -query_should_not_be_css_parseable("(forced-colors: no-preference)"); -query_should_not_be_css_parseable("(forced-colors: 10px)"); -query_should_not_be_css_parseable("(forced-colors: active 0)"); -query_should_not_be_css_parseable("(forced-colors: none active)"); -query_should_not_be_css_parseable("(forced-colors: active/none)"); - -query_should_be_js_parseable("(forced-colors)"); -query_should_be_js_parseable("(forced-colors: none)"); -query_should_be_js_parseable("(forced-colors: active)"); - -query_should_not_be_js_parseable("(forced-colors: 0)"); -query_should_not_be_js_parseable("(forced-colors: no-preference)"); -query_should_not_be_js_parseable("(forced-colors: 10px)"); -query_should_not_be_js_parseable("(forced-colors: active 0)"); -query_should_not_be_js_parseable("(forced-colors: none active)"); -query_should_not_be_js_parseable("(forced-colors: active/none)"); +query_should_be_unknown("(forced-colors: 0)"); +query_should_be_unknown("(forced-colors: no-preference)"); +query_should_be_unknown("(forced-colors: 10px)"); +query_should_be_unknown("(forced-colors: active 0)"); +query_should_be_unknown("(forced-colors: none active)"); +query_should_be_unknown("(forced-colors: active/none)"); test(() => { let booleanContext = window.matchMedia("(forced-colors)");
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/navigation-controls.tentative.html b/third_party/blink/web_tests/external/wpt/css/mediaqueries/navigation-controls.tentative.html index ac1087bb..5be0b78 100644 --- a/third_party/blink/web_tests/external/wpt/css/mediaqueries/navigation-controls.tentative.html +++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/navigation-controls.tentative.html
@@ -4,16 +4,11 @@ <script type="text/javascript" src="/resources/testharnessreport.js"></script> <script type="text/javascript" src="resources/matchmedia-utils.js"></script> <script> - query_should_be_css_parseable("(navigation-controls)"); - query_should_be_css_parseable("(navigation-controls: none)"); - query_should_be_css_parseable("(navigation-controls: back-button)"); - query_should_not_be_css_parseable("(navigation-controls: none back-button)"); - query_should_not_be_css_parseable("(navigation-controls: back-button/none)"); - query_should_be_js_parseable("(navigation-controls)"); - query_should_be_js_parseable("(navigation-controls: none)"); - query_should_be_js_parseable("(navigation-controls: back-button)"); - query_should_not_be_js_parseable("(navigation-controls: none back-button)"); - query_should_not_be_js_parseable("(navigation-controls: back-button/none)"); + query_should_be_known("(navigation-controls)"); + query_should_be_known("(navigation-controls: none)"); + query_should_be_known("(navigation-controls: back-button)"); + query_should_be_unknown("(navigation-controls: none back-button)"); + query_should_be_unknown("(navigation-controls: back-button/none)"); test(() => { let booleanContext = window.matchMedia("(navigation-controls)"); let none = window.matchMedia("(navigation-controls: none)");
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-color-scheme.html b/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-color-scheme.html index 594003b..87c5add6 100644 --- a/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-color-scheme.html +++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-color-scheme.html
@@ -5,29 +5,17 @@ <script type="text/javascript" src="resources/matchmedia-utils.js"></script> <script> -query_should_be_css_parseable("(prefers-color-scheme)"); -query_should_be_css_parseable("(prefers-color-scheme: light)"); -query_should_be_css_parseable("(prefers-color-scheme: dark)"); +query_should_be_known("(prefers-color-scheme)"); +query_should_be_known("(prefers-color-scheme: light)"); +query_should_be_known("(prefers-color-scheme: dark)"); -query_should_not_be_css_parseable("(prefers-color-scheme: 0)"); -query_should_not_be_css_parseable("(prefers-color-scheme: none)"); -query_should_not_be_css_parseable("(prefers-color-scheme: 10px)"); -query_should_not_be_css_parseable("(prefers-color-scheme: dark 0)"); -query_should_not_be_css_parseable("(prefers-color-scheme: dark light)"); -query_should_not_be_css_parseable("(prefers-color-scheme: light/dark)"); -query_should_not_be_css_parseable("(prefers-color-scheme: no-preference)"); - -query_should_be_js_parseable("(prefers-color-scheme)"); -query_should_be_js_parseable("(prefers-color-scheme: light)"); -query_should_be_js_parseable("(prefers-color-scheme: dark)"); - -query_should_not_be_js_parseable("(prefers-color-scheme: 0)"); -query_should_not_be_js_parseable("(prefers-color-scheme: none)"); -query_should_not_be_js_parseable("(prefers-color-scheme: 10px)"); -query_should_not_be_js_parseable("(prefers-color-scheme: dark 0)"); -query_should_not_be_js_parseable("(prefers-color-scheme: dark light)"); -query_should_not_be_js_parseable("(prefers-color-scheme: light/dark)"); -query_should_not_be_js_parseable("(prefers-color-scheme: no-preference)"); +query_should_be_unknown("(prefers-color-scheme: 0)"); +query_should_be_unknown("(prefers-color-scheme: none)"); +query_should_be_unknown("(prefers-color-scheme: 10px)"); +query_should_be_unknown("(prefers-color-scheme: dark 0)"); +query_should_be_unknown("(prefers-color-scheme: dark light)"); +query_should_be_unknown("(prefers-color-scheme: light/dark)"); +query_should_be_unknown("(prefers-color-scheme: no-preference)"); test(() => { let booleanContext = window.matchMedia("(prefers-color-scheme)");
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-contrast.html b/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-contrast.html index daba852..b0a67e9 100644 --- a/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-contrast.html +++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-contrast.html
@@ -5,39 +5,22 @@ <script type="text/javascript" src="resources/matchmedia-utils.js"></script> <script> -query_should_be_css_parseable("(prefers-contrast)"); -query_should_be_css_parseable("(prefers-contrast: no-preference)"); -query_should_be_css_parseable("(prefers-contrast: more)"); -query_should_be_css_parseable("(prefers-contrast: less)"); -query_should_be_css_parseable("(prefers-contrast: custom)"); +query_should_be_known("(prefers-contrast)"); +query_should_be_known("(prefers-contrast: no-preference)"); +query_should_be_known("(prefers-contrast: more)"); +query_should_be_known("(prefers-contrast: less)"); +query_should_be_known("(prefers-contrast: custom)"); -query_should_not_be_css_parseable("(prefers-contrast: increase)"); -query_should_not_be_css_parseable("(prefers-contrast: none)"); -query_should_not_be_css_parseable("(prefers-contrast: forced high)"); -query_should_not_be_css_parseable("(prefers-contrast: forced low)"); -query_should_not_be_css_parseable("(prefers-contrast > increase)"); -query_should_not_be_css_parseable("(prefers-increased-contrast)"); -query_should_not_be_css_parseable("(prefers-decreased-contrast)"); -query_should_not_be_css_parseable("(prefers-contrast: high)"); -query_should_not_be_css_parseable("(prefers-contrast: low)"); -query_should_not_be_css_parseable("(prefers-contrast: forced)"); - -query_should_be_js_parseable("(prefers-contrast)"); -query_should_be_js_parseable("(prefers-contrast: no-preference)"); -query_should_be_js_parseable("(prefers-contrast: more)"); -query_should_be_js_parseable("(prefers-contrast: less)"); -query_should_be_js_parseable("(prefers-contrast: custom)"); - -query_should_not_be_js_parseable("(prefers-contrast: increase)"); -query_should_not_be_js_parseable("(prefers-contrast: none)"); -query_should_not_be_js_parseable("(prefers-contrast: forced high)"); -query_should_not_be_js_parseable("(prefers-contrast: forced low)"); -query_should_not_be_js_parseable("(prefers-contrast > increase)"); -query_should_not_be_js_parseable("(prefers-increased-contrast)"); -query_should_not_be_js_parseable("(prefers-decreased-contrast)"); -query_should_not_be_js_parseable("(prefers-contrast: high)"); -query_should_not_be_js_parseable("(prefers-contrast: low)"); -query_should_not_be_js_parseable("(prefers-contrast: forced)"); +query_should_be_unknown("(prefers-contrast: increase)"); +query_should_be_unknown("(prefers-contrast: none)"); +query_should_be_unknown("(prefers-contrast: forced high)"); +query_should_be_unknown("(prefers-contrast: forced low)"); +query_should_be_unknown("(prefers-contrast > increase)"); +query_should_be_unknown("(prefers-increased-contrast)"); +query_should_be_unknown("(prefers-decreased-contrast)"); +query_should_be_unknown("(prefers-contrast: high)"); +query_should_be_unknown("(prefers-contrast: low)"); +query_should_be_unknown("(prefers-contrast: forced)"); test(() => { // no-preference is the default and all other values evaluate to
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-reduced-data.html b/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-reduced-data.html index 4c2668f..bc44236 100644 --- a/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-reduced-data.html +++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-reduced-data.html
@@ -5,27 +5,16 @@ <script type="text/javascript" src="resources/matchmedia-utils.js"></script> <script> -query_should_be_css_parseable("(prefers-reduced-data)"); -query_should_be_css_parseable("(prefers-reduced-data: no-preference)"); -query_should_be_css_parseable("(prefers-reduced-data: reduce)"); +query_should_be_known("(prefers-reduced-data)"); +query_should_be_known("(prefers-reduced-data: no-preference)"); +query_should_be_known("(prefers-reduced-data: reduce)"); -query_should_not_be_css_parseable("(prefers-reduced-data: 0)"); -query_should_not_be_css_parseable("(prefers-reduced-data: none)"); -query_should_not_be_css_parseable("(prefers-reduced-data: 10px)"); -query_should_not_be_css_parseable("(prefers-reduced-data: no-preference reduce)"); -query_should_not_be_css_parseable("(prefers-reduced-data: reduced)"); -query_should_not_be_css_parseable("(prefers-reduced-data: no-preference/reduce)"); - -query_should_be_js_parseable("(prefers-reduced-data)"); -query_should_be_js_parseable("(prefers-reduced-data: no-preference)"); -query_should_be_js_parseable("(prefers-reduced-data: reduce)"); - -query_should_not_be_js_parseable("(prefers-reduced-data: 0)"); -query_should_not_be_js_parseable("(prefers-reduced-data: none)"); -query_should_not_be_js_parseable("(prefers-reduced-data: 10px)"); -query_should_not_be_js_parseable("(prefers-reduced-data: no-preference reduce)"); -query_should_not_be_js_parseable("(prefers-reduced-data: reduced)"); -query_should_not_be_js_parseable("(prefers-reduced-data: no-preference/reduce)"); +query_should_be_unknown("(prefers-reduced-data: 0)"); +query_should_be_unknown("(prefers-reduced-data: none)"); +query_should_be_unknown("(prefers-reduced-data: 10px)"); +query_should_be_unknown("(prefers-reduced-data: no-preference reduce)"); +query_should_be_unknown("(prefers-reduced-data: reduced)"); +query_should_be_unknown("(prefers-reduced-data: no-preference/reduce)"); test(() => { // https://drafts.csswg.org/mediaqueries-5/#boolean-context
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-reduced-motion.html b/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-reduced-motion.html index 2d9f88474..f9a71f5 100644 --- a/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-reduced-motion.html +++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/prefers-reduced-motion.html
@@ -5,27 +5,16 @@ <script type="text/javascript" src="resources/matchmedia-utils.js"></script> <script> -query_should_be_css_parseable("(prefers-reduced-motion)"); -query_should_be_css_parseable("(prefers-reduced-motion: no-preference)"); -query_should_be_css_parseable("(prefers-reduced-motion: reduce)"); +query_should_be_known("(prefers-reduced-motion)"); +query_should_be_known("(prefers-reduced-motion: no-preference)"); +query_should_be_known("(prefers-reduced-motion: reduce)"); -query_should_not_be_css_parseable("(prefers-reduced-motion: 0)"); -query_should_not_be_css_parseable("(prefers-reduced-motion: none)"); -query_should_not_be_css_parseable("(prefers-reduced-motion: 10px)"); -query_should_not_be_css_parseable("(prefers-reduced-motion: no-preference reduce)"); -query_should_not_be_css_parseable("(prefers-reduced-motion: reduced)"); -query_should_not_be_css_parseable("(prefers-reduced-motion: no-preference/reduce)"); - -query_should_be_js_parseable("(prefers-reduced-motion)"); -query_should_be_js_parseable("(prefers-reduced-motion: no-preference)"); -query_should_be_js_parseable("(prefers-reduced-motion: reduce)"); - -query_should_not_be_js_parseable("(prefers-reduced-motion: 0)"); -query_should_not_be_js_parseable("(prefers-reduced-motion: none)"); -query_should_not_be_js_parseable("(prefers-reduced-motion: 10px)"); -query_should_not_be_js_parseable("(prefers-reduced-motion: no-preference reduce)"); -query_should_not_be_js_parseable("(prefers-reduced-motion: reduced)"); -query_should_not_be_js_parseable("(prefers-reduced-motion: no-preference/reduce)"); +query_should_be_unknown("(prefers-reduced-motion: 0)"); +query_should_be_unknown("(prefers-reduced-motion: none)"); +query_should_be_unknown("(prefers-reduced-motion: 10px)"); +query_should_be_unknown("(prefers-reduced-motion: no-preference reduce)"); +query_should_be_unknown("(prefers-reduced-motion: reduced)"); +query_should_be_unknown("(prefers-reduced-motion: no-preference/reduce)"); test(() => { // What this is saying is that 'no-preference' is not the default, so
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/resources/matchmedia-utils.js b/third_party/blink/web_tests/external/wpt/css/mediaqueries/resources/matchmedia-utils.js index 544f68c0..49ce0bb 100644 --- a/third_party/blink/web_tests/external/wpt/css/mediaqueries/resources/matchmedia-utils.js +++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/resources/matchmedia-utils.js
@@ -47,3 +47,27 @@ assert_false(query_is_js_parseable(query)); }, "Should not be parseable in JS: '" + query + "'"); } + +function query_is_known(query) { + return window.matchMedia(`(${query}) or (not (${query}))`).matches; +} + +function query_is_unknown(query) { + return !window.matchMedia(`(${query}) or (not (${query}))`).matches; +} + +function query_should_be_known(query) { + test(() => { + assert_true(query_is_js_parseable(query), "Can parse with JS"); + assert_true(query_is_css_parseable(query), "Can parse with CSS"); + assert_true(query_is_known(query)); + }, "Should be known: '" + query + "'"); +} + +function query_should_be_unknown(query) { + test(() => { + assert_true(query_is_js_parseable(query), "Can parse with JS"); + assert_true(query_is_css_parseable(query), "Can parse with CSS"); + assert_true(query_is_unknown(query)); + }, "Should be unknown: '" + query + "'"); +}
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/test_media_queries.html b/third_party/blink/web_tests/external/wpt/css/mediaqueries/test_media_queries.html index bacfe4a4..9349f3a 100644 --- a/third_party/blink/web_tests/external/wpt/css/mediaqueries/test_media_queries.html +++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/test_media_queries.html
@@ -30,28 +30,27 @@ return body_cs.getPropertyValue("text-decoration-line") == "underline"; } - function should_apply(q) { - test(function() { - // lazily evaluate template string to avoid including device-specific data in test name - var escaped = JSON.stringify(q); - var evalq = eval("`" + escaped.substring(1, escaped.length - 1) + "`"); - // Also avoid an assert message for the same reason. (Relevant for - // failing tests). - assert_true(query_applies(evalq)); - }, `${testGroup ? testGroup + ": " : ""}should_apply: ${q}`); + function not(predicate) { + return (...args) => !predicate(...args); } - function should_not_apply(q, extraName) { - if (extraName) extraName += " "; - else extraName = ""; - test(function() { + function test_predicate(input, predicate, name) { + test(() => { // lazily evaluate template string to avoid including device-specific data in test name - var escaped = JSON.stringify(q); - var evalq = eval("`" + escaped.substring(1, escaped.length - 1) + "`"); + var escaped = JSON.stringify(input); + var evaled = eval("`" + escaped.substring(1, escaped.length - 1) + "`"); // Also avoid an assert message for the same reason. (Relevant for // failing tests). - assert_false(query_applies(evalq)); - }, `${testGroup ? testGroup + ": " : ""}should_not_apply: ${q}`); + assert_true(predicate(evaled)) + }, `${testGroup ? testGroup + ": " : ""}${name}: ${input}`); + } + + function should_apply(q) { + test_predicate(q, query_applies, "should_apply"); + } + + function should_not_apply(q) { + test_predicate(q, not(query_applies), "should_not_apply"); } /* @@ -78,60 +77,40 @@ } function query_should_be_parseable(q) { - test(function() { - // lazily evaluate template string to avoid including device-specific data in test name - var escaped = JSON.stringify(q); - var evalq = eval("`" + escaped.substring(1, escaped.length - 1) + "`"); - // Also avoid an assert message for the same reason. (Relevant for - // failing tests). - assert_true(query_is_parseable(evalq)) - }, `${testGroup ? testGroup + ": " : ""}query_should_be_parseable: ${q}`); + test_predicate(q, query_is_parseable, "query_should_be_parseable"); } function query_should_not_be_parseable(q) { - test(function() { - // lazily evaluate template string to avoid including device-specific data in test name - var escaped = JSON.stringify(q); - var evalq = eval("`" + escaped.substring(1, escaped.length - 1) + "`"); - // Also avoid an assert message for the same reason. (Relevant for - // failing tests). - assert_false(query_is_parseable(evalq)); - }, `${testGroup ? testGroup + ": " : ""}query_should_not_be_parseable: ${q}`); + test_predicate(q, not(query_is_parseable), "query_should_not_be_parseable"); } /* - * Functions to test whether a single media expression is parseable. + * Functions to test whether a single media expression is "unknown" or not. + * + * https://drafts.csswg.org/mediaqueries-4/#evaluating */ - function expression_is_parseable(e) { - style.setAttribute("media", "all and (" + e + ")"); - return style.sheet.media.mediaText != "not all"; + + function expression_is_known(e) { + return query_is_parseable(`(${e})`) && query_applies(`(${e}) or (not (${e}))`); } - function expression_should_be_parseable(e) { - test(function() { - // lazily evaluate template string to avoid including device-specific data in test name - var escaped = JSON.stringify(e); - var evale = eval("`" + escaped.substring(1, escaped.length - 1) + "`"); - // Also avoid an assert message for the same reason. (Relevant for - // failing tests). - assert_true(expression_is_parseable(evale)); - }, `${testGroup ? testGroup + ": " : ""}expression_should_be_parseable: ${e}`); + function expression_is_unknown(e) { + return query_is_parseable(`(${e})`) && !query_applies(`(${e}) or (not (${e}))`); } - function expression_should_not_be_parseable(e) { - test(function() { - // lazily evaluate template string to avoid including device-specific data in test name - var escaped = JSON.stringify(e); - var evale = eval("`" + escaped.substring(1, escaped.length - 1) + "`"); - // Also avoid an assert message for the same reason. (Relevant for - // failing tests). - assert_false(expression_is_parseable(evale)); - }, `${testGroup ? testGroup + ": " : ""}expression_should_not_be_parseable: ${e}`); + function expression_should_be_known(e) { + test_predicate(e, expression_is_known, "expression_should_be_known"); + } + + function expression_should_be_unknown(e) { + test_predicate(e, expression_is_unknown, "expression_should_be_unknown"); } // The no-type syntax doesn't mix with the not and only keywords. query_should_be_parseable("(orientation)"); query_should_be_parseable("not (orientation)"); + expression_should_be_known("(orientation)"); + expression_should_be_known("not (orientation)"); query_should_not_be_parseable("only (orientation)"); query_should_be_parseable("all and (orientation)"); query_should_be_parseable("not all and (orientation)"); @@ -141,6 +120,9 @@ query_should_be_parseable("(orientation) and (orientation)"); query_should_be_parseable("(orientation) or (orientation)"); query_should_be_parseable("(orientation) or ((orientation) and ((orientation) or (orientation) or (not (orientation))))"); + expression_should_be_known("(orientation) and (orientation)"); + expression_should_be_known("(orientation) or (orientation)"); + expression_should_be_known("(orientation) or ((orientation) and ((orientation) or (orientation) or (not (orientation))))"); query_should_not_be_parseable("all and (orientation) or (orientation)"); query_should_be_parseable("all and (orientation) and (orientation)"); @@ -148,48 +130,57 @@ query_should_not_be_parseable("(orientation) and (orientation) or (orientation)"); query_should_not_be_parseable("(orientation) and not (orientation)"); - var features = [ "width", "height", "device-width", "device-height" ]; var separators = [ ":", ">", ">=", "=", "<=", "<" ]; var feature; var i; for (i in features) { feature = features[i]; - expression_should_be_parseable(feature); - expression_should_not_be_parseable("min-" + feature); - expression_should_not_be_parseable("max-" + feature); + expression_should_be_known(feature); + expression_should_be_unknown("min-" + feature); + expression_should_be_unknown("max-" + feature); for (let separator of separators) { - expression_should_be_parseable(feature + " " + separator + " 0"); - expression_should_be_parseable(feature + " " + separator + " 0px"); - expression_should_be_parseable(feature + " " + separator + " 0em"); - expression_should_be_parseable(feature + " " + separator + " -0"); - expression_should_be_parseable(feature + " " + separator + " -0cm"); - expression_should_be_parseable(feature + " " + separator + " 1px"); - expression_should_be_parseable(feature + " " + separator + " 0.001mm"); - expression_should_be_parseable(feature + " " + separator + " 100000px"); + expression_should_be_known(feature + " " + separator + " 0"); + expression_should_be_known(feature + " " + separator + " 0px"); + expression_should_be_known(feature + " " + separator + " 0em"); + expression_should_be_known(feature + " " + separator + " -0"); + expression_should_be_known(feature + " " + separator + " -0cm"); + expression_should_be_known(feature + " " + separator + " 1px"); + expression_should_be_known(feature + " " + separator + " 0.001mm"); + expression_should_be_known(feature + " " + separator + " 100000px"); if (separator == ":") { - expression_should_be_parseable("min-" + feature + " " + separator + " -0"); - expression_should_be_parseable("max-" + feature + " " + separator + " -0"); + expression_should_be_known("min-" + feature + " " + separator + " -0"); + expression_should_be_known("max-" + feature + " " + separator + " -0"); } else { - expression_should_not_be_parseable("min-" + feature + " " + separator + " -0"); - expression_should_not_be_parseable("max-" + feature + " " + separator + " -0"); + expression_should_be_unknown("min-" + feature + " " + separator + " -0"); + expression_should_be_unknown("max-" + feature + " " + separator + " -0"); let multi_range = "0px " + separator + " " + feature + " " + separator + " 100000px" if (separator == "=") { - expression_should_not_be_parseable(multi_range); + expression_should_be_unknown(multi_range); } else { - expression_should_be_parseable(multi_range); + expression_should_be_known(multi_range); } } if (separator == ">=") { - expression_should_not_be_parseable(feature + " > = 0px"); + expression_should_be_unknown(feature + " > = 0px"); } else if (separator == "<=") { - expression_should_not_be_parseable(feature + " < = 0px"); + expression_should_be_unknown(feature + " < = 0px"); } - expression_should_not_be_parseable(feature + " " + separator + " -1px"); - expression_should_not_be_parseable("min-" + feature + " " + separator + " -1px"); - expression_should_not_be_parseable("max-" + feature + " " + separator + " -1px"); - expression_should_not_be_parseable(feature + " " + separator + " -0.00001mm"); - expression_should_not_be_parseable(feature + " " + separator + " -100000em"); + + expression_should_be_unknown(feature + " " + separator + " -1px"); + expression_should_be_unknown("min-" + feature + " " + separator + " -1px"); + expression_should_be_unknown("max-" + feature + " " + separator + " -1px"); + expression_should_be_unknown(feature + " " + separator + " -0.00001mm"); + expression_should_be_unknown(feature + " " + separator + " -100000em"); + + for (let separator2 of separators) { + // https://drafts.csswg.org/mediaqueries-4/#typedef-mf-range + if (separator[0] == separator2[0] && (separator[0] == '<' || separator[0] == '>')) { + expression_should_be_known(`0px ${separator} ${feature} ${separator2} 0px`); + } else { + expression_should_be_unknown(`0px ${separator} ${feature} ${separator2} 0px`); + } + } } } @@ -252,6 +243,20 @@ should_apply("(" + feature + " >= ${value - 1}px)"); should_not_apply("(" + feature + " < ${value - 1}px)"); should_not_apply("(" + feature + " <= ${value - 1}px)"); + + should_apply("(${value - 1}px < " + feature + ")"); + should_apply("(${value - 1}px <= " + feature + ")"); + should_not_apply("(${value - 1}px > " + feature + ")"); + should_not_apply("(${value - 1}px >= " + feature + ")"); + + should_apply("(${value - 1}px < " + feature + " < ${value + 1}px)"); + should_apply("(${value - 1}px < " + feature + " <= ${value}px)"); + should_apply("(${value}px <= " + feature + " < ${value + 1}px)"); + should_apply("(${value + 1}px > " + feature + " > ${value - 1}px)"); + should_apply("(${value + 1}px > " + feature + " >= ${value}px)"); + should_apply("(${value}px >= " + feature + " > ${value - 1}px)"); + should_not_apply("(${value}px > " + feature + " > ${value - 1}px)"); + should_not_apply("(${value + 1}px > " + feature + " > ${value}px)"); } iframe_style.width = "0"; @@ -277,15 +282,15 @@ testGroup = "ratio that reduces to 59/40"; iframe_style.width = "236px"; iframe_style.height = "160px"; - expression_should_be_parseable("orientation"); - expression_should_be_parseable("orientation: portrait"); - expression_should_be_parseable("orientation: landscape"); - expression_should_not_be_parseable("min-orientation"); - expression_should_not_be_parseable("min-orientation: portrait"); - expression_should_not_be_parseable("min-orientation: landscape"); - expression_should_not_be_parseable("max-orientation"); - expression_should_not_be_parseable("max-orientation: portrait"); - expression_should_not_be_parseable("max-orientation: landscape"); + expression_should_be_known("orientation"); + expression_should_be_known("orientation: portrait"); + expression_should_be_known("orientation: landscape"); + expression_should_be_unknown("min-orientation"); + expression_should_be_unknown("min-orientation: portrait"); + expression_should_be_unknown("min-orientation: landscape"); + expression_should_be_unknown("max-orientation"); + expression_should_be_unknown("max-orientation: portrait"); + expression_should_be_unknown("max-orientation: landscape"); should_apply("(orientation)"); should_apply("(orientation: landscape)"); should_not_apply("(orientation: portrait)"); @@ -318,14 +323,14 @@ should_apply("(min-aspect-ratio: 59/81)"); should_not_apply("(min-aspect-ratio: 60/80)"); should_not_apply("(min-aspect-ratio: 59/79)"); - expression_should_not_be_parseable("min-aspect-ratio"); + expression_should_be_unknown("min-aspect-ratio"); should_apply("(max-aspect-ratio: 59/80)"); should_not_apply("(max-aspect-ratio: 58/80)"); should_not_apply("(max-aspect-ratio: 59/81)"); should_apply("(max-aspect-ratio: 60/80)"); should_apply("(max-aspect-ratio: 59/79)"); - expression_should_not_be_parseable("max-aspect-ratio"); + expression_should_be_unknown("max-aspect-ratio"); var real_dar = device_width + "/" + device_height; var high_dar_1 = (device_width + 1) + "/" + device_height; @@ -344,36 +349,36 @@ should_apply("not all and (min-device-aspect-ratio: ${high_dar_2})"); should_not_apply("not all and (min-device-aspect-ratio: ${low_dar_1})"); should_apply("all and (min-device-aspect-ratio: ${low_dar_2})"); - expression_should_not_be_parseable("min-device-aspect-ratio"); + expression_should_be_unknown("min-device-aspect-ratio"); should_apply("all and (max-device-aspect-ratio: ${real_dar})"); should_apply("(max-device-aspect-ratio: ${high_dar_1})"); should_apply("(max-device-aspect-ratio: ${high_dar_2})"); should_not_apply("all and (max-device-aspect-ratio: ${low_dar_1})"); should_apply("not all and (max-device-aspect-ratio: ${low_dar_2})"); - expression_should_not_be_parseable("max-device-aspect-ratio"); + expression_should_be_unknown("max-device-aspect-ratio"); features = [ "max-aspect-ratio", "device-aspect-ratio" ]; for (i in features) { feature = features[i]; - expression_should_be_parseable(feature + ": 1/1"); - expression_should_be_parseable(feature + ": 1 /1"); - expression_should_be_parseable(feature + ": 1 / \t\n1"); - expression_should_be_parseable(feature + ": 1/\r1"); - expression_should_be_parseable(feature + ": 1"); - expression_should_be_parseable(feature + ": 0.5"); - expression_should_be_parseable(feature + ": 1.0/1"); - expression_should_be_parseable(feature + ": 1/1.0"); - expression_should_be_parseable(feature + ": 1.0/1.0"); - expression_should_be_parseable(feature + ": 0/1"); - expression_should_be_parseable(feature + ": 1/0"); - expression_should_be_parseable(feature + ": 0/0"); - expression_should_not_be_parseable(feature + ": -1/1"); - expression_should_not_be_parseable(feature + ": 1/-1"); - expression_should_not_be_parseable(feature + ": -1/-1"); - expression_should_not_be_parseable(feature + ": invalid"); - expression_should_not_be_parseable(feature + ": 1 / invalid"); - expression_should_not_be_parseable(feature + ": 1 invalid"); + expression_should_be_known(feature + ": 1/1"); + expression_should_be_known(feature + ": 1 /1"); + expression_should_be_known(feature + ": 1 / \t\n1"); + expression_should_be_known(feature + ": 1/\r1"); + expression_should_be_known(feature + ": 1"); + expression_should_be_known(feature + ": 0.5"); + expression_should_be_known(feature + ": 1.0/1"); + expression_should_be_known(feature + ": 1/1.0"); + expression_should_be_known(feature + ": 1.0/1.0"); + expression_should_be_known(feature + ": 0/1"); + expression_should_be_known(feature + ": 1/0"); + expression_should_be_known(feature + ": 0/0"); + expression_should_be_unknown(feature + ": -1/1"); + expression_should_be_unknown(feature + ": 1/-1"); + expression_should_be_unknown(feature + ": -1/-1"); + expression_should_be_unknown(feature + ": invalid"); + expression_should_be_unknown(feature + ": 1 / invalid"); + expression_should_be_unknown(feature + ": 1 invalid"); } var is_monochrome = query_applies("all and (min-monochrome: 1)"); @@ -406,11 +411,11 @@ should_apply(depth_query("max-", depth + 1)); (is_color ? should_apply : should_not_apply)("all and (color)"); - expression_should_not_be_parseable("max-color"); - expression_should_not_be_parseable("min-color"); + expression_should_be_unknown("max-color"); + expression_should_be_unknown("min-color"); (is_color ? should_not_apply : should_apply)("all and (monochrome)"); - expression_should_not_be_parseable("max-monochrome"); - expression_should_not_be_parseable("min-monochrome"); + expression_should_be_unknown("max-monochrome"); + expression_should_be_unknown("min-monochrome"); (is_color ? should_apply : should_not_apply)("not all and (monochrome)"); (is_color ? should_not_apply : should_apply)("not all and (color)"); (is_color ? should_apply : should_not_apply)("only all and (color)"); @@ -419,12 +424,12 @@ features = [ "color", "min-monochrome", "max-color-index" ]; for (i in features) { feature = features[i]; - expression_should_be_parseable(feature + ": 1"); - expression_should_be_parseable(feature + ": 327"); - expression_should_be_parseable(feature + ": 0"); - expression_should_not_be_parseable(feature + ": 1.0"); - expression_should_not_be_parseable(feature + ": -1"); - expression_should_not_be_parseable(feature + ": 1/1"); + expression_should_be_known(feature + ": 1"); + expression_should_be_known(feature + ": 327"); + expression_should_be_known(feature + ": 0"); + expression_should_be_unknown(feature + ": 1.0"); + expression_should_be_unknown(feature + ": -1"); + expression_should_be_unknown(feature + ": 1/1"); } // Presume that we never support indexed color (at least not usefully @@ -440,21 +445,21 @@ features = [ "resolution", "min-resolution", "max-resolution" ]; for (i in features) { feature = features[i]; - expression_should_be_parseable(feature + ": 3dpi"); - expression_should_be_parseable(feature + ":3dpi"); - expression_should_be_parseable(feature + ": 3.0dpi"); - expression_should_be_parseable(feature + ": 3.4dpi"); - expression_should_be_parseable(feature + "\t: 120dpcm"); - expression_should_be_parseable(feature + ": 1dppx"); - expression_should_be_parseable(feature + ": 1x"); - expression_should_be_parseable(feature + ": 1.5dppx"); - expression_should_be_parseable(feature + ": 1.5x"); - expression_should_be_parseable(feature + ": 2.0dppx"); + expression_should_be_known(feature + ": 3dpi"); + expression_should_be_known(feature + ":3dpi"); + expression_should_be_known(feature + ": 3.0dpi"); + expression_should_be_known(feature + ": 3.4dpi"); + expression_should_be_known(feature + "\t: 120dpcm"); + expression_should_be_known(feature + ": 1dppx"); + expression_should_be_known(feature + ": 1x"); + expression_should_be_known(feature + ": 1.5dppx"); + expression_should_be_known(feature + ": 1.5x"); + expression_should_be_known(feature + ": 2.0dppx"); // TODO(emilio): Doesn't seem right to exclude 0 here. - expression_should_not_be_parseable(feature + ": 0dpi"); - expression_should_not_be_parseable(feature + ": -3dpi"); - expression_should_not_be_parseable(feature + ": 0dppx"); - expression_should_not_be_parseable(feature + ": 0x"); + expression_should_be_unknown(feature + ": 0dpi"); + expression_should_be_unknown(feature + ": -3dpi"); + expression_should_be_unknown(feature + ": 0dppx"); + expression_should_be_unknown(feature + ": 0x"); } // Find the resolution using max-resolution @@ -504,13 +509,13 @@ should_not_apply("(max-resolution: ${dpcm_low}dpcm)"); should_apply("not all and (min-resolution: ${dpcm_high}dpcm)"); - expression_should_be_parseable("scan"); - expression_should_be_parseable("scan: progressive"); - expression_should_be_parseable("scan:interlace"); - expression_should_not_be_parseable("min-scan:interlace"); - expression_should_not_be_parseable("scan: 1"); - expression_should_not_be_parseable("max-scan"); - expression_should_not_be_parseable("max-scan: progressive"); + expression_should_be_known("scan"); + expression_should_be_known("scan: progressive"); + expression_should_be_known("scan:interlace"); + expression_should_be_unknown("min-scan:interlace"); + expression_should_be_unknown("scan: 1"); + expression_should_be_unknown("max-scan"); + expression_should_be_unknown("max-scan: progressive"); // Assume we don't support tv devices. should_not_apply("(scan)"); should_not_apply("(scan: progressive)"); @@ -519,14 +524,14 @@ should_apply("not all and (scan: progressive)"); should_apply("not all and (scan: interlace)"); - expression_should_be_parseable("grid"); - expression_should_be_parseable("grid: 0"); - expression_should_be_parseable("grid: 1"); - expression_should_not_be_parseable("min-grid"); - expression_should_not_be_parseable("min-grid:0"); - expression_should_not_be_parseable("max-grid: 1"); - expression_should_not_be_parseable("grid: 2"); - expression_should_not_be_parseable("grid: -1"); + expression_should_be_known("grid"); + expression_should_be_known("grid: 0"); + expression_should_be_known("grid: 1"); + expression_should_be_unknown("min-grid"); + expression_should_be_unknown("min-grid:0"); + expression_should_be_unknown("max-grid: 1"); + expression_should_be_unknown("grid: 2"); + expression_should_be_unknown("grid: -1"); // Assume we don't support grid devices should_not_apply("(grid)"); @@ -574,12 +579,12 @@ should_not_apply("only all and (bogus)") // Parsing tests for overflow-block from mediaqueries-4 - expression_should_be_parseable("overflow-block") - expression_should_be_parseable("overflow-block: none") - expression_should_be_parseable("overflow-block: paged") - expression_should_be_parseable("overflow-block: scroll") - expression_should_be_parseable("overflow-block: optional-paged") - expression_should_not_be_parseable("overflow-block: some-random-invalid-thing") + expression_should_be_known("overflow-block") + expression_should_be_known("overflow-block: none") + expression_should_be_known("overflow-block: paged") + expression_should_be_known("overflow-block: scroll") + expression_should_be_known("overflow-block: optional-paged") + expression_should_be_unknown("overflow-block: some-random-invalid-thing") // Sanity check for overflow-block test(function() { @@ -589,10 +594,10 @@ }, "Sanity check for overflow-block"); // Parsing tests for overflow-inline from mediaqueries-4 - expression_should_be_parseable("overflow-inline") - expression_should_be_parseable("overflow-inline: none") - expression_should_be_parseable("overflow-inline: scroll") - expression_should_not_be_parseable("overflow-inline: some-random-invalid-thing") + expression_should_be_known("overflow-inline") + expression_should_be_known("overflow-inline: none") + expression_should_be_known("overflow-inline: scroll") + expression_should_be_unknown("overflow-inline: some-random-invalid-thing") // Sanity check for overflow-inline test(function() { @@ -602,12 +607,12 @@ }, "Sanity check for overflow-inline"); // Parsing tests for interaction media features. - expression_should_be_parseable("hover") - expression_should_be_parseable("hover: hover") - expression_should_be_parseable("hover: none") - expression_should_be_parseable("any-hover") - expression_should_be_parseable("any-hover: hover") - expression_should_be_parseable("any-hover: none") + expression_should_be_known("hover") + expression_should_be_known("hover: hover") + expression_should_be_known("hover: none") + expression_should_be_known("any-hover") + expression_should_be_known("any-hover: hover") + expression_should_be_known("any-hover: none") test(function() { assert_equals(query_applies("(hover)"), query_applies("(hover: hover)")); @@ -625,14 +630,14 @@ assert_not_equals(query_applies("(any-hover)"), query_applies("(any-hover: none)")); }, "(any-hover) == not (any-hover: none)"); - expression_should_be_parseable("pointer") - expression_should_be_parseable("pointer: coarse") - expression_should_be_parseable("pointer: fine") - expression_should_be_parseable("pointer: none") - expression_should_be_parseable("any-pointer") - expression_should_be_parseable("any-pointer: coarse") - expression_should_be_parseable("any-pointer: fine") - expression_should_be_parseable("any-pointer: none") + expression_should_be_known("pointer") + expression_should_be_known("pointer: coarse") + expression_should_be_known("pointer: fine") + expression_should_be_known("pointer: none") + expression_should_be_known("any-pointer") + expression_should_be_known("any-pointer: coarse") + expression_should_be_known("any-pointer: fine") + expression_should_be_known("any-pointer: none") test(function() { assert_equals(query_applies("(pointer)"), @@ -654,6 +659,33 @@ query_applies("(any-pointer: none)")); }, "(any-pointer) == not (any-pointer: none)"); + iframe_style.width = '100px'; + iframe_style.height = '0px'; + + testGroup = "'or' keyword" + should_not_apply("(height) or (height)"); + should_apply("(width) or (height)"); + should_apply("(height) or (width)"); + should_apply("(height) or (width) or (height)"); + query_should_not_be_parseable("screen or (width)"); + query_should_not_be_parseable("screen and (width) or (height)"); + + testGroup = "nesting" + should_not_apply("((height))"); + should_apply("((width))"); + should_apply("(((((width)))))"); + should_apply("(((((width"); + + testGroup = "'not' keyword" + should_not_apply("not (width)"); + should_apply("not (height)"); + should_apply("not ((width) and (height))"); + should_not_apply("not ((width) or (height))"); + should_not_apply("not ((width) and (not (height)))"); + query_should_not_be_parseable("not (width) and not (height)"); + query_should_not_be_parseable("not not (width)"); + + testGroup = "" done(); }
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html index ab1b2b2..56bd12af 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/sizes/support/sizes-iframed.sub.html
@@ -82,7 +82,7 @@ <img srcset='/images/green-1x1.png?e60 50w, /images/green-16x16.png?e60 51w' sizes='(min-width:0) or (min-width:-1px) 1px'> <img srcset='/images/green-1x1.png?e61 50w, /images/green-16x16.png?e61 51w' sizes='(min-width:0) or (unknown "general-enclosed") 1px'> <img srcset='/images/green-1x1.png?e62 50w, /images/green-16x16.png?e62 51w' sizes='(min-width:0) or unknown-general-enclosed(foo) 1px'> -<img srcset='/images/green-1x1.png?e63 50w, /images/green-16x16.png?e63 51w' sizes='(min-width:0) or (!) 100vw, 1px'> +<img srcset='/images/green-1x1.png?e63 50w, /images/green-16x16.png?e63 51w' sizes='(min-width:0) or (]) 100vw, 1px'> <img srcset='/images/green-1x1.png?e64 50w, /images/green-16x16.png?e64 51w' sizes='(min-width:0) or unknown-media-type 100vw, 1px'> <img srcset='/images/green-1x1.png?e65 50w, /images/green-16x16.png?e65 51w' sizes='(123) 100vw, 1px'> <img srcset='/images/green-1x1.png?e66 50w, /images/green-16x16.png?e66 51w' sizes='not (123) 100vw, 1px'>
diff --git a/third_party/blink/web_tests/external/wpt/referrer-policy/OWNERS b/third_party/blink/web_tests/external/wpt/referrer-policy/OWNERS index bd355dd..abc6202b 100644 --- a/third_party/blink/web_tests/external/wpt/referrer-policy/OWNERS +++ b/third_party/blink/web_tests/external/wpt/referrer-policy/OWNERS
@@ -1,2 +1 @@ -jochen@chromium.org estark@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/script-supports-speculationrules.html b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/script-supports-speculationrules.html new file mode 100644 index 0000000..2dc856fc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prerender/script-supports-speculationrules.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html> +<title>HTMLScriptElement.supports speculationrules</title> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(function() { + assert_true(HTMLScriptElement.supports('speculationrules')); +}, 'HTMLScriptElement.supports returns true for \'speculationrules\''); + +test(function() { + assert_false(HTMLScriptElement.supports(' speculationrules')); + assert_false(HTMLScriptElement.supports('speculationrules ')); + assert_false(HTMLScriptElement.supports('Speculationrules')); + assert_false(HTMLScriptElement.supports('SpeculationRules')); + assert_false(HTMLScriptElement.supports('speculationRules')); + assert_false(HTMLScriptElement.supports('speculation-rules')); +}, 'HTMLScriptElement.supports returns false for unsupported types'); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/streams/piping/abort.any.js b/third_party/blink/web_tests/external/wpt/streams/piping/abort.any.js index bb62dc8..45a358d 100644 --- a/third_party/blink/web_tests/external/wpt/streams/piping/abort.any.js +++ b/third_party/blink/web_tests/external/wpt/streams/piping/abort.any.js
@@ -385,3 +385,24 @@ assert_array_equals(rs.events, ['pull'], 'cancel should not have been called'); }); }, 'abort should do nothing after the writable is errored'); + +promise_test(async t => { + const rs = new ReadableStream({ + pull(c) { + c.enqueue(new Uint8Array([])); + }, + type: "bytes", + }); + const ws = new WritableStream(); + const [first, second] = rs.tee(); + + let aborted = false; + first.pipeTo(ws, { signal: AbortSignal.abort() }).catch(() => { + aborted = true; + }); + await delay(0); + assert_true(!aborted, "pipeTo should not resolve yet"); + await second.cancel(); + await delay(0); + assert_true(aborted, "pipeTo should be aborted now"); +}, "pipeTo on a teed readable byte stream should only be aborted when both branches are aborted");
diff --git a/third_party/blink/web_tests/external/wpt/subresource-integrity/OWNERS b/third_party/blink/web_tests/external/wpt/subresource-integrity/OWNERS index 75bf0dee..3f84563 100644 --- a/third_party/blink/web_tests/external/wpt/subresource-integrity/OWNERS +++ b/third_party/blink/web_tests/external/wpt/subresource-integrity/OWNERS
@@ -1,2 +1 @@ mkwst@chromium.org -jochen@chromium.org
diff --git a/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-0args.html b/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-0args.html index ca03972..0762d24 100644 --- a/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-0args.html +++ b/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-0args.html
@@ -5,9 +5,9 @@ <script src="../../../resources/testharnessreport.js"></script> <body> <script> -const DocumentOpenTwoArgs = 2494; // From public/mojom/web_feature/web_feature.mojom -const DocumentOpenTwoArgsWithReplace = 2495; // From public/mojom/web_feature/web_feature.mojom -const DocumentOpenThreeArgs = 2496; // From public/mojom/web_feature/web_feature.mojom +const DocumentOpenTwoArgs = 2494; // From public/mojom/use_counter/metrics/web_feature.mojom +const DocumentOpenTwoArgsWithReplace = 2495; // From public/mojom/use_counter/metrics/web_feature.mojom +const DocumentOpenThreeArgs = 2496; // From public/mojom/use_counter/metrics/web_feature.mojom test(() => { const frame = document.body.appendChild(document.createElement('iframe'));
diff --git a/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-1arg.html b/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-1arg.html index 7d6aa5ac..06449ccd 100644 --- a/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-1arg.html +++ b/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-1arg.html
@@ -5,9 +5,9 @@ <script src="../../../resources/testharnessreport.js"></script> <body> <script> -const DocumentOpenTwoArgs = 2494; // From public/mojom/web_feature/web_feature.mojom -const DocumentOpenTwoArgsWithReplace = 2495; // From public/mojom/web_feature/web_feature.mojom -const DocumentOpenThreeArgs = 2496; // From public/mojom/web_feature/web_feature.mojom +const DocumentOpenTwoArgs = 2494; // From public/mojom/use_counter/metrics/web_feature.mojom +const DocumentOpenTwoArgsWithReplace = 2495; // From public/mojom/use_counter/metrics/web_feature.mojom +const DocumentOpenThreeArgs = 2496; // From public/mojom/use_counter/metrics/web_feature.mojom test(() => { const frame = document.body.appendChild(document.createElement('iframe'));
diff --git a/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-2args-replace.html b/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-2args-replace.html index 56e44f57..3d880b7 100644 --- a/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-2args-replace.html +++ b/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-2args-replace.html
@@ -5,9 +5,9 @@ <script src="../../../resources/testharnessreport.js"></script> <body> <script> -const DocumentOpenTwoArgs = 2494; // From public/mojom/web_feature/web_feature.mojom -const DocumentOpenTwoArgsWithReplace = 2495; // From public/mojom/web_feature/web_feature.mojom -const DocumentOpenThreeArgs = 2496; // From public/mojom/web_feature/web_feature.mojom +const DocumentOpenTwoArgs = 2494; // From public/mojom/use_counter/metrics/web_feature.mojom +const DocumentOpenTwoArgsWithReplace = 2495; // From public/mojom/use_counter/metrics/web_feature.mojom +const DocumentOpenThreeArgs = 2496; // From public/mojom/use_counter/metrics/web_feature.mojom test(() => { const frame = document.body.appendChild(document.createElement('iframe'));
diff --git a/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-2args.html b/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-2args.html index 34befbf..43c050c 100644 --- a/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-2args.html +++ b/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-2args.html
@@ -5,9 +5,9 @@ <script src="../../../resources/testharnessreport.js"></script> <body> <script> -const DocumentOpenTwoArgs = 2494; // From public/mojom/web_feature/web_feature.mojom -const DocumentOpenTwoArgsWithReplace = 2495; // From public/mojom/web_feature/web_feature.mojom -const DocumentOpenThreeArgs = 2496; // From public/mojom/web_feature/web_feature.mojom +const DocumentOpenTwoArgs = 2494; // From public/mojom/use_counter/metrics/web_feature.mojom +const DocumentOpenTwoArgsWithReplace = 2495; // From public/mojom/use_counter/metrics/web_feature.mojom +const DocumentOpenThreeArgs = 2496; // From public/mojom/use_counter/metrics/web_feature.mojom test(() => { const frame = document.body.appendChild(document.createElement('iframe'));
diff --git a/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-3args.html b/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-3args.html index ca1a938a..2ac2b9b 100644 --- a/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-3args.html +++ b/third_party/blink/web_tests/fast/dom/Document/document-open-use-counters-3args.html
@@ -5,9 +5,9 @@ <script src="../../../resources/testharnessreport.js"></script> <body> <script> -const DocumentOpenTwoArgs = 2494; // From public/mojom/web_feature/web_feature.mojom -const DocumentOpenTwoArgsWithReplace = 2495; // From public/mojom/web_feature/web_feature.mojom -const DocumentOpenThreeArgs = 2496; // From public/mojom/web_feature/web_feature.mojom +const DocumentOpenTwoArgs = 2494; // From public/mojom/use_counter/metrics/web_feature.mojom +const DocumentOpenTwoArgsWithReplace = 2495; // From public/mojom/use_counter/metrics/web_feature.mojom +const DocumentOpenThreeArgs = 2496; // From public/mojom/use_counter/metrics/web_feature.mojom test(() => { const frame = document.body.appendChild(document.createElement('iframe'));
diff --git a/third_party/blink/web_tests/fast/media/media-query-list-syntax.html b/third_party/blink/web_tests/fast/media/media-query-list-syntax.html index d24f711..6abb21a 100644 --- a/third_party/blink/web_tests/fast/media/media-query-list-syntax.html +++ b/third_party/blink/web_tests/fast/media/media-query-list-syntax.html
@@ -11,14 +11,11 @@ var tests = [ [ "@media all, not,{}", "all, not all, not all" , "Media query error #1" ], - [ "@media screen, all and f() {}", "screen, not all", "Media query error #2" ], - [ "@media not and (color), #screen, screen {}", "not all, not all, screen", "Media query error #3" ], - [ "@media all; @media tv {}", "tv", "Media query error #4" ], - [ "@media ({ block, }), tv {}", "not all, tv", "Media query error #5" ], - [ "@media screen and(color), tv {}", "not all, tv", "Media query error #6" ], - [ "@media all and (color) and (f() {}), tv {}", "not all, tv", "Media query error #7" ], - [ "@media tv, all or (nothing) {}", "tv, not all", "Media query error #8" ], - [ "@media tv, all and (color) tv {}", "tv, not all", "Media query error #9" ] + [ "@media not and (color), #screen, screen {}", "not all, not all, screen", "Media query error #2" ], + [ "@media all; @media tv {}", "tv", "Media query error #3" ], + [ "@media screen and(color), tv {}", "not all, tv", "Media query error #4" ], + [ "@media tv, all or (nothing) {}", "tv, not all", "Media query error #5" ], + [ "@media tv, all and (color) tv {}", "tv, not all", "Media query error #6" ] ]; var cdataNode = document.getElementById("sheet").firstChild; for (var i=0; i < tests.length; i++) {
diff --git a/third_party/blink/web_tests/fast/media/mq-color-index-02.html b/third_party/blink/web_tests/fast/media/mq-color-index-02.html index 77803f1..07d0ea5 100644 --- a/third_party/blink/web_tests/fast/media/mq-color-index-02.html +++ b/third_party/blink/web_tests/fast/media/mq-color-index-02.html
@@ -6,34 +6,21 @@ <link rel="help" href="http://www.w3.org/TR/css3-mediaqueries/#color-index"/> <script src="../../resources/testharness.js"></script> <script src="../../resources/testharnessreport.js"></script> - <style> - @media (color-index: 0.0) {} - @media (color-index: -1) {} - @media (color-index: 2.1) {} - </style> <head> <body> <div id="log"></div> <script> - test(function(){ - assert_true(!!document.styleSheets[0]); - assert_true(!!document.styleSheets[0].cssRules); - assert_equals(document.styleSheets[0].cssRules.length, 3); - }, "CSSOM Sanity check"); - var rules = document.styleSheets[0].cssRules; + function test_unknown(query) { + test(() => { + assert_false(matchMedia(`${query} or (not ${query})`).matches); + }, `${query} is unknown`); + return ; + } - test(function(){ - assert_equals(rules[0].media.mediaText, "not all"); - }, "(color-index: 0.0) is invalid"); - - test(function(){ - assert_equals(rules[1].media.mediaText, "not all"); - }, "(color-index: -1) is invalid"); - - test(function(){ - assert_equals(rules[2].media.mediaText, "not all"); - }, "(color-index: 2.1) is invalid"); + test_unknown("(color-index: 0.0)"); + test_unknown("(color-index: -1)"); + test_unknown("(color-index: 2.1)"); </script> </body> </html>
diff --git a/third_party/blink/web_tests/fast/media/mq-parsing.html b/third_party/blink/web_tests/fast/media/mq-parsing.html index 4dda62a..819e011 100644 --- a/third_party/blink/web_tests/fast/media/mq-parsing.html +++ b/third_party/blink/web_tests/fast/media/mq-parsing.html
@@ -63,7 +63,7 @@ } catch(e) { output = null; } - printOut("not all, screen, not all, not all, not all, not all", mediaList.mediaText); + printOut("not all, screen, not all, (invalid,), not all, not all", mediaList.mediaText); output = "all"; try { @@ -71,7 +71,7 @@ } catch(e) { output = null; } - printOut("not all, not all, not all, not all", mediaList.mediaText); + printOut("not all, (all,), not all, not all", mediaList.mediaText); } </script> </head>
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/geometry/clipping-foreground-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/geometry/clipping-foreground-expected.png deleted file mode 100644 index 17ecc75..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/geometry/clipping-foreground-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/gestures/gesture-tapHighlight-with-squashing-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/gestures/gesture-tapHighlight-with-squashing-expected.png deleted file mode 100644 index 32c752f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/gestures/gesture-tapHighlight-with-squashing-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/overflow/accelerated-scrolling-with-clip-path-text-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/overflow/accelerated-scrolling-with-clip-path-text-expected.png deleted file mode 100644 index 2a3bc499..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/overflow/accelerated-scrolling-with-clip-path-text-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/overflow/nested-scrolling-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/overflow/nested-scrolling-expected.png deleted file mode 100644 index 424a63cd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/overflow/nested-scrolling-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/overflow/overflow-scroll-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/overflow/overflow-scroll-expected.png deleted file mode 100644 index b4f240bc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/overflow/overflow-scroll-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/reflections/deeply-nested-reflections-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/reflections/deeply-nested-reflections-expected.png deleted file mode 100644 index 29608191..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/reflections/deeply-nested-reflections-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/self-painting-layers-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/self-painting-layers-expected.png deleted file mode 100644 index d8e4270f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/self-painting-layers-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/text-on-scaled-surface-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/text-on-scaled-surface-expected.png deleted file mode 100644 index 8565cbc1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/text-on-scaled-surface-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/basic/contextual_selectors-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/basic/contextual_selectors-expected.png deleted file mode 100644 index 639afbe..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/basic/contextual_selectors-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/box_properties/float_elements_in_series-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/box_properties/float_elements_in_series-expected.png deleted file mode 100644 index d82e569d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/box_properties/float_elements_in_series-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/box_properties/float_margin-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/box_properties/float_margin-expected.png deleted file mode 100644 index 02494cae0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/box_properties/float_margin-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/font_properties/font-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/font_properties/font-expected.png deleted file mode 100644 index ef2a8b31..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/font_properties/font-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/font_properties/font_family-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/font_properties/font_family-expected.png deleted file mode 100644 index 87df46e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/font_properties/font_family-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/font_properties/font_size-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/font_properties/font_size-expected.png deleted file mode 100644 index 7a491ca..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/font_properties/font_size-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/pseudo/firstline-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/pseudo/firstline-expected.png deleted file mode 100644 index d03bc2f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/pseudo/firstline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/pseudo/multiple_pseudo_elements-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/pseudo/multiple_pseudo_elements-expected.png deleted file mode 100644 index d4b5acc4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/pseudo/multiple_pseudo_elements-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/text_properties/line_height-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/text_properties/line_height-expected.png deleted file mode 100644 index bad43df..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css1/text_properties/line_height-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t051201-c23-first-line-00-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t051201-c23-first-line-00-b-expected.png deleted file mode 100644 index a01c055..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t051201-c23-first-line-00-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t051202-c24-first-lttr-00-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t051202-c24-first-lttr-00-b-expected.png deleted file mode 100644 index 6ba7110..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t051202-c24-first-lttr-00-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t051202-c26-psudo-nest-00-c-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t051202-c26-psudo-nest-00-c-expected.png deleted file mode 100644 index 3383fab5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t051202-c26-psudo-nest-00-c-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t0905-c5525-fltwidth-01-c-g-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t0905-c5525-fltwidth-01-c-g-expected.png deleted file mode 100644 index 3dba1f46..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t0905-c5525-fltwidth-01-c-g-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t0905-c5525-fltwidth-02-c-g-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t0905-c5525-fltwidth-02-c-g-expected.png deleted file mode 100644 index 2c2a839..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t0905-c5525-fltwidth-02-c-g-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t090501-c414-flt-ln-00-d-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t090501-c414-flt-ln-00-d-expected.png deleted file mode 100644 index 11ddd16f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t090501-c414-flt-ln-00-d-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t090501-c414-flt-ln-01-d-g-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t090501-c414-flt-ln-01-d-g-expected.png deleted file mode 100644 index 18c43cd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t090501-c414-flt-ln-01-d-g-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t090501-c414-flt-ln-02-d-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t090501-c414-flt-ln-02-d-expected.png deleted file mode 100644 index 319ecf9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t090501-c414-flt-ln-02-d-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t090501-c414-flt-ln-03-d-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t090501-c414-flt-ln-03-d-expected.png deleted file mode 100644 index b2f8c65..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t090501-c414-flt-ln-03-d-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t1503-c522-font-family-00-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t1503-c522-font-family-00-b-expected.png deleted file mode 100644 index cd1654cf..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t1503-c522-font-family-00-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t1507-c526-font-sz-00-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t1507-c526-font-sz-00-b-expected.png deleted file mode 100644 index 9ae2ff6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t1507-c526-font-sz-00-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t1508-c527-font-04-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t1508-c527-font-04-b-expected.png deleted file mode 100644 index 9f2ac78..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t1508-c527-font-04-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t1508-c527-font-09-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t1508-c527-font-09-b-expected.png deleted file mode 100644 index 9e3b0f81..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t1508-c527-font-09-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-11-d-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-11-d-expected.png deleted file mode 100644 index 82f5f32..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-11-d-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-12-d-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-12-d-expected.png deleted file mode 100644 index 0608b702..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-12-d-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-21-d-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-21-d-expected.png deleted file mode 100644 index 1a8597d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-21-d-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-22-d-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-22-d-expected.png deleted file mode 100644 index 7d15744c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-22-d-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-31-d-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-31-d-expected.png deleted file mode 100644 index b5cb0e1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-31-d-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-32-d-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-32-d-expected.png deleted file mode 100644 index 5d71f66..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css2.1/t170602-bdr-conflct-w-32-d-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/html/css3-modsel-19b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/html/css3-modsel-19b-expected.png deleted file mode 100644 index 6e7e6dc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/html/css3-modsel-19b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/html/css3-modsel-64-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/html/css3-modsel-64-expected.png deleted file mode 100644 index 0a95c30..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/html/css3-modsel-64-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/xhtml/css3-modsel-19b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/xhtml/css3-modsel-19b-expected.png deleted file mode 100644 index 6e7e6dc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/xhtml/css3-modsel-19b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/xhtml/css3-modsel-64-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/xhtml/css3-modsel-64-expected.png deleted file mode 100644 index 0a95c30..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/xhtml/css3-modsel-64-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/xml/css3-modsel-19b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/xml/css3-modsel-19b-expected.png deleted file mode 100644 index 65db209..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/xml/css3-modsel-19b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/xml/css3-modsel-64-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/xml/css3-modsel-64-expected.png deleted file mode 100644 index 5b3a9ad..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/selectors3/xml/css3-modsel-64-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/dark-mode/colors/select-popup-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/dark-mode/colors/select-popup-expected.png deleted file mode 100644 index 281ab4d4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/dark-mode/colors/select-popup-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/editing/input/linux_ltr_composition_underline-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/editing/input/linux_ltr_composition_underline-expected.png deleted file mode 100644 index f2d99562..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/editing/input/linux_ltr_composition_underline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/color-computed-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/color-computed-expected.txt deleted file mode 100644 index feeafdc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/color-computed-expected.txt +++ /dev/null
@@ -1,411 +0,0 @@ -This is a testharness.js-based test. -Found 407 tests; 40 PASS, 367 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS Property color value 'currentcolor' -PASS Property color value 'transparent' -PASS Property color value 'red' -PASS Property color value 'magenta' -PASS Property color value '#234' -PASS Property color value '#FEDCBA' -PASS Property color value 'rgb(2, 3, 4)' -PASS Property color value 'rgb(100%, 0%, 0%)' -PASS Property color value 'rgba(2, 3, 4, 0.5)' -PASS Property color value 'rgba(2, 3, 4, 50%)' -PASS Property color value 'hsl(120, 100%, 50%)' -PASS Property color value 'hsla(120, 100%, 50%, 0.25)' -PASS Property color value 'rgb(-2, 3, 4)' -PASS Property color value 'rgb(100, 200, 300)' -PASS Property color value 'rgb(20, 10, 0, -10)' -PASS Property color value 'rgb(100%, 200%, 300%)' -FAIL Property color value 'rgb(none none none)' assert_true: 'rgb(none none none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(none none none / none)' assert_true: 'rgb(none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(128 none none)' assert_true: 'rgb(128 none none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(128 none none / none)' assert_true: 'rgb(128 none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(none none none / .5)' assert_true: 'rgb(none none none / .5)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(20% none none)' assert_true: 'rgb(20% none none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(20% none none / none)' assert_true: 'rgb(20% none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(none none none / 50%)' assert_true: 'rgb(none none none / 50%)' is a supported value for color. expected true got false -FAIL Property color value 'rgba(none none none)' assert_true: 'rgba(none none none)' is a supported value for color. expected true got false -FAIL Property color value 'rgba(none none none / none)' assert_true: 'rgba(none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'rgba(128 none none)' assert_true: 'rgba(128 none none)' is a supported value for color. expected true got false -FAIL Property color value 'rgba(128 none none / none)' assert_true: 'rgba(128 none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'rgba(none none none / .5)' assert_true: 'rgba(none none none / .5)' is a supported value for color. expected true got false -FAIL Property color value 'rgba(20% none none)' assert_true: 'rgba(20% none none)' is a supported value for color. expected true got false -FAIL Property color value 'rgba(20% none none / none)' assert_true: 'rgba(20% none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'rgba(none none none / 50%)' assert_true: 'rgba(none none none / 50%)' is a supported value for color. expected true got false -PASS Property color value 'hsl(120 30% 50%)' -PASS Property color value 'hsl(120 30% 50% / 0.5)' -PASS Property color value 'hsl(120 30% 50% / 50%)' -FAIL Property color value 'hsl(none none none)' assert_true: 'hsl(none none none)' is a supported value for color. expected true got false -PASS Property color value 'hsl(0 0% 0%)' -FAIL Property color value 'hsl(none none none / none)' assert_true: 'hsl(none none none / none)' is a supported value for color. expected true got false -PASS Property color value 'hsl(0 0% 0% / 0)' -FAIL Property color value 'hsla(none none none)' assert_true: 'hsla(none none none)' is a supported value for color. expected true got false -PASS Property color value 'hsla(0 0% 0%)' -FAIL Property color value 'hsla(none none none / none)' assert_true: 'hsla(none none none / none)' is a supported value for color. expected true got false -PASS Property color value 'hsla(0 0% 0% / 0)' -FAIL Property color value 'hsl(120 none none)' assert_true: 'hsl(120 none none)' is a supported value for color. expected true got false -PASS Property color value 'hsl(120 0% 0%)' -FAIL Property color value 'hsl(120 80% none)' assert_true: 'hsl(120 80% none)' is a supported value for color. expected true got false -PASS Property color value 'hsl(120 80% 0%)' -FAIL Property color value 'hsl(120 none 50%)' assert_true: 'hsl(120 none 50%)' is a supported value for color. expected true got false -PASS Property color value 'hsl(120 0% 50%)' -FAIL Property color value 'hsl(120 100% 50% / none)' assert_true: 'hsl(120 100% 50% / none)' is a supported value for color. expected true got false -PASS Property color value 'hsl(120 100% 50% / 0)' -PASS Property color value 'hsl(120 100% 50% / 0%)' -FAIL Property color value 'hsl(none 100% 50%)' assert_true: 'hsl(none 100% 50%)' is a supported value for color. expected true got false -PASS Property color value 'hsl(0 100% 50%)' -PASS Property color value 'hwb(120 30% 50%)' -PASS Property color value 'hwb(120 30% 50% / 0.5)' -PASS Property color value 'hwb(120 30% 50% / 50%)' -FAIL Property color value 'hwb(none none none)' assert_true: 'hwb(none none none)' is a supported value for color. expected true got false -PASS Property color value 'hwb(0 0% 0%)' -FAIL Property color value 'hwb(none none none / none)' assert_true: 'hwb(none none none / none)' is a supported value for color. expected true got false -PASS Property color value 'hwb(0 0% 0% / 0)' -FAIL Property color value 'hwb(120 none none)' assert_true: 'hwb(120 none none)' is a supported value for color. expected true got false -PASS Property color value 'hwb(120 0% 0%)' -FAIL Property color value 'hwb(120 80% none)' assert_true: 'hwb(120 80% none)' is a supported value for color. expected true got false -PASS Property color value 'hwb(120 80% 0%)' -FAIL Property color value 'hwb(120 none 50%)' assert_true: 'hwb(120 none 50%)' is a supported value for color. expected true got false -PASS Property color value 'hwb(120 0% 50%)' -FAIL Property color value 'hwb(120 30% 50% / none)' assert_true: 'hwb(120 30% 50% / none)' is a supported value for color. expected true got false -PASS Property color value 'hwb(120 30% 50% / 0)' -PASS Property color value 'hwb(120 30% 50% / 0%)' -FAIL Property color value 'hwb(none 100% 50% / none)' assert_true: 'hwb(none 100% 50% / none)' is a supported value for color. expected true got false -PASS Property color value 'hwb(0 100% 50% / 0)' -FAIL Property color value 'color(srgb 0% 0% 0%)' assert_true: 'color(srgb 0% 0% 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 10% 10% 10%)' assert_true: 'color(srgb 10% 10% 10%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb .2 .2 25%)' assert_true: 'color(srgb .2 .2 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 0 0 0 / 1)' assert_true: 'color(srgb 0 0 0 / 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 0% 0 0 / 0.5)' assert_true: 'color(srgb 0% 0 0 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 20% 0 10/0.5)' assert_true: 'color(srgb 20% 0 10/0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 20% 0 10/50%)' assert_true: 'color(srgb 20% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 400% 0 10/50%)' assert_true: 'color(srgb 400% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 50% -160 160)' assert_true: 'color(srgb 50% -160 160)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 50% -200 200)' assert_true: 'color(srgb 50% -200 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 0 0 0 / -10%)' assert_true: 'color(srgb 0 0 0 / -10%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 0 0 0 / 110%)' assert_true: 'color(srgb 0 0 0 / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 0 0 0 / 300%)' assert_true: 'color(srgb 0 0 0 / 300%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 50% -200)' assert_true: 'color(srgb 50% -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 50%)' assert_true: 'color(srgb 50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb)' assert_true: 'color(srgb)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 50% -200 / 0.5)' assert_true: 'color(srgb 50% -200 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 50% / 0.5)' assert_true: 'color(srgb 50% / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb / 0.5)' assert_true: 'color(srgb / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 200 200 200)' assert_true: 'color(srgb 200 200 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 200 200 200 / 200)' assert_true: 'color(srgb 200 200 200 / 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb -200 -200 -200)' assert_true: 'color(srgb -200 -200 -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb -200 -200 -200 / -200)' assert_true: 'color(srgb -200 -200 -200 / -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 200% 200% 200%)' assert_true: 'color(srgb 200% 200% 200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 200% 200% 200% / 200%)' assert_true: 'color(srgb 200% 200% 200% / 200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb -200% -200% -200% / -200%)' assert_true: 'color(srgb -200% -200% -200% / -200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(srgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' assert_true: 'color(srgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb none none none / none)' assert_true: 'color(srgb none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb none none none)' assert_true: 'color(srgb none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 10% none none / none)' assert_true: 'color(srgb 10% none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb none none none / 0.5)' assert_true: 'color(srgb none none none / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb 0 0 0 / none)' assert_true: 'color(srgb 0 0 0 / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 0% 0% 0%)' assert_true: 'color(srgb-linear 0% 0% 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 10% 10% 10%)' assert_true: 'color(srgb-linear 10% 10% 10%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear .2 .2 25%)' assert_true: 'color(srgb-linear .2 .2 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 0 0 0 / 1)' assert_true: 'color(srgb-linear 0 0 0 / 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 0% 0 0 / 0.5)' assert_true: 'color(srgb-linear 0% 0 0 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 20% 0 10/0.5)' assert_true: 'color(srgb-linear 20% 0 10/0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 20% 0 10/50%)' assert_true: 'color(srgb-linear 20% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 400% 0 10/50%)' assert_true: 'color(srgb-linear 400% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 50% -160 160)' assert_true: 'color(srgb-linear 50% -160 160)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 50% -200 200)' assert_true: 'color(srgb-linear 50% -200 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 0 0 0 / -10%)' assert_true: 'color(srgb-linear 0 0 0 / -10%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 0 0 0 / 110%)' assert_true: 'color(srgb-linear 0 0 0 / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 0 0 0 / 300%)' assert_true: 'color(srgb-linear 0 0 0 / 300%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 50% -200)' assert_true: 'color(srgb-linear 50% -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 50%)' assert_true: 'color(srgb-linear 50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear)' assert_true: 'color(srgb-linear)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 50% -200 / 0.5)' assert_true: 'color(srgb-linear 50% -200 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 50% / 0.5)' assert_true: 'color(srgb-linear 50% / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear / 0.5)' assert_true: 'color(srgb-linear / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 200 200 200)' assert_true: 'color(srgb-linear 200 200 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 200 200 200 / 200)' assert_true: 'color(srgb-linear 200 200 200 / 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear -200 -200 -200)' assert_true: 'color(srgb-linear -200 -200 -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear -200 -200 -200 / -200)' assert_true: 'color(srgb-linear -200 -200 -200 / -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 200% 200% 200%)' assert_true: 'color(srgb-linear 200% 200% 200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 200% 200% 200% / 200%)' assert_true: 'color(srgb-linear 200% 200% 200% / 200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear -200% -200% -200% / -200%)' assert_true: 'color(srgb-linear -200% -200% -200% / -200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(srgb-linear calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' assert_true: 'color(srgb-linear calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear none none none / none)' assert_true: 'color(srgb-linear none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear none none none)' assert_true: 'color(srgb-linear none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 10% none none / none)' assert_true: 'color(srgb-linear 10% none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear none none none / 0.5)' assert_true: 'color(srgb-linear none none none / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(srgb-linear 0 0 0 / none)' assert_true: 'color(srgb-linear 0 0 0 / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 0% 0% 0%)' assert_true: 'color(a98-rgb 0% 0% 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 10% 10% 10%)' assert_true: 'color(a98-rgb 10% 10% 10%)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb .2 .2 25%)' assert_true: 'color(a98-rgb .2 .2 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 0 0 0 / 1)' assert_true: 'color(a98-rgb 0 0 0 / 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 0% 0 0 / 0.5)' assert_true: 'color(a98-rgb 0% 0 0 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 20% 0 10/0.5)' assert_true: 'color(a98-rgb 20% 0 10/0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 20% 0 10/50%)' assert_true: 'color(a98-rgb 20% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 400% 0 10/50%)' assert_true: 'color(a98-rgb 400% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 50% -160 160)' assert_true: 'color(a98-rgb 50% -160 160)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 50% -200 200)' assert_true: 'color(a98-rgb 50% -200 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 0 0 0 / -10%)' assert_true: 'color(a98-rgb 0 0 0 / -10%)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 0 0 0 / 110%)' assert_true: 'color(a98-rgb 0 0 0 / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 0 0 0 / 300%)' assert_true: 'color(a98-rgb 0 0 0 / 300%)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 50% -200)' assert_true: 'color(a98-rgb 50% -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 50%)' assert_true: 'color(a98-rgb 50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb)' assert_true: 'color(a98-rgb)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 50% -200 / 0.5)' assert_true: 'color(a98-rgb 50% -200 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 50% / 0.5)' assert_true: 'color(a98-rgb 50% / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb / 0.5)' assert_true: 'color(a98-rgb / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 200 200 200)' assert_true: 'color(a98-rgb 200 200 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 200 200 200 / 200)' assert_true: 'color(a98-rgb 200 200 200 / 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb -200 -200 -200)' assert_true: 'color(a98-rgb -200 -200 -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb -200 -200 -200 / -200)' assert_true: 'color(a98-rgb -200 -200 -200 / -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 200% 200% 200%)' assert_true: 'color(a98-rgb 200% 200% 200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 200% 200% 200% / 200%)' assert_true: 'color(a98-rgb 200% 200% 200% / 200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb -200% -200% -200% / -200%)' assert_true: 'color(a98-rgb -200% -200% -200% / -200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(a98-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' assert_true: 'color(a98-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb none none none / none)' assert_true: 'color(a98-rgb none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb none none none)' assert_true: 'color(a98-rgb none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 10% none none / none)' assert_true: 'color(a98-rgb 10% none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb none none none / 0.5)' assert_true: 'color(a98-rgb none none none / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(a98-rgb 0 0 0 / none)' assert_true: 'color(a98-rgb 0 0 0 / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 0% 0% 0%)' assert_true: 'color(rec2020 0% 0% 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 10% 10% 10%)' assert_true: 'color(rec2020 10% 10% 10%)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 .2 .2 25%)' assert_true: 'color(rec2020 .2 .2 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 0 0 0 / 1)' assert_true: 'color(rec2020 0 0 0 / 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 0% 0 0 / 0.5)' assert_true: 'color(rec2020 0% 0 0 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 20% 0 10/0.5)' assert_true: 'color(rec2020 20% 0 10/0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 20% 0 10/50%)' assert_true: 'color(rec2020 20% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 400% 0 10/50%)' assert_true: 'color(rec2020 400% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 50% -160 160)' assert_true: 'color(rec2020 50% -160 160)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 50% -200 200)' assert_true: 'color(rec2020 50% -200 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 0 0 0 / -10%)' assert_true: 'color(rec2020 0 0 0 / -10%)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 0 0 0 / 110%)' assert_true: 'color(rec2020 0 0 0 / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 0 0 0 / 300%)' assert_true: 'color(rec2020 0 0 0 / 300%)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 50% -200)' assert_true: 'color(rec2020 50% -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 50%)' assert_true: 'color(rec2020 50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020)' assert_true: 'color(rec2020)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 50% -200 / 0.5)' assert_true: 'color(rec2020 50% -200 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 50% / 0.5)' assert_true: 'color(rec2020 50% / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 / 0.5)' assert_true: 'color(rec2020 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 200 200 200)' assert_true: 'color(rec2020 200 200 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 200 200 200 / 200)' assert_true: 'color(rec2020 200 200 200 / 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 -200 -200 -200)' assert_true: 'color(rec2020 -200 -200 -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 -200 -200 -200 / -200)' assert_true: 'color(rec2020 -200 -200 -200 / -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 200% 200% 200%)' assert_true: 'color(rec2020 200% 200% 200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 200% 200% 200% / 200%)' assert_true: 'color(rec2020 200% 200% 200% / 200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 -200% -200% -200% / -200%)' assert_true: 'color(rec2020 -200% -200% -200% / -200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(rec2020 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' assert_true: 'color(rec2020 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 none none none / none)' assert_true: 'color(rec2020 none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 none none none)' assert_true: 'color(rec2020 none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 10% none none / none)' assert_true: 'color(rec2020 10% none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 none none none / 0.5)' assert_true: 'color(rec2020 none none none / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(rec2020 0 0 0 / none)' assert_true: 'color(rec2020 0 0 0 / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 0% 0% 0%)' assert_true: 'color(prophoto-rgb 0% 0% 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 10% 10% 10%)' assert_true: 'color(prophoto-rgb 10% 10% 10%)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb .2 .2 25%)' assert_true: 'color(prophoto-rgb .2 .2 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 0 0 0 / 1)' assert_true: 'color(prophoto-rgb 0 0 0 / 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 0% 0 0 / 0.5)' assert_true: 'color(prophoto-rgb 0% 0 0 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 20% 0 10/0.5)' assert_true: 'color(prophoto-rgb 20% 0 10/0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 20% 0 10/50%)' assert_true: 'color(prophoto-rgb 20% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 400% 0 10/50%)' assert_true: 'color(prophoto-rgb 400% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 50% -160 160)' assert_true: 'color(prophoto-rgb 50% -160 160)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 50% -200 200)' assert_true: 'color(prophoto-rgb 50% -200 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 0 0 0 / -10%)' assert_true: 'color(prophoto-rgb 0 0 0 / -10%)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 0 0 0 / 110%)' assert_true: 'color(prophoto-rgb 0 0 0 / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 0 0 0 / 300%)' assert_true: 'color(prophoto-rgb 0 0 0 / 300%)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 50% -200)' assert_true: 'color(prophoto-rgb 50% -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 50%)' assert_true: 'color(prophoto-rgb 50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb)' assert_true: 'color(prophoto-rgb)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 50% -200 / 0.5)' assert_true: 'color(prophoto-rgb 50% -200 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 50% / 0.5)' assert_true: 'color(prophoto-rgb 50% / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb / 0.5)' assert_true: 'color(prophoto-rgb / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 200 200 200)' assert_true: 'color(prophoto-rgb 200 200 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 200 200 200 / 200)' assert_true: 'color(prophoto-rgb 200 200 200 / 200)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb -200 -200 -200)' assert_true: 'color(prophoto-rgb -200 -200 -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb -200 -200 -200 / -200)' assert_true: 'color(prophoto-rgb -200 -200 -200 / -200)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 200% 200% 200%)' assert_true: 'color(prophoto-rgb 200% 200% 200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 200% 200% 200% / 200%)' assert_true: 'color(prophoto-rgb 200% 200% 200% / 200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb -200% -200% -200% / -200%)' assert_true: 'color(prophoto-rgb -200% -200% -200% / -200%)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(prophoto-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' assert_true: 'color(prophoto-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb none none none / none)' assert_true: 'color(prophoto-rgb none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb none none none)' assert_true: 'color(prophoto-rgb none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 10% none none / none)' assert_true: 'color(prophoto-rgb 10% none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb none none none / 0.5)' assert_true: 'color(prophoto-rgb none none none / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(prophoto-rgb 0 0 0 / none)' assert_true: 'color(prophoto-rgb 0 0 0 / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 0 0 0)' assert_true: 'color(xyz 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 0 0 0 / 1)' assert_true: 'color(xyz 0 0 0 / 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 1 1 1)' assert_true: 'color(xyz 1 1 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 1 1 1 / 1)' assert_true: 'color(xyz 1 1 1 / 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz -1 -1 -1)' assert_true: 'color(xyz -1 -1 -1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 0.1 0.1 0.1)' assert_true: 'color(xyz 0.1 0.1 0.1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 10 10 10)' assert_true: 'color(xyz 10 10 10)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz .2 .2 .25)' assert_true: 'color(xyz .2 .2 .25)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 0 0 0 / 0.5)' assert_true: 'color(xyz 0 0 0 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz .20 0 10/0.5)' assert_true: 'color(xyz .20 0 10/0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz .20 0 10/50%)' assert_true: 'color(xyz .20 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 0 0 0 / -10%)' assert_true: 'color(xyz 0 0 0 / -10%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 0 0 0 / 110%)' assert_true: 'color(xyz 0 0 0 / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 0 0 0 / 300%)' assert_true: 'color(xyz 0 0 0 / 300%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 1 1)' assert_true: 'color(xyz 1 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 1)' assert_true: 'color(xyz 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz)' assert_true: 'color(xyz)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 1 1 / .5)' assert_true: 'color(xyz 1 1 / .5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 1 / 0.5)' assert_true: 'color(xyz 1 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz / 50%)' assert_true: 'color(xyz / 50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(xyz calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz none none none / none)' assert_true: 'color(xyz none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz none none none)' assert_true: 'color(xyz none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 0.2 none none / none)' assert_true: 'color(xyz 0.2 none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz none none none / 0.5)' assert_true: 'color(xyz none none none / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz 0 0 0 / none)' assert_true: 'color(xyz 0 0 0 / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 0 0 0)' assert_true: 'color(xyz-d50 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 0 0 0 / 1)' assert_true: 'color(xyz-d50 0 0 0 / 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 1 1 1)' assert_true: 'color(xyz-d50 1 1 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 1 1 1 / 1)' assert_true: 'color(xyz-d50 1 1 1 / 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 -1 -1 -1)' assert_true: 'color(xyz-d50 -1 -1 -1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 0.1 0.1 0.1)' assert_true: 'color(xyz-d50 0.1 0.1 0.1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 10 10 10)' assert_true: 'color(xyz-d50 10 10 10)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 .2 .2 .25)' assert_true: 'color(xyz-d50 .2 .2 .25)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 0 0 0 / 0.5)' assert_true: 'color(xyz-d50 0 0 0 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 .20 0 10/0.5)' assert_true: 'color(xyz-d50 .20 0 10/0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 .20 0 10/50%)' assert_true: 'color(xyz-d50 .20 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 0 0 0 / -10%)' assert_true: 'color(xyz-d50 0 0 0 / -10%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 0 0 0 / 110%)' assert_true: 'color(xyz-d50 0 0 0 / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 0 0 0 / 300%)' assert_true: 'color(xyz-d50 0 0 0 / 300%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 1 1)' assert_true: 'color(xyz-d50 1 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 1)' assert_true: 'color(xyz-d50 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50)' assert_true: 'color(xyz-d50)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 1 1 / .5)' assert_true: 'color(xyz-d50 1 1 / .5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 1 / 0.5)' assert_true: 'color(xyz-d50 1 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 / 50%)' assert_true: 'color(xyz-d50 / 50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(xyz-d50 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 none none none / none)' assert_true: 'color(xyz-d50 none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 none none none)' assert_true: 'color(xyz-d50 none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 0.2 none none / none)' assert_true: 'color(xyz-d50 0.2 none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 none none none / 0.5)' assert_true: 'color(xyz-d50 none none none / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d50 0 0 0 / none)' assert_true: 'color(xyz-d50 0 0 0 / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 0 0 0)' assert_true: 'color(xyz-d65 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 0 0 0 / 1)' assert_true: 'color(xyz-d65 0 0 0 / 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 1 1 1)' assert_true: 'color(xyz-d65 1 1 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 1 1 1 / 1)' assert_true: 'color(xyz-d65 1 1 1 / 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 -1 -1 -1)' assert_true: 'color(xyz-d65 -1 -1 -1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 0.1 0.1 0.1)' assert_true: 'color(xyz-d65 0.1 0.1 0.1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 10 10 10)' assert_true: 'color(xyz-d65 10 10 10)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 .2 .2 .25)' assert_true: 'color(xyz-d65 .2 .2 .25)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 0 0 0 / 0.5)' assert_true: 'color(xyz-d65 0 0 0 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 .20 0 10/0.5)' assert_true: 'color(xyz-d65 .20 0 10/0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 .20 0 10/50%)' assert_true: 'color(xyz-d65 .20 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 0 0 0 / -10%)' assert_true: 'color(xyz-d65 0 0 0 / -10%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 0 0 0 / 110%)' assert_true: 'color(xyz-d65 0 0 0 / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 0 0 0 / 300%)' assert_true: 'color(xyz-d65 0 0 0 / 300%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 1 1)' assert_true: 'color(xyz-d65 1 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 1)' assert_true: 'color(xyz-d65 1)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65)' assert_true: 'color(xyz-d65)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 1 1 / .5)' assert_true: 'color(xyz-d65 1 1 / .5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 1 / 0.5)' assert_true: 'color(xyz-d65 1 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 / 50%)' assert_true: 'color(xyz-d65 / 50%)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' assert_true: 'color(xyz-d65 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 none none none / none)' assert_true: 'color(xyz-d65 none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 none none none)' assert_true: 'color(xyz-d65 none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 0.2 none none / none)' assert_true: 'color(xyz-d65 0.2 none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 none none none / 0.5)' assert_true: 'color(xyz-d65 none none none / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'color(xyz-d65 0 0 0 / none)' assert_true: 'color(xyz-d65 0 0 0 / none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(0% 0 0)' assert_true: 'lab(0% 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'lab(0% 0 0 / 1)' assert_true: 'lab(0% 0 0 / 1)' is a supported value for color. expected true got false -FAIL Property color value 'lab(0% 0 0 / 0.5)' assert_true: 'lab(0% 0 0 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'lab(20% 0 10/0.5)' assert_true: 'lab(20% 0 10/0.5)' is a supported value for color. expected true got false -FAIL Property color value 'lab(20% 0 10/50%)' assert_true: 'lab(20% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'lab(400% 0 10/50%)' assert_true: 'lab(400% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'lab(50% -160 160)' assert_true: 'lab(50% -160 160)' is a supported value for color. expected true got false -FAIL Property color value 'lab(50% -200 200)' assert_true: 'lab(50% -200 200)' is a supported value for color. expected true got false -FAIL Property color value 'lab(0% 0 0 / -10%)' assert_true: 'lab(0% 0 0 / -10%)' is a supported value for color. expected true got false -FAIL Property color value 'lab(0% 0 0 / 110%)' assert_true: 'lab(0% 0 0 / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'lab(0% 0 0 / 300%)' assert_true: 'lab(0% 0 0 / 300%)' is a supported value for color. expected true got false -FAIL Property color value 'lab(-40% 0 0)' assert_true: 'lab(-40% 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'lab(50% -20 0)' assert_true: 'lab(50% -20 0)' is a supported value for color. expected true got false -FAIL Property color value 'lab(50% 0 -20)' assert_true: 'lab(50% 0 -20)' is a supported value for color. expected true got false -FAIL Property color value 'lab(calc(50% * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))' assert_true: 'lab(calc(50% * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false -FAIL Property color value 'lab(calc(-50% * 3) calc(0.5 + 1) calc(-1.5) / calc(-0.5 * 2))' assert_true: 'lab(calc(-50% * 3) calc(0.5 + 1) calc(-1.5) / calc(-0.5 * 2))' is a supported value for color. expected true got false -FAIL Property color value 'lab(none none none / none)' assert_true: 'lab(none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(none none none)' assert_true: 'lab(none none none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(20% none none / none)' assert_true: 'lab(20% none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(none none none / 0.5)' assert_true: 'lab(none none none / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'lab(0% 0 0 / none)' assert_true: 'lab(0% 0 0 / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(0% 0 0)' assert_true: 'oklab(0% 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(0% 0 0 / 1)' assert_true: 'oklab(0% 0 0 / 1)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(0% 0 0 / 0.5)' assert_true: 'oklab(0% 0 0 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(20% 0 10/0.5)' assert_true: 'oklab(20% 0 10/0.5)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(20% 0 10/50%)' assert_true: 'oklab(20% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(400% 0 10/50%)' assert_true: 'oklab(400% 0 10/50%)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(50% -160 160)' assert_true: 'oklab(50% -160 160)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(50% -200 200)' assert_true: 'oklab(50% -200 200)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(0% 0 0 / -10%)' assert_true: 'oklab(0% 0 0 / -10%)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(0% 0 0 / 110%)' assert_true: 'oklab(0% 0 0 / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(0% 0 0 / 300%)' assert_true: 'oklab(0% 0 0 / 300%)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(-40% 0 0)' assert_true: 'oklab(-40% 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(50% -20 0)' assert_true: 'oklab(50% -20 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(50% 0 -20)' assert_true: 'oklab(50% 0 -20)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(calc(50% * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))' assert_true: 'oklab(calc(50% * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))' is a supported value for color. expected true got false -FAIL Property color value 'oklab(calc(-50% * 3) calc(0.5 + 1) calc(-1.5) / calc(-0.5 * 2))' assert_true: 'oklab(calc(-50% * 3) calc(0.5 + 1) calc(-1.5) / calc(-0.5 * 2))' is a supported value for color. expected true got false -FAIL Property color value 'oklab(none none none / none)' assert_true: 'oklab(none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(none none none)' assert_true: 'oklab(none none none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(20% none none / none)' assert_true: 'oklab(20% none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(none none none / 0.5)' assert_true: 'oklab(none none none / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(0% 0 0 / none)' assert_true: 'oklab(0% 0 0 / none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(0% 0 0deg)' assert_true: 'lch(0% 0 0deg)' is a supported value for color. expected true got false -FAIL Property color value 'lch(0% 0 0deg / 1)' assert_true: 'lch(0% 0 0deg / 1)' is a supported value for color. expected true got false -FAIL Property color value 'lch(0% 0 0deg / 0.5)' assert_true: 'lch(0% 0 0deg / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'lch(100% 230 0deg / 0.5)' assert_true: 'lch(100% 230 0deg / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'lch(20% 50 20deg/0.5)' assert_true: 'lch(20% 50 20deg/0.5)' is a supported value for color. expected true got false -FAIL Property color value 'lch(20% 50 20deg/50%)' assert_true: 'lch(20% 50 20deg/50%)' is a supported value for color. expected true got false -FAIL Property color value 'lch(10% 20 20deg / -10%)' assert_true: 'lch(10% 20 20deg / -10%)' is a supported value for color. expected true got false -FAIL Property color value 'lch(10% 20 20deg / 110%)' assert_true: 'lch(10% 20 20deg / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'lch(10% 20 1.28rad)' assert_true: 'lch(10% 20 1.28rad)' is a supported value for color. expected true got false -FAIL Property color value 'lch(10% 20 380deg)' assert_true: 'lch(10% 20 380deg)' is a supported value for color. expected true got false -FAIL Property color value 'lch(10% 20 -340deg)' assert_true: 'lch(10% 20 -340deg)' is a supported value for color. expected true got false -FAIL Property color value 'lch(10% 20 740deg)' assert_true: 'lch(10% 20 740deg)' is a supported value for color. expected true got false -FAIL Property color value 'lch(10% 20 -700deg)' assert_true: 'lch(10% 20 -700deg)' is a supported value for color. expected true got false -FAIL Property color value 'lch(-40% 0 0)' assert_true: 'lch(-40% 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'lch(20% -20 0)' assert_true: 'lch(20% -20 0)' is a supported value for color. expected true got false -FAIL Property color value 'lch(0% 0 0 / 0.5)' assert_true: 'lch(0% 0 0 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'lch(10% 20 20 / 110%)' assert_true: 'lch(10% 20 20 / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'lch(10% 20 -700)' assert_true: 'lch(10% 20 -700)' is a supported value for color. expected true got false -FAIL Property color value 'lch(calc(50% * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))' assert_true: 'lch(calc(50% * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))' is a supported value for color. expected true got false -FAIL Property color value 'lch(calc(-50% * 3) calc(0.5 + 1) calc(-20deg * 2) / calc(-0.5 * 2))' assert_true: 'lch(calc(-50% * 3) calc(0.5 + 1) calc(-20deg * 2) / calc(-0.5 * 2))' is a supported value for color. expected true got false -FAIL Property color value 'lch(none none none / none)' assert_true: 'lch(none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(none none none)' assert_true: 'lch(none none none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(20% none none / none)' assert_true: 'lch(20% none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(none none none / 0.5)' assert_true: 'lch(none none none / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'lch(0% 0 0 / none)' assert_true: 'lch(0% 0 0 / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(0% 0 0deg)' assert_true: 'oklch(0% 0 0deg)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(0% 0 0deg / 1)' assert_true: 'oklch(0% 0 0deg / 1)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(0% 0 0deg / 0.5)' assert_true: 'oklch(0% 0 0deg / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(100% 230 0deg / 0.5)' assert_true: 'oklch(100% 230 0deg / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(20% 50 20deg/0.5)' assert_true: 'oklch(20% 50 20deg/0.5)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(20% 50 20deg/50%)' assert_true: 'oklch(20% 50 20deg/50%)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(10% 20 20deg / -10%)' assert_true: 'oklch(10% 20 20deg / -10%)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(10% 20 20deg / 110%)' assert_true: 'oklch(10% 20 20deg / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(10% 20 1.28rad)' assert_true: 'oklch(10% 20 1.28rad)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(10% 20 380deg)' assert_true: 'oklch(10% 20 380deg)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(10% 20 -340deg)' assert_true: 'oklch(10% 20 -340deg)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(10% 20 740deg)' assert_true: 'oklch(10% 20 740deg)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(10% 20 -700deg)' assert_true: 'oklch(10% 20 -700deg)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(-40% 0 0)' assert_true: 'oklch(-40% 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(20% -20 0)' assert_true: 'oklch(20% -20 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(0% 0 0 / 0.5)' assert_true: 'oklch(0% 0 0 / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(10% 20 20 / 110%)' assert_true: 'oklch(10% 20 20 / 110%)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(10% 20 -700)' assert_true: 'oklch(10% 20 -700)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(calc(50% * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))' assert_true: 'oklch(calc(50% * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))' is a supported value for color. expected true got false -FAIL Property color value 'oklch(calc(-50% * 3) calc(0.5 + 1) calc(-20deg * 2) / calc(-0.5 * 2))' assert_true: 'oklch(calc(-50% * 3) calc(0.5 + 1) calc(-20deg * 2) / calc(-0.5 * 2))' is a supported value for color. expected true got false -FAIL Property color value 'oklch(none none none / none)' assert_true: 'oklch(none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(none none none)' assert_true: 'oklch(none none none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(20% none none / none)' assert_true: 'oklch(20% none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(none none none / 0.5)' assert_true: 'oklch(none none none / 0.5)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(0% 0 0 / none)' assert_true: 'oklch(0% 0 0 / none)' is a supported value for color. expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/color-mix-computed-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/color-mix-computed-expected.txt deleted file mode 100644 index b9c96909..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/color-mix-computed-expected.txt +++ /dev/null
@@ -1,478 +0,0 @@ -This is a testharness.js-based test. -Found 474 tests; 0 PASS, 474 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))' assert_true: 'color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))' assert_true: 'color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))' assert_true: 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_true: 'color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_true: 'color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_true: 'color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_true: 'color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_true: 'color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_true: 'color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_true: 'color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_true: 'color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_true: 'color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_true: 'color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_true: 'color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_true: 'color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_true: 'color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_true: 'color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_true: 'color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_true: 'color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_true: 'color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_true: 'color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_true: 'color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_true: 'color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_true: 'color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_true: 'color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_true: 'color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_true: 'color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_true: 'color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_true: 'color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_true: 'color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_true: 'color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_true: 'color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_true: 'color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl specified hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' assert_true: 'color-mix(in hsl specified hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl specified hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' assert_true: 'color-mix(in hsl specified hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl specified hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' assert_true: 'color-mix(in hsl specified hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl specified hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' assert_true: 'color-mix(in hsl specified hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl specified hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' assert_true: 'color-mix(in hsl specified hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl specified hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' assert_true: 'color-mix(in hsl specified hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(none none none), hsl(none none none))' assert_true: 'color-mix(in hsl, hsl(none none none), hsl(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))' assert_true: 'color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))' assert_true: 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))' assert_true: 'color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))' assert_true: 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))' assert_true: 'color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))' assert_true: 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))' assert_true: 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))' assert_true: 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, lab(100% 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, lab(100% 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, lab(0% 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, lab(0% 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, lch(100% 116 334) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, lch(100% 116 334) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, lch(0% 116 334) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, lch(0% 116 334) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, oklab(100% 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, oklab(100% 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, oklab(0% 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, oklab(0% 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, oklch(100% 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, oklch(100% 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hsl, oklch(0% 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hsl, oklch(0% 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))' assert_true: 'color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_true: 'color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_true: 'color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_true: 'color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_true: 'color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_true: 'color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_true: 'color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_true: 'color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_true: 'color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_true: 'color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_true: 'color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_true: 'color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_true: 'color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_true: 'color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_true: 'color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_true: 'color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_true: 'color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_true: 'color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_true: 'color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_true: 'color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_true: 'color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_true: 'color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_true: 'color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_true: 'color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_true: 'color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb specified hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' assert_true: 'color-mix(in hwb specified hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb specified hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' assert_true: 'color-mix(in hwb specified hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb specified hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' assert_true: 'color-mix(in hwb specified hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb specified hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' assert_true: 'color-mix(in hwb specified hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb specified hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' assert_true: 'color-mix(in hwb specified hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb specified hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' assert_true: 'color-mix(in hwb specified hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(none none none), hwb(none none none))' assert_true: 'color-mix(in hwb, hwb(none none none), hwb(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))' assert_true: 'color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))' assert_true: 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, lab(100% 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, lab(100% 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, lab(0% 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, lab(0% 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, lch(100% 116 334) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, lch(100% 116 334) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, lch(0% 116 334) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, lch(0% 116 334) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, oklab(100% 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, oklab(100% 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, oklab(0% 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, oklab(0% 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, oklch(100% 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, oklch(100% 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in hwb, oklch(0% 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' assert_true: 'color-mix(in hwb, oklch(0% 0.399 336.3) 100%, rgb(0, 0, 0) 0%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg), lch(50% 60 70deg))' assert_true: 'color-mix(in lch, lch(10% 20 30deg), lch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg) 25%, lch(50% 60 70deg))' assert_true: 'color-mix(in lch, lch(10% 20 30deg) 25%, lch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, 25% lch(10% 20 30deg), lch(50% 60 70deg))' assert_true: 'color-mix(in lch, 25% lch(10% 20 30deg), lch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg), 25% lch(50% 60 70deg))' assert_true: 'color-mix(in lch, lch(10% 20 30deg), 25% lch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg), lch(50% 60 70deg) 25%)' assert_true: 'color-mix(in lch, lch(10% 20 30deg), lch(50% 60 70deg) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg) 25%, lch(50% 60 70deg) 75%)' assert_true: 'color-mix(in lch, lch(10% 20 30deg) 25%, lch(50% 60 70deg) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg) 30%, lch(50% 60 70deg) 90%)' assert_true: 'color-mix(in lch, lch(10% 20 30deg) 30%, lch(50% 60 70deg) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg) 12.5%, lch(50% 60 70deg) 37.5%)' assert_true: 'color-mix(in lch, lch(10% 20 30deg) 12.5%, lch(50% 60 70deg) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg) 0%, lch(50% 60 70deg))' assert_true: 'color-mix(in lch, lch(10% 20 30deg) 0%, lch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg / .4), lch(50% 60 70deg / .8))' assert_true: 'color-mix(in lch, lch(10% 20 30deg / .4), lch(50% 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg / .4) 25%, lch(50% 60 70deg / .8))' assert_true: 'color-mix(in lch, lch(10% 20 30deg / .4) 25%, lch(50% 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, 25% lch(10% 20 30deg / .4), lch(50% 60 70deg / .8))' assert_true: 'color-mix(in lch, 25% lch(10% 20 30deg / .4), lch(50% 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg / .4), 25% lch(50% 60 70deg / .8))' assert_true: 'color-mix(in lch, lch(10% 20 30deg / .4), 25% lch(50% 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg / .4), lch(50% 60 70deg / .8) 25%)' assert_true: 'color-mix(in lch, lch(10% 20 30deg / .4), lch(50% 60 70deg / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg / .4) 25%, lch(50% 60 70deg / .8) 75%)' assert_true: 'color-mix(in lch, lch(10% 20 30deg / .4) 25%, lch(50% 60 70deg / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg / .4) 30%, lch(50% 60 70deg / .8) 90%)' assert_true: 'color-mix(in lch, lch(10% 20 30deg / .4) 30%, lch(50% 60 70deg / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg / .4) 12.5%, lch(50% 60 70deg / .8) 37.5%)' assert_true: 'color-mix(in lch, lch(10% 20 30deg / .4) 12.5%, lch(50% 60 70deg / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg / .4) 0%, lch(50% 60 70deg / .8))' assert_true: 'color-mix(in lch, lch(10% 20 30deg / .4) 0%, lch(50% 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(100% 0 40deg), lch(100% 0 60deg))' assert_true: 'color-mix(in lch, lch(100% 0 40deg), lch(100% 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(100% 0 60deg), lch(100% 0 40deg))' assert_true: 'color-mix(in lch, lch(100% 0 60deg), lch(100% 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(100% 0 50deg), lch(100% 0 330deg))' assert_true: 'color-mix(in lch, lch(100% 0 50deg), lch(100% 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(100% 0 330deg), lch(100% 0 50deg))' assert_true: 'color-mix(in lch, lch(100% 0 330deg), lch(100% 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(100% 0 20deg), lch(100% 0 320deg))' assert_true: 'color-mix(in lch, lch(100% 0 20deg), lch(100% 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(100% 0 320deg), lch(100% 0 20deg))' assert_true: 'color-mix(in lch, lch(100% 0 320deg), lch(100% 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch shorter hue, lch(100% 0 40deg), lch(100% 0 60deg))' assert_true: 'color-mix(in lch shorter hue, lch(100% 0 40deg), lch(100% 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch shorter hue, lch(100% 0 60deg), lch(100% 0 40deg))' assert_true: 'color-mix(in lch shorter hue, lch(100% 0 60deg), lch(100% 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch shorter hue, lch(100% 0 50deg), lch(100% 0 330deg))' assert_true: 'color-mix(in lch shorter hue, lch(100% 0 50deg), lch(100% 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch shorter hue, lch(100% 0 330deg), lch(100% 0 50deg))' assert_true: 'color-mix(in lch shorter hue, lch(100% 0 330deg), lch(100% 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch shorter hue, lch(100% 0 20deg), lch(100% 0 320deg))' assert_true: 'color-mix(in lch shorter hue, lch(100% 0 20deg), lch(100% 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch shorter hue, lch(100% 0 320deg), lch(100% 0 20deg))' assert_true: 'color-mix(in lch shorter hue, lch(100% 0 320deg), lch(100% 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch longer hue, lch(100% 0 40deg), lch(100% 0 60deg))' assert_true: 'color-mix(in lch longer hue, lch(100% 0 40deg), lch(100% 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch longer hue, lch(100% 0 60deg), lch(100% 0 40deg))' assert_true: 'color-mix(in lch longer hue, lch(100% 0 60deg), lch(100% 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch longer hue, lch(100% 0 50deg), lch(100% 0 330deg))' assert_true: 'color-mix(in lch longer hue, lch(100% 0 50deg), lch(100% 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch longer hue, lch(100% 0 330deg), lch(100% 0 50deg))' assert_true: 'color-mix(in lch longer hue, lch(100% 0 330deg), lch(100% 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch longer hue, lch(100% 0 20deg), lch(100% 0 320deg))' assert_true: 'color-mix(in lch longer hue, lch(100% 0 20deg), lch(100% 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch longer hue, lch(100% 0 320deg), lch(100% 0 20deg))' assert_true: 'color-mix(in lch longer hue, lch(100% 0 320deg), lch(100% 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch increasing hue, lch(100% 0 40deg), lch(100% 0 60deg))' assert_true: 'color-mix(in lch increasing hue, lch(100% 0 40deg), lch(100% 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch increasing hue, lch(100% 0 60deg), lch(100% 0 40deg))' assert_true: 'color-mix(in lch increasing hue, lch(100% 0 60deg), lch(100% 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch increasing hue, lch(100% 0 50deg), lch(100% 0 330deg))' assert_true: 'color-mix(in lch increasing hue, lch(100% 0 50deg), lch(100% 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch increasing hue, lch(100% 0 330deg), lch(100% 0 50deg))' assert_true: 'color-mix(in lch increasing hue, lch(100% 0 330deg), lch(100% 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch increasing hue, lch(100% 0 20deg), lch(100% 0 320deg))' assert_true: 'color-mix(in lch increasing hue, lch(100% 0 20deg), lch(100% 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch increasing hue, lch(100% 0 320deg), lch(100% 0 20deg))' assert_true: 'color-mix(in lch increasing hue, lch(100% 0 320deg), lch(100% 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch decreasing hue, lch(100% 0 40deg), lch(100% 0 60deg))' assert_true: 'color-mix(in lch decreasing hue, lch(100% 0 40deg), lch(100% 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch decreasing hue, lch(100% 0 60deg), lch(100% 0 40deg))' assert_true: 'color-mix(in lch decreasing hue, lch(100% 0 60deg), lch(100% 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch decreasing hue, lch(100% 0 50deg), lch(100% 0 330deg))' assert_true: 'color-mix(in lch decreasing hue, lch(100% 0 50deg), lch(100% 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch decreasing hue, lch(100% 0 330deg), lch(100% 0 50deg))' assert_true: 'color-mix(in lch decreasing hue, lch(100% 0 330deg), lch(100% 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch decreasing hue, lch(100% 0 20deg), lch(100% 0 320deg))' assert_true: 'color-mix(in lch decreasing hue, lch(100% 0 20deg), lch(100% 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch decreasing hue, lch(100% 0 320deg), lch(100% 0 20deg))' assert_true: 'color-mix(in lch decreasing hue, lch(100% 0 320deg), lch(100% 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch specified hue, lch(100% 0 40deg), lch(100% 0 60deg))' assert_true: 'color-mix(in lch specified hue, lch(100% 0 40deg), lch(100% 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch specified hue, lch(100% 0 60deg), lch(100% 0 40deg))' assert_true: 'color-mix(in lch specified hue, lch(100% 0 60deg), lch(100% 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch specified hue, lch(100% 0 50deg), lch(100% 0 330deg))' assert_true: 'color-mix(in lch specified hue, lch(100% 0 50deg), lch(100% 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch specified hue, lch(100% 0 330deg), lch(100% 0 50deg))' assert_true: 'color-mix(in lch specified hue, lch(100% 0 330deg), lch(100% 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch specified hue, lch(100% 0 20deg), lch(100% 0 320deg))' assert_true: 'color-mix(in lch specified hue, lch(100% 0 20deg), lch(100% 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch specified hue, lch(100% 0 320deg), lch(100% 0 20deg))' assert_true: 'color-mix(in lch specified hue, lch(100% 0 320deg), lch(100% 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(none none none), lch(none none none))' assert_true: 'color-mix(in lch, lch(none none none), lch(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(none none none), lch(50% 60 70deg))' assert_true: 'color-mix(in lch, lch(none none none), lch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg), lch(none none none))' assert_true: 'color-mix(in lch, lch(10% 20 30deg), lch(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 none), lch(50% 60 70deg))' assert_true: 'color-mix(in lch, lch(10% 20 none), lch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg), lch(50% 60 none))' assert_true: 'color-mix(in lch, lch(10% 20 30deg), lch(50% 60 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(none 20 30deg), lch(50% none 70deg))' assert_true: 'color-mix(in lch, lch(none 20 30deg), lch(50% none 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg / none), lch(50% 60 70deg))' assert_true: 'color-mix(in lch, lch(10% 20 30deg / none), lch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg / none), lch(50% 60 70deg / 0.5))' assert_true: 'color-mix(in lch, lch(10% 20 30deg / none), lch(50% 60 70deg / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lch, lch(10% 20 30deg / none), lch(50% 60 70deg / none))' assert_true: 'color-mix(in lch, lch(10% 20 30deg / none), lch(50% 60 70deg / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg), oklch(50% 60 70deg))' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg), oklch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg) 25%, oklch(50% 60 70deg))' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg) 25%, oklch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, 25% oklch(10% 20 30deg), oklch(50% 60 70deg))' assert_true: 'color-mix(in oklch, 25% oklch(10% 20 30deg), oklch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg), 25% oklch(50% 60 70deg))' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg), 25% oklch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg), oklch(50% 60 70deg) 25%)' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg), oklch(50% 60 70deg) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg) 25%, oklch(50% 60 70deg) 75%)' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg) 25%, oklch(50% 60 70deg) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg) 30%, oklch(50% 60 70deg) 90%)' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg) 30%, oklch(50% 60 70deg) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg) 12.5%, oklch(50% 60 70deg) 37.5%)' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg) 12.5%, oklch(50% 60 70deg) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg) 0%, oklch(50% 60 70deg))' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg) 0%, oklch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg / .4), oklch(50% 60 70deg / .8))' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg / .4), oklch(50% 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg / .4) 25%, oklch(50% 60 70deg / .8))' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg / .4) 25%, oklch(50% 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, 25% oklch(10% 20 30deg / .4), oklch(50% 60 70deg / .8))' assert_true: 'color-mix(in oklch, 25% oklch(10% 20 30deg / .4), oklch(50% 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg / .4), 25% oklch(50% 60 70deg / .8))' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg / .4), 25% oklch(50% 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg / .4), oklch(50% 60 70deg / .8) 25%)' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg / .4), oklch(50% 60 70deg / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg / .4) 25%, oklch(50% 60 70deg / .8) 75%)' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg / .4) 25%, oklch(50% 60 70deg / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg / .4) 30%, oklch(50% 60 70deg / .8) 90%)' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg / .4) 30%, oklch(50% 60 70deg / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg / .4) 12.5%, oklch(50% 60 70deg / .8) 37.5%)' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg / .4) 12.5%, oklch(50% 60 70deg / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg / .4) 0%, oklch(50% 60 70deg / .8))' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg / .4) 0%, oklch(50% 60 70deg / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(100% 0 40deg), oklch(100% 0 60deg))' assert_true: 'color-mix(in oklch, oklch(100% 0 40deg), oklch(100% 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(100% 0 60deg), oklch(100% 0 40deg))' assert_true: 'color-mix(in oklch, oklch(100% 0 60deg), oklch(100% 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(100% 0 50deg), oklch(100% 0 330deg))' assert_true: 'color-mix(in oklch, oklch(100% 0 50deg), oklch(100% 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(100% 0 330deg), oklch(100% 0 50deg))' assert_true: 'color-mix(in oklch, oklch(100% 0 330deg), oklch(100% 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(100% 0 20deg), oklch(100% 0 320deg))' assert_true: 'color-mix(in oklch, oklch(100% 0 20deg), oklch(100% 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(100% 0 320deg), oklch(100% 0 20deg))' assert_true: 'color-mix(in oklch, oklch(100% 0 320deg), oklch(100% 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100% 0 40deg), oklch(100% 0 60deg))' assert_true: 'color-mix(in oklch shorter hue, oklch(100% 0 40deg), oklch(100% 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100% 0 60deg), oklch(100% 0 40deg))' assert_true: 'color-mix(in oklch shorter hue, oklch(100% 0 60deg), oklch(100% 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100% 0 50deg), oklch(100% 0 330deg))' assert_true: 'color-mix(in oklch shorter hue, oklch(100% 0 50deg), oklch(100% 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100% 0 330deg), oklch(100% 0 50deg))' assert_true: 'color-mix(in oklch shorter hue, oklch(100% 0 330deg), oklch(100% 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100% 0 20deg), oklch(100% 0 320deg))' assert_true: 'color-mix(in oklch shorter hue, oklch(100% 0 20deg), oklch(100% 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch shorter hue, oklch(100% 0 320deg), oklch(100% 0 20deg))' assert_true: 'color-mix(in oklch shorter hue, oklch(100% 0 320deg), oklch(100% 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch longer hue, oklch(100% 0 40deg), oklch(100% 0 60deg))' assert_true: 'color-mix(in oklch longer hue, oklch(100% 0 40deg), oklch(100% 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch longer hue, oklch(100% 0 60deg), oklch(100% 0 40deg))' assert_true: 'color-mix(in oklch longer hue, oklch(100% 0 60deg), oklch(100% 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch longer hue, oklch(100% 0 50deg), oklch(100% 0 330deg))' assert_true: 'color-mix(in oklch longer hue, oklch(100% 0 50deg), oklch(100% 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch longer hue, oklch(100% 0 330deg), oklch(100% 0 50deg))' assert_true: 'color-mix(in oklch longer hue, oklch(100% 0 330deg), oklch(100% 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch longer hue, oklch(100% 0 20deg), oklch(100% 0 320deg))' assert_true: 'color-mix(in oklch longer hue, oklch(100% 0 20deg), oklch(100% 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch longer hue, oklch(100% 0 320deg), oklch(100% 0 20deg))' assert_true: 'color-mix(in oklch longer hue, oklch(100% 0 320deg), oklch(100% 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100% 0 40deg), oklch(100% 0 60deg))' assert_true: 'color-mix(in oklch increasing hue, oklch(100% 0 40deg), oklch(100% 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100% 0 60deg), oklch(100% 0 40deg))' assert_true: 'color-mix(in oklch increasing hue, oklch(100% 0 60deg), oklch(100% 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100% 0 50deg), oklch(100% 0 330deg))' assert_true: 'color-mix(in oklch increasing hue, oklch(100% 0 50deg), oklch(100% 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100% 0 330deg), oklch(100% 0 50deg))' assert_true: 'color-mix(in oklch increasing hue, oklch(100% 0 330deg), oklch(100% 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100% 0 20deg), oklch(100% 0 320deg))' assert_true: 'color-mix(in oklch increasing hue, oklch(100% 0 20deg), oklch(100% 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch increasing hue, oklch(100% 0 320deg), oklch(100% 0 20deg))' assert_true: 'color-mix(in oklch increasing hue, oklch(100% 0 320deg), oklch(100% 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100% 0 40deg), oklch(100% 0 60deg))' assert_true: 'color-mix(in oklch decreasing hue, oklch(100% 0 40deg), oklch(100% 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100% 0 60deg), oklch(100% 0 40deg))' assert_true: 'color-mix(in oklch decreasing hue, oklch(100% 0 60deg), oklch(100% 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100% 0 50deg), oklch(100% 0 330deg))' assert_true: 'color-mix(in oklch decreasing hue, oklch(100% 0 50deg), oklch(100% 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100% 0 330deg), oklch(100% 0 50deg))' assert_true: 'color-mix(in oklch decreasing hue, oklch(100% 0 330deg), oklch(100% 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100% 0 20deg), oklch(100% 0 320deg))' assert_true: 'color-mix(in oklch decreasing hue, oklch(100% 0 20deg), oklch(100% 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch decreasing hue, oklch(100% 0 320deg), oklch(100% 0 20deg))' assert_true: 'color-mix(in oklch decreasing hue, oklch(100% 0 320deg), oklch(100% 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch specified hue, oklch(100% 0 40deg), oklch(100% 0 60deg))' assert_true: 'color-mix(in oklch specified hue, oklch(100% 0 40deg), oklch(100% 0 60deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch specified hue, oklch(100% 0 60deg), oklch(100% 0 40deg))' assert_true: 'color-mix(in oklch specified hue, oklch(100% 0 60deg), oklch(100% 0 40deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch specified hue, oklch(100% 0 50deg), oklch(100% 0 330deg))' assert_true: 'color-mix(in oklch specified hue, oklch(100% 0 50deg), oklch(100% 0 330deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch specified hue, oklch(100% 0 330deg), oklch(100% 0 50deg))' assert_true: 'color-mix(in oklch specified hue, oklch(100% 0 330deg), oklch(100% 0 50deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch specified hue, oklch(100% 0 20deg), oklch(100% 0 320deg))' assert_true: 'color-mix(in oklch specified hue, oklch(100% 0 20deg), oklch(100% 0 320deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch specified hue, oklch(100% 0 320deg), oklch(100% 0 20deg))' assert_true: 'color-mix(in oklch specified hue, oklch(100% 0 320deg), oklch(100% 0 20deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(none none none), oklch(none none none))' assert_true: 'color-mix(in oklch, oklch(none none none), oklch(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(none none none), oklch(50% 60 70deg))' assert_true: 'color-mix(in oklch, oklch(none none none), oklch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg), oklch(none none none))' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg), oklch(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 none), oklch(50% 60 70deg))' assert_true: 'color-mix(in oklch, oklch(10% 20 none), oklch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg), oklch(50% 60 none))' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg), oklch(50% 60 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(none 20 30deg), oklch(50% none 70deg))' assert_true: 'color-mix(in oklch, oklch(none 20 30deg), oklch(50% none 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg / none), oklch(50% 60 70deg))' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg / none), oklch(50% 60 70deg))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg / none), oklch(50% 60 70deg / 0.5))' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg / none), oklch(50% 60 70deg / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklch, oklch(10% 20 30deg / none), oklch(50% 60 70deg / none))' assert_true: 'color-mix(in oklch, oklch(10% 20 30deg / none), oklch(50% 60 70deg / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30), lab(50% 60 70))' assert_true: 'color-mix(in lab, lab(10% 20 30), lab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30) 25%, lab(50% 60 70))' assert_true: 'color-mix(in lab, lab(10% 20 30) 25%, lab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, 25% lab(10% 20 30), lab(50% 60 70))' assert_true: 'color-mix(in lab, 25% lab(10% 20 30), lab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30), 25% lab(50% 60 70))' assert_true: 'color-mix(in lab, lab(10% 20 30), 25% lab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30), lab(50% 60 70) 25%)' assert_true: 'color-mix(in lab, lab(10% 20 30), lab(50% 60 70) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30) 25%, lab(50% 60 70) 75%)' assert_true: 'color-mix(in lab, lab(10% 20 30) 25%, lab(50% 60 70) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30) 30%, lab(50% 60 70) 90%)' assert_true: 'color-mix(in lab, lab(10% 20 30) 30%, lab(50% 60 70) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30) 12.5%, lab(50% 60 70) 37.5%)' assert_true: 'color-mix(in lab, lab(10% 20 30) 12.5%, lab(50% 60 70) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30) 0%, lab(50% 60 70))' assert_true: 'color-mix(in lab, lab(10% 20 30) 0%, lab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30 / .4), lab(50% 60 70 / .8))' assert_true: 'color-mix(in lab, lab(10% 20 30 / .4), lab(50% 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30 / .4) 25%, lab(50% 60 70 / .8))' assert_true: 'color-mix(in lab, lab(10% 20 30 / .4) 25%, lab(50% 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, 25% lab(10% 20 30 / .4), lab(50% 60 70 / .8))' assert_true: 'color-mix(in lab, 25% lab(10% 20 30 / .4), lab(50% 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30 / .4), 25% lab(50% 60 70 / .8))' assert_true: 'color-mix(in lab, lab(10% 20 30 / .4), 25% lab(50% 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30 / .4), lab(50% 60 70 / .8) 25%)' assert_true: 'color-mix(in lab, lab(10% 20 30 / .4), lab(50% 60 70 / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30 / .4) 25%, lab(50% 60 70 / .8) 75%)' assert_true: 'color-mix(in lab, lab(10% 20 30 / .4) 25%, lab(50% 60 70 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30 / .4) 30%, lab(50% 60 70 / .8) 90%)' assert_true: 'color-mix(in lab, lab(10% 20 30 / .4) 30%, lab(50% 60 70 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30 / .4) 12.5%, lab(50% 60 70 / .8) 37.5%)' assert_true: 'color-mix(in lab, lab(10% 20 30 / .4) 12.5%, lab(50% 60 70 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30 / .4) 0%, lab(50% 60 70 / .8))' assert_true: 'color-mix(in lab, lab(10% 20 30 / .4) 0%, lab(50% 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(none none none), lab(none none none))' assert_true: 'color-mix(in lab, lab(none none none), lab(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(none none none), lab(50% 60 70))' assert_true: 'color-mix(in lab, lab(none none none), lab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30), lab(none none none))' assert_true: 'color-mix(in lab, lab(10% 20 30), lab(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 none), lab(50% 60 70))' assert_true: 'color-mix(in lab, lab(10% 20 none), lab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30), lab(50% 60 none))' assert_true: 'color-mix(in lab, lab(10% 20 30), lab(50% 60 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(none 20 30), lab(50% none 70))' assert_true: 'color-mix(in lab, lab(none 20 30), lab(50% none 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30 / none), lab(50% 60 70))' assert_true: 'color-mix(in lab, lab(10% 20 30 / none), lab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30 / none), lab(50% 60 70 / 0.5))' assert_true: 'color-mix(in lab, lab(10% 20 30 / none), lab(50% 60 70 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in lab, lab(10% 20 30 / none), lab(50% 60 70 / none))' assert_true: 'color-mix(in lab, lab(10% 20 30 / none), lab(50% 60 70 / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30), oklab(50% 60 70))' assert_true: 'color-mix(in oklab, oklab(10% 20 30), oklab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30) 25%, oklab(50% 60 70))' assert_true: 'color-mix(in oklab, oklab(10% 20 30) 25%, oklab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, 25% oklab(10% 20 30), oklab(50% 60 70))' assert_true: 'color-mix(in oklab, 25% oklab(10% 20 30), oklab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30), 25% oklab(50% 60 70))' assert_true: 'color-mix(in oklab, oklab(10% 20 30), 25% oklab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30), oklab(50% 60 70) 25%)' assert_true: 'color-mix(in oklab, oklab(10% 20 30), oklab(50% 60 70) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30) 25%, oklab(50% 60 70) 75%)' assert_true: 'color-mix(in oklab, oklab(10% 20 30) 25%, oklab(50% 60 70) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30) 30%, oklab(50% 60 70) 90%)' assert_true: 'color-mix(in oklab, oklab(10% 20 30) 30%, oklab(50% 60 70) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30) 12.5%, oklab(50% 60 70) 37.5%)' assert_true: 'color-mix(in oklab, oklab(10% 20 30) 12.5%, oklab(50% 60 70) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30) 0%, oklab(50% 60 70))' assert_true: 'color-mix(in oklab, oklab(10% 20 30) 0%, oklab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30 / .4), oklab(50% 60 70 / .8))' assert_true: 'color-mix(in oklab, oklab(10% 20 30 / .4), oklab(50% 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30 / .4) 25%, oklab(50% 60 70 / .8))' assert_true: 'color-mix(in oklab, oklab(10% 20 30 / .4) 25%, oklab(50% 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, 25% oklab(10% 20 30 / .4), oklab(50% 60 70 / .8))' assert_true: 'color-mix(in oklab, 25% oklab(10% 20 30 / .4), oklab(50% 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30 / .4), 25% oklab(50% 60 70 / .8))' assert_true: 'color-mix(in oklab, oklab(10% 20 30 / .4), 25% oklab(50% 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30 / .4), oklab(50% 60 70 / .8) 25%)' assert_true: 'color-mix(in oklab, oklab(10% 20 30 / .4), oklab(50% 60 70 / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30 / .4) 25%, oklab(50% 60 70 / .8) 75%)' assert_true: 'color-mix(in oklab, oklab(10% 20 30 / .4) 25%, oklab(50% 60 70 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30 / .4) 30%, oklab(50% 60 70 / .8) 90%)' assert_true: 'color-mix(in oklab, oklab(10% 20 30 / .4) 30%, oklab(50% 60 70 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30 / .4) 12.5%, oklab(50% 60 70 / .8) 37.5%)' assert_true: 'color-mix(in oklab, oklab(10% 20 30 / .4) 12.5%, oklab(50% 60 70 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30 / .4) 0%, oklab(50% 60 70 / .8))' assert_true: 'color-mix(in oklab, oklab(10% 20 30 / .4) 0%, oklab(50% 60 70 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(none none none), oklab(none none none))' assert_true: 'color-mix(in oklab, oklab(none none none), oklab(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(none none none), oklab(50% 60 70))' assert_true: 'color-mix(in oklab, oklab(none none none), oklab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30), oklab(none none none))' assert_true: 'color-mix(in oklab, oklab(10% 20 30), oklab(none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 none), oklab(50% 60 70))' assert_true: 'color-mix(in oklab, oklab(10% 20 none), oklab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30), oklab(50% 60 none))' assert_true: 'color-mix(in oklab, oklab(10% 20 30), oklab(50% 60 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(none 20 30), oklab(50% none 70))' assert_true: 'color-mix(in oklab, oklab(none 20 30), oklab(50% none 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30 / none), oklab(50% 60 70))' assert_true: 'color-mix(in oklab, oklab(10% 20 30 / none), oklab(50% 60 70))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30 / none), oklab(50% 60 70 / 0.5))' assert_true: 'color-mix(in oklab, oklab(10% 20 30 / none), oklab(50% 60 70 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in oklab, oklab(10% 20 30 / none), oklab(50% 60 70 / none))' assert_true: 'color-mix(in oklab, oklab(10% 20 30 / none), oklab(50% 60 70 / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, 25% color(srgb .1 .2 .3), color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, 25% color(srgb .1 .2 .3), color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7) 25%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), 25% color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3), 25% color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7) 75%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 30%, color(srgb .5 .6 .7) 90%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3) 30%, color(srgb .5 .6 .7) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 12.5%, color(srgb .5 .6 .7) 37.5%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3) 12.5%, color(srgb .5 .6 .7) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 0%, color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3) 0%, color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .5), color(srgb .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .5), color(srgb .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, 25% color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb, 25% color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8) 25%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4), 25% color(srgb .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4), 25% color(srgb .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8) 75%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 30%, color(srgb .5 .6 .7 / .8) 90%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 30%, color(srgb .5 .6 .7 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 12.5%, color(srgb .5 .6 .7 / .8) 37.5%)' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 12.5%, color(srgb .5 .6 .7 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 0%, color(srgb .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 0%, color(srgb .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb 2 3 4 / 5), color(srgb 4 6 8 / 10))' assert_true: 'color-mix(in srgb, color(srgb 2 3 4 / 5), color(srgb 4 6 8 / 10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb -2 -3 -4), color(srgb -4 -6 -8))' assert_true: 'color-mix(in srgb, color(srgb -2 -3 -4), color(srgb -4 -6 -8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb -2 -3 -4 / -5), color(srgb -4 -6 -8 / -10))' assert_true: 'color-mix(in srgb, color(srgb -2 -3 -4 / -5), color(srgb -4 -6 -8 / -10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb none none none), color(srgb none none none))' assert_true: 'color-mix(in srgb, color(srgb none none none), color(srgb none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb none none none), color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb none none none), color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb none none none))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 none), color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 none), color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 none))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb none .2 .3), color(srgb .5 none .7))' assert_true: 'color-mix(in srgb, color(srgb none .2 .3), color(srgb .5 none .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / 0.5))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / none))' assert_true: 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7) 25%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), 25% color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), 25% color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7) 75%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 30%, color(srgb-linear .5 .6 .7) 90%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 30%, color(srgb-linear .5 .6 .7) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 12.5%, color(srgb-linear .5 .6 .7) 37.5%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 12.5%, color(srgb-linear .5 .6 .7) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 0%, color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 0%, color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .5), color(srgb-linear .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .5), color(srgb-linear .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8) 25%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), 25% color(srgb-linear .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), 25% color(srgb-linear .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8) 75%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 30%, color(srgb-linear .5 .6 .7 / .8) 90%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 30%, color(srgb-linear .5 .6 .7 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 12.5%, color(srgb-linear .5 .6 .7 / .8) 37.5%)' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 12.5%, color(srgb-linear .5 .6 .7 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 0%, color(srgb-linear .5 .6 .7 / .8))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 0%, color(srgb-linear .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear 2 3 4 / 5), color(srgb-linear 4 6 8 / 10))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear 2 3 4 / 5), color(srgb-linear 4 6 8 / 10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear -2 -3 -4), color(srgb-linear -4 -6 -8))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear -2 -3 -4), color(srgb-linear -4 -6 -8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear -2 -3 -4 / -5), color(srgb-linear -4 -6 -8 / -10))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear -2 -3 -4 / -5), color(srgb-linear -4 -6 -8 / -10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear none none none))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear none none none))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 none), color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 none), color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 none))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear none .2 .3), color(srgb-linear .5 none .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear none .2 .3), color(srgb-linear .5 none .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / 0.5))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / none))' assert_true: 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, 25% color(xyz .1 .2 .3), color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, 25% color(xyz .1 .2 .3), color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7) 25%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), 25% color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3), 25% color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7) 75%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 30%, color(xyz .5 .6 .7) 90%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3) 30%, color(xyz .5 .6 .7) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 12.5%, color(xyz .5 .6 .7) 37.5%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3) 12.5%, color(xyz .5 .6 .7) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 0%, color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3) 0%, color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .5), color(xyz .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .5), color(xyz .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, 25% color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz, 25% color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8) 25%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4), 25% color(xyz .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4), 25% color(xyz .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8) 75%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 30%, color(xyz .5 .6 .7 / .8) 90%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 30%, color(xyz .5 .6 .7 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 12.5%, color(xyz .5 .6 .7 / .8) 37.5%)' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 12.5%, color(xyz .5 .6 .7 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 0%, color(xyz .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 0%, color(xyz .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz 2 3 4 / 5), color(xyz 4 6 8 / 10))' assert_true: 'color-mix(in xyz, color(xyz 2 3 4 / 5), color(xyz 4 6 8 / 10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz -2 -3 -4), color(xyz -4 -6 -8))' assert_true: 'color-mix(in xyz, color(xyz -2 -3 -4), color(xyz -4 -6 -8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz -2 -3 -4 / -5), color(xyz -4 -6 -8 / -10))' assert_true: 'color-mix(in xyz, color(xyz -2 -3 -4 / -5), color(xyz -4 -6 -8 / -10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz none none none), color(xyz none none none))' assert_true: 'color-mix(in xyz, color(xyz none none none), color(xyz none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz none none none), color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz none none none), color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz none none none))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 none), color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 none), color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 none))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz none .2 .3), color(xyz .5 none .7))' assert_true: 'color-mix(in xyz, color(xyz none .2 .3), color(xyz .5 none .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / 0.5))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / none))' assert_true: 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7) 25%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), 25% color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), 25% color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7) 75%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 30%, color(xyz-d50 .5 .6 .7) 90%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 30%, color(xyz-d50 .5 .6 .7) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 12.5%, color(xyz-d50 .5 .6 .7) 37.5%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 12.5%, color(xyz-d50 .5 .6 .7) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 0%, color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 0%, color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .5), color(xyz-d50 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .5), color(xyz-d50 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8) 25%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), 25% color(xyz-d50 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), 25% color(xyz-d50 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8) 75%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 30%, color(xyz-d50 .5 .6 .7 / .8) 90%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 30%, color(xyz-d50 .5 .6 .7 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 12.5%, color(xyz-d50 .5 .6 .7 / .8) 37.5%)' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 12.5%, color(xyz-d50 .5 .6 .7 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 0%, color(xyz-d50 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 0%, color(xyz-d50 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 2 3 4 / 5), color(xyz-d50 4 6 8 / 10))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 2 3 4 / 5), color(xyz-d50 4 6 8 / 10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4), color(xyz-d50 -4 -6 -8))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4), color(xyz-d50 -4 -6 -8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4 / -5), color(xyz-d50 -4 -6 -8 / -10))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4 / -5), color(xyz-d50 -4 -6 -8 / -10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 none none none))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 none none none))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 none), color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 none), color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 none))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 none .2 .3), color(xyz-d50 .5 none .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 none .2 .3), color(xyz-d50 .5 none .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / 0.5))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / none))' assert_true: 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7) 25%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), 25% color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), 25% color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7) 75%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 30%, color(xyz-d65 .5 .6 .7) 90%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 30%, color(xyz-d65 .5 .6 .7) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 12.5%, color(xyz-d65 .5 .6 .7) 37.5%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 12.5%, color(xyz-d65 .5 .6 .7) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 0%, color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 0%, color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .5), color(xyz-d65 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .5), color(xyz-d65 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8) 25%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8) 25%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), 25% color(xyz-d65 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), 25% color(xyz-d65 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8) 75%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8) 75%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 30%, color(xyz-d65 .5 .6 .7 / .8) 90%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 30%, color(xyz-d65 .5 .6 .7 / .8) 90%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 12.5%, color(xyz-d65 .5 .6 .7 / .8) 37.5%)' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 12.5%, color(xyz-d65 .5 .6 .7 / .8) 37.5%)' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 0%, color(xyz-d65 .5 .6 .7 / .8))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 0%, color(xyz-d65 .5 .6 .7 / .8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 2 3 4 / 5), color(xyz-d65 4 6 8 / 10))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 2 3 4 / 5), color(xyz-d65 4 6 8 / 10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4), color(xyz-d65 -4 -6 -8))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4), color(xyz-d65 -4 -6 -8))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4 / -5), color(xyz-d65 -4 -6 -8 / -10))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4 / -5), color(xyz-d65 -4 -6 -8 / -10))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 none none none))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 none none none))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 none none none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 none), color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 none), color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 none))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 none))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 none .2 .3), color(xyz-d65 .5 none .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 none .2 .3), color(xyz-d65 .5 none .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / 0.5))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / 0.5))' is a supported value for color. expected true got false -FAIL Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / none))' assert_true: 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / none))' is a supported value for color. expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/color-mix-valid-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/color-mix-valid-expected.txt deleted file mode 100644 index 3d1143af..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/color-mix-valid-expected.txt +++ /dev/null
@@ -1,478 +0,0 @@ -This is a testharness.js-based test. -Found 474 tests; 0 PASS, 474 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl specified hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(none none none), hsl(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, lab(100% 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, lab(0% 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, lch(100% 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, lch(0% 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, oklab(100% 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, oklab(0% 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, oklch(100% 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hsl, oklch(0% 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb specified hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(none none none), hwb(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, lab(100% 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, lab(0% 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, lch(100% 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, lch(0% 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, oklab(100% 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, oklab(0% 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, oklch(100% 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in hwb, oklch(0% 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg), lch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg) 25%, lch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, 25% lch(10% 20 30deg), lch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg), 25% lch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg), lch(50% 60 70deg) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg) 25%, lch(50% 60 70deg) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg) 30%, lch(50% 60 70deg) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg) 12.5%, lch(50% 60 70deg) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg) 0%, lch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4), lch(50% 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4) 25%, lch(50% 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, 25% lch(10% 20 30deg / .4), lch(50% 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4), 25% lch(50% 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4), lch(50% 60 70deg / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4) 25%, lch(50% 60 70deg / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4) 30%, lch(50% 60 70deg / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4) 12.5%, lch(50% 60 70deg / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / .4) 0%, lch(50% 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(100% 0 40deg), lch(100% 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(100% 0 60deg), lch(100% 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(100% 0 50deg), lch(100% 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(100% 0 330deg), lch(100% 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(100% 0 20deg), lch(100% 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(100% 0 320deg), lch(100% 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100% 0 40deg), lch(100% 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100% 0 60deg), lch(100% 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100% 0 50deg), lch(100% 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100% 0 330deg), lch(100% 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100% 0 20deg), lch(100% 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch shorter hue, lch(100% 0 320deg), lch(100% 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100% 0 40deg), lch(100% 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100% 0 60deg), lch(100% 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100% 0 50deg), lch(100% 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100% 0 330deg), lch(100% 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100% 0 20deg), lch(100% 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch longer hue, lch(100% 0 320deg), lch(100% 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100% 0 40deg), lch(100% 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100% 0 60deg), lch(100% 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100% 0 50deg), lch(100% 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100% 0 330deg), lch(100% 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100% 0 20deg), lch(100% 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch increasing hue, lch(100% 0 320deg), lch(100% 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100% 0 40deg), lch(100% 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100% 0 60deg), lch(100% 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100% 0 50deg), lch(100% 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100% 0 330deg), lch(100% 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100% 0 20deg), lch(100% 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch decreasing hue, lch(100% 0 320deg), lch(100% 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100% 0 40deg), lch(100% 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100% 0 60deg), lch(100% 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100% 0 50deg), lch(100% 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100% 0 330deg), lch(100% 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100% 0 20deg), lch(100% 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch specified hue, lch(100% 0 320deg), lch(100% 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(none none none), lch(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(none none none), lch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg), lch(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 none), lch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg), lch(50% 60 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(none 20 30deg), lch(50% none 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / none), lch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / none), lch(50% 60 70deg / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lch, lch(10% 20 30deg / none), lch(50% 60 70deg / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg), oklch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg) 25%, oklch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, 25% oklch(10% 20 30deg), oklch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg), 25% oklch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg), oklch(50% 60 70deg) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg) 25%, oklch(50% 60 70deg) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg) 30%, oklch(50% 60 70deg) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg) 12.5%, oklch(50% 60 70deg) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg) 0%, oklch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4), oklch(50% 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4) 25%, oklch(50% 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, 25% oklch(10% 20 30deg / .4), oklch(50% 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4), 25% oklch(50% 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4), oklch(50% 60 70deg / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4) 25%, oklch(50% 60 70deg / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4) 30%, oklch(50% 60 70deg / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4) 12.5%, oklch(50% 60 70deg / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / .4) 0%, oklch(50% 60 70deg / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(100% 0 40deg), oklch(100% 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(100% 0 60deg), oklch(100% 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(100% 0 50deg), oklch(100% 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(100% 0 330deg), oklch(100% 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(100% 0 20deg), oklch(100% 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(100% 0 320deg), oklch(100% 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100% 0 40deg), oklch(100% 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100% 0 60deg), oklch(100% 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100% 0 50deg), oklch(100% 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100% 0 330deg), oklch(100% 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100% 0 20deg), oklch(100% 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch shorter hue, oklch(100% 0 320deg), oklch(100% 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100% 0 40deg), oklch(100% 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100% 0 60deg), oklch(100% 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100% 0 50deg), oklch(100% 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100% 0 330deg), oklch(100% 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100% 0 20deg), oklch(100% 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch longer hue, oklch(100% 0 320deg), oklch(100% 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100% 0 40deg), oklch(100% 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100% 0 60deg), oklch(100% 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100% 0 50deg), oklch(100% 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100% 0 330deg), oklch(100% 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100% 0 20deg), oklch(100% 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch increasing hue, oklch(100% 0 320deg), oklch(100% 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100% 0 40deg), oklch(100% 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100% 0 60deg), oklch(100% 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100% 0 50deg), oklch(100% 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100% 0 330deg), oklch(100% 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100% 0 20deg), oklch(100% 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch decreasing hue, oklch(100% 0 320deg), oklch(100% 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100% 0 40deg), oklch(100% 0 60deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100% 0 60deg), oklch(100% 0 40deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100% 0 50deg), oklch(100% 0 330deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100% 0 330deg), oklch(100% 0 50deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100% 0 20deg), oklch(100% 0 320deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch specified hue, oklch(100% 0 320deg), oklch(100% 0 20deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(none none none), oklch(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(none none none), oklch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg), oklch(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 none), oklch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg), oklch(50% 60 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(none 20 30deg), oklch(50% none 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / none), oklch(50% 60 70deg))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / none), oklch(50% 60 70deg / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklch, oklch(10% 20 30deg / none), oklch(50% 60 70deg / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30), lab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30) 25%, lab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, 25% lab(10% 20 30), lab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30), 25% lab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30), lab(50% 60 70) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30) 25%, lab(50% 60 70) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30) 30%, lab(50% 60 70) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30) 12.5%, lab(50% 60 70) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30) 0%, lab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4), lab(50% 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4) 25%, lab(50% 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, 25% lab(10% 20 30 / .4), lab(50% 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4), 25% lab(50% 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4), lab(50% 60 70 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4) 25%, lab(50% 60 70 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4) 30%, lab(50% 60 70 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4) 12.5%, lab(50% 60 70 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30 / .4) 0%, lab(50% 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(none none none), lab(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(none none none), lab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30), lab(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 none), lab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30), lab(50% 60 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(none 20 30), lab(50% none 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30 / none), lab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30 / none), lab(50% 60 70 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in lab, lab(10% 20 30 / none), lab(50% 60 70 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30), oklab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30) 25%, oklab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, 25% oklab(10% 20 30), oklab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30), 25% oklab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30), oklab(50% 60 70) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30) 25%, oklab(50% 60 70) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30) 30%, oklab(50% 60 70) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30) 12.5%, oklab(50% 60 70) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30) 0%, oklab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4), oklab(50% 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4) 25%, oklab(50% 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, 25% oklab(10% 20 30 / .4), oklab(50% 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4), 25% oklab(50% 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4), oklab(50% 60 70 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4) 25%, oklab(50% 60 70 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4) 30%, oklab(50% 60 70 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4) 12.5%, oklab(50% 60 70 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / .4) 0%, oklab(50% 60 70 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(none none none), oklab(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(none none none), oklab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30), oklab(none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 none), oklab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30), oklab(50% 60 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(none 20 30), oklab(50% none 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / none), oklab(50% 60 70))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / none), oklab(50% 60 70 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in oklab, oklab(10% 20 30 / none), oklab(50% 60 70 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, 25% color(srgb .1 .2 .3), color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), 25% color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 30%, color(srgb .5 .6 .7) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 12.5%, color(srgb .5 .6 .7) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3) 0%, color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .5), color(srgb .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, 25% color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4), 25% color(srgb .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 30%, color(srgb .5 .6 .7 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 12.5%, color(srgb .5 .6 .7 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 0%, color(srgb .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb 2 3 4 / 5), color(srgb 4 6 8 / 10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb -2 -3 -4), color(srgb -4 -6 -8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb -2 -3 -4 / -5), color(srgb -4 -6 -8 / -10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb none none none), color(srgb none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb none none none), color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), color(srgb none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 none), color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb none .2 .3), color(srgb .5 none .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), 25% color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 30%, color(srgb-linear .5 .6 .7) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 12.5%, color(srgb-linear .5 .6 .7) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 0%, color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .5), color(srgb-linear .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), 25% color(srgb-linear .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 30%, color(srgb-linear .5 .6 .7 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 12.5%, color(srgb-linear .5 .6 .7 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 0%, color(srgb-linear .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear 2 3 4 / 5), color(srgb-linear 4 6 8 / 10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear -2 -3 -4), color(srgb-linear -4 -6 -8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear -2 -3 -4 / -5), color(srgb-linear -4 -6 -8 / -10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 none), color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear none .2 .3), color(srgb-linear .5 none .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, 25% color(xyz .1 .2 .3), color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), 25% color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 30%, color(xyz .5 .6 .7) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 12.5%, color(xyz .5 .6 .7) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3) 0%, color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .5), color(xyz .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, 25% color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4), 25% color(xyz .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 30%, color(xyz .5 .6 .7 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 12.5%, color(xyz .5 .6 .7 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 0%, color(xyz .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz 2 3 4 / 5), color(xyz 4 6 8 / 10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz -2 -3 -4), color(xyz -4 -6 -8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz -2 -3 -4 / -5), color(xyz -4 -6 -8 / -10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz none none none), color(xyz none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz none none none), color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), color(xyz none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 none), color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz none .2 .3), color(xyz .5 none .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), 25% color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 30%, color(xyz-d50 .5 .6 .7) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 12.5%, color(xyz-d50 .5 .6 .7) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 0%, color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .5), color(xyz-d50 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), 25% color(xyz-d50 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 30%, color(xyz-d50 .5 .6 .7 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 12.5%, color(xyz-d50 .5 .6 .7 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 0%, color(xyz-d50 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 2 3 4 / 5), color(xyz-d50 4 6 8 / 10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4), color(xyz-d50 -4 -6 -8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4 / -5), color(xyz-d50 -4 -6 -8 / -10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 none), color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 none .2 .3), color(xyz-d50 .5 none .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), 25% color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 30%, color(xyz-d65 .5 .6 .7) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 12.5%, color(xyz-d65 .5 .6 .7) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 0%, color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .5), color(xyz-d65 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8) 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), 25% color(xyz-d65 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8) 75%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 30%, color(xyz-d65 .5 .6 .7 / .8) 90%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 12.5%, color(xyz-d65 .5 .6 .7 / .8) 37.5%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 0%, color(xyz-d65 .5 .6 .7 / .8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 2 3 4 / 5), color(xyz-d65 4 6 8 / 10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4), color(xyz-d65 -4 -6 -8))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4 / -5), color(xyz-d65 -4 -6 -8 / -10))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 none none none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 none), color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 none))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 none .2 .3), color(xyz-d65 .5 none .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / 0.5))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / none))" should set the property value assert_not_equals: property should be set got disallowed value "" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/color-valid-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/color-valid-expected.txt deleted file mode 100644 index 8d9c22d9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/color-valid-expected.txt +++ /dev/null
@@ -1,407 +0,0 @@ -This is a testharness.js-based test. -Found 403 tests; 36 PASS, 367 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS e.style['color'] = "currentcolor" should set the property value -PASS e.style['color'] = "transparent" should set the property value -PASS e.style['color'] = "red" should set the property value -PASS e.style['color'] = "magenta" should set the property value -PASS e.style['color'] = "#234" should set the property value -PASS e.style['color'] = "#FEDCBA" should set the property value -PASS e.style['color'] = "rgb(2, 3, 4)" should set the property value -PASS e.style['color'] = "rgb(100%, 0%, 0%)" should set the property value -PASS e.style['color'] = "rgba(2, 3, 4, 0.5)" should set the property value -PASS e.style['color'] = "rgba(2, 3, 4, 50%)" should set the property value -PASS e.style['color'] = "hsl(120, 100%, 50%)" should set the property value -PASS e.style['color'] = "hsla(120, 100%, 50%, 0.25)" should set the property value -PASS e.style['color'] = "rgb(-2, 3, 4)" should set the property value -PASS e.style['color'] = "rgb(100, 200, 300)" should set the property value -PASS e.style['color'] = "rgb(20, 10, 0, -10)" should set the property value -PASS e.style['color'] = "rgb(100%, 200%, 300%)" should set the property value -FAIL e.style['color'] = "rgb(none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(128 none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(128 none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(none none none / .5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(20% none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(20% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(none none none / 50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgba(none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgba(none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgba(128 none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgba(128 none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgba(none none none / .5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgba(20% none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgba(20% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgba(none none none / 50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hsl(120 30% 50%)" should set the property value -PASS e.style['color'] = "hsl(120 30% 50% / 0.5)" should set the property value -FAIL e.style['color'] = "hsl(none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hsl(0 0% 0%)" should set the property value -FAIL e.style['color'] = "hsl(none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hsl(0 0% 0% / 0)" should set the property value -FAIL e.style['color'] = "hsla(none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hsla(0 0% 0%)" should set the property value -FAIL e.style['color'] = "hsla(none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hsla(0 0% 0% / 0)" should set the property value -FAIL e.style['color'] = "hsl(120 none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hsl(120 0% 0%)" should set the property value -FAIL e.style['color'] = "hsl(120 80% none)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hsl(120 80% 0%)" should set the property value -FAIL e.style['color'] = "hsl(120 none 50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hsl(120 0% 50%)" should set the property value -FAIL e.style['color'] = "hsl(120 100% 50% / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hsl(120 100% 50% / 0)" should set the property value -FAIL e.style['color'] = "hsl(none 100% 50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hsl(0 100% 50%)" should set the property value -PASS e.style['color'] = "hwb(120 30% 50%)" should set the property value -PASS e.style['color'] = "hwb(120 30% 50% / 0.5)" should set the property value -FAIL e.style['color'] = "hwb(none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hwb(0 0% 0%)" should set the property value -FAIL e.style['color'] = "hwb(none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hwb(0 0% 0% / 0)" should set the property value -FAIL e.style['color'] = "hwb(120 none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hwb(120 0% 0%)" should set the property value -FAIL e.style['color'] = "hwb(120 80% none)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hwb(120 80% 0%)" should set the property value -FAIL e.style['color'] = "hwb(120 none 50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hwb(120 0% 50%)" should set the property value -FAIL e.style['color'] = "hwb(120 30% 50% / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hwb(120 30% 50% / 0)" should set the property value -FAIL e.style['color'] = "hwb(none 100% 50% / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hwb(0 100% 50% / 0)" should set the property value -FAIL e.style['color'] = "color(srgb 0% 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 10% 10% 10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb .2 .2 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 20% 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 20% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 400% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 50% -160 160)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 50% -200 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 50% -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 50% -200 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 50% / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 200 200 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 200 200 200 / 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb -200 -200 -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb -200 -200 -200 / -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 200% 200% 200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 200% 200% 200% / 200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb -200% -200% -200% / -200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 10% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 0% 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 10% 10% 10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear .2 .2 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 20% 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 20% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 400% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 50% -160 160)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 50% -200 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 50% -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 50% -200 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 50% / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 200 200 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 200 200 200 / 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear -200 -200 -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear -200 -200 -200 / -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 200% 200% 200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 200% 200% 200% / 200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear -200% -200% -200% / -200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 10% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(srgb-linear 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 0% 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 10% 10% 10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb .2 .2 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 20% 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 20% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 400% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 50% -160 160)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 50% -200 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 50% -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 50% -200 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 50% / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 200 200 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 200 200 200 / 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb -200 -200 -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb -200 -200 -200 / -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 200% 200% 200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 200% 200% 200% / 200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb -200% -200% -200% / -200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 10% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(a98-rgb 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 0% 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 10% 10% 10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 .2 .2 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 20% 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 20% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 400% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 50% -160 160)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 50% -200 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 50% -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 50% -200 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 50% / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 200 200 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 200 200 200 / 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 -200 -200 -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 -200 -200 -200 / -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 200% 200% 200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 200% 200% 200% / 200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 -200% -200% -200% / -200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 10% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(rec2020 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 0% 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 10% 10% 10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb .2 .2 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 20% 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 20% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 400% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 50% -160 160)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 50% -200 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 50% -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 50% -200 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 50% / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 200 200 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 200 200 200 / 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb -200 -200 -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb -200 -200 -200 / -200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 200% 200% 200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 200% 200% 200% / 200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb -200% -200% -200% / -200%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 10% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(prophoto-rgb 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 1 1 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 1 1 1 / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz -1 -1 -1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 0.1 0.1 0.1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 10 10 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz .2 .2 .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 0 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz .20 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz .20 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 1 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 1 1 / .5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 1 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz / 50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 0.2 none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 1 1 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 1 1 1 / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 -1 -1 -1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 0.1 0.1 0.1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 10 10 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 .2 .2 .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 0 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 .20 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 .20 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 1 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 1 1 / .5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 1 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 / 50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 0.2 none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d50 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 0 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 1 1 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 1 1 1 / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 -1 -1 -1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 0.1 0.1 0.1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 10 10 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 .2 .2 .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 0 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 .20 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 .20 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 0 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 0 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 0 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 1 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 1 1 / .5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 1 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 / 50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 0.2 none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(xyz-d65 0 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(0% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(0% 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(20% 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(20% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(400% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(50% -160 160)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(50% -200 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(0% 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(0% 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(0% 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(-40% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(50% -20 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(50% 0 -20)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(calc(50% * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(calc(-50% * 3) calc(0.5 + 1) calc(-1.5) / calc(-0.5 * 2))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(20% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(0% 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(0% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(0% 0 0 / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(20% 0 10/0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(20% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(400% 0 10/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(50% -160 160)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(50% -200 200)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(0% 0 0 / -10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(0% 0 0 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(0% 0 0 / 300%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(-40% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(50% -20 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(50% 0 -20)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(calc(50% * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(calc(-50% * 3) calc(0.5 + 1) calc(-1.5) / calc(-0.5 * 2))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(20% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(0% 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(0% 0 0deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(0% 0 0deg / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(0% 0 0deg / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(100% 230 0deg / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(20% 50 20deg/0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(20% 50 20deg/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(10% 20 20deg / -10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(10% 20 20deg / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(10% 20 1.28rad)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(10% 20 380deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(10% 20 -340deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(10% 20 740deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(10% 20 -700deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(-40% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(20% -20 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(10% 20 20 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(10% 20 -700)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(calc(50% * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(calc(-50% * 3) calc(0.5 + 1) calc(-20deg * 2) / calc(-0.5 * 2))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(20% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(0% 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(0% 0 0deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(0% 0 0deg / 1)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(0% 0 0deg / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(100% 230 0deg / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(20% 50 20deg/0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(20% 50 20deg/50%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(10% 20 20deg / -10%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(10% 20 20deg / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(10% 20 1.28rad)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(10% 20 380deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(10% 20 -340deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(10% 20 740deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(10% 20 -700deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(-40% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(20% -20 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(0% 0 0 / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(10% 20 20 / 110%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(10% 20 -700)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(calc(50% * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(calc(-50% * 3) calc(0.5 + 1) calc(-20deg * 2) / calc(-0.5 * 2))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(20% none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(none none none / 0.5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(0% 0 0 / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/relative-color-computed-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/relative-color-computed-expected.txt deleted file mode 100644 index a22d69e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/relative-color-computed-expected.txt +++ /dev/null
@@ -1,885 +0,0 @@ -This is a testharness.js-based test. -Found 881 tests; 0 PASS, 881 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL Property color value 'rgb(from rebeccapurple r g b)' assert_true: 'rgb(from rebeccapurple r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g b / alpha)' assert_true: 'rgb(from rebeccapurple r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from hsl(120deg 20% 50% / .5) r g b / alpha)' assert_true: 'rgb(from hsl(120deg 20% 50% / .5) r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(from rebeccapurple r g b) r g b)' assert_true: 'rgb(from rgb(from rebeccapurple r g b) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from color(display-p3 0 1 0) r g b / alpha)' assert_true: 'rgb(from color(display-p3 0 1 0) r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from lab(100% 104.3 -50.9) r g b)' assert_true: 'rgb(from lab(100% 104.3 -50.9) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from lab(0% 104.3 -50.9) r g b)' assert_true: 'rgb(from lab(0% 104.3 -50.9) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from lch(100% 116 334) r g b)' assert_true: 'rgb(from lch(100% 116 334) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from lch(0% 116 334) r g b)' assert_true: 'rgb(from lch(0% 116 334) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from oklab(100% 0.365 -0.16) r g b)' assert_true: 'rgb(from oklab(100% 0.365 -0.16) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from oklab(0% 0.365 -0.16) r g b)' assert_true: 'rgb(from oklab(0% 0.365 -0.16) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from oklch(100% 0.399 336.3) r g b)' assert_true: 'rgb(from oklch(100% 0.399 336.3) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from oklch(0% 0.399 336.3) r g b)' assert_true: 'rgb(from oklch(0% 0.399 336.3) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 0 0 0)' assert_true: 'rgb(from rebeccapurple 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 0 0 0 / 0)' assert_true: 'rgb(from rebeccapurple 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 0 g b / alpha)' assert_true: 'rgb(from rebeccapurple 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r 0 b / alpha)' assert_true: 'rgb(from rebeccapurple r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g 0 / alpha)' assert_true: 'rgb(from rebeccapurple r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g b / 0)' assert_true: 'rgb(from rebeccapurple r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 0 g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 0 b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 0 / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 0)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 25 g b / alpha)' assert_true: 'rgb(from rebeccapurple 25 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r 25 b / alpha)' assert_true: 'rgb(from rebeccapurple r 25 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g 25 / alpha)' assert_true: 'rgb(from rebeccapurple r g 25 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g b / .25)' assert_true: 'rgb(from rebeccapurple r g b / .25)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / .20)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / .20)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 20% g b / alpha)' assert_true: 'rgb(from rebeccapurple 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r 20% b / alpha)' assert_true: 'rgb(from rebeccapurple r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g 20% / alpha)' assert_true: 'rgb(from rebeccapurple r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g b / 20%)' assert_true: 'rgb(from rebeccapurple r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 20% g b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% b / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 20% / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 20%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 25 g b / 25%)' assert_true: 'rgb(from rebeccapurple 25 g b / 25%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r 25 b / 25%)' assert_true: 'rgb(from rebeccapurple r 25 b / 25%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g 25 / 25%)' assert_true: 'rgb(from rebeccapurple r g 25 / 25%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / 25%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / 25%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / 25%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / 25%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / 25%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / 25%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple g b r)' assert_true: 'rgb(from rebeccapurple g b r)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple b alpha r / g)' assert_true: 'rgb(from rebeccapurple b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r r r / r)' assert_true: 'rgb(from rebeccapurple r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple alpha alpha alpha / alpha)' assert_true: 'rgb(from rebeccapurple alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) g b r)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) g b r)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) b alpha r / g)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r r r / r)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) alpha alpha alpha / alpha)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r 20% 10)' assert_true: 'rgb(from rebeccapurple r 20% 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r 10 20%)' assert_true: 'rgb(from rebeccapurple r 10 20%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple 0% 10 10)' assert_true: 'rgb(from rebeccapurple 0% 10 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% 10)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 20% 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) r 10 20%)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) r 10 20%)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) 0% 10 10)' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) 0% 10 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple calc(r) calc(g) calc(b))' assert_true: 'rgb(from rebeccapurple calc(r) calc(g) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r calc(g * 2) 10)' assert_true: 'rgb(from rebeccapurple r calc(g * 2) 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple b calc(r * .5) 10)' assert_true: 'rgb(from rebeccapurple b calc(r * .5) 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r calc(g * .5 + g * .5) 10)' assert_true: 'rgb(from rebeccapurple r calc(g * .5 + g * .5) 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)' assert_true: 'rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple none none none)' assert_true: 'rgb(from rebeccapurple none none none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple none none none / none)' assert_true: 'rgb(from rebeccapurple none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g none)' assert_true: 'rgb(from rebeccapurple r g none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g none / alpha)' assert_true: 'rgb(from rebeccapurple r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rebeccapurple r g b / none)' assert_true: 'rgb(from rebeccapurple r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20% 40% 60% / 80%) r g none / alpha)' assert_true: 'rgb(from rgb(20% 40% 60% / 80%) r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20% 40% 60% / 80%) r g b / none)' assert_true: 'rgb(from rgb(20% 40% 60% / 80%) r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(none none none) r g b)' assert_true: 'rgb(from rgb(none none none) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(none none none / none) r g b / alpha)' assert_true: 'rgb(from rgb(none none none / none) r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20% none 60%) r g b)' assert_true: 'rgb(from rgb(20% none 60%) r g b)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from rgb(20% 40% 60% / none) r g b / alpha)' assert_true: 'rgb(from rgb(20% 40% 60% / none) r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s l)' assert_true: 'hsl(from rebeccapurple h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s l / alpha)' assert_true: 'hsl(from rebeccapurple h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(120deg 20% 50% / .5) h s l / alpha)' assert_true: 'hsl(from hsl(120deg 20% 50% / .5) h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(from rebeccapurple h s l) h s l)' assert_true: 'hsl(from hsl(from rebeccapurple h s l) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from color(display-p3 0 1 0) h s l / alpha)' assert_true: 'hsl(from color(display-p3 0 1 0) h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from lab(100% 104.3 -50.9) h s l)' assert_true: 'hsl(from lab(100% 104.3 -50.9) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from lab(0% 104.3 -50.9) h s l)' assert_true: 'hsl(from lab(0% 104.3 -50.9) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from lch(100% 116 334) h s l)' assert_true: 'hsl(from lch(100% 116 334) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from lch(0% 116 334) h s l)' assert_true: 'hsl(from lch(0% 116 334) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from oklab(100% 0.365 -0.16) h s l)' assert_true: 'hsl(from oklab(100% 0.365 -0.16) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from oklab(0% 0.365 -0.16) h s l)' assert_true: 'hsl(from oklab(0% 0.365 -0.16) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from oklch(100% 0.399 336.3) h s l)' assert_true: 'hsl(from oklch(100% 0.399 336.3) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from oklch(0% 0.399 336.3) h s l)' assert_true: 'hsl(from oklch(0% 0.399 336.3) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 0 0% 0%)' assert_true: 'hsl(from rebeccapurple 0 0% 0%)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 0deg 0% 0%)' assert_true: 'hsl(from rebeccapurple 0deg 0% 0%)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 0 0% 0% / 0)' assert_true: 'hsl(from rebeccapurple 0 0% 0% / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 0deg 0% 0% / 0)' assert_true: 'hsl(from rebeccapurple 0deg 0% 0% / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 0 s l / alpha)' assert_true: 'hsl(from rebeccapurple 0 s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 0deg s l / alpha)' assert_true: 'hsl(from rebeccapurple 0deg s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h 0% l / alpha)' assert_true: 'hsl(from rebeccapurple h 0% l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s 0% / alpha)' assert_true: 'hsl(from rebeccapurple h s 0% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s l / 0)' assert_true: 'hsl(from rebeccapurple h s l / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 0 s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 0 s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 0deg s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 0deg s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h 0% l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h 0% l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s 0% / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s 0% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / 0)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 25 s l / alpha)' assert_true: 'hsl(from rebeccapurple 25 s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple 25deg s l / alpha)' assert_true: 'hsl(from rebeccapurple 25deg s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h 20% l / alpha)' assert_true: 'hsl(from rebeccapurple h 20% l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s 20% / alpha)' assert_true: 'hsl(from rebeccapurple h s 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s l / .25)' assert_true: 'hsl(from rebeccapurple h s l / .25)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 25 s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 25 s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) 25deg s l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) 25deg s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h 20% l / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h 20% l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s 20% / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / .2)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h s l / .2)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h l s)' assert_true: 'hsl(from rebeccapurple h l s)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h alpha l / s)' assert_true: 'hsl(from rebeccapurple h alpha l / s)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h l l / l)' assert_true: 'hsl(from rebeccapurple h l l / l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h alpha alpha / alpha)' assert_true: 'hsl(from rebeccapurple h alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h l s)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h l s)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha l / s)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha l / s)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h l l / l)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h l l / l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple calc(h) calc(s) calc(l))' assert_true: 'hsl(from rebeccapurple calc(h) calc(s) calc(l))' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))' assert_true: 'hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple none none none)' assert_true: 'hsl(from rebeccapurple none none none)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple none none none / none)' assert_true: 'hsl(from rebeccapurple none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s none)' assert_true: 'hsl(from rebeccapurple h s none)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s none / alpha)' assert_true: 'hsl(from rebeccapurple h s none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple h s l / none)' assert_true: 'hsl(from rebeccapurple h s l / none)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from rebeccapurple none s l / alpha)' assert_true: 'hsl(from rebeccapurple none s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(120deg 20% 50% / .5) h s none / alpha)' assert_true: 'hsl(from hsl(120deg 20% 50% / .5) h s none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(120deg 20% 50% / .5) h s l / none)' assert_true: 'hsl(from hsl(120deg 20% 50% / .5) h s l / none)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(120deg 20% 50% / .5) none s l / alpha)' assert_true: 'hsl(from hsl(120deg 20% 50% / .5) none s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(none none none) h s l)' assert_true: 'hsl(from hsl(none none none) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(none none none / none) h s l / alpha)' assert_true: 'hsl(from hsl(none none none / none) h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(120deg none 50% / .5) h s l)' assert_true: 'hsl(from hsl(120deg none 50% / .5) h s l)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(120deg 20% 50% / none) h s l / alpha)' assert_true: 'hsl(from hsl(120deg 20% 50% / none) h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from hsl(none 20% 50% / .5) h s l / alpha)' assert_true: 'hsl(from hsl(none 20% 50% / .5) h s l / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w b)' assert_true: 'hwb(from rebeccapurple h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w b / alpha)' assert_true: 'hwb(from rebeccapurple h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hsl(120deg 20% 50% / .5) h w b / alpha)' assert_true: 'hwb(from hsl(120deg 20% 50% / .5) h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(from rebeccapurple h w b) h w b)' assert_true: 'hwb(from hwb(from rebeccapurple h w b) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from color(display-p3 0 1 0) h w b / alpha)' assert_true: 'hwb(from color(display-p3 0 1 0) h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from lab(100% 104.3 -50.9) h w b)' assert_true: 'hwb(from lab(100% 104.3 -50.9) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from lab(0% 104.3 -50.9) h w b)' assert_true: 'hwb(from lab(0% 104.3 -50.9) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from lch(100% 116 334) h w b)' assert_true: 'hwb(from lch(100% 116 334) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from lch(0% 116 334) h w b)' assert_true: 'hwb(from lch(0% 116 334) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from oklab(100% 0.365 -0.16) h w b)' assert_true: 'hwb(from oklab(100% 0.365 -0.16) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from oklab(0% 0.365 -0.16) h w b)' assert_true: 'hwb(from oklab(0% 0.365 -0.16) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from oklch(100% 0.399 336.3) h w b)' assert_true: 'hwb(from oklch(100% 0.399 336.3) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from oklch(0% 0.399 336.3) h w b)' assert_true: 'hwb(from oklch(0% 0.399 336.3) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 0 0% 0%)' assert_true: 'hwb(from rebeccapurple 0 0% 0%)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 0deg 0% 0%)' assert_true: 'hwb(from rebeccapurple 0deg 0% 0%)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 0 0% 0% / 0)' assert_true: 'hwb(from rebeccapurple 0 0% 0% / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 0deg 0% 0% / 0)' assert_true: 'hwb(from rebeccapurple 0deg 0% 0% / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 0 w b / alpha)' assert_true: 'hwb(from rebeccapurple 0 w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 0deg w b / alpha)' assert_true: 'hwb(from rebeccapurple 0deg w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h 0% b / alpha)' assert_true: 'hwb(from rebeccapurple h 0% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w 0% / alpha)' assert_true: 'hwb(from rebeccapurple h w 0% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w b / 0)' assert_true: 'hwb(from rebeccapurple h w b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 0 w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 0 w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 0deg w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 0deg w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h 0% b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h 0% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w 0% / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w 0% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / 0)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 25 w b / alpha)' assert_true: 'hwb(from rebeccapurple 25 w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple 25deg w b / alpha)' assert_true: 'hwb(from rebeccapurple 25deg w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h 20% b / alpha)' assert_true: 'hwb(from rebeccapurple h 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w 20% / alpha)' assert_true: 'hwb(from rebeccapurple h w 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w b / .2)' assert_true: 'hwb(from rebeccapurple h w b / .2)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 25 w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 25 w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) 25deg w b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) 25deg w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h 20% b / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w 20% / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / .2)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w b / .2)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h b w)' assert_true: 'hwb(from rebeccapurple h b w)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h alpha w / b)' assert_true: 'hwb(from rebeccapurple h alpha w / b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w w / w)' assert_true: 'hwb(from rebeccapurple h w w / w)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h alpha alpha / alpha)' assert_true: 'hwb(from rebeccapurple h alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h b w)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h b w)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha w / b)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha w / b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h w w / w)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h w w / w)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple calc(h) calc(w) calc(b))' assert_true: 'hwb(from rebeccapurple calc(h) calc(w) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))' assert_true: 'hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple none none none)' assert_true: 'hwb(from rebeccapurple none none none)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple none none none / none)' assert_true: 'hwb(from rebeccapurple none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w none)' assert_true: 'hwb(from rebeccapurple h w none)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w none / alpha)' assert_true: 'hwb(from rebeccapurple h w none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple h w b / none)' assert_true: 'hwb(from rebeccapurple h w b / none)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from rebeccapurple none w b / alpha)' assert_true: 'hwb(from rebeccapurple none w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(120deg 20% 50% / .5) h w none / alpha)' assert_true: 'hwb(from hwb(120deg 20% 50% / .5) h w none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(120deg 20% 50% / .5) h w b / none)' assert_true: 'hwb(from hwb(120deg 20% 50% / .5) h w b / none)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(120deg 20% 50% / .5) none w b / alpha)' assert_true: 'hwb(from hwb(120deg 20% 50% / .5) none w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(none none none) h w b)' assert_true: 'hwb(from hwb(none none none) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(none none none / none) h w b / alpha)' assert_true: 'hwb(from hwb(none none none / none) h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(120deg none 50% / .5) h w b)' assert_true: 'hwb(from hwb(120deg none 50% / .5) h w b)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(120deg 20% 50% / none) h w b / alpha)' assert_true: 'hwb(from hwb(120deg 20% 50% / none) h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'hwb(from hwb(none 20% 50% / .5) h w b / alpha)' assert_true: 'hwb(from hwb(none 20% 50% / .5) h w b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) l a b)' assert_true: 'lab(from lab(25% 20 50) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) l a b / alpha)' assert_true: 'lab(from lab(25% 20 50) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(200% 300 400 / 500%) l a b / alpha)' assert_true: 'lab(from lab(200% 300 400 / 500%) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(-200% -300 -400 / -500%) l a b / alpha)' assert_true: 'lab(from lab(-200% -300 -400 / -500%) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(from lab(25% 20 50) l a b) l a b)' assert_true: 'lab(from lab(from lab(25% 20 50) l a b) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from color(display-p3 0 0 0) l a b / alpha)' assert_true: 'lab(from color(display-p3 0 0 0) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) 0% 0 0)' assert_true: 'lab(from lab(25% 20 50) 0% 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) 0% 0 0 / 0)' assert_true: 'lab(from lab(25% 20 50) 0% 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) 0% a b / alpha)' assert_true: 'lab(from lab(25% 20 50) 0% a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) l 0 b / alpha)' assert_true: 'lab(from lab(25% 20 50) l 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) l a 0 / alpha)' assert_true: 'lab(from lab(25% 20 50) l a 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) l a b / 0)' assert_true: 'lab(from lab(25% 20 50) l a b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) 0% a b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) 0% a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l 0 b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a 0 / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a b / 0)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) 35% a b / alpha)' assert_true: 'lab(from lab(25% 20 50) 35% a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) l 35 b / alpha)' assert_true: 'lab(from lab(25% 20 50) l 35 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) l a 35 / alpha)' assert_true: 'lab(from lab(25% 20 50) l a 35 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) l a b / .35)' assert_true: 'lab(from lab(25% 20 50) l a b / .35)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) 35% a b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) 35% a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l 35 b / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l 35 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a 35 / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a 35 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a b / .35)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a b / .35)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(70% 45 30 / 40%) 200% 300 400 / 500)' assert_true: 'lab(from lab(70% 45 30 / 40%) 200% 300 400 / 500)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(70% 45 30 / 40%) -200% -300 -400 / -500)' assert_true: 'lab(from lab(70% 45 30 / 40%) -200% -300 -400 / -500)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) l b a)' assert_true: 'lab(from lab(25% 20 50) l b a)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) l a a / a)' assert_true: 'lab(from lab(25% 20 50) l a a / a)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l b a)' assert_true: 'lab(from lab(25% 20 50 / 40%) l b a)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a a / a)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a a / a)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) calc(l) calc(a) calc(b))' assert_true: 'lab(from lab(25% 20 50) calc(l) calc(a) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' assert_true: 'lab(from lab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) none none none)' assert_true: 'lab(from lab(25% 20 50) none none none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) none none none / none)' assert_true: 'lab(from lab(25% 20 50) none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) l a none)' assert_true: 'lab(from lab(25% 20 50) l a none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) l a none / alpha)' assert_true: 'lab(from lab(25% 20 50) l a none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50) l a b / none)' assert_true: 'lab(from lab(25% 20 50) l a b / none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a none / alpha)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / 40%) l a b / none)' assert_true: 'lab(from lab(25% 20 50 / 40%) l a b / none)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(none none none) l a b)' assert_true: 'lab(from lab(none none none) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(none none none / none) l a b / alpha)' assert_true: 'lab(from lab(none none none / none) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% none 50) l a b)' assert_true: 'lab(from lab(25% none 50) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'lab(from lab(25% 20 50 / none) l a b / alpha)' assert_true: 'lab(from lab(25% 20 50 / none) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) l a b)' assert_true: 'oklab(from oklab(25% 20 50) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) l a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(200% 300 400 / 500%) l a b / alpha)' assert_true: 'oklab(from oklab(200% 300 400 / 500%) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(-200% -300 -400 / -500%) l a b / alpha)' assert_true: 'oklab(from oklab(-200% -300 -400 / -500%) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(from oklab(25% 20 50) l a b) l a b)' assert_true: 'oklab(from oklab(from oklab(25% 20 50) l a b) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from color(display-p3 0 0 0) l a b / alpha)' assert_true: 'oklab(from color(display-p3 0 0 0) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) 0% 0 0)' assert_true: 'oklab(from oklab(25% 20 50) 0% 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) 0% 0 0 / 0)' assert_true: 'oklab(from oklab(25% 20 50) 0% 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) 0% a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) 0% a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) l 0 b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) l a 0 / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l a 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) l a b / 0)' assert_true: 'oklab(from oklab(25% 20 50) l a b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) 0% a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) 0% a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l 0 b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a 0 / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a b / 0)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) 35% a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) 35% a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) l 35 b / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l 35 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) l a 35 / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l a 35 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) l a b / .35)' assert_true: 'oklab(from oklab(25% 20 50) l a b / .35)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) 35% a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) 35% a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l 35 b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l 35 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a 35 / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a 35 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a b / .35)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a b / .35)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(70% 45 30 / 40%) 200% 300 400 / 500)' assert_true: 'oklab(from oklab(70% 45 30 / 40%) 200% 300 400 / 500)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(70% 45 30 / 40%) -200% -300 -400 / -500)' assert_true: 'oklab(from oklab(70% 45 30 / 40%) -200% -300 -400 / -500)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) l b a)' assert_true: 'oklab(from oklab(25% 20 50) l b a)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) l a a / a)' assert_true: 'oklab(from oklab(25% 20 50) l a a / a)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l b a)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l b a)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a a / a)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a a / a)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) calc(l) calc(a) calc(b))' assert_true: 'oklab(from oklab(25% 20 50) calc(l) calc(a) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' assert_true: 'oklab(from oklab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) none none none)' assert_true: 'oklab(from oklab(25% 20 50) none none none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) none none none / none)' assert_true: 'oklab(from oklab(25% 20 50) none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) l a none)' assert_true: 'oklab(from oklab(25% 20 50) l a none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) l a none / alpha)' assert_true: 'oklab(from oklab(25% 20 50) l a none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50) l a b / none)' assert_true: 'oklab(from oklab(25% 20 50) l a b / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a none / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / 40%) l a b / none)' assert_true: 'oklab(from oklab(25% 20 50 / 40%) l a b / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(none none none) l a b)' assert_true: 'oklab(from oklab(none none none) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(none none none / none) l a b / alpha)' assert_true: 'oklab(from oklab(none none none / none) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% none 50) l a b)' assert_true: 'oklab(from oklab(25% none 50) l a b)' is a supported value for color. expected true got false -FAIL Property color value 'oklab(from oklab(25% 20 50 / none) l a b / alpha)' assert_true: 'oklab(from oklab(25% 20 50 / none) l a b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l c h)' assert_true: 'lch(from lch(70% 45 30) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l c h / alpha)' assert_true: 'lch(from lch(70% 45 30) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(200% 300 400 / 500%) l c h / alpha)' assert_true: 'lch(from lch(200% 300 400 / 500%) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(-200% -300 -400 / -500%) l c h / alpha)' assert_true: 'lch(from lch(-200% -300 -400 / -500%) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(from lch(70% 45 30) l c h) l c h)' assert_true: 'lch(from lch(from lch(70% 45 30) l c h) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from color(display-p3 0 0 0) l c h / alpha)' assert_true: 'lch(from color(display-p3 0 0 0) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lab(70% 45 30) l c h / alpha)' assert_true: 'lch(from lab(70% 45 30) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) 0% 0 0)' assert_true: 'lch(from lch(70% 45 30) 0% 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) 0% 0 0deg)' assert_true: 'lch(from lch(70% 45 30) 0% 0 0deg)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) 0% 0 0 / 0)' assert_true: 'lch(from lch(70% 45 30) 0% 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) 0% 0 0deg / 0)' assert_true: 'lch(from lch(70% 45 30) 0% 0 0deg / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) 0% c h / alpha)' assert_true: 'lch(from lch(70% 45 30) 0% c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l 0 h / alpha)' assert_true: 'lch(from lch(70% 45 30) l 0 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l c 0 / alpha)' assert_true: 'lch(from lch(70% 45 30) l c 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l c 0deg / alpha)' assert_true: 'lch(from lch(70% 45 30) l c 0deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l c h / 0)' assert_true: 'lch(from lch(70% 45 30) l c h / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) 0% c h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) 0% c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l 0 h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l 0 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c 0 / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c 0deg / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c 0deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c h / 0)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c h / 0)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) 25% c h / alpha)' assert_true: 'lch(from lch(70% 45 30) 25% c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l 25 h / alpha)' assert_true: 'lch(from lch(70% 45 30) l 25 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l c 25 / alpha)' assert_true: 'lch(from lch(70% 45 30) l c 25 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l c 25deg / alpha)' assert_true: 'lch(from lch(70% 45 30) l c 25deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l c h / .25)' assert_true: 'lch(from lch(70% 45 30) l c h / .25)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) 25% c h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) 25% c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l 25 h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l 25 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c 25 / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c 25 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c 25deg / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c 25deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c h / .25)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c h / .25)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) 200% 300 400 / 500)' assert_true: 'lch(from lch(70% 45 30 / 40%) 200% 300 400 / 500)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) -200% -300 -400 / -500)' assert_true: 'lch(from lch(70% 45 30 / 40%) -200% -300 -400 / -500)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) 50% 120 400deg / 500)' assert_true: 'lch(from lch(70% 45 30 / 40%) 50% 120 400deg / 500)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) 50% 120 -400deg / -500)' assert_true: 'lch(from lch(70% 45 30 / 40%) 50% 120 -400deg / -500)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) alpha c h / l)' assert_true: 'lch(from lch(70% 45 30) alpha c h / l)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l c c / alpha)' assert_true: 'lch(from lch(70% 45 30) l c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) alpha c h / alpha)' assert_true: 'lch(from lch(70% 45 30) alpha c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) alpha c c / alpha)' assert_true: 'lch(from lch(70% 45 30) alpha c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) alpha c h / l)' assert_true: 'lch(from lch(70% 45 30 / 40%) alpha c h / l)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c c / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) alpha c h / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) alpha c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) alpha c c / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) alpha c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) calc(l) calc(c) calc(h))' assert_true: 'lch(from lch(70% 45 30) calc(l) calc(c) calc(h))' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' assert_true: 'lch(from lch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) none none none)' assert_true: 'lch(from lch(70% 45 30) none none none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) none none none / none)' assert_true: 'lch(from lch(70% 45 30) none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l c none)' assert_true: 'lch(from lch(70% 45 30) l c none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l c none / alpha)' assert_true: 'lch(from lch(70% 45 30) l c none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30) l c h / none)' assert_true: 'lch(from lch(70% 45 30) l c h / none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c none / alpha)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / 40%) l c h / none)' assert_true: 'lch(from lch(70% 45 30 / 40%) l c h / none)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(none none none) l c h)' assert_true: 'lch(from lch(none none none) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(none none none / none) l c h / alpha)' assert_true: 'lch(from lch(none none none / none) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% none 30) l c h)' assert_true: 'lch(from lch(70% none 30) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'lch(from lch(70% 45 30 / none) l c h / alpha)' assert_true: 'lch(from lch(70% 45 30 / none) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l c h)' assert_true: 'oklch(from oklch(70% 45 30) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(200% 300 400 / 500%) l c h / alpha)' assert_true: 'oklch(from oklch(200% 300 400 / 500%) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(-200% -300 -400 / -500%) l c h / alpha)' assert_true: 'oklch(from oklch(-200% -300 -400 / -500%) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(from oklch(70% 45 30) l c h) l c h)' assert_true: 'oklch(from oklch(from oklch(70% 45 30) l c h) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from color(display-p3 0 0 0) l c h / alpha)' assert_true: 'oklch(from color(display-p3 0 0 0) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklab(70% 45 30) l c h / alpha)' assert_true: 'oklch(from oklab(70% 45 30) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) 0% 0 0)' assert_true: 'oklch(from oklch(70% 45 30) 0% 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) 0% 0 0deg)' assert_true: 'oklch(from oklch(70% 45 30) 0% 0 0deg)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) 0% 0 0 / 0)' assert_true: 'oklch(from oklch(70% 45 30) 0% 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) 0% 0 0deg / 0)' assert_true: 'oklch(from oklch(70% 45 30) 0% 0 0deg / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) 0% c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) 0% c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l 0 h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l 0 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l c 0 / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l c 0deg / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c 0deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l c h / 0)' assert_true: 'oklch(from oklch(70% 45 30) l c h / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) 0% c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) 0% c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l 0 h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l 0 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c 0 / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c 0deg / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c 0deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c h / 0)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c h / 0)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) 25% c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) 25% c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l 25 h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l 25 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l c 25 / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c 25 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l c 25deg / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c 25deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l c h / .25)' assert_true: 'oklch(from oklch(70% 45 30) l c h / .25)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) 25% c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) 25% c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l 25 h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l 25 h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c 25 / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c 25 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c 25deg / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c 25deg / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c h / .25)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c h / .25)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) 200% 300 400 / 500)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) 200% 300 400 / 500)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) -200% -300 -400 / -500)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) -200% -300 -400 / -500)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) 50% 120 400deg / 500)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) 50% 120 400deg / 500)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) 50% 120 -400deg / -500)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) 50% 120 -400deg / -500)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) alpha c h / l)' assert_true: 'oklch(from oklch(70% 45 30) alpha c h / l)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l c c / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) alpha c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30) alpha c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) alpha c c / alpha)' assert_true: 'oklch(from oklch(70% 45 30) alpha c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) alpha c h / l)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) alpha c h / l)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c c / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) alpha c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) alpha c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) alpha c c / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) alpha c c / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) calc(l) calc(c) calc(h))' assert_true: 'oklch(from oklch(70% 45 30) calc(l) calc(c) calc(h))' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' assert_true: 'oklch(from oklch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) none none none)' assert_true: 'oklch(from oklch(70% 45 30) none none none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) none none none / none)' assert_true: 'oklch(from oklch(70% 45 30) none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l c none)' assert_true: 'oklch(from oklch(70% 45 30) l c none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l c none / alpha)' assert_true: 'oklch(from oklch(70% 45 30) l c none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30) l c h / none)' assert_true: 'oklch(from oklch(70% 45 30) l c h / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c none / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / 40%) l c h / none)' assert_true: 'oklch(from oklch(70% 45 30 / 40%) l c h / none)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(none none none) l c h)' assert_true: 'oklch(from oklch(none none none) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(none none none / none) l c h / alpha)' assert_true: 'oklch(from oklch(none none none / none) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% none 30) l c h)' assert_true: 'oklch(from oklch(70% none 30) l c h)' is a supported value for color. expected true got false -FAIL Property color value 'oklch(from oklch(70% 45 30 / none) l c h / alpha)' assert_true: 'oklch(from oklch(70% 45 30 / none) l c h / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(srgb 0.7 0.5 0.3) srgb r g b) srgb r g b)' assert_true: 'color(from color(from color(srgb 0.7 0.5 0.3) srgb r g b) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0 / 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r 0 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 0.2 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 20% g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r 0.2 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r 20% b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0.2 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g 20% / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0.2)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 20%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0.2 g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 20% g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0.2 b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 20% b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0.2 / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 20% / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0.2)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 20%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 2 3 4)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 2 3 4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 2 3 4 / 5)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 2 3 4 / 5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb -2 -3 -4)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb -2 -3 -4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb -2 -3 -4 / -5)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb -2 -3 -4 / -5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 200% 300% 400%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 200% 300% 400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb 200% 300% 400% / 500%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb 200% 300% 400% / 500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb -200% -300% -400%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb -200% -300% -400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb -200% -300% -400% / -500%)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb -200% -300% -400% / -500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb g b r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb b alpha r / g)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r r r / r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb g b r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb b alpha r / g)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r r r / r)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 1.7 1.5 1.3) srgb r g b)' assert_true: 'color(from color(srgb 1.7 1.5 1.3) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 1.7 1.5 1.3) srgb r g b / alpha)' assert_true: 'color(from color(srgb 1.7 1.5 1.3) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 1.7 1.5 1.3 / 140%) srgb r g b)' assert_true: 'color(from color(srgb 1.7 1.5 1.3 / 140%) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 1.7 1.5 1.3 / 140%) srgb r g b / alpha)' assert_true: 'color(from color(srgb 1.7 1.5 1.3 / 140%) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb -0.7 -0.5 -0.3) srgb r g b)' assert_true: 'color(from color(srgb -0.7 -0.5 -0.3) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb -0.7 -0.5 -0.3) srgb r g b / alpha)' assert_true: 'color(from color(srgb -0.7 -0.5 -0.3) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb -0.7 -0.5 -0.3 / -40%) srgb r g b)' assert_true: 'color(from color(srgb -0.7 -0.5 -0.3 / -40%) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb -0.7 -0.5 -0.3 / -40%) srgb r g b / alpha)' assert_true: 'color(from color(srgb -0.7 -0.5 -0.3 / -40%) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb calc(r) calc(g) calc(b))' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb calc(r) calc(g) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb none none none)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb none none none / none)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g none)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g none / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / none)' assert_true: 'color(from color(srgb 0.7 0.5 0.3) srgb r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g none / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / none)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb none none none) srgb r g b)' assert_true: 'color(from color(srgb none none none) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb none none none / none) srgb r g b / alpha)' assert_true: 'color(from color(srgb none none none / none) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 none 0.3) srgb r g b)' assert_true: 'color(from color(srgb 0.7 none 0.3) srgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb 0.7 0.5 0.3 / none) srgb r g b / alpha)' assert_true: 'color(from color(srgb 0.7 0.5 0.3 / none) srgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b) srgb-linear r g b)' assert_true: 'color(from color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0 / 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0.2 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 20% g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0.2 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 20% b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0.2 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 20% / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0.2)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 20%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0.2 g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 20% g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0.2 b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 20% b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0.2 / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 20% / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0.2)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 20%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 2 3 4)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 2 3 4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 2 3 4 / 5)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 2 3 4 / 5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -2 -3 -4)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -2 -3 -4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -2 -3 -4 / -5)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -2 -3 -4 / -5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 200% 300% 400%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 200% 300% 400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 200% 300% 400% / 500%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 200% 300% 400% / 500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -200% -300% -400%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -200% -300% -400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -200% -300% -400% / -500%)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -200% -300% -400% / -500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear g b r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear b alpha r / g)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r r r / r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear g b r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear b alpha r / g)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r r r / r)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear alpha alpha alpha / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 1.7 1.5 1.3) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 1.7 1.5 1.3) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 1.7 1.5 1.3) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 1.7 1.5 1.3) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 1.7 1.5 1.3 / 140%) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 1.7 1.5 1.3 / 140%) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 1.7 1.5 1.3 / 140%) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 1.7 1.5 1.3 / 140%) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear -0.7 -0.5 -0.3) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear -0.7 -0.5 -0.3) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear -0.7 -0.5 -0.3) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear -0.7 -0.5 -0.3) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear -0.7 -0.5 -0.3 / -40%) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear -0.7 -0.5 -0.3 / -40%) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear -0.7 -0.5 -0.3 / -40%) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear -0.7 -0.5 -0.3 / -40%) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear calc(r) calc(g) calc(b))' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear calc(r) calc(g) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear none none none)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear none none none / none)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g none)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g none / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / none)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g none / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / none)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear none none none) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear none none none) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear none none none / none) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear none none none / none) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 none 0.3) srgb-linear r g b)' assert_true: 'color(from color(srgb-linear 0.7 none 0.3) srgb-linear r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(srgb-linear 0.7 0.5 0.3 / none) srgb-linear r g b / alpha)' assert_true: 'color(from color(srgb-linear 0.7 0.5 0.3 / none) srgb-linear r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b) a98-rgb r g b)' assert_true: 'color(from color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0 / 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0.2 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 20% g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0.2 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 20% b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0.2 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 20% / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0.2)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 20%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0.2 g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 20% g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0.2 b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 20% b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0.2 / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 20% / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0.2)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 20%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 2 3 4)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 2 3 4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 2 3 4 / 5)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 2 3 4 / 5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -2 -3 -4)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -2 -3 -4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -2 -3 -4 / -5)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -2 -3 -4 / -5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 200% 300% 400%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 200% 300% 400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 200% 300% 400% / 500%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 200% 300% 400% / 500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -200% -300% -400%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -200% -300% -400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -200% -300% -400% / -500%)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -200% -300% -400% / -500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb g b r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb b alpha r / g)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r r r / r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb g b r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb b alpha r / g)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r r r / r)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 1.7 1.5 1.3) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 1.7 1.5 1.3) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 1.7 1.5 1.3) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 1.7 1.5 1.3) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 1.7 1.5 1.3 / 140%) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 1.7 1.5 1.3 / 140%) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 1.7 1.5 1.3 / 140%) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 1.7 1.5 1.3 / 140%) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb -0.7 -0.5 -0.3) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb -0.7 -0.5 -0.3) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb -0.7 -0.5 -0.3) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb -0.7 -0.5 -0.3) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb -0.7 -0.5 -0.3 / -40%) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb -0.7 -0.5 -0.3 / -40%) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb -0.7 -0.5 -0.3 / -40%) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb -0.7 -0.5 -0.3 / -40%) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb calc(r) calc(g) calc(b))' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb calc(r) calc(g) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb none none none)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb none none none / none)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g none)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g none / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / none)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g none / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / none)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb none none none) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb none none none) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb none none none / none) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb none none none / none) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 none 0.3) a98-rgb r g b)' assert_true: 'color(from color(a98-rgb 0.7 none 0.3) a98-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(a98-rgb 0.7 0.5 0.3 / none) a98-rgb r g b / alpha)' assert_true: 'color(from color(a98-rgb 0.7 0.5 0.3 / none) a98-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b) rec2020 r g b)' assert_true: 'color(from color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0 / 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0.2 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 20% g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0.2 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 20% b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0.2 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 20% / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0.2)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 20%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0.2 g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 20% g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0.2 b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 20% b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0.2 / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 20% / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0.2)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 20%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 2 3 4)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 2 3 4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 2 3 4 / 5)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 2 3 4 / 5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -2 -3 -4)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -2 -3 -4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -2 -3 -4 / -5)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -2 -3 -4 / -5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 200% 300% 400%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 200% 300% 400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 200% 300% 400% / 500%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 200% 300% 400% / 500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -200% -300% -400%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -200% -300% -400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -200% -300% -400% / -500%)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 -200% -300% -400% / -500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 g b r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 b alpha r / g)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r r r / r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 alpha alpha alpha / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 g b r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 b alpha r / g)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r r r / r)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 alpha alpha alpha / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 1.7 1.5 1.3) rec2020 r g b)' assert_true: 'color(from color(rec2020 1.7 1.5 1.3) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 1.7 1.5 1.3) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 1.7 1.5 1.3) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 1.7 1.5 1.3 / 140%) rec2020 r g b)' assert_true: 'color(from color(rec2020 1.7 1.5 1.3 / 140%) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 1.7 1.5 1.3 / 140%) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 1.7 1.5 1.3 / 140%) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 -0.7 -0.5 -0.3) rec2020 r g b)' assert_true: 'color(from color(rec2020 -0.7 -0.5 -0.3) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 -0.7 -0.5 -0.3) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 -0.7 -0.5 -0.3) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 -0.7 -0.5 -0.3 / -40%) rec2020 r g b)' assert_true: 'color(from color(rec2020 -0.7 -0.5 -0.3 / -40%) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 -0.7 -0.5 -0.3 / -40%) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 -0.7 -0.5 -0.3 / -40%) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 calc(r) calc(g) calc(b))' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 calc(r) calc(g) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 none none none)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 none none none / none)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g none)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g none / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / none)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g none / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / none)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 none none none) rec2020 r g b)' assert_true: 'color(from color(rec2020 none none none) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 none none none / none) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 none none none / none) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 none 0.3) rec2020 r g b)' assert_true: 'color(from color(rec2020 0.7 none 0.3) rec2020 r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(rec2020 0.7 0.5 0.3 / none) rec2020 r g b / alpha)' assert_true: 'color(from color(rec2020 0.7 0.5 0.3 / none) rec2020 r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b) prophoto-rgb r g b)' assert_true: 'color(from color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0 / 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0.2 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 20% g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0.2 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 20% b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0.2 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 20% / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0.2)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 20%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0.2 g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0.2 g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 20% g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 20% g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0.2 b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0.2 b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 20% b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 20% b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0.2 / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 20% / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 20% / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0.2)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 20%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 2 3 4)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 2 3 4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 2 3 4 / 5)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 2 3 4 / 5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -2 -3 -4)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -2 -3 -4)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -2 -3 -4 / -5)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -2 -3 -4 / -5)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 200% 300% 400%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 200% 300% 400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 200% 300% 400% / 500%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 200% 300% 400% / 500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -200% -300% -400%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -200% -300% -400%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -200% -300% -400% / -500%)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -200% -300% -400% / -500%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb g b r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb b alpha r / g)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r r r / r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb g b r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb g b r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb b alpha r / g)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb b alpha r / g)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r r r / r)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r r r / r)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb alpha alpha alpha / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb alpha alpha alpha / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 1.7 1.5 1.3) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 1.7 1.5 1.3) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 1.7 1.5 1.3) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 1.7 1.5 1.3) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 1.7 1.5 1.3 / 140%) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 1.7 1.5 1.3 / 140%) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 1.7 1.5 1.3 / 140%) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 1.7 1.5 1.3 / 140%) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb -0.7 -0.5 -0.3) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb -0.7 -0.5 -0.3) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb -0.7 -0.5 -0.3) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb -0.7 -0.5 -0.3) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb -0.7 -0.5 -0.3 / -40%) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb -0.7 -0.5 -0.3 / -40%) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb -0.7 -0.5 -0.3 / -40%) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb -0.7 -0.5 -0.3 / -40%) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb calc(r) calc(g) calc(b))' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb calc(r) calc(g) calc(b))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb calc(r) calc(g) calc(b) / calc(alpha))' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb calc(r) calc(g) calc(b) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb none none none)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb none none none / none)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g none)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g none / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / none)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g none / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / none)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb none none none) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb none none none) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb none none none / none) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb none none none / none) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 none 0.3) prophoto-rgb r g b)' assert_true: 'color(from color(prophoto-rgb 0.7 none 0.3) prophoto-rgb r g b)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(prophoto-rgb 0.7 0.5 0.3 / none) prophoto-rgb r g b / alpha)' assert_true: 'color(from color(prophoto-rgb 0.7 0.5 0.3 / none) prophoto-rgb r g b / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(xyz 7 -20.5 100) xyz x y z) xyz x y z)' assert_true: 'color(from color(from color(xyz 7 -20.5 100) xyz x y z) xyz x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0 0 0)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0 0 0 / 0)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x 0 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x 0 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y 0 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / 0)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz 0.2 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz 0.2 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x 0.2 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x 0.2 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y 0.2 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / 0.2)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / 20%)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0.2 y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz 0.2 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0.2 z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x 0.2 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0.2 / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0.2)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz y z x)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz y z x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x x x / x)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x x x / x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz y z x)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz y z x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x x x / x)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x x x / x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz calc(x) calc(y) calc(z))' assert_true: 'color(from color(xyz 7 -20.5 100) xyz calc(x) calc(y) calc(z))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz calc(x) calc(y) calc(z) / calc(alpha))' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz calc(x) calc(y) calc(z) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz none none none)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz none none none / none)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y none)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y none / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100) xyz x y z / none)' assert_true: 'color(from color(xyz 7 -20.5 100) xyz x y z / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y none / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / none)' assert_true: 'color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz none none none) xyz x y z)' assert_true: 'color(from color(xyz none none none) xyz x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz none none none / none) xyz x y z / alpha)' assert_true: 'color(from color(xyz none none none / none) xyz x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 none 100) xyz x y z)' assert_true: 'color(from color(xyz 7 none 100) xyz x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz 7 -20.5 100 / none) xyz x y z / alpha)' assert_true: 'color(from color(xyz 7 -20.5 100 / none) xyz x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z) xyz-d50 x y z)' assert_true: 'color(from color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z) xyz-d50 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0 / 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 0.2 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0.2 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0.2)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 20%)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0.2 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0.2 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0.2)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 y z x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 y z x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x x x / x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x x x / x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 y z x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 y z x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x x x / x)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x x x / x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 calc(x) calc(y) calc(z))' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 calc(x) calc(y) calc(z))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 calc(x) calc(y) calc(z) / calc(alpha))' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 calc(x) calc(y) calc(z) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 none none none)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 none none none / none)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y none)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y none / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / none)' assert_true: 'color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y none / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / none)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 none none none) xyz-d50 x y z)' assert_true: 'color(from color(xyz-d50 none none none) xyz-d50 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 none none none / none) xyz-d50 x y z / alpha)' assert_true: 'color(from color(xyz-d50 none none none / none) xyz-d50 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 none 100) xyz-d50 x y z)' assert_true: 'color(from color(xyz-d50 7 none 100) xyz-d50 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d50 7 -20.5 100 / none) xyz-d50 x y z / alpha)' assert_true: 'color(from color(xyz-d50 7 -20.5 100 / none) xyz-d50 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z) xyz-d65 x y z)' assert_true: 'color(from color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z) xyz-d65 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0 / 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0 / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 0.2 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0.2 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0.2)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 20%)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 20%)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0.2 y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0.2 y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0.2 z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0.2 z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0.2 / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0.2 / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0.2)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0.2)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 y z x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 y z x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x x x / x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x x x / x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 y z x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 y z x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x x x / x)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x x x / x)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 calc(x) calc(y) calc(z))' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 calc(x) calc(y) calc(z))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 calc(x) calc(y) calc(z) / calc(alpha))' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 calc(x) calc(y) calc(z) / calc(alpha))' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 none none none)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 none none none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 none none none / none)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 none none none / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y none)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y none / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / none)' assert_true: 'color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y none / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y none / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / none)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / none)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 none none none) xyz-d65 x y z)' assert_true: 'color(from color(xyz-d65 none none none) xyz-d65 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 none none none / none) xyz-d65 x y z / alpha)' assert_true: 'color(from color(xyz-d65 none none none / none) xyz-d65 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 none 100) xyz-d65 x y z)' assert_true: 'color(from color(xyz-d65 7 none 100) xyz-d65 x y z)' is a supported value for color. expected true got false -FAIL Property color value 'color(from color(xyz-d65 7 -20.5 100 / none) xyz-d65 x y z / alpha)' assert_true: 'color(from color(xyz-d65 7 -20.5 100 / none) xyz-d65 x y z / alpha)' is a supported value for color. expected true got false -FAIL Property color value 'rgb(from var(--bg-color) r g b / 80%)' assert_equals: expected "rgba(0, 0, 255, 0.8)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lch(from var(--color) calc(l / 2) c h)' assert_equals: expected "lch(23.138971% 67.989716 134.39125)" but got "rgb(0, 0, 0)" -FAIL Property color value 'rgb(from var(--color) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11))' assert_equals: expected "rgb(76, 76, 76)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lch(from var(--color) l 0 h)' assert_equals: expected "lch(46.277943% 0 134.39125)" but got "rgb(0, 0, 0)" -FAIL Property color value 'rgb(from indianred 255 g b)' assert_true: 'rgb(from indianred 255 g b)' is a supported value for color. expected true got false -FAIL Property color value 'hsl(from var(--accent) calc(h + 180deg) s l)' assert_equals: expected "rgb(178, 32, 40)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lab(from var(--mycolor) l a b / 100%)' assert_equals: expected "lab(62.751923% 52.45802 -34.117283)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lab(from var(--mycolor) l a b / calc(alpha * 0.8))' assert_equals: expected "lab(62.751923% 52.45802 -34.117283 / 0.8)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lab(from var(--mycolor) l a b / calc(alpha - 20%))' assert_equals: expected "lab(62.751923% 52.45802 -34.117283 / 0.8)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lab(from var(--mycolor) l 0 0)' assert_equals: expected "lab(62.751923% 0 0)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lch(from peru calc(l * 0.8) c h)' assert_true: 'lch(from peru calc(l * 0.8) c h)' is a supported value for color. expected true got false -FAIL Property color value 'LCH(from var(--accent) l c calc(h + 180deg))' assert_equals: expected "lch(65.49473% 39.446903 10.114471)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lch(from var(--mycolor) l 0 h)' assert_equals: expected "lch(62.751923% 0 326.96112)" but got "rgb(0, 0, 0)" -FAIL Property color value 'var(--mygray)' assert_equals: expected "lch(62.751923% 0 326.96112)" but got "rgb(0, 0, 0)" -FAIL Property color value 'lch(from var(--mygray) l 30 h)' assert_equals: expected "lch(62.751923% 30 326.96112)" but got "rgb(0, 0, 0)" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/relative-color-valid-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/relative-color-valid-expected.txt deleted file mode 100644 index 612ee9b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-color/parsing/relative-color-valid-expected.txt +++ /dev/null
@@ -1,885 +0,0 @@ -This is a testharness.js-based test. -Found 881 tests; 13 PASS, 868 FAIL, 0 TIMEOUT, 0 NOTRUN. -FAIL e.style['color'] = "rgb(from rebeccapurple r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from hsl(120deg 20% 50% / .5) r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(from rebeccapurple r g b) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from color(display-p3 0 1 0) r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from lab(100% 104.3 -50.9) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from lab(0% 104.3 -50.9) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from lch(100% 116 334) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from lch(0% 116 334) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from oklab(100% 0.365 -0.16) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from oklab(0% 0.365 -0.16) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from oklch(100% 0.399 336.3) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from oklch(0% 0.399 336.3) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 25 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r 25 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g b / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g b / .20)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 25 g b / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r 25 b / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g 25 / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 25 g b / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 25 b / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r g 25 / 25%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r 20% 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r 10 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple 0% 10 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 20% 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) r 10 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) 0% 10 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r calc(g * 2) 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple b calc(r * .5) 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r calc(g * .5 + g * .5) 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r calc(b * .5 - g * .5) 10)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20%, 40%, 60%, 80%) calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rebeccapurple r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20% 40% 60% / 80%) r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20% 40% 60% / 80%) r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(none none none) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(none none none / none) r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20% none 60%) r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "rgb(from rgb(20% 40% 60% / none) r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(120deg 20% 50% / .5) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(from rebeccapurple h s l) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from color(display-p3 0 1 0) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from lab(100% 104.3 -50.9) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from lab(0% 104.3 -50.9) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from lch(100% 116 334) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from lch(0% 116 334) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from oklab(100% 0.365 -0.16) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from oklab(0% 0.365 -0.16) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from oklch(100% 0.399 336.3) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from oklch(0% 0.399 336.3) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 0 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 0deg 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 0 0% 0% / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 0deg 0% 0% / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 0 s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 0deg s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h 0% l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s 0% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s l / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) 0 s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) 0deg s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h 0% l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s 0% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s l / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 25 s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple 25deg s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h 20% l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s l / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) 25 s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) 25deg s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h 20% l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h s l / .2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h l s)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h alpha l / s)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h l l / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h l s)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h alpha l / s)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h l l / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple calc(h) calc(s) calc(l))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rgb(20%, 40%, 60%, 80%) calc(h) calc(s) calc(l) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple h s l / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from rebeccapurple none s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(120deg 20% 50% / .5) h s none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(120deg 20% 50% / .5) h s l / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(120deg 20% 50% / .5) none s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(none none none) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(none none none / none) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(120deg none 50% / .5) h s l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(120deg 20% 50% / none) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hsl(from hsl(none 20% 50% / .5) h s l / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hsl(120deg 20% 50% / .5) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(from rebeccapurple h w b) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from color(display-p3 0 1 0) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from lab(100% 104.3 -50.9) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from lab(0% 104.3 -50.9) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from lch(100% 116 334) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from lch(0% 116 334) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from oklab(100% 0.365 -0.16) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from oklab(0% 0.365 -0.16) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from oklch(100% 0.399 336.3) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from oklch(0% 0.399 336.3) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 0 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 0deg 0% 0%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 0 0% 0% / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 0deg 0% 0% / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 0 w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 0deg w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h 0% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w 0% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) 0 w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) 0deg w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h 0% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w 0% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 25 w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple 25deg w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w b / .2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) 25 w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) 25deg w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w b / .2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h b w)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h alpha w / b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w w / w)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h b w)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h alpha w / b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h w w / w)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) h alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple calc(h) calc(w) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rgb(20%, 40%, 60%, 80%) calc(h) calc(w) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple h w b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from rebeccapurple none w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(120deg 20% 50% / .5) h w none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(120deg 20% 50% / .5) h w b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(120deg 20% 50% / .5) none w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(none none none) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(none none none / none) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(120deg none 50% / .5) h w b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(120deg 20% 50% / none) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "hwb(from hwb(none 20% 50% / .5) h w b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(200% 300 400 / 500%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(-200% -300 -400 / -500%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(from lab(25% 20 50) l a b) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from color(display-p3 0 0 0) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) 0% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) 0% 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) 0% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) l 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) l a 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) l a b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) 0% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) 35% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) l 35 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) l a 35 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) l a b / .35)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) 35% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l 35 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a 35 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a b / .35)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(70% 45 30 / 40%) 200% 300 400 / 500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(70% 45 30 / 40%) -200% -300 -400 / -500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) l b a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) l a a / a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l b a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a a / a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) calc(l) calc(a) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) l a none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) l a none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50) l a b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / 40%) l a b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(none none none) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(none none none / none) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% none 50) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lab(from lab(25% 20 50 / none) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(200% 300 400 / 500%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(-200% -300 -400 / -500%) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(from oklab(25% 20 50) l a b) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from color(display-p3 0 0 0) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) 0% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) 0% 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) 0% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) 0% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) 35% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l 35 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a 35 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a b / .35)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) 35% a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l 35 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a 35 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a b / .35)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(70% 45 30 / 40%) 200% 300 400 / 500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(70% 45 30 / 40%) -200% -300 -400 / -500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l b a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a a / a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l b a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a a / a)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) calc(l) calc(a) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) calc(l) calc(a) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50) l a b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / 40%) l a b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(none none none) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(none none none / none) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% none 50) l a b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklab(from oklab(25% 20 50 / none) l a b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(200% 300 400 / 500%) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(-200% -300 -400 / -500%) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(from lch(70% 45 30) l c h) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from color(display-p3 0 0 0) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lab(70% 45 30) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) 0% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) 0% 0 0deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) 0% 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) 0% 0 0deg / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) 0% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l 0 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l c 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l c 0deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l c h / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) 0% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l 0 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c 0deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c h / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) 25% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l 25 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l c 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l c 25deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l c h / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) 25% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l 25 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c 25deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c h / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) 200% 300 400 / 500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) -200% -300 -400 / -500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) 50% 120 400deg / 500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) 50% 120 -400deg / -500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) alpha c h / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) alpha c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) alpha c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) alpha c h / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) alpha c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) alpha c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) calc(l) calc(c) calc(h))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l c none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l c none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30) l c h / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / 40%) l c h / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(none none none) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(none none none / none) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% none 30) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "lch(from lch(70% 45 30 / none) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(200% 300 400 / 500%) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(-200% -300 -400 / -500%) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(from oklch(70% 45 30) l c h) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from color(display-p3 0 0 0) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklab(70% 45 30) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) 0% 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) 0% 0 0deg)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) 0% 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) 0% 0 0deg / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) 0% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l 0 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c 0deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c h / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) 0% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l 0 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c 0deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c h / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) 25% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l 25 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c 25deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c h / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) 25% c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l 25 h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c 25 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c 25deg / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c h / .25)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) 200% 300 400 / 500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) -200% -300 -400 / -500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) 50% 120 400deg / 500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) 50% 120 -400deg / -500)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) alpha c h / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) alpha c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) alpha c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) alpha c h / l)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) alpha c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) alpha c c / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) calc(l) calc(c) calc(h))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) calc(l) calc(c) calc(h) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30) l c h / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / 40%) l c h / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(none none none) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(none none none / none) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% none 30) l c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "oklch(from oklch(70% 45 30 / none) l c h / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(srgb 0.7 0.5 0.3) srgb r g b) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 2 3 4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 2 3 4 / 5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb -2 -3 -4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb -2 -3 -4 / -5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 200% 300% 400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb 200% 300% 400% / 500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb -200% -300% -400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb -200% -300% -400% / -500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 1.7 1.5 1.3) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 1.7 1.5 1.3) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 1.7 1.5 1.3 / 140%) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 1.7 1.5 1.3 / 140%) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb -0.7 -0.5 -0.3) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb -0.7 -0.5 -0.3) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb -0.7 -0.5 -0.3 / -40%) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb -0.7 -0.5 -0.3 / -40%) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3) srgb r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / 40%) srgb r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb none none none) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb none none none / none) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 none 0.3) srgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb 0.7 0.5 0.3 / none) srgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 2 3 4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 2 3 4 / 5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -2 -3 -4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -2 -3 -4 / -5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 200% 300% 400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear 200% 300% 400% / 500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -200% -300% -400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear -200% -300% -400% / -500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 1.7 1.5 1.3) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 1.7 1.5 1.3) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 1.7 1.5 1.3 / 140%) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 1.7 1.5 1.3 / 140%) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear -0.7 -0.5 -0.3) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear -0.7 -0.5 -0.3) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear -0.7 -0.5 -0.3 / -40%) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear -0.7 -0.5 -0.3 / -40%) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3) srgb-linear r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / 40%) srgb-linear r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear none none none) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear none none none / none) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 none 0.3) srgb-linear r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(srgb-linear 0.7 0.5 0.3 / none) srgb-linear r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 2 3 4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 2 3 4 / 5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -2 -3 -4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -2 -3 -4 / -5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 200% 300% 400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb 200% 300% 400% / 500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -200% -300% -400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb -200% -300% -400% / -500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 1.7 1.5 1.3) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 1.7 1.5 1.3) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 1.7 1.5 1.3 / 140%) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 1.7 1.5 1.3 / 140%) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb -0.7 -0.5 -0.3) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb -0.7 -0.5 -0.3) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb -0.7 -0.5 -0.3 / -40%) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb -0.7 -0.5 -0.3 / -40%) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3) a98-rgb r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / 40%) a98-rgb r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb none none none) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb none none none / none) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 none 0.3) a98-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(a98-rgb 0.7 0.5 0.3 / none) a98-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 2 3 4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 2 3 4 / 5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 -2 -3 -4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 -2 -3 -4 / -5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 200% 300% 400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 200% 300% 400% / 500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 -200% -300% -400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 -200% -300% -400% / -500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 1.7 1.5 1.3) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 1.7 1.5 1.3) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 1.7 1.5 1.3 / 140%) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 1.7 1.5 1.3 / 140%) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 -0.7 -0.5 -0.3) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 -0.7 -0.5 -0.3) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 -0.7 -0.5 -0.3 / -40%) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 -0.7 -0.5 -0.3 / -40%) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3) rec2020 r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / 40%) rec2020 r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 none none none) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 none none none / none) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 none 0.3) rec2020 r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(rec2020 0.7 0.5 0.3 / none) rec2020 r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 0.2 g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb 20% g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 0.2 b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r 20% b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g 20% / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 2 3 4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 2 3 4 / 5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -2 -3 -4)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -2 -3 -4 / -5)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 200% 300% 400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb 200% 300% 400% / 500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -200% -300% -400%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb -200% -300% -400% / -500%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb g b r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb b alpha r / g)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r r r / r)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb alpha alpha alpha / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 1.7 1.5 1.3) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 1.7 1.5 1.3) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 1.7 1.5 1.3 / 140%) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 1.7 1.5 1.3 / 140%) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb -0.7 -0.5 -0.3) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb -0.7 -0.5 -0.3) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb -0.7 -0.5 -0.3 / -40%) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb -0.7 -0.5 -0.3 / -40%) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb calc(r) calc(g) calc(b))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb calc(r) calc(g) calc(b) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3) prophoto-rgb r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / 40%) prophoto-rgb r g b / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb none none none) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb none none none / none) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 none 0.3) prophoto-rgb r g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(prophoto-rgb 0.7 0.5 0.3 / none) prophoto-rgb r g b / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(xyz 7 -20.5 100) xyz x y z) xyz x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz calc(x) calc(y) calc(z))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz calc(x) calc(y) calc(z) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100) xyz x y z / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / 40%) xyz x y z / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz none none none) xyz x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz none none none / none) xyz x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 none 100) xyz x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz 7 -20.5 100 / none) xyz x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z) xyz-d50 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 calc(x) calc(y) calc(z))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 calc(x) calc(y) calc(z) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100) xyz-d50 x y z / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / 40%) xyz-d50 x y z / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 none none none) xyz-d50 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 none none none / none) xyz-d50 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 none 100) xyz-d50 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d50 7 -20.5 100 / none) xyz-d50 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z) xyz-d65 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 0 0 / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / 20%)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 0.2 y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x 0.2 z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y 0.2 / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / 0.2)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 y z x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x x x / x)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 calc(x) calc(y) calc(z))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 calc(x) calc(y) calc(z) / calc(alpha))" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 none none none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 none none none / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100) xyz-d65 x y z / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y none / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / 40%) xyz-d65 x y z / none)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 none none none) xyz-d65 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 none none none / none) xyz-d65 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 none 100) xyz-d65 x y z)" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color'] = "color(from color(xyz-d65 7 -20.5 100 / none) xyz-d65 x y z / alpha)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "rgb(from var(--bg-color) r g b / 80%)" should set the property value -PASS e.style['color'] = "lch(from var(--color) calc(l / 2) c h)" should set the property value -PASS e.style['color'] = "rgb(from var(--color) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11) calc(r * .3 + g * .59 + b * .11))" should set the property value -PASS e.style['color'] = "lch(from var(--color) l 0 h)" should set the property value -FAIL e.style['color'] = "rgb(from indianred 255 g b)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "hsl(from var(--accent) calc(h + 180deg) s l)" should set the property value -PASS e.style['color'] = "lab(from var(--mycolor) l a b / 100%)" should set the property value -PASS e.style['color'] = "lab(from var(--mycolor) l a b / calc(alpha * 0.8))" should set the property value -PASS e.style['color'] = "lab(from var(--mycolor) l a b / calc(alpha - 20%))" should set the property value -PASS e.style['color'] = "lab(from var(--mycolor) l 0 0)" should set the property value -FAIL e.style['color'] = "lch(from peru calc(l * 0.8) c h)" should set the property value assert_not_equals: property should be set got disallowed value "" -PASS e.style['color'] = "LCH(from var(--accent) l c calc(h + 180deg))" should set the property value -PASS e.style['color'] = "lch(from var(--mycolor) l 0 h)" should set the property value -PASS e.style['color'] = "var(--mygray)" should set the property value -PASS e.style['color'] = "lch(from var(--mygray) l 30 h)" should set the property value -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-pseudo/active-selection-001-manual-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-pseudo/active-selection-001-manual-expected.png deleted file mode 100644 index b2a7c08..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-pseudo/active-selection-001-manual-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-pseudo/active-selection-002-manual-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-pseudo/active-selection-002-manual-expected.png deleted file mode 100644 index 4d809303..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-pseudo/active-selection-002-manual-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-pseudo/active-selection-004-manual-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-pseudo/active-selection-004-manual-expected.png deleted file mode 100644 index 64a38e07..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/css/css-pseudo/active-selection-004-manual-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/svg/linking/scripted/rellist-feature-detection-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/svg/linking/scripted/rellist-feature-detection-expected.txt deleted file mode 100644 index 999f0fb8..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/svg/linking/scripted/rellist-feature-detection-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Make sure that relList based feature detection is working Cannot read properties of undefined (reading 'contains') -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/svg/struct/scripted/autofocus-attribute-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/svg/struct/scripted/autofocus-attribute-expected.txt deleted file mode 100644 index fb1ca76..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/svg/struct/scripted/autofocus-attribute-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS <a> should support autofocus -PASS Renderable element with tabindex should support autofocus -FAIL Never-rendered element with tabindex should not support autofocus promise_test: Unhandled rejection with value: object "TypeError: Cannot read properties of null (reading 'tagName')" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/backgrounds/animated-svg-as-mask-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/backgrounds/animated-svg-as-mask-expected.png deleted file mode 100644 index 9edb2931..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/backgrounds/animated-svg-as-mask-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/backgrounds/background-clip-text-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/backgrounds/background-clip-text-expected.png deleted file mode 100644 index e19e9890..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/backgrounds/background-clip-text-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/basic/align-attribute-ltr-cell-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/basic/align-attribute-ltr-cell-expected.png deleted file mode 100644 index 8f35c3e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/basic/align-attribute-ltr-cell-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/float/float-avoidance-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/float/float-avoidance-expected.png deleted file mode 100644 index 1bd5c92..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/float/float-avoidance-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/float/float-in-float-hit-testing-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/float/float-in-float-hit-testing-expected.png deleted file mode 100644 index 06a579a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/float/float-in-float-hit-testing-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/margin-collapse/103-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/margin-collapse/103-expected.png deleted file mode 100644 index e8093a1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/margin-collapse/103-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/positioning/047-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/positioning/047-expected.png deleted file mode 100644 index 2e4e5cb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/positioning/047-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/positioning/051-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/positioning/051-expected.png deleted file mode 100644 index 30731e3b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/positioning/051-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/positioning/auto/007-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/positioning/auto/007-expected.png deleted file mode 100644 index 7a36072..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/positioning/auto/007-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/positioning/inline-block-relposition-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/positioning/inline-block-relposition-expected.png deleted file mode 100644 index db8301b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/block/positioning/inline-block-relposition-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/borders/bidi-009a-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/borders/bidi-009a-expected.png deleted file mode 100644 index d565477..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/borders/bidi-009a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/borders/border-radius-split-inline-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/borders/border-radius-split-inline-expected.png deleted file mode 100644 index 5b5b786..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/borders/border-radius-split-inline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/box-shadow/inset-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/box-shadow/inset-expected.png deleted file mode 100644 index e778712..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/box-shadow/inset-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/box-shadow/inset-subpixel-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/box-shadow/inset-subpixel-expected.png deleted file mode 100644 index 888abda..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/box-shadow/inset-subpixel-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/canvas/canvas-composite-expected.png deleted file mode 100644 index e3d21377c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/canvas/canvas-composite-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/canvas/canvas-text-alignment-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/canvas/canvas-text-alignment-expected.png deleted file mode 100644 index 6ce9046d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/canvas/canvas-text-alignment-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/canvas/canvas-text-baseline-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/canvas/canvas-text-baseline-expected.png deleted file mode 100644 index 0d3496e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/canvas/canvas-text-baseline-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css-generated-content/014-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css-generated-content/014-expected.png deleted file mode 100644 index 6e51e6c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css-generated-content/014-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css-generated-content/after-duplicated-after-split-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css-generated-content/after-duplicated-after-split-expected.png deleted file mode 100644 index 5eb0062b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css-generated-content/after-duplicated-after-split-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/acid2-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/acid2-expected.png deleted file mode 100644 index 74e85e5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/acid2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/clip-text-in-scaled-div-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/clip-text-in-scaled-div-expected.png deleted file mode 100644 index 6ec97771..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/clip-text-in-scaled-div-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/focus-ring-continuations-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/focus-ring-continuations-expected.png deleted file mode 100644 index 146a698..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/focus-ring-continuations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/font-face-synthetic-bold-italic-for-locally-installed-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/font-face-synthetic-bold-italic-for-locally-installed-expected.png deleted file mode 100644 index 67c9fed6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/font-face-synthetic-bold-italic-for-locally-installed-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/font-smoothing-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/font-smoothing-expected.png deleted file mode 100644 index 6030423c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/font-smoothing-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/input-search-padding-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/input-search-padding-expected.png deleted file mode 100644 index b3812aa..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/input-search-padding-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/negative-leading-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/negative-leading-expected.png deleted file mode 100644 index 4fc561a1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/negative-leading-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/non-empty-span-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/non-empty-span-expected.png deleted file mode 100644 index b47f5a9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/non-empty-span-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/percent-top-relative-container-height-unspecified-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/percent-top-relative-container-height-unspecified-expected.png deleted file mode 100644 index 20b11cd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/percent-top-relative-container-height-unspecified-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/rem-calc-dynamic-scaling-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/rem-calc-dynamic-scaling-expected.png deleted file mode 100644 index 74e885d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/rem-calc-dynamic-scaling-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/rem-dynamic-scaling-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/rem-dynamic-scaling-expected.png deleted file mode 100644 index 74e885d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/rem-dynamic-scaling-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/rem-units-on-root-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/rem-units-on-root-expected.png deleted file mode 100644 index d37ad8d3..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/rem-units-on-root-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/text-overflow-ellipsis-multiple-shadows-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/text-overflow-ellipsis-multiple-shadows-expected.png deleted file mode 100644 index 156ce55..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/text-overflow-ellipsis-multiple-shadows-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/text-overflow-ellipsis-shadow-alpha-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/text-overflow-ellipsis-shadow-alpha-expected.png deleted file mode 100644 index befe81c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/text-overflow-ellipsis-shadow-alpha-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/zoom-font-size-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/zoom-font-size-expected.png deleted file mode 100644 index 19736745..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css/zoom-font-size-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css3-text/css3-text-decoration/text-decoration-underline-paints-behind-descenders-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css3-text/css3-text-decoration/text-decoration-underline-paints-behind-descenders-expected.png deleted file mode 100644 index e4e407ce..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/css3-text/css3-text-decoration/text-decoration-underline-paints-behind-descenders-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/dom/HTMLMeterElement/meter-optimums-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/dom/HTMLMeterElement/meter-optimums-expected.png deleted file mode 100644 index 2e3da26..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/dom/HTMLMeterElement/meter-optimums-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/dynamic/012-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/dynamic/012-expected.png deleted file mode 100644 index 6622e7e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/dynamic/012-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/events/touch/compositor-touch-hit-rects-svg-container-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/events/touch/compositor-touch-hit-rects-svg-container-expected.txt deleted file mode 100644 index a177811..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/events/touch/compositor-touch-hit-rects-svg-container-expected.txt +++ /dev/null
@@ -1,3 +0,0 @@ -: layer(800x600) has hit test rect (8,13 54x19) - -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/events/touch/compositor-touch-hit-rects-svg-text-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/events/touch/compositor-touch-hit-rects-svg-text-expected.txt deleted file mode 100644 index a177811..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/events/touch/compositor-touch-hit-rects-svg-text-expected.txt +++ /dev/null
@@ -1,3 +0,0 @@ -: layer(800x600) has hit test rect (8,13 54x19) - -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/button-sizes-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/button-sizes-expected.png deleted file mode 100644 index 67eb14d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/button-sizes-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/button-table-styles-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/button-table-styles-expected.png deleted file mode 100644 index 613c55a5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/button-table-styles-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/button-text-transform-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/button-text-transform-expected.png deleted file mode 100644 index 6f36ed5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/button-text-transform-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/fieldset/fieldset-crash-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/fieldset/fieldset-crash-expected.txt deleted file mode 100644 index 0383162..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/fieldset/fieldset-crash-expected.txt +++ /dev/null
@@ -1 +0,0 @@ -Test passes if it does not crash.
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/fieldset/focus-in-fieldset-disabled-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/fieldset/focus-in-fieldset-disabled-expected.txt deleted file mode 100644 index 26dd7a95..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/fieldset/focus-in-fieldset-disabled-expected.txt +++ /dev/null
@@ -1,8 +0,0 @@ -A form control in a disabled fieldset is not focusable: -PASS input1.focus(); document.activeElement is document.body -It becomes focusable if the fieldset is enabled: -PASS input1.focus(); document.activeElement is input1 -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/fieldset/validation-in-fieldset-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/fieldset/validation-in-fieldset-expected.txt deleted file mode 100644 index adaa9b54..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/fieldset/validation-in-fieldset-expected.txt +++ /dev/null
@@ -1,18 +0,0 @@ -A form control in initially disabled fieldset: -PASS control1.willValidate is false -Then, enables the fieldset: -PASS document.getElementById("f1").disabled = false; control1.willValidate is true -A form control in initially enabled fieldset: -PASS control2.willValidate is true -Then, disables fieldset: -PASS fieldset2.disabled = true; control2.willValidate is false -Detach the form control from the fieldset: -PASS fieldset2.removeChild(control2); control2.willValidate is true -PASS successfullyParsed is true - -TEST COMPLETE - -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/input-align-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/input-align-expected.png deleted file mode 100644 index aeb4f520..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/input-align-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/input-button-sizes-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/input-button-sizes-expected.png deleted file mode 100644 index f5ea52bd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/input-button-sizes-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/number/number-placeholder-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/number/number-placeholder-appearance-expected.png deleted file mode 100644 index b4ae43c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/number/number-placeholder-appearance-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/HTMLOptionElement_label03-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/HTMLOptionElement_label03-expected.png deleted file mode 100644 index 93dc0a6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/HTMLOptionElement_label03-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/basic-selects-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/basic-selects-expected.png deleted file mode 100644 index 212ae019..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/basic-selects-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/listbox-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/listbox-appearance-basic-expected.png deleted file mode 100644 index f727ff64..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/listbox-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/listbox-with-display-none-option-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/listbox-with-display-none-option-expected.png deleted file mode 100644 index 8c9b297..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/listbox-with-display-none-option-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/menulist-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/menulist-appearance-basic-expected.png deleted file mode 100644 index 23610d4a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/menulist-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/menulist-clip-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/menulist-clip-expected.png deleted file mode 100644 index 48e9504e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/menulist-clip-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/optgroup-rendering-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/optgroup-rendering-expected.png deleted file mode 100644 index 1efb870..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/optgroup-rendering-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-change-listbox-size-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-change-listbox-size-expected.png deleted file mode 100644 index 5beacfb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-change-listbox-size-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-item-background-clip-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-item-background-clip-expected.png deleted file mode 100644 index 3bc4fab..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-item-background-clip-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-list-box-with-height-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-list-box-with-height-expected.png deleted file mode 100644 index 7caf2d3..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-list-box-with-height-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-overflow-scroll-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-overflow-scroll-expected.png deleted file mode 100644 index 77115ec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-overflow-scroll-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-overflow-scroll-inherited-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-overflow-scroll-inherited-expected.png deleted file mode 100644 index 4ab578aa..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/select/select-overflow-scroll-inherited-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/submit/submit-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/submit/submit-appearance-basic-expected.png deleted file mode 100644 index e977b367..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/submit/submit-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-appearance-default-bkcolor-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-appearance-default-bkcolor-expected.png deleted file mode 100644 index 1a7b07a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-appearance-default-bkcolor-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-appearance-width-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-appearance-width-expected.png deleted file mode 100644 index a082a25..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-appearance-width-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-placeholder-paint-order-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-placeholder-paint-order-expected.png deleted file mode 100644 index 01d8435..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-placeholder-paint-order-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-readonly-autoscroll-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-readonly-autoscroll-expected.png deleted file mode 100644 index 9568b16..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-readonly-autoscroll-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-table-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-table-expected.png deleted file mode 100644 index bbc1258..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-table-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-text-double-click-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-text-double-click-expected.png deleted file mode 100644 index 0cb1fa0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-text-double-click-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-text-word-wrap-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-text-word-wrap-expected.png deleted file mode 100644 index abcc3eb05..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/input-text-word-wrap-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/text-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/text-appearance-basic-expected.png deleted file mode 100644 index b6632315b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/text-appearance-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/text-font-height-mismatch-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/text-font-height-mismatch-expected.png deleted file mode 100644 index 3c4939c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/text/text-font-height-mismatch-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/textarea/basic-textareas-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/textarea/basic-textareas-expected.png deleted file mode 100644 index 5b0eee2..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/textarea/basic-textareas-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/textarea/textarea-placeholder-paint-order-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/textarea/textarea-placeholder-paint-order-expected.png deleted file mode 100644 index a58f09a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/textarea/textarea-placeholder-paint-order-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/hidpi/broken-image-icon-hidpi-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/hidpi/broken-image-icon-hidpi-expected.png deleted file mode 100644 index c8b8dc3..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/hidpi/broken-image-icon-hidpi-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/hidpi/broken-image-with-size-hidpi-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/hidpi/broken-image-with-size-hidpi-expected.png deleted file mode 100644 index dbffbc9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/hidpi/broken-image-with-size-hidpi-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/hidpi/image-set-as-background-with-zoom-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/hidpi/image-set-as-background-with-zoom-expected.png deleted file mode 100644 index d63a68a2..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/hidpi/image-set-as-background-with-zoom-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/hidpi/resize-corner-hidpi-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/hidpi/resize-corner-hidpi-expected.png deleted file mode 100644 index a148b736..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/hidpi/resize-corner-hidpi-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/invalid/004-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/invalid/004-expected.png deleted file mode 100644 index 070adce4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/invalid/004-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/selectors/064-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/selectors/064-expected.png deleted file mode 100644 index 0a95c30..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/selectors/064-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/021-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/021-expected.png deleted file mode 100644 index c84a81fc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/021-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/border-collapsing/equal-precedence-resolution-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/border-collapsing/equal-precedence-resolution-expected.png deleted file mode 100644 index 32a169ed..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/border-collapsing/equal-precedence-resolution-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/border-collapsing/equal-precedence-resolution-vertical-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/border-collapsing/equal-precedence-resolution-vertical-expected.png deleted file mode 100644 index 900a6367..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/border-collapsing/equal-precedence-resolution-vertical-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/mozilla-bug10296-vertical-align-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/mozilla-bug10296-vertical-align-1-expected.png deleted file mode 100644 index 0662b51..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/mozilla-bug10296-vertical-align-1-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/mozilla-bug10296-vertical-align-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/mozilla-bug10296-vertical-align-2-expected.png deleted file mode 100644 index 65a875a8..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/mozilla-bug10296-vertical-align-2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/table-continuation-outline-paint-crash-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/table-continuation-outline-paint-crash-expected.png deleted file mode 100644 index 2ce1e89b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/table/table-continuation-outline-paint-crash-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/text-autosizing/display-type-change-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/text-autosizing/display-type-change-expected.png deleted file mode 100644 index d57de51..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/text-autosizing/display-type-change-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/text-autosizing/supercluster-multiple-layout-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/text-autosizing/supercluster-multiple-layout-expected.png deleted file mode 100644 index c83db951..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/text-autosizing/supercluster-multiple-layout-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/writing-mode/japanese-lr-text-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/writing-mode/japanese-lr-text-expected.png deleted file mode 100644 index ad052eb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/writing-mode/japanese-lr-text-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/writing-mode/text-orientation-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/writing-mode/text-orientation-basic-expected.png deleted file mode 100644 index f74e2508..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/writing-mode/text-orientation-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/xsl/xslt-enc-cyr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/xsl/xslt-enc-cyr-expected.png deleted file mode 100644 index e07ae1cf..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/xsl/xslt-enc-cyr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fonts/family-fallback-gardiner-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fonts/family-fallback-gardiner-expected.png deleted file mode 100644 index f52bc7d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fonts/family-fallback-gardiner-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/http/tests/misc/acid2-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/http/tests/misc/acid2-expected.png deleted file mode 100644 index 74e85e5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/http/tests/misc/acid2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/http/tests/misc/acid3-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/http/tests/misc/acid3-expected.png deleted file mode 100644 index 8d7f90d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/http/tests/misc/acid3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/http/tests/webfont/popup-menu-load-webfont-after-open-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/http/tests/webfont/popup-menu-load-webfont-after-open-expected.png deleted file mode 100644 index 52202653..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/http/tests/webfont/popup-menu-load-webfont-after-open-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/ietestcenter/css3/text/textshadow-009-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/ietestcenter/css3/text/textshadow-009-expected.png deleted file mode 100644 index a5f5d4e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/ietestcenter/css3/text/textshadow-009-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/12-55-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/12-55-expected.png deleted file mode 100644 index e6edd1f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/12-55-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/182-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/182-expected.png deleted file mode 100644 index 9ef4075..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/182-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/2-dht-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/2-dht-expected.png deleted file mode 100644 index ad84a8c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/2-dht-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/23-55-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/23-55-expected.png deleted file mode 100644 index 68e8aec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/23-55-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/55-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/55-expected.png deleted file mode 100644 index 0d0a7c5f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/55-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/imagemap-focus-ring-zoom-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/imagemap-focus-ring-zoom-expected.png deleted file mode 100644 index 6df44c8..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/images/imagemap-focus-ring-zoom-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/invalidation-after-opacity-change-subtree-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/invalidation-after-opacity-change-subtree-expected.png deleted file mode 100644 index 8920a00..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/invalidation-after-opacity-change-subtree-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/outline/focus-ring-on-child-move-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/outline/focus-ring-on-child-move-expected.txt deleted file mode 100644 index 23751aa..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/outline/focus-ring-on-child-move-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling background of LayoutView #document", - "bounds": [800, 600], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF", - "invalidations": [ - [98, 48, 304, 304] - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/outline/outline-continuations-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/outline/outline-continuations-expected.txt deleted file mode 100644 index 45c5275..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/outline/outline-continuations-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling background of LayoutView #document", - "bounds": [800, 600], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF", - "invalidations": [ - [16, 108, 90, 63] - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/shadow-multiple-expected.png deleted file mode 100644 index 98c30647..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/shadow-multiple-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/animated-svg-as-image-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/animated-svg-as-image-expected.png deleted file mode 100644 index 707941b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/animated-svg-as-image-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/animated-svg-as-image-same-image-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/animated-svg-as-image-same-image-expected.png deleted file mode 100644 index 707941b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/animated-svg-as-image-same-image-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/ems-display-none-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/ems-display-none-expected.png deleted file mode 100644 index 1678c1d6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/ems-display-none-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/exs-display-none-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/exs-display-none-expected.png deleted file mode 100644 index cccddff6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/exs-display-none-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.png deleted file mode 100644 index c7a787e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/js-late-clipPath-and-object-creation-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/js-late-clipPath-creation-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/js-late-clipPath-creation-expected.png deleted file mode 100644 index c7a787e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/js-late-clipPath-creation-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/js-late-pattern-creation-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/js-late-pattern-creation-expected.png deleted file mode 100644 index 675bcd0b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/js-late-pattern-creation-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem-expected.png deleted file mode 100644 index 841db752..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/tabgroup-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/tabgroup-expected.png deleted file mode 100644 index 61222173..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/tabgroup-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/window-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/window-expected.png deleted file mode 100644 index 640e37f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/window-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/zoom-coords-viewattr-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/zoom-coords-viewattr-01-b-expected.png deleted file mode 100644 index 2b1f3bb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/zoom-coords-viewattr-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/zoom-foreignObject-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/zoom-foreignObject-expected.png deleted file mode 100644 index 4130567..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/invalidation/svg/zoom-foreignObject-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/markers/document-markers-zoom-125-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/markers/document-markers-zoom-125-expected.png deleted file mode 100644 index b2e38e6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/markers/document-markers-zoom-125-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/markers/document-markers-zoom-200-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/markers/document-markers-zoom-200-expected.png deleted file mode 100644 index 148e7df..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/markers/document-markers-zoom-200-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/selection/text-selection-with-composition-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/selection/text-selection-with-composition-expected.png deleted file mode 100644 index 91907f7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/paint/selection/text-selection-with-composition-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/absolute-position-headers-and-footers-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/absolute-position-headers-and-footers-expected.png deleted file mode 100644 index 351a26b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/absolute-position-headers-and-footers-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/avoid-setting-header-offset-on-header-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/avoid-setting-header-offset-on-header-expected.png deleted file mode 100644 index c8a5730..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/avoid-setting-header-offset-on-header-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/composited-thead-tfoot-repeat-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/composited-thead-tfoot-repeat-expected.png deleted file mode 100644 index e9f476e2..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/composited-thead-tfoot-repeat-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/fixed-positioned-headers-and-footers-inside-transform-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/fixed-positioned-headers-and-footers-inside-transform-expected.png deleted file mode 100644 index 67c37f1c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/fixed-positioned-headers-and-footers-inside-transform-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/thead-tfoot-containing-svg-repeat-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/thead-tfoot-containing-svg-repeat-expected.png deleted file mode 100644 index 6a2c3db..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/thead-tfoot-containing-svg-repeat-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/thead-tfoot-containing-svg-repeat-extra-pages-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/thead-tfoot-containing-svg-repeat-extra-pages-expected.png deleted file mode 100644 index 13c64b68..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/printing/thead-tfoot-containing-svg-repeat-extra-pages-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/scrollbars/resize-scales-with-dpi-150-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/scrollbars/resize-scales-with-dpi-150-expected.png deleted file mode 100644 index 84791d3e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/scrollbars/resize-scales-with-dpi-150-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/g-dirLTR-ubNone-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/g-dirLTR-ubNone-expected.png deleted file mode 100644 index c8733fb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/g-dirLTR-ubNone-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/g-dirLTR-ubOverride-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/g-dirLTR-ubOverride-expected.png deleted file mode 100644 index 7fff83a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/g-dirLTR-ubOverride-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirLTR-anchorEnd-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirLTR-anchorEnd-expected.png deleted file mode 100644 index 844e525..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirLTR-anchorEnd-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirLTR-anchorMiddle-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirLTR-anchorMiddle-expected.png deleted file mode 100644 index f57645c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirLTR-anchorMiddle-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirLTR-anchorStart-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirLTR-anchorStart-expected.png deleted file mode 100644 index e4ef516..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirLTR-anchorStart-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirNone-anchorEnd-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirNone-anchorEnd-expected.png deleted file mode 100644 index 844e525..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirNone-anchorEnd-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirNone-anchorMiddle-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirNone-anchorMiddle-expected.png deleted file mode 100644 index f57645c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirNone-anchorMiddle-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirNone-anchorStart-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirNone-anchorStart-expected.png deleted file mode 100644 index e4ef516..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirNone-anchorStart-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirRTL-anchorEnd-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirRTL-anchorEnd-expected.png deleted file mode 100644 index e4ef516..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirRTL-anchorEnd-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirRTL-anchorMiddle-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirRTL-anchorMiddle-expected.png deleted file mode 100644 index f57645c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirRTL-anchorMiddle-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirRTL-anchorStart-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirRTL-anchorStart-expected.png deleted file mode 100644 index 844e525..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-dirRTL-anchorStart-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorEnd-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorEnd-expected.png deleted file mode 100644 index 844e525..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorEnd-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorMiddle-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorMiddle-expected.png deleted file mode 100644 index f57645c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorMiddle-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorStart-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorStart-expected.png deleted file mode 100644 index e4ef516..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirLTR-anchorStart-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorEnd-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorEnd-expected.png deleted file mode 100644 index e4ef516..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorEnd-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorMiddle-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorMiddle-expected.png deleted file mode 100644 index f57645c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorMiddle-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorStart-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorStart-expected.png deleted file mode 100644 index 844e525..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-inherited-dirRTL-anchorStart-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-no-markup-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-no-markup-expected.png deleted file mode 100644 index e4ef516..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-anchor-no-markup-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-dirLTR-ubNone-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-dirLTR-ubNone-expected.png deleted file mode 100644 index c8733fb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-dirLTR-ubNone-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-dirLTR-ubOverride-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-dirLTR-ubOverride-expected.png deleted file mode 100644 index 01f9c9a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-dirLTR-ubOverride-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-dirRTL-ubOverride-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-dirRTL-ubOverride-expected.png deleted file mode 100644 index 3c2efec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/text-dirRTL-ubOverride-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubEmbed-in-rtl-context-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubEmbed-in-rtl-context-expected.png deleted file mode 100644 index 70d259a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubEmbed-in-rtl-context-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubNone-in-rtl-context-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubNone-in-rtl-context-expected.png deleted file mode 100644 index 7fa104d4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubNone-in-rtl-context-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-default-context-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-default-context-expected.png deleted file mode 100644 index d9279298..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-default-context-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-ltr-context-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-ltr-context-expected.png deleted file mode 100644 index d9279298..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-ltr-context-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-rtl-context-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-rtl-context-expected.png deleted file mode 100644 index 77e31e55..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirLTR-ubOverride-in-rtl-context-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirNone-ubOverride-in-default-context-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirNone-ubOverride-in-default-context-expected.png deleted file mode 100644 index fe4887fc7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirNone-ubOverride-in-default-context-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirNone-ubOverride-in-ltr-context-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirNone-ubOverride-in-ltr-context-expected.png deleted file mode 100644 index fe4887fc7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirNone-ubOverride-in-ltr-context-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirNone-ubOverride-in-rtl-context-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirNone-ubOverride-in-rtl-context-expected.png deleted file mode 100644 index 688133d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirNone-ubOverride-in-rtl-context-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-rtl-context-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-rtl-context-expected.png deleted file mode 100644 index 988caf9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-dirRTL-ubOverride-in-rtl-context-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-direction-ltr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-direction-ltr-expected.png deleted file mode 100644 index 3363f95..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-I18N/tspan-direction-ltr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/coords-dom-03-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/coords-dom-03-f-expected.png deleted file mode 100644 index 2865789..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/coords-dom-03-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/coords-dom-04-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/coords-dom-04-f-expected.png deleted file mode 100644 index 4dda94c2..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/coords-dom-04-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/coords-units-03-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/coords-units-03-b-expected.png deleted file mode 100644 index 993849e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/coords-units-03-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png deleted file mode 100644 index 32c81ed..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/filters-image-03-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/interact-pointer-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/interact-pointer-03-t-expected.png deleted file mode 100644 index 4c13119..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/interact-pointer-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/linking-uri-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/linking-uri-01-b-expected.png deleted file mode 100644 index dea6178..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/linking-uri-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/painting-marker-06-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/painting-marker-06-f-expected.png deleted file mode 100644 index 7701847..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/painting-marker-06-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/pservers-pattern-03-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/pservers-pattern-03-f-expected.png deleted file mode 100644 index 0da079f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/pservers-pattern-03-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/struct-dom-11-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/struct-dom-11-f-expected.png deleted file mode 100644 index 72fcd9e9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/struct-dom-11-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/struct-use-14-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/struct-use-14-f-expected.png deleted file mode 100644 index 4b30713..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/struct-use-14-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/styling-css-04-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/styling-css-04-f-expected.png deleted file mode 100644 index 25ddfe55..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/styling-css-04-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/styling-pres-02-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/styling-pres-02-f-expected.png deleted file mode 100644 index 7462619..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/styling-pres-02-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/svgdom-over-01-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/svgdom-over-01-f-expected.png deleted file mode 100644 index f78305d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/svgdom-over-01-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/text-intro-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/text-intro-02-b-expected.png deleted file mode 100644 index e6c2af3..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/text-intro-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/text-intro-05-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/text-intro-05-t-expected.png deleted file mode 100644 index f77bc43..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/text-intro-05-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/text-intro-09-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/text-intro-09-b-expected.png deleted file mode 100644 index 0a80a55..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/text-intro-09-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/text-tspan-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/text-tspan-02-b-expected.png deleted file mode 100644 index 3682c55..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/text-tspan-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-01-b-expected.png deleted file mode 100644 index e527d20..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-02-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-02-f-expected.png deleted file mode 100644 index 2c924969..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-02-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-04-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-04-b-expected.png deleted file mode 100644 index c7d44f4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-04-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-05-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-05-b-expected.png deleted file mode 100644 index addc666..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-05-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-07-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-07-f-expected.png deleted file mode 100644 index 02e5809..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1-SE/types-dom-07-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-03-t-expected.png deleted file mode 100644 index 82b919c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-04-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-04-t-expected.png deleted file mode 100644 index 57630f2..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-04-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-05-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-05-t-expected.png deleted file mode 100644 index 1f106cd7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-05-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-06-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-06-t-expected.png deleted file mode 100644 index cb210dd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-06-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-07-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-07-t-expected.png deleted file mode 100644 index 90ec653..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-07-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-08-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-08-t-expected.png deleted file mode 100644 index a00d41a4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-08-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-09-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-09-t-expected.png deleted file mode 100644 index fb532a0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-09-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-10-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-10-t-expected.png deleted file mode 100644 index bb4f838..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-10-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-11-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-11-t-expected.png deleted file mode 100644 index 4c400be..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-11-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-12-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-12-t-expected.png deleted file mode 100644 index bb4f838..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-12-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-13-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-13-t-expected.png deleted file mode 100644 index 046d065..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-13-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-20-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-20-t-expected.png deleted file mode 100644 index a61a8ae..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-20-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-21-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-21-t-expected.png deleted file mode 100644 index a61a8ae..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-21-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-22-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-22-b-expected.png deleted file mode 100644 index ec3b0cdb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-22-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-23-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-23-t-expected.png deleted file mode 100644 index d067d1e0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-23-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-24-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-24-t-expected.png deleted file mode 100644 index e36474d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-24-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-25-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-25-t-expected.png deleted file mode 100644 index 0a5c668f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-25-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-26-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-26-t-expected.png deleted file mode 100644 index 63720a9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-26-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-27-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-27-t-expected.png deleted file mode 100644 index 218504e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-27-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-28-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-28-t-expected.png deleted file mode 100644 index 80e1058d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-28-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-29-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-29-b-expected.png deleted file mode 100644 index 47ff381..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-29-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-30-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-30-t-expected.png deleted file mode 100644 index a7b5502..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-30-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-31-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-31-t-expected.png deleted file mode 100644 index 5bdb9cf1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-31-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-32-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-32-t-expected.png deleted file mode 100644 index 984c765..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-32-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png deleted file mode 100644 index 428c9a5e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-33-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-34-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-34-t-expected.png deleted file mode 100644 index d08f5a7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-34-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-36-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-36-t-expected.png deleted file mode 100644 index b8f3d64..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-36-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-40-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-40-t-expected.png deleted file mode 100644 index ba3b335..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-40-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-41-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-41-t-expected.png deleted file mode 100644 index 2c928dd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-41-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-44-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-44-t-expected.png deleted file mode 100644 index a8c68cde..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-44-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-46-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-46-t-expected.png deleted file mode 100644 index 74962cc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-46-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-60-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-60-t-expected.png deleted file mode 100644 index 7997495..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-60-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-61-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-61-t-expected.png deleted file mode 100644 index 7de62101..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-61-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-62-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-62-t-expected.png deleted file mode 100644 index 4acf09e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-62-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-63-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-63-t-expected.png deleted file mode 100644 index 322399e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-63-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-64-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-64-t-expected.png deleted file mode 100644 index 18d26a77..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-64-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-65-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-65-t-expected.png deleted file mode 100644 index e04218f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-65-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-66-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-66-t-expected.png deleted file mode 100644 index d6c8e52..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-66-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-67-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-67-t-expected.png deleted file mode 100644 index 77f1160..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-67-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-68-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-68-t-expected.png deleted file mode 100644 index 5f31c21..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-68-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-69-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-69-t-expected.png deleted file mode 100644 index a6dfa7d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-69-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-70-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-70-t-expected.png deleted file mode 100644 index fbacce4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-70-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-77-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-77-t-expected.png deleted file mode 100644 index 9657c44..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-77-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-78-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-78-t-expected.png deleted file mode 100644 index 8120d14..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-78-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-80-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-80-t-expected.png deleted file mode 100644 index ce3f15a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-80-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-81-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-81-t-expected.png deleted file mode 100644 index 1406aa5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-81-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-82-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-82-t-expected.png deleted file mode 100644 index 3f34042..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-82-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-85-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-85-t-expected.png deleted file mode 100644 index 2cb702b3..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/animate-elem-85-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/color-prof-01-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/color-prof-01-f-expected.png deleted file mode 100644 index ae046dd0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/color-prof-01-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/color-prop-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/color-prop-01-b-expected.png deleted file mode 100644 index 087fd85..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/color-prop-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/color-prop-02-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/color-prop-02-f-expected.png deleted file mode 100644 index 794e40c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/color-prop-02-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/color-prop-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/color-prop-03-t-expected.png deleted file mode 100644 index 0aaddb6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/color-prop-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-coord-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-coord-01-t-expected.png deleted file mode 100644 index e05d7b3f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-coord-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-coord-02-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-coord-02-t-expected.png deleted file mode 100644 index e05d7b3f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-coord-02-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-01-b-expected.png deleted file mode 100644 index 856c75f1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-02-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-02-t-expected.png deleted file mode 100644 index a28e7db..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-02-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-03-t-expected.png deleted file mode 100644 index fa39d5a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-04-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-04-t-expected.png deleted file mode 100644 index 4a0a12a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-04-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-05-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-05-t-expected.png deleted file mode 100644 index 310a14d8..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-05-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-06-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-06-t-expected.png deleted file mode 100644 index fea24929..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-trans-06-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-units-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-units-01-b-expected.png deleted file mode 100644 index 49bf70d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-units-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-units-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-units-02-b-expected.png deleted file mode 100644 index 8794822..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-units-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-viewattr-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-viewattr-01-b-expected.png deleted file mode 100644 index 2b1f3bb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-viewattr-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-viewattr-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-viewattr-02-b-expected.png deleted file mode 100644 index a280444..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/coords-viewattr-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png deleted file mode 100644 index 251f420..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/extend-namespace-01-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-blend-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-blend-01-b-expected.png deleted file mode 100644 index bcd57c4b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-blend-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-color-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-color-01-b-expected.png deleted file mode 100644 index 9fe02c5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-color-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png deleted file mode 100644 index c606f4ec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png deleted file mode 100644 index 081fa36..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png deleted file mode 100644 index 8aa571f6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-example-01-b-expected.png deleted file mode 100644 index f4107f6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-example-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png deleted file mode 100644 index 382dd0e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-image-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-image-01-b-expected.png deleted file mode 100644 index 7cc5f3e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-image-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-light-01-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-light-01-f-expected.png deleted file mode 100644 index a6bcaf4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-light-01-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-light-04-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-light-04-f-expected.png deleted file mode 100644 index 13cbdf7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-light-04-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png deleted file mode 100644 index 9db6e597..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-specular-01-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-specular-01-f-expected.png deleted file mode 100644 index 3e60310..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/filters-specular-01-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/fonts-elem-03-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/fonts-elem-03-b-expected.png deleted file mode 100644 index 3187d9d7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/fonts-elem-03-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/fonts-elem-04-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/fonts-elem-04-b-expected.png deleted file mode 100644 index 5ce1be8..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/fonts-elem-04-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/fonts-elem-07-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/fonts-elem-07-b-expected.png deleted file mode 100644 index 64d9a3f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/fonts-elem-07-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-cursor-01-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-cursor-01-f-expected.png deleted file mode 100644 index 8327144..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-cursor-01-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-order-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-order-01-b-expected.png deleted file mode 100644 index 7ebf91a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-order-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-order-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-order-02-b-expected.png deleted file mode 100644 index d862a06..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-order-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-order-03-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-order-03-b-expected.png deleted file mode 100644 index 6eeebd94..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-order-03-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-zoom-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-zoom-01-t-expected.png deleted file mode 100644 index 0f7032f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/interact-zoom-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-01-b-expected.png deleted file mode 100644 index 3bc6472..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-02-b-expected.png deleted file mode 100644 index 4d3bc3a7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-03-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-03-b-expected.png deleted file mode 100644 index 1d00c09..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-03-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-04-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-04-t-expected.png deleted file mode 100644 index ccdc0ae..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-04-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-05-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-05-t-expected.png deleted file mode 100644 index 697f00c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-05-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-07-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-07-t-expected.png deleted file mode 100644 index 5268d0f4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-a-07-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-uri-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-uri-02-b-expected.png deleted file mode 100644 index b8a1d29..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-uri-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-uri-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-uri-03-t-expected.png deleted file mode 100644 index d033a8a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/linking-uri-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png deleted file mode 100644 index 225e5bf..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-opacity-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-opacity-01-b-expected.png deleted file mode 100644 index b4067043..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-opacity-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-path-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-path-01-b-expected.png deleted file mode 100644 index 62e62416e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-path-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-path-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-path-02-b-expected.png deleted file mode 100644 index 41696c9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-path-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-path-03-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-path-03-b-expected.png deleted file mode 100644 index e11cedc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-path-03-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-path-05-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-path-05-f-expected.png deleted file mode 100644 index 4738266..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/masking-path-05-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-01-t-expected.png deleted file mode 100644 index 0e9d4b3..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-02-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-02-t-expected.png deleted file mode 100644 index b112e32..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-02-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-03-t-expected.png deleted file mode 100644 index f5dfd72..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-04-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-04-t-expected.png deleted file mode 100644 index 03693333..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-04-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-05-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-05-b-expected.png deleted file mode 100644 index 5742b6a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-fill-05-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-marker-01-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-marker-01-f-expected.png deleted file mode 100644 index 9f85819d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-marker-01-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-marker-02-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-marker-02-f-expected.png deleted file mode 100644 index 8ad8c67..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-marker-02-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-01-t-expected.png deleted file mode 100644 index b749642..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-02-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-02-t-expected.png deleted file mode 100644 index 4a915c33..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-02-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-03-t-expected.png deleted file mode 100644 index e54dee5a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-04-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-04-t-expected.png deleted file mode 100644 index 3966ce89..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-04-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-07-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-07-t-expected.png deleted file mode 100644 index f9d1bda..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/painting-stroke-07-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-01-t-expected.png deleted file mode 100644 index 5e7df2fb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-02-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-02-t-expected.png deleted file mode 100644 index 80e4719f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-02-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-04-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-04-t-expected.png deleted file mode 100644 index 67dc9685..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-04-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-05-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-05-t-expected.png deleted file mode 100644 index cd39816c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-05-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-06-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-06-t-expected.png deleted file mode 100644 index 4cb83f49..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-06-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-07-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-07-t-expected.png deleted file mode 100644 index 17eb19ad78..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-07-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-08-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-08-t-expected.png deleted file mode 100644 index 0d57c1e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-08-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-09-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-09-t-expected.png deleted file mode 100644 index ac8cbe9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-09-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-10-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-10-t-expected.png deleted file mode 100644 index 8c75c0e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-10-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-12-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-12-t-expected.png deleted file mode 100644 index fb6781f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-12-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-13-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-13-t-expected.png deleted file mode 100644 index 8c18076..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-13-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-14-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-14-t-expected.png deleted file mode 100644 index f36e3bc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-14-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-15-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-15-t-expected.png deleted file mode 100644 index abafe95d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/paths-data-15-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-01-b-expected.png deleted file mode 100644 index 2749fde..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-02-b-expected.png deleted file mode 100644 index 1df906a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-03-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-03-b-expected.png deleted file mode 100644 index 093be03f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-03-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-04-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-04-b-expected.png deleted file mode 100644 index 443a0e3..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-04-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-05-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-05-b-expected.png deleted file mode 100644 index 74d48502..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-05-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-06-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-06-b-expected.png deleted file mode 100644 index e6290b90..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-06-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-07-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-07-b-expected.png deleted file mode 100644 index 6156aff..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-07-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-08-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-08-b-expected.png deleted file mode 100644 index 13eed111..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-08-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-09-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-09-b-expected.png deleted file mode 100644 index 81a4112..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-09-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-10-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-10-b-expected.png deleted file mode 100644 index 039ca34..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-10-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-11-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-11-b-expected.png deleted file mode 100644 index 0ac789d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-11-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-12-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-12-b-expected.png deleted file mode 100644 index 58531b1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-12-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-14-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-14-b-expected.png deleted file mode 100644 index 6840615..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-14-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-15-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-15-b-expected.png deleted file mode 100644 index 651b0f07..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-15-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-16-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-16-b-expected.png deleted file mode 100644 index 6b1eaff..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-16-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-18-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-18-b-expected.png deleted file mode 100644 index 319730b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-18-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-19-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-19-b-expected.png deleted file mode 100644 index c1c8f03..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-grad-19-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-pattern-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-pattern-01-b-expected.png deleted file mode 100644 index 11a93cb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/pservers-pattern-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-elems-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-elems-01-t-expected.png deleted file mode 100644 index f2deb6f10..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-elems-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-elems-02-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-elems-02-t-expected.png deleted file mode 100644 index 249871a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-elems-02-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-elems-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-elems-03-t-expected.png deleted file mode 100644 index 36e3232..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-elems-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-groups-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-groups-01-b-expected.png deleted file mode 100644 index 7b4591b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-groups-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-groups-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-groups-03-t-expected.png deleted file mode 100644 index 888b59c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/render-groups-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/script-handle-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/script-handle-02-b-expected.png deleted file mode 100644 index b54b08c2..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/script-handle-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/script-handle-03-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/script-handle-03-b-expected.png deleted file mode 100644 index 7f7e581c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/script-handle-03-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/script-handle-04-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/script-handle-04-b-expected.png deleted file mode 100644 index 49d4a98..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/script-handle-04-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-circle-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-circle-01-t-expected.png deleted file mode 100644 index 240aebe5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-circle-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-circle-02-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-circle-02-t-expected.png deleted file mode 100644 index 879cab1f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-circle-02-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-ellipse-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-ellipse-01-t-expected.png deleted file mode 100644 index b8a31acf..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-ellipse-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-ellipse-02-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-ellipse-02-t-expected.png deleted file mode 100644 index ea43f92f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-ellipse-02-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-intro-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-intro-01-t-expected.png deleted file mode 100644 index 9cb8fd2..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-intro-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-line-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-line-01-t-expected.png deleted file mode 100644 index e30ad7d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-line-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-polygon-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-polygon-01-t-expected.png deleted file mode 100644 index 7fd8029..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-polygon-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-polyline-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-polyline-01-t-expected.png deleted file mode 100644 index e3d62bcf..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-polyline-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-rect-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-rect-01-t-expected.png deleted file mode 100644 index 655e875..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-rect-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-rect-02-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-rect-02-t-expected.png deleted file mode 100644 index 793dc003..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/shapes-rect-02-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-cond-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-cond-01-t-expected.png deleted file mode 100644 index ffba81ad..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-cond-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-defs-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-defs-01-t-expected.png deleted file mode 100644 index 047fa0e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-defs-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-01-b-expected.png deleted file mode 100644 index ac32228..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-02-b-expected.png deleted file mode 100644 index 4aa6adc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-03-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-03-b-expected.png deleted file mode 100644 index 176f6b3f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-03-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-04-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-04-b-expected.png deleted file mode 100644 index cb620abc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-04-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-05-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-05-b-expected.png deleted file mode 100644 index f9cc1bb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-dom-05-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-frag-02-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-frag-02-t-expected.png deleted file mode 100644 index ed6c66d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-frag-02-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-frag-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-frag-03-t-expected.png deleted file mode 100644 index 76b0b73..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-frag-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-frag-05-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-frag-05-t-expected.png deleted file mode 100644 index f7ee28559..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-frag-05-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-group-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-group-01-t-expected.png deleted file mode 100644 index f3be6c5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-group-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-group-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-group-02-b-expected.png deleted file mode 100644 index 8cc14c7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-group-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-group-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-group-03-t-expected.png deleted file mode 100644 index 775ebd4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-group-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-01-t-expected.png deleted file mode 100644 index 1e41db4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-02-b-expected.png deleted file mode 100644 index bbf520c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-03-t-expected.png deleted file mode 100644 index de73257..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-04-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-04-t-expected.png deleted file mode 100644 index fd98c08..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-04-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-05-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-05-b-expected.png deleted file mode 100644 index 3a73071..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-05-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-06-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-06-t-expected.png deleted file mode 100644 index 884e3cd9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-06-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-08-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-08-t-expected.png deleted file mode 100644 index 437fa8d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-08-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-09-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-09-t-expected.png deleted file mode 100644 index fb65ef8..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-09-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-10-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-10-t-expected.png deleted file mode 100644 index 8b39c88..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-image-10-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-symbol-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-symbol-01-b-expected.png deleted file mode 100644 index 53a0a6d0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-symbol-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-use-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-use-01-t-expected.png deleted file mode 100644 index 940f8d7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-use-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-use-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-use-03-t-expected.png deleted file mode 100644 index d4ff6c6e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/struct-use-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-css-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-css-01-b-expected.png deleted file mode 100644 index 1fde82a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-css-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-css-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-css-02-b-expected.png deleted file mode 100644 index af70a37..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-css-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-css-03-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-css-03-b-expected.png deleted file mode 100644 index 3ea2836..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-css-03-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-css-06-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-css-06-b-expected.png deleted file mode 100644 index d56481c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-css-06-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-pres-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-pres-01-t-expected.png deleted file mode 100644 index 441c30c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/styling-pres-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-01-b-expected.png deleted file mode 100644 index 897793b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-02-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-02-b-expected.png deleted file mode 100644 index e3e1697..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-02-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-04-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-04-b-expected.png deleted file mode 100644 index 79f891d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-04-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-05-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-05-b-expected.png deleted file mode 100644 index 48b0f93c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-05-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-08-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-08-b-expected.png deleted file mode 100644 index 48712c1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-align-08-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-fonts-02-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-fonts-02-t-expected.png deleted file mode 100644 index 53e0acc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-fonts-02-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-text-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-text-01-b-expected.png deleted file mode 100644 index fcbccabf..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-text-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-text-04-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-text-04-t-expected.png deleted file mode 100644 index 67c29df..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-text-04-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-text-05-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-text-05-t-expected.png deleted file mode 100644 index f5bd5ca..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-text-05-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-text-06-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-text-06-t-expected.png deleted file mode 100644 index 388d014..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-text-06-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-tselect-01-b-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-tselect-01-b-expected.png deleted file mode 100644 index 5e49018..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-tselect-01-b-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-ws-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-ws-01-t-expected.png deleted file mode 100644 index 5e01b4e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-ws-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-ws-02-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-ws-02-t-expected.png deleted file mode 100644 index c110504..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.1/text-ws-02-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-01-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-01-t-expected.png deleted file mode 100644 index 32ed753..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-01-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-02-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-02-t-expected.png deleted file mode 100644 index f3b6cfd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-02-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-03-t-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-03-t-expected.png deleted file mode 100644 index d3a26403..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/W3C-SVG-1.2-Tiny/struct-use-recursion-03-t-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/as-background-image/animated-svg-as-background-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/as-background-image/animated-svg-as-background-expected.png deleted file mode 100644 index 9d269f8..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/as-background-image/animated-svg-as-background-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/as-background-image/svg-as-background-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/as-background-image/svg-as-background-3-expected.png deleted file mode 100644 index df70ddad..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/as-background-image/svg-as-background-3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/as-image/image-respects-pageScaleFactor-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/as-image/image-respects-pageScaleFactor-expected.png deleted file mode 100644 index 4a53aa4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/as-image/image-respects-pageScaleFactor-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/filters/feTile-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/filters/feTile-expected.png deleted file mode 100644 index 667405e9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/filters/feTile-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/gradientLimit-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/gradientLimit-expected.png deleted file mode 100644 index ac9d817..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/gradientLimit-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/patternPreserveAspectRatioA-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/patternPreserveAspectRatioA-expected.png deleted file mode 100644 index 24d6cd4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/patternPreserveAspectRatioA-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/patternRegionA-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/patternRegionA-expected.png deleted file mode 100644 index a5f97e7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/patternRegionA-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/patternRegions-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/patternRegions-expected.png deleted file mode 100644 index 76e2dd1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/patternRegions-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/patternRegions-positioned-objects-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/patternRegions-positioned-objects-expected.png deleted file mode 100644 index 97b33cd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/paints/patternRegions-positioned-objects-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/longTextOnPath-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/longTextOnPath-expected.png deleted file mode 100644 index f6c654d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/longTextOnPath-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textAnchor-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textAnchor-expected.png deleted file mode 100644 index 3a0cfa4e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textAnchor-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textAnchor2-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textAnchor2-expected.png deleted file mode 100644 index 9720e1ad..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textAnchor2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textAnchor3-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textAnchor3-expected.png deleted file mode 100644 index 12a02f1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textAnchor3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textEffect2-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textEffect2-expected.png deleted file mode 100644 index bd945ee..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textEffect2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textGlyphOrientationHorizontal-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textGlyphOrientationHorizontal-expected.png deleted file mode 100644 index 95a36575..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textGlyphOrientationHorizontal-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textPosition-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textPosition-expected.png deleted file mode 100644 index 5a27444..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/batik/text/textPosition-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/carto.net/colourpicker-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/carto.net/colourpicker-expected.png deleted file mode 100644 index 42a51e1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/carto.net/colourpicker-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/carto.net/textbox-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/carto.net/textbox-expected.png deleted file mode 100644 index 0d3ba14..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/carto.net/textbox-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/clip-path/clip-path-text-and-shape-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/clip-path/clip-path-text-and-shape-expected.png deleted file mode 100644 index 90edd14..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/clip-path/clip-path-text-and-shape-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/clip-path/clip-path-text-and-stroke-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/clip-path/clip-path-text-and-stroke-expected.png deleted file mode 100644 index 23634b1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/clip-path/clip-path-text-and-stroke-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/clip-path/clip-path-text-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/clip-path/clip-path-text-expected.png deleted file mode 100644 index 9552585..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/clip-path/clip-path-text-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/clip-path/clip-path-tspan-and-stroke-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/clip-path/clip-path-tspan-and-stroke-expected.png deleted file mode 100644 index 23634b1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/clip-path/clip-path-tspan-and-stroke-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/css/text-gradient-shadow-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/css/text-gradient-shadow-expected.png deleted file mode 100644 index 5b18b14b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/css/text-gradient-shadow-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/css/text-shadow-multiple-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/css/text-shadow-multiple-expected.png deleted file mode 100644 index ef5bceb6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/css/text-shadow-multiple-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/SVGPoint-matrixTransform-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/SVGPoint-matrixTransform-expected.png deleted file mode 100644 index c1abb12..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/SVGPoint-matrixTransform-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/createelement-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/createelement-expected.txt deleted file mode 100644 index b9b783d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/createelement-expected.txt +++ /dev/null
@@ -1 +0,0 @@ -CONSOLE ERROR: Uncaught TypeError: Cannot read properties of null (reading 'setAttribute')
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/foreign-object-skew-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/foreign-object-skew-expected.png deleted file mode 100644 index b6c0f5e3..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/foreign-object-skew-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/invalid-css-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/invalid-css-expected.png deleted file mode 100644 index 0de0f9e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/invalid-css-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/linking-a-03-b-viewBox-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/linking-a-03-b-viewBox-expected.png deleted file mode 100644 index 4e1e081..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/linking-a-03-b-viewBox-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/linking-a-03-b-viewBox-transform-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/linking-a-03-b-viewBox-transform-expected.png deleted file mode 100644 index 89b18a75..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/linking-a-03-b-viewBox-transform-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/marker-default-width-height-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/marker-default-width-height-expected.png deleted file mode 100644 index 32a6455..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/marker-default-width-height-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/mouse-move-on-svg-container-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/mouse-move-on-svg-container-expected.png deleted file mode 100644 index 4a775fc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/mouse-move-on-svg-container-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/mouse-move-on-svg-container-standalone-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/mouse-move-on-svg-container-standalone-expected.png deleted file mode 100644 index 4a775fc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/mouse-move-on-svg-container-standalone-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/object-sizing-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/object-sizing-expected.png deleted file mode 100644 index a31fa458..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/object-sizing-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/shapes-supporting-markers-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/shapes-supporting-markers-expected.png deleted file mode 100644 index 6f0538be..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/shapes-supporting-markers-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/svg-fonts-with-no-element-reference-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/svg-fonts-with-no-element-reference-expected.png deleted file mode 100644 index fe3f7fa..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/svg-fonts-with-no-element-reference-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-ctm-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-ctm-expected.png deleted file mode 100644 index 6c434f8..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-ctm-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-dom-01-f-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-dom-01-f-expected.png deleted file mode 100644 index 46847a91..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-dom-01-f-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-filter-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-filter-expected.png deleted file mode 100644 index bb74560..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-filter-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-hit-test-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-hit-test-expected.png deleted file mode 100644 index 9cfa3c7b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-hit-test-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-rotated-gradient-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-rotated-gradient-expected.png deleted file mode 100644 index c2aa485..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-rotated-gradient-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-rotation-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-rotation-expected.png deleted file mode 100644 index c449ea8..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/text-rotation-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-events-crash-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-events-crash-expected.png deleted file mode 100644 index b0dfba7f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-events-crash-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-modify-container-in-target-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-modify-container-in-target-expected.png deleted file mode 100644 index b7083b4e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-modify-container-in-target-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-modify-target-container-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-modify-target-container-expected.png deleted file mode 100644 index 9e78d7a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-modify-target-container-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-modify-target-symbol-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-modify-target-symbol-expected.png deleted file mode 100644 index 3a4124b4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-modify-target-symbol-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-nested-missing-target-removed-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-nested-missing-target-removed-expected.txt deleted file mode 100644 index 95f60d5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-nested-missing-target-removed-expected.txt +++ /dev/null
@@ -1,2 +0,0 @@ -CONSOLE ERROR: Uncaught TypeError: Cannot set properties of null (setting 'id') -PASS
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-1-expected.png deleted file mode 100644 index fc25c8fc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-1-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-2-expected.png deleted file mode 100644 index fc25c8fc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-3-expected.png deleted file mode 100644 index fc25c8fc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-4-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-4-expected.png deleted file mode 100644 index fc25c8fc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-4-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-5-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-5-expected.png deleted file mode 100644 index fc25c8fc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-5-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-6-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-6-expected.png deleted file mode 100644 index fc25c8fc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-disallowed-foreign-object-6-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-g-containing-use-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-g-containing-use-expected.png deleted file mode 100644 index 3d0e84f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-g-containing-use-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-g-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-g-expected.png deleted file mode 100644 index 6b37f1c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-g-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-non-svg-namespaced-element-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-non-svg-namespaced-element-expected.png deleted file mode 100644 index fc25c8fc..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-non-svg-namespaced-element-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-rect-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-rect-expected.png deleted file mode 100644 index eec9fcd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-rect-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-symbol-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-symbol-expected.png deleted file mode 100644 index eec9fcd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-symbol-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-text-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-text-expected.png deleted file mode 100644 index eec4f10a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-text-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-use-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-use-expected.png deleted file mode 100644 index 6b37f1c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-on-use-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-recursion-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-recursion-1-expected.png deleted file mode 100644 index 206ad1c0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-recursion-1-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-recursion-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-recursion-2-expected.png deleted file mode 100644 index 1c96818..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-recursion-2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-recursion-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-recursion-3-expected.png deleted file mode 100644 index 206ad1c0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-recursion-3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-recursion-4-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-recursion-4-expected.png deleted file mode 100644 index 206ad1c0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-recursion-4-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-transform-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-transform-expected.png deleted file mode 100644 index ceba02a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/custom/use-transform-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-dom-in-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-dom-in-attr-expected.png deleted file mode 100644 index a7602b0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-dom-in-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-dom-in2-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-dom-in2-attr-expected.png deleted file mode 100644 index a7602b0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-dom-in2-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-dom-mode-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-dom-mode-attr-expected.png deleted file mode 100644 index a7602b0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-dom-mode-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-svgdom-in-prop-expected.png deleted file mode 100644 index a7602b0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-svgdom-in-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-svgdom-in2-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-svgdom-in2-prop-expected.png deleted file mode 100644 index a7602b0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-svgdom-in2-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-svgdom-mode-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-svgdom-mode-prop-expected.png deleted file mode 100644 index a7602b0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEBlendElement-svgdom-mode-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-diffuseConstant-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-diffuseConstant-attr-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-diffuseConstant-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-in-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-in-attr-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-in-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-kernelUnitLength-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-kernelUnitLength-attr-expected.png deleted file mode 100644 index 1860d6e4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-kernelUnitLength-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-lighting-color-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-lighting-color-attr-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-lighting-color-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-surfaceScale-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-surfaceScale-attr-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-surfaceScale-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-inherit-lighting-color-css-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-inherit-lighting-color-css-prop-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-inherit-lighting-color-css-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-lighting-color-css-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-lighting-color-css-prop-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-lighting-color-css-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-diffuseConstant-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-diffuseConstant-prop-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-diffuseConstant-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-in-prop-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-in-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-surfaceScale-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-surfaceScale-prop-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-surfaceScale-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDistantLightElement-dom-azimuth-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDistantLightElement-dom-azimuth-attr-expected.png deleted file mode 100644 index 111b957..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDistantLightElement-dom-azimuth-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDistantLightElement-dom-elevation-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDistantLightElement-dom-elevation-attr-expected.png deleted file mode 100644 index 111b957..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDistantLightElement-dom-elevation-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-azimuth-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-azimuth-prop-expected.png deleted file mode 100644 index 111b957..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-azimuth-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-elevation-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-elevation-prop-expected.png deleted file mode 100644 index 111b957..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-elevation-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-dom-x-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-dom-x-attr-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-dom-x-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-dom-y-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-dom-y-attr-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-dom-y-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-dom-z-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-dom-z-attr-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-dom-z-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-svgdom-x-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-svgdom-x-prop-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-svgdom-x-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-svgdom-y-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-svgdom-y-prop-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-svgdom-y-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-svgdom-z-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-svgdom-z-prop-expected.png deleted file mode 100644 index 3c797fd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFEPointLightElement-svgdom-z-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-in-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-in-attr-expected.png deleted file mode 100644 index 00796ba9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-in-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-kernelUnitLength-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-kernelUnitLength-attr-expected.png deleted file mode 100644 index 1ccb6de..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-kernelUnitLength-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularConstant-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularConstant-attr-expected.png deleted file mode 100644 index 00796ba9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularConstant-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularExponent-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularExponent-attr-expected.png deleted file mode 100644 index 00796ba9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularExponent-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-suraceScale-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-suraceScale-attr-expected.png deleted file mode 100644 index 00796ba9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-dom-suraceScale-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-inherit-lighting-color-css-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-inherit-lighting-color-css-prop-expected.png deleted file mode 100644 index 956704ce..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-inherit-lighting-color-css-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-lighting-color-css-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-lighting-color-css-prop-expected.png deleted file mode 100644 index 956704ce..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-lighting-color-css-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-in-prop-expected.png deleted file mode 100644 index 00796ba9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-in-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularConstant-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularConstant-prop-expected.png deleted file mode 100644 index 00796ba9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularConstant-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularExponent-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularExponent-prop-expected.png deleted file mode 100644 index 00796ba9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularExponent-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-suraceScale-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-suraceScale-prop-expected.png deleted file mode 100644 index 00796ba9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-suraceScale-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-limitingConeAngle-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-limitingConeAngle-attr-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-limitingConeAngle-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtX-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtX-attr-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtX-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtY-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtY-attr-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtY-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtZ-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtZ-attr-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtZ-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-specularExponent-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-specularExponent-attr-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-specularExponent-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-x-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-x-attr-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-x-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-y-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-y-attr-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-y-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-z-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-z-attr-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-dom-z-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-limitingConeAngle-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-limitingConeAngle-prop-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-limitingConeAngle-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtX-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtX-prop-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtX-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtY-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtY-prop-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtY-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtZ-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtZ-prop-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtZ-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-specularExponent-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-specularExponent-prop-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-specularExponent-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-x-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-x-prop-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-x-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-y-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-y-prop-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-y-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-z-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-z-prop-expected.png deleted file mode 100644 index 005b635..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFESpotLightElement-svgdom-z-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-filterUnits-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-filterUnits-attr-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-filterUnits-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-height-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-height-attr-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-height-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-width-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-width-attr-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-width-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-x-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-x-attr-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-x-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-y-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-y-attr-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-dom-y-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-filterUnits-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-filterUnits-prop-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-filterUnits-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-height-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-height-prop-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-height-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-width-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-width-prop-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-width-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-x-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-x-prop-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-x-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-y-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-y-prop-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterElement-svgdom-y-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-height-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-height-attr-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-height-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-result-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-result-attr-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-result-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-width-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-width-attr-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-width-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-x-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-x-attr-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-x-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-y-attr-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-y-attr-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-y-attr-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-height-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-height-prop-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-height-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-result-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-result-prop-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-result-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-width-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-width-prop-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-width-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-x-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-x-prop-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-x-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-y-prop-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-y-prop-expected.png deleted file mode 100644 index ffcdcec..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-y-prop-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/filters/feImage-preserveAspectRatio-all-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/filters/feImage-preserveAspectRatio-all-expected.png deleted file mode 100644 index 78dbc63..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/filters/feImage-preserveAspectRatio-all-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/error/010-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/error/010-expected.png deleted file mode 100644 index 20a295e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/error/010-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/error/011-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/error/011-expected.png deleted file mode 100644 index 20a295e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/error/011-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/links/002-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/links/002-expected.png deleted file mode 100644 index 7364884..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/links/002-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/mixed/008-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/mixed/008-expected.png deleted file mode 100644 index e71b4b4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/mixed/008-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/text/002-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/text/002-expected.png deleted file mode 100644 index 2a1cd61..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/text/002-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/viewbox/preserveAspectRatio/002-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/viewbox/preserveAspectRatio/002-expected.png deleted file mode 100644 index 050021683..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/hixie/viewbox/preserveAspectRatio/002-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/bidi-text-query-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/bidi-text-query-expected.png deleted file mode 100644 index 98afe61..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/bidi-text-query-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/foreignObject-repaint-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/foreignObject-repaint-expected.png deleted file mode 100644 index 8096e35..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/foreignObject-repaint-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png deleted file mode 100644 index a781871..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-squeeze-1-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png deleted file mode 100644 index afcef4d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-squeeze-2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png deleted file mode 100644 index d067c8a8..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-squeeze-3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png deleted file mode 100644 index 15b304c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-squeeze-4-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png deleted file mode 100644 index c3888dda7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-stretch-2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png deleted file mode 100644 index 4a85bee..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-stretch-3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-stretch-4-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-stretch-4-expected.png deleted file mode 100644 index 48fa434..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/select-textLength-spacingAndGlyphs-stretch-4-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/selection-styles-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/selection-styles-expected.png deleted file mode 100644 index 4e3b289a2..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/selection-styles-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/small-fonts-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/small-fonts-2-expected.png deleted file mode 100644 index 5ed36ea..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/small-fonts-2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/small-fonts-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/small-fonts-3-expected.png deleted file mode 100644 index fa6ba646..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/small-fonts-3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/small-fonts-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/small-fonts-expected.png deleted file mode 100644 index d639791..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/small-fonts-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/small-fonts-in-html5-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/small-fonts-in-html5-expected.png deleted file mode 100644 index 7a0ec8f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/small-fonts-in-html5-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/text-fill-opacity-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/text-fill-opacity-expected.png deleted file mode 100644 index a60f88f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/text-fill-opacity-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/text-gradient-positioning-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/text-gradient-positioning-expected.png deleted file mode 100644 index bb253726..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/text/text-gradient-positioning-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/transforms/svg-css-transforms-clip-path-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/transforms/svg-css-transforms-clip-path-expected.png deleted file mode 100644 index 7a8df36f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/transforms/svg-css-transforms-clip-path-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/transforms/svg-css-transforms-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/transforms/svg-css-transforms-expected.png deleted file mode 100644 index 014acf5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/transforms/svg-css-transforms-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/wicd/test-rightsizing-a-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/wicd/test-rightsizing-a-expected.png deleted file mode 100644 index 5814a19..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/wicd/test-rightsizing-a-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/wicd/test-scalable-background-image1-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/wicd/test-scalable-background-image1-expected.png deleted file mode 100644 index c2ccb54..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/wicd/test-scalable-background-image1-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/zoom/page/zoom-foreignObject-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/zoom/page/zoom-foreignObject-expected.png deleted file mode 100644 index d709ed37..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/zoom/page/zoom-foreignObject-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/zoom/page/zoom-hixie-mixed-009-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/zoom/page/zoom-hixie-mixed-009-expected.png deleted file mode 100644 index 9696370..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/zoom/page/zoom-hixie-mixed-009-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/zoom/text/zoom-hixie-mixed-009-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/zoom/text/zoom-hixie-mixed-009-expected.png deleted file mode 100644 index 3d0ed5ff..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/svg/zoom/text/zoom-hixie-mixed-009-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug113235-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug113235-2-expected.png deleted file mode 100644 index d3e03ad..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug113235-2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug159108-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug159108-expected.png deleted file mode 100644 index c9e80b77..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug159108-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug222846-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug222846-expected.png deleted file mode 100644 index 02772b56..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug222846-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug24200-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug24200-expected.png deleted file mode 100644 index 13c4dda2..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug24200-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug2469-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug2469-expected.png deleted file mode 100644 index b854ea6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug2469-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug2886-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug2886-expected.png deleted file mode 100644 index 7e55a7e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug2886-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug43854-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug43854-1-expected.png deleted file mode 100644 index 1ef52e6a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug43854-1-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug51727-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug51727-expected.png deleted file mode 100644 index fc4ec5d7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug51727-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug52505-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug52505-expected.png deleted file mode 100644 index bbddf624..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug52505-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug60749-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug60749-expected.png deleted file mode 100644 index 9c2d2aa..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug60749-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug73321-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug73321-expected.png deleted file mode 100644 index bb45398d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug73321-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug78162-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug78162-expected.png deleted file mode 100644 index abf922a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug78162-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug8032-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug8032-1-expected.png deleted file mode 100644 index fbe7c86..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug8032-1-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug8858-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug8858-expected.png deleted file mode 100644 index a5fa8fb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug8858-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug92143-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug92143-expected.png deleted file mode 100644 index 30b7ee0a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug92143-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/collapsing_borders/bug41262-3-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/collapsing_borders/bug41262-3-expected.png deleted file mode 100644 index 9606961..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/collapsing_borders/bug41262-3-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/core/col_widths_auto_per-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/core/col_widths_auto_per-expected.png deleted file mode 100644 index ce66397..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/core/col_widths_auto_per-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/marvin/tables_th_colspan-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/marvin/tables_th_colspan-expected.png deleted file mode 100644 index 0988c12..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/marvin/tables_th_colspan-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/marvin/tables_th_rowspan-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/marvin/tables_th_rowspan-expected.png deleted file mode 100644 index ee861c5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/marvin/tables_th_rowspan-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/marvin/tables_th_width-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/marvin/tables_th_width-expected.png deleted file mode 100644 index e40faf49..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/marvin/tables_th_width-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/marvin/x_th_align_char-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/marvin/x_th_align_char-expected.png deleted file mode 100644 index 1543b279..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/marvin/x_th_align_char-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/bugs/bug7121-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/bugs/bug7121-2-expected.png deleted file mode 100644 index 2bd0151d..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/bugs/bug7121-2-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/collapsing_borders/bug41262-5-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/collapsing_borders/bug41262-5-expected.png deleted file mode 100644 index 91014a7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/collapsing_borders/bug41262-5-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/collapsing_borders/bug41262-6-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/collapsing_borders/bug41262-6-expected.png deleted file mode 100644 index ae9bb06..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/collapsing_borders/bug41262-6-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_cell-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_cell-expected.png deleted file mode 100644 index 85ecbcd..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_cell-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_cell_sibling-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_cell_sibling-expected.png deleted file mode 100644 index 70cfce3..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_cell_sibling-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row-expected.png deleted file mode 100644 index a770486c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row_sibling-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row_sibling-expected.png deleted file mode 100644 index b2d467ca7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_row_sibling-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_table-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_table-expected.png deleted file mode 100644 index 448980a..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_table-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_table_caption-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_table_caption-expected.png deleted file mode 100644 index 231b10b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_table_caption-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody-expected.png deleted file mode 100644 index 777933e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody_sibling-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody_sibling-expected.png deleted file mode 100644 index d420554f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/marvin/table_overflow_style_reflow_tbody_sibling-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/transforms/2d/zoom-menulist-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/transforms/2d/zoom-menulist-expected.png deleted file mode 100644 index c8541d14..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/transforms/2d/zoom-menulist-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/transforms/svg-vs-css-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/transforms/svg-vs-css-expected.png deleted file mode 100644 index b9e79aeb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/transforms/svg-vs-css-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-color-scheme/text/input-dark-mode-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-color-scheme/text/input-dark-mode-basic-expected.png deleted file mode 100644 index 3385b2f5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/dark-color-scheme/text/input-dark-mode-basic-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/atsui-multiple-renderers-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/atsui-multiple-renderers-expected.png deleted file mode 100644 index 7fd2fa5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/atsui-multiple-renderers-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/basic/011-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/basic/011-expected.png deleted file mode 100644 index 06d8deb1..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/basic/011-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/basic/012-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/basic/012-expected.png deleted file mode 100644 index cf0c449..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/basic/012-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/basic/generic-family-changes-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/basic/generic-family-changes-expected.png deleted file mode 100644 index f0781a9..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/basic/generic-family-changes-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/chromium-linux-fontconfig-renderstyle-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/chromium-linux-fontconfig-renderstyle-expected.png deleted file mode 100644 index 0c48205..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/chromium-linux-fontconfig-renderstyle-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/emphasis-complex-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/emphasis-complex-expected.png deleted file mode 100644 index 97ee22af..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/emphasis-complex-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/font-size-adjust-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/font-size-adjust-expected.png deleted file mode 100644 index 3b843f6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/font-size-adjust-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/font-weight-600-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/font-weight-600-expected.png deleted file mode 100644 index 3b829ffa..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/font-weight-600-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/font-weight-variant-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/font-weight-variant-expected.png deleted file mode 100644 index 3e9eac2..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/font-weight-variant-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/international/bidi-neutral-run-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/international/bidi-neutral-run-expected.png deleted file mode 100644 index 1143ad7..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/international/bidi-neutral-run-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/international/complex-joining-using-gpos-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/international/complex-joining-using-gpos-expected.png deleted file mode 100644 index 275f68f3..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/international/complex-joining-using-gpos-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/international/hebrew-vowels-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/international/hebrew-vowels-expected.png deleted file mode 100644 index d75e1fb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/international/hebrew-vowels-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/international/lang-glyph-cache-separation-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/international/lang-glyph-cache-separation-expected.png deleted file mode 100644 index 45762f6b..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/international/lang-glyph-cache-separation-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/justify-ideograph-complex-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/justify-ideograph-complex-expected.png deleted file mode 100644 index 6fb5882..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/justify-ideograph-complex-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/letter-spacing-negative-opacity-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/letter-spacing-negative-opacity-expected.png deleted file mode 100644 index 983c618..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/letter-spacing-negative-opacity-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/line-breaks-after-white-space-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/line-breaks-after-white-space-expected.png deleted file mode 100644 index 3df01aab..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/line-breaks-after-white-space-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/line-initial-and-final-swashes-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/line-initial-and-final-swashes-expected.png deleted file mode 100644 index 52454b92..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/line-initial-and-final-swashes-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/selection/select-ligature-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/selection/select-ligature-1-expected.png deleted file mode 100644 index e56ceaa..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/selection/select-ligature-1-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/selection/select-ligature-vertical-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/selection/select-ligature-vertical-1-expected.png deleted file mode 100644 index 21a59c5..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/selection/select-ligature-vertical-1-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/shadow-no-blur-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/shadow-no-blur-expected.png deleted file mode 100644 index 38a136e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/shadow-no-blur-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/stroking-decorations-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/stroking-decorations-expected.png deleted file mode 100644 index 1ce47d45..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/stroking-decorations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/stroking-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/stroking-expected.png deleted file mode 100644 index 18f4db8..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/stroking-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/webfont-synthetic-bold-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/webfont-synthetic-bold-expected.png deleted file mode 100644 index c6bd6f0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/webfont-synthetic-bold-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/whitespace/022-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/whitespace/022-expected.png deleted file mode 100644 index 392ff2c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/whitespace/022-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/whitespace/024-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/whitespace/024-expected.png deleted file mode 100644 index 4c6385e..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/whitespace/024-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/whitespace/nbsp-mode-and-linewraps-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/whitespace/nbsp-mode-and-linewraps-expected.png deleted file mode 100644 index 75058e4..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/whitespace/nbsp-mode-and-linewraps-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/whitespace/pre-newline-box-test-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/whitespace/pre-newline-box-test-expected.png deleted file mode 100644 index 18787c6..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/text-antialias/whitespace/pre-newline-box-test-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/accessibility/css-styles-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/accessibility/css-styles-expected.txt deleted file mode 100644 index 4a6ee406..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/accessibility/css-styles-expected.txt +++ /dev/null
@@ -1,22 +0,0 @@ -This test ensures that various style attributes can be retrieved via the accessibility APIs. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS axHeading.color is 16711680 -PASS axHeading.fontSize is 12 -PASS axParagraph.color is 65280 -PASS axParagraph.fontSize is 14 -PASS axButton.color is 255 -PASS axButton.fontSize is 16 -PASS axText.color is 255 -PASS axText.fontSize is 16 -PASS successfullyParsed is true - -TEST COMPLETE - -Heading. - -Line one. -Line two. - -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/editing/selection/offset-from-point-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/editing/selection/offset-from-point-expected.txt deleted file mode 100644 index a53ede52..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/editing/selection/offset-from-point-expected.txt +++ /dev/null
@@ -1,112 +0,0 @@ -12 345 6789 - -12 345 6789 - -12 345 6789 - -12 345 6789 - -LTR -0=-1 (-1) -1=11 (12) -2=31 (20) -3=51 (20) -4=71 (20) -5=91 (20) -6=111 (20) -7=131 (20) -8=151 (20) -9=171 (20) -10=191 (20) -11=211 (20) -LTR (Complex Path) -0=-1 (-1) -1=11 (12) -2=31 (20) -3=51 (20) -4=71 (20) -5=91 (20) -6=111 (20) -7=131 (20) -8=151 (20) -9=171 (20) -10=191 (20) -11=211 (20) -RTL -11=-1 (-1) -8=11 (12) -9=31 (20) -10=51 (20) -7=71 (20) -6=91 (20) -4=111 (20) -5=131 (20) -3=151 (20) -2=171 (20) -1=191 (20) -0=211 (20) -RTL (Complex Path) -11=-1 (-1) -8=11 (12) -9=31 (20) -10=51 (20) -7=71 (20) -6=91 (20) -4=111 (20) -5=131 (20) -3=151 (20) -2=171 (20) -1=191 (20) -0=211 (20) -VERTICAL-LR -0=-1 (-1) -1=11 (12) -2=31 (20) -3=51 (20) -4=71 (20) -5=91 (20) -6=111 (20) -7=131 (20) -8=151 (20) -9=171 (20) -10=191 (20) -11=211 (20) -VERTICAL-LR (Complex Path) -0=-1 (-1) -1=11 (12) -2=31 (20) -3=51 (20) -4=71 (20) -5=91 (20) -6=111 (20) -7=131 (20) -8=151 (20) -9=171 (20) -10=191 (20) -11=211 (20) -VERTICAL-RL -0=-1 (-1) -1=11 (12) -2=31 (20) -3=51 (20) -4=71 (20) -5=91 (20) -6=111 (20) -7=131 (20) -8=151 (20) -9=171 (20) -10=191 (20) -11=211 (20) -VERTICAL-RL (Complex Path) -0=-1 (-1) -1=11 (12) -2=31 (20) -3=51 (20) -4=71 (20) -5=91 (20) -6=111 (20) -7=131 (20) -8=151 (20) -9=171 (20) -10=191 (20) -11=211 (20)
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/compression/idlharness-shadowrealm.window-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/compression/idlharness-shadowrealm.window-expected.txt deleted file mode 100644 index 2db45e1..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/compression/idlharness-shadowrealm.window-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -Harness Error. harness_status.status = 1 , harness_status.message = ReferenceError: ShadowRealm is not defined -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-animations/parsing/animation-computed-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-animations/parsing/animation-computed-expected.txt deleted file mode 100644 index 7cf62fe..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-animations/parsing/animation-computed-expected.txt +++ /dev/null
@@ -1,15 +0,0 @@ -This is a testharness.js-based test. -FAIL Default animation value assert_equals: expected "0s ease 0s 1 normal none running none" but got "none 0s ease 0s 1 normal none running" -PASS Property animation value '1s' -PASS Property animation value 'cubic-bezier(0, -2, 1, 3)' -PASS Property animation value '1s -3s' -PASS Property animation value '4' -PASS Property animation value 'reverse' -PASS Property animation value 'both' -PASS Property animation value 'paused' -PASS Property animation value 'none' -PASS Property animation value 'anim' -PASS Property animation value 'anim paused both reverse 4 1s -3s cubic-bezier(0, -2, 1, 3)' -PASS Property animation value 'anim paused both reverse, 4 1s -3s cubic-bezier(0, -2, 1, 3)' -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-animations/parsing/animation-name-computed-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-animations/parsing/animation-name-computed-expected.txt deleted file mode 100644 index bbe7ac5..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-animations/parsing/animation-name-computed-expected.txt +++ /dev/null
@@ -1,11 +0,0 @@ -This is a testharness.js-based test. -PASS Property animation-name value 'none' -PASS Property animation-name value 'foo' -PASS Property animation-name value 'Both' -PASS Property animation-name value 'ease-in' -PASS Property animation-name value 'infinite' -PASS Property animation-name value 'paused' -PASS Property animation-name value 'first, second, third' -FAIL Property animation-name value '"something"' assert_true: '"something"' is a supported value for animation-name. expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-color-adjust/inheritance-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-color-adjust/inheritance-expected.txt deleted file mode 100644 index 1686f10..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-color-adjust/inheritance-expected.txt +++ /dev/null
@@ -1,11 +0,0 @@ -This is a testharness.js-based test. -PASS Property color-scheme has initial value normal -PASS Property color-scheme inherits -FAIL Property color-adjust has initial value economy assert_true: color-adjust doesn't seem to be supported in the computed style expected true got false -FAIL Property color-adjust inherits assert_true: color-adjust doesn't seem to be supported in the computed style expected true got false -PASS Property forced-color-adjust has initial value auto -FAIL Property forced-color-adjust inherits assert_equals: expected "preserve-parent-color" but got "auto" -FAIL Property print-color-adjust has initial value economy assert_true: print-color-adjust doesn't seem to be supported in the computed style expected true got false -FAIL Property print-color-adjust inherits assert_true: print-color-adjust doesn't seem to be supported in the computed style expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-color-adjust/parsing/print-color-adjust-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-color-adjust/parsing/print-color-adjust-expected.txt deleted file mode 100644 index 1fbbb61..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-color-adjust/parsing/print-color-adjust-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -FAIL e.style['print-color-adjust'] = "exact" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['print-color-adjust'] = "economy" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color-adjust'] = "exact" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['color-adjust'] = "economy" should set the property value assert_not_equals: property should be set got disallowed value "" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-grid/parsing/grid-area-computed-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-grid/parsing/grid-area-computed-expected.txt deleted file mode 100644 index d430e287..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-grid/parsing/grid-area-computed-expected.txt +++ /dev/null
@@ -1,32 +0,0 @@ -This is a testharness.js-based test. -PASS Property grid-area value 'auto / auto / auto / auto' -PASS Property grid-row value 'auto / auto' -PASS Property grid-column-end value 'auto' -PASS Property grid-row value '-zπ' -PASS Property grid-row-start value 'AZ' -PASS Property grid-column-start value '-_π' -PASS Property grid-row-end value '_9' -PASS Property grid-area value '1 / 90 -a- / auto / auto' -PASS Property grid-row value '2 az / auto' -PASS Property grid-column value '9 / -19 zA' -PASS Property grid-row-start value '-19' -PASS Property grid-row-start value '9 -Z_' -PASS Property grid-column-start value '-44 Z' -PASS Property grid-row-end value '1 -πA' -PASS Property grid-column-end value '5 π_' -PASS Property grid-area value 'span 2 i / auto / auto / auto' -PASS Property grid-row value 'span 2 / auto' -PASS Property grid-column-start value 'span 1 i' -PASS Property grid-row-end value 'span 2 i' -PASS Property grid-column-end value 'span 2' -FAIL Property grid-row-start value 'span i' assert_equals: expected "span i" but got "span 1 i" -FAIL Property grid-row value 'span i / auto' assert_in_array: value "span 1 i / auto" not in array ["span i", "span i / auto"] -PASS Property grid-area value 'auto / i / auto / i' -PASS Property grid-area value 'auto / i / 2 j' -PASS Property grid-area value 'auto / i / 2 j / span 3 k' -PASS Property grid-row value 'auto / i' -PASS Property grid-column value '2 j / span 3 k' -PASS Property grid-column-end value '\31st' -PASS Property grid-column-end value '\31 st' -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-text/parsing/hyphenate-character-computed-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-text/parsing/hyphenate-character-computed-expected.txt deleted file mode 100644 index 478d302..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-text/parsing/hyphenate-character-computed-expected.txt +++ /dev/null
@@ -1,8 +0,0 @@ -This is a testharness.js-based test. -FAIL Property hyphenate-character value 'auto' assert_true: hyphenate-character doesn't seem to be supported in the computed style expected true got false -FAIL Property hyphenate-character value '"="' assert_true: hyphenate-character doesn't seem to be supported in the computed style expected true got false -FAIL Property hyphenate-character value '"/-/"' assert_true: hyphenate-character doesn't seem to be supported in the computed style expected true got false -FAIL Property hyphenate-character value '"\1400"' assert_true: hyphenate-character doesn't seem to be supported in the computed style expected true got false -FAIL Property hyphenate-character value '""' assert_true: hyphenate-character doesn't seem to be supported in the computed style expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-text/parsing/hyphenate-character-valid-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-text/parsing/hyphenate-character-valid-expected.txt deleted file mode 100644 index d08ec19..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-text/parsing/hyphenate-character-valid-expected.txt +++ /dev/null
@@ -1,8 +0,0 @@ -This is a testharness.js-based test. -FAIL e.style['hyphenate-character'] = "auto" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['hyphenate-character'] = "\"=\"" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['hyphenate-character'] = "\"/-/\"" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['hyphenate-character'] = "\"\\1400\"" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['hyphenate-character'] = "\"\"" should set the property value assert_not_equals: property should be set got disallowed value "" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-ui/parsing/cursor-valid-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-ui/parsing/cursor-valid-expected.txt deleted file mode 100644 index c14f52fc..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/css-ui/parsing/cursor-valid-expected.txt +++ /dev/null
@@ -1,45 +0,0 @@ -This is a testharness.js-based test. -PASS e.style['cursor'] = "auto" should set the property value -PASS e.style['cursor'] = "default" should set the property value -PASS e.style['cursor'] = "none" should set the property value -PASS e.style['cursor'] = "context-menu" should set the property value -PASS e.style['cursor'] = "help" should set the property value -PASS e.style['cursor'] = "pointer" should set the property value -PASS e.style['cursor'] = "progress" should set the property value -PASS e.style['cursor'] = "wait" should set the property value -PASS e.style['cursor'] = "cell" should set the property value -PASS e.style['cursor'] = "crosshair" should set the property value -PASS e.style['cursor'] = "text" should set the property value -PASS e.style['cursor'] = "vertical-text" should set the property value -PASS e.style['cursor'] = "alias" should set the property value -PASS e.style['cursor'] = "copy" should set the property value -PASS e.style['cursor'] = "move" should set the property value -PASS e.style['cursor'] = "no-drop" should set the property value -PASS e.style['cursor'] = "not-allowed" should set the property value -PASS e.style['cursor'] = "grab" should set the property value -PASS e.style['cursor'] = "grabbing" should set the property value -PASS e.style['cursor'] = "e-resize" should set the property value -PASS e.style['cursor'] = "n-resize" should set the property value -PASS e.style['cursor'] = "ne-resize" should set the property value -PASS e.style['cursor'] = "nw-resize" should set the property value -PASS e.style['cursor'] = "s-resize" should set the property value -PASS e.style['cursor'] = "se-resize" should set the property value -PASS e.style['cursor'] = "sw-resize" should set the property value -PASS e.style['cursor'] = "w-resize" should set the property value -PASS e.style['cursor'] = "ew-resize" should set the property value -PASS e.style['cursor'] = "ns-resize" should set the property value -PASS e.style['cursor'] = "nesw-resize" should set the property value -PASS e.style['cursor'] = "nwse-resize" should set the property value -PASS e.style['cursor'] = "col-resize" should set the property value -PASS e.style['cursor'] = "row-resize" should set the property value -PASS e.style['cursor'] = "all-scroll" should set the property value -PASS e.style['cursor'] = "zoom-in" should set the property value -PASS e.style['cursor'] = "zoom-out" should set the property value -PASS e.style['cursor'] = "url(\"https://example.com/\"), alias" should set the property value -PASS e.style['cursor'] = "url(\"https://example.com/\") 1 calc(2 + 0), copy" should set the property value -PASS e.style['cursor'] = "url(\"https://example.com/\"), url(\"https://example.com/\") 3 -4, move" should set the property value -PASS e.style['cursor'] = "url(\"https://example.com/\") 5 6, grab" should set the property value -FAIL e.style['cursor'] = "image-set(\"https://example.com/\" 1x) 5 6, grab" should set the property value assert_not_equals: property should be set got disallowed value "" -FAIL e.style['cursor'] = "image-set(\"https://example.com/\" 1x, \"https://example.com/highres\" 2x) 5 6, grab" should set the property value assert_not_equals: property should be set got disallowed value "" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/cssom/font-family-serialization-001-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/cssom/font-family-serialization-001-expected.txt deleted file mode 100644 index 4add149..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/cssom/font-family-serialization-001-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -PASS Serialization of <generic-family> -FAIL Serialization of quoted "<generic-family>" assert_equals: expected "\"emoji\"" but got "emoji" -PASS Serialization of prefixed -webkit-<generic-family> -PASS Serialization of NonGenericFontFamilyName,-webkit-body,-webkit-standard,-webkit-pictograph,BlinkMacSystemFont -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/mediaqueries/mq-invalid-media-type-layer-002-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/mediaqueries/mq-invalid-media-type-layer-002-expected.txt deleted file mode 100644 index a2b6836..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/mediaqueries/mq-invalid-media-type-layer-002-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL 'layer' used as media types is a syntax error assert_equals: expected "not all" but got "not layer" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/mediaqueries/test_media_queries-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/mediaqueries/test_media_queries-expected.txt deleted file mode 100644 index ad63152..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/mediaqueries/test_media_queries-expected.txt +++ /dev/null
@@ -1,845 +0,0 @@ -This is a testharness.js-based test. -Found 839 tests; 598 PASS, 241 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS query_should_be_parseable: (orientation) -FAIL query_should_be_parseable: not (orientation) assert_true: expected true got false -PASS query_should_not_be_parseable: only (orientation) -PASS query_should_be_parseable: all and (orientation) -PASS query_should_be_parseable: not all and (orientation) -PASS query_should_be_parseable: only all and (orientation) -PASS query_should_not_be_parseable: not not (orientation) -PASS query_should_be_parseable: (orientation) and (orientation) -FAIL query_should_be_parseable: (orientation) or (orientation) assert_true: expected true got false -FAIL query_should_be_parseable: (orientation) or ((orientation) and ((orientation) or (orientation) or (not (orientation)))) assert_true: expected true got false -PASS query_should_not_be_parseable: all and (orientation) or (orientation) -PASS query_should_be_parseable: all and (orientation) and (orientation) -PASS query_should_not_be_parseable: (orientation) and (orientation) or (orientation) -PASS query_should_not_be_parseable: (orientation) and not (orientation) -PASS expression_should_be_parseable: width -PASS expression_should_not_be_parseable: min-width -PASS expression_should_not_be_parseable: max-width -PASS expression_should_be_parseable: width : 0 -PASS expression_should_be_parseable: width : 0px -PASS expression_should_be_parseable: width : 0em -PASS expression_should_be_parseable: width : -0 -PASS expression_should_be_parseable: width : -0cm -PASS expression_should_be_parseable: width : 1px -PASS expression_should_be_parseable: width : 0.001mm -PASS expression_should_be_parseable: width : 100000px -PASS expression_should_be_parseable: min-width : -0 -PASS expression_should_be_parseable: max-width : -0 -PASS expression_should_not_be_parseable: width : -1px -PASS expression_should_not_be_parseable: min-width : -1px -PASS expression_should_not_be_parseable: max-width : -1px -PASS expression_should_not_be_parseable: width : -0.00001mm -PASS expression_should_not_be_parseable: width : -100000em -FAIL expression_should_be_parseable: width > 0 assert_true: expected true got false -FAIL expression_should_be_parseable: width > 0px assert_true: expected true got false -FAIL expression_should_be_parseable: width > 0em assert_true: expected true got false -FAIL expression_should_be_parseable: width > -0 assert_true: expected true got false -FAIL expression_should_be_parseable: width > -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: width > 1px assert_true: expected true got false -FAIL expression_should_be_parseable: width > 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: width > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-width > -0 -PASS expression_should_not_be_parseable: max-width > -0 -FAIL expression_should_be_parseable: 0px > width > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: width > -1px -PASS expression_should_not_be_parseable: min-width > -1px -PASS expression_should_not_be_parseable: max-width > -1px -PASS expression_should_not_be_parseable: width > -0.00001mm -PASS expression_should_not_be_parseable: width > -100000em -FAIL expression_should_be_parseable: width >= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: width >= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: width >= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: width >= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: width >= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: width >= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: width >= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: width >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-width >= -0 -PASS expression_should_not_be_parseable: max-width >= -0 -FAIL expression_should_be_parseable: 0px >= width >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: width > = 0px -PASS expression_should_not_be_parseable: width >= -1px -PASS expression_should_not_be_parseable: min-width >= -1px -PASS expression_should_not_be_parseable: max-width >= -1px -PASS expression_should_not_be_parseable: width >= -0.00001mm -PASS expression_should_not_be_parseable: width >= -100000em -FAIL expression_should_be_parseable: width = 0 assert_true: expected true got false -FAIL expression_should_be_parseable: width = 0px assert_true: expected true got false -FAIL expression_should_be_parseable: width = 0em assert_true: expected true got false -FAIL expression_should_be_parseable: width = -0 assert_true: expected true got false -FAIL expression_should_be_parseable: width = -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: width = 1px assert_true: expected true got false -FAIL expression_should_be_parseable: width = 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: width = 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-width = -0 -PASS expression_should_not_be_parseable: max-width = -0 -PASS expression_should_not_be_parseable: 0px = width = 100000px -PASS expression_should_not_be_parseable: width = -1px -PASS expression_should_not_be_parseable: min-width = -1px -PASS expression_should_not_be_parseable: max-width = -1px -PASS expression_should_not_be_parseable: width = -0.00001mm -PASS expression_should_not_be_parseable: width = -100000em -FAIL expression_should_be_parseable: width <= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: width <= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: width <= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: width <= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: width <= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: width <= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: width <= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: width <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-width <= -0 -PASS expression_should_not_be_parseable: max-width <= -0 -FAIL expression_should_be_parseable: 0px <= width <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: width < = 0px -PASS expression_should_not_be_parseable: width <= -1px -PASS expression_should_not_be_parseable: min-width <= -1px -PASS expression_should_not_be_parseable: max-width <= -1px -PASS expression_should_not_be_parseable: width <= -0.00001mm -PASS expression_should_not_be_parseable: width <= -100000em -FAIL expression_should_be_parseable: width < 0 assert_true: expected true got false -FAIL expression_should_be_parseable: width < 0px assert_true: expected true got false -FAIL expression_should_be_parseable: width < 0em assert_true: expected true got false -FAIL expression_should_be_parseable: width < -0 assert_true: expected true got false -FAIL expression_should_be_parseable: width < -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: width < 1px assert_true: expected true got false -FAIL expression_should_be_parseable: width < 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: width < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-width < -0 -PASS expression_should_not_be_parseable: max-width < -0 -FAIL expression_should_be_parseable: 0px < width < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: width < -1px -PASS expression_should_not_be_parseable: min-width < -1px -PASS expression_should_not_be_parseable: max-width < -1px -PASS expression_should_not_be_parseable: width < -0.00001mm -PASS expression_should_not_be_parseable: width < -100000em -PASS expression_should_be_parseable: height -PASS expression_should_not_be_parseable: min-height -PASS expression_should_not_be_parseable: max-height -PASS expression_should_be_parseable: height : 0 -PASS expression_should_be_parseable: height : 0px -PASS expression_should_be_parseable: height : 0em -PASS expression_should_be_parseable: height : -0 -PASS expression_should_be_parseable: height : -0cm -PASS expression_should_be_parseable: height : 1px -PASS expression_should_be_parseable: height : 0.001mm -PASS expression_should_be_parseable: height : 100000px -PASS expression_should_be_parseable: min-height : -0 -PASS expression_should_be_parseable: max-height : -0 -PASS expression_should_not_be_parseable: height : -1px -PASS expression_should_not_be_parseable: min-height : -1px -PASS expression_should_not_be_parseable: max-height : -1px -PASS expression_should_not_be_parseable: height : -0.00001mm -PASS expression_should_not_be_parseable: height : -100000em -FAIL expression_should_be_parseable: height > 0 assert_true: expected true got false -FAIL expression_should_be_parseable: height > 0px assert_true: expected true got false -FAIL expression_should_be_parseable: height > 0em assert_true: expected true got false -FAIL expression_should_be_parseable: height > -0 assert_true: expected true got false -FAIL expression_should_be_parseable: height > -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: height > 1px assert_true: expected true got false -FAIL expression_should_be_parseable: height > 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: height > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-height > -0 -PASS expression_should_not_be_parseable: max-height > -0 -FAIL expression_should_be_parseable: 0px > height > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: height > -1px -PASS expression_should_not_be_parseable: min-height > -1px -PASS expression_should_not_be_parseable: max-height > -1px -PASS expression_should_not_be_parseable: height > -0.00001mm -PASS expression_should_not_be_parseable: height > -100000em -FAIL expression_should_be_parseable: height >= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: height >= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: height >= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: height >= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: height >= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: height >= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: height >= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: height >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-height >= -0 -PASS expression_should_not_be_parseable: max-height >= -0 -FAIL expression_should_be_parseable: 0px >= height >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: height > = 0px -PASS expression_should_not_be_parseable: height >= -1px -PASS expression_should_not_be_parseable: min-height >= -1px -PASS expression_should_not_be_parseable: max-height >= -1px -PASS expression_should_not_be_parseable: height >= -0.00001mm -PASS expression_should_not_be_parseable: height >= -100000em -FAIL expression_should_be_parseable: height = 0 assert_true: expected true got false -FAIL expression_should_be_parseable: height = 0px assert_true: expected true got false -FAIL expression_should_be_parseable: height = 0em assert_true: expected true got false -FAIL expression_should_be_parseable: height = -0 assert_true: expected true got false -FAIL expression_should_be_parseable: height = -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: height = 1px assert_true: expected true got false -FAIL expression_should_be_parseable: height = 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: height = 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-height = -0 -PASS expression_should_not_be_parseable: max-height = -0 -PASS expression_should_not_be_parseable: 0px = height = 100000px -PASS expression_should_not_be_parseable: height = -1px -PASS expression_should_not_be_parseable: min-height = -1px -PASS expression_should_not_be_parseable: max-height = -1px -PASS expression_should_not_be_parseable: height = -0.00001mm -PASS expression_should_not_be_parseable: height = -100000em -FAIL expression_should_be_parseable: height <= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: height <= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: height <= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: height <= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: height <= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: height <= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: height <= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: height <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-height <= -0 -PASS expression_should_not_be_parseable: max-height <= -0 -FAIL expression_should_be_parseable: 0px <= height <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: height < = 0px -PASS expression_should_not_be_parseable: height <= -1px -PASS expression_should_not_be_parseable: min-height <= -1px -PASS expression_should_not_be_parseable: max-height <= -1px -PASS expression_should_not_be_parseable: height <= -0.00001mm -PASS expression_should_not_be_parseable: height <= -100000em -FAIL expression_should_be_parseable: height < 0 assert_true: expected true got false -FAIL expression_should_be_parseable: height < 0px assert_true: expected true got false -FAIL expression_should_be_parseable: height < 0em assert_true: expected true got false -FAIL expression_should_be_parseable: height < -0 assert_true: expected true got false -FAIL expression_should_be_parseable: height < -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: height < 1px assert_true: expected true got false -FAIL expression_should_be_parseable: height < 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: height < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-height < -0 -PASS expression_should_not_be_parseable: max-height < -0 -FAIL expression_should_be_parseable: 0px < height < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: height < -1px -PASS expression_should_not_be_parseable: min-height < -1px -PASS expression_should_not_be_parseable: max-height < -1px -PASS expression_should_not_be_parseable: height < -0.00001mm -PASS expression_should_not_be_parseable: height < -100000em -PASS expression_should_be_parseable: device-width -PASS expression_should_not_be_parseable: min-device-width -PASS expression_should_not_be_parseable: max-device-width -PASS expression_should_be_parseable: device-width : 0 -PASS expression_should_be_parseable: device-width : 0px -PASS expression_should_be_parseable: device-width : 0em -PASS expression_should_be_parseable: device-width : -0 -PASS expression_should_be_parseable: device-width : -0cm -PASS expression_should_be_parseable: device-width : 1px -PASS expression_should_be_parseable: device-width : 0.001mm -PASS expression_should_be_parseable: device-width : 100000px -PASS expression_should_be_parseable: min-device-width : -0 -PASS expression_should_be_parseable: max-device-width : -0 -PASS expression_should_not_be_parseable: device-width : -1px -PASS expression_should_not_be_parseable: min-device-width : -1px -PASS expression_should_not_be_parseable: max-device-width : -1px -PASS expression_should_not_be_parseable: device-width : -0.00001mm -PASS expression_should_not_be_parseable: device-width : -100000em -FAIL expression_should_be_parseable: device-width > 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-width > -0 -PASS expression_should_not_be_parseable: max-device-width > -0 -FAIL expression_should_be_parseable: 0px > device-width > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-width > -1px -PASS expression_should_not_be_parseable: min-device-width > -1px -PASS expression_should_not_be_parseable: max-device-width > -1px -PASS expression_should_not_be_parseable: device-width > -0.00001mm -PASS expression_should_not_be_parseable: device-width > -100000em -FAIL expression_should_be_parseable: device-width >= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-width >= -0 -PASS expression_should_not_be_parseable: max-device-width >= -0 -FAIL expression_should_be_parseable: 0px >= device-width >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-width > = 0px -PASS expression_should_not_be_parseable: device-width >= -1px -PASS expression_should_not_be_parseable: min-device-width >= -1px -PASS expression_should_not_be_parseable: max-device-width >= -1px -PASS expression_should_not_be_parseable: device-width >= -0.00001mm -PASS expression_should_not_be_parseable: device-width >= -100000em -FAIL expression_should_be_parseable: device-width = 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-width = -0 -PASS expression_should_not_be_parseable: max-device-width = -0 -PASS expression_should_not_be_parseable: 0px = device-width = 100000px -PASS expression_should_not_be_parseable: device-width = -1px -PASS expression_should_not_be_parseable: min-device-width = -1px -PASS expression_should_not_be_parseable: max-device-width = -1px -PASS expression_should_not_be_parseable: device-width = -0.00001mm -PASS expression_should_not_be_parseable: device-width = -100000em -FAIL expression_should_be_parseable: device-width <= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-width <= -0 -PASS expression_should_not_be_parseable: max-device-width <= -0 -FAIL expression_should_be_parseable: 0px <= device-width <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-width < = 0px -PASS expression_should_not_be_parseable: device-width <= -1px -PASS expression_should_not_be_parseable: min-device-width <= -1px -PASS expression_should_not_be_parseable: max-device-width <= -1px -PASS expression_should_not_be_parseable: device-width <= -0.00001mm -PASS expression_should_not_be_parseable: device-width <= -100000em -FAIL expression_should_be_parseable: device-width < 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-width < -0 -PASS expression_should_not_be_parseable: max-device-width < -0 -FAIL expression_should_be_parseable: 0px < device-width < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-width < -1px -PASS expression_should_not_be_parseable: min-device-width < -1px -PASS expression_should_not_be_parseable: max-device-width < -1px -PASS expression_should_not_be_parseable: device-width < -0.00001mm -PASS expression_should_not_be_parseable: device-width < -100000em -PASS expression_should_be_parseable: device-height -PASS expression_should_not_be_parseable: min-device-height -PASS expression_should_not_be_parseable: max-device-height -PASS expression_should_be_parseable: device-height : 0 -PASS expression_should_be_parseable: device-height : 0px -PASS expression_should_be_parseable: device-height : 0em -PASS expression_should_be_parseable: device-height : -0 -PASS expression_should_be_parseable: device-height : -0cm -PASS expression_should_be_parseable: device-height : 1px -PASS expression_should_be_parseable: device-height : 0.001mm -PASS expression_should_be_parseable: device-height : 100000px -PASS expression_should_be_parseable: min-device-height : -0 -PASS expression_should_be_parseable: max-device-height : -0 -PASS expression_should_not_be_parseable: device-height : -1px -PASS expression_should_not_be_parseable: min-device-height : -1px -PASS expression_should_not_be_parseable: max-device-height : -1px -PASS expression_should_not_be_parseable: device-height : -0.00001mm -PASS expression_should_not_be_parseable: device-height : -100000em -FAIL expression_should_be_parseable: device-height > 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-height > -0 -PASS expression_should_not_be_parseable: max-device-height > -0 -FAIL expression_should_be_parseable: 0px > device-height > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-height > -1px -PASS expression_should_not_be_parseable: min-device-height > -1px -PASS expression_should_not_be_parseable: max-device-height > -1px -PASS expression_should_not_be_parseable: device-height > -0.00001mm -PASS expression_should_not_be_parseable: device-height > -100000em -FAIL expression_should_be_parseable: device-height >= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-height >= -0 -PASS expression_should_not_be_parseable: max-device-height >= -0 -FAIL expression_should_be_parseable: 0px >= device-height >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-height > = 0px -PASS expression_should_not_be_parseable: device-height >= -1px -PASS expression_should_not_be_parseable: min-device-height >= -1px -PASS expression_should_not_be_parseable: max-device-height >= -1px -PASS expression_should_not_be_parseable: device-height >= -0.00001mm -PASS expression_should_not_be_parseable: device-height >= -100000em -FAIL expression_should_be_parseable: device-height = 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-height = -0 -PASS expression_should_not_be_parseable: max-device-height = -0 -PASS expression_should_not_be_parseable: 0px = device-height = 100000px -PASS expression_should_not_be_parseable: device-height = -1px -PASS expression_should_not_be_parseable: min-device-height = -1px -PASS expression_should_not_be_parseable: max-device-height = -1px -PASS expression_should_not_be_parseable: device-height = -0.00001mm -PASS expression_should_not_be_parseable: device-height = -100000em -FAIL expression_should_be_parseable: device-height <= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-height <= -0 -PASS expression_should_not_be_parseable: max-device-height <= -0 -FAIL expression_should_be_parseable: 0px <= device-height <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-height < = 0px -PASS expression_should_not_be_parseable: device-height <= -1px -PASS expression_should_not_be_parseable: min-device-height <= -1px -PASS expression_should_not_be_parseable: max-device-height <= -1px -PASS expression_should_not_be_parseable: device-height <= -0.00001mm -PASS expression_should_not_be_parseable: device-height <= -100000em -FAIL expression_should_be_parseable: device-height < 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-height < -0 -PASS expression_should_not_be_parseable: max-device-height < -0 -FAIL expression_should_be_parseable: 0px < device-height < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-height < -1px -PASS expression_should_not_be_parseable: min-device-height < -1px -PASS expression_should_not_be_parseable: max-device-height < -1px -PASS expression_should_not_be_parseable: device-height < -0.00001mm -PASS expression_should_not_be_parseable: device-height < -100000em -PASS should_apply: all and (width: ${value}px) -FAIL should_apply: all and (width = ${value}px) assert_true: expected true got false -PASS should_not_apply: all and (width: ${value + 1}px) -PASS should_not_apply: all and (width: ${value - 1}px) -PASS should_not_apply: all and (width = ${value + 1}px) -PASS should_not_apply: all and (width = ${value - 1}px) -PASS should_apply: all and (min-width: ${value}px) -PASS should_not_apply: all and (min-width: ${value + 1}px) -PASS should_apply: all and (min-width: ${value - 1}px) -PASS should_apply: all and (max-width: ${value}px) -PASS should_apply: all and (max-width: ${value + 1}px) -PASS should_not_apply: all and (max-width: ${value - 1}px) -PASS should_not_apply: all and (min-width: ${Math.ceil(value/em_size) + 1}em) -PASS should_apply: all and (min-width: ${Math.floor(value/em_size) - 1}em) -PASS should_apply: all and (max-width: ${Math.ceil(value/em_size) + 1}em) -PASS should_not_apply: all and (max-width: ${Math.floor(value/em_size) - 1}em) -FAIL should_apply: (width <= ${value}px) assert_true: expected true got false -FAIL should_apply: (width >= ${value}px) assert_true: expected true got false -FAIL should_apply: (0px < width <= ${value}px) assert_true: expected true got false -FAIL should_apply: (${value}px >= width > 0px) assert_true: expected true got false -PASS should_not_apply: (0px < width < ${value}px) -PASS should_not_apply: (${value}px > width > 0px) -PASS should_not_apply: (width < ${value}px) -PASS should_not_apply: (width > ${value}px) -FAIL should_apply: (width < ${value + 1}px) assert_true: expected true got false -FAIL should_apply: (width <= ${value + 1}px) assert_true: expected true got false -PASS should_not_apply: (width > ${value + 1}px) -PASS should_not_apply: (width >= ${value + 1}px) -FAIL should_apply: (width > ${value - 1}px) assert_true: expected true got false -FAIL should_apply: (width >= ${value - 1}px) assert_true: expected true got false -PASS should_not_apply: (width < ${value - 1}px) -PASS should_not_apply: (width <= ${value - 1}px) -PASS should_apply: all and (height: ${value}px) -FAIL should_apply: all and (height = ${value}px) assert_true: expected true got false -PASS should_not_apply: all and (height: ${value + 1}px) -PASS should_not_apply: all and (height: ${value - 1}px) -PASS should_not_apply: all and (height = ${value + 1}px) -PASS should_not_apply: all and (height = ${value - 1}px) -PASS should_apply: all and (min-height: ${value}px) -PASS should_not_apply: all and (min-height: ${value + 1}px) -PASS should_apply: all and (min-height: ${value - 1}px) -PASS should_apply: all and (max-height: ${value}px) -PASS should_apply: all and (max-height: ${value + 1}px) -PASS should_not_apply: all and (max-height: ${value - 1}px) -PASS should_not_apply: all and (min-height: ${Math.ceil(value/em_size) + 1}em) -PASS should_apply: all and (min-height: ${Math.floor(value/em_size) - 1}em) -PASS should_apply: all and (max-height: ${Math.ceil(value/em_size) + 1}em) -PASS should_not_apply: all and (max-height: ${Math.floor(value/em_size) - 1}em) -FAIL should_apply: (height <= ${value}px) assert_true: expected true got false -FAIL should_apply: (height >= ${value}px) assert_true: expected true got false -FAIL should_apply: (0px < height <= ${value}px) assert_true: expected true got false -FAIL should_apply: (${value}px >= height > 0px) assert_true: expected true got false -PASS should_not_apply: (0px < height < ${value}px) -PASS should_not_apply: (${value}px > height > 0px) -PASS should_not_apply: (height < ${value}px) -PASS should_not_apply: (height > ${value}px) -FAIL should_apply: (height < ${value + 1}px) assert_true: expected true got false -FAIL should_apply: (height <= ${value + 1}px) assert_true: expected true got false -PASS should_not_apply: (height > ${value + 1}px) -PASS should_not_apply: (height >= ${value + 1}px) -FAIL should_apply: (height > ${value - 1}px) assert_true: expected true got false -FAIL should_apply: (height >= ${value - 1}px) assert_true: expected true got false -PASS should_not_apply: (height < ${value - 1}px) -PASS should_not_apply: (height <= ${value - 1}px) -PASS should_apply: all and (device-width: ${value}px) -FAIL should_apply: all and (device-width = ${value}px) assert_true: expected true got false -PASS should_not_apply: all and (device-width: ${value + 1}px) -PASS should_not_apply: all and (device-width: ${value - 1}px) -PASS should_not_apply: all and (device-width = ${value + 1}px) -PASS should_not_apply: all and (device-width = ${value - 1}px) -PASS should_apply: all and (min-device-width: ${value}px) -PASS should_not_apply: all and (min-device-width: ${value + 1}px) -PASS should_apply: all and (min-device-width: ${value - 1}px) -PASS should_apply: all and (max-device-width: ${value}px) -PASS should_apply: all and (max-device-width: ${value + 1}px) -PASS should_not_apply: all and (max-device-width: ${value - 1}px) -PASS should_not_apply: all and (min-device-width: ${Math.ceil(value/em_size) + 1}em) -PASS should_apply: all and (min-device-width: ${Math.floor(value/em_size) - 1}em) -PASS should_apply: all and (max-device-width: ${Math.ceil(value/em_size) + 1}em) -PASS should_not_apply: all and (max-device-width: ${Math.floor(value/em_size) - 1}em) -FAIL should_apply: (device-width <= ${value}px) assert_true: expected true got false -FAIL should_apply: (device-width >= ${value}px) assert_true: expected true got false -FAIL should_apply: (0px < device-width <= ${value}px) assert_true: expected true got false -FAIL should_apply: (${value}px >= device-width > 0px) assert_true: expected true got false -PASS should_not_apply: (0px < device-width < ${value}px) -PASS should_not_apply: (${value}px > device-width > 0px) -PASS should_not_apply: (device-width < ${value}px) -PASS should_not_apply: (device-width > ${value}px) -FAIL should_apply: (device-width < ${value + 1}px) assert_true: expected true got false -FAIL should_apply: (device-width <= ${value + 1}px) assert_true: expected true got false -PASS should_not_apply: (device-width > ${value + 1}px) -PASS should_not_apply: (device-width >= ${value + 1}px) -FAIL should_apply: (device-width > ${value - 1}px) assert_true: expected true got false -FAIL should_apply: (device-width >= ${value - 1}px) assert_true: expected true got false -PASS should_not_apply: (device-width < ${value - 1}px) -PASS should_not_apply: (device-width <= ${value - 1}px) -PASS should_apply: all and (device-height: ${value}px) -FAIL should_apply: all and (device-height = ${value}px) assert_true: expected true got false -PASS should_not_apply: all and (device-height: ${value + 1}px) -PASS should_not_apply: all and (device-height: ${value - 1}px) -PASS should_not_apply: all and (device-height = ${value + 1}px) -PASS should_not_apply: all and (device-height = ${value - 1}px) -PASS should_apply: all and (min-device-height: ${value}px) -PASS should_not_apply: all and (min-device-height: ${value + 1}px) -PASS should_apply: all and (min-device-height: ${value - 1}px) -PASS should_apply: all and (max-device-height: ${value}px) -PASS should_apply: all and (max-device-height: ${value + 1}px) -PASS should_not_apply: all and (max-device-height: ${value - 1}px) -PASS should_not_apply: all and (min-device-height: ${Math.ceil(value/em_size) + 1}em) -PASS should_apply: all and (min-device-height: ${Math.floor(value/em_size) - 1}em) -PASS should_apply: all and (max-device-height: ${Math.ceil(value/em_size) + 1}em) -PASS should_not_apply: all and (max-device-height: ${Math.floor(value/em_size) - 1}em) -FAIL should_apply: (device-height <= ${value}px) assert_true: expected true got false -FAIL should_apply: (device-height >= ${value}px) assert_true: expected true got false -FAIL should_apply: (0px < device-height <= ${value}px) assert_true: expected true got false -FAIL should_apply: (${value}px >= device-height > 0px) assert_true: expected true got false -PASS should_not_apply: (0px < device-height < ${value}px) -PASS should_not_apply: (${value}px > device-height > 0px) -PASS should_not_apply: (device-height < ${value}px) -PASS should_not_apply: (device-height > ${value}px) -FAIL should_apply: (device-height < ${value + 1}px) assert_true: expected true got false -FAIL should_apply: (device-height <= ${value + 1}px) assert_true: expected true got false -PASS should_not_apply: (device-height > ${value + 1}px) -PASS should_not_apply: (device-height >= ${value + 1}px) -FAIL should_apply: (device-height > ${value - 1}px) assert_true: expected true got false -FAIL should_apply: (device-height >= ${value - 1}px) assert_true: expected true got false -PASS should_not_apply: (device-height < ${value - 1}px) -PASS should_not_apply: (device-height <= ${value - 1}px) -PASS width = 0, height != 0: should_apply: all and (height) -PASS width = 0, height != 0: should_not_apply: all and (width) -PASS width = 0, height = 0: should_not_apply: all and (height) -PASS width = 0, height = 0: should_not_apply: all and (width) -PASS width = 0, height = 0: should_apply: all and (device-height) -PASS width = 0, height = 0: should_apply: all and (device-width) -PASS width != 0, height = 0: should_not_apply: all and (height) -PASS width != 0, height = 0: should_apply: all and (width) -PASS width != 0, height != 0: should_apply: all and (height) -PASS width != 0, height != 0: should_apply: all and (width) -PASS ratio that reduces to 59/40: expression_should_be_parseable: orientation -PASS ratio that reduces to 59/40: expression_should_be_parseable: orientation: portrait -PASS ratio that reduces to 59/40: expression_should_be_parseable: orientation: landscape -PASS ratio that reduces to 59/40: expression_should_not_be_parseable: min-orientation -PASS ratio that reduces to 59/40: expression_should_not_be_parseable: min-orientation: portrait -PASS ratio that reduces to 59/40: expression_should_not_be_parseable: min-orientation: landscape -PASS ratio that reduces to 59/40: expression_should_not_be_parseable: max-orientation -PASS ratio that reduces to 59/40: expression_should_not_be_parseable: max-orientation: portrait -PASS ratio that reduces to 59/40: expression_should_not_be_parseable: max-orientation: landscape -PASS ratio that reduces to 59/40: should_apply: (orientation) -PASS ratio that reduces to 59/40: should_apply: (orientation: landscape) -PASS ratio that reduces to 59/40: should_not_apply: (orientation: portrait) -PASS ratio that reduces to 59/40: should_apply: not all and (orientation: portrait) -PASS ratio that reduces to 59/80: should_apply: (orientation) -PASS ratio that reduces to 59/80: should_not_apply: (orientation: landscape) -PASS ratio that reduces to 59/80: should_apply: not all and (orientation: landscape) -PASS ratio that reduces to 59/80: should_apply: (orientation: portrait) -PASS should_apply: (aspect-ratio: 59/80) -PASS should_not_apply: (aspect-ratio: 58/80) -PASS should_not_apply: (aspect-ratio: 59/81) -PASS should_not_apply: (aspect-ratio: 60/80) -PASS should_not_apply: (aspect-ratio: 59/79) -PASS should_apply: (aspect-ratio: 177/240) -PASS should_apply: (aspect-ratio: 413/560) -PASS should_apply: (aspect-ratio: 5900/8000) -PASS should_not_apply: (aspect-ratio: 5901/8000) -PASS should_not_apply: (aspect-ratio: 5899/8000) -PASS should_not_apply: (aspect-ratio: 5900/8001) -PASS should_not_apply: (aspect-ratio: 5900/7999) -PASS should_apply: (aspect-ratio) -PASS should_apply: (min-aspect-ratio: 59/80) -PASS should_apply: (min-aspect-ratio: 58/80) -PASS should_apply: (min-aspect-ratio: 59/81) -PASS should_not_apply: (min-aspect-ratio: 60/80) -PASS should_not_apply: (min-aspect-ratio: 59/79) -PASS expression_should_not_be_parseable: min-aspect-ratio -PASS should_apply: (max-aspect-ratio: 59/80) -PASS should_not_apply: (max-aspect-ratio: 58/80) -PASS should_not_apply: (max-aspect-ratio: 59/81) -PASS should_apply: (max-aspect-ratio: 60/80) -PASS should_apply: (max-aspect-ratio: 59/79) -PASS expression_should_not_be_parseable: max-aspect-ratio -PASS should_apply: (device-aspect-ratio: ${real_dar}) -PASS should_apply: not all and (device-aspect-ratio: ${high_dar_1}) -PASS should_not_apply: all and (device-aspect-ratio: ${high_dar_2}) -PASS should_not_apply: all and (device-aspect-ratio: ${low_dar_1}) -PASS should_apply: not all and (device-aspect-ratio: ${low_dar_2}) -PASS should_apply: (device-aspect-ratio) -PASS should_apply: (min-device-aspect-ratio: ${real_dar}) -PASS should_not_apply: all and (min-device-aspect-ratio: ${high_dar_1}) -PASS should_apply: not all and (min-device-aspect-ratio: ${high_dar_2}) -PASS should_not_apply: not all and (min-device-aspect-ratio: ${low_dar_1}) -PASS should_apply: all and (min-device-aspect-ratio: ${low_dar_2}) -PASS expression_should_not_be_parseable: min-device-aspect-ratio -PASS should_apply: all and (max-device-aspect-ratio: ${real_dar}) -PASS should_apply: (max-device-aspect-ratio: ${high_dar_1}) -PASS should_apply: (max-device-aspect-ratio: ${high_dar_2}) -PASS should_not_apply: all and (max-device-aspect-ratio: ${low_dar_1}) -PASS should_apply: not all and (max-device-aspect-ratio: ${low_dar_2}) -PASS expression_should_not_be_parseable: max-device-aspect-ratio -PASS expression_should_be_parseable: max-aspect-ratio: 1/1 -PASS expression_should_be_parseable: max-aspect-ratio: 1 /1 -PASS expression_should_be_parseable: max-aspect-ratio: 1 / -1 -PASS expression_should_be_parseable: max-aspect-ratio: 1/\r1 -FAIL expression_should_be_parseable: max-aspect-ratio: 1 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 0.5 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 1.0/1 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 1/1.0 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 1.0/1.0 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 0/1 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 1/0 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 0/0 assert_true: expected true got false -PASS expression_should_not_be_parseable: max-aspect-ratio: -1/1 -PASS expression_should_not_be_parseable: max-aspect-ratio: 1/-1 -PASS expression_should_not_be_parseable: max-aspect-ratio: -1/-1 -PASS expression_should_not_be_parseable: max-aspect-ratio: invalid -PASS expression_should_not_be_parseable: max-aspect-ratio: 1 / invalid -PASS expression_should_not_be_parseable: max-aspect-ratio: 1 invalid -PASS expression_should_be_parseable: device-aspect-ratio: 1/1 -PASS expression_should_be_parseable: device-aspect-ratio: 1 /1 -PASS expression_should_be_parseable: device-aspect-ratio: 1 / -1 -PASS expression_should_be_parseable: device-aspect-ratio: 1/\r1 -FAIL expression_should_be_parseable: device-aspect-ratio: 1 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 0.5 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 1.0/1 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 1/1.0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 1.0/1.0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 0/1 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 1/0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 0/0 assert_true: expected true got false -PASS expression_should_not_be_parseable: device-aspect-ratio: -1/1 -PASS expression_should_not_be_parseable: device-aspect-ratio: 1/-1 -PASS expression_should_not_be_parseable: device-aspect-ratio: -1/-1 -PASS expression_should_not_be_parseable: device-aspect-ratio: invalid -PASS expression_should_not_be_parseable: device-aspect-ratio: 1 / invalid -PASS expression_should_not_be_parseable: device-aspect-ratio: 1 invalid -PASS monochrome_and_color -PASS find_depth -PASS should_apply: all and (color:8) -PASS should_not_apply: all and (color:7) -PASS should_not_apply: all and (color:9) -PASS should_apply: all and (max-color:8) -PASS should_not_apply: all and (max-color:7) -PASS should_apply: all and (max-color:9) -PASS should_apply: all and (color) -PASS expression_should_not_be_parseable: max-color -PASS expression_should_not_be_parseable: min-color -PASS should_not_apply: all and (monochrome) -PASS expression_should_not_be_parseable: max-monochrome -PASS expression_should_not_be_parseable: min-monochrome -PASS should_apply: not all and (monochrome) -PASS should_not_apply: not all and (color) -PASS should_apply: only all and (color) -PASS should_not_apply: only all and (monochrome) -PASS expression_should_be_parseable: color: 1 -PASS expression_should_be_parseable: color: 327 -PASS expression_should_be_parseable: color: 0 -PASS expression_should_not_be_parseable: color: 1.0 -PASS expression_should_not_be_parseable: color: -1 -PASS expression_should_not_be_parseable: color: 1/1 -PASS expression_should_be_parseable: min-monochrome: 1 -PASS expression_should_be_parseable: min-monochrome: 327 -PASS expression_should_be_parseable: min-monochrome: 0 -PASS expression_should_not_be_parseable: min-monochrome: 1.0 -PASS expression_should_not_be_parseable: min-monochrome: -1 -PASS expression_should_not_be_parseable: min-monochrome: 1/1 -PASS expression_should_be_parseable: max-color-index: 1 -PASS expression_should_be_parseable: max-color-index: 327 -PASS expression_should_be_parseable: max-color-index: 0 -PASS expression_should_not_be_parseable: max-color-index: 1.0 -PASS expression_should_not_be_parseable: max-color-index: -1 -PASS expression_should_not_be_parseable: max-color-index: 1/1 -PASS should_apply: (color-index: 0) -PASS should_not_apply: (color-index: 1) -PASS should_apply: (min-color-index: 0) -PASS should_not_apply: (min-color-index: 1) -PASS should_apply: (max-color-index: 0) -PASS should_apply: (max-color-index: 1) -PASS should_apply: (max-color-index: 157) -PASS expression_should_be_parseable: resolution: 3dpi -PASS expression_should_be_parseable: resolution:3dpi -PASS expression_should_be_parseable: resolution: 3.0dpi -PASS expression_should_be_parseable: resolution: 3.4dpi -PASS expression_should_be_parseable: resolution : 120dpcm -PASS expression_should_be_parseable: resolution: 1dppx -PASS expression_should_be_parseable: resolution: 1x -PASS expression_should_be_parseable: resolution: 1.5dppx -PASS expression_should_be_parseable: resolution: 1.5x -PASS expression_should_be_parseable: resolution: 2.0dppx -PASS expression_should_not_be_parseable: resolution: 0dpi -PASS expression_should_not_be_parseable: resolution: -3dpi -PASS expression_should_not_be_parseable: resolution: 0dppx -PASS expression_should_not_be_parseable: resolution: 0x -PASS expression_should_be_parseable: min-resolution: 3dpi -PASS expression_should_be_parseable: min-resolution:3dpi -PASS expression_should_be_parseable: min-resolution: 3.0dpi -PASS expression_should_be_parseable: min-resolution: 3.4dpi -PASS expression_should_be_parseable: min-resolution : 120dpcm -PASS expression_should_be_parseable: min-resolution: 1dppx -PASS expression_should_be_parseable: min-resolution: 1x -PASS expression_should_be_parseable: min-resolution: 1.5dppx -PASS expression_should_be_parseable: min-resolution: 1.5x -PASS expression_should_be_parseable: min-resolution: 2.0dppx -PASS expression_should_not_be_parseable: min-resolution: 0dpi -PASS expression_should_not_be_parseable: min-resolution: -3dpi -PASS expression_should_not_be_parseable: min-resolution: 0dppx -PASS expression_should_not_be_parseable: min-resolution: 0x -PASS expression_should_be_parseable: max-resolution: 3dpi -PASS expression_should_be_parseable: max-resolution:3dpi -PASS expression_should_be_parseable: max-resolution: 3.0dpi -PASS expression_should_be_parseable: max-resolution: 3.4dpi -PASS expression_should_be_parseable: max-resolution : 120dpcm -PASS expression_should_be_parseable: max-resolution: 1dppx -PASS expression_should_be_parseable: max-resolution: 1x -PASS expression_should_be_parseable: max-resolution: 1.5dppx -PASS expression_should_be_parseable: max-resolution: 1.5x -PASS expression_should_be_parseable: max-resolution: 2.0dppx -PASS expression_should_not_be_parseable: max-resolution: 0dpi -PASS expression_should_not_be_parseable: max-resolution: -3dpi -PASS expression_should_not_be_parseable: max-resolution: 0dppx -PASS expression_should_not_be_parseable: max-resolution: 0x -PASS find_resolution -PASS resolution is exact: should_apply: (resolution: ${resolution}dpi) -PASS resolution is exact: should_apply: (resolution: ${Math.floor(resolution/96)}dppx) -PASS resolution is exact: should_apply: (resolution: ${Math.floor(resolution/96)}x) -PASS resolution is exact: should_not_apply: (resolution: ${resolution + 1}dpi) -PASS resolution is exact: should_not_apply: (resolution: ${resolution - 1}dpi) -PASS should_apply: (min-resolution: ${dpi_low}dpi) -PASS should_not_apply: not all and (min-resolution: ${dpi_low}dpi) -PASS should_apply: not all and (min-resolution: ${dpi_high}dpi) -PASS should_not_apply: all and (min-resolution: ${dpi_high}dpi) -PASS should_apply: (min-resolution: ${dpcm_low}dpcm) -PASS should_apply: (max-resolution: ${dpcm_high}dpcm) -PASS should_not_apply: (max-resolution: ${dpcm_low}dpcm) -PASS should_apply: not all and (min-resolution: ${dpcm_high}dpcm) -PASS expression_should_be_parseable: scan -PASS expression_should_be_parseable: scan: progressive -PASS expression_should_be_parseable: scan:interlace -PASS expression_should_not_be_parseable: min-scan:interlace -PASS expression_should_not_be_parseable: scan: 1 -PASS expression_should_not_be_parseable: max-scan -PASS expression_should_not_be_parseable: max-scan: progressive -PASS should_not_apply: (scan) -PASS should_not_apply: (scan: progressive) -PASS should_not_apply: (scan: interlace) -PASS should_apply: not all and (scan) -PASS should_apply: not all and (scan: progressive) -PASS should_apply: not all and (scan: interlace) -PASS expression_should_be_parseable: grid -PASS expression_should_be_parseable: grid: 0 -PASS expression_should_be_parseable: grid: 1 -PASS expression_should_not_be_parseable: min-grid -PASS expression_should_not_be_parseable: min-grid:0 -PASS expression_should_not_be_parseable: max-grid: 1 -PASS expression_should_not_be_parseable: grid: 2 -PASS expression_should_not_be_parseable: grid: -1 -PASS should_not_apply: (grid) -PASS should_apply: (grid: 0) -PASS should_not_apply: (grid: 1) -PASS should_not_apply: (grid: 2) -PASS should_not_apply: (grid: -1) -PASS should_apply: (orientation -PASS should_not_apply: not all and (orientation -PASS should_not_apply: (orientation: -PASS should_not_apply: (orientation:) -PASS should_not_apply: (orientation: ) -PASS should_apply: all,(orientation: -PASS should_not_apply: (orientation:,all -PASS should_apply: not all and (grid -PASS should_not_apply: only all and (grid -PASS should_not_apply: (grid -PASS should_apply: all,(grid -PASS should_not_apply: (grid,all -PASS should_apply: ,all -PASS should_apply: all, -PASS should_apply: ,all, -PASS should_apply: all,badmedium -PASS should_apply: badmedium,all -PASS should_not_apply: ,badmedium, -PASS should_apply: all,(badexpression) -PASS should_apply: (badexpression),all -PASS should_not_apply: (badexpression),badmedium -PASS should_not_apply: badmedium,(badexpression) -PASS should_apply: all,[badsyntax] -PASS should_apply: [badsyntax],all -PASS should_not_apply: badmedium,[badsyntax] -PASS should_not_apply: [badsyntax],badmedium -PASS query_should_not_be_parseable: all and color : -PASS query_should_not_be_parseable: all and color : 1 -PASS should_not_apply: all and min-color : 1 -PASS should_not_apply: (bogus) -PASS should_not_apply: not all and (bogus) -PASS should_not_apply: only all and (bogus) -FAIL expression_should_be_parseable: overflow-block assert_true: expected true got false -FAIL expression_should_be_parseable: overflow-block: none assert_true: expected true got false -FAIL expression_should_be_parseable: overflow-block: paged assert_true: expected true got false -FAIL expression_should_be_parseable: overflow-block: scroll assert_true: expected true got false -FAIL expression_should_be_parseable: overflow-block: optional-paged assert_true: expected true got false -PASS expression_should_not_be_parseable: overflow-block: some-random-invalid-thing -FAIL Sanity check for overflow-block assert_not_equals: overflow-block should be equivalent to not (overflow-block: none) got disallowed value false -FAIL expression_should_be_parseable: overflow-inline assert_true: expected true got false -FAIL expression_should_be_parseable: overflow-inline: none assert_true: expected true got false -FAIL expression_should_be_parseable: overflow-inline: scroll assert_true: expected true got false -PASS expression_should_not_be_parseable: overflow-inline: some-random-invalid-thing -FAIL Sanity check for overflow-inline assert_not_equals: overflow-inline should be equivalent to not (overflow-inline: none) got disallowed value false -PASS expression_should_be_parseable: hover -PASS expression_should_be_parseable: hover: hover -PASS expression_should_be_parseable: hover: none -PASS expression_should_be_parseable: any-hover -PASS expression_should_be_parseable: any-hover: hover -PASS expression_should_be_parseable: any-hover: none -PASS (hover) == (hover: hover) -PASS (hover) == not (hover: none) -PASS (any-hover) == (any-hover: hover) -PASS (any-hover) == not (any-hover: none) -PASS expression_should_be_parseable: pointer -PASS expression_should_be_parseable: pointer: coarse -PASS expression_should_be_parseable: pointer: fine -PASS expression_should_be_parseable: pointer: none -PASS expression_should_be_parseable: any-pointer -PASS expression_should_be_parseable: any-pointer: coarse -PASS expression_should_be_parseable: any-pointer: fine -PASS expression_should_be_parseable: any-pointer: none -PASS (pointer) == (pointer: coarse) or (pointer: fine) -PASS (pointer) == not (pointer: none) -PASS (any-pointer) == (any-pointer: coarse) or (any-pointer: fine) -PASS (any-pointer) == not (any-pointer: none) -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/selectors/focus-visible-024-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/selectors/focus-visible-024-expected.txt deleted file mode 100644 index 4add799..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/selectors/focus-visible-024-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS ":focus-visible" should be a valid selector -FAIL :focus-visible matches after accesskey on DIV promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" -FAIL :focus-visible matches after accesskey on BUTTON 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/flag-specific/highdpi/external/wpt/css/selectors/focus-visible-025-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/selectors/focus-visible-025-expected.txt deleted file mode 100644 index dbad1a0..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/css/selectors/focus-visible-025-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS ":focus-visible" should be a valid selector -FAIL :focus-visible matches after accesskey on DIV after previous mouse focus promise_test: Unhandled rejection with value: object "Error: we do not support keydown and keyup actions, please use test_driver.send_keys" -FAIL :focus-visible matches after accesskey on BUTTON after previous mouse focus 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/flag-specific/highdpi/external/wpt/custom-elements/form-associated/ElementInternals-validation-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/custom-elements/form-associated/ElementInternals-validation-expected.txt deleted file mode 100644 index ed5a28ed..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/custom-elements/form-associated/ElementInternals-validation-expected.txt +++ /dev/null
@@ -1,16 +0,0 @@ -This is a testharness.js-based test. -PASS willValidate -PASS willValidate after upgrade -PASS willValidate should throw NotSupportedError if the target element is not a form-associated custom element -PASS validity and setValidity() -FAIL "anchor" argument of setValidity() assert_throws_js: Not a HTMLElement function "() => { - control.i.setValidity(flags, m, notHTMLElement); - }" did not throw -PASS checkValidity() should throw NotSupportedError if the target element is not a form-associated custom element -PASS checkValidity() -PASS reportValidity() should throw NotSupportedError if the target element is not a form-associated custom element -PASS reportValidity() -PASS Custom control affects validation at the owner form -PASS Custom control affects :valid :invalid for FORM and FIELDSET -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/encoding/idlharness-shadowrealm.window-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/encoding/idlharness-shadowrealm.window-expected.txt deleted file mode 100644 index 2db45e1..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/encoding/idlharness-shadowrealm.window-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -Harness Error. harness_status.status = 1 , harness_status.message = ReferenceError: ShadowRealm is not defined -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/api/basic/response-null-body.any-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/api/basic/response-null-body.any-expected.txt deleted file mode 100644 index fa818f44..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/api/basic/response-null-body.any-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This is a testharness.js-based test. -FAIL Response.body is null for responses with status=204 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=204 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=204 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with method=HEAD assert_equals: the body should be null expected null but got object "[object ReadableStream]" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/api/basic/response-null-body.any.serviceworker-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/api/basic/response-null-body.any.serviceworker-expected.txt deleted file mode 100644 index fa818f44..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/api/basic/response-null-body.any.serviceworker-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This is a testharness.js-based test. -FAIL Response.body is null for responses with status=204 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=204 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=204 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with method=HEAD assert_equals: the body should be null expected null but got object "[object ReadableStream]" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/api/basic/response-null-body.any.sharedworker-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/api/basic/response-null-body.any.sharedworker-expected.txt deleted file mode 100644 index fa818f44..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/api/basic/response-null-body.any.sharedworker-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This is a testharness.js-based test. -FAIL Response.body is null for responses with status=204 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=204 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=204 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with method=HEAD assert_equals: the body should be null expected null but got object "[object ReadableStream]" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/api/basic/response-null-body.any.worker-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/api/basic/response-null-body.any.worker-expected.txt deleted file mode 100644 index fa818f44..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/api/basic/response-null-body.any.worker-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This is a testharness.js-based test. -FAIL Response.body is null for responses with status=204 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=204 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=204 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=205 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=GET) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=POST) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with status=304 (method=OPTIONS) assert_equals: the body should be null expected null but got object "[object ReadableStream]" -FAIL Response.body is null for responses with method=HEAD assert_equals: the body should be null expected null but got object "[object ReadableStream]" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-a.https.sub-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-a.https.sub-expected.txt deleted file mode 100644 index 35073ce..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-a.https.sub-expected.txt +++ /dev/null
@@ -1,24 +0,0 @@ -This is a testharness.js-based test. -PASS sec-fetch-site - Same origin - no attributes -PASS sec-fetch-site - Cross-site - no attributes -PASS sec-fetch-site - Same site - no attributes -PASS sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect - no attributes -PASS sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect - no attributes -PASS sec-fetch-site - Cross-Site -> Same Origin - no attributes -PASS sec-fetch-site - Cross-Site -> Same-Site - no attributes -PASS sec-fetch-site - Cross-Site -> Cross-Site - no attributes -PASS sec-fetch-site - Same-Origin -> Same Origin - no attributes -PASS sec-fetch-site - Same-Origin -> Same-Site - no attributes -PASS sec-fetch-site - Same-Origin -> Cross-Site - no attributes -PASS sec-fetch-site - Same-Site -> Same Origin - no attributes -PASS sec-fetch-site - Same-Site -> Same-Site - no attributes -PASS sec-fetch-site - Same-Site -> Cross-Site - no attributes -PASS sec-fetch-site - HTTPS downgrade-upgrade - no attributes -PASS sec-fetch-mode - no attributes -FAIL sec-fetch-mode - attributes: download assert_array_equals: expected property 0 to be "no-cors" but got "navigate" (expected array ["no-cors"] got ["navigate"]) -PASS sec-fetch-dest - no attributes -PASS sec-fetch-dest - attributes: download -PASS sec-fetch-user - no attributes -FAIL sec-fetch-user - no attributes with user activation assert_own_property: expected property "sec-fetch-user" missing -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-area.https.sub-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-area.https.sub-expected.txt deleted file mode 100644 index 35073ce..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-area.https.sub-expected.txt +++ /dev/null
@@ -1,24 +0,0 @@ -This is a testharness.js-based test. -PASS sec-fetch-site - Same origin - no attributes -PASS sec-fetch-site - Cross-site - no attributes -PASS sec-fetch-site - Same site - no attributes -PASS sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect - no attributes -PASS sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect - no attributes -PASS sec-fetch-site - Cross-Site -> Same Origin - no attributes -PASS sec-fetch-site - Cross-Site -> Same-Site - no attributes -PASS sec-fetch-site - Cross-Site -> Cross-Site - no attributes -PASS sec-fetch-site - Same-Origin -> Same Origin - no attributes -PASS sec-fetch-site - Same-Origin -> Same-Site - no attributes -PASS sec-fetch-site - Same-Origin -> Cross-Site - no attributes -PASS sec-fetch-site - Same-Site -> Same Origin - no attributes -PASS sec-fetch-site - Same-Site -> Same-Site - no attributes -PASS sec-fetch-site - Same-Site -> Cross-Site - no attributes -PASS sec-fetch-site - HTTPS downgrade-upgrade - no attributes -PASS sec-fetch-mode - no attributes -FAIL sec-fetch-mode - attributes: download assert_array_equals: expected property 0 to be "no-cors" but got "navigate" (expected array ["no-cors"] got ["navigate"]) -PASS sec-fetch-dest - no attributes -PASS sec-fetch-dest - attributes: download -PASS sec-fetch-user - no attributes -FAIL sec-fetch-user - no attributes with user activation assert_own_property: expected property "sec-fetch-user" missing -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-audio.https.sub-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-audio.https.sub-expected.txt deleted file mode 100644 index 4c45c07..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-audio.https.sub-expected.txt +++ /dev/null
@@ -1,24 +0,0 @@ -This is a testharness.js-based test. -PASS sec-fetch-site - Same origin, no attributes -PASS sec-fetch-site - Cross-site, no attributes -PASS sec-fetch-site - Same site, no attributes -PASS sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect, no attributes -PASS sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect, no attributes -PASS sec-fetch-site - Cross-Site -> Same Origin, no attributes -PASS sec-fetch-site - Cross-Site -> Same-Site, no attributes -PASS sec-fetch-site - Cross-Site -> Cross-Site, no attributes -PASS sec-fetch-site - Same-Origin -> Same Origin, no attributes -PASS sec-fetch-site - Same-Origin -> Same-Site, no attributes -PASS sec-fetch-site - Same-Origin -> Cross-Site, no attributes -PASS sec-fetch-site - Same-Site -> Same Origin, no attributes -PASS sec-fetch-site - Same-Site -> Same-Site, no attributes -PASS sec-fetch-site - Same-Site -> Cross-Site, no attributes -FAIL sec-fetch-site - HTTPS downgrade-upgrade, no attributes promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -PASS sec-fetch-mode - no attributes -PASS sec-fetch-mode - attributes: crossorigin -PASS sec-fetch-mode - attributes: crossorigin=anonymous -PASS sec-fetch-mode - attributes: crossorigin=use-credentials -PASS sec-fetch-dest - no attributes -PASS sec-fetch-user - no attributes -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-embed.https.sub-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-embed.https.sub-expected.txt deleted file mode 100644 index 7f21491..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-embed.https.sub-expected.txt +++ /dev/null
@@ -1,20 +0,0 @@ -This is a testharness.js-based test. -PASS sec-fetch-site - Same origin -PASS sec-fetch-site - Cross-site -PASS sec-fetch-site - Same site -PASS sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect -PASS sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect -PASS sec-fetch-site - Cross-Site -> Same Origin -PASS sec-fetch-site - Cross-Site -> Same-Site -PASS sec-fetch-site - Cross-Site -> Cross-Site -PASS sec-fetch-site - Same-Origin -> Same Origin -PASS sec-fetch-site - Same-Origin -> Same-Site -PASS sec-fetch-site - Same-Origin -> Cross-Site -PASS sec-fetch-site - Same-Site -> Same Origin -PASS sec-fetch-site - Same-Site -> Same-Site -PASS sec-fetch-site - Same-Site -> Cross-Site -FAIL sec-fetch-mode assert_array_equals: expected property 0 to be "no-cors" but got "navigate" (expected array ["no-cors"] got ["navigate"]) -PASS sec-fetch-dest -PASS sec-fetch-user -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-img.https.sub-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-img.https.sub-expected.txt deleted file mode 100644 index 29e4523c5..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-img.https.sub-expected.txt +++ /dev/null
@@ -1,44 +0,0 @@ -This is a testharness.js-based test. -PASS sec-fetch-site - src - Same origin, no attributes -PASS sec-fetch-site - srcset - Same origin, no attributes -PASS sec-fetch-site - src - Cross-site, no attributes -PASS sec-fetch-site - srcset - Cross-site, no attributes -PASS sec-fetch-site - src - Same site, no attributes -PASS sec-fetch-site - srcset - Same site, no attributes -PASS sec-fetch-site - src - Same-Origin -> Cross-Site -> Same-Origin redirect, no attributes -PASS sec-fetch-site - srcset - Same-Origin -> Cross-Site -> Same-Origin redirect, no attributes -PASS sec-fetch-site - src - Same-Origin -> Same-Site -> Same-Origin redirect, no attributes -PASS sec-fetch-site - srcset - Same-Origin -> Same-Site -> Same-Origin redirect, no attributes -PASS sec-fetch-site - src - Cross-Site -> Same Origin, no attributes -PASS sec-fetch-site - srcset - Cross-Site -> Same Origin, no attributes -PASS sec-fetch-site - src - Cross-Site -> Same-Site, no attributes -PASS sec-fetch-site - srcset - Cross-Site -> Same-Site, no attributes -PASS sec-fetch-site - src - Cross-Site -> Cross-Site, no attributes -PASS sec-fetch-site - srcset - Cross-Site -> Cross-Site, no attributes -PASS sec-fetch-site - src - Same-Origin -> Same Origin, no attributes -PASS sec-fetch-site - srcset - Same-Origin -> Same Origin, no attributes -PASS sec-fetch-site - src - Same-Origin -> Same-Site, no attributes -PASS sec-fetch-site - srcset - Same-Origin -> Same-Site, no attributes -PASS sec-fetch-site - src - Same-Origin -> Cross-Site, no attributes -PASS sec-fetch-site - srcset - Same-Origin -> Cross-Site, no attributes -PASS sec-fetch-site - src - Same-Site -> Same Origin, no attributes -PASS sec-fetch-site - srcset - Same-Site -> Same Origin, no attributes -PASS sec-fetch-site - src - Same-Site -> Same-Site, no attributes -PASS sec-fetch-site - srcset - Same-Site -> Same-Site, no attributes -PASS sec-fetch-site - src - Same-Site -> Cross-Site, no attributes -PASS sec-fetch-site - srcset - Same-Site -> Cross-Site, no attributes -FAIL sec-fetch-site - src - HTTPS downgrade-upgrade, no attributes promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -PASS sec-fetch-mode - src - no attributes -PASS sec-fetch-mode - src - attributes: crossorigin -PASS sec-fetch-mode - src - attributes: crossorigin=anonymous -PASS sec-fetch-mode - src - attributes: crossorigin=use-credentials -PASS sec-fetch-mode - srcset - no attributes -PASS sec-fetch-mode - srcset - attributes: crossorigin -PASS sec-fetch-mode - srcset - attributes: crossorigin=anonymous -PASS sec-fetch-mode - srcset - attributes: crossorigin=use-credentials -PASS sec-fetch-dest - src - no attributes -PASS sec-fetch-dest - srcset - no attributes -PASS sec-fetch-user - src - no attributes -PASS sec-fetch-user - srcset - no attributes -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-input-image.https.sub-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-input-image.https.sub-expected.txt deleted file mode 100644 index b90f0a9..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-input-image.https.sub-expected.txt +++ /dev/null
@@ -1,21 +0,0 @@ -This is a testharness.js-based test. -PASS sec-fetch-site - Same origin, no attributes -PASS sec-fetch-site - Cross-site, no attributes -PASS sec-fetch-site - Same site, no attributes -PASS sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect, no attributes -PASS sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect, no attributes -PASS sec-fetch-site - Cross-Site -> Same Origin, no attributes -PASS sec-fetch-site - Cross-Site -> Same-Site, no attributes -PASS sec-fetch-site - Cross-Site -> Cross-Site, no attributes -PASS sec-fetch-site - Same-Origin -> Same Origin, no attributes -PASS sec-fetch-site - Same-Origin -> Same-Site, no attributes -PASS sec-fetch-site - Same-Origin -> Cross-Site, no attributes -PASS sec-fetch-site - Same-Site -> Same Origin, no attributes -PASS sec-fetch-site - Same-Site -> Same-Site, no attributes -PASS sec-fetch-site - Same-Site -> Cross-Site, no attributes -FAIL sec-fetch-site - HTTPS downgrade-upgrade, no attributes promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -PASS sec-fetch-mode - no attributes -PASS sec-fetch-dest - no attributes -PASS sec-fetch-user - no attributes -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-video.https.sub-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-video.https.sub-expected.txt deleted file mode 100644 index 4c45c07..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/element-video.https.sub-expected.txt +++ /dev/null
@@ -1,24 +0,0 @@ -This is a testharness.js-based test. -PASS sec-fetch-site - Same origin, no attributes -PASS sec-fetch-site - Cross-site, no attributes -PASS sec-fetch-site - Same site, no attributes -PASS sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect, no attributes -PASS sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect, no attributes -PASS sec-fetch-site - Cross-Site -> Same Origin, no attributes -PASS sec-fetch-site - Cross-Site -> Same-Site, no attributes -PASS sec-fetch-site - Cross-Site -> Cross-Site, no attributes -PASS sec-fetch-site - Same-Origin -> Same Origin, no attributes -PASS sec-fetch-site - Same-Origin -> Same-Site, no attributes -PASS sec-fetch-site - Same-Origin -> Cross-Site, no attributes -PASS sec-fetch-site - Same-Site -> Same Origin, no attributes -PASS sec-fetch-site - Same-Site -> Same-Site, no attributes -PASS sec-fetch-site - Same-Site -> Cross-Site, no attributes -FAIL sec-fetch-site - HTTPS downgrade-upgrade, no attributes promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -PASS sec-fetch-mode - no attributes -PASS sec-fetch-mode - attributes: crossorigin -PASS sec-fetch-mode - attributes: crossorigin=anonymous -PASS sec-fetch-mode - attributes: crossorigin=use-credentials -PASS sec-fetch-dest - no attributes -PASS sec-fetch-user - no attributes -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/header-link.https.sub-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/header-link.https.sub-expected.txt deleted file mode 100644 index cfc69a5..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/header-link.https.sub-expected.txt +++ /dev/null
@@ -1,36 +0,0 @@ -This is a testharness.js-based test. -FAIL sec-fetch-site rel=icon - Same origin promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Same origin promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=icon - Cross-site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Cross-site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=icon - Same site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Same site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=icon - Same-Origin -> Cross-Site -> Same-Origin redirect promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Same-Origin -> Cross-Site -> Same-Origin redirect promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=icon - Same-Origin -> Same-Site -> Same-Origin redirect promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Same-Origin -> Same-Site -> Same-Origin redirect promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=icon - Cross-Site -> Same Origin promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Cross-Site -> Same Origin promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=icon - Cross-Site -> Same-Site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Cross-Site -> Same-Site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=icon - Cross-Site -> Cross-Site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Cross-Site -> Cross-Site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=icon - Same-Origin -> Same Origin promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Same-Origin -> Same Origin promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=icon - Same-Origin -> Same-Site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Same-Origin -> Same-Site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=icon - Same-Origin -> Cross-Site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Same-Origin -> Cross-Site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=icon - Same-Site -> Same Origin promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Same-Site -> Same Origin promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=icon - Same-Site -> Same-Site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Same-Site -> Same-Site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=icon - Same-Site -> Cross-Site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-site rel=stylesheet - Same-Site -> Cross-Site promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-mode rel=icon promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-mode rel=stylesheet promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-dest rel=icon promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-user rel=icon promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -FAIL sec-fetch-user rel=stylesheet promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/header-link.https.sub.tentative-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/header-link.https.sub.tentative-expected.txt deleted file mode 100644 index dc0b3140..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/header-link.https.sub.tentative-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL sec-fetch-dest rel=stylesheet promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers." -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/svg-image.https.sub-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/svg-image.https.sub-expected.txt deleted file mode 100644 index 1d86875..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/svg-image.https.sub-expected.txt +++ /dev/null
@@ -1,24 +0,0 @@ -This is a testharness.js-based test. -PASS sec-fetch-site - Same origin no attributes -PASS sec-fetch-site - Cross-site no attributes -PASS sec-fetch-site - Same site no attributes -PASS sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect no attributes -PASS sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect no attributes -PASS sec-fetch-site - Cross-Site -> Same Origin no attributes -PASS sec-fetch-site - Cross-Site -> Same-Site no attributes -PASS sec-fetch-site - Cross-Site -> Cross-Site no attributes -PASS sec-fetch-site - Same-Origin -> Same Origin no attributes -PASS sec-fetch-site - Same-Origin -> Same-Site no attributes -PASS sec-fetch-site - Same-Origin -> Cross-Site no attributes -PASS sec-fetch-site - Same-Site -> Same Origin no attributes -PASS sec-fetch-site - Same-Site -> Same-Site no attributes -PASS sec-fetch-site - Same-Site -> Cross-Site no attributes -FAIL sec-fetch-site - HTTPS downgrade-upgrade no attributes promise_test: Unhandled rejection with value: object "[object Event]" -PASS sec-fetch-mode no attributes -PASS sec-fetch-mode attributes: crossorigin -PASS sec-fetch-mode attributes: crossorigin=anonymous -PASS sec-fetch-mode attributes: crossorigin=use-credentials -FAIL sec-fetch-dest no attributes assert_array_equals: expected property 0 to be "empty" but got "image" (expected array ["empty"] got ["image"]) -PASS sec-fetch-user no attributes -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/window-location.https.sub-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/window-location.https.sub-expected.txt deleted file mode 100644 index 95049d0..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/fetch/metadata/generated/window-location.https.sub-expected.txt +++ /dev/null
@@ -1,80 +0,0 @@ -This is a testharness.js-based test. -Found 76 tests; 72 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS sec-fetch-site - Same origin - location -PASS sec-fetch-site - Same origin - location.href -PASS sec-fetch-site - Same origin - location.assign -PASS sec-fetch-site - Same origin - location.replace -PASS sec-fetch-site - Cross-site - location -PASS sec-fetch-site - Cross-site - location.href -PASS sec-fetch-site - Cross-site - location.assign -PASS sec-fetch-site - Cross-site - location.replace -PASS sec-fetch-site - Same site - location -PASS sec-fetch-site - Same site - location.href -PASS sec-fetch-site - Same site - location.assign -PASS sec-fetch-site - Same site - location.replace -PASS sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect - location -PASS sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect - location.href -PASS sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect - location.assign -PASS sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect - location.replace -PASS sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect - location -PASS sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect - location.href -PASS sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect - location.assign -PASS sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect - location.replace -PASS sec-fetch-site - Cross-Site -> Same Origin - location -PASS sec-fetch-site - Cross-Site -> Same Origin - location.href -PASS sec-fetch-site - Cross-Site -> Same Origin - location.assign -PASS sec-fetch-site - Cross-Site -> Same Origin - location.replace -PASS sec-fetch-site - Cross-Site -> Same-Site - location -PASS sec-fetch-site - Cross-Site -> Same-Site - location.href -PASS sec-fetch-site - Cross-Site -> Same-Site - location.assign -PASS sec-fetch-site - Cross-Site -> Same-Site - location.replace -PASS sec-fetch-site - Cross-Site -> Cross-Site - location -PASS sec-fetch-site - Cross-Site -> Cross-Site - location.href -PASS sec-fetch-site - Cross-Site -> Cross-Site - location.assign -PASS sec-fetch-site - Cross-Site -> Cross-Site - location.replace -PASS sec-fetch-site - Same-Origin -> Same Origin - location -PASS sec-fetch-site - Same-Origin -> Same Origin - location.href -PASS sec-fetch-site - Same-Origin -> Same Origin - location.assign -PASS sec-fetch-site - Same-Origin -> Same Origin - location.replace -PASS sec-fetch-site - Same-Origin -> Same-Site - location -PASS sec-fetch-site - Same-Origin -> Same-Site - location.href -PASS sec-fetch-site - Same-Origin -> Same-Site - location.assign -PASS sec-fetch-site - Same-Origin -> Same-Site - location.replace -PASS sec-fetch-site - Same-Origin -> Cross-Site - location -PASS sec-fetch-site - Same-Origin -> Cross-Site - location.href -PASS sec-fetch-site - Same-Origin -> Cross-Site - location.assign -PASS sec-fetch-site - Same-Origin -> Cross-Site - location.replace -PASS sec-fetch-site - Same-Site -> Same Origin - location -PASS sec-fetch-site - Same-Site -> Same Origin - location.href -PASS sec-fetch-site - Same-Site -> Same Origin - location.assign -PASS sec-fetch-site - Same-Site -> Same Origin - location.replace -PASS sec-fetch-site - Same-Site -> Same-Site - location -PASS sec-fetch-site - Same-Site -> Same-Site - location.href -PASS sec-fetch-site - Same-Site -> Same-Site - location.assign -PASS sec-fetch-site - Same-Site -> Same-Site - location.replace -PASS sec-fetch-site - Same-Site -> Cross-Site - location -PASS sec-fetch-site - Same-Site -> Cross-Site - location.href -PASS sec-fetch-site - Same-Site -> Cross-Site - location.assign -PASS sec-fetch-site - Same-Site -> Cross-Site - location.replace -PASS sec-fetch-site - HTTPS downgrade-upgrade - location -PASS sec-fetch-site - HTTPS downgrade-upgrade - location.href -PASS sec-fetch-site - HTTPS downgrade-upgrade - location.assign -PASS sec-fetch-site - HTTPS downgrade-upgrade - location.replace -PASS sec-fetch-mode - location -PASS sec-fetch-mode - location.href -PASS sec-fetch-mode - location.assign -PASS sec-fetch-mode - location.replace -PASS sec-fetch-dest - location -PASS sec-fetch-dest - location.href -PASS sec-fetch-dest - location.assign -PASS sec-fetch-dest - location.replace -PASS sec-fetch-user - location -PASS sec-fetch-user - location.href -PASS sec-fetch-user - location.assign -PASS sec-fetch-user - location.replace -FAIL sec-fetch-user - location with user activation assert_own_property: expected property "sec-fetch-user" missing -FAIL sec-fetch-user - location.href with user activation assert_own_property: expected property "sec-fetch-user" missing -FAIL sec-fetch-user - location.assign with user activation assert_own_property: expected property "sec-fetch-user" missing -FAIL sec-fetch-user - location.replace with user activation assert_own_property: expected property "sec-fetch-user" missing -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/hr-time/idlharness-shadowrealm.window-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/hr-time/idlharness-shadowrealm.window-expected.txt deleted file mode 100644 index 2db45e1..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/hr-time/idlharness-shadowrealm.window-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -Harness Error. harness_status.status = 1 , harness_status.message = ReferenceError: ShadowRealm is not defined -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/location-setter-user-click-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/location-setter-user-click-expected.txt deleted file mode 100644 index 636b5cbd..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/location-setter-user-click-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -FAIL href assert_equals: expected "http://web-platform.test:8001/common/blank.html?thereplacement" but got "http://web-platform.test:8001/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/resources/slow-code-injector.html?pipe=sub(none)&code=%0A%20%20%20%20const%20button%20%3D%20document.createElement(%22button%22)%3B%0A%20%20%20%20button.id%20%3D%20%22the-button%22%3B%0A%20%20%20%20button.textContent%20%3D%20%22needs%20to%20have%20content%20to%20be%20clickable%22%3B%0A%20%20%20%20button.onclick%20%3D%20()%20%3D%3E%20%7B%20location.href%20%3D%20%22%2Fcommon%2Fblank.html%3Fthereplacement%22%3B%20%7D%3B%0A%20%20%20%20document.currentScript.before(button)%3B%0A%20%20%20%20parent.test_driver.click(button)%3B%0A%20%20" -FAIL search assert_equals: expected "http://web-platform.test:8001/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/resources/slow-code-injector.html?thereplacement" but got "http://web-platform.test:8001/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/resources/slow-code-injector.html?pipe=sub(none)&code=%0A%20%20%20%20const%20button%20%3D%20document.createElement(%22button%22)%3B%0A%20%20%20%20button.id%20%3D%20%22the-button%22%3B%0A%20%20%20%20button.textContent%20%3D%20%22needs%20to%20have%20content%20to%20be%20clickable%22%3B%0A%20%20%20%20button.onclick%20%3D%20()%20%3D%3E%20%7B%20location.search%20%3D%20%22thereplacement%22%3B%20%7D%3B%0A%20%20%20%20document.currentScript.before(button)%3B%0A%20%20%20%20parent.test_driver.click(button)%3B%0A%20%20" -FAIL hash assert_equals: expected "http://web-platform.test:8001/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/resources/slow-code-injector.html?pipe=sub(none)&code=%0A%20%20%20%20const%20button%20%3D%20document.createElement(%22button%22)%3B%0A%20%20%20%20button.id%20%3D%20%22the-button%22%3B%0A%20%20%20%20button.textContent%20%3D%20%22needs%20to%20have%20content%20to%20be%20clickable%22%3B%0A%20%20%20%20button.onclick%20%3D%20()%20%3D%3E%20%7B%20location.hash%20%3D%20%22thereplacement%22%3B%20%7D%3B%0A%20%20%20%20document.currentScript.before(button)%3B%0A%20%20%20%20parent.test_driver.click(button)%3B%0A%20%20#thereplacement" but got "http://web-platform.test:8001/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/resources/slow-code-injector.html?pipe=sub(none)&code=%0A%20%20%20%20const%20button%20%3D%20document.createElement(%22button%22)%3B%0A%20%20%20%20button.id%20%3D%20%22the-button%22%3B%0A%20%20%20%20button.textContent%20%3D%20%22needs%20to%20have%20content%20to%20be%20clickable%22%3B%0A%20%20%20%20button.onclick%20%3D%20()%20%3D%3E%20%7B%20location.hash%20%3D%20%22thereplacement%22%3B%20%7D%3B%0A%20%20%20%20document.currentScript.before(button)%3B%0A%20%20%20%20parent.test_driver.click(button)%3B%0A%20%20" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/dom/documents/resource-metadata-management/document-cookie-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/dom/documents/resource-metadata-management/document-cookie-expected.txt deleted file mode 100644 index dab2e9e..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/dom/documents/resource-metadata-management/document-cookie-expected.txt +++ /dev/null
@@ -1,8 +0,0 @@ -This is a testharness.js-based test. -PASS document has no cookie -PASS document.cookie -PASS document.cookie 1 -FAIL document.cookie 2 assert_equals: expected "" but got "b=A" -PASS getting cookie for a cookie-averse document returns empty string, setting does nothing -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/dom/idlharness-shadowrealm.window-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/dom/idlharness-shadowrealm.window-expected.txt deleted file mode 100644 index 2db45e1..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/dom/idlharness-shadowrealm.window-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -Harness Error. harness_status.status = 1 , harness_status.message = ReferenceError: ShadowRealm is not defined -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/syntax/charset/with-inheritance-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/syntax/charset/with-inheritance-expected.txt deleted file mode 100644 index 5a55743..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/syntax/charset/with-inheritance-expected.txt +++ /dev/null
@@ -1,25 +0,0 @@ -This is a testharness.js-based test. -PASS Check http://web-platform.test:8001/html/syntax/charset/after-1kb.html -PASS Check http://web-platform.test:8001/html/syntax/charset/after-bogus-after-1kb.html -PASS Check http://web-platform.test:8001/html/syntax/charset/after-bogus.html -FAIL Check http://web-platform.test:8001/html/syntax/charset/after-head-after-1kb-crlf.html assert_equals: Check characterSet expected "windows-1253" but got "windows-1251" -PASS Check http://web-platform.test:8001/html/syntax/charset/after-head-after-1kb.html -PASS Check http://web-platform.test:8001/html/syntax/charset/after-head-in-1kb-crlf.html -PASS Check http://web-platform.test:8001/html/syntax/charset/after-head-in-1kb.html -PASS Check http://web-platform.test:8001/html/syntax/charset/baseline.html -PASS Check http://web-platform.test:8001/html/syntax/charset/document-write.html -PASS Check http://web-platform.test:8001/html/syntax/charset/in-comment.html -PASS Check http://web-platform.test:8001/html/syntax/charset/in-noscript-after-template-after-1kb.html -PASS Check http://web-platform.test:8001/html/syntax/charset/in-object.html -PASS Check http://web-platform.test:8001/html/syntax/charset/in-script.html -PASS Check http://web-platform.test:8001/html/syntax/charset/in-style.html -PASS Check http://web-platform.test:8001/html/syntax/charset/in-svg.html -PASS Check http://web-platform.test:8001/html/syntax/charset/in-svg-in-cdata.html -PASS Check http://web-platform.test:8001/html/syntax/charset/in-template-after-1kb.html -PASS Check http://web-platform.test:8001/html/syntax/charset/in-template.html -PASS Check http://web-platform.test:8001/html/syntax/charset/in-title.html -PASS Check http://web-platform.test:8001/html/syntax/charset/ncr.html -PASS Check http://web-platform.test:8001/html/syntax/charset/non-ascii-in-comment-before.html -PASS Check http://web-platform.test:8001/html/syntax/charset/non-ascii-in-title-before.html -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/syntax/charset/xhr-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/syntax/charset/xhr-expected.txt deleted file mode 100644 index ea6db87..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/html/syntax/charset/xhr-expected.txt +++ /dev/null
@@ -1,25 +0,0 @@ -This is a testharness.js-based test. -PASS Check after-1kb.html -PASS Check after-bogus-after-1kb.html -PASS Check after-bogus.html -FAIL Check after-head-after-1kb-crlf.html assert_equals: Check characterSet expected "UTF-8" but got "windows-1251" -PASS Check after-head-after-1kb.html -PASS Check after-head-in-1kb-crlf.html -PASS Check after-head-in-1kb.html -PASS Check baseline.html -PASS Check document-write.html -PASS Check in-comment.html -PASS Check in-noscript-after-template-after-1kb.html -PASS Check in-object.html -PASS Check in-script.html -PASS Check in-style.html -PASS Check in-svg.html -PASS Check in-svg-in-cdata.html -PASS Check in-template-after-1kb.html -PASS Check in-template.html -PASS Check in-title.html -PASS Check ncr.html -PASS Check non-ascii-in-comment-before.html -PASS Check non-ascii-in-title-before.html -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mediacapture-record/MediaRecorder-start-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mediacapture-record/MediaRecorder-start-expected.txt deleted file mode 100644 index c7381df..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mediacapture-record/MediaRecorder-start-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL MediaRecorder cannot record the stream using the current configuration assert_throws_dom: function "() => mediaRecorder.start()" did not throw -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mediacapture-streams/MediaDevices-after-discard.https-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mediacapture-streams/MediaDevices-after-discard.https-expected.txt deleted file mode 100644 index b587a7a6..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mediacapture-streams/MediaDevices-after-discard.https-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL getUserMedia() in a discarded browsing context assert_throws_dom: function "() => { throw rejected_reason }" threw object "NotSupportedError: Failed to execute 'getUserMedia' on 'MediaDevices': No media device controller available; is this a detached window?" that is not a DOMException InvalidStateError: property "code" is equal to 9, expected 11 -FAIL enumerateDevices() in a discarded browsing context assert_equals: Promise state expected "pending" but got "rejected" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mediacapture-streams/enumerateDevices-with-navigation.https-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mediacapture-streams/enumerateDevices-with-navigation.https-expected.txt deleted file mode 100644 index c35673ac..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mediacapture-streams/enumerateDevices-with-navigation.https-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL enumerateDevices with navigation assert_equals: Promise state while inactive expected "pending" but got "rejected" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mimesniff/mime-types/parsing.any-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mimesniff/mime-types/parsing.any-expected.txt deleted file mode 100644 index 08508ea..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mimesniff/mime-types/parsing.any-expected.txt +++ /dev/null
@@ -1,1935 +0,0 @@ -This is a testharness.js-based test. -Found 1911 tests; 713 PASS, 1198 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS Loading data… -PASS text/html;charset=gbk (Blob/File) -PASS text/html;charset=gbk (Request/Response) -FAIL TEXT/HTML;CHARSET=GBK (Blob/File) assert_equals: Blob expected "text/html;charset=GBK" but got "text/html;charset=gbk" -FAIL TEXT/HTML;CHARSET=GBK (Request/Response) assert_equals: expected "text/html;charset=GBK" but got "text/html;charset=gbk" -FAIL text/html;charset=gbk( (Blob/File) assert_equals: Blob expected "text/html;charset=\"gbk(\"" but got "text/html;charset=gbk(" -FAIL text/html;charset=gbk( (Request/Response) assert_equals: expected "text/html;charset=\"gbk(\"" but got "text/html;charset=gbk(" -FAIL text/html;x=(;charset=gbk (Blob/File) assert_equals: Blob expected "text/html;x=\"(\";charset=gbk" but got "text/html;x=(;charset=gbk" -FAIL text/html;x=(;charset=gbk (Request/Response) assert_equals: expected "text/html;x=\"(\";charset=gbk" but got "text/html;x=(;charset=gbk" -FAIL text/html;charset=gbk;charset=windows-1255 (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;charset=gbk;charset=windows-1255" -FAIL text/html;charset=gbk;charset=windows-1255 (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;charset=gbk;charset=windows-1255" -FAIL text/html;charset=();charset=GBK (Blob/File) assert_equals: Blob expected "text/html;charset=\"()\"" but got "text/html;charset=();charset=gbk" -FAIL text/html;charset=();charset=GBK (Request/Response) assert_equals: expected "text/html;charset=\"()\"" but got "text/html;charset=();charset=gbk" -FAIL text/html;charset =gbk (Blob/File) assert_equals: Blob expected "text/html" but got "text/html;charset =gbk" -FAIL text/html;charset =gbk (Request/Response) assert_equals: expected "text/html" but got "text/html;charset =gbk" -FAIL text/html ;charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html ;charset=gbk" -FAIL text/html ;charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html ;charset=gbk" -FAIL text/html; charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html; charset=gbk" -FAIL text/html; charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html; charset=gbk" -FAIL text/html;charset= gbk (Blob/File) assert_equals: Blob expected "text/html;charset=\" gbk\"" but got "text/html;charset= gbk" -FAIL text/html;charset= gbk (Request/Response) assert_equals: expected "text/html;charset=\" gbk\"" but got "text/html;charset= gbk" -FAIL text/html;charset= "gbk" (Blob/File) assert_equals: Blob expected "text/html;charset=\" \\\"gbk\\\"\"" but got "text/html;charset= \"gbk\"" -FAIL text/html;charset= "gbk" (Request/Response) assert_equals: expected "text/html;charset=\" \\\"gbk\\\"\"" but got "text/html;charset= \"gbk\"" -FAIL text/html;charset=gbk (Blob/File) assert_equals: Blob expected "text/html" but got "" -FAIL text/html;charset=gbk (Request/Response) assert_equals: expected "text/html" but got "" -FAIL text/html;charset=gbk (Blob/File) assert_equals: Blob expected "text/html" but got "" -FAIL text/html;charset=gbk (Request/Response) assert_equals: expected "text/html" but got "" -FAIL text/html;charset=gbk (Blob/File) assert_equals: Blob expected "text/html" but got "" -FAIL text/html;charset=gbk (Request/Response) assert_equals: expected "text/html" but got "" -FAIL text/html;charset=gbk (Blob/File) assert_equals: Blob expected "text/html" but got "" -FAIL text/html;charset=gbk (Request/Response) assert_equals: expected "text/html" but got "" -PASS text/html;charset='gbk' (Blob/File) -PASS text/html;charset='gbk' (Request/Response) -PASS text/html;charset='gbk (Blob/File) -PASS text/html;charset='gbk (Request/Response) -PASS text/html;charset=gbk' (Blob/File) -PASS text/html;charset=gbk' (Request/Response) -FAIL text/html;charset=';charset=GBK (Blob/File) assert_equals: Blob expected "text/html;charset='" but got "text/html;charset=';charset=gbk" -FAIL text/html;charset=';charset=GBK (Request/Response) assert_equals: expected "text/html;charset='" but got "text/html;charset=';charset=gbk" -FAIL text/html;test;charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;test;charset=gbk" -FAIL text/html;test;charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;test;charset=gbk" -FAIL text/html;test=;charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;test=;charset=gbk" -FAIL text/html;test=;charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;test=;charset=gbk" -FAIL text/html;';charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;';charset=gbk" -FAIL text/html;';charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;';charset=gbk" -FAIL text/html;";charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;\";charset=gbk" -FAIL text/html;";charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;\";charset=gbk" -FAIL text/html ; ; charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html ; ; charset=gbk" -FAIL text/html ; ; charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html ; ; charset=gbk" -FAIL text/html;;;;charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;;;;charset=gbk" -FAIL text/html;;;;charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;;;;charset=gbk" -FAIL text/html;charset= ";charset=GBK (Blob/File) assert_equals: Blob expected "text/html;charset=GBK" but got "" -FAIL text/html;charset= ";charset=GBK (Request/Response) assert_equals: expected "text/html;charset=GBK" but got "" -FAIL text/html;charset=";charset=foo";charset=GBK (Blob/File) assert_equals: Blob expected "text/html;charset=GBK" but got "" -FAIL text/html;charset=";charset=foo";charset=GBK (Request/Response) assert_equals: expected "text/html;charset=GBK" but got "" -FAIL text/html;charset="gbk" (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;charset=\"gbk\"" -FAIL text/html;charset="gbk" (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;charset=\"gbk\"" -FAIL text/html;charset="gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;charset=\"gbk" -FAIL text/html;charset="gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;charset=\"gbk" -FAIL text/html;charset=gbk" (Blob/File) assert_equals: Blob expected "text/html;charset=\"gbk\\\"\"" but got "text/html;charset=gbk\"" -FAIL text/html;charset=gbk" (Request/Response) assert_equals: expected "text/html;charset=\"gbk\\\"\"" but got "text/html;charset=gbk\"" -PASS text/html;charset=" gbk" (Blob/File) -PASS text/html;charset=" gbk" (Request/Response) -PASS text/html;charset="gbk " (Blob/File) -PASS text/html;charset="gbk " (Request/Response) -FAIL text/html;charset="\ gbk" (Blob/File) assert_equals: Blob expected "text/html;charset=\" gbk\"" but got "text/html;charset=\"\\ gbk\"" -FAIL text/html;charset="\ gbk" (Request/Response) assert_equals: expected "text/html;charset=\" gbk\"" but got "text/html;charset=\"\\ gbk\"" -FAIL text/html;charset="\g\b\k" (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;charset=\"\\g\\b\\k\"" -FAIL text/html;charset="\g\b\k" (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;charset=\"\\g\\b\\k\"" -FAIL text/html;charset="gbk"x (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;charset=\"gbk\"x" -FAIL text/html;charset="gbk"x (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;charset=\"gbk\"x" -FAIL text/html;charset="";charset=GBK (Blob/File) assert_equals: Blob expected "text/html;charset=\"\"" but got "text/html;charset=\"\";charset=gbk" -FAIL text/html;charset="";charset=GBK (Request/Response) assert_equals: expected "text/html;charset=\"\"" but got "text/html;charset=\"\";charset=gbk" -FAIL text/html;charset=";charset=GBK (Blob/File) assert_equals: Blob expected "text/html;charset=\";charset=GBK\"" but got "text/html;charset=\";charset=gbk" -FAIL text/html;charset=";charset=GBK (Request/Response) assert_equals: expected "text/html;charset=\";charset=GBK\"" but got "text/html;charset=\";charset=gbk" -FAIL text/html;charset={gbk} (Blob/File) assert_equals: Blob expected "text/html;charset=\"{gbk}\"" but got "text/html;charset={gbk}" -FAIL text/html;charset={gbk} (Request/Response) assert_equals: expected "text/html;charset=\"{gbk}\"" but got "text/html;charset={gbk}" -PASS text/html;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789=x;charset=gbk (Blob/File) -PASS text/html;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789=x;charset=gbk (Request/Response) -PASS 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 (Blob/File) -PASS 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 (Request/Response) -FAIL text/html;a]=bar;b[=bar;c=bar (Blob/File) assert_equals: Blob expected "text/html;c=bar" but got "text/html;a]=bar;b[=bar;c=bar" -FAIL text/html;a]=bar;b[=bar;c=bar (Request/Response) assert_equals: expected "text/html;c=bar" but got "text/html;a]=bar;b[=bar;c=bar" -PASS text/html;valid=";";foo=bar (Blob/File) -PASS text/html;valid=";";foo=bar (Request/Response) -FAIL text/html;in]valid=";asd=foo";foo=bar (Blob/File) assert_equals: Blob expected "text/html;foo=bar" but got "text/html;in]valid=\";asd=foo\";foo=bar" -FAIL text/html;in]valid=";asd=foo";foo=bar (Request/Response) assert_equals: expected "text/html;foo=bar" but got "text/html;in]valid=\";asd=foo\";foo=bar" -FAIL !#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz (Blob/File) assert_equals: Blob expected "!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" but got "!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" -FAIL !#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz (Request/Response) assert_equals: expected "!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" but got "!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" -FAIL x/x;x=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" (Blob/File) assert_equals: Blob expected "x/x;x=\"\t !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"" but got "" -FAIL x/x;x=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" (Request/Response) assert_equals: expected "x/x;x=\"\t !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"" but got "" -FAIL x/x;test (Blob/File) assert_equals: Blob expected "x/x" but got "x/x;test" -FAIL x/x;test (Request/Response) assert_equals: expected "x/x" but got "x/x;test" -FAIL x/x;test="\ (Blob/File) assert_equals: Blob expected "x/x;test=\"\\\\\"" but got "x/x;test=\"\\" -FAIL x/x;test="\ (Request/Response) assert_equals: expected "x/x;test=\"\\\\\"" but got "x/x;test=\"\\" -FAIL x/x;x= (Blob/File) assert_equals: Blob expected "x/x" but got "x/x;x= " -FAIL x/x;x= (Request/Response) assert_equals: expected "x/x" but got "x/x;x=" -FAIL x/x;x= (Blob/File) assert_equals: Blob expected "x/x" but got "" -FAIL x/x;x= (Request/Response) assert_equals: expected "x/x" but got "x/x;x=" -FAIL x/x -\r ;x=x (Blob/File) assert_equals: Blob expected "x/x;x=x" but got "" -PASS x/x -\r ;x=x (Request/Response) -FAIL -\r x/x;x=x -\r (Blob/File) assert_equals: Blob expected "x/x;x=x" but got "" -FAIL -\r x/x;x=x -\r (Request/Response) assert_throws_js: function "() => new Request("about:blank", { headers: [["Content-Type", val.input]] })" did not throw -FAIL x/x; -\r x=x -\r ;x=y (Blob/File) assert_equals: Blob expected "x/x;x=x" but got "" -PASS x/x; -\r x=x -\r ;x=y (Request/Response) -FAIL text/html;test=ÿ;charset=gbk (Blob/File) assert_equals: Blob expected "text/html;test=\"ÿ\";charset=gbk" but got "" -FAIL text/html;test=ÿ;charset=gbk (Request/Response) assert_equals: expected "text/html;test=\"ÿ\";charset=gbk" but got "" -FAIL x/x;test=�;x=x (Blob/File) assert_equals: Blob expected "x/x;x=x" but got "" -PASS x/x;test=�;x=x (Request/Response) -PASS x/x (Blob/File) -PASS x/x (Request/Response) -PASS x/x (Blob/File) -PASS x/x (Request/Response) -PASS x/x (Blob/File) -PASS x/x (Request/Response) -PASS x/x (Blob/File) -PASS x/x (Request/Response) -PASS (Blob/File) -PASS (Request/Response) -PASS (Blob/File) -PASS (Request/Response) -FAIL / (Blob/File) assert_equals: Blob expected "" but got "/" -FAIL / (Request/Response) assert_equals: expected "" but got "/" -FAIL bogus (Blob/File) assert_equals: Blob expected "" but got "bogus" -FAIL bogus (Request/Response) assert_equals: expected "" but got "bogus" -FAIL bogus/ (Blob/File) assert_equals: Blob expected "" but got "bogus/" -FAIL bogus/ (Request/Response) assert_equals: expected "" but got "bogus/" -FAIL bogus/ (Blob/File) assert_equals: Blob expected "" but got "bogus/ " -FAIL bogus/ (Request/Response) assert_equals: expected "" but got "bogus/" -FAIL bogus/bogus/; (Blob/File) assert_equals: Blob expected "" but got "bogus/bogus/;" -FAIL bogus/bogus/; (Request/Response) assert_equals: expected "" but got "bogus/bogus/;" -FAIL </> (Blob/File) assert_equals: Blob expected "" but got "</>" -FAIL </> (Request/Response) assert_equals: expected "" but got "</>" -FAIL (/) (Blob/File) assert_equals: Blob expected "" but got "(/)" -FAIL (/) (Request/Response) assert_equals: expected "" but got "(/)" -PASS ÿ/ÿ (Blob/File) -PASS ÿ/ÿ (Request/Response) -FAIL text/html(;doesnot=matter (Blob/File) assert_equals: Blob expected "" but got "text/html(;doesnot=matter" -FAIL text/html(;doesnot=matter (Request/Response) assert_equals: expected "" but got "text/html(;doesnot=matter" -FAIL {/} (Blob/File) assert_equals: Blob expected "" but got "{/}" -FAIL {/} (Request/Response) assert_equals: expected "" but got "{/}" -PASS Ā/Ā (Blob/File) -PASS Ā/Ā (Request/Response) -FAIL text /html (Blob/File) assert_equals: Blob expected "" but got "text /html" -FAIL text /html (Request/Response) assert_equals: expected "" but got "text /html" -FAIL text/ html (Blob/File) assert_equals: Blob expected "" but got "text/ html" -FAIL text/ html (Request/Response) assert_equals: expected "" but got "text/ html" -FAIL "text/html" (Blob/File) assert_equals: Blob expected "" but got "\"text/html\"" -FAIL "text/html" (Request/Response) assert_equals: expected "" but got "\"text/html\"" -PASS \0/x (Blob/File) -PASS \0/x (Request/Response) -PASS x/\0 (Blob/File) -PASS x/\0 (Request/Response) -FAIL x/x;\0=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;\0=x;bonus=x (Request/Response) -FAIL x/x;x=\0;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;x=\0;bonus=x (Request/Response) -FAIL x/x;x="\0";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;x="\0";bonus=x (Request/Response) -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -FAIL /x (Request/Response) assert_equals: expected "" but got "/x" -PASS x/ (Blob/File) -FAIL x/ (Request/Response) assert_equals: expected "" but got "x/" -FAIL x/x; =x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x; =x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS -/x (Blob/File) -FAIL -/x (Request/Response) assert_throws_js: function "() => new Request("about:blank", { headers: [["Content-Type", val.input]] })" did not throw -PASS x/ - (Blob/File) -FAIL x/ - (Request/Response) assert_throws_js: function "() => new Request("about:blank", { headers: [["Content-Type", val.input]] })" did not throw -FAIL x/x; -=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x; -=x;bonus=x (Request/Response) -FAIL x/x;x= -;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;x= -;bonus=x (Request/Response) -FAIL x/x;x=" -";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;x=" -";bonus=x (Request/Response) -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS \r/x (Blob/File) -FAIL \r/x (Request/Response) assert_throws_js: function "() => new Request("about:blank", { headers: [["Content-Type", val.input]] })" did not throw -PASS x/\r (Blob/File) -FAIL x/\r (Request/Response) assert_throws_js: function "() => new Request("about:blank", { headers: [["Content-Type", val.input]] })" did not throw -FAIL x/x;\r=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;\r=x;bonus=x (Request/Response) -FAIL x/x;x=\r;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;x=\r;bonus=x (Request/Response) -FAIL x/x;x="\r";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;x="\r";bonus=x (Request/Response) -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL /x (Blob/File) assert_equals: Blob expected "" but got " /x" -FAIL /x (Request/Response) assert_equals: expected "" but got "/x" -FAIL x/ (Blob/File) assert_equals: Blob expected "" but got "x/ " -FAIL x/ (Request/Response) assert_equals: expected "" but got "x/" -FAIL x/x; =x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x; =x;bonus=x" -FAIL x/x; =x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x; =x;bonus=x" -FAIL "/x (Blob/File) assert_equals: Blob expected "" but got "\"/x" -FAIL "/x (Request/Response) assert_equals: expected "" but got "\"/x" -FAIL x/" (Blob/File) assert_equals: Blob expected "" but got "x/\"" -FAIL x/" (Request/Response) assert_equals: expected "" but got "x/\"" -FAIL x/x;"=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;\"=x;bonus=x" -FAIL x/x;"=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;\"=x;bonus=x" -FAIL (/x (Blob/File) assert_equals: Blob expected "" but got "(/x" -FAIL (/x (Request/Response) assert_equals: expected "" but got "(/x" -FAIL x/( (Blob/File) assert_equals: Blob expected "" but got "x/(" -FAIL x/( (Request/Response) assert_equals: expected "" but got "x/(" -FAIL x/x;(=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;(=x;bonus=x" -FAIL x/x;(=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;(=x;bonus=x" -FAIL x/x;x=(;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"(\";bonus=x" but got "x/x;x=(;bonus=x" -FAIL x/x;x=(;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"(\";bonus=x" but got "x/x;x=(;bonus=x" -PASS x/x;x="(";bonus=x (Blob/File) -PASS x/x;x="(";bonus=x (Request/Response) -FAIL )/x (Blob/File) assert_equals: Blob expected "" but got ")/x" -FAIL )/x (Request/Response) assert_equals: expected "" but got ")/x" -FAIL x/) (Blob/File) assert_equals: Blob expected "" but got "x/)" -FAIL x/) (Request/Response) assert_equals: expected "" but got "x/)" -FAIL x/x;)=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;)=x;bonus=x" -FAIL x/x;)=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;)=x;bonus=x" -FAIL x/x;x=);bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\")\";bonus=x" but got "x/x;x=);bonus=x" -FAIL x/x;x=);bonus=x (Request/Response) assert_equals: expected "x/x;x=\")\";bonus=x" but got "x/x;x=);bonus=x" -PASS x/x;x=")";bonus=x (Blob/File) -PASS x/x;x=")";bonus=x (Request/Response) -FAIL ,/x (Blob/File) assert_equals: Blob expected "" but got ",/x" -FAIL ,/x (Request/Response) assert_equals: expected "" but got ",/x" -FAIL x/, (Blob/File) assert_equals: Blob expected "" but got "x/," -FAIL x/, (Request/Response) assert_equals: expected "" but got "x/," -FAIL x/x;,=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;,=x;bonus=x" -FAIL x/x;,=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;,=x;bonus=x" -FAIL x/x;x=,;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\",\";bonus=x" but got "x/x;x=,;bonus=x" -FAIL x/x;x=,;bonus=x (Request/Response) assert_equals: expected "x/x;x=\",\";bonus=x" but got "x/x;x=,;bonus=x" -PASS x/x;x=",";bonus=x (Blob/File) -PASS x/x;x=",";bonus=x (Request/Response) -FAIL x/x;/=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;/=x;bonus=x" -FAIL x/x;/=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;/=x;bonus=x" -FAIL x/x;x=/;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"/\";bonus=x" but got "x/x;x=/;bonus=x" -FAIL x/x;x=/;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"/\";bonus=x" but got "x/x;x=/;bonus=x" -PASS x/x;x="/";bonus=x (Blob/File) -PASS x/x;x="/";bonus=x (Request/Response) -FAIL :/x (Blob/File) assert_equals: Blob expected "" but got ":/x" -FAIL :/x (Request/Response) assert_equals: expected "" but got ":/x" -FAIL x/: (Blob/File) assert_equals: Blob expected "" but got "x/:" -FAIL x/: (Request/Response) assert_equals: expected "" but got "x/:" -FAIL x/x;:=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;:=x;bonus=x" -FAIL x/x;:=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;:=x;bonus=x" -FAIL x/x;x=:;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\":\";bonus=x" but got "x/x;x=:;bonus=x" -FAIL x/x;x=:;bonus=x (Request/Response) assert_equals: expected "x/x;x=\":\";bonus=x" but got "x/x;x=:;bonus=x" -PASS x/x;x=":";bonus=x (Blob/File) -PASS x/x;x=":";bonus=x (Request/Response) -FAIL ;/x (Blob/File) assert_equals: Blob expected "" but got ";/x" -FAIL ;/x (Request/Response) assert_equals: expected "" but got ";/x" -FAIL x/; (Blob/File) assert_equals: Blob expected "" but got "x/;" -FAIL x/; (Request/Response) assert_equals: expected "" but got "x/;" -FAIL </x (Blob/File) assert_equals: Blob expected "" but got "</x" -FAIL </x (Request/Response) assert_equals: expected "" but got "</x" -FAIL x/< (Blob/File) assert_equals: Blob expected "" but got "x/<" -FAIL x/< (Request/Response) assert_equals: expected "" but got "x/<" -FAIL x/x;<=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;<=x;bonus=x" -FAIL x/x;<=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;<=x;bonus=x" -FAIL x/x;x=<;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"<\";bonus=x" but got "x/x;x=<;bonus=x" -FAIL x/x;x=<;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"<\";bonus=x" but got "x/x;x=<;bonus=x" -PASS x/x;x="<";bonus=x (Blob/File) -PASS x/x;x="<";bonus=x (Request/Response) -FAIL =/x (Blob/File) assert_equals: Blob expected "" but got "=/x" -FAIL =/x (Request/Response) assert_equals: expected "" but got "=/x" -FAIL x/= (Blob/File) assert_equals: Blob expected "" but got "x/=" -FAIL x/= (Request/Response) assert_equals: expected "" but got "x/=" -FAIL x/x;x==;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"=\";bonus=x" but got "x/x;x==;bonus=x" -FAIL x/x;x==;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"=\";bonus=x" but got "x/x;x==;bonus=x" -PASS x/x;x="=";bonus=x (Blob/File) -PASS x/x;x="=";bonus=x (Request/Response) -FAIL >/x (Blob/File) assert_equals: Blob expected "" but got ">/x" -FAIL >/x (Request/Response) assert_equals: expected "" but got ">/x" -FAIL x/> (Blob/File) assert_equals: Blob expected "" but got "x/>" -FAIL x/> (Request/Response) assert_equals: expected "" but got "x/>" -FAIL x/x;>=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;>=x;bonus=x" -FAIL x/x;>=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;>=x;bonus=x" -FAIL x/x;x=>;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\">\";bonus=x" but got "x/x;x=>;bonus=x" -FAIL x/x;x=>;bonus=x (Request/Response) assert_equals: expected "x/x;x=\">\";bonus=x" but got "x/x;x=>;bonus=x" -PASS x/x;x=">";bonus=x (Blob/File) -PASS x/x;x=">";bonus=x (Request/Response) -FAIL ?/x (Blob/File) assert_equals: Blob expected "" but got "?/x" -FAIL ?/x (Request/Response) assert_equals: expected "" but got "?/x" -FAIL x/? (Blob/File) assert_equals: Blob expected "" but got "x/?" -FAIL x/? (Request/Response) assert_equals: expected "" but got "x/?" -FAIL x/x;?=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;?=x;bonus=x" -FAIL x/x;?=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;?=x;bonus=x" -FAIL x/x;x=?;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"?\";bonus=x" but got "x/x;x=?;bonus=x" -FAIL x/x;x=?;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"?\";bonus=x" but got "x/x;x=?;bonus=x" -PASS x/x;x="?";bonus=x (Blob/File) -PASS x/x;x="?";bonus=x (Request/Response) -FAIL @/x (Blob/File) assert_equals: Blob expected "" but got "@/x" -FAIL @/x (Request/Response) assert_equals: expected "" but got "@/x" -FAIL x/@ (Blob/File) assert_equals: Blob expected "" but got "x/@" -FAIL x/@ (Request/Response) assert_equals: expected "" but got "x/@" -FAIL x/x;@=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;@=x;bonus=x" -FAIL x/x;@=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;@=x;bonus=x" -FAIL x/x;x=@;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"@\";bonus=x" but got "x/x;x=@;bonus=x" -FAIL x/x;x=@;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"@\";bonus=x" but got "x/x;x=@;bonus=x" -PASS x/x;x="@";bonus=x (Blob/File) -PASS x/x;x="@";bonus=x (Request/Response) -FAIL [/x (Blob/File) assert_equals: Blob expected "" but got "[/x" -FAIL [/x (Request/Response) assert_equals: expected "" but got "[/x" -FAIL x/[ (Blob/File) assert_equals: Blob expected "" but got "x/[" -FAIL x/[ (Request/Response) assert_equals: expected "" but got "x/[" -FAIL x/x;[=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;[=x;bonus=x" -FAIL x/x;[=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;[=x;bonus=x" -FAIL x/x;x=[;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"[\";bonus=x" but got "x/x;x=[;bonus=x" -FAIL x/x;x=[;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"[\";bonus=x" but got "x/x;x=[;bonus=x" -PASS x/x;x="[";bonus=x (Blob/File) -PASS x/x;x="[";bonus=x (Request/Response) -FAIL \/x (Blob/File) assert_equals: Blob expected "" but got "\\/x" -FAIL \/x (Request/Response) assert_equals: expected "" but got "\\/x" -FAIL x/\ (Blob/File) assert_equals: Blob expected "" but got "x/\\" -FAIL x/\ (Request/Response) assert_equals: expected "" but got "x/\\" -FAIL x/x;\=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;\\=x;bonus=x" -FAIL x/x;\=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;\\=x;bonus=x" -FAIL ]/x (Blob/File) assert_equals: Blob expected "" but got "]/x" -FAIL ]/x (Request/Response) assert_equals: expected "" but got "]/x" -FAIL x/] (Blob/File) assert_equals: Blob expected "" but got "x/]" -FAIL x/] (Request/Response) assert_equals: expected "" but got "x/]" -FAIL x/x;]=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;]=x;bonus=x" -FAIL x/x;]=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;]=x;bonus=x" -FAIL x/x;x=];bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"]\";bonus=x" but got "x/x;x=];bonus=x" -FAIL x/x;x=];bonus=x (Request/Response) assert_equals: expected "x/x;x=\"]\";bonus=x" but got "x/x;x=];bonus=x" -PASS x/x;x="]";bonus=x (Blob/File) -PASS x/x;x="]";bonus=x (Request/Response) -FAIL {/x (Blob/File) assert_equals: Blob expected "" but got "{/x" -FAIL {/x (Request/Response) assert_equals: expected "" but got "{/x" -FAIL x/{ (Blob/File) assert_equals: Blob expected "" but got "x/{" -FAIL x/{ (Request/Response) assert_equals: expected "" but got "x/{" -FAIL x/x;{=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;{=x;bonus=x" -FAIL x/x;{=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;{=x;bonus=x" -FAIL x/x;x={;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"{\";bonus=x" but got "x/x;x={;bonus=x" -FAIL x/x;x={;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"{\";bonus=x" but got "x/x;x={;bonus=x" -PASS x/x;x="{";bonus=x (Blob/File) -PASS x/x;x="{";bonus=x (Request/Response) -FAIL }/x (Blob/File) assert_equals: Blob expected "" but got "}/x" -FAIL }/x (Request/Response) assert_equals: expected "" but got "}/x" -FAIL x/} (Blob/File) assert_equals: Blob expected "" but got "x/}" -FAIL x/} (Request/Response) assert_equals: expected "" but got "x/}" -FAIL x/x;}=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;}=x;bonus=x" -FAIL x/x;}=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;}=x;bonus=x" -FAIL x/x;x=};bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"}\";bonus=x" but got "x/x;x=};bonus=x" -FAIL x/x;x=};bonus=x (Request/Response) assert_equals: expected "x/x;x=\"}\";bonus=x" but got "x/x;x=};bonus=x" -PASS x/x;x="}";bonus=x (Blob/File) -PASS x/x;x="}";bonus=x (Request/Response) -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x; =x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x; =x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x= ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\" \";bonus=x" but got "" -FAIL x/x;x= ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\" \";bonus=x" but got "" -FAIL x/x;x=" ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\" \";bonus=x" but got "" -FAIL x/x;x=" ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\" \";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x; =x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x; =x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x= ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\" \";bonus=x" but got "" -FAIL x/x;x= ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\" \";bonus=x" but got "" -FAIL x/x;x=" ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\" \";bonus=x" but got "" -FAIL x/x;x=" ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\" \";bonus=x" but got "" -PASS ¡/x (Blob/File) -PASS ¡/x (Request/Response) -PASS x/¡ (Blob/File) -PASS x/¡ (Request/Response) -FAIL x/x;¡=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¡=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¡;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¡\";bonus=x" but got "" -FAIL x/x;x=¡;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¡\";bonus=x" but got "" -FAIL x/x;x="¡";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¡\";bonus=x" but got "" -FAIL x/x;x="¡";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¡\";bonus=x" but got "" -PASS ¢/x (Blob/File) -PASS ¢/x (Request/Response) -PASS x/¢ (Blob/File) -PASS x/¢ (Request/Response) -FAIL x/x;¢=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¢=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¢;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¢\";bonus=x" but got "" -FAIL x/x;x=¢;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¢\";bonus=x" but got "" -FAIL x/x;x="¢";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¢\";bonus=x" but got "" -FAIL x/x;x="¢";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¢\";bonus=x" but got "" -PASS £/x (Blob/File) -PASS £/x (Request/Response) -PASS x/£ (Blob/File) -PASS x/£ (Request/Response) -FAIL x/x;£=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;£=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=£;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"£\";bonus=x" but got "" -FAIL x/x;x=£;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"£\";bonus=x" but got "" -FAIL x/x;x="£";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"£\";bonus=x" but got "" -FAIL x/x;x="£";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"£\";bonus=x" but got "" -PASS ¤/x (Blob/File) -PASS ¤/x (Request/Response) -PASS x/¤ (Blob/File) -PASS x/¤ (Request/Response) -FAIL x/x;¤=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¤=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¤;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¤\";bonus=x" but got "" -FAIL x/x;x=¤;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¤\";bonus=x" but got "" -FAIL x/x;x="¤";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¤\";bonus=x" but got "" -FAIL x/x;x="¤";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¤\";bonus=x" but got "" -PASS ¥/x (Blob/File) -PASS ¥/x (Request/Response) -PASS x/¥ (Blob/File) -PASS x/¥ (Request/Response) -FAIL x/x;¥=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¥=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¥;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¥\";bonus=x" but got "" -FAIL x/x;x=¥;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¥\";bonus=x" but got "" -FAIL x/x;x="¥";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¥\";bonus=x" but got "" -FAIL x/x;x="¥";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¥\";bonus=x" but got "" -PASS ¦/x (Blob/File) -PASS ¦/x (Request/Response) -PASS x/¦ (Blob/File) -PASS x/¦ (Request/Response) -FAIL x/x;¦=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¦=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¦;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¦\";bonus=x" but got "" -FAIL x/x;x=¦;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¦\";bonus=x" but got "" -FAIL x/x;x="¦";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¦\";bonus=x" but got "" -FAIL x/x;x="¦";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¦\";bonus=x" but got "" -PASS §/x (Blob/File) -PASS §/x (Request/Response) -PASS x/§ (Blob/File) -PASS x/§ (Request/Response) -FAIL x/x;§=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;§=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=§;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"§\";bonus=x" but got "" -FAIL x/x;x=§;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"§\";bonus=x" but got "" -FAIL x/x;x="§";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"§\";bonus=x" but got "" -FAIL x/x;x="§";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"§\";bonus=x" but got "" -PASS ¨/x (Blob/File) -PASS ¨/x (Request/Response) -PASS x/¨ (Blob/File) -PASS x/¨ (Request/Response) -FAIL x/x;¨=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¨=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¨;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¨\";bonus=x" but got "" -FAIL x/x;x=¨;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¨\";bonus=x" but got "" -FAIL x/x;x="¨";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¨\";bonus=x" but got "" -FAIL x/x;x="¨";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¨\";bonus=x" but got "" -PASS ©/x (Blob/File) -PASS ©/x (Request/Response) -PASS x/© (Blob/File) -PASS x/© (Request/Response) -FAIL x/x;©=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;©=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=©;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"©\";bonus=x" but got "" -FAIL x/x;x=©;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"©\";bonus=x" but got "" -FAIL x/x;x="©";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"©\";bonus=x" but got "" -FAIL x/x;x="©";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"©\";bonus=x" but got "" -PASS ª/x (Blob/File) -PASS ª/x (Request/Response) -PASS x/ª (Blob/File) -PASS x/ª (Request/Response) -FAIL x/x;ª=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ª=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ª;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ª\";bonus=x" but got "" -FAIL x/x;x=ª;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ª\";bonus=x" but got "" -FAIL x/x;x="ª";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ª\";bonus=x" but got "" -FAIL x/x;x="ª";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ª\";bonus=x" but got "" -PASS «/x (Blob/File) -PASS «/x (Request/Response) -PASS x/« (Blob/File) -PASS x/« (Request/Response) -FAIL x/x;«=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;«=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=«;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"«\";bonus=x" but got "" -FAIL x/x;x=«;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"«\";bonus=x" but got "" -FAIL x/x;x="«";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"«\";bonus=x" but got "" -FAIL x/x;x="«";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"«\";bonus=x" but got "" -PASS ¬/x (Blob/File) -PASS ¬/x (Request/Response) -PASS x/¬ (Blob/File) -PASS x/¬ (Request/Response) -FAIL x/x;¬=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¬=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¬;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¬\";bonus=x" but got "" -FAIL x/x;x=¬;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¬\";bonus=x" but got "" -FAIL x/x;x="¬";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¬\";bonus=x" but got "" -FAIL x/x;x="¬";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¬\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS ®/x (Blob/File) -PASS ®/x (Request/Response) -PASS x/® (Blob/File) -PASS x/® (Request/Response) -FAIL x/x;®=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;®=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=®;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"®\";bonus=x" but got "" -FAIL x/x;x=®;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"®\";bonus=x" but got "" -FAIL x/x;x="®";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"®\";bonus=x" but got "" -FAIL x/x;x="®";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"®\";bonus=x" but got "" -PASS ¯/x (Blob/File) -PASS ¯/x (Request/Response) -PASS x/¯ (Blob/File) -PASS x/¯ (Request/Response) -FAIL x/x;¯=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¯=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¯;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¯\";bonus=x" but got "" -FAIL x/x;x=¯;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¯\";bonus=x" but got "" -FAIL x/x;x="¯";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¯\";bonus=x" but got "" -FAIL x/x;x="¯";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¯\";bonus=x" but got "" -PASS °/x (Blob/File) -PASS °/x (Request/Response) -PASS x/° (Blob/File) -PASS x/° (Request/Response) -FAIL x/x;°=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;°=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=°;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"°\";bonus=x" but got "" -FAIL x/x;x=°;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"°\";bonus=x" but got "" -FAIL x/x;x="°";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"°\";bonus=x" but got "" -FAIL x/x;x="°";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"°\";bonus=x" but got "" -PASS ±/x (Blob/File) -PASS ±/x (Request/Response) -PASS x/± (Blob/File) -PASS x/± (Request/Response) -FAIL x/x;±=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;±=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=±;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"±\";bonus=x" but got "" -FAIL x/x;x=±;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"±\";bonus=x" but got "" -FAIL x/x;x="±";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"±\";bonus=x" but got "" -FAIL x/x;x="±";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"±\";bonus=x" but got "" -PASS ²/x (Blob/File) -PASS ²/x (Request/Response) -PASS x/² (Blob/File) -PASS x/² (Request/Response) -FAIL x/x;²=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;²=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=²;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"²\";bonus=x" but got "" -FAIL x/x;x=²;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"²\";bonus=x" but got "" -FAIL x/x;x="²";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"²\";bonus=x" but got "" -FAIL x/x;x="²";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"²\";bonus=x" but got "" -PASS ³/x (Blob/File) -PASS ³/x (Request/Response) -PASS x/³ (Blob/File) -PASS x/³ (Request/Response) -FAIL x/x;³=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;³=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=³;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"³\";bonus=x" but got "" -FAIL x/x;x=³;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"³\";bonus=x" but got "" -FAIL x/x;x="³";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"³\";bonus=x" but got "" -FAIL x/x;x="³";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"³\";bonus=x" but got "" -PASS ´/x (Blob/File) -PASS ´/x (Request/Response) -PASS x/´ (Blob/File) -PASS x/´ (Request/Response) -FAIL x/x;´=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;´=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=´;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"´\";bonus=x" but got "" -FAIL x/x;x=´;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"´\";bonus=x" but got "" -FAIL x/x;x="´";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"´\";bonus=x" but got "" -FAIL x/x;x="´";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"´\";bonus=x" but got "" -PASS µ/x (Blob/File) -PASS µ/x (Request/Response) -PASS x/µ (Blob/File) -PASS x/µ (Request/Response) -FAIL x/x;µ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;µ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=µ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"µ\";bonus=x" but got "" -FAIL x/x;x=µ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"µ\";bonus=x" but got "" -FAIL x/x;x="µ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"µ\";bonus=x" but got "" -FAIL x/x;x="µ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"µ\";bonus=x" but got "" -PASS ¶/x (Blob/File) -PASS ¶/x (Request/Response) -PASS x/¶ (Blob/File) -PASS x/¶ (Request/Response) -FAIL x/x;¶=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¶=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¶;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¶\";bonus=x" but got "" -FAIL x/x;x=¶;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¶\";bonus=x" but got "" -FAIL x/x;x="¶";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¶\";bonus=x" but got "" -FAIL x/x;x="¶";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¶\";bonus=x" but got "" -PASS ·/x (Blob/File) -PASS ·/x (Request/Response) -PASS x/· (Blob/File) -PASS x/· (Request/Response) -FAIL x/x;·=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;·=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=·;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"·\";bonus=x" but got "" -FAIL x/x;x=·;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"·\";bonus=x" but got "" -FAIL x/x;x="·";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"·\";bonus=x" but got "" -FAIL x/x;x="·";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"·\";bonus=x" but got "" -PASS ¸/x (Blob/File) -PASS ¸/x (Request/Response) -PASS x/¸ (Blob/File) -PASS x/¸ (Request/Response) -FAIL x/x;¸=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¸=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¸;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¸\";bonus=x" but got "" -FAIL x/x;x=¸;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¸\";bonus=x" but got "" -FAIL x/x;x="¸";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¸\";bonus=x" but got "" -FAIL x/x;x="¸";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¸\";bonus=x" but got "" -PASS ¹/x (Blob/File) -PASS ¹/x (Request/Response) -PASS x/¹ (Blob/File) -PASS x/¹ (Request/Response) -FAIL x/x;¹=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¹=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¹;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¹\";bonus=x" but got "" -FAIL x/x;x=¹;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¹\";bonus=x" but got "" -FAIL x/x;x="¹";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¹\";bonus=x" but got "" -FAIL x/x;x="¹";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¹\";bonus=x" but got "" -PASS º/x (Blob/File) -PASS º/x (Request/Response) -PASS x/º (Blob/File) -PASS x/º (Request/Response) -FAIL x/x;º=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;º=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=º;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"º\";bonus=x" but got "" -FAIL x/x;x=º;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"º\";bonus=x" but got "" -FAIL x/x;x="º";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"º\";bonus=x" but got "" -FAIL x/x;x="º";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"º\";bonus=x" but got "" -PASS »/x (Blob/File) -PASS »/x (Request/Response) -PASS x/» (Blob/File) -PASS x/» (Request/Response) -FAIL x/x;»=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;»=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=»;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"»\";bonus=x" but got "" -FAIL x/x;x=»;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"»\";bonus=x" but got "" -FAIL x/x;x="»";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"»\";bonus=x" but got "" -FAIL x/x;x="»";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"»\";bonus=x" but got "" -PASS ¼/x (Blob/File) -PASS ¼/x (Request/Response) -PASS x/¼ (Blob/File) -PASS x/¼ (Request/Response) -FAIL x/x;¼=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¼=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¼;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¼\";bonus=x" but got "" -FAIL x/x;x=¼;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¼\";bonus=x" but got "" -FAIL x/x;x="¼";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¼\";bonus=x" but got "" -FAIL x/x;x="¼";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¼\";bonus=x" but got "" -PASS ½/x (Blob/File) -PASS ½/x (Request/Response) -PASS x/½ (Blob/File) -PASS x/½ (Request/Response) -FAIL x/x;½=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;½=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=½;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"½\";bonus=x" but got "" -FAIL x/x;x=½;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"½\";bonus=x" but got "" -FAIL x/x;x="½";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"½\";bonus=x" but got "" -FAIL x/x;x="½";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"½\";bonus=x" but got "" -PASS ¾/x (Blob/File) -PASS ¾/x (Request/Response) -PASS x/¾ (Blob/File) -PASS x/¾ (Request/Response) -FAIL x/x;¾=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¾=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¾;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¾\";bonus=x" but got "" -FAIL x/x;x=¾;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¾\";bonus=x" but got "" -FAIL x/x;x="¾";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¾\";bonus=x" but got "" -FAIL x/x;x="¾";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¾\";bonus=x" but got "" -PASS ¿/x (Blob/File) -PASS ¿/x (Request/Response) -PASS x/¿ (Blob/File) -PASS x/¿ (Request/Response) -FAIL x/x;¿=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¿=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¿;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¿\";bonus=x" but got "" -FAIL x/x;x=¿;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¿\";bonus=x" but got "" -FAIL x/x;x="¿";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¿\";bonus=x" but got "" -FAIL x/x;x="¿";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¿\";bonus=x" but got "" -PASS À/x (Blob/File) -PASS À/x (Request/Response) -PASS x/À (Blob/File) -PASS x/À (Request/Response) -FAIL x/x;À=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;À=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=À;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"À\";bonus=x" but got "" -FAIL x/x;x=À;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"À\";bonus=x" but got "" -FAIL x/x;x="À";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"À\";bonus=x" but got "" -FAIL x/x;x="À";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"À\";bonus=x" but got "" -PASS Á/x (Blob/File) -PASS Á/x (Request/Response) -PASS x/Á (Blob/File) -PASS x/Á (Request/Response) -FAIL x/x;Á=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Á=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Á;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Á\";bonus=x" but got "" -FAIL x/x;x=Á;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Á\";bonus=x" but got "" -FAIL x/x;x="Á";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Á\";bonus=x" but got "" -FAIL x/x;x="Á";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Á\";bonus=x" but got "" -PASS Â/x (Blob/File) -PASS Â/x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;Â=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Â=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Â;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Â\";bonus=x" but got "" -FAIL x/x;x=Â;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Â\";bonus=x" but got "" -FAIL x/x;x="Â";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Â\";bonus=x" but got "" -FAIL x/x;x="Â";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Â\";bonus=x" but got "" -PASS Ã/x (Blob/File) -PASS Ã/x (Request/Response) -PASS x/à (Blob/File) -PASS x/à (Request/Response) -FAIL x/x;Ã=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ã=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ã;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ã\";bonus=x" but got "" -FAIL x/x;x=Ã;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ã\";bonus=x" but got "" -FAIL x/x;x="Ã";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ã\";bonus=x" but got "" -FAIL x/x;x="Ã";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ã\";bonus=x" but got "" -PASS Ä/x (Blob/File) -PASS Ä/x (Request/Response) -PASS x/Ä (Blob/File) -PASS x/Ä (Request/Response) -FAIL x/x;Ä=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ä=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ä;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ä\";bonus=x" but got "" -FAIL x/x;x=Ä;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ä\";bonus=x" but got "" -FAIL x/x;x="Ä";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ä\";bonus=x" but got "" -FAIL x/x;x="Ä";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ä\";bonus=x" but got "" -PASS Å/x (Blob/File) -PASS Å/x (Request/Response) -PASS x/Å (Blob/File) -PASS x/Å (Request/Response) -FAIL x/x;Å=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Å=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Å;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Å\";bonus=x" but got "" -FAIL x/x;x=Å;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Å\";bonus=x" but got "" -FAIL x/x;x="Å";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Å\";bonus=x" but got "" -FAIL x/x;x="Å";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Å\";bonus=x" but got "" -PASS Æ/x (Blob/File) -PASS Æ/x (Request/Response) -PASS x/Æ (Blob/File) -PASS x/Æ (Request/Response) -FAIL x/x;Æ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Æ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Æ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Æ\";bonus=x" but got "" -FAIL x/x;x=Æ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Æ\";bonus=x" but got "" -FAIL x/x;x="Æ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Æ\";bonus=x" but got "" -FAIL x/x;x="Æ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Æ\";bonus=x" but got "" -PASS Ç/x (Blob/File) -PASS Ç/x (Request/Response) -PASS x/Ç (Blob/File) -PASS x/Ç (Request/Response) -FAIL x/x;Ç=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ç=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ç;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ç\";bonus=x" but got "" -FAIL x/x;x=Ç;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ç\";bonus=x" but got "" -FAIL x/x;x="Ç";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ç\";bonus=x" but got "" -FAIL x/x;x="Ç";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ç\";bonus=x" but got "" -PASS È/x (Blob/File) -PASS È/x (Request/Response) -PASS x/È (Blob/File) -PASS x/È (Request/Response) -FAIL x/x;È=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;È=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=È;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"È\";bonus=x" but got "" -FAIL x/x;x=È;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"È\";bonus=x" but got "" -FAIL x/x;x="È";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"È\";bonus=x" but got "" -FAIL x/x;x="È";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"È\";bonus=x" but got "" -PASS É/x (Blob/File) -PASS É/x (Request/Response) -PASS x/É (Blob/File) -PASS x/É (Request/Response) -FAIL x/x;É=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;É=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=É;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"É\";bonus=x" but got "" -FAIL x/x;x=É;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"É\";bonus=x" but got "" -FAIL x/x;x="É";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"É\";bonus=x" but got "" -FAIL x/x;x="É";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"É\";bonus=x" but got "" -PASS Ê/x (Blob/File) -PASS Ê/x (Request/Response) -PASS x/Ê (Blob/File) -PASS x/Ê (Request/Response) -FAIL x/x;Ê=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ê=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ê;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ê\";bonus=x" but got "" -FAIL x/x;x=Ê;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ê\";bonus=x" but got "" -FAIL x/x;x="Ê";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ê\";bonus=x" but got "" -FAIL x/x;x="Ê";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ê\";bonus=x" but got "" -PASS Ë/x (Blob/File) -PASS Ë/x (Request/Response) -PASS x/Ë (Blob/File) -PASS x/Ë (Request/Response) -FAIL x/x;Ë=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ë=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ë;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ë\";bonus=x" but got "" -FAIL x/x;x=Ë;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ë\";bonus=x" but got "" -FAIL x/x;x="Ë";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ë\";bonus=x" but got "" -FAIL x/x;x="Ë";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ë\";bonus=x" but got "" -PASS Ì/x (Blob/File) -PASS Ì/x (Request/Response) -PASS x/Ì (Blob/File) -PASS x/Ì (Request/Response) -FAIL x/x;Ì=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ì=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ì;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ì\";bonus=x" but got "" -FAIL x/x;x=Ì;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ì\";bonus=x" but got "" -FAIL x/x;x="Ì";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ì\";bonus=x" but got "" -FAIL x/x;x="Ì";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ì\";bonus=x" but got "" -PASS Í/x (Blob/File) -PASS Í/x (Request/Response) -PASS x/Í (Blob/File) -PASS x/Í (Request/Response) -FAIL x/x;Í=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Í=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Í;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Í\";bonus=x" but got "" -FAIL x/x;x=Í;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Í\";bonus=x" but got "" -FAIL x/x;x="Í";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Í\";bonus=x" but got "" -FAIL x/x;x="Í";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Í\";bonus=x" but got "" -PASS Î/x (Blob/File) -PASS Î/x (Request/Response) -PASS x/Î (Blob/File) -PASS x/Î (Request/Response) -FAIL x/x;Î=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Î=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Î;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Î\";bonus=x" but got "" -FAIL x/x;x=Î;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Î\";bonus=x" but got "" -FAIL x/x;x="Î";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Î\";bonus=x" but got "" -FAIL x/x;x="Î";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Î\";bonus=x" but got "" -PASS Ï/x (Blob/File) -PASS Ï/x (Request/Response) -PASS x/Ï (Blob/File) -PASS x/Ï (Request/Response) -FAIL x/x;Ï=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ï=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ï;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ï\";bonus=x" but got "" -FAIL x/x;x=Ï;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ï\";bonus=x" but got "" -FAIL x/x;x="Ï";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ï\";bonus=x" but got "" -FAIL x/x;x="Ï";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ï\";bonus=x" but got "" -PASS Ð/x (Blob/File) -PASS Ð/x (Request/Response) -PASS x/Ð (Blob/File) -PASS x/Ð (Request/Response) -FAIL x/x;Ð=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ð=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ð;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ð\";bonus=x" but got "" -FAIL x/x;x=Ð;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ð\";bonus=x" but got "" -FAIL x/x;x="Ð";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ð\";bonus=x" but got "" -FAIL x/x;x="Ð";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ð\";bonus=x" but got "" -PASS Ñ/x (Blob/File) -PASS Ñ/x (Request/Response) -PASS x/Ñ (Blob/File) -PASS x/Ñ (Request/Response) -FAIL x/x;Ñ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ñ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ñ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ñ\";bonus=x" but got "" -FAIL x/x;x=Ñ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ñ\";bonus=x" but got "" -FAIL x/x;x="Ñ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ñ\";bonus=x" but got "" -FAIL x/x;x="Ñ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ñ\";bonus=x" but got "" -PASS Ò/x (Blob/File) -PASS Ò/x (Request/Response) -PASS x/Ò (Blob/File) -PASS x/Ò (Request/Response) -FAIL x/x;Ò=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ò=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ò;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ò\";bonus=x" but got "" -FAIL x/x;x=Ò;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ò\";bonus=x" but got "" -FAIL x/x;x="Ò";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ò\";bonus=x" but got "" -FAIL x/x;x="Ò";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ò\";bonus=x" but got "" -PASS Ó/x (Blob/File) -PASS Ó/x (Request/Response) -PASS x/Ó (Blob/File) -PASS x/Ó (Request/Response) -FAIL x/x;Ó=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ó=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ó;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ó\";bonus=x" but got "" -FAIL x/x;x=Ó;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ó\";bonus=x" but got "" -FAIL x/x;x="Ó";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ó\";bonus=x" but got "" -FAIL x/x;x="Ó";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ó\";bonus=x" but got "" -PASS Ô/x (Blob/File) -PASS Ô/x (Request/Response) -PASS x/Ô (Blob/File) -PASS x/Ô (Request/Response) -FAIL x/x;Ô=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ô=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ô;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ô\";bonus=x" but got "" -FAIL x/x;x=Ô;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ô\";bonus=x" but got "" -FAIL x/x;x="Ô";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ô\";bonus=x" but got "" -FAIL x/x;x="Ô";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ô\";bonus=x" but got "" -PASS Õ/x (Blob/File) -PASS Õ/x (Request/Response) -PASS x/Õ (Blob/File) -PASS x/Õ (Request/Response) -FAIL x/x;Õ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Õ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Õ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Õ\";bonus=x" but got "" -FAIL x/x;x=Õ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Õ\";bonus=x" but got "" -FAIL x/x;x="Õ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Õ\";bonus=x" but got "" -FAIL x/x;x="Õ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Õ\";bonus=x" but got "" -PASS Ö/x (Blob/File) -PASS Ö/x (Request/Response) -PASS x/Ö (Blob/File) -PASS x/Ö (Request/Response) -FAIL x/x;Ö=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ö=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ö;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ö\";bonus=x" but got "" -FAIL x/x;x=Ö;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ö\";bonus=x" but got "" -FAIL x/x;x="Ö";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ö\";bonus=x" but got "" -FAIL x/x;x="Ö";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ö\";bonus=x" but got "" -PASS ×/x (Blob/File) -PASS ×/x (Request/Response) -PASS x/× (Blob/File) -PASS x/× (Request/Response) -FAIL x/x;×=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;×=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=×;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"×\";bonus=x" but got "" -FAIL x/x;x=×;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"×\";bonus=x" but got "" -FAIL x/x;x="×";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"×\";bonus=x" but got "" -FAIL x/x;x="×";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"×\";bonus=x" but got "" -PASS Ø/x (Blob/File) -PASS Ø/x (Request/Response) -PASS x/Ø (Blob/File) -PASS x/Ø (Request/Response) -FAIL x/x;Ø=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ø=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ø;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ø\";bonus=x" but got "" -FAIL x/x;x=Ø;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ø\";bonus=x" but got "" -FAIL x/x;x="Ø";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ø\";bonus=x" but got "" -FAIL x/x;x="Ø";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ø\";bonus=x" but got "" -PASS Ù/x (Blob/File) -PASS Ù/x (Request/Response) -PASS x/Ù (Blob/File) -PASS x/Ù (Request/Response) -FAIL x/x;Ù=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ù=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ù;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ù\";bonus=x" but got "" -FAIL x/x;x=Ù;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ù\";bonus=x" but got "" -FAIL x/x;x="Ù";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ù\";bonus=x" but got "" -FAIL x/x;x="Ù";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ù\";bonus=x" but got "" -PASS Ú/x (Blob/File) -PASS Ú/x (Request/Response) -PASS x/Ú (Blob/File) -PASS x/Ú (Request/Response) -FAIL x/x;Ú=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ú=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ú;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ú\";bonus=x" but got "" -FAIL x/x;x=Ú;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ú\";bonus=x" but got "" -FAIL x/x;x="Ú";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ú\";bonus=x" but got "" -FAIL x/x;x="Ú";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ú\";bonus=x" but got "" -PASS Û/x (Blob/File) -PASS Û/x (Request/Response) -PASS x/Û (Blob/File) -PASS x/Û (Request/Response) -FAIL x/x;Û=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Û=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Û;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Û\";bonus=x" but got "" -FAIL x/x;x=Û;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Û\";bonus=x" but got "" -FAIL x/x;x="Û";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Û\";bonus=x" but got "" -FAIL x/x;x="Û";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Û\";bonus=x" but got "" -PASS Ü/x (Blob/File) -PASS Ü/x (Request/Response) -PASS x/Ü (Blob/File) -PASS x/Ü (Request/Response) -FAIL x/x;Ü=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ü=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ü;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ü\";bonus=x" but got "" -FAIL x/x;x=Ü;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ü\";bonus=x" but got "" -FAIL x/x;x="Ü";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ü\";bonus=x" but got "" -FAIL x/x;x="Ü";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ü\";bonus=x" but got "" -PASS Ý/x (Blob/File) -PASS Ý/x (Request/Response) -PASS x/Ý (Blob/File) -PASS x/Ý (Request/Response) -FAIL x/x;Ý=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ý=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ý;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ý\";bonus=x" but got "" -FAIL x/x;x=Ý;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ý\";bonus=x" but got "" -FAIL x/x;x="Ý";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ý\";bonus=x" but got "" -FAIL x/x;x="Ý";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ý\";bonus=x" but got "" -PASS Þ/x (Blob/File) -PASS Þ/x (Request/Response) -PASS x/Þ (Blob/File) -PASS x/Þ (Request/Response) -FAIL x/x;Þ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Þ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Þ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Þ\";bonus=x" but got "" -FAIL x/x;x=Þ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Þ\";bonus=x" but got "" -FAIL x/x;x="Þ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Þ\";bonus=x" but got "" -FAIL x/x;x="Þ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Þ\";bonus=x" but got "" -PASS ß/x (Blob/File) -PASS ß/x (Request/Response) -PASS x/ß (Blob/File) -PASS x/ß (Request/Response) -FAIL x/x;ß=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ß=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ß;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ß\";bonus=x" but got "" -FAIL x/x;x=ß;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ß\";bonus=x" but got "" -FAIL x/x;x="ß";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ß\";bonus=x" but got "" -FAIL x/x;x="ß";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ß\";bonus=x" but got "" -PASS à/x (Blob/File) -PASS à/x (Request/Response) -PASS x/à (Blob/File) -PASS x/à (Request/Response) -FAIL x/x;à=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;à=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=à;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"à\";bonus=x" but got "" -FAIL x/x;x=à;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"à\";bonus=x" but got "" -FAIL x/x;x="à";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"à\";bonus=x" but got "" -FAIL x/x;x="à";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"à\";bonus=x" but got "" -PASS á/x (Blob/File) -PASS á/x (Request/Response) -PASS x/á (Blob/File) -PASS x/á (Request/Response) -FAIL x/x;á=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;á=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=á;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"á\";bonus=x" but got "" -FAIL x/x;x=á;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"á\";bonus=x" but got "" -FAIL x/x;x="á";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"á\";bonus=x" but got "" -FAIL x/x;x="á";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"á\";bonus=x" but got "" -PASS â/x (Blob/File) -PASS â/x (Request/Response) -PASS x/â (Blob/File) -PASS x/â (Request/Response) -FAIL x/x;â=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;â=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=â;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"â\";bonus=x" but got "" -FAIL x/x;x=â;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"â\";bonus=x" but got "" -FAIL x/x;x="â";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"â\";bonus=x" but got "" -FAIL x/x;x="â";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"â\";bonus=x" but got "" -PASS ã/x (Blob/File) -PASS ã/x (Request/Response) -PASS x/ã (Blob/File) -PASS x/ã (Request/Response) -FAIL x/x;ã=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ã=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ã;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ã\";bonus=x" but got "" -FAIL x/x;x=ã;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ã\";bonus=x" but got "" -FAIL x/x;x="ã";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ã\";bonus=x" but got "" -FAIL x/x;x="ã";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ã\";bonus=x" but got "" -PASS ä/x (Blob/File) -PASS ä/x (Request/Response) -PASS x/ä (Blob/File) -PASS x/ä (Request/Response) -FAIL x/x;ä=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ä=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ä;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ä\";bonus=x" but got "" -FAIL x/x;x=ä;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ä\";bonus=x" but got "" -FAIL x/x;x="ä";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ä\";bonus=x" but got "" -FAIL x/x;x="ä";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ä\";bonus=x" but got "" -PASS å/x (Blob/File) -PASS å/x (Request/Response) -PASS x/å (Blob/File) -PASS x/å (Request/Response) -FAIL x/x;å=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;å=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=å;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"å\";bonus=x" but got "" -FAIL x/x;x=å;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"å\";bonus=x" but got "" -FAIL x/x;x="å";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"å\";bonus=x" but got "" -FAIL x/x;x="å";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"å\";bonus=x" but got "" -PASS æ/x (Blob/File) -PASS æ/x (Request/Response) -PASS x/æ (Blob/File) -PASS x/æ (Request/Response) -FAIL x/x;æ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;æ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=æ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"æ\";bonus=x" but got "" -FAIL x/x;x=æ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"æ\";bonus=x" but got "" -FAIL x/x;x="æ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"æ\";bonus=x" but got "" -FAIL x/x;x="æ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"æ\";bonus=x" but got "" -PASS ç/x (Blob/File) -PASS ç/x (Request/Response) -PASS x/ç (Blob/File) -PASS x/ç (Request/Response) -FAIL x/x;ç=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ç=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ç;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ç\";bonus=x" but got "" -FAIL x/x;x=ç;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ç\";bonus=x" but got "" -FAIL x/x;x="ç";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ç\";bonus=x" but got "" -FAIL x/x;x="ç";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ç\";bonus=x" but got "" -PASS è/x (Blob/File) -PASS è/x (Request/Response) -PASS x/è (Blob/File) -PASS x/è (Request/Response) -FAIL x/x;è=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;è=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=è;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"è\";bonus=x" but got "" -FAIL x/x;x=è;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"è\";bonus=x" but got "" -FAIL x/x;x="è";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"è\";bonus=x" but got "" -FAIL x/x;x="è";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"è\";bonus=x" but got "" -PASS é/x (Blob/File) -PASS é/x (Request/Response) -PASS x/é (Blob/File) -PASS x/é (Request/Response) -FAIL x/x;é=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;é=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=é;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"é\";bonus=x" but got "" -FAIL x/x;x=é;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"é\";bonus=x" but got "" -FAIL x/x;x="é";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"é\";bonus=x" but got "" -FAIL x/x;x="é";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"é\";bonus=x" but got "" -PASS ê/x (Blob/File) -PASS ê/x (Request/Response) -PASS x/ê (Blob/File) -PASS x/ê (Request/Response) -FAIL x/x;ê=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ê=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ê;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ê\";bonus=x" but got "" -FAIL x/x;x=ê;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ê\";bonus=x" but got "" -FAIL x/x;x="ê";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ê\";bonus=x" but got "" -FAIL x/x;x="ê";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ê\";bonus=x" but got "" -PASS ë/x (Blob/File) -PASS ë/x (Request/Response) -PASS x/ë (Blob/File) -PASS x/ë (Request/Response) -FAIL x/x;ë=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ë=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ë;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ë\";bonus=x" but got "" -FAIL x/x;x=ë;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ë\";bonus=x" but got "" -FAIL x/x;x="ë";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ë\";bonus=x" but got "" -FAIL x/x;x="ë";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ë\";bonus=x" but got "" -PASS ì/x (Blob/File) -PASS ì/x (Request/Response) -PASS x/ì (Blob/File) -PASS x/ì (Request/Response) -FAIL x/x;ì=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ì=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ì;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ì\";bonus=x" but got "" -FAIL x/x;x=ì;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ì\";bonus=x" but got "" -FAIL x/x;x="ì";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ì\";bonus=x" but got "" -FAIL x/x;x="ì";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ì\";bonus=x" but got "" -PASS í/x (Blob/File) -PASS í/x (Request/Response) -PASS x/í (Blob/File) -PASS x/í (Request/Response) -FAIL x/x;í=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;í=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=í;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"í\";bonus=x" but got "" -FAIL x/x;x=í;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"í\";bonus=x" but got "" -FAIL x/x;x="í";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"í\";bonus=x" but got "" -FAIL x/x;x="í";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"í\";bonus=x" but got "" -PASS î/x (Blob/File) -PASS î/x (Request/Response) -PASS x/î (Blob/File) -PASS x/î (Request/Response) -FAIL x/x;î=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;î=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=î;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"î\";bonus=x" but got "" -FAIL x/x;x=î;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"î\";bonus=x" but got "" -FAIL x/x;x="î";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"î\";bonus=x" but got "" -FAIL x/x;x="î";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"î\";bonus=x" but got "" -PASS ï/x (Blob/File) -PASS ï/x (Request/Response) -PASS x/ï (Blob/File) -PASS x/ï (Request/Response) -FAIL x/x;ï=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ï=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ï;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ï\";bonus=x" but got "" -FAIL x/x;x=ï;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ï\";bonus=x" but got "" -FAIL x/x;x="ï";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ï\";bonus=x" but got "" -FAIL x/x;x="ï";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ï\";bonus=x" but got "" -PASS ð/x (Blob/File) -PASS ð/x (Request/Response) -PASS x/ð (Blob/File) -PASS x/ð (Request/Response) -FAIL x/x;ð=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ð=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ð;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ð\";bonus=x" but got "" -FAIL x/x;x=ð;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ð\";bonus=x" but got "" -FAIL x/x;x="ð";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ð\";bonus=x" but got "" -FAIL x/x;x="ð";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ð\";bonus=x" but got "" -PASS ñ/x (Blob/File) -PASS ñ/x (Request/Response) -PASS x/ñ (Blob/File) -PASS x/ñ (Request/Response) -FAIL x/x;ñ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ñ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ñ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ñ\";bonus=x" but got "" -FAIL x/x;x=ñ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ñ\";bonus=x" but got "" -FAIL x/x;x="ñ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ñ\";bonus=x" but got "" -FAIL x/x;x="ñ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ñ\";bonus=x" but got "" -PASS ò/x (Blob/File) -PASS ò/x (Request/Response) -PASS x/ò (Blob/File) -PASS x/ò (Request/Response) -FAIL x/x;ò=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ò=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ò;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ò\";bonus=x" but got "" -FAIL x/x;x=ò;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ò\";bonus=x" but got "" -FAIL x/x;x="ò";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ò\";bonus=x" but got "" -FAIL x/x;x="ò";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ò\";bonus=x" but got "" -PASS ó/x (Blob/File) -PASS ó/x (Request/Response) -PASS x/ó (Blob/File) -PASS x/ó (Request/Response) -FAIL x/x;ó=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ó=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ó;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ó\";bonus=x" but got "" -FAIL x/x;x=ó;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ó\";bonus=x" but got "" -FAIL x/x;x="ó";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ó\";bonus=x" but got "" -FAIL x/x;x="ó";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ó\";bonus=x" but got "" -PASS ô/x (Blob/File) -PASS ô/x (Request/Response) -PASS x/ô (Blob/File) -PASS x/ô (Request/Response) -FAIL x/x;ô=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ô=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ô;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ô\";bonus=x" but got "" -FAIL x/x;x=ô;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ô\";bonus=x" but got "" -FAIL x/x;x="ô";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ô\";bonus=x" but got "" -FAIL x/x;x="ô";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ô\";bonus=x" but got "" -PASS õ/x (Blob/File) -PASS õ/x (Request/Response) -PASS x/õ (Blob/File) -PASS x/õ (Request/Response) -FAIL x/x;õ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;õ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=õ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"õ\";bonus=x" but got "" -FAIL x/x;x=õ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"õ\";bonus=x" but got "" -FAIL x/x;x="õ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"õ\";bonus=x" but got "" -FAIL x/x;x="õ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"õ\";bonus=x" but got "" -PASS ö/x (Blob/File) -PASS ö/x (Request/Response) -PASS x/ö (Blob/File) -PASS x/ö (Request/Response) -FAIL x/x;ö=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ö=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ö;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ö\";bonus=x" but got "" -FAIL x/x;x=ö;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ö\";bonus=x" but got "" -FAIL x/x;x="ö";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ö\";bonus=x" but got "" -FAIL x/x;x="ö";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ö\";bonus=x" but got "" -PASS ÷/x (Blob/File) -PASS ÷/x (Request/Response) -PASS x/÷ (Blob/File) -PASS x/÷ (Request/Response) -FAIL x/x;÷=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;÷=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=÷;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"÷\";bonus=x" but got "" -FAIL x/x;x=÷;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"÷\";bonus=x" but got "" -FAIL x/x;x="÷";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"÷\";bonus=x" but got "" -FAIL x/x;x="÷";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"÷\";bonus=x" but got "" -PASS ø/x (Blob/File) -PASS ø/x (Request/Response) -PASS x/ø (Blob/File) -PASS x/ø (Request/Response) -FAIL x/x;ø=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ø=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ø;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ø\";bonus=x" but got "" -FAIL x/x;x=ø;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ø\";bonus=x" but got "" -FAIL x/x;x="ø";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ø\";bonus=x" but got "" -FAIL x/x;x="ø";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ø\";bonus=x" but got "" -PASS ù/x (Blob/File) -PASS ù/x (Request/Response) -PASS x/ù (Blob/File) -PASS x/ù (Request/Response) -FAIL x/x;ù=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ù=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ù;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ù\";bonus=x" but got "" -FAIL x/x;x=ù;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ù\";bonus=x" but got "" -FAIL x/x;x="ù";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ù\";bonus=x" but got "" -FAIL x/x;x="ù";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ù\";bonus=x" but got "" -PASS ú/x (Blob/File) -PASS ú/x (Request/Response) -PASS x/ú (Blob/File) -PASS x/ú (Request/Response) -FAIL x/x;ú=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ú=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ú;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ú\";bonus=x" but got "" -FAIL x/x;x=ú;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ú\";bonus=x" but got "" -FAIL x/x;x="ú";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ú\";bonus=x" but got "" -FAIL x/x;x="ú";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ú\";bonus=x" but got "" -PASS û/x (Blob/File) -PASS û/x (Request/Response) -PASS x/û (Blob/File) -PASS x/û (Request/Response) -FAIL x/x;û=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;û=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=û;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"û\";bonus=x" but got "" -FAIL x/x;x=û;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"û\";bonus=x" but got "" -FAIL x/x;x="û";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"û\";bonus=x" but got "" -FAIL x/x;x="û";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"û\";bonus=x" but got "" -PASS ü/x (Blob/File) -PASS ü/x (Request/Response) -PASS x/ü (Blob/File) -PASS x/ü (Request/Response) -FAIL x/x;ü=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ü=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ü;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ü\";bonus=x" but got "" -FAIL x/x;x=ü;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ü\";bonus=x" but got "" -FAIL x/x;x="ü";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ü\";bonus=x" but got "" -FAIL x/x;x="ü";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ü\";bonus=x" but got "" -PASS ý/x (Blob/File) -PASS ý/x (Request/Response) -PASS x/ý (Blob/File) -PASS x/ý (Request/Response) -FAIL x/x;ý=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ý=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ý;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ý\";bonus=x" but got "" -FAIL x/x;x=ý;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ý\";bonus=x" but got "" -FAIL x/x;x="ý";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ý\";bonus=x" but got "" -FAIL x/x;x="ý";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ý\";bonus=x" but got "" -PASS þ/x (Blob/File) -PASS þ/x (Request/Response) -PASS x/þ (Blob/File) -PASS x/þ (Request/Response) -FAIL x/x;þ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;þ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=þ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"þ\";bonus=x" but got "" -FAIL x/x;x=þ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"þ\";bonus=x" but got "" -FAIL x/x;x="þ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"þ\";bonus=x" but got "" -FAIL x/x;x="þ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"þ\";bonus=x" but got "" -PASS ÿ/x (Blob/File) -PASS ÿ/x (Request/Response) -PASS x/ÿ (Blob/File) -PASS x/ÿ (Request/Response) -FAIL x/x;ÿ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ÿ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ÿ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ÿ\";bonus=x" but got "" -FAIL x/x;x=ÿ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ÿ\";bonus=x" but got "" -FAIL x/x;x="ÿ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ÿ\";bonus=x" but got "" -FAIL x/x;x="ÿ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ÿ\";bonus=x" but got "" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mimesniff/mime-types/parsing.any.worker-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mimesniff/mime-types/parsing.any.worker-expected.txt deleted file mode 100644 index 08508ea..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/mimesniff/mime-types/parsing.any.worker-expected.txt +++ /dev/null
@@ -1,1935 +0,0 @@ -This is a testharness.js-based test. -Found 1911 tests; 713 PASS, 1198 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS Loading data… -PASS text/html;charset=gbk (Blob/File) -PASS text/html;charset=gbk (Request/Response) -FAIL TEXT/HTML;CHARSET=GBK (Blob/File) assert_equals: Blob expected "text/html;charset=GBK" but got "text/html;charset=gbk" -FAIL TEXT/HTML;CHARSET=GBK (Request/Response) assert_equals: expected "text/html;charset=GBK" but got "text/html;charset=gbk" -FAIL text/html;charset=gbk( (Blob/File) assert_equals: Blob expected "text/html;charset=\"gbk(\"" but got "text/html;charset=gbk(" -FAIL text/html;charset=gbk( (Request/Response) assert_equals: expected "text/html;charset=\"gbk(\"" but got "text/html;charset=gbk(" -FAIL text/html;x=(;charset=gbk (Blob/File) assert_equals: Blob expected "text/html;x=\"(\";charset=gbk" but got "text/html;x=(;charset=gbk" -FAIL text/html;x=(;charset=gbk (Request/Response) assert_equals: expected "text/html;x=\"(\";charset=gbk" but got "text/html;x=(;charset=gbk" -FAIL text/html;charset=gbk;charset=windows-1255 (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;charset=gbk;charset=windows-1255" -FAIL text/html;charset=gbk;charset=windows-1255 (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;charset=gbk;charset=windows-1255" -FAIL text/html;charset=();charset=GBK (Blob/File) assert_equals: Blob expected "text/html;charset=\"()\"" but got "text/html;charset=();charset=gbk" -FAIL text/html;charset=();charset=GBK (Request/Response) assert_equals: expected "text/html;charset=\"()\"" but got "text/html;charset=();charset=gbk" -FAIL text/html;charset =gbk (Blob/File) assert_equals: Blob expected "text/html" but got "text/html;charset =gbk" -FAIL text/html;charset =gbk (Request/Response) assert_equals: expected "text/html" but got "text/html;charset =gbk" -FAIL text/html ;charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html ;charset=gbk" -FAIL text/html ;charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html ;charset=gbk" -FAIL text/html; charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html; charset=gbk" -FAIL text/html; charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html; charset=gbk" -FAIL text/html;charset= gbk (Blob/File) assert_equals: Blob expected "text/html;charset=\" gbk\"" but got "text/html;charset= gbk" -FAIL text/html;charset= gbk (Request/Response) assert_equals: expected "text/html;charset=\" gbk\"" but got "text/html;charset= gbk" -FAIL text/html;charset= "gbk" (Blob/File) assert_equals: Blob expected "text/html;charset=\" \\\"gbk\\\"\"" but got "text/html;charset= \"gbk\"" -FAIL text/html;charset= "gbk" (Request/Response) assert_equals: expected "text/html;charset=\" \\\"gbk\\\"\"" but got "text/html;charset= \"gbk\"" -FAIL text/html;charset=gbk (Blob/File) assert_equals: Blob expected "text/html" but got "" -FAIL text/html;charset=gbk (Request/Response) assert_equals: expected "text/html" but got "" -FAIL text/html;charset=gbk (Blob/File) assert_equals: Blob expected "text/html" but got "" -FAIL text/html;charset=gbk (Request/Response) assert_equals: expected "text/html" but got "" -FAIL text/html;charset=gbk (Blob/File) assert_equals: Blob expected "text/html" but got "" -FAIL text/html;charset=gbk (Request/Response) assert_equals: expected "text/html" but got "" -FAIL text/html;charset=gbk (Blob/File) assert_equals: Blob expected "text/html" but got "" -FAIL text/html;charset=gbk (Request/Response) assert_equals: expected "text/html" but got "" -PASS text/html;charset='gbk' (Blob/File) -PASS text/html;charset='gbk' (Request/Response) -PASS text/html;charset='gbk (Blob/File) -PASS text/html;charset='gbk (Request/Response) -PASS text/html;charset=gbk' (Blob/File) -PASS text/html;charset=gbk' (Request/Response) -FAIL text/html;charset=';charset=GBK (Blob/File) assert_equals: Blob expected "text/html;charset='" but got "text/html;charset=';charset=gbk" -FAIL text/html;charset=';charset=GBK (Request/Response) assert_equals: expected "text/html;charset='" but got "text/html;charset=';charset=gbk" -FAIL text/html;test;charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;test;charset=gbk" -FAIL text/html;test;charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;test;charset=gbk" -FAIL text/html;test=;charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;test=;charset=gbk" -FAIL text/html;test=;charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;test=;charset=gbk" -FAIL text/html;';charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;';charset=gbk" -FAIL text/html;';charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;';charset=gbk" -FAIL text/html;";charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;\";charset=gbk" -FAIL text/html;";charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;\";charset=gbk" -FAIL text/html ; ; charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html ; ; charset=gbk" -FAIL text/html ; ; charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html ; ; charset=gbk" -FAIL text/html;;;;charset=gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;;;;charset=gbk" -FAIL text/html;;;;charset=gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;;;;charset=gbk" -FAIL text/html;charset= ";charset=GBK (Blob/File) assert_equals: Blob expected "text/html;charset=GBK" but got "" -FAIL text/html;charset= ";charset=GBK (Request/Response) assert_equals: expected "text/html;charset=GBK" but got "" -FAIL text/html;charset=";charset=foo";charset=GBK (Blob/File) assert_equals: Blob expected "text/html;charset=GBK" but got "" -FAIL text/html;charset=";charset=foo";charset=GBK (Request/Response) assert_equals: expected "text/html;charset=GBK" but got "" -FAIL text/html;charset="gbk" (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;charset=\"gbk\"" -FAIL text/html;charset="gbk" (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;charset=\"gbk\"" -FAIL text/html;charset="gbk (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;charset=\"gbk" -FAIL text/html;charset="gbk (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;charset=\"gbk" -FAIL text/html;charset=gbk" (Blob/File) assert_equals: Blob expected "text/html;charset=\"gbk\\\"\"" but got "text/html;charset=gbk\"" -FAIL text/html;charset=gbk" (Request/Response) assert_equals: expected "text/html;charset=\"gbk\\\"\"" but got "text/html;charset=gbk\"" -PASS text/html;charset=" gbk" (Blob/File) -PASS text/html;charset=" gbk" (Request/Response) -PASS text/html;charset="gbk " (Blob/File) -PASS text/html;charset="gbk " (Request/Response) -FAIL text/html;charset="\ gbk" (Blob/File) assert_equals: Blob expected "text/html;charset=\" gbk\"" but got "text/html;charset=\"\\ gbk\"" -FAIL text/html;charset="\ gbk" (Request/Response) assert_equals: expected "text/html;charset=\" gbk\"" but got "text/html;charset=\"\\ gbk\"" -FAIL text/html;charset="\g\b\k" (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;charset=\"\\g\\b\\k\"" -FAIL text/html;charset="\g\b\k" (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;charset=\"\\g\\b\\k\"" -FAIL text/html;charset="gbk"x (Blob/File) assert_equals: Blob expected "text/html;charset=gbk" but got "text/html;charset=\"gbk\"x" -FAIL text/html;charset="gbk"x (Request/Response) assert_equals: expected "text/html;charset=gbk" but got "text/html;charset=\"gbk\"x" -FAIL text/html;charset="";charset=GBK (Blob/File) assert_equals: Blob expected "text/html;charset=\"\"" but got "text/html;charset=\"\";charset=gbk" -FAIL text/html;charset="";charset=GBK (Request/Response) assert_equals: expected "text/html;charset=\"\"" but got "text/html;charset=\"\";charset=gbk" -FAIL text/html;charset=";charset=GBK (Blob/File) assert_equals: Blob expected "text/html;charset=\";charset=GBK\"" but got "text/html;charset=\";charset=gbk" -FAIL text/html;charset=";charset=GBK (Request/Response) assert_equals: expected "text/html;charset=\";charset=GBK\"" but got "text/html;charset=\";charset=gbk" -FAIL text/html;charset={gbk} (Blob/File) assert_equals: Blob expected "text/html;charset=\"{gbk}\"" but got "text/html;charset={gbk}" -FAIL text/html;charset={gbk} (Request/Response) assert_equals: expected "text/html;charset=\"{gbk}\"" but got "text/html;charset={gbk}" -PASS text/html;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789=x;charset=gbk (Blob/File) -PASS text/html;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789=x;charset=gbk (Request/Response) -PASS 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 (Blob/File) -PASS 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 (Request/Response) -FAIL text/html;a]=bar;b[=bar;c=bar (Blob/File) assert_equals: Blob expected "text/html;c=bar" but got "text/html;a]=bar;b[=bar;c=bar" -FAIL text/html;a]=bar;b[=bar;c=bar (Request/Response) assert_equals: expected "text/html;c=bar" but got "text/html;a]=bar;b[=bar;c=bar" -PASS text/html;valid=";";foo=bar (Blob/File) -PASS text/html;valid=";";foo=bar (Request/Response) -FAIL text/html;in]valid=";asd=foo";foo=bar (Blob/File) assert_equals: Blob expected "text/html;foo=bar" but got "text/html;in]valid=\";asd=foo\";foo=bar" -FAIL text/html;in]valid=";asd=foo";foo=bar (Request/Response) assert_equals: expected "text/html;foo=bar" but got "text/html;in]valid=\";asd=foo\";foo=bar" -FAIL !#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz (Blob/File) assert_equals: Blob expected "!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" but got "!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" -FAIL !#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz (Request/Response) assert_equals: expected "!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" but got "!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" -FAIL x/x;x=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" (Blob/File) assert_equals: Blob expected "x/x;x=\"\t !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"" but got "" -FAIL x/x;x=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" (Request/Response) assert_equals: expected "x/x;x=\"\t !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"" but got "" -FAIL x/x;test (Blob/File) assert_equals: Blob expected "x/x" but got "x/x;test" -FAIL x/x;test (Request/Response) assert_equals: expected "x/x" but got "x/x;test" -FAIL x/x;test="\ (Blob/File) assert_equals: Blob expected "x/x;test=\"\\\\\"" but got "x/x;test=\"\\" -FAIL x/x;test="\ (Request/Response) assert_equals: expected "x/x;test=\"\\\\\"" but got "x/x;test=\"\\" -FAIL x/x;x= (Blob/File) assert_equals: Blob expected "x/x" but got "x/x;x= " -FAIL x/x;x= (Request/Response) assert_equals: expected "x/x" but got "x/x;x=" -FAIL x/x;x= (Blob/File) assert_equals: Blob expected "x/x" but got "" -FAIL x/x;x= (Request/Response) assert_equals: expected "x/x" but got "x/x;x=" -FAIL x/x -\r ;x=x (Blob/File) assert_equals: Blob expected "x/x;x=x" but got "" -PASS x/x -\r ;x=x (Request/Response) -FAIL -\r x/x;x=x -\r (Blob/File) assert_equals: Blob expected "x/x;x=x" but got "" -FAIL -\r x/x;x=x -\r (Request/Response) assert_throws_js: function "() => new Request("about:blank", { headers: [["Content-Type", val.input]] })" did not throw -FAIL x/x; -\r x=x -\r ;x=y (Blob/File) assert_equals: Blob expected "x/x;x=x" but got "" -PASS x/x; -\r x=x -\r ;x=y (Request/Response) -FAIL text/html;test=ÿ;charset=gbk (Blob/File) assert_equals: Blob expected "text/html;test=\"ÿ\";charset=gbk" but got "" -FAIL text/html;test=ÿ;charset=gbk (Request/Response) assert_equals: expected "text/html;test=\"ÿ\";charset=gbk" but got "" -FAIL x/x;test=�;x=x (Blob/File) assert_equals: Blob expected "x/x;x=x" but got "" -PASS x/x;test=�;x=x (Request/Response) -PASS x/x (Blob/File) -PASS x/x (Request/Response) -PASS x/x (Blob/File) -PASS x/x (Request/Response) -PASS x/x (Blob/File) -PASS x/x (Request/Response) -PASS x/x (Blob/File) -PASS x/x (Request/Response) -PASS (Blob/File) -PASS (Request/Response) -PASS (Blob/File) -PASS (Request/Response) -FAIL / (Blob/File) assert_equals: Blob expected "" but got "/" -FAIL / (Request/Response) assert_equals: expected "" but got "/" -FAIL bogus (Blob/File) assert_equals: Blob expected "" but got "bogus" -FAIL bogus (Request/Response) assert_equals: expected "" but got "bogus" -FAIL bogus/ (Blob/File) assert_equals: Blob expected "" but got "bogus/" -FAIL bogus/ (Request/Response) assert_equals: expected "" but got "bogus/" -FAIL bogus/ (Blob/File) assert_equals: Blob expected "" but got "bogus/ " -FAIL bogus/ (Request/Response) assert_equals: expected "" but got "bogus/" -FAIL bogus/bogus/; (Blob/File) assert_equals: Blob expected "" but got "bogus/bogus/;" -FAIL bogus/bogus/; (Request/Response) assert_equals: expected "" but got "bogus/bogus/;" -FAIL </> (Blob/File) assert_equals: Blob expected "" but got "</>" -FAIL </> (Request/Response) assert_equals: expected "" but got "</>" -FAIL (/) (Blob/File) assert_equals: Blob expected "" but got "(/)" -FAIL (/) (Request/Response) assert_equals: expected "" but got "(/)" -PASS ÿ/ÿ (Blob/File) -PASS ÿ/ÿ (Request/Response) -FAIL text/html(;doesnot=matter (Blob/File) assert_equals: Blob expected "" but got "text/html(;doesnot=matter" -FAIL text/html(;doesnot=matter (Request/Response) assert_equals: expected "" but got "text/html(;doesnot=matter" -FAIL {/} (Blob/File) assert_equals: Blob expected "" but got "{/}" -FAIL {/} (Request/Response) assert_equals: expected "" but got "{/}" -PASS Ā/Ā (Blob/File) -PASS Ā/Ā (Request/Response) -FAIL text /html (Blob/File) assert_equals: Blob expected "" but got "text /html" -FAIL text /html (Request/Response) assert_equals: expected "" but got "text /html" -FAIL text/ html (Blob/File) assert_equals: Blob expected "" but got "text/ html" -FAIL text/ html (Request/Response) assert_equals: expected "" but got "text/ html" -FAIL "text/html" (Blob/File) assert_equals: Blob expected "" but got "\"text/html\"" -FAIL "text/html" (Request/Response) assert_equals: expected "" but got "\"text/html\"" -PASS \0/x (Blob/File) -PASS \0/x (Request/Response) -PASS x/\0 (Blob/File) -PASS x/\0 (Request/Response) -FAIL x/x;\0=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;\0=x;bonus=x (Request/Response) -FAIL x/x;x=\0;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;x=\0;bonus=x (Request/Response) -FAIL x/x;x="\0";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;x="\0";bonus=x (Request/Response) -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -FAIL /x (Request/Response) assert_equals: expected "" but got "/x" -PASS x/ (Blob/File) -FAIL x/ (Request/Response) assert_equals: expected "" but got "x/" -FAIL x/x; =x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x; =x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS -/x (Blob/File) -FAIL -/x (Request/Response) assert_throws_js: function "() => new Request("about:blank", { headers: [["Content-Type", val.input]] })" did not throw -PASS x/ - (Blob/File) -FAIL x/ - (Request/Response) assert_throws_js: function "() => new Request("about:blank", { headers: [["Content-Type", val.input]] })" did not throw -FAIL x/x; -=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x; -=x;bonus=x (Request/Response) -FAIL x/x;x= -;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;x= -;bonus=x (Request/Response) -FAIL x/x;x=" -";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;x=" -";bonus=x (Request/Response) -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS \r/x (Blob/File) -FAIL \r/x (Request/Response) assert_throws_js: function "() => new Request("about:blank", { headers: [["Content-Type", val.input]] })" did not throw -PASS x/\r (Blob/File) -FAIL x/\r (Request/Response) assert_throws_js: function "() => new Request("about:blank", { headers: [["Content-Type", val.input]] })" did not throw -FAIL x/x;\r=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;\r=x;bonus=x (Request/Response) -FAIL x/x;x=\r;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;x=\r;bonus=x (Request/Response) -FAIL x/x;x="\r";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -PASS x/x;x="\r";bonus=x (Request/Response) -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL /x (Blob/File) assert_equals: Blob expected "" but got " /x" -FAIL /x (Request/Response) assert_equals: expected "" but got "/x" -FAIL x/ (Blob/File) assert_equals: Blob expected "" but got "x/ " -FAIL x/ (Request/Response) assert_equals: expected "" but got "x/" -FAIL x/x; =x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x; =x;bonus=x" -FAIL x/x; =x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x; =x;bonus=x" -FAIL "/x (Blob/File) assert_equals: Blob expected "" but got "\"/x" -FAIL "/x (Request/Response) assert_equals: expected "" but got "\"/x" -FAIL x/" (Blob/File) assert_equals: Blob expected "" but got "x/\"" -FAIL x/" (Request/Response) assert_equals: expected "" but got "x/\"" -FAIL x/x;"=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;\"=x;bonus=x" -FAIL x/x;"=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;\"=x;bonus=x" -FAIL (/x (Blob/File) assert_equals: Blob expected "" but got "(/x" -FAIL (/x (Request/Response) assert_equals: expected "" but got "(/x" -FAIL x/( (Blob/File) assert_equals: Blob expected "" but got "x/(" -FAIL x/( (Request/Response) assert_equals: expected "" but got "x/(" -FAIL x/x;(=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;(=x;bonus=x" -FAIL x/x;(=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;(=x;bonus=x" -FAIL x/x;x=(;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"(\";bonus=x" but got "x/x;x=(;bonus=x" -FAIL x/x;x=(;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"(\";bonus=x" but got "x/x;x=(;bonus=x" -PASS x/x;x="(";bonus=x (Blob/File) -PASS x/x;x="(";bonus=x (Request/Response) -FAIL )/x (Blob/File) assert_equals: Blob expected "" but got ")/x" -FAIL )/x (Request/Response) assert_equals: expected "" but got ")/x" -FAIL x/) (Blob/File) assert_equals: Blob expected "" but got "x/)" -FAIL x/) (Request/Response) assert_equals: expected "" but got "x/)" -FAIL x/x;)=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;)=x;bonus=x" -FAIL x/x;)=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;)=x;bonus=x" -FAIL x/x;x=);bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\")\";bonus=x" but got "x/x;x=);bonus=x" -FAIL x/x;x=);bonus=x (Request/Response) assert_equals: expected "x/x;x=\")\";bonus=x" but got "x/x;x=);bonus=x" -PASS x/x;x=")";bonus=x (Blob/File) -PASS x/x;x=")";bonus=x (Request/Response) -FAIL ,/x (Blob/File) assert_equals: Blob expected "" but got ",/x" -FAIL ,/x (Request/Response) assert_equals: expected "" but got ",/x" -FAIL x/, (Blob/File) assert_equals: Blob expected "" but got "x/," -FAIL x/, (Request/Response) assert_equals: expected "" but got "x/," -FAIL x/x;,=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;,=x;bonus=x" -FAIL x/x;,=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;,=x;bonus=x" -FAIL x/x;x=,;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\",\";bonus=x" but got "x/x;x=,;bonus=x" -FAIL x/x;x=,;bonus=x (Request/Response) assert_equals: expected "x/x;x=\",\";bonus=x" but got "x/x;x=,;bonus=x" -PASS x/x;x=",";bonus=x (Blob/File) -PASS x/x;x=",";bonus=x (Request/Response) -FAIL x/x;/=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;/=x;bonus=x" -FAIL x/x;/=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;/=x;bonus=x" -FAIL x/x;x=/;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"/\";bonus=x" but got "x/x;x=/;bonus=x" -FAIL x/x;x=/;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"/\";bonus=x" but got "x/x;x=/;bonus=x" -PASS x/x;x="/";bonus=x (Blob/File) -PASS x/x;x="/";bonus=x (Request/Response) -FAIL :/x (Blob/File) assert_equals: Blob expected "" but got ":/x" -FAIL :/x (Request/Response) assert_equals: expected "" but got ":/x" -FAIL x/: (Blob/File) assert_equals: Blob expected "" but got "x/:" -FAIL x/: (Request/Response) assert_equals: expected "" but got "x/:" -FAIL x/x;:=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;:=x;bonus=x" -FAIL x/x;:=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;:=x;bonus=x" -FAIL x/x;x=:;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\":\";bonus=x" but got "x/x;x=:;bonus=x" -FAIL x/x;x=:;bonus=x (Request/Response) assert_equals: expected "x/x;x=\":\";bonus=x" but got "x/x;x=:;bonus=x" -PASS x/x;x=":";bonus=x (Blob/File) -PASS x/x;x=":";bonus=x (Request/Response) -FAIL ;/x (Blob/File) assert_equals: Blob expected "" but got ";/x" -FAIL ;/x (Request/Response) assert_equals: expected "" but got ";/x" -FAIL x/; (Blob/File) assert_equals: Blob expected "" but got "x/;" -FAIL x/; (Request/Response) assert_equals: expected "" but got "x/;" -FAIL </x (Blob/File) assert_equals: Blob expected "" but got "</x" -FAIL </x (Request/Response) assert_equals: expected "" but got "</x" -FAIL x/< (Blob/File) assert_equals: Blob expected "" but got "x/<" -FAIL x/< (Request/Response) assert_equals: expected "" but got "x/<" -FAIL x/x;<=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;<=x;bonus=x" -FAIL x/x;<=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;<=x;bonus=x" -FAIL x/x;x=<;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"<\";bonus=x" but got "x/x;x=<;bonus=x" -FAIL x/x;x=<;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"<\";bonus=x" but got "x/x;x=<;bonus=x" -PASS x/x;x="<";bonus=x (Blob/File) -PASS x/x;x="<";bonus=x (Request/Response) -FAIL =/x (Blob/File) assert_equals: Blob expected "" but got "=/x" -FAIL =/x (Request/Response) assert_equals: expected "" but got "=/x" -FAIL x/= (Blob/File) assert_equals: Blob expected "" but got "x/=" -FAIL x/= (Request/Response) assert_equals: expected "" but got "x/=" -FAIL x/x;x==;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"=\";bonus=x" but got "x/x;x==;bonus=x" -FAIL x/x;x==;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"=\";bonus=x" but got "x/x;x==;bonus=x" -PASS x/x;x="=";bonus=x (Blob/File) -PASS x/x;x="=";bonus=x (Request/Response) -FAIL >/x (Blob/File) assert_equals: Blob expected "" but got ">/x" -FAIL >/x (Request/Response) assert_equals: expected "" but got ">/x" -FAIL x/> (Blob/File) assert_equals: Blob expected "" but got "x/>" -FAIL x/> (Request/Response) assert_equals: expected "" but got "x/>" -FAIL x/x;>=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;>=x;bonus=x" -FAIL x/x;>=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;>=x;bonus=x" -FAIL x/x;x=>;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\">\";bonus=x" but got "x/x;x=>;bonus=x" -FAIL x/x;x=>;bonus=x (Request/Response) assert_equals: expected "x/x;x=\">\";bonus=x" but got "x/x;x=>;bonus=x" -PASS x/x;x=">";bonus=x (Blob/File) -PASS x/x;x=">";bonus=x (Request/Response) -FAIL ?/x (Blob/File) assert_equals: Blob expected "" but got "?/x" -FAIL ?/x (Request/Response) assert_equals: expected "" but got "?/x" -FAIL x/? (Blob/File) assert_equals: Blob expected "" but got "x/?" -FAIL x/? (Request/Response) assert_equals: expected "" but got "x/?" -FAIL x/x;?=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;?=x;bonus=x" -FAIL x/x;?=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;?=x;bonus=x" -FAIL x/x;x=?;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"?\";bonus=x" but got "x/x;x=?;bonus=x" -FAIL x/x;x=?;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"?\";bonus=x" but got "x/x;x=?;bonus=x" -PASS x/x;x="?";bonus=x (Blob/File) -PASS x/x;x="?";bonus=x (Request/Response) -FAIL @/x (Blob/File) assert_equals: Blob expected "" but got "@/x" -FAIL @/x (Request/Response) assert_equals: expected "" but got "@/x" -FAIL x/@ (Blob/File) assert_equals: Blob expected "" but got "x/@" -FAIL x/@ (Request/Response) assert_equals: expected "" but got "x/@" -FAIL x/x;@=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;@=x;bonus=x" -FAIL x/x;@=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;@=x;bonus=x" -FAIL x/x;x=@;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"@\";bonus=x" but got "x/x;x=@;bonus=x" -FAIL x/x;x=@;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"@\";bonus=x" but got "x/x;x=@;bonus=x" -PASS x/x;x="@";bonus=x (Blob/File) -PASS x/x;x="@";bonus=x (Request/Response) -FAIL [/x (Blob/File) assert_equals: Blob expected "" but got "[/x" -FAIL [/x (Request/Response) assert_equals: expected "" but got "[/x" -FAIL x/[ (Blob/File) assert_equals: Blob expected "" but got "x/[" -FAIL x/[ (Request/Response) assert_equals: expected "" but got "x/[" -FAIL x/x;[=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;[=x;bonus=x" -FAIL x/x;[=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;[=x;bonus=x" -FAIL x/x;x=[;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"[\";bonus=x" but got "x/x;x=[;bonus=x" -FAIL x/x;x=[;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"[\";bonus=x" but got "x/x;x=[;bonus=x" -PASS x/x;x="[";bonus=x (Blob/File) -PASS x/x;x="[";bonus=x (Request/Response) -FAIL \/x (Blob/File) assert_equals: Blob expected "" but got "\\/x" -FAIL \/x (Request/Response) assert_equals: expected "" but got "\\/x" -FAIL x/\ (Blob/File) assert_equals: Blob expected "" but got "x/\\" -FAIL x/\ (Request/Response) assert_equals: expected "" but got "x/\\" -FAIL x/x;\=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;\\=x;bonus=x" -FAIL x/x;\=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;\\=x;bonus=x" -FAIL ]/x (Blob/File) assert_equals: Blob expected "" but got "]/x" -FAIL ]/x (Request/Response) assert_equals: expected "" but got "]/x" -FAIL x/] (Blob/File) assert_equals: Blob expected "" but got "x/]" -FAIL x/] (Request/Response) assert_equals: expected "" but got "x/]" -FAIL x/x;]=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;]=x;bonus=x" -FAIL x/x;]=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;]=x;bonus=x" -FAIL x/x;x=];bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"]\";bonus=x" but got "x/x;x=];bonus=x" -FAIL x/x;x=];bonus=x (Request/Response) assert_equals: expected "x/x;x=\"]\";bonus=x" but got "x/x;x=];bonus=x" -PASS x/x;x="]";bonus=x (Blob/File) -PASS x/x;x="]";bonus=x (Request/Response) -FAIL {/x (Blob/File) assert_equals: Blob expected "" but got "{/x" -FAIL {/x (Request/Response) assert_equals: expected "" but got "{/x" -FAIL x/{ (Blob/File) assert_equals: Blob expected "" but got "x/{" -FAIL x/{ (Request/Response) assert_equals: expected "" but got "x/{" -FAIL x/x;{=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;{=x;bonus=x" -FAIL x/x;{=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;{=x;bonus=x" -FAIL x/x;x={;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"{\";bonus=x" but got "x/x;x={;bonus=x" -FAIL x/x;x={;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"{\";bonus=x" but got "x/x;x={;bonus=x" -PASS x/x;x="{";bonus=x (Blob/File) -PASS x/x;x="{";bonus=x (Request/Response) -FAIL }/x (Blob/File) assert_equals: Blob expected "" but got "}/x" -FAIL }/x (Request/Response) assert_equals: expected "" but got "}/x" -FAIL x/} (Blob/File) assert_equals: Blob expected "" but got "x/}" -FAIL x/} (Request/Response) assert_equals: expected "" but got "x/}" -FAIL x/x;}=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "x/x;}=x;bonus=x" -FAIL x/x;}=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "x/x;}=x;bonus=x" -FAIL x/x;x=};bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"}\";bonus=x" but got "x/x;x=};bonus=x" -FAIL x/x;x=};bonus=x (Request/Response) assert_equals: expected "x/x;x=\"}\";bonus=x" but got "x/x;x=};bonus=x" -PASS x/x;x="}";bonus=x (Blob/File) -PASS x/x;x="}";bonus=x (Request/Response) -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x; =x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x; =x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x= ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\" \";bonus=x" but got "" -FAIL x/x;x= ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\" \";bonus=x" but got "" -FAIL x/x;x=" ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\" \";bonus=x" but got "" -FAIL x/x;x=" ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\" \";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x; =x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x; =x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x= ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\" \";bonus=x" but got "" -FAIL x/x;x= ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\" \";bonus=x" but got "" -FAIL x/x;x=" ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\" \";bonus=x" but got "" -FAIL x/x;x=" ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\" \";bonus=x" but got "" -PASS ¡/x (Blob/File) -PASS ¡/x (Request/Response) -PASS x/¡ (Blob/File) -PASS x/¡ (Request/Response) -FAIL x/x;¡=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¡=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¡;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¡\";bonus=x" but got "" -FAIL x/x;x=¡;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¡\";bonus=x" but got "" -FAIL x/x;x="¡";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¡\";bonus=x" but got "" -FAIL x/x;x="¡";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¡\";bonus=x" but got "" -PASS ¢/x (Blob/File) -PASS ¢/x (Request/Response) -PASS x/¢ (Blob/File) -PASS x/¢ (Request/Response) -FAIL x/x;¢=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¢=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¢;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¢\";bonus=x" but got "" -FAIL x/x;x=¢;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¢\";bonus=x" but got "" -FAIL x/x;x="¢";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¢\";bonus=x" but got "" -FAIL x/x;x="¢";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¢\";bonus=x" but got "" -PASS £/x (Blob/File) -PASS £/x (Request/Response) -PASS x/£ (Blob/File) -PASS x/£ (Request/Response) -FAIL x/x;£=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;£=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=£;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"£\";bonus=x" but got "" -FAIL x/x;x=£;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"£\";bonus=x" but got "" -FAIL x/x;x="£";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"£\";bonus=x" but got "" -FAIL x/x;x="£";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"£\";bonus=x" but got "" -PASS ¤/x (Blob/File) -PASS ¤/x (Request/Response) -PASS x/¤ (Blob/File) -PASS x/¤ (Request/Response) -FAIL x/x;¤=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¤=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¤;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¤\";bonus=x" but got "" -FAIL x/x;x=¤;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¤\";bonus=x" but got "" -FAIL x/x;x="¤";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¤\";bonus=x" but got "" -FAIL x/x;x="¤";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¤\";bonus=x" but got "" -PASS ¥/x (Blob/File) -PASS ¥/x (Request/Response) -PASS x/¥ (Blob/File) -PASS x/¥ (Request/Response) -FAIL x/x;¥=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¥=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¥;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¥\";bonus=x" but got "" -FAIL x/x;x=¥;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¥\";bonus=x" but got "" -FAIL x/x;x="¥";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¥\";bonus=x" but got "" -FAIL x/x;x="¥";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¥\";bonus=x" but got "" -PASS ¦/x (Blob/File) -PASS ¦/x (Request/Response) -PASS x/¦ (Blob/File) -PASS x/¦ (Request/Response) -FAIL x/x;¦=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¦=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¦;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¦\";bonus=x" but got "" -FAIL x/x;x=¦;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¦\";bonus=x" but got "" -FAIL x/x;x="¦";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¦\";bonus=x" but got "" -FAIL x/x;x="¦";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¦\";bonus=x" but got "" -PASS §/x (Blob/File) -PASS §/x (Request/Response) -PASS x/§ (Blob/File) -PASS x/§ (Request/Response) -FAIL x/x;§=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;§=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=§;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"§\";bonus=x" but got "" -FAIL x/x;x=§;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"§\";bonus=x" but got "" -FAIL x/x;x="§";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"§\";bonus=x" but got "" -FAIL x/x;x="§";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"§\";bonus=x" but got "" -PASS ¨/x (Blob/File) -PASS ¨/x (Request/Response) -PASS x/¨ (Blob/File) -PASS x/¨ (Request/Response) -FAIL x/x;¨=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¨=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¨;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¨\";bonus=x" but got "" -FAIL x/x;x=¨;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¨\";bonus=x" but got "" -FAIL x/x;x="¨";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¨\";bonus=x" but got "" -FAIL x/x;x="¨";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¨\";bonus=x" but got "" -PASS ©/x (Blob/File) -PASS ©/x (Request/Response) -PASS x/© (Blob/File) -PASS x/© (Request/Response) -FAIL x/x;©=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;©=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=©;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"©\";bonus=x" but got "" -FAIL x/x;x=©;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"©\";bonus=x" but got "" -FAIL x/x;x="©";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"©\";bonus=x" but got "" -FAIL x/x;x="©";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"©\";bonus=x" but got "" -PASS ª/x (Blob/File) -PASS ª/x (Request/Response) -PASS x/ª (Blob/File) -PASS x/ª (Request/Response) -FAIL x/x;ª=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ª=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ª;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ª\";bonus=x" but got "" -FAIL x/x;x=ª;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ª\";bonus=x" but got "" -FAIL x/x;x="ª";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ª\";bonus=x" but got "" -FAIL x/x;x="ª";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ª\";bonus=x" but got "" -PASS «/x (Blob/File) -PASS «/x (Request/Response) -PASS x/« (Blob/File) -PASS x/« (Request/Response) -FAIL x/x;«=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;«=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=«;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"«\";bonus=x" but got "" -FAIL x/x;x=«;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"«\";bonus=x" but got "" -FAIL x/x;x="«";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"«\";bonus=x" but got "" -FAIL x/x;x="«";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"«\";bonus=x" but got "" -PASS ¬/x (Blob/File) -PASS ¬/x (Request/Response) -PASS x/¬ (Blob/File) -PASS x/¬ (Request/Response) -FAIL x/x;¬=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¬=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¬;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¬\";bonus=x" but got "" -FAIL x/x;x=¬;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¬\";bonus=x" but got "" -FAIL x/x;x="¬";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¬\";bonus=x" but got "" -FAIL x/x;x="¬";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¬\";bonus=x" but got "" -PASS /x (Blob/File) -PASS /x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x=;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"\";bonus=x" but got "" -FAIL x/x;x="";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"\";bonus=x" but got "" -PASS ®/x (Blob/File) -PASS ®/x (Request/Response) -PASS x/® (Blob/File) -PASS x/® (Request/Response) -FAIL x/x;®=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;®=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=®;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"®\";bonus=x" but got "" -FAIL x/x;x=®;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"®\";bonus=x" but got "" -FAIL x/x;x="®";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"®\";bonus=x" but got "" -FAIL x/x;x="®";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"®\";bonus=x" but got "" -PASS ¯/x (Blob/File) -PASS ¯/x (Request/Response) -PASS x/¯ (Blob/File) -PASS x/¯ (Request/Response) -FAIL x/x;¯=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¯=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¯;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¯\";bonus=x" but got "" -FAIL x/x;x=¯;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¯\";bonus=x" but got "" -FAIL x/x;x="¯";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¯\";bonus=x" but got "" -FAIL x/x;x="¯";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¯\";bonus=x" but got "" -PASS °/x (Blob/File) -PASS °/x (Request/Response) -PASS x/° (Blob/File) -PASS x/° (Request/Response) -FAIL x/x;°=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;°=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=°;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"°\";bonus=x" but got "" -FAIL x/x;x=°;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"°\";bonus=x" but got "" -FAIL x/x;x="°";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"°\";bonus=x" but got "" -FAIL x/x;x="°";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"°\";bonus=x" but got "" -PASS ±/x (Blob/File) -PASS ±/x (Request/Response) -PASS x/± (Blob/File) -PASS x/± (Request/Response) -FAIL x/x;±=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;±=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=±;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"±\";bonus=x" but got "" -FAIL x/x;x=±;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"±\";bonus=x" but got "" -FAIL x/x;x="±";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"±\";bonus=x" but got "" -FAIL x/x;x="±";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"±\";bonus=x" but got "" -PASS ²/x (Blob/File) -PASS ²/x (Request/Response) -PASS x/² (Blob/File) -PASS x/² (Request/Response) -FAIL x/x;²=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;²=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=²;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"²\";bonus=x" but got "" -FAIL x/x;x=²;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"²\";bonus=x" but got "" -FAIL x/x;x="²";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"²\";bonus=x" but got "" -FAIL x/x;x="²";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"²\";bonus=x" but got "" -PASS ³/x (Blob/File) -PASS ³/x (Request/Response) -PASS x/³ (Blob/File) -PASS x/³ (Request/Response) -FAIL x/x;³=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;³=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=³;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"³\";bonus=x" but got "" -FAIL x/x;x=³;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"³\";bonus=x" but got "" -FAIL x/x;x="³";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"³\";bonus=x" but got "" -FAIL x/x;x="³";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"³\";bonus=x" but got "" -PASS ´/x (Blob/File) -PASS ´/x (Request/Response) -PASS x/´ (Blob/File) -PASS x/´ (Request/Response) -FAIL x/x;´=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;´=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=´;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"´\";bonus=x" but got "" -FAIL x/x;x=´;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"´\";bonus=x" but got "" -FAIL x/x;x="´";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"´\";bonus=x" but got "" -FAIL x/x;x="´";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"´\";bonus=x" but got "" -PASS µ/x (Blob/File) -PASS µ/x (Request/Response) -PASS x/µ (Blob/File) -PASS x/µ (Request/Response) -FAIL x/x;µ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;µ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=µ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"µ\";bonus=x" but got "" -FAIL x/x;x=µ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"µ\";bonus=x" but got "" -FAIL x/x;x="µ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"µ\";bonus=x" but got "" -FAIL x/x;x="µ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"µ\";bonus=x" but got "" -PASS ¶/x (Blob/File) -PASS ¶/x (Request/Response) -PASS x/¶ (Blob/File) -PASS x/¶ (Request/Response) -FAIL x/x;¶=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¶=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¶;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¶\";bonus=x" but got "" -FAIL x/x;x=¶;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¶\";bonus=x" but got "" -FAIL x/x;x="¶";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¶\";bonus=x" but got "" -FAIL x/x;x="¶";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¶\";bonus=x" but got "" -PASS ·/x (Blob/File) -PASS ·/x (Request/Response) -PASS x/· (Blob/File) -PASS x/· (Request/Response) -FAIL x/x;·=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;·=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=·;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"·\";bonus=x" but got "" -FAIL x/x;x=·;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"·\";bonus=x" but got "" -FAIL x/x;x="·";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"·\";bonus=x" but got "" -FAIL x/x;x="·";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"·\";bonus=x" but got "" -PASS ¸/x (Blob/File) -PASS ¸/x (Request/Response) -PASS x/¸ (Blob/File) -PASS x/¸ (Request/Response) -FAIL x/x;¸=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¸=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¸;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¸\";bonus=x" but got "" -FAIL x/x;x=¸;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¸\";bonus=x" but got "" -FAIL x/x;x="¸";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¸\";bonus=x" but got "" -FAIL x/x;x="¸";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¸\";bonus=x" but got "" -PASS ¹/x (Blob/File) -PASS ¹/x (Request/Response) -PASS x/¹ (Blob/File) -PASS x/¹ (Request/Response) -FAIL x/x;¹=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¹=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¹;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¹\";bonus=x" but got "" -FAIL x/x;x=¹;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¹\";bonus=x" but got "" -FAIL x/x;x="¹";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¹\";bonus=x" but got "" -FAIL x/x;x="¹";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¹\";bonus=x" but got "" -PASS º/x (Blob/File) -PASS º/x (Request/Response) -PASS x/º (Blob/File) -PASS x/º (Request/Response) -FAIL x/x;º=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;º=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=º;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"º\";bonus=x" but got "" -FAIL x/x;x=º;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"º\";bonus=x" but got "" -FAIL x/x;x="º";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"º\";bonus=x" but got "" -FAIL x/x;x="º";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"º\";bonus=x" but got "" -PASS »/x (Blob/File) -PASS »/x (Request/Response) -PASS x/» (Blob/File) -PASS x/» (Request/Response) -FAIL x/x;»=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;»=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=»;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"»\";bonus=x" but got "" -FAIL x/x;x=»;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"»\";bonus=x" but got "" -FAIL x/x;x="»";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"»\";bonus=x" but got "" -FAIL x/x;x="»";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"»\";bonus=x" but got "" -PASS ¼/x (Blob/File) -PASS ¼/x (Request/Response) -PASS x/¼ (Blob/File) -PASS x/¼ (Request/Response) -FAIL x/x;¼=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¼=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¼;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¼\";bonus=x" but got "" -FAIL x/x;x=¼;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¼\";bonus=x" but got "" -FAIL x/x;x="¼";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¼\";bonus=x" but got "" -FAIL x/x;x="¼";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¼\";bonus=x" but got "" -PASS ½/x (Blob/File) -PASS ½/x (Request/Response) -PASS x/½ (Blob/File) -PASS x/½ (Request/Response) -FAIL x/x;½=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;½=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=½;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"½\";bonus=x" but got "" -FAIL x/x;x=½;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"½\";bonus=x" but got "" -FAIL x/x;x="½";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"½\";bonus=x" but got "" -FAIL x/x;x="½";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"½\";bonus=x" but got "" -PASS ¾/x (Blob/File) -PASS ¾/x (Request/Response) -PASS x/¾ (Blob/File) -PASS x/¾ (Request/Response) -FAIL x/x;¾=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¾=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¾;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¾\";bonus=x" but got "" -FAIL x/x;x=¾;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¾\";bonus=x" but got "" -FAIL x/x;x="¾";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¾\";bonus=x" but got "" -FAIL x/x;x="¾";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¾\";bonus=x" but got "" -PASS ¿/x (Blob/File) -PASS ¿/x (Request/Response) -PASS x/¿ (Blob/File) -PASS x/¿ (Request/Response) -FAIL x/x;¿=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;¿=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=¿;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¿\";bonus=x" but got "" -FAIL x/x;x=¿;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¿\";bonus=x" but got "" -FAIL x/x;x="¿";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"¿\";bonus=x" but got "" -FAIL x/x;x="¿";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"¿\";bonus=x" but got "" -PASS À/x (Blob/File) -PASS À/x (Request/Response) -PASS x/À (Blob/File) -PASS x/À (Request/Response) -FAIL x/x;À=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;À=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=À;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"À\";bonus=x" but got "" -FAIL x/x;x=À;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"À\";bonus=x" but got "" -FAIL x/x;x="À";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"À\";bonus=x" but got "" -FAIL x/x;x="À";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"À\";bonus=x" but got "" -PASS Á/x (Blob/File) -PASS Á/x (Request/Response) -PASS x/Á (Blob/File) -PASS x/Á (Request/Response) -FAIL x/x;Á=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Á=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Á;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Á\";bonus=x" but got "" -FAIL x/x;x=Á;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Á\";bonus=x" but got "" -FAIL x/x;x="Á";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Á\";bonus=x" but got "" -FAIL x/x;x="Á";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Á\";bonus=x" but got "" -PASS Â/x (Blob/File) -PASS Â/x (Request/Response) -PASS x/ (Blob/File) -PASS x/ (Request/Response) -FAIL x/x;Â=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Â=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Â;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Â\";bonus=x" but got "" -FAIL x/x;x=Â;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Â\";bonus=x" but got "" -FAIL x/x;x="Â";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Â\";bonus=x" but got "" -FAIL x/x;x="Â";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Â\";bonus=x" but got "" -PASS Ã/x (Blob/File) -PASS Ã/x (Request/Response) -PASS x/à (Blob/File) -PASS x/à (Request/Response) -FAIL x/x;Ã=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ã=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ã;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ã\";bonus=x" but got "" -FAIL x/x;x=Ã;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ã\";bonus=x" but got "" -FAIL x/x;x="Ã";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ã\";bonus=x" but got "" -FAIL x/x;x="Ã";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ã\";bonus=x" but got "" -PASS Ä/x (Blob/File) -PASS Ä/x (Request/Response) -PASS x/Ä (Blob/File) -PASS x/Ä (Request/Response) -FAIL x/x;Ä=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ä=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ä;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ä\";bonus=x" but got "" -FAIL x/x;x=Ä;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ä\";bonus=x" but got "" -FAIL x/x;x="Ä";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ä\";bonus=x" but got "" -FAIL x/x;x="Ä";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ä\";bonus=x" but got "" -PASS Å/x (Blob/File) -PASS Å/x (Request/Response) -PASS x/Å (Blob/File) -PASS x/Å (Request/Response) -FAIL x/x;Å=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Å=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Å;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Å\";bonus=x" but got "" -FAIL x/x;x=Å;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Å\";bonus=x" but got "" -FAIL x/x;x="Å";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Å\";bonus=x" but got "" -FAIL x/x;x="Å";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Å\";bonus=x" but got "" -PASS Æ/x (Blob/File) -PASS Æ/x (Request/Response) -PASS x/Æ (Blob/File) -PASS x/Æ (Request/Response) -FAIL x/x;Æ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Æ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Æ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Æ\";bonus=x" but got "" -FAIL x/x;x=Æ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Æ\";bonus=x" but got "" -FAIL x/x;x="Æ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Æ\";bonus=x" but got "" -FAIL x/x;x="Æ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Æ\";bonus=x" but got "" -PASS Ç/x (Blob/File) -PASS Ç/x (Request/Response) -PASS x/Ç (Blob/File) -PASS x/Ç (Request/Response) -FAIL x/x;Ç=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ç=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ç;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ç\";bonus=x" but got "" -FAIL x/x;x=Ç;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ç\";bonus=x" but got "" -FAIL x/x;x="Ç";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ç\";bonus=x" but got "" -FAIL x/x;x="Ç";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ç\";bonus=x" but got "" -PASS È/x (Blob/File) -PASS È/x (Request/Response) -PASS x/È (Blob/File) -PASS x/È (Request/Response) -FAIL x/x;È=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;È=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=È;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"È\";bonus=x" but got "" -FAIL x/x;x=È;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"È\";bonus=x" but got "" -FAIL x/x;x="È";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"È\";bonus=x" but got "" -FAIL x/x;x="È";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"È\";bonus=x" but got "" -PASS É/x (Blob/File) -PASS É/x (Request/Response) -PASS x/É (Blob/File) -PASS x/É (Request/Response) -FAIL x/x;É=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;É=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=É;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"É\";bonus=x" but got "" -FAIL x/x;x=É;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"É\";bonus=x" but got "" -FAIL x/x;x="É";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"É\";bonus=x" but got "" -FAIL x/x;x="É";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"É\";bonus=x" but got "" -PASS Ê/x (Blob/File) -PASS Ê/x (Request/Response) -PASS x/Ê (Blob/File) -PASS x/Ê (Request/Response) -FAIL x/x;Ê=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ê=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ê;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ê\";bonus=x" but got "" -FAIL x/x;x=Ê;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ê\";bonus=x" but got "" -FAIL x/x;x="Ê";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ê\";bonus=x" but got "" -FAIL x/x;x="Ê";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ê\";bonus=x" but got "" -PASS Ë/x (Blob/File) -PASS Ë/x (Request/Response) -PASS x/Ë (Blob/File) -PASS x/Ë (Request/Response) -FAIL x/x;Ë=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ë=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ë;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ë\";bonus=x" but got "" -FAIL x/x;x=Ë;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ë\";bonus=x" but got "" -FAIL x/x;x="Ë";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ë\";bonus=x" but got "" -FAIL x/x;x="Ë";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ë\";bonus=x" but got "" -PASS Ì/x (Blob/File) -PASS Ì/x (Request/Response) -PASS x/Ì (Blob/File) -PASS x/Ì (Request/Response) -FAIL x/x;Ì=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ì=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ì;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ì\";bonus=x" but got "" -FAIL x/x;x=Ì;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ì\";bonus=x" but got "" -FAIL x/x;x="Ì";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ì\";bonus=x" but got "" -FAIL x/x;x="Ì";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ì\";bonus=x" but got "" -PASS Í/x (Blob/File) -PASS Í/x (Request/Response) -PASS x/Í (Blob/File) -PASS x/Í (Request/Response) -FAIL x/x;Í=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Í=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Í;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Í\";bonus=x" but got "" -FAIL x/x;x=Í;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Í\";bonus=x" but got "" -FAIL x/x;x="Í";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Í\";bonus=x" but got "" -FAIL x/x;x="Í";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Í\";bonus=x" but got "" -PASS Î/x (Blob/File) -PASS Î/x (Request/Response) -PASS x/Î (Blob/File) -PASS x/Î (Request/Response) -FAIL x/x;Î=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Î=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Î;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Î\";bonus=x" but got "" -FAIL x/x;x=Î;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Î\";bonus=x" but got "" -FAIL x/x;x="Î";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Î\";bonus=x" but got "" -FAIL x/x;x="Î";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Î\";bonus=x" but got "" -PASS Ï/x (Blob/File) -PASS Ï/x (Request/Response) -PASS x/Ï (Blob/File) -PASS x/Ï (Request/Response) -FAIL x/x;Ï=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ï=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ï;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ï\";bonus=x" but got "" -FAIL x/x;x=Ï;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ï\";bonus=x" but got "" -FAIL x/x;x="Ï";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ï\";bonus=x" but got "" -FAIL x/x;x="Ï";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ï\";bonus=x" but got "" -PASS Ð/x (Blob/File) -PASS Ð/x (Request/Response) -PASS x/Ð (Blob/File) -PASS x/Ð (Request/Response) -FAIL x/x;Ð=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ð=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ð;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ð\";bonus=x" but got "" -FAIL x/x;x=Ð;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ð\";bonus=x" but got "" -FAIL x/x;x="Ð";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ð\";bonus=x" but got "" -FAIL x/x;x="Ð";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ð\";bonus=x" but got "" -PASS Ñ/x (Blob/File) -PASS Ñ/x (Request/Response) -PASS x/Ñ (Blob/File) -PASS x/Ñ (Request/Response) -FAIL x/x;Ñ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ñ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ñ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ñ\";bonus=x" but got "" -FAIL x/x;x=Ñ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ñ\";bonus=x" but got "" -FAIL x/x;x="Ñ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ñ\";bonus=x" but got "" -FAIL x/x;x="Ñ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ñ\";bonus=x" but got "" -PASS Ò/x (Blob/File) -PASS Ò/x (Request/Response) -PASS x/Ò (Blob/File) -PASS x/Ò (Request/Response) -FAIL x/x;Ò=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ò=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ò;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ò\";bonus=x" but got "" -FAIL x/x;x=Ò;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ò\";bonus=x" but got "" -FAIL x/x;x="Ò";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ò\";bonus=x" but got "" -FAIL x/x;x="Ò";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ò\";bonus=x" but got "" -PASS Ó/x (Blob/File) -PASS Ó/x (Request/Response) -PASS x/Ó (Blob/File) -PASS x/Ó (Request/Response) -FAIL x/x;Ó=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ó=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ó;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ó\";bonus=x" but got "" -FAIL x/x;x=Ó;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ó\";bonus=x" but got "" -FAIL x/x;x="Ó";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ó\";bonus=x" but got "" -FAIL x/x;x="Ó";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ó\";bonus=x" but got "" -PASS Ô/x (Blob/File) -PASS Ô/x (Request/Response) -PASS x/Ô (Blob/File) -PASS x/Ô (Request/Response) -FAIL x/x;Ô=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ô=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ô;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ô\";bonus=x" but got "" -FAIL x/x;x=Ô;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ô\";bonus=x" but got "" -FAIL x/x;x="Ô";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ô\";bonus=x" but got "" -FAIL x/x;x="Ô";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ô\";bonus=x" but got "" -PASS Õ/x (Blob/File) -PASS Õ/x (Request/Response) -PASS x/Õ (Blob/File) -PASS x/Õ (Request/Response) -FAIL x/x;Õ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Õ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Õ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Õ\";bonus=x" but got "" -FAIL x/x;x=Õ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Õ\";bonus=x" but got "" -FAIL x/x;x="Õ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Õ\";bonus=x" but got "" -FAIL x/x;x="Õ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Õ\";bonus=x" but got "" -PASS Ö/x (Blob/File) -PASS Ö/x (Request/Response) -PASS x/Ö (Blob/File) -PASS x/Ö (Request/Response) -FAIL x/x;Ö=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ö=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ö;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ö\";bonus=x" but got "" -FAIL x/x;x=Ö;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ö\";bonus=x" but got "" -FAIL x/x;x="Ö";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ö\";bonus=x" but got "" -FAIL x/x;x="Ö";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ö\";bonus=x" but got "" -PASS ×/x (Blob/File) -PASS ×/x (Request/Response) -PASS x/× (Blob/File) -PASS x/× (Request/Response) -FAIL x/x;×=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;×=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=×;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"×\";bonus=x" but got "" -FAIL x/x;x=×;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"×\";bonus=x" but got "" -FAIL x/x;x="×";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"×\";bonus=x" but got "" -FAIL x/x;x="×";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"×\";bonus=x" but got "" -PASS Ø/x (Blob/File) -PASS Ø/x (Request/Response) -PASS x/Ø (Blob/File) -PASS x/Ø (Request/Response) -FAIL x/x;Ø=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ø=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ø;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ø\";bonus=x" but got "" -FAIL x/x;x=Ø;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ø\";bonus=x" but got "" -FAIL x/x;x="Ø";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ø\";bonus=x" but got "" -FAIL x/x;x="Ø";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ø\";bonus=x" but got "" -PASS Ù/x (Blob/File) -PASS Ù/x (Request/Response) -PASS x/Ù (Blob/File) -PASS x/Ù (Request/Response) -FAIL x/x;Ù=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ù=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ù;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ù\";bonus=x" but got "" -FAIL x/x;x=Ù;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ù\";bonus=x" but got "" -FAIL x/x;x="Ù";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ù\";bonus=x" but got "" -FAIL x/x;x="Ù";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ù\";bonus=x" but got "" -PASS Ú/x (Blob/File) -PASS Ú/x (Request/Response) -PASS x/Ú (Blob/File) -PASS x/Ú (Request/Response) -FAIL x/x;Ú=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ú=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ú;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ú\";bonus=x" but got "" -FAIL x/x;x=Ú;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ú\";bonus=x" but got "" -FAIL x/x;x="Ú";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ú\";bonus=x" but got "" -FAIL x/x;x="Ú";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ú\";bonus=x" but got "" -PASS Û/x (Blob/File) -PASS Û/x (Request/Response) -PASS x/Û (Blob/File) -PASS x/Û (Request/Response) -FAIL x/x;Û=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Û=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Û;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Û\";bonus=x" but got "" -FAIL x/x;x=Û;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Û\";bonus=x" but got "" -FAIL x/x;x="Û";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Û\";bonus=x" but got "" -FAIL x/x;x="Û";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Û\";bonus=x" but got "" -PASS Ü/x (Blob/File) -PASS Ü/x (Request/Response) -PASS x/Ü (Blob/File) -PASS x/Ü (Request/Response) -FAIL x/x;Ü=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ü=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ü;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ü\";bonus=x" but got "" -FAIL x/x;x=Ü;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ü\";bonus=x" but got "" -FAIL x/x;x="Ü";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ü\";bonus=x" but got "" -FAIL x/x;x="Ü";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ü\";bonus=x" but got "" -PASS Ý/x (Blob/File) -PASS Ý/x (Request/Response) -PASS x/Ý (Blob/File) -PASS x/Ý (Request/Response) -FAIL x/x;Ý=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Ý=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Ý;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ý\";bonus=x" but got "" -FAIL x/x;x=Ý;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ý\";bonus=x" but got "" -FAIL x/x;x="Ý";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Ý\";bonus=x" but got "" -FAIL x/x;x="Ý";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Ý\";bonus=x" but got "" -PASS Þ/x (Blob/File) -PASS Þ/x (Request/Response) -PASS x/Þ (Blob/File) -PASS x/Þ (Request/Response) -FAIL x/x;Þ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;Þ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=Þ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Þ\";bonus=x" but got "" -FAIL x/x;x=Þ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Þ\";bonus=x" but got "" -FAIL x/x;x="Þ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"Þ\";bonus=x" but got "" -FAIL x/x;x="Þ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"Þ\";bonus=x" but got "" -PASS ß/x (Blob/File) -PASS ß/x (Request/Response) -PASS x/ß (Blob/File) -PASS x/ß (Request/Response) -FAIL x/x;ß=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ß=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ß;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ß\";bonus=x" but got "" -FAIL x/x;x=ß;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ß\";bonus=x" but got "" -FAIL x/x;x="ß";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ß\";bonus=x" but got "" -FAIL x/x;x="ß";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ß\";bonus=x" but got "" -PASS à/x (Blob/File) -PASS à/x (Request/Response) -PASS x/à (Blob/File) -PASS x/à (Request/Response) -FAIL x/x;à=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;à=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=à;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"à\";bonus=x" but got "" -FAIL x/x;x=à;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"à\";bonus=x" but got "" -FAIL x/x;x="à";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"à\";bonus=x" but got "" -FAIL x/x;x="à";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"à\";bonus=x" but got "" -PASS á/x (Blob/File) -PASS á/x (Request/Response) -PASS x/á (Blob/File) -PASS x/á (Request/Response) -FAIL x/x;á=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;á=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=á;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"á\";bonus=x" but got "" -FAIL x/x;x=á;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"á\";bonus=x" but got "" -FAIL x/x;x="á";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"á\";bonus=x" but got "" -FAIL x/x;x="á";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"á\";bonus=x" but got "" -PASS â/x (Blob/File) -PASS â/x (Request/Response) -PASS x/â (Blob/File) -PASS x/â (Request/Response) -FAIL x/x;â=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;â=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=â;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"â\";bonus=x" but got "" -FAIL x/x;x=â;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"â\";bonus=x" but got "" -FAIL x/x;x="â";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"â\";bonus=x" but got "" -FAIL x/x;x="â";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"â\";bonus=x" but got "" -PASS ã/x (Blob/File) -PASS ã/x (Request/Response) -PASS x/ã (Blob/File) -PASS x/ã (Request/Response) -FAIL x/x;ã=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ã=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ã;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ã\";bonus=x" but got "" -FAIL x/x;x=ã;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ã\";bonus=x" but got "" -FAIL x/x;x="ã";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ã\";bonus=x" but got "" -FAIL x/x;x="ã";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ã\";bonus=x" but got "" -PASS ä/x (Blob/File) -PASS ä/x (Request/Response) -PASS x/ä (Blob/File) -PASS x/ä (Request/Response) -FAIL x/x;ä=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ä=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ä;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ä\";bonus=x" but got "" -FAIL x/x;x=ä;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ä\";bonus=x" but got "" -FAIL x/x;x="ä";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ä\";bonus=x" but got "" -FAIL x/x;x="ä";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ä\";bonus=x" but got "" -PASS å/x (Blob/File) -PASS å/x (Request/Response) -PASS x/å (Blob/File) -PASS x/å (Request/Response) -FAIL x/x;å=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;å=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=å;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"å\";bonus=x" but got "" -FAIL x/x;x=å;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"å\";bonus=x" but got "" -FAIL x/x;x="å";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"å\";bonus=x" but got "" -FAIL x/x;x="å";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"å\";bonus=x" but got "" -PASS æ/x (Blob/File) -PASS æ/x (Request/Response) -PASS x/æ (Blob/File) -PASS x/æ (Request/Response) -FAIL x/x;æ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;æ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=æ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"æ\";bonus=x" but got "" -FAIL x/x;x=æ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"æ\";bonus=x" but got "" -FAIL x/x;x="æ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"æ\";bonus=x" but got "" -FAIL x/x;x="æ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"æ\";bonus=x" but got "" -PASS ç/x (Blob/File) -PASS ç/x (Request/Response) -PASS x/ç (Blob/File) -PASS x/ç (Request/Response) -FAIL x/x;ç=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ç=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ç;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ç\";bonus=x" but got "" -FAIL x/x;x=ç;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ç\";bonus=x" but got "" -FAIL x/x;x="ç";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ç\";bonus=x" but got "" -FAIL x/x;x="ç";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ç\";bonus=x" but got "" -PASS è/x (Blob/File) -PASS è/x (Request/Response) -PASS x/è (Blob/File) -PASS x/è (Request/Response) -FAIL x/x;è=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;è=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=è;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"è\";bonus=x" but got "" -FAIL x/x;x=è;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"è\";bonus=x" but got "" -FAIL x/x;x="è";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"è\";bonus=x" but got "" -FAIL x/x;x="è";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"è\";bonus=x" but got "" -PASS é/x (Blob/File) -PASS é/x (Request/Response) -PASS x/é (Blob/File) -PASS x/é (Request/Response) -FAIL x/x;é=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;é=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=é;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"é\";bonus=x" but got "" -FAIL x/x;x=é;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"é\";bonus=x" but got "" -FAIL x/x;x="é";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"é\";bonus=x" but got "" -FAIL x/x;x="é";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"é\";bonus=x" but got "" -PASS ê/x (Blob/File) -PASS ê/x (Request/Response) -PASS x/ê (Blob/File) -PASS x/ê (Request/Response) -FAIL x/x;ê=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ê=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ê;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ê\";bonus=x" but got "" -FAIL x/x;x=ê;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ê\";bonus=x" but got "" -FAIL x/x;x="ê";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ê\";bonus=x" but got "" -FAIL x/x;x="ê";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ê\";bonus=x" but got "" -PASS ë/x (Blob/File) -PASS ë/x (Request/Response) -PASS x/ë (Blob/File) -PASS x/ë (Request/Response) -FAIL x/x;ë=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ë=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ë;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ë\";bonus=x" but got "" -FAIL x/x;x=ë;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ë\";bonus=x" but got "" -FAIL x/x;x="ë";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ë\";bonus=x" but got "" -FAIL x/x;x="ë";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ë\";bonus=x" but got "" -PASS ì/x (Blob/File) -PASS ì/x (Request/Response) -PASS x/ì (Blob/File) -PASS x/ì (Request/Response) -FAIL x/x;ì=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ì=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ì;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ì\";bonus=x" but got "" -FAIL x/x;x=ì;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ì\";bonus=x" but got "" -FAIL x/x;x="ì";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ì\";bonus=x" but got "" -FAIL x/x;x="ì";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ì\";bonus=x" but got "" -PASS í/x (Blob/File) -PASS í/x (Request/Response) -PASS x/í (Blob/File) -PASS x/í (Request/Response) -FAIL x/x;í=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;í=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=í;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"í\";bonus=x" but got "" -FAIL x/x;x=í;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"í\";bonus=x" but got "" -FAIL x/x;x="í";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"í\";bonus=x" but got "" -FAIL x/x;x="í";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"í\";bonus=x" but got "" -PASS î/x (Blob/File) -PASS î/x (Request/Response) -PASS x/î (Blob/File) -PASS x/î (Request/Response) -FAIL x/x;î=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;î=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=î;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"î\";bonus=x" but got "" -FAIL x/x;x=î;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"î\";bonus=x" but got "" -FAIL x/x;x="î";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"î\";bonus=x" but got "" -FAIL x/x;x="î";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"î\";bonus=x" but got "" -PASS ï/x (Blob/File) -PASS ï/x (Request/Response) -PASS x/ï (Blob/File) -PASS x/ï (Request/Response) -FAIL x/x;ï=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ï=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ï;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ï\";bonus=x" but got "" -FAIL x/x;x=ï;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ï\";bonus=x" but got "" -FAIL x/x;x="ï";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ï\";bonus=x" but got "" -FAIL x/x;x="ï";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ï\";bonus=x" but got "" -PASS ð/x (Blob/File) -PASS ð/x (Request/Response) -PASS x/ð (Blob/File) -PASS x/ð (Request/Response) -FAIL x/x;ð=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ð=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ð;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ð\";bonus=x" but got "" -FAIL x/x;x=ð;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ð\";bonus=x" but got "" -FAIL x/x;x="ð";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ð\";bonus=x" but got "" -FAIL x/x;x="ð";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ð\";bonus=x" but got "" -PASS ñ/x (Blob/File) -PASS ñ/x (Request/Response) -PASS x/ñ (Blob/File) -PASS x/ñ (Request/Response) -FAIL x/x;ñ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ñ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ñ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ñ\";bonus=x" but got "" -FAIL x/x;x=ñ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ñ\";bonus=x" but got "" -FAIL x/x;x="ñ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ñ\";bonus=x" but got "" -FAIL x/x;x="ñ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ñ\";bonus=x" but got "" -PASS ò/x (Blob/File) -PASS ò/x (Request/Response) -PASS x/ò (Blob/File) -PASS x/ò (Request/Response) -FAIL x/x;ò=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ò=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ò;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ò\";bonus=x" but got "" -FAIL x/x;x=ò;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ò\";bonus=x" but got "" -FAIL x/x;x="ò";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ò\";bonus=x" but got "" -FAIL x/x;x="ò";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ò\";bonus=x" but got "" -PASS ó/x (Blob/File) -PASS ó/x (Request/Response) -PASS x/ó (Blob/File) -PASS x/ó (Request/Response) -FAIL x/x;ó=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ó=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ó;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ó\";bonus=x" but got "" -FAIL x/x;x=ó;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ó\";bonus=x" but got "" -FAIL x/x;x="ó";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ó\";bonus=x" but got "" -FAIL x/x;x="ó";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ó\";bonus=x" but got "" -PASS ô/x (Blob/File) -PASS ô/x (Request/Response) -PASS x/ô (Blob/File) -PASS x/ô (Request/Response) -FAIL x/x;ô=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ô=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ô;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ô\";bonus=x" but got "" -FAIL x/x;x=ô;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ô\";bonus=x" but got "" -FAIL x/x;x="ô";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ô\";bonus=x" but got "" -FAIL x/x;x="ô";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ô\";bonus=x" but got "" -PASS õ/x (Blob/File) -PASS õ/x (Request/Response) -PASS x/õ (Blob/File) -PASS x/õ (Request/Response) -FAIL x/x;õ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;õ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=õ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"õ\";bonus=x" but got "" -FAIL x/x;x=õ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"õ\";bonus=x" but got "" -FAIL x/x;x="õ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"õ\";bonus=x" but got "" -FAIL x/x;x="õ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"õ\";bonus=x" but got "" -PASS ö/x (Blob/File) -PASS ö/x (Request/Response) -PASS x/ö (Blob/File) -PASS x/ö (Request/Response) -FAIL x/x;ö=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ö=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ö;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ö\";bonus=x" but got "" -FAIL x/x;x=ö;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ö\";bonus=x" but got "" -FAIL x/x;x="ö";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ö\";bonus=x" but got "" -FAIL x/x;x="ö";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ö\";bonus=x" but got "" -PASS ÷/x (Blob/File) -PASS ÷/x (Request/Response) -PASS x/÷ (Blob/File) -PASS x/÷ (Request/Response) -FAIL x/x;÷=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;÷=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=÷;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"÷\";bonus=x" but got "" -FAIL x/x;x=÷;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"÷\";bonus=x" but got "" -FAIL x/x;x="÷";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"÷\";bonus=x" but got "" -FAIL x/x;x="÷";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"÷\";bonus=x" but got "" -PASS ø/x (Blob/File) -PASS ø/x (Request/Response) -PASS x/ø (Blob/File) -PASS x/ø (Request/Response) -FAIL x/x;ø=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ø=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ø;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ø\";bonus=x" but got "" -FAIL x/x;x=ø;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ø\";bonus=x" but got "" -FAIL x/x;x="ø";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ø\";bonus=x" but got "" -FAIL x/x;x="ø";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ø\";bonus=x" but got "" -PASS ù/x (Blob/File) -PASS ù/x (Request/Response) -PASS x/ù (Blob/File) -PASS x/ù (Request/Response) -FAIL x/x;ù=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ù=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ù;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ù\";bonus=x" but got "" -FAIL x/x;x=ù;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ù\";bonus=x" but got "" -FAIL x/x;x="ù";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ù\";bonus=x" but got "" -FAIL x/x;x="ù";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ù\";bonus=x" but got "" -PASS ú/x (Blob/File) -PASS ú/x (Request/Response) -PASS x/ú (Blob/File) -PASS x/ú (Request/Response) -FAIL x/x;ú=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ú=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ú;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ú\";bonus=x" but got "" -FAIL x/x;x=ú;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ú\";bonus=x" but got "" -FAIL x/x;x="ú";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ú\";bonus=x" but got "" -FAIL x/x;x="ú";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ú\";bonus=x" but got "" -PASS û/x (Blob/File) -PASS û/x (Request/Response) -PASS x/û (Blob/File) -PASS x/û (Request/Response) -FAIL x/x;û=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;û=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=û;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"û\";bonus=x" but got "" -FAIL x/x;x=û;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"û\";bonus=x" but got "" -FAIL x/x;x="û";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"û\";bonus=x" but got "" -FAIL x/x;x="û";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"û\";bonus=x" but got "" -PASS ü/x (Blob/File) -PASS ü/x (Request/Response) -PASS x/ü (Blob/File) -PASS x/ü (Request/Response) -FAIL x/x;ü=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ü=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ü;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ü\";bonus=x" but got "" -FAIL x/x;x=ü;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ü\";bonus=x" but got "" -FAIL x/x;x="ü";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ü\";bonus=x" but got "" -FAIL x/x;x="ü";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ü\";bonus=x" but got "" -PASS ý/x (Blob/File) -PASS ý/x (Request/Response) -PASS x/ý (Blob/File) -PASS x/ý (Request/Response) -FAIL x/x;ý=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ý=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ý;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ý\";bonus=x" but got "" -FAIL x/x;x=ý;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ý\";bonus=x" but got "" -FAIL x/x;x="ý";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ý\";bonus=x" but got "" -FAIL x/x;x="ý";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ý\";bonus=x" but got "" -PASS þ/x (Blob/File) -PASS þ/x (Request/Response) -PASS x/þ (Blob/File) -PASS x/þ (Request/Response) -FAIL x/x;þ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;þ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=þ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"þ\";bonus=x" but got "" -FAIL x/x;x=þ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"þ\";bonus=x" but got "" -FAIL x/x;x="þ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"þ\";bonus=x" but got "" -FAIL x/x;x="þ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"þ\";bonus=x" but got "" -PASS ÿ/x (Blob/File) -PASS ÿ/x (Request/Response) -PASS x/ÿ (Blob/File) -PASS x/ÿ (Request/Response) -FAIL x/x;ÿ=x;bonus=x (Blob/File) assert_equals: Blob expected "x/x;bonus=x" but got "" -FAIL x/x;ÿ=x;bonus=x (Request/Response) assert_equals: expected "x/x;bonus=x" but got "" -FAIL x/x;x=ÿ;bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ÿ\";bonus=x" but got "" -FAIL x/x;x=ÿ;bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ÿ\";bonus=x" but got "" -FAIL x/x;x="ÿ";bonus=x (Blob/File) assert_equals: Blob expected "x/x;x=\"ÿ\";bonus=x" but got "" -FAIL x/x;x="ÿ";bonus=x (Request/Response) assert_equals: expected "x/x;x=\"ÿ\";bonus=x" but got "" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/performance-timeline/idlharness-shadowrealm.window-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/performance-timeline/idlharness-shadowrealm.window-expected.txt deleted file mode 100644 index 2db45e1..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/performance-timeline/idlharness-shadowrealm.window-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -Harness Error. harness_status.status = 1 , harness_status.message = ReferenceError: ShadowRealm is not defined -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/permissions/all-permissions-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/permissions/all-permissions-expected.txt deleted file mode 100644 index afe441e..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/permissions/all-permissions-expected.txt +++ /dev/null
@@ -1,22 +0,0 @@ -This is a testharness.js-based test. -PASS Query "geolocation" permission -PASS Query "notifications" permission -PASS Query "persistent-storage" permission -FAIL Query "push" permission promise_test: Unhandled rejection with value: object "NotSupportedError: Failed to execute 'query' on 'Permissions': Push Permission without userVisibleOnly:true isn't supported yet." -PASS Query "accelerometer" permission -PASS Query "ambient-light-sensor" permission -PASS Query "background-fetch" permission -PASS Query "background-sync" permission -FAIL Query "bluetooth" permission promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'query' on 'Permissions': Failed to read the 'name' property from 'PermissionDescriptor': The provided value 'bluetooth' is not a valid enum value of type PermissionName." -PASS Query "gyroscope" permission -PASS Query "magnetometer" permission -PASS Query "midi" permission -PASS Query "nfc" permission -PASS Query "screen-wake-lock" permission -PASS Query "camera" permission -PASS Query "display-capture" permission -PASS Query "microphone" permission -FAIL Query "speaker-selection" permission promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'query' on 'Permissions': Failed to read the 'name' property from 'PermissionDescriptor': The provided value 'speaker-selection' is not a valid enum value of type PermissionName." -FAIL Query "xr-spatial-tracking" permission promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'query' on 'Permissions': Failed to read the 'name' property from 'PermissionDescriptor': The provided value 'xr-spatial-tracking' is not a valid enum value of type PermissionName." -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/preload/link-header-preload-non-html-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/preload/link-header-preload-non-html-expected.txt deleted file mode 100644 index 9e7a1306..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/preload/link-header-preload-non-html-expected.txt +++ /dev/null
@@ -1,8 +0,0 @@ -This is a testharness.js-based test. -PASS XHTML documents should respect preload Link headers -PASS plain text documents should respect preload Link headers -PASS image documents should respect preload Link headers -FAIL media documents should respect preload Link headers assert_equals: verify that request was issued exactly once expected 1 but got 2 -PASS invalid image documents should respect preload Link headers -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/preload/preconnect-onerror-event-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/preload/preconnect-onerror-event-expected.txt deleted file mode 100644 index d507b6c..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/preload/preconnect-onerror-event-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -Harness Error. harness_status.status = 1 , harness_status.message = Uncaught SyntaxError: Unexpected token ')' -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/resource-timing/iframe-failed-commit-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/resource-timing/iframe-failed-commit-expected.txt deleted file mode 100644 index 2cee4df6..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/resource-timing/iframe-failed-commit-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -Harness Error. harness_status.status = 1 , harness_status.message = Uncaught TypeError: Failed to construct 'URL': Invalid URL -PASS Test iframe from non-existent host gets reported -PASS Test iframe redirecting to non-existent host gets reported -PASS Same-origin iframe that complies with CSP attribute gets reported -PASS Same-origin iframe that doesn't comply with CSP attribute gets reported -PASS Cross-origin iframe that complies with CSP attribute gets reported -PASS Cross-origin iframe that doesn't comply with CSP attribute gets reported -PASS Same-origin empty iframe with a 200 status gets reported -PASS Cross-origin empty iframe with a 200 status gets reported -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/secure-payment-confirmation/authentication-requires-user-activation.https-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/secure-payment-confirmation/authentication-requires-user-activation.https-expected.txt deleted file mode 100644 index 184762bb..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/secure-payment-confirmation/authentication-requires-user-activation.https-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL SPC authentication not allowed without a user activation promise_test: Unhandled rejection with value: object "Error: unimplemented" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/streams/idlharness-shadowrealm.window-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/streams/idlharness-shadowrealm.window-expected.txt deleted file mode 100644 index 2db45e1..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/streams/idlharness-shadowrealm.window-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -Harness Error. harness_status.status = 1 , harness_status.message = ReferenceError: ShadowRealm is not defined -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/streams/readable-streams/global-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/streams/readable-streams/global-expected.txt deleted file mode 100644 index 8fe1616d..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/streams/readable-streams/global-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -PASS Stream objects created in expected globals -FAIL Cancel promise is created in same global as stream assert_equals: Cancel promise comes from the same global as the stream expected true but got false -PASS Closed Promise in correct global -PASS Reader objects in correct global -PASS Desired size can be grafted from one prototype to another -PASS Closing errored stream throws object in appropriate global -PASS Can enqueue chunks from multiple globals -PASS Correct errors and globals for closed streams -PASS Tee Branches in correct global -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/url/idlharness-shadowrealm.window-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/url/idlharness-shadowrealm.window-expected.txt deleted file mode 100644 index 2db45e1..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/url/idlharness-shadowrealm.window-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -Harness Error. harness_status.status = 1 , harness_status.message = ReferenceError: ShadowRealm is not defined -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/user-timing/idlharness-shadowrealm.window-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/user-timing/idlharness-shadowrealm.window-expected.txt deleted file mode 100644 index 2db45e1..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/user-timing/idlharness-shadowrealm.window-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -Harness Error. harness_status.status = 1 , harness_status.message = ReferenceError: ShadowRealm is not defined -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/wasm/jsapi/global/constructor.any-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/wasm/jsapi/global/constructor.any-expected.txt deleted file mode 100644 index 9605e64..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/wasm/jsapi/global/constructor.any-expected.txt +++ /dev/null
@@ -1,64 +0,0 @@ -This is a testharness.js-based test. -Found 60 tests; 59 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS name -PASS length -PASS No arguments -PASS Calling -PASS Order of evaluation -PASS Invalid descriptor argument -PASS Invalid type argument -FAIL Construct v128 global assert_throws_js: function "() => new WebAssembly.Global(argument)" threw object "TypeError: WebAssembly.Global(): Descriptor property 'value' must be a WebAssembly type" ("TypeError") expected instance of function "function LinkError() { [native code] }" ("LinkError") -PASS i64 with default -PASS Default value for type i32 -PASS Explicit value undefined for type i32 -PASS Explicit value null for type i32 -PASS Explicit value true for type i32 -PASS Explicit value false for type i32 -PASS Explicit value 2 for type i32 -PASS Explicit value "3" for type i32 -PASS Explicit value object with toString returning string for type i32 -PASS Explicit value object with valueOf returning string for type i32 -PASS Explicit value object with toString returning number for type i32 -PASS Explicit value object with valueOf returning number for type i32 -PASS BigInt value for type i32 -PASS Default value for type f32 -PASS Explicit value undefined for type f32 -PASS Explicit value null for type f32 -PASS Explicit value true for type f32 -PASS Explicit value false for type f32 -PASS Explicit value 2 for type f32 -PASS Explicit value "3" for type f32 -PASS Explicit value object with toString returning string for type f32 -PASS Explicit value object with valueOf returning string for type f32 -PASS Explicit value object with toString returning number for type f32 -PASS Explicit value object with valueOf returning number for type f32 -PASS BigInt value for type f32 -PASS Default value for type f64 -PASS Explicit value undefined for type f64 -PASS Explicit value null for type f64 -PASS Explicit value true for type f64 -PASS Explicit value false for type f64 -PASS Explicit value 2 for type f64 -PASS Explicit value "3" for type f64 -PASS Explicit value object with toString returning string for type f64 -PASS Explicit value object with valueOf returning string for type f64 -PASS Explicit value object with toString returning number for type f64 -PASS Explicit value object with valueOf returning number for type f64 -PASS BigInt value for type f64 -PASS Explicit value undefined for type i64 -PASS Explicit value true for type i64 -PASS Explicit value false for type i64 -PASS Explicit value "3" for type i64 -PASS Explicit value bigint "123" for type i64 -PASS Explicit value object with toString returning string for type i64 -PASS Explicit value object with valueOf returning string for type i64 -PASS Explicit value object with toString returning bigint for type i64 -PASS Explicit value object with valueOf returning bigint for type i64 -PASS Pass non-bigint as i64 Global value: null -PASS Pass non-bigint as i64 Global value: 666 -PASS Pass non-bigint as i64 Global value: object "5" -PASS Pass non-bigint as i64 Global value: object "[object Object]" -PASS Pass non-bigint as i64 Global value: symbol "Symbol()" -PASS Stray argument -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/wasm/jsapi/global/constructor.any.worker-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/wasm/jsapi/global/constructor.any.worker-expected.txt deleted file mode 100644 index 9605e64..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/wasm/jsapi/global/constructor.any.worker-expected.txt +++ /dev/null
@@ -1,64 +0,0 @@ -This is a testharness.js-based test. -Found 60 tests; 59 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS name -PASS length -PASS No arguments -PASS Calling -PASS Order of evaluation -PASS Invalid descriptor argument -PASS Invalid type argument -FAIL Construct v128 global assert_throws_js: function "() => new WebAssembly.Global(argument)" threw object "TypeError: WebAssembly.Global(): Descriptor property 'value' must be a WebAssembly type" ("TypeError") expected instance of function "function LinkError() { [native code] }" ("LinkError") -PASS i64 with default -PASS Default value for type i32 -PASS Explicit value undefined for type i32 -PASS Explicit value null for type i32 -PASS Explicit value true for type i32 -PASS Explicit value false for type i32 -PASS Explicit value 2 for type i32 -PASS Explicit value "3" for type i32 -PASS Explicit value object with toString returning string for type i32 -PASS Explicit value object with valueOf returning string for type i32 -PASS Explicit value object with toString returning number for type i32 -PASS Explicit value object with valueOf returning number for type i32 -PASS BigInt value for type i32 -PASS Default value for type f32 -PASS Explicit value undefined for type f32 -PASS Explicit value null for type f32 -PASS Explicit value true for type f32 -PASS Explicit value false for type f32 -PASS Explicit value 2 for type f32 -PASS Explicit value "3" for type f32 -PASS Explicit value object with toString returning string for type f32 -PASS Explicit value object with valueOf returning string for type f32 -PASS Explicit value object with toString returning number for type f32 -PASS Explicit value object with valueOf returning number for type f32 -PASS BigInt value for type f32 -PASS Default value for type f64 -PASS Explicit value undefined for type f64 -PASS Explicit value null for type f64 -PASS Explicit value true for type f64 -PASS Explicit value false for type f64 -PASS Explicit value 2 for type f64 -PASS Explicit value "3" for type f64 -PASS Explicit value object with toString returning string for type f64 -PASS Explicit value object with valueOf returning string for type f64 -PASS Explicit value object with toString returning number for type f64 -PASS Explicit value object with valueOf returning number for type f64 -PASS BigInt value for type f64 -PASS Explicit value undefined for type i64 -PASS Explicit value true for type i64 -PASS Explicit value false for type i64 -PASS Explicit value "3" for type i64 -PASS Explicit value bigint "123" for type i64 -PASS Explicit value object with toString returning string for type i64 -PASS Explicit value object with valueOf returning string for type i64 -PASS Explicit value object with toString returning bigint for type i64 -PASS Explicit value object with valueOf returning bigint for type i64 -PASS Pass non-bigint as i64 Global value: null -PASS Pass non-bigint as i64 Global value: 666 -PASS Pass non-bigint as i64 Global value: object "5" -PASS Pass non-bigint as i64 Global value: object "[object Object]" -PASS Pass non-bigint as i64 Global value: symbol "Symbol()" -PASS Stray argument -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/web-animations/timing-model/animations/seamlessly-updating-the-playback-rate-of-an-animation-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/web-animations/timing-model/animations/seamlessly-updating-the-playback-rate-of-an-animation-expected.txt deleted file mode 100644 index 0809437..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/web-animations/timing-model/animations/seamlessly-updating-the-playback-rate-of-an-animation-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This is a testharness.js-based test. -PASS Updating the playback rate maintains the current time -PASS Updating the playback rate while running makes the animation pending -PASS Updating the playback rate on a play-pending animation maintains the current time -PASS Updating the playback rate on a pause-pending animation maintains the current time -PASS If a pending playback rate is set multiple times, the latest wins -PASS In the idle state, the playback rate is applied immediately -PASS In the paused state, the playback rate is applied immediately -PASS Updating the playback rate on a finished animation maintains the current time -PASS Updating the playback rate to zero on a finished animation maintains the current time -FAIL Updating the negative playback rate with the unresolved current time and a positive infinite associated effect end should not throw an exception assert_equals: We apply the pending playback rate immediately if the current time is unresolved expected -1 but got 1 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/webaudio/the-audio-api/the-audiobuffer-interface/acquire-the-content-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/webaudio/the-audio-api/the-audiobuffer-interface/acquire-the-content-expected.txt deleted file mode 100644 index 74faed557..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/webaudio/the-audio-api/the-audiobuffer-interface/acquire-the-content-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -FAIL AudioBufferSourceNode setter set with non-null buffer assert_true: Invalid value at index 0, expecte close to 1.0, found 0.5 when reading back expected true got false -FAIL AudioBufferSourceNode buffer setter set with null assert_true: Invalid value at index 0, expecte close to 1.0, found 0.5 when reading back expected true got false -PASS ConvolverNode -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Close-1000-reason.any_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Close-1000-reason.any_wpt_flags=h2-expected.txt deleted file mode 100644 index dc3fa03..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Close-1000-reason.any_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Create WebSocket - Close the Connection - close(1000, reason) - readyState should be in CLOSED state and wasClean is TRUE - Connection should be closed assert_true: WebSocket connection should be opened expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Close-2999-reason.any_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Close-2999-reason.any_wpt_flags=h2-expected.txt deleted file mode 100644 index f1e9dc8..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Close-2999-reason.any_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Create WebSocket - Close the Connection - close(2999, reason) - INVALID_ACCESS_ERR is thrown assert_unreached: close event should not fire Reached unreachable code -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Create-valid-url-protocol-string.any.worker_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Create-valid-url-protocol-string.any.worker_wpt_flags=h2-expected.txt deleted file mode 100644 index eab04c0..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Create-valid-url-protocol-string.any.worker_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Create WebSocket - Pass a valid URL and protocol string - Connection should be closed assert_true: WebSocket connection should be open expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Create-valid-url-protocol.any.worker_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Create-valid-url-protocol.any.worker_wpt_flags=h2-expected.txt deleted file mode 100644 index d46b601..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Create-valid-url-protocol.any.worker_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Create WebSocket - Pass a valid URL and a protocol string - Connection should be closed assert_true: WebSocket connection should be open expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Send-0byte-data.any.worker_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Send-0byte-data.any.worker_wpt_flags=h2-expected.txt deleted file mode 100644 index 13ac904..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Send-0byte-data.any.worker_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Send 0 byte data on a WebSocket - Connection should be closed assert_true: WebSocket connection should be open expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Send-unpaired-surrogates.any_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Send-unpaired-surrogates.any_wpt_flags=h2-expected.txt deleted file mode 100644 index 69f784d..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/Send-unpaired-surrogates.any_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Send unpaired surrogates on a WebSocket - Connection should be closed assert_true: WebSocket connection should be open expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-unicode_wpt_flags=h2-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-unicode_wpt_flags=h2-expected.txt deleted file mode 100644 index 5defd884..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-unicode_wpt_flags=h2-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL WebSockets: bufferedAmount for unicode data assert_unreached: close event should not fire Reached unreachable code -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/xhr/overridemimetype-blob-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/xhr/overridemimetype-blob-expected.txt deleted file mode 100644 index 4bc7736..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/external/wpt/xhr/overridemimetype-blob-expected.txt +++ /dev/null
@@ -1,86 +0,0 @@ -This is a testharness.js-based test. -Found 77 tests; 22 PASS, 55 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS Use text/xml as fallback MIME type -PASS Use text/xml as fallback MIME type, 2 -PASS Loading data… -FAIL 1) MIME types need to be parsed and serialized: text/html;charset=gbk assert_equals: expected "text/html;charset=gbk" but got "text/html" -FAIL 2) MIME types need to be parsed and serialized: TEXT/HTML;CHARSET=GBK assert_equals: expected "text/html;charset=GBK" but got "text/html" -FAIL 3) MIME types need to be parsed and serialized: text/html;charset=gbk( assert_equals: expected "text/html;charset=\"gbk(\"" but got "application/octet-stream" -FAIL 4) MIME types need to be parsed and serialized: text/html;x=(;charset=gbk assert_equals: expected "text/html;x=\"(\";charset=gbk" but got "application/octet-stream" -FAIL 5) MIME types need to be parsed and serialized: text/html;charset=gbk;charset=windows-1255 assert_equals: expected "text/html;charset=gbk" but got "text/html" -FAIL 6) MIME types need to be parsed and serialized: text/html;charset=();charset=GBK assert_equals: expected "text/html;charset=\"()\"" but got "application/octet-stream" -PASS 7) MIME types need to be parsed and serialized: text/html;charset =gbk -FAIL 8) MIME types need to be parsed and serialized: text/html ;charset=gbk assert_equals: expected "text/html;charset=gbk" but got "text/html" -FAIL 9) MIME types need to be parsed and serialized: text/html; charset=gbk assert_equals: expected "text/html;charset=gbk" but got "text/html" -FAIL 10) MIME types need to be parsed and serialized: text/html;charset= gbk assert_equals: expected "text/html;charset=\" gbk\"" but got "text/html" -FAIL 11) MIME types need to be parsed and serialized: text/html;charset= "gbk" assert_equals: expected "text/html;charset=\" \\\"gbk\\\"\"" but got "text/html" -FAIL 12) MIME types need to be parsed and serialized: text/html;charset=gbk assert_equals: expected "text/html" but got "application/octet-stream" -FAIL 13) MIME types need to be parsed and serialized: text/html;charset=gbk assert_equals: expected "text/html" but got "application/octet-stream" -FAIL 14) MIME types need to be parsed and serialized: text/html;charset=gbk assert_equals: expected "text/html" but got "application/octet-stream" -FAIL 15) MIME types need to be parsed and serialized: text/html;charset=gbk assert_equals: expected "text/html" but got "application/octet-stream" -FAIL 16) MIME types need to be parsed and serialized: text/html;charset='gbk' assert_equals: expected "text/html;charset='gbk'" but got "text/html" -FAIL 17) MIME types need to be parsed and serialized: text/html;charset='gbk assert_equals: expected "text/html;charset='gbk" but got "text/html" -FAIL 18) MIME types need to be parsed and serialized: text/html;charset=gbk' assert_equals: expected "text/html;charset=gbk'" but got "text/html" -FAIL 19) MIME types need to be parsed and serialized: text/html;charset=';charset=GBK assert_equals: expected "text/html;charset='" but got "text/html" -FAIL 20) MIME types need to be parsed and serialized: text/html;test;charset=gbk assert_equals: expected "text/html;charset=gbk" but got "application/octet-stream" -FAIL 21) MIME types need to be parsed and serialized: text/html;test=;charset=gbk assert_equals: expected "text/html;charset=gbk" but got "application/octet-stream" -FAIL 22) MIME types need to be parsed and serialized: text/html;';charset=gbk assert_equals: expected "text/html;charset=gbk" but got "application/octet-stream" -FAIL 23) MIME types need to be parsed and serialized: text/html;";charset=gbk assert_equals: expected "text/html;charset=gbk" but got "application/octet-stream" -FAIL 24) MIME types need to be parsed and serialized: text/html ; ; charset=gbk assert_equals: expected "text/html;charset=gbk" but got "application/octet-stream" -FAIL 25) MIME types need to be parsed and serialized: text/html;;;;charset=gbk assert_equals: expected "text/html;charset=gbk" but got "application/octet-stream" -FAIL 26) MIME types need to be parsed and serialized: text/html;charset= ";charset=GBK assert_equals: expected "text/html;charset=GBK" but got "application/octet-stream" -FAIL 27) MIME types need to be parsed and serialized: text/html;charset=";charset=foo";charset=GBK assert_equals: expected "text/html;charset=GBK" but got "text/html" -FAIL 28) MIME types need to be parsed and serialized: text/html;charset="gbk" assert_equals: expected "text/html;charset=gbk" but got "text/html" -FAIL 29) MIME types need to be parsed and serialized: text/html;charset="gbk assert_equals: expected "text/html;charset=gbk" but got "application/octet-stream" -FAIL 30) MIME types need to be parsed and serialized: text/html;charset=gbk" assert_equals: expected "text/html;charset=\"gbk\\\"\"" but got "application/octet-stream" -FAIL 31) MIME types need to be parsed and serialized: text/html;charset=" gbk" assert_equals: expected "text/html;charset=\" gbk\"" but got "text/html" -FAIL 32) MIME types need to be parsed and serialized: text/html;charset="gbk " assert_equals: expected "text/html;charset=\"gbk \"" but got "text/html" -FAIL 33) MIME types need to be parsed and serialized: text/html;charset="\ gbk" assert_equals: expected "text/html;charset=\" gbk\"" but got "text/html" -FAIL 34) MIME types need to be parsed and serialized: text/html;charset="\g\b\k" assert_equals: expected "text/html;charset=gbk" but got "text/html" -FAIL 35) MIME types need to be parsed and serialized: text/html;charset="gbk"x assert_equals: expected "text/html;charset=gbk" but got "application/octet-stream" -FAIL 36) MIME types need to be parsed and serialized: text/html;charset="";charset=GBK assert_equals: expected "text/html;charset=\"\"" but got "text/html" -FAIL 37) MIME types need to be parsed and serialized: text/html;charset=";charset=GBK assert_equals: expected "text/html;charset=\";charset=GBK\"" but got "application/octet-stream" -FAIL 38) MIME types need to be parsed and serialized: text/html;charset={gbk} assert_equals: expected "text/html;charset=\"{gbk}\"" but got "text/html" -FAIL 39) MIME types need to be parsed and serialized: text/html;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789=x;charset=gbk assert_equals: expected "text/html;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789=x;charset=gbk" but got "text/html" -PASS 40) MIME types need to be parsed and serialized: 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 -FAIL 41) MIME types need to be parsed and serialized: text/html;a]=bar;b[=bar;c=bar assert_equals: expected "text/html;c=bar" but got "application/octet-stream" -FAIL 42) MIME types need to be parsed and serialized: text/html;valid=";";foo=bar assert_equals: expected "text/html;valid=\";\";foo=bar" but got "text/html" -FAIL 43) MIME types need to be parsed and serialized: text/html;in]valid=";asd=foo";foo=bar assert_equals: expected "text/html;foo=bar" but got "application/octet-stream" -FAIL 44) MIME types need to be parsed and serialized: !#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz assert_equals: expected "!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz=!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" but got "!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz/!#$%&'*+-.^_`|~0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" -FAIL 45) MIME types need to be parsed and serialized: x/x;x=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" assert_equals: expected "x/x;x=\"\t !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"" but got "x/x" -FAIL 46) MIME types need to be parsed and serialized: x/x;test assert_equals: expected "x/x" but got "application/octet-stream" -FAIL 47) MIME types need to be parsed and serialized: x/x;test="\ assert_equals: expected "x/x;test=\"\\\\\"" but got "application/octet-stream" -FAIL 48) MIME types need to be parsed and serialized: x/x;x= assert_equals: expected "x/x" but got "application/octet-stream" -FAIL 49) MIME types need to be parsed and serialized: x/x;x= assert_equals: expected "x/x" but got "application/octet-stream" -FAIL 50) MIME types need to be parsed and serialized: x/x -\r ;x=x assert_equals: expected "x/x;x=x" but got "application/octet-stream" -FAIL 51) MIME types need to be parsed and serialized: -\r x/x;x=x -\r assert_equals: expected "x/x;x=x" but got "application/octet-stream" -FAIL 52) MIME types need to be parsed and serialized: x/x; -\r x=x -\r ;x=y assert_equals: expected "x/x;x=x" but got "application/octet-stream" -FAIL 53) MIME types need to be parsed and serialized: text/html;test=ÿ;charset=gbk assert_equals: expected "text/html;test=\"ÿ\";charset=gbk" but got "application/octet-stream" -FAIL 54) MIME types need to be parsed and serialized: x/x;test=�;x=x assert_equals: expected "x/x;x=x" but got "application/octet-stream" -PASS 55) MIME types need to be parsed and serialized: x/x -PASS 56) MIME types need to be parsed and serialized: x/x -PASS 57) MIME types need to be parsed and serialized: x/x -PASS 58) MIME types need to be parsed and serialized: x/x -PASS 59) MIME types need to be parsed and serialized: -PASS 60) MIME types need to be parsed and serialized: -PASS 61) MIME types need to be parsed and serialized: / -PASS 62) MIME types need to be parsed and serialized: bogus -PASS 63) MIME types need to be parsed and serialized: bogus/ -PASS 64) MIME types need to be parsed and serialized: bogus/ -PASS 65) MIME types need to be parsed and serialized: bogus/bogus/; -PASS 66) MIME types need to be parsed and serialized: </> -PASS 67) MIME types need to be parsed and serialized: (/) -PASS 68) MIME types need to be parsed and serialized: ÿ/ÿ -PASS 69) MIME types need to be parsed and serialized: text/html(;doesnot=matter -FAIL 70) MIME types need to be parsed and serialized: {/} assert_equals: expected "application/octet-stream" but got "{/}" -PASS 71) MIME types need to be parsed and serialized: Ā/Ā -FAIL 72) MIME types need to be parsed and serialized: text /html assert_equals: expected "application/octet-stream" but got "text /html" -FAIL 73) MIME types need to be parsed and serialized: text/ html assert_equals: expected "application/octet-stream" but got "text/ html" -PASS 74) MIME types need to be parsed and serialized: "text/html" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/css-intrinsic-dimensions/css-tables-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/fast/css-intrinsic-dimensions/css-tables-expected.txt deleted file mode 100644 index 2cb2b43..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/fast/css-intrinsic-dimensions/css-tables-expected.txt +++ /dev/null
@@ -1,28 +0,0 @@ - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/css-intrinsic-dimensions/tables-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/fast/css-intrinsic-dimensions/tables-expected.txt deleted file mode 100644 index 2cb2b43..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/fast/css-intrinsic-dimensions/tables-expected.txt +++ /dev/null
@@ -1,28 +0,0 @@ - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS - -PASS
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/events/mouseclick-target-and-positioning-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/fast/events/mouseclick-target-and-positioning-expected.txt deleted file mode 100644 index df48c5d..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/fast/events/mouseclick-target-and-positioning-expected.txt +++ /dev/null
@@ -1,15 +0,0 @@ -This page tests whether a click event propagates with the correct target and positioning. See rdar://problem/4477126. - -click inside the red box: -[] -PASS: event target should be [object HTMLSpanElement] and is -PASS: event.pageX should be 175 and is -PASS: event.pageY should be 105 and is -PASS: event.clientX should be 175 and is -PASS: event.clientY should be 105 and is -PASS: event.layerX should be 7 and is -PASS: event.layerY should be 5 and is -PASS: event.offsetX should be 7 and is -PASS: event.offsetY should be 5 and is -PASS: event.x should be 175 and is -PASS: event.y should be 105 and is
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/events/relative-offset-of-simulated-click-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/fast/events/relative-offset-of-simulated-click-expected.txt deleted file mode 100644 index 2a2c789..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/fast/events/relative-offset-of-simulated-click-expected.txt +++ /dev/null
@@ -1,17 +0,0 @@ -This test documents the behavior of MouseEvent.offsetX/Y in response to HTMLElement.click(). - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -Simulated click with .click(): -PASS event.offsetX is 0 -PASS event.offsetY is 0 -Click with mouse at 0,0: -PASS event.offsetX is 0 -PASS event.offsetY is 0 -Click with mouse at 40,50: -PASS event.offsetX is 40 -PASS event.offsetY is 50 -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/events/touch/gesture/gesture-dblclick-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/fast/events/touch/gesture/gesture-dblclick-expected.txt deleted file mode 100644 index 0386b1c..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/fast/events/touch/gesture/gesture-dblclick-expected.txt +++ /dev/null
@@ -1,48 +0,0 @@ -This tests gesture callbacks for a double tap sequence of gestures. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS successfullyParsed is true - -TEST COMPLETE - -PASS event.type is "mousemove" -PASS event.clientX is 10 -PASS event.clientY is 12 -PASS event.detail is 0 -PASS event.type is "mousedown" -PASS event.clientX is 10 -PASS event.clientY is 12 -PASS event.detail is 1 -PASS event.type is "mouseup" -PASS event.clientX is 10 -PASS event.clientY is 12 -PASS event.detail is 1 -PASS event.type is "click" -PASS event.clientX is 10 -PASS event.clientY is 12 -PASS event.detail is 1 -PASS event.type is "mousemove" -PASS event.clientX is 11 -PASS event.clientY is 12 -PASS event.detail is 0 -PASS event.type is "mousedown" -PASS event.clientX is 11 -PASS event.clientY is 12 -PASS event.detail is 2 -PASS event.type is "mouseup" -PASS event.clientX is 11 -PASS event.clientY is 12 -PASS event.detail is 2 -PASS event.type is "click" -PASS event.clientX is 11 -PASS event.clientY is 12 -PASS event.detail is 2 -PASS event.type is "dblclick" -PASS event.clientX is 11 -PASS event.clientY is 12 -PASS event.detail is 2 -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/select/option-mouseevents-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/select/option-mouseevents-expected.txt deleted file mode 100644 index 856cbaa3..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/select/option-mouseevents-expected.txt +++ /dev/null
@@ -1,94 +0,0 @@ -This page tests whether a click event on a list box item propagates with the correct target and positioning values. -Bug 3248: Mouse events on OPTION element seem to be ignored -https://bugs.webkit.org/show_bug.cgi?id=3248 - -One -Two -One -Two -One -Two -One -Two -One -Two -PASS: event type should be mousedown and is -PASS: event target should be [object HTMLOptionElement] and is -PASS: event.pageX should be 22 and is -PASS: event.pageY should be 104 and is -PASS: event.offsetX should be 13 and is -FAIL: event.offsetY should be 5 but instead is 2 -PASS: event.x should be 22 and is -PASS: event.y should be 104 and is -PASS: event type should be mousedown and is -PASS: event target should be [object HTMLOptionElement] and is -PASS: event.pageX should be 22 and is -PASS: event.pageY should be 104 and is -PASS: event.offsetX should be 13 and is -FAIL: event.offsetY should be 5 but instead is 2 -PASS: event.x should be 22 and is -PASS: event.y should be 104 and is -PASS: event type should be mouseup and is -PASS: event target should be [object HTMLOptionElement] and is -PASS: event.pageX should be 22 and is -PASS: event.pageY should be 184 and is -PASS: event.offsetX should be 13 and is -FAIL: event.offsetY should be 5 but instead is 2 -PASS: event.x should be 22 and is -PASS: event.y should be 184 and is -PASS: event type should be mouseup and is -PASS: event target should be [object HTMLOptionElement] and is -PASS: event.pageX should be 22 and is -PASS: event.pageY should be 184 and is -PASS: event.offsetX should be 13 and is -FAIL: event.offsetY should be 5 but instead is 2 -PASS: event.x should be 22 and is -PASS: event.y should be 184 and is -PASS: event type should be click and is -PASS: event target should be [object HTMLOptionElement] and is -PASS: event.pageX should be 22 and is -PASS: event.pageY should be 262 and is -PASS: event.offsetX should be 13 and is -FAIL: event.offsetY should be 4.8125 but instead is 2 -PASS: event.x should be 22 and is -PASS: event.y should be 262 and is -PASS: event type should be click and is -PASS: event target should be [object HTMLOptionElement] and is -PASS: event.pageX should be 22 and is -PASS: event.pageY should be 262 and is -PASS: event.offsetX should be 13 and is -FAIL: event.offsetY should be 4.8125 but instead is 2 -PASS: event.x should be 22 and is -PASS: event.y should be 262 and is -PASS: event type should be dblclick and is -PASS: event target should be [object HTMLOptionElement] and is -PASS: event.pageX should be 22 and is -PASS: event.pageY should be 344 and is -PASS: event.offsetX should be 13 and is -FAIL: event.offsetY should be 5 but instead is 2 -PASS: event.x should be 22 and is -PASS: event.y should be 344 and is -PASS: event type should be dblclick and is -PASS: event target should be [object HTMLOptionElement] and is -PASS: event.pageX should be 22 and is -PASS: event.pageY should be 344 and is -PASS: event.offsetX should be 13 and is -FAIL: event.offsetY should be 5 but instead is 2 -PASS: event.x should be 22 and is -PASS: event.y should be 344 and is -PASS: event type should be mousedown and is -PASS: event target should be [object HTMLSelectElement] and is -PASS: event.pageX should be 22 and is -PASS: event.pageY should be 448 and is -PASS: event.offsetX should be 13 and is -PASS: event.offsetY should be 39 and is -PASS: event.x should be 22 and is -PASS: event.y should be 448 and is -PASS: event type should be mousedown and is -PASS: event target should be [object HTMLSelectElement] and is -PASS: event.pageX should be 22 and is -PASS: event.pageY should be 448 and is -PASS: event.offsetX should be 13 and is -PASS: event.offsetY should be 39 and is -PASS: event.x should be 22 and is -PASS: event.y should be 448 and is
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/hidpi/broken-image-icon-hidpi-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/hidpi/broken-image-icon-hidpi-expected.png deleted file mode 100644 index c8b8dc3..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/fast/hidpi/broken-image-icon-hidpi-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/hidpi/broken-image-with-size-hidpi-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/hidpi/broken-image-with-size-hidpi-expected.png deleted file mode 100644 index dbffbc9..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/fast/hidpi/broken-image-with-size-hidpi-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/hidpi/scrollbar-appearance-increase-device-scale-factor-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/hidpi/scrollbar-appearance-increase-device-scale-factor-expected.png deleted file mode 100644 index 8e102988..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/fast/hidpi/scrollbar-appearance-increase-device-scale-factor-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/http/tests/webfont/popup-menu-load-webfont-after-open-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/http/tests/webfont/popup-menu-load-webfont-after-open-expected.png deleted file mode 100644 index 52202653..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/http/tests/webfont/popup-menu-load-webfont-after-open-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/svg/custom/svg-fonts-in-text-controls-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/svg/custom/svg-fonts-in-text-controls-expected.txt deleted file mode 100644 index 47770ba..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/svg/custom/svg-fonts-in-text-controls-expected.txt +++ /dev/null
@@ -1,10 +0,0 @@ -This tests that the width of textareas and inputs is correctly calculated based on the metrics of the SVG font. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -PASS successfullyParsed is true - -TEST COMPLETE - -Textarea offsetWidth: 137 -Input offsetWidth: 138
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/fenced-frame/global-commands-fenced-frame.https.js b/third_party/blink/web_tests/http/tests/inspector-protocol/fenced-frame/global-commands-fenced-frame.https.js new file mode 100644 index 0000000..f3992aa --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/fenced-frame/global-commands-fenced-frame.https.js
@@ -0,0 +1,29 @@ +(async function (testRunner) { + const { session, dp } = await testRunner.startURL('resources/page-with-fenced-frame.php', + 'Tests that global commands such as captureSnapshot, captureScreenshot, or getAppManifest'+ + 'returns an error with Fenced Frame target'); + await dp.Page.enable(); + + dp.Target.setAutoAttach({ autoAttach: true, waitForDebuggerOnStart: false, flatten: true }); + let { sessionId } = (await dp.Target.onceAttachedToTarget()).params; + + let childSession = session.createChild(sessionId); + let ffdp = childSession.protocol; + + // Wait for FF to finish loading. + await ffdp.Page.enable(); + ffdp.Page.setLifecycleEventsEnabled({ enabled: true }); + await ffdp.Page.onceLifecycleEvent(event => event.params.name === 'load'); + + async function checkCommand(method, params) { + const result = await childSession.sendCommand(method, params); + + testRunner.log(`${method}: ` + (result.error ? result.error.message : 'FAIL: no error')); + } + + await checkCommand('Page.captureSnapshot', {}); + await checkCommand('Page.captureScreenshot', {}); + await checkCommand('Page.getAppManifest', {}); + + testRunner.completeTest(); +});
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/resources/origintrials.js b/third_party/blink/web_tests/http/tests/origin_trials/resources/origintrials.js index af21cb23..11f12a22 100644 --- a/third_party/blink/web_tests/http/tests/origin_trials/resources/origintrials.js +++ b/third_party/blink/web_tests/http/tests/origin_trials/resources/origintrials.js
@@ -149,14 +149,9 @@ expect_css_media_fails = (feature_name) => { let media_feature_string = make_css_media_feature_string(feature_name); assert_false(window.matchMedia(media_feature_string).matches); + assert_false(window.matchMedia(`not (${media_feature_string})`).matches); assert_equals(getComputedStyle(document.documentElement).opacity, "1"); - - let media_list = document.styleSheets[0].media; - media_list.appendMedium(media_feature_string); - assert_true(media_list.mediaText.indexOf("not all") !== -1); - media_list.mediaText = media_feature_string; - assert_true(media_list.mediaText.indexOf("not all") !== -1); } // These tests verify that any gated parts of the API are not available.
diff --git a/third_party/blink/web_tests/inspector-protocol/css/css-get-styles-for-document-transition.js b/third_party/blink/web_tests/inspector-protocol/css/css-get-styles-for-document-transition.js new file mode 100644 index 0000000..55b76f6 --- /dev/null +++ b/third_party/blink/web_tests/inspector-protocol/css/css-get-styles-for-document-transition.js
@@ -0,0 +1,32 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startHTML(` + <style> ::page-transition-incoming-image(shared) {animation-duration: 300s;} </style> + <style> ::page-transition-outgoing-image(*) {background: red;} </style> + <div style='width:100px; height:100px; page-transition-tag: shared; contain:paint;'></div>`, + 'The test verifies functionality of querying style information for document-transition pseudo elements'); + + await session.evaluateAsync(` + new Promise(resolve => { + document.createDocumentTransition().start(resolve); + }); + `); + + const response = await dp.DOM.getDocument(); + const rootNode = response.result.root.children[0]; + + await dp.CSS.enable(); + const CSSHelper = await testRunner.loadScript('../resources/css-helper.js'); + const cssHelper = new CSSHelper(testRunner, dp); + + // The root node styles should include styles for each pseudo element. + const rootNodeStyles = await dp.CSS.getMatchedStylesForNode({'nodeId': rootNode.nodeId}); + testRunner.log(rootNodeStyles); + + for (const node of rootNode.pseudoElements) { + const styles = await dp.CSS.getMatchedStylesForNode({'nodeId': node.nodeId}); + testRunner.log(styles, "Dumping styles for : " + node.localName); + } + + testRunner.completeTest(); +}); +
diff --git a/third_party/blink/web_tests/inspector-protocol/css/resources/media-queries.css b/third_party/blink/web_tests/inspector-protocol/css/resources/media-queries.css index 6f1ad86d..774909c 100644 --- a/third_party/blink/web_tests/inspector-protocol/css/resources/media-queries.css +++ b/third_party/blink/web_tests/inspector-protocol/css/resources/media-queries.css
@@ -27,5 +27,5 @@ } } -@media () { +@media (]) { }
diff --git a/third_party/blink/web_tests/platform/fuchsia/http/tests/security/no-javascript-refresh-expected.txt b/third_party/blink/web_tests/platform/fuchsia/http/tests/security/no-javascript-refresh-expected.txt deleted file mode 100644 index 1f91ce1..0000000 --- a/third_party/blink/web_tests/platform/fuchsia/http/tests/security/no-javascript-refresh-expected.txt +++ /dev/null
@@ -1,2 +0,0 @@ -CONSOLE ERROR: Refused to refresh http://127.0.0.1:8000/security/no-javascript-refresh.php to a javascript: URL -This it the content that appears in place of a refresh.
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/css/css-cascade/all-prop-revert-layer-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/css/css-cascade/all-prop-revert-layer-expected.txt deleted file mode 100644 index 4087ac8..0000000 --- a/third_party/blink/web_tests/platform/generic/external/wpt/css/css-cascade/all-prop-revert-layer-expected.txt +++ /dev/null
@@ -1,315 +0,0 @@ -This is a testharness.js-based test. -Found 311 tests; 304 PASS, 7 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS accent-color -PASS align-content -PASS align-items -PASS align-self -PASS alignment-baseline -PASS animation-delay -PASS animation-direction -PASS animation-duration -PASS animation-fill-mode -PASS animation-iteration-count -PASS animation-name -PASS animation-play-state -PASS animation-timeline -PASS animation-timing-function -PASS app-region -PASS appearance -PASS backdrop-filter -PASS backface-visibility -PASS background-attachment -PASS background-blend-mode -PASS background-clip -PASS background-color -PASS background-image -PASS background-origin -PASS background-position -PASS background-repeat -PASS background-size -PASS baseline-shift -PASS block-size -PASS border-block-end-color -PASS border-block-end-style -PASS border-block-end-width -PASS border-block-start-color -PASS border-block-start-style -PASS border-block-start-width -PASS border-bottom-color -PASS border-bottom-left-radius -PASS border-bottom-right-radius -PASS border-bottom-style -PASS border-bottom-width -PASS border-collapse -PASS border-end-end-radius -PASS border-end-start-radius -FAIL border-image-outset assert_equals: Layer 3 should rollback to layer 2. expected "123" but got "0" -FAIL border-image-repeat assert_equals: Layer 3 should rollback to layer 2. expected "round" but got "stretch" -FAIL border-image-slice assert_equals: Layer 3 should rollback to layer 2. expected "123" but got "100%" -FAIL border-image-source assert_equals: Layer 3 should rollback to layer 2. expected "url(\"http://web-platform.test:8001/css/css-cascade/all-prop-revert-layer.html#ref\")" but got "none" -FAIL border-image-width assert_equals: Layer 3 should rollback to layer 2. expected "123px" but got "1" -PASS border-inline-end-color -PASS border-inline-end-style -PASS border-inline-end-width -PASS border-inline-start-color -PASS border-inline-start-style -PASS border-inline-start-width -PASS border-left-color -PASS border-left-style -PASS border-left-width -PASS border-right-color -PASS border-right-style -PASS border-right-width -PASS border-start-end-radius -PASS border-start-start-radius -PASS border-top-color -PASS border-top-left-radius -PASS border-top-right-radius -PASS border-top-style -PASS border-top-width -PASS bottom -PASS box-shadow -PASS box-sizing -PASS break-after -PASS break-before -PASS break-inside -PASS buffered-rendering -PASS caption-side -PASS caret-color -PASS clear -PASS clip -PASS clip-path -PASS clip-rule -PASS color -PASS color-interpolation -PASS color-interpolation-filters -PASS color-rendering -PASS column-count -PASS column-gap -PASS column-rule-color -PASS column-rule-style -PASS column-rule-width -PASS column-span -PASS column-width -PASS contain-intrinsic-block-size -PASS contain-intrinsic-height -PASS contain-intrinsic-inline-size -PASS contain-intrinsic-size -PASS contain-intrinsic-width -PASS container-name -PASS container-type -PASS content -PASS cursor -PASS cx -PASS cy -PASS d -PASS direction -PASS display -PASS dominant-baseline -PASS empty-cells -PASS fill -PASS fill-opacity -PASS fill-rule -PASS filter -PASS flex-basis -PASS flex-direction -PASS flex-grow -PASS flex-shrink -PASS flex-wrap -PASS float -PASS flood-color -PASS flood-opacity -PASS font-family -PASS font-kerning -PASS font-optical-sizing -PASS font-palette -PASS font-size -PASS font-size-adjust -PASS font-stretch -PASS font-style -PASS font-synthesis-small-caps -PASS font-synthesis-style -PASS font-synthesis-weight -PASS font-variant -PASS font-variant-caps -PASS font-variant-east-asian -PASS font-variant-ligatures -PASS font-variant-numeric -PASS font-weight -PASS grid-auto-columns -PASS grid-auto-flow -PASS grid-auto-rows -PASS grid-column-end -PASS grid-column-start -PASS grid-row-end -PASS grid-row-start -PASS grid-template-areas -PASS grid-template-columns -PASS grid-template-rows -PASS height -PASS hyphens -PASS image-orientation -PASS image-rendering -PASS inline-size -PASS inset-block-end -PASS inset-block-start -PASS inset-inline-end -PASS inset-inline-start -PASS isolation -PASS justify-content -PASS justify-items -PASS justify-self -PASS left -PASS letter-spacing -PASS lighting-color -PASS line-break -PASS line-height -PASS line-height-step -PASS list-style-image -PASS list-style-position -PASS list-style-type -PASS margin-block-end -PASS margin-block-start -PASS margin-bottom -PASS margin-inline-end -PASS margin-inline-start -PASS margin-left -PASS margin-right -PASS margin-top -PASS marker-end -PASS marker-mid -PASS marker-start -PASS mask-type -PASS math-depth -PASS math-shift -PASS math-style -PASS max-block-size -PASS max-height -PASS max-inline-size -PASS max-width -PASS min-block-size -PASS min-height -PASS min-inline-size -PASS min-width -PASS mix-blend-mode -PASS object-fit -PASS object-position -PASS object-view-box -PASS offset-anchor -PASS offset-distance -PASS offset-path -PASS offset-position -PASS offset-rotate -PASS opacity -PASS order -PASS orphans -PASS outline-color -PASS outline-offset -PASS outline-style -PASS outline-width -PASS overflow-anchor -PASS overflow-block -PASS overflow-clip-margin -PASS overflow-inline -PASS overflow-wrap -PASS overflow-x -PASS overflow-y -PASS overscroll-behavior-block -PASS overscroll-behavior-inline -PASS padding-block-end -PASS padding-block-start -PASS padding-bottom -PASS padding-inline-end -PASS padding-inline-start -PASS padding-left -PASS padding-right -PASS padding-top -PASS paint-order -PASS perspective -FAIL perspective-origin assert_equals: Layer 3 should rollback to layer 2. expected "123px 0px" but got "0px 0px" -PASS pointer-events -PASS position -PASS r -PASS resize -PASS right -PASS rotate -PASS row-gap -PASS ruby-position -PASS rx -PASS ry -PASS scale -PASS scroll-behavior -PASS scroll-margin-block-end -PASS scroll-margin-block-start -PASS scroll-margin-inline-end -PASS scroll-margin-inline-start -PASS scroll-padding-block-end -PASS scroll-padding-block-start -PASS scroll-padding-inline-end -PASS scroll-padding-inline-start -PASS scrollbar-gutter -PASS scrollbar-width -PASS shape-image-threshold -PASS shape-margin -PASS shape-outside -PASS shape-rendering -PASS speak -PASS stop-color -PASS stop-opacity -PASS stroke -PASS stroke-dasharray -PASS stroke-dashoffset -PASS stroke-linecap -PASS stroke-linejoin -PASS stroke-miterlimit -PASS stroke-opacity -PASS stroke-width -PASS tab-size -PASS table-layout -PASS text-align -PASS text-align-last -PASS text-anchor -PASS text-decoration -PASS text-decoration-color -PASS text-decoration-line -PASS text-decoration-skip-ink -PASS text-decoration-style -PASS text-emphasis-color -PASS text-emphasis-position -PASS text-emphasis-style -PASS text-indent -PASS text-justify -PASS text-overflow -PASS text-rendering -PASS text-shadow -PASS text-size-adjust -PASS text-transform -PASS text-underline-position -PASS top -PASS touch-action -PASS transform -FAIL transform-origin assert_equals: Layer 3 should rollback to layer 2. expected "123px 123px 123px" but got "0px 0px" -PASS transform-style -PASS transition-delay -PASS transition-duration -PASS transition-property -PASS transition-timing-function -PASS translate -PASS unicode-bidi -PASS user-select -PASS vector-effect -PASS vertical-align -PASS visibility -PASS white-space -PASS widows -PASS width -PASS will-change -PASS word-break -PASS word-spacing -PASS writing-mode -PASS x -PASS y -PASS z-index -PASS zoom -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/css/mediaqueries/navigation-controls.tentative-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/css/mediaqueries/navigation-controls.tentative-expected.txt index f6d43be..6490d3b 100644 --- a/third_party/blink/web_tests/platform/generic/external/wpt/css/mediaqueries/navigation-controls.tentative-expected.txt +++ b/third_party/blink/web_tests/platform/generic/external/wpt/css/mediaqueries/navigation-controls.tentative-expected.txt
@@ -1,14 +1,9 @@ This is a testharness.js-based test. -FAIL Should be parseable in a CSS stylesheet: '(navigation-controls)' assert_true: expected true got false -FAIL Should be parseable in a CSS stylesheet: '(navigation-controls: none)' assert_true: expected true got false -FAIL Should be parseable in a CSS stylesheet: '(navigation-controls: back-button)' assert_true: expected true got false -PASS Should not be parseable in a CSS stylesheet: '(navigation-controls: none back-button)' -PASS Should not be parseable in a CSS stylesheet: '(navigation-controls: back-button/none)' -FAIL Should be parseable in JS: '(navigation-controls)' assert_true: expected true got false -FAIL Should be parseable in JS: '(navigation-controls: none)' assert_true: expected true got false -FAIL Should be parseable in JS: '(navigation-controls: back-button)' assert_true: expected true got false -PASS Should not be parseable in JS: '(navigation-controls: none back-button)' -PASS Should not be parseable in JS: '(navigation-controls: back-button/none)' +FAIL Should be known: '(navigation-controls)' assert_true: expected true got false +FAIL Should be known: '(navigation-controls: none)' assert_true: expected true got false +FAIL Should be known: '(navigation-controls: back-button)' assert_true: expected true got false +PASS Should be unknown: '(navigation-controls: none back-button)' +PASS Should be unknown: '(navigation-controls: back-button/none)' FAIL Check that none evaluates to false in the boolean context assert_equals: expected true but got false Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/css/mediaqueries/test_media_queries-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/css/mediaqueries/test_media_queries-expected.txt index ad63152..fe8d9a3d 100644 --- a/third_party/blink/web_tests/platform/generic/external/wpt/css/mediaqueries/test_media_queries-expected.txt +++ b/third_party/blink/web_tests/platform/generic/external/wpt/css/mediaqueries/test_media_queries-expected.txt
@@ -1,421 +1,570 @@ This is a testharness.js-based test. -Found 839 tests; 598 PASS, 241 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 1053 tests; 1027 PASS, 26 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS query_should_be_parseable: (orientation) -FAIL query_should_be_parseable: not (orientation) assert_true: expected true got false +PASS query_should_be_parseable: not (orientation) +PASS expression_should_be_known: (orientation) +PASS expression_should_be_known: not (orientation) PASS query_should_not_be_parseable: only (orientation) PASS query_should_be_parseable: all and (orientation) PASS query_should_be_parseable: not all and (orientation) PASS query_should_be_parseable: only all and (orientation) PASS query_should_not_be_parseable: not not (orientation) PASS query_should_be_parseable: (orientation) and (orientation) -FAIL query_should_be_parseable: (orientation) or (orientation) assert_true: expected true got false -FAIL query_should_be_parseable: (orientation) or ((orientation) and ((orientation) or (orientation) or (not (orientation)))) assert_true: expected true got false +PASS query_should_be_parseable: (orientation) or (orientation) +PASS query_should_be_parseable: (orientation) or ((orientation) and ((orientation) or (orientation) or (not (orientation)))) +PASS expression_should_be_known: (orientation) and (orientation) +PASS expression_should_be_known: (orientation) or (orientation) +PASS expression_should_be_known: (orientation) or ((orientation) and ((orientation) or (orientation) or (not (orientation)))) PASS query_should_not_be_parseable: all and (orientation) or (orientation) PASS query_should_be_parseable: all and (orientation) and (orientation) PASS query_should_not_be_parseable: (orientation) and (orientation) or (orientation) PASS query_should_not_be_parseable: (orientation) and not (orientation) -PASS expression_should_be_parseable: width -PASS expression_should_not_be_parseable: min-width -PASS expression_should_not_be_parseable: max-width -PASS expression_should_be_parseable: width : 0 -PASS expression_should_be_parseable: width : 0px -PASS expression_should_be_parseable: width : 0em -PASS expression_should_be_parseable: width : -0 -PASS expression_should_be_parseable: width : -0cm -PASS expression_should_be_parseable: width : 1px -PASS expression_should_be_parseable: width : 0.001mm -PASS expression_should_be_parseable: width : 100000px -PASS expression_should_be_parseable: min-width : -0 -PASS expression_should_be_parseable: max-width : -0 -PASS expression_should_not_be_parseable: width : -1px -PASS expression_should_not_be_parseable: min-width : -1px -PASS expression_should_not_be_parseable: max-width : -1px -PASS expression_should_not_be_parseable: width : -0.00001mm -PASS expression_should_not_be_parseable: width : -100000em -FAIL expression_should_be_parseable: width > 0 assert_true: expected true got false -FAIL expression_should_be_parseable: width > 0px assert_true: expected true got false -FAIL expression_should_be_parseable: width > 0em assert_true: expected true got false -FAIL expression_should_be_parseable: width > -0 assert_true: expected true got false -FAIL expression_should_be_parseable: width > -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: width > 1px assert_true: expected true got false -FAIL expression_should_be_parseable: width > 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: width > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-width > -0 -PASS expression_should_not_be_parseable: max-width > -0 -FAIL expression_should_be_parseable: 0px > width > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: width > -1px -PASS expression_should_not_be_parseable: min-width > -1px -PASS expression_should_not_be_parseable: max-width > -1px -PASS expression_should_not_be_parseable: width > -0.00001mm -PASS expression_should_not_be_parseable: width > -100000em -FAIL expression_should_be_parseable: width >= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: width >= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: width >= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: width >= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: width >= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: width >= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: width >= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: width >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-width >= -0 -PASS expression_should_not_be_parseable: max-width >= -0 -FAIL expression_should_be_parseable: 0px >= width >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: width > = 0px -PASS expression_should_not_be_parseable: width >= -1px -PASS expression_should_not_be_parseable: min-width >= -1px -PASS expression_should_not_be_parseable: max-width >= -1px -PASS expression_should_not_be_parseable: width >= -0.00001mm -PASS expression_should_not_be_parseable: width >= -100000em -FAIL expression_should_be_parseable: width = 0 assert_true: expected true got false -FAIL expression_should_be_parseable: width = 0px assert_true: expected true got false -FAIL expression_should_be_parseable: width = 0em assert_true: expected true got false -FAIL expression_should_be_parseable: width = -0 assert_true: expected true got false -FAIL expression_should_be_parseable: width = -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: width = 1px assert_true: expected true got false -FAIL expression_should_be_parseable: width = 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: width = 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-width = -0 -PASS expression_should_not_be_parseable: max-width = -0 -PASS expression_should_not_be_parseable: 0px = width = 100000px -PASS expression_should_not_be_parseable: width = -1px -PASS expression_should_not_be_parseable: min-width = -1px -PASS expression_should_not_be_parseable: max-width = -1px -PASS expression_should_not_be_parseable: width = -0.00001mm -PASS expression_should_not_be_parseable: width = -100000em -FAIL expression_should_be_parseable: width <= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: width <= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: width <= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: width <= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: width <= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: width <= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: width <= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: width <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-width <= -0 -PASS expression_should_not_be_parseable: max-width <= -0 -FAIL expression_should_be_parseable: 0px <= width <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: width < = 0px -PASS expression_should_not_be_parseable: width <= -1px -PASS expression_should_not_be_parseable: min-width <= -1px -PASS expression_should_not_be_parseable: max-width <= -1px -PASS expression_should_not_be_parseable: width <= -0.00001mm -PASS expression_should_not_be_parseable: width <= -100000em -FAIL expression_should_be_parseable: width < 0 assert_true: expected true got false -FAIL expression_should_be_parseable: width < 0px assert_true: expected true got false -FAIL expression_should_be_parseable: width < 0em assert_true: expected true got false -FAIL expression_should_be_parseable: width < -0 assert_true: expected true got false -FAIL expression_should_be_parseable: width < -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: width < 1px assert_true: expected true got false -FAIL expression_should_be_parseable: width < 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: width < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-width < -0 -PASS expression_should_not_be_parseable: max-width < -0 -FAIL expression_should_be_parseable: 0px < width < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: width < -1px -PASS expression_should_not_be_parseable: min-width < -1px -PASS expression_should_not_be_parseable: max-width < -1px -PASS expression_should_not_be_parseable: width < -0.00001mm -PASS expression_should_not_be_parseable: width < -100000em -PASS expression_should_be_parseable: height -PASS expression_should_not_be_parseable: min-height -PASS expression_should_not_be_parseable: max-height -PASS expression_should_be_parseable: height : 0 -PASS expression_should_be_parseable: height : 0px -PASS expression_should_be_parseable: height : 0em -PASS expression_should_be_parseable: height : -0 -PASS expression_should_be_parseable: height : -0cm -PASS expression_should_be_parseable: height : 1px -PASS expression_should_be_parseable: height : 0.001mm -PASS expression_should_be_parseable: height : 100000px -PASS expression_should_be_parseable: min-height : -0 -PASS expression_should_be_parseable: max-height : -0 -PASS expression_should_not_be_parseable: height : -1px -PASS expression_should_not_be_parseable: min-height : -1px -PASS expression_should_not_be_parseable: max-height : -1px -PASS expression_should_not_be_parseable: height : -0.00001mm -PASS expression_should_not_be_parseable: height : -100000em -FAIL expression_should_be_parseable: height > 0 assert_true: expected true got false -FAIL expression_should_be_parseable: height > 0px assert_true: expected true got false -FAIL expression_should_be_parseable: height > 0em assert_true: expected true got false -FAIL expression_should_be_parseable: height > -0 assert_true: expected true got false -FAIL expression_should_be_parseable: height > -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: height > 1px assert_true: expected true got false -FAIL expression_should_be_parseable: height > 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: height > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-height > -0 -PASS expression_should_not_be_parseable: max-height > -0 -FAIL expression_should_be_parseable: 0px > height > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: height > -1px -PASS expression_should_not_be_parseable: min-height > -1px -PASS expression_should_not_be_parseable: max-height > -1px -PASS expression_should_not_be_parseable: height > -0.00001mm -PASS expression_should_not_be_parseable: height > -100000em -FAIL expression_should_be_parseable: height >= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: height >= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: height >= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: height >= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: height >= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: height >= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: height >= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: height >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-height >= -0 -PASS expression_should_not_be_parseable: max-height >= -0 -FAIL expression_should_be_parseable: 0px >= height >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: height > = 0px -PASS expression_should_not_be_parseable: height >= -1px -PASS expression_should_not_be_parseable: min-height >= -1px -PASS expression_should_not_be_parseable: max-height >= -1px -PASS expression_should_not_be_parseable: height >= -0.00001mm -PASS expression_should_not_be_parseable: height >= -100000em -FAIL expression_should_be_parseable: height = 0 assert_true: expected true got false -FAIL expression_should_be_parseable: height = 0px assert_true: expected true got false -FAIL expression_should_be_parseable: height = 0em assert_true: expected true got false -FAIL expression_should_be_parseable: height = -0 assert_true: expected true got false -FAIL expression_should_be_parseable: height = -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: height = 1px assert_true: expected true got false -FAIL expression_should_be_parseable: height = 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: height = 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-height = -0 -PASS expression_should_not_be_parseable: max-height = -0 -PASS expression_should_not_be_parseable: 0px = height = 100000px -PASS expression_should_not_be_parseable: height = -1px -PASS expression_should_not_be_parseable: min-height = -1px -PASS expression_should_not_be_parseable: max-height = -1px -PASS expression_should_not_be_parseable: height = -0.00001mm -PASS expression_should_not_be_parseable: height = -100000em -FAIL expression_should_be_parseable: height <= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: height <= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: height <= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: height <= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: height <= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: height <= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: height <= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: height <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-height <= -0 -PASS expression_should_not_be_parseable: max-height <= -0 -FAIL expression_should_be_parseable: 0px <= height <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: height < = 0px -PASS expression_should_not_be_parseable: height <= -1px -PASS expression_should_not_be_parseable: min-height <= -1px -PASS expression_should_not_be_parseable: max-height <= -1px -PASS expression_should_not_be_parseable: height <= -0.00001mm -PASS expression_should_not_be_parseable: height <= -100000em -FAIL expression_should_be_parseable: height < 0 assert_true: expected true got false -FAIL expression_should_be_parseable: height < 0px assert_true: expected true got false -FAIL expression_should_be_parseable: height < 0em assert_true: expected true got false -FAIL expression_should_be_parseable: height < -0 assert_true: expected true got false -FAIL expression_should_be_parseable: height < -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: height < 1px assert_true: expected true got false -FAIL expression_should_be_parseable: height < 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: height < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-height < -0 -PASS expression_should_not_be_parseable: max-height < -0 -FAIL expression_should_be_parseable: 0px < height < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: height < -1px -PASS expression_should_not_be_parseable: min-height < -1px -PASS expression_should_not_be_parseable: max-height < -1px -PASS expression_should_not_be_parseable: height < -0.00001mm -PASS expression_should_not_be_parseable: height < -100000em -PASS expression_should_be_parseable: device-width -PASS expression_should_not_be_parseable: min-device-width -PASS expression_should_not_be_parseable: max-device-width -PASS expression_should_be_parseable: device-width : 0 -PASS expression_should_be_parseable: device-width : 0px -PASS expression_should_be_parseable: device-width : 0em -PASS expression_should_be_parseable: device-width : -0 -PASS expression_should_be_parseable: device-width : -0cm -PASS expression_should_be_parseable: device-width : 1px -PASS expression_should_be_parseable: device-width : 0.001mm -PASS expression_should_be_parseable: device-width : 100000px -PASS expression_should_be_parseable: min-device-width : -0 -PASS expression_should_be_parseable: max-device-width : -0 -PASS expression_should_not_be_parseable: device-width : -1px -PASS expression_should_not_be_parseable: min-device-width : -1px -PASS expression_should_not_be_parseable: max-device-width : -1px -PASS expression_should_not_be_parseable: device-width : -0.00001mm -PASS expression_should_not_be_parseable: device-width : -100000em -FAIL expression_should_be_parseable: device-width > 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-width > -0 -PASS expression_should_not_be_parseable: max-device-width > -0 -FAIL expression_should_be_parseable: 0px > device-width > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-width > -1px -PASS expression_should_not_be_parseable: min-device-width > -1px -PASS expression_should_not_be_parseable: max-device-width > -1px -PASS expression_should_not_be_parseable: device-width > -0.00001mm -PASS expression_should_not_be_parseable: device-width > -100000em -FAIL expression_should_be_parseable: device-width >= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-width >= -0 -PASS expression_should_not_be_parseable: max-device-width >= -0 -FAIL expression_should_be_parseable: 0px >= device-width >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-width > = 0px -PASS expression_should_not_be_parseable: device-width >= -1px -PASS expression_should_not_be_parseable: min-device-width >= -1px -PASS expression_should_not_be_parseable: max-device-width >= -1px -PASS expression_should_not_be_parseable: device-width >= -0.00001mm -PASS expression_should_not_be_parseable: device-width >= -100000em -FAIL expression_should_be_parseable: device-width = 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width = 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-width = -0 -PASS expression_should_not_be_parseable: max-device-width = -0 -PASS expression_should_not_be_parseable: 0px = device-width = 100000px -PASS expression_should_not_be_parseable: device-width = -1px -PASS expression_should_not_be_parseable: min-device-width = -1px -PASS expression_should_not_be_parseable: max-device-width = -1px -PASS expression_should_not_be_parseable: device-width = -0.00001mm -PASS expression_should_not_be_parseable: device-width = -100000em -FAIL expression_should_be_parseable: device-width <= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-width <= -0 -PASS expression_should_not_be_parseable: max-device-width <= -0 -FAIL expression_should_be_parseable: 0px <= device-width <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-width < = 0px -PASS expression_should_not_be_parseable: device-width <= -1px -PASS expression_should_not_be_parseable: min-device-width <= -1px -PASS expression_should_not_be_parseable: max-device-width <= -1px -PASS expression_should_not_be_parseable: device-width <= -0.00001mm -PASS expression_should_not_be_parseable: device-width <= -100000em -FAIL expression_should_be_parseable: device-width < 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-width < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-width < -0 -PASS expression_should_not_be_parseable: max-device-width < -0 -FAIL expression_should_be_parseable: 0px < device-width < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-width < -1px -PASS expression_should_not_be_parseable: min-device-width < -1px -PASS expression_should_not_be_parseable: max-device-width < -1px -PASS expression_should_not_be_parseable: device-width < -0.00001mm -PASS expression_should_not_be_parseable: device-width < -100000em -PASS expression_should_be_parseable: device-height -PASS expression_should_not_be_parseable: min-device-height -PASS expression_should_not_be_parseable: max-device-height -PASS expression_should_be_parseable: device-height : 0 -PASS expression_should_be_parseable: device-height : 0px -PASS expression_should_be_parseable: device-height : 0em -PASS expression_should_be_parseable: device-height : -0 -PASS expression_should_be_parseable: device-height : -0cm -PASS expression_should_be_parseable: device-height : 1px -PASS expression_should_be_parseable: device-height : 0.001mm -PASS expression_should_be_parseable: device-height : 100000px -PASS expression_should_be_parseable: min-device-height : -0 -PASS expression_should_be_parseable: max-device-height : -0 -PASS expression_should_not_be_parseable: device-height : -1px -PASS expression_should_not_be_parseable: min-device-height : -1px -PASS expression_should_not_be_parseable: max-device-height : -1px -PASS expression_should_not_be_parseable: device-height : -0.00001mm -PASS expression_should_not_be_parseable: device-height : -100000em -FAIL expression_should_be_parseable: device-height > 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-height > -0 -PASS expression_should_not_be_parseable: max-device-height > -0 -FAIL expression_should_be_parseable: 0px > device-height > 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-height > -1px -PASS expression_should_not_be_parseable: min-device-height > -1px -PASS expression_should_not_be_parseable: max-device-height > -1px -PASS expression_should_not_be_parseable: device-height > -0.00001mm -PASS expression_should_not_be_parseable: device-height > -100000em -FAIL expression_should_be_parseable: device-height >= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-height >= -0 -PASS expression_should_not_be_parseable: max-device-height >= -0 -FAIL expression_should_be_parseable: 0px >= device-height >= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-height > = 0px -PASS expression_should_not_be_parseable: device-height >= -1px -PASS expression_should_not_be_parseable: min-device-height >= -1px -PASS expression_should_not_be_parseable: max-device-height >= -1px -PASS expression_should_not_be_parseable: device-height >= -0.00001mm -PASS expression_should_not_be_parseable: device-height >= -100000em -FAIL expression_should_be_parseable: device-height = 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height = 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-height = -0 -PASS expression_should_not_be_parseable: max-device-height = -0 -PASS expression_should_not_be_parseable: 0px = device-height = 100000px -PASS expression_should_not_be_parseable: device-height = -1px -PASS expression_should_not_be_parseable: min-device-height = -1px -PASS expression_should_not_be_parseable: max-device-height = -1px -PASS expression_should_not_be_parseable: device-height = -0.00001mm -PASS expression_should_not_be_parseable: device-height = -100000em -FAIL expression_should_be_parseable: device-height <= 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-height <= -0 -PASS expression_should_not_be_parseable: max-device-height <= -0 -FAIL expression_should_be_parseable: 0px <= device-height <= 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-height < = 0px -PASS expression_should_not_be_parseable: device-height <= -1px -PASS expression_should_not_be_parseable: min-device-height <= -1px -PASS expression_should_not_be_parseable: max-device-height <= -1px -PASS expression_should_not_be_parseable: device-height <= -0.00001mm -PASS expression_should_not_be_parseable: device-height <= -100000em -FAIL expression_should_be_parseable: device-height < 0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < 0px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < 0em assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < -0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < -0cm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < 1px assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < 0.001mm assert_true: expected true got false -FAIL expression_should_be_parseable: device-height < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: min-device-height < -0 -PASS expression_should_not_be_parseable: max-device-height < -0 -FAIL expression_should_be_parseable: 0px < device-height < 100000px assert_true: expected true got false -PASS expression_should_not_be_parseable: device-height < -1px -PASS expression_should_not_be_parseable: min-device-height < -1px -PASS expression_should_not_be_parseable: max-device-height < -1px -PASS expression_should_not_be_parseable: device-height < -0.00001mm -PASS expression_should_not_be_parseable: device-height < -100000em +PASS expression_should_be_known: width +PASS expression_should_be_unknown: min-width +PASS expression_should_be_unknown: max-width +PASS expression_should_be_known: width : 0 +PASS expression_should_be_known: width : 0px +PASS expression_should_be_known: width : 0em +PASS expression_should_be_known: width : -0 +PASS expression_should_be_known: width : -0cm +PASS expression_should_be_known: width : 1px +PASS expression_should_be_known: width : 0.001mm +PASS expression_should_be_known: width : 100000px +PASS expression_should_be_known: min-width : -0 +PASS expression_should_be_known: max-width : -0 +PASS expression_should_be_unknown: width : -1px +PASS expression_should_be_unknown: min-width : -1px +PASS expression_should_be_unknown: max-width : -1px +PASS expression_should_be_unknown: width : -0.00001mm +PASS expression_should_be_unknown: width : -100000em +PASS expression_should_be_unknown: 0px : width : 0px +PASS expression_should_be_unknown: 0px : width > 0px +PASS expression_should_be_unknown: 0px : width >= 0px +PASS expression_should_be_unknown: 0px : width = 0px +PASS expression_should_be_unknown: 0px : width <= 0px +PASS expression_should_be_unknown: 0px : width < 0px +PASS expression_should_be_known: width > 0 +PASS expression_should_be_known: width > 0px +PASS expression_should_be_known: width > 0em +PASS expression_should_be_known: width > -0 +PASS expression_should_be_known: width > -0cm +PASS expression_should_be_known: width > 1px +PASS expression_should_be_known: width > 0.001mm +PASS expression_should_be_known: width > 100000px +PASS expression_should_be_unknown: min-width > -0 +PASS expression_should_be_unknown: max-width > -0 +PASS expression_should_be_known: 0px > width > 100000px +PASS expression_should_be_unknown: width > -1px +PASS expression_should_be_unknown: min-width > -1px +PASS expression_should_be_unknown: max-width > -1px +PASS expression_should_be_unknown: width > -0.00001mm +PASS expression_should_be_unknown: width > -100000em +PASS expression_should_be_unknown: 0px > width : 0px +PASS expression_should_be_known: 0px > width > 0px +PASS expression_should_be_known: 0px > width >= 0px +PASS expression_should_be_unknown: 0px > width = 0px +PASS expression_should_be_unknown: 0px > width <= 0px +PASS expression_should_be_unknown: 0px > width < 0px +PASS expression_should_be_known: width >= 0 +PASS expression_should_be_known: width >= 0px +PASS expression_should_be_known: width >= 0em +PASS expression_should_be_known: width >= -0 +PASS expression_should_be_known: width >= -0cm +PASS expression_should_be_known: width >= 1px +PASS expression_should_be_known: width >= 0.001mm +PASS expression_should_be_known: width >= 100000px +PASS expression_should_be_unknown: min-width >= -0 +PASS expression_should_be_unknown: max-width >= -0 +PASS expression_should_be_known: 0px >= width >= 100000px +PASS expression_should_be_unknown: width > = 0px +PASS expression_should_be_unknown: width >= -1px +PASS expression_should_be_unknown: min-width >= -1px +PASS expression_should_be_unknown: max-width >= -1px +PASS expression_should_be_unknown: width >= -0.00001mm +PASS expression_should_be_unknown: width >= -100000em +PASS expression_should_be_unknown: 0px >= width : 0px +PASS expression_should_be_known: 0px >= width > 0px +PASS expression_should_be_known: 0px >= width >= 0px +PASS expression_should_be_unknown: 0px >= width = 0px +PASS expression_should_be_unknown: 0px >= width <= 0px +PASS expression_should_be_unknown: 0px >= width < 0px +PASS expression_should_be_known: width = 0 +PASS expression_should_be_known: width = 0px +PASS expression_should_be_known: width = 0em +PASS expression_should_be_known: width = -0 +PASS expression_should_be_known: width = -0cm +PASS expression_should_be_known: width = 1px +PASS expression_should_be_known: width = 0.001mm +PASS expression_should_be_known: width = 100000px +PASS expression_should_be_unknown: min-width = -0 +PASS expression_should_be_unknown: max-width = -0 +PASS expression_should_be_unknown: 0px = width = 100000px +PASS expression_should_be_unknown: width = -1px +PASS expression_should_be_unknown: min-width = -1px +PASS expression_should_be_unknown: max-width = -1px +PASS expression_should_be_unknown: width = -0.00001mm +PASS expression_should_be_unknown: width = -100000em +PASS expression_should_be_unknown: 0px = width : 0px +PASS expression_should_be_unknown: 0px = width > 0px +PASS expression_should_be_unknown: 0px = width >= 0px +PASS expression_should_be_unknown: 0px = width = 0px +PASS expression_should_be_unknown: 0px = width <= 0px +PASS expression_should_be_unknown: 0px = width < 0px +PASS expression_should_be_known: width <= 0 +PASS expression_should_be_known: width <= 0px +PASS expression_should_be_known: width <= 0em +PASS expression_should_be_known: width <= -0 +PASS expression_should_be_known: width <= -0cm +PASS expression_should_be_known: width <= 1px +PASS expression_should_be_known: width <= 0.001mm +PASS expression_should_be_known: width <= 100000px +PASS expression_should_be_unknown: min-width <= -0 +PASS expression_should_be_unknown: max-width <= -0 +PASS expression_should_be_known: 0px <= width <= 100000px +PASS expression_should_be_unknown: width < = 0px +PASS expression_should_be_unknown: width <= -1px +PASS expression_should_be_unknown: min-width <= -1px +PASS expression_should_be_unknown: max-width <= -1px +PASS expression_should_be_unknown: width <= -0.00001mm +PASS expression_should_be_unknown: width <= -100000em +PASS expression_should_be_unknown: 0px <= width : 0px +PASS expression_should_be_unknown: 0px <= width > 0px +PASS expression_should_be_unknown: 0px <= width >= 0px +PASS expression_should_be_unknown: 0px <= width = 0px +PASS expression_should_be_known: 0px <= width <= 0px +PASS expression_should_be_known: 0px <= width < 0px +PASS expression_should_be_known: width < 0 +PASS expression_should_be_known: width < 0px +PASS expression_should_be_known: width < 0em +PASS expression_should_be_known: width < -0 +PASS expression_should_be_known: width < -0cm +PASS expression_should_be_known: width < 1px +PASS expression_should_be_known: width < 0.001mm +PASS expression_should_be_known: width < 100000px +PASS expression_should_be_unknown: min-width < -0 +PASS expression_should_be_unknown: max-width < -0 +PASS expression_should_be_known: 0px < width < 100000px +PASS expression_should_be_unknown: width < -1px +PASS expression_should_be_unknown: min-width < -1px +PASS expression_should_be_unknown: max-width < -1px +PASS expression_should_be_unknown: width < -0.00001mm +PASS expression_should_be_unknown: width < -100000em +PASS expression_should_be_unknown: 0px < width : 0px +PASS expression_should_be_unknown: 0px < width > 0px +PASS expression_should_be_unknown: 0px < width >= 0px +PASS expression_should_be_unknown: 0px < width = 0px +PASS expression_should_be_known: 0px < width <= 0px +PASS expression_should_be_known: 0px < width < 0px +PASS expression_should_be_known: height +PASS expression_should_be_unknown: min-height +PASS expression_should_be_unknown: max-height +PASS expression_should_be_known: height : 0 +PASS expression_should_be_known: height : 0px +PASS expression_should_be_known: height : 0em +PASS expression_should_be_known: height : -0 +PASS expression_should_be_known: height : -0cm +PASS expression_should_be_known: height : 1px +PASS expression_should_be_known: height : 0.001mm +PASS expression_should_be_known: height : 100000px +PASS expression_should_be_known: min-height : -0 +PASS expression_should_be_known: max-height : -0 +PASS expression_should_be_unknown: height : -1px +PASS expression_should_be_unknown: min-height : -1px +PASS expression_should_be_unknown: max-height : -1px +PASS expression_should_be_unknown: height : -0.00001mm +PASS expression_should_be_unknown: height : -100000em +PASS expression_should_be_unknown: 0px : height : 0px +PASS expression_should_be_unknown: 0px : height > 0px +PASS expression_should_be_unknown: 0px : height >= 0px +PASS expression_should_be_unknown: 0px : height = 0px +PASS expression_should_be_unknown: 0px : height <= 0px +PASS expression_should_be_unknown: 0px : height < 0px +PASS expression_should_be_known: height > 0 +PASS expression_should_be_known: height > 0px +PASS expression_should_be_known: height > 0em +PASS expression_should_be_known: height > -0 +PASS expression_should_be_known: height > -0cm +PASS expression_should_be_known: height > 1px +PASS expression_should_be_known: height > 0.001mm +PASS expression_should_be_known: height > 100000px +PASS expression_should_be_unknown: min-height > -0 +PASS expression_should_be_unknown: max-height > -0 +PASS expression_should_be_known: 0px > height > 100000px +PASS expression_should_be_unknown: height > -1px +PASS expression_should_be_unknown: min-height > -1px +PASS expression_should_be_unknown: max-height > -1px +PASS expression_should_be_unknown: height > -0.00001mm +PASS expression_should_be_unknown: height > -100000em +PASS expression_should_be_unknown: 0px > height : 0px +PASS expression_should_be_known: 0px > height > 0px +PASS expression_should_be_known: 0px > height >= 0px +PASS expression_should_be_unknown: 0px > height = 0px +PASS expression_should_be_unknown: 0px > height <= 0px +PASS expression_should_be_unknown: 0px > height < 0px +PASS expression_should_be_known: height >= 0 +PASS expression_should_be_known: height >= 0px +PASS expression_should_be_known: height >= 0em +PASS expression_should_be_known: height >= -0 +PASS expression_should_be_known: height >= -0cm +PASS expression_should_be_known: height >= 1px +PASS expression_should_be_known: height >= 0.001mm +PASS expression_should_be_known: height >= 100000px +PASS expression_should_be_unknown: min-height >= -0 +PASS expression_should_be_unknown: max-height >= -0 +PASS expression_should_be_known: 0px >= height >= 100000px +PASS expression_should_be_unknown: height > = 0px +PASS expression_should_be_unknown: height >= -1px +PASS expression_should_be_unknown: min-height >= -1px +PASS expression_should_be_unknown: max-height >= -1px +PASS expression_should_be_unknown: height >= -0.00001mm +PASS expression_should_be_unknown: height >= -100000em +PASS expression_should_be_unknown: 0px >= height : 0px +PASS expression_should_be_known: 0px >= height > 0px +PASS expression_should_be_known: 0px >= height >= 0px +PASS expression_should_be_unknown: 0px >= height = 0px +PASS expression_should_be_unknown: 0px >= height <= 0px +PASS expression_should_be_unknown: 0px >= height < 0px +PASS expression_should_be_known: height = 0 +PASS expression_should_be_known: height = 0px +PASS expression_should_be_known: height = 0em +PASS expression_should_be_known: height = -0 +PASS expression_should_be_known: height = -0cm +PASS expression_should_be_known: height = 1px +PASS expression_should_be_known: height = 0.001mm +PASS expression_should_be_known: height = 100000px +PASS expression_should_be_unknown: min-height = -0 +PASS expression_should_be_unknown: max-height = -0 +PASS expression_should_be_unknown: 0px = height = 100000px +PASS expression_should_be_unknown: height = -1px +PASS expression_should_be_unknown: min-height = -1px +PASS expression_should_be_unknown: max-height = -1px +PASS expression_should_be_unknown: height = -0.00001mm +PASS expression_should_be_unknown: height = -100000em +PASS expression_should_be_unknown: 0px = height : 0px +PASS expression_should_be_unknown: 0px = height > 0px +PASS expression_should_be_unknown: 0px = height >= 0px +PASS expression_should_be_unknown: 0px = height = 0px +PASS expression_should_be_unknown: 0px = height <= 0px +PASS expression_should_be_unknown: 0px = height < 0px +PASS expression_should_be_known: height <= 0 +PASS expression_should_be_known: height <= 0px +PASS expression_should_be_known: height <= 0em +PASS expression_should_be_known: height <= -0 +PASS expression_should_be_known: height <= -0cm +PASS expression_should_be_known: height <= 1px +PASS expression_should_be_known: height <= 0.001mm +PASS expression_should_be_known: height <= 100000px +PASS expression_should_be_unknown: min-height <= -0 +PASS expression_should_be_unknown: max-height <= -0 +PASS expression_should_be_known: 0px <= height <= 100000px +PASS expression_should_be_unknown: height < = 0px +PASS expression_should_be_unknown: height <= -1px +PASS expression_should_be_unknown: min-height <= -1px +PASS expression_should_be_unknown: max-height <= -1px +PASS expression_should_be_unknown: height <= -0.00001mm +PASS expression_should_be_unknown: height <= -100000em +PASS expression_should_be_unknown: 0px <= height : 0px +PASS expression_should_be_unknown: 0px <= height > 0px +PASS expression_should_be_unknown: 0px <= height >= 0px +PASS expression_should_be_unknown: 0px <= height = 0px +PASS expression_should_be_known: 0px <= height <= 0px +PASS expression_should_be_known: 0px <= height < 0px +PASS expression_should_be_known: height < 0 +PASS expression_should_be_known: height < 0px +PASS expression_should_be_known: height < 0em +PASS expression_should_be_known: height < -0 +PASS expression_should_be_known: height < -0cm +PASS expression_should_be_known: height < 1px +PASS expression_should_be_known: height < 0.001mm +PASS expression_should_be_known: height < 100000px +PASS expression_should_be_unknown: min-height < -0 +PASS expression_should_be_unknown: max-height < -0 +PASS expression_should_be_known: 0px < height < 100000px +PASS expression_should_be_unknown: height < -1px +PASS expression_should_be_unknown: min-height < -1px +PASS expression_should_be_unknown: max-height < -1px +PASS expression_should_be_unknown: height < -0.00001mm +PASS expression_should_be_unknown: height < -100000em +PASS expression_should_be_unknown: 0px < height : 0px +PASS expression_should_be_unknown: 0px < height > 0px +PASS expression_should_be_unknown: 0px < height >= 0px +PASS expression_should_be_unknown: 0px < height = 0px +PASS expression_should_be_known: 0px < height <= 0px +PASS expression_should_be_known: 0px < height < 0px +PASS expression_should_be_known: device-width +PASS expression_should_be_unknown: min-device-width +PASS expression_should_be_unknown: max-device-width +PASS expression_should_be_known: device-width : 0 +PASS expression_should_be_known: device-width : 0px +PASS expression_should_be_known: device-width : 0em +PASS expression_should_be_known: device-width : -0 +PASS expression_should_be_known: device-width : -0cm +PASS expression_should_be_known: device-width : 1px +PASS expression_should_be_known: device-width : 0.001mm +PASS expression_should_be_known: device-width : 100000px +PASS expression_should_be_known: min-device-width : -0 +PASS expression_should_be_known: max-device-width : -0 +PASS expression_should_be_unknown: device-width : -1px +PASS expression_should_be_unknown: min-device-width : -1px +PASS expression_should_be_unknown: max-device-width : -1px +PASS expression_should_be_unknown: device-width : -0.00001mm +PASS expression_should_be_unknown: device-width : -100000em +PASS expression_should_be_unknown: 0px : device-width : 0px +PASS expression_should_be_unknown: 0px : device-width > 0px +PASS expression_should_be_unknown: 0px : device-width >= 0px +PASS expression_should_be_unknown: 0px : device-width = 0px +PASS expression_should_be_unknown: 0px : device-width <= 0px +PASS expression_should_be_unknown: 0px : device-width < 0px +PASS expression_should_be_known: device-width > 0 +PASS expression_should_be_known: device-width > 0px +PASS expression_should_be_known: device-width > 0em +PASS expression_should_be_known: device-width > -0 +PASS expression_should_be_known: device-width > -0cm +PASS expression_should_be_known: device-width > 1px +PASS expression_should_be_known: device-width > 0.001mm +PASS expression_should_be_known: device-width > 100000px +PASS expression_should_be_unknown: min-device-width > -0 +PASS expression_should_be_unknown: max-device-width > -0 +PASS expression_should_be_known: 0px > device-width > 100000px +PASS expression_should_be_unknown: device-width > -1px +PASS expression_should_be_unknown: min-device-width > -1px +PASS expression_should_be_unknown: max-device-width > -1px +PASS expression_should_be_unknown: device-width > -0.00001mm +PASS expression_should_be_unknown: device-width > -100000em +PASS expression_should_be_unknown: 0px > device-width : 0px +PASS expression_should_be_known: 0px > device-width > 0px +PASS expression_should_be_known: 0px > device-width >= 0px +PASS expression_should_be_unknown: 0px > device-width = 0px +PASS expression_should_be_unknown: 0px > device-width <= 0px +PASS expression_should_be_unknown: 0px > device-width < 0px +PASS expression_should_be_known: device-width >= 0 +PASS expression_should_be_known: device-width >= 0px +PASS expression_should_be_known: device-width >= 0em +PASS expression_should_be_known: device-width >= -0 +PASS expression_should_be_known: device-width >= -0cm +PASS expression_should_be_known: device-width >= 1px +PASS expression_should_be_known: device-width >= 0.001mm +PASS expression_should_be_known: device-width >= 100000px +PASS expression_should_be_unknown: min-device-width >= -0 +PASS expression_should_be_unknown: max-device-width >= -0 +PASS expression_should_be_known: 0px >= device-width >= 100000px +PASS expression_should_be_unknown: device-width > = 0px +PASS expression_should_be_unknown: device-width >= -1px +PASS expression_should_be_unknown: min-device-width >= -1px +PASS expression_should_be_unknown: max-device-width >= -1px +PASS expression_should_be_unknown: device-width >= -0.00001mm +PASS expression_should_be_unknown: device-width >= -100000em +PASS expression_should_be_unknown: 0px >= device-width : 0px +PASS expression_should_be_known: 0px >= device-width > 0px +PASS expression_should_be_known: 0px >= device-width >= 0px +PASS expression_should_be_unknown: 0px >= device-width = 0px +PASS expression_should_be_unknown: 0px >= device-width <= 0px +PASS expression_should_be_unknown: 0px >= device-width < 0px +PASS expression_should_be_known: device-width = 0 +PASS expression_should_be_known: device-width = 0px +PASS expression_should_be_known: device-width = 0em +PASS expression_should_be_known: device-width = -0 +PASS expression_should_be_known: device-width = -0cm +PASS expression_should_be_known: device-width = 1px +PASS expression_should_be_known: device-width = 0.001mm +PASS expression_should_be_known: device-width = 100000px +PASS expression_should_be_unknown: min-device-width = -0 +PASS expression_should_be_unknown: max-device-width = -0 +PASS expression_should_be_unknown: 0px = device-width = 100000px +PASS expression_should_be_unknown: device-width = -1px +PASS expression_should_be_unknown: min-device-width = -1px +PASS expression_should_be_unknown: max-device-width = -1px +PASS expression_should_be_unknown: device-width = -0.00001mm +PASS expression_should_be_unknown: device-width = -100000em +PASS expression_should_be_unknown: 0px = device-width : 0px +PASS expression_should_be_unknown: 0px = device-width > 0px +PASS expression_should_be_unknown: 0px = device-width >= 0px +PASS expression_should_be_unknown: 0px = device-width = 0px +PASS expression_should_be_unknown: 0px = device-width <= 0px +PASS expression_should_be_unknown: 0px = device-width < 0px +PASS expression_should_be_known: device-width <= 0 +PASS expression_should_be_known: device-width <= 0px +PASS expression_should_be_known: device-width <= 0em +PASS expression_should_be_known: device-width <= -0 +PASS expression_should_be_known: device-width <= -0cm +PASS expression_should_be_known: device-width <= 1px +PASS expression_should_be_known: device-width <= 0.001mm +PASS expression_should_be_known: device-width <= 100000px +PASS expression_should_be_unknown: min-device-width <= -0 +PASS expression_should_be_unknown: max-device-width <= -0 +PASS expression_should_be_known: 0px <= device-width <= 100000px +PASS expression_should_be_unknown: device-width < = 0px +PASS expression_should_be_unknown: device-width <= -1px +PASS expression_should_be_unknown: min-device-width <= -1px +PASS expression_should_be_unknown: max-device-width <= -1px +PASS expression_should_be_unknown: device-width <= -0.00001mm +PASS expression_should_be_unknown: device-width <= -100000em +PASS expression_should_be_unknown: 0px <= device-width : 0px +PASS expression_should_be_unknown: 0px <= device-width > 0px +PASS expression_should_be_unknown: 0px <= device-width >= 0px +PASS expression_should_be_unknown: 0px <= device-width = 0px +PASS expression_should_be_known: 0px <= device-width <= 0px +PASS expression_should_be_known: 0px <= device-width < 0px +PASS expression_should_be_known: device-width < 0 +PASS expression_should_be_known: device-width < 0px +PASS expression_should_be_known: device-width < 0em +PASS expression_should_be_known: device-width < -0 +PASS expression_should_be_known: device-width < -0cm +PASS expression_should_be_known: device-width < 1px +PASS expression_should_be_known: device-width < 0.001mm +PASS expression_should_be_known: device-width < 100000px +PASS expression_should_be_unknown: min-device-width < -0 +PASS expression_should_be_unknown: max-device-width < -0 +PASS expression_should_be_known: 0px < device-width < 100000px +PASS expression_should_be_unknown: device-width < -1px +PASS expression_should_be_unknown: min-device-width < -1px +PASS expression_should_be_unknown: max-device-width < -1px +PASS expression_should_be_unknown: device-width < -0.00001mm +PASS expression_should_be_unknown: device-width < -100000em +PASS expression_should_be_unknown: 0px < device-width : 0px +PASS expression_should_be_unknown: 0px < device-width > 0px +PASS expression_should_be_unknown: 0px < device-width >= 0px +PASS expression_should_be_unknown: 0px < device-width = 0px +PASS expression_should_be_known: 0px < device-width <= 0px +PASS expression_should_be_known: 0px < device-width < 0px +PASS expression_should_be_known: device-height +PASS expression_should_be_unknown: min-device-height +PASS expression_should_be_unknown: max-device-height +PASS expression_should_be_known: device-height : 0 +PASS expression_should_be_known: device-height : 0px +PASS expression_should_be_known: device-height : 0em +PASS expression_should_be_known: device-height : -0 +PASS expression_should_be_known: device-height : -0cm +PASS expression_should_be_known: device-height : 1px +PASS expression_should_be_known: device-height : 0.001mm +PASS expression_should_be_known: device-height : 100000px +PASS expression_should_be_known: min-device-height : -0 +PASS expression_should_be_known: max-device-height : -0 +PASS expression_should_be_unknown: device-height : -1px +PASS expression_should_be_unknown: min-device-height : -1px +PASS expression_should_be_unknown: max-device-height : -1px +PASS expression_should_be_unknown: device-height : -0.00001mm +PASS expression_should_be_unknown: device-height : -100000em +PASS expression_should_be_unknown: 0px : device-height : 0px +PASS expression_should_be_unknown: 0px : device-height > 0px +PASS expression_should_be_unknown: 0px : device-height >= 0px +PASS expression_should_be_unknown: 0px : device-height = 0px +PASS expression_should_be_unknown: 0px : device-height <= 0px +PASS expression_should_be_unknown: 0px : device-height < 0px +PASS expression_should_be_known: device-height > 0 +PASS expression_should_be_known: device-height > 0px +PASS expression_should_be_known: device-height > 0em +PASS expression_should_be_known: device-height > -0 +PASS expression_should_be_known: device-height > -0cm +PASS expression_should_be_known: device-height > 1px +PASS expression_should_be_known: device-height > 0.001mm +PASS expression_should_be_known: device-height > 100000px +PASS expression_should_be_unknown: min-device-height > -0 +PASS expression_should_be_unknown: max-device-height > -0 +PASS expression_should_be_known: 0px > device-height > 100000px +PASS expression_should_be_unknown: device-height > -1px +PASS expression_should_be_unknown: min-device-height > -1px +PASS expression_should_be_unknown: max-device-height > -1px +PASS expression_should_be_unknown: device-height > -0.00001mm +PASS expression_should_be_unknown: device-height > -100000em +PASS expression_should_be_unknown: 0px > device-height : 0px +PASS expression_should_be_known: 0px > device-height > 0px +PASS expression_should_be_known: 0px > device-height >= 0px +PASS expression_should_be_unknown: 0px > device-height = 0px +PASS expression_should_be_unknown: 0px > device-height <= 0px +PASS expression_should_be_unknown: 0px > device-height < 0px +PASS expression_should_be_known: device-height >= 0 +PASS expression_should_be_known: device-height >= 0px +PASS expression_should_be_known: device-height >= 0em +PASS expression_should_be_known: device-height >= -0 +PASS expression_should_be_known: device-height >= -0cm +PASS expression_should_be_known: device-height >= 1px +PASS expression_should_be_known: device-height >= 0.001mm +PASS expression_should_be_known: device-height >= 100000px +PASS expression_should_be_unknown: min-device-height >= -0 +PASS expression_should_be_unknown: max-device-height >= -0 +PASS expression_should_be_known: 0px >= device-height >= 100000px +PASS expression_should_be_unknown: device-height > = 0px +PASS expression_should_be_unknown: device-height >= -1px +PASS expression_should_be_unknown: min-device-height >= -1px +PASS expression_should_be_unknown: max-device-height >= -1px +PASS expression_should_be_unknown: device-height >= -0.00001mm +PASS expression_should_be_unknown: device-height >= -100000em +PASS expression_should_be_unknown: 0px >= device-height : 0px +PASS expression_should_be_known: 0px >= device-height > 0px +PASS expression_should_be_known: 0px >= device-height >= 0px +PASS expression_should_be_unknown: 0px >= device-height = 0px +PASS expression_should_be_unknown: 0px >= device-height <= 0px +PASS expression_should_be_unknown: 0px >= device-height < 0px +PASS expression_should_be_known: device-height = 0 +PASS expression_should_be_known: device-height = 0px +PASS expression_should_be_known: device-height = 0em +PASS expression_should_be_known: device-height = -0 +PASS expression_should_be_known: device-height = -0cm +PASS expression_should_be_known: device-height = 1px +PASS expression_should_be_known: device-height = 0.001mm +PASS expression_should_be_known: device-height = 100000px +PASS expression_should_be_unknown: min-device-height = -0 +PASS expression_should_be_unknown: max-device-height = -0 +PASS expression_should_be_unknown: 0px = device-height = 100000px +PASS expression_should_be_unknown: device-height = -1px +PASS expression_should_be_unknown: min-device-height = -1px +PASS expression_should_be_unknown: max-device-height = -1px +PASS expression_should_be_unknown: device-height = -0.00001mm +PASS expression_should_be_unknown: device-height = -100000em +PASS expression_should_be_unknown: 0px = device-height : 0px +PASS expression_should_be_unknown: 0px = device-height > 0px +PASS expression_should_be_unknown: 0px = device-height >= 0px +PASS expression_should_be_unknown: 0px = device-height = 0px +PASS expression_should_be_unknown: 0px = device-height <= 0px +PASS expression_should_be_unknown: 0px = device-height < 0px +PASS expression_should_be_known: device-height <= 0 +PASS expression_should_be_known: device-height <= 0px +PASS expression_should_be_known: device-height <= 0em +PASS expression_should_be_known: device-height <= -0 +PASS expression_should_be_known: device-height <= -0cm +PASS expression_should_be_known: device-height <= 1px +PASS expression_should_be_known: device-height <= 0.001mm +PASS expression_should_be_known: device-height <= 100000px +PASS expression_should_be_unknown: min-device-height <= -0 +PASS expression_should_be_unknown: max-device-height <= -0 +PASS expression_should_be_known: 0px <= device-height <= 100000px +PASS expression_should_be_unknown: device-height < = 0px +PASS expression_should_be_unknown: device-height <= -1px +PASS expression_should_be_unknown: min-device-height <= -1px +PASS expression_should_be_unknown: max-device-height <= -1px +PASS expression_should_be_unknown: device-height <= -0.00001mm +PASS expression_should_be_unknown: device-height <= -100000em +PASS expression_should_be_unknown: 0px <= device-height : 0px +PASS expression_should_be_unknown: 0px <= device-height > 0px +PASS expression_should_be_unknown: 0px <= device-height >= 0px +PASS expression_should_be_unknown: 0px <= device-height = 0px +PASS expression_should_be_known: 0px <= device-height <= 0px +PASS expression_should_be_known: 0px <= device-height < 0px +PASS expression_should_be_known: device-height < 0 +PASS expression_should_be_known: device-height < 0px +PASS expression_should_be_known: device-height < 0em +PASS expression_should_be_known: device-height < -0 +PASS expression_should_be_known: device-height < -0cm +PASS expression_should_be_known: device-height < 1px +PASS expression_should_be_known: device-height < 0.001mm +PASS expression_should_be_known: device-height < 100000px +PASS expression_should_be_unknown: min-device-height < -0 +PASS expression_should_be_unknown: max-device-height < -0 +PASS expression_should_be_known: 0px < device-height < 100000px +PASS expression_should_be_unknown: device-height < -1px +PASS expression_should_be_unknown: min-device-height < -1px +PASS expression_should_be_unknown: max-device-height < -1px +PASS expression_should_be_unknown: device-height < -0.00001mm +PASS expression_should_be_unknown: device-height < -100000em +PASS expression_should_be_unknown: 0px < device-height : 0px +PASS expression_should_be_unknown: 0px < device-height > 0px +PASS expression_should_be_unknown: 0px < device-height >= 0px +PASS expression_should_be_unknown: 0px < device-height = 0px +PASS expression_should_be_known: 0px < device-height <= 0px +PASS expression_should_be_known: 0px < device-height < 0px PASS should_apply: all and (width: ${value}px) -FAIL should_apply: all and (width = ${value}px) assert_true: expected true got false +PASS should_apply: all and (width = ${value}px) PASS should_not_apply: all and (width: ${value + 1}px) PASS should_not_apply: all and (width: ${value - 1}px) PASS should_not_apply: all and (width = ${value + 1}px) @@ -430,24 +579,36 @@ PASS should_apply: all and (min-width: ${Math.floor(value/em_size) - 1}em) PASS should_apply: all and (max-width: ${Math.ceil(value/em_size) + 1}em) PASS should_not_apply: all and (max-width: ${Math.floor(value/em_size) - 1}em) -FAIL should_apply: (width <= ${value}px) assert_true: expected true got false -FAIL should_apply: (width >= ${value}px) assert_true: expected true got false -FAIL should_apply: (0px < width <= ${value}px) assert_true: expected true got false -FAIL should_apply: (${value}px >= width > 0px) assert_true: expected true got false +PASS should_apply: (width <= ${value}px) +PASS should_apply: (width >= ${value}px) +PASS should_apply: (0px < width <= ${value}px) +PASS should_apply: (${value}px >= width > 0px) PASS should_not_apply: (0px < width < ${value}px) PASS should_not_apply: (${value}px > width > 0px) PASS should_not_apply: (width < ${value}px) PASS should_not_apply: (width > ${value}px) -FAIL should_apply: (width < ${value + 1}px) assert_true: expected true got false -FAIL should_apply: (width <= ${value + 1}px) assert_true: expected true got false +PASS should_apply: (width < ${value + 1}px) +PASS should_apply: (width <= ${value + 1}px) PASS should_not_apply: (width > ${value + 1}px) PASS should_not_apply: (width >= ${value + 1}px) -FAIL should_apply: (width > ${value - 1}px) assert_true: expected true got false -FAIL should_apply: (width >= ${value - 1}px) assert_true: expected true got false +PASS should_apply: (width > ${value - 1}px) +PASS should_apply: (width >= ${value - 1}px) PASS should_not_apply: (width < ${value - 1}px) PASS should_not_apply: (width <= ${value - 1}px) +PASS should_apply: (${value - 1}px < width) +PASS should_apply: (${value - 1}px <= width) +PASS should_not_apply: (${value - 1}px > width) +PASS should_not_apply: (${value - 1}px >= width) +PASS should_apply: (${value - 1}px < width < ${value + 1}px) +PASS should_apply: (${value - 1}px < width <= ${value}px) +PASS should_apply: (${value}px <= width < ${value + 1}px) +PASS should_apply: (${value + 1}px > width > ${value - 1}px) +PASS should_apply: (${value + 1}px > width >= ${value}px) +PASS should_apply: (${value}px >= width > ${value - 1}px) +PASS should_not_apply: (${value}px > width > ${value - 1}px) +PASS should_not_apply: (${value + 1}px > width > ${value}px) PASS should_apply: all and (height: ${value}px) -FAIL should_apply: all and (height = ${value}px) assert_true: expected true got false +PASS should_apply: all and (height = ${value}px) PASS should_not_apply: all and (height: ${value + 1}px) PASS should_not_apply: all and (height: ${value - 1}px) PASS should_not_apply: all and (height = ${value + 1}px) @@ -462,24 +623,36 @@ PASS should_apply: all and (min-height: ${Math.floor(value/em_size) - 1}em) PASS should_apply: all and (max-height: ${Math.ceil(value/em_size) + 1}em) PASS should_not_apply: all and (max-height: ${Math.floor(value/em_size) - 1}em) -FAIL should_apply: (height <= ${value}px) assert_true: expected true got false -FAIL should_apply: (height >= ${value}px) assert_true: expected true got false -FAIL should_apply: (0px < height <= ${value}px) assert_true: expected true got false -FAIL should_apply: (${value}px >= height > 0px) assert_true: expected true got false +PASS should_apply: (height <= ${value}px) +PASS should_apply: (height >= ${value}px) +PASS should_apply: (0px < height <= ${value}px) +PASS should_apply: (${value}px >= height > 0px) PASS should_not_apply: (0px < height < ${value}px) PASS should_not_apply: (${value}px > height > 0px) PASS should_not_apply: (height < ${value}px) PASS should_not_apply: (height > ${value}px) -FAIL should_apply: (height < ${value + 1}px) assert_true: expected true got false -FAIL should_apply: (height <= ${value + 1}px) assert_true: expected true got false +PASS should_apply: (height < ${value + 1}px) +PASS should_apply: (height <= ${value + 1}px) PASS should_not_apply: (height > ${value + 1}px) PASS should_not_apply: (height >= ${value + 1}px) -FAIL should_apply: (height > ${value - 1}px) assert_true: expected true got false -FAIL should_apply: (height >= ${value - 1}px) assert_true: expected true got false +PASS should_apply: (height > ${value - 1}px) +PASS should_apply: (height >= ${value - 1}px) PASS should_not_apply: (height < ${value - 1}px) PASS should_not_apply: (height <= ${value - 1}px) +PASS should_apply: (${value - 1}px < height) +PASS should_apply: (${value - 1}px <= height) +PASS should_not_apply: (${value - 1}px > height) +PASS should_not_apply: (${value - 1}px >= height) +PASS should_apply: (${value - 1}px < height < ${value + 1}px) +PASS should_apply: (${value - 1}px < height <= ${value}px) +PASS should_apply: (${value}px <= height < ${value + 1}px) +PASS should_apply: (${value + 1}px > height > ${value - 1}px) +PASS should_apply: (${value + 1}px > height >= ${value}px) +PASS should_apply: (${value}px >= height > ${value - 1}px) +PASS should_not_apply: (${value}px > height > ${value - 1}px) +PASS should_not_apply: (${value + 1}px > height > ${value}px) PASS should_apply: all and (device-width: ${value}px) -FAIL should_apply: all and (device-width = ${value}px) assert_true: expected true got false +PASS should_apply: all and (device-width = ${value}px) PASS should_not_apply: all and (device-width: ${value + 1}px) PASS should_not_apply: all and (device-width: ${value - 1}px) PASS should_not_apply: all and (device-width = ${value + 1}px) @@ -494,24 +667,36 @@ PASS should_apply: all and (min-device-width: ${Math.floor(value/em_size) - 1}em) PASS should_apply: all and (max-device-width: ${Math.ceil(value/em_size) + 1}em) PASS should_not_apply: all and (max-device-width: ${Math.floor(value/em_size) - 1}em) -FAIL should_apply: (device-width <= ${value}px) assert_true: expected true got false -FAIL should_apply: (device-width >= ${value}px) assert_true: expected true got false -FAIL should_apply: (0px < device-width <= ${value}px) assert_true: expected true got false -FAIL should_apply: (${value}px >= device-width > 0px) assert_true: expected true got false +PASS should_apply: (device-width <= ${value}px) +PASS should_apply: (device-width >= ${value}px) +PASS should_apply: (0px < device-width <= ${value}px) +PASS should_apply: (${value}px >= device-width > 0px) PASS should_not_apply: (0px < device-width < ${value}px) PASS should_not_apply: (${value}px > device-width > 0px) PASS should_not_apply: (device-width < ${value}px) PASS should_not_apply: (device-width > ${value}px) -FAIL should_apply: (device-width < ${value + 1}px) assert_true: expected true got false -FAIL should_apply: (device-width <= ${value + 1}px) assert_true: expected true got false +PASS should_apply: (device-width < ${value + 1}px) +PASS should_apply: (device-width <= ${value + 1}px) PASS should_not_apply: (device-width > ${value + 1}px) PASS should_not_apply: (device-width >= ${value + 1}px) -FAIL should_apply: (device-width > ${value - 1}px) assert_true: expected true got false -FAIL should_apply: (device-width >= ${value - 1}px) assert_true: expected true got false +PASS should_apply: (device-width > ${value - 1}px) +PASS should_apply: (device-width >= ${value - 1}px) PASS should_not_apply: (device-width < ${value - 1}px) PASS should_not_apply: (device-width <= ${value - 1}px) +PASS should_apply: (${value - 1}px < device-width) +PASS should_apply: (${value - 1}px <= device-width) +PASS should_not_apply: (${value - 1}px > device-width) +PASS should_not_apply: (${value - 1}px >= device-width) +PASS should_apply: (${value - 1}px < device-width < ${value + 1}px) +PASS should_apply: (${value - 1}px < device-width <= ${value}px) +PASS should_apply: (${value}px <= device-width < ${value + 1}px) +PASS should_apply: (${value + 1}px > device-width > ${value - 1}px) +PASS should_apply: (${value + 1}px > device-width >= ${value}px) +PASS should_apply: (${value}px >= device-width > ${value - 1}px) +PASS should_not_apply: (${value}px > device-width > ${value - 1}px) +PASS should_not_apply: (${value + 1}px > device-width > ${value}px) PASS should_apply: all and (device-height: ${value}px) -FAIL should_apply: all and (device-height = ${value}px) assert_true: expected true got false +PASS should_apply: all and (device-height = ${value}px) PASS should_not_apply: all and (device-height: ${value + 1}px) PASS should_not_apply: all and (device-height: ${value - 1}px) PASS should_not_apply: all and (device-height = ${value + 1}px) @@ -526,22 +711,34 @@ PASS should_apply: all and (min-device-height: ${Math.floor(value/em_size) - 1}em) PASS should_apply: all and (max-device-height: ${Math.ceil(value/em_size) + 1}em) PASS should_not_apply: all and (max-device-height: ${Math.floor(value/em_size) - 1}em) -FAIL should_apply: (device-height <= ${value}px) assert_true: expected true got false -FAIL should_apply: (device-height >= ${value}px) assert_true: expected true got false -FAIL should_apply: (0px < device-height <= ${value}px) assert_true: expected true got false -FAIL should_apply: (${value}px >= device-height > 0px) assert_true: expected true got false +PASS should_apply: (device-height <= ${value}px) +PASS should_apply: (device-height >= ${value}px) +PASS should_apply: (0px < device-height <= ${value}px) +PASS should_apply: (${value}px >= device-height > 0px) PASS should_not_apply: (0px < device-height < ${value}px) PASS should_not_apply: (${value}px > device-height > 0px) PASS should_not_apply: (device-height < ${value}px) PASS should_not_apply: (device-height > ${value}px) -FAIL should_apply: (device-height < ${value + 1}px) assert_true: expected true got false -FAIL should_apply: (device-height <= ${value + 1}px) assert_true: expected true got false +PASS should_apply: (device-height < ${value + 1}px) +PASS should_apply: (device-height <= ${value + 1}px) PASS should_not_apply: (device-height > ${value + 1}px) PASS should_not_apply: (device-height >= ${value + 1}px) -FAIL should_apply: (device-height > ${value - 1}px) assert_true: expected true got false -FAIL should_apply: (device-height >= ${value - 1}px) assert_true: expected true got false +PASS should_apply: (device-height > ${value - 1}px) +PASS should_apply: (device-height >= ${value - 1}px) PASS should_not_apply: (device-height < ${value - 1}px) PASS should_not_apply: (device-height <= ${value - 1}px) +PASS should_apply: (${value - 1}px < device-height) +PASS should_apply: (${value - 1}px <= device-height) +PASS should_not_apply: (${value - 1}px > device-height) +PASS should_not_apply: (${value - 1}px >= device-height) +PASS should_apply: (${value - 1}px < device-height < ${value + 1}px) +PASS should_apply: (${value - 1}px < device-height <= ${value}px) +PASS should_apply: (${value}px <= device-height < ${value + 1}px) +PASS should_apply: (${value + 1}px > device-height > ${value - 1}px) +PASS should_apply: (${value + 1}px > device-height >= ${value}px) +PASS should_apply: (${value}px >= device-height > ${value - 1}px) +PASS should_not_apply: (${value}px > device-height > ${value - 1}px) +PASS should_not_apply: (${value + 1}px > device-height > ${value}px) PASS width = 0, height != 0: should_apply: all and (height) PASS width = 0, height != 0: should_not_apply: all and (width) PASS width = 0, height = 0: should_not_apply: all and (height) @@ -552,15 +749,15 @@ PASS width != 0, height = 0: should_apply: all and (width) PASS width != 0, height != 0: should_apply: all and (height) PASS width != 0, height != 0: should_apply: all and (width) -PASS ratio that reduces to 59/40: expression_should_be_parseable: orientation -PASS ratio that reduces to 59/40: expression_should_be_parseable: orientation: portrait -PASS ratio that reduces to 59/40: expression_should_be_parseable: orientation: landscape -PASS ratio that reduces to 59/40: expression_should_not_be_parseable: min-orientation -PASS ratio that reduces to 59/40: expression_should_not_be_parseable: min-orientation: portrait -PASS ratio that reduces to 59/40: expression_should_not_be_parseable: min-orientation: landscape -PASS ratio that reduces to 59/40: expression_should_not_be_parseable: max-orientation -PASS ratio that reduces to 59/40: expression_should_not_be_parseable: max-orientation: portrait -PASS ratio that reduces to 59/40: expression_should_not_be_parseable: max-orientation: landscape +PASS ratio that reduces to 59/40: expression_should_be_known: orientation +PASS ratio that reduces to 59/40: expression_should_be_known: orientation: portrait +PASS ratio that reduces to 59/40: expression_should_be_known: orientation: landscape +PASS ratio that reduces to 59/40: expression_should_be_unknown: min-orientation +PASS ratio that reduces to 59/40: expression_should_be_unknown: min-orientation: portrait +PASS ratio that reduces to 59/40: expression_should_be_unknown: min-orientation: landscape +PASS ratio that reduces to 59/40: expression_should_be_unknown: max-orientation +PASS ratio that reduces to 59/40: expression_should_be_unknown: max-orientation: portrait +PASS ratio that reduces to 59/40: expression_should_be_unknown: max-orientation: landscape PASS ratio that reduces to 59/40: should_apply: (orientation) PASS ratio that reduces to 59/40: should_apply: (orientation: landscape) PASS ratio that reduces to 59/40: should_not_apply: (orientation: portrait) @@ -587,13 +784,13 @@ PASS should_apply: (min-aspect-ratio: 59/81) PASS should_not_apply: (min-aspect-ratio: 60/80) PASS should_not_apply: (min-aspect-ratio: 59/79) -PASS expression_should_not_be_parseable: min-aspect-ratio +PASS expression_should_be_unknown: min-aspect-ratio PASS should_apply: (max-aspect-ratio: 59/80) PASS should_not_apply: (max-aspect-ratio: 58/80) PASS should_not_apply: (max-aspect-ratio: 59/81) PASS should_apply: (max-aspect-ratio: 60/80) PASS should_apply: (max-aspect-ratio: 59/79) -PASS expression_should_not_be_parseable: max-aspect-ratio +PASS expression_should_be_unknown: max-aspect-ratio PASS should_apply: (device-aspect-ratio: ${real_dar}) PASS should_apply: not all and (device-aspect-ratio: ${high_dar_1}) PASS should_not_apply: all and (device-aspect-ratio: ${high_dar_2}) @@ -605,51 +802,51 @@ PASS should_apply: not all and (min-device-aspect-ratio: ${high_dar_2}) PASS should_not_apply: not all and (min-device-aspect-ratio: ${low_dar_1}) PASS should_apply: all and (min-device-aspect-ratio: ${low_dar_2}) -PASS expression_should_not_be_parseable: min-device-aspect-ratio +PASS expression_should_be_unknown: min-device-aspect-ratio PASS should_apply: all and (max-device-aspect-ratio: ${real_dar}) PASS should_apply: (max-device-aspect-ratio: ${high_dar_1}) PASS should_apply: (max-device-aspect-ratio: ${high_dar_2}) PASS should_not_apply: all and (max-device-aspect-ratio: ${low_dar_1}) PASS should_apply: not all and (max-device-aspect-ratio: ${low_dar_2}) -PASS expression_should_not_be_parseable: max-device-aspect-ratio -PASS expression_should_be_parseable: max-aspect-ratio: 1/1 -PASS expression_should_be_parseable: max-aspect-ratio: 1 /1 -PASS expression_should_be_parseable: max-aspect-ratio: 1 / +PASS expression_should_be_unknown: max-device-aspect-ratio +PASS expression_should_be_known: max-aspect-ratio: 1/1 +PASS expression_should_be_known: max-aspect-ratio: 1 /1 +PASS expression_should_be_known: max-aspect-ratio: 1 / 1 -PASS expression_should_be_parseable: max-aspect-ratio: 1/\r1 -FAIL expression_should_be_parseable: max-aspect-ratio: 1 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 0.5 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 1.0/1 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 1/1.0 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 1.0/1.0 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 0/1 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 1/0 assert_true: expected true got false -FAIL expression_should_be_parseable: max-aspect-ratio: 0/0 assert_true: expected true got false -PASS expression_should_not_be_parseable: max-aspect-ratio: -1/1 -PASS expression_should_not_be_parseable: max-aspect-ratio: 1/-1 -PASS expression_should_not_be_parseable: max-aspect-ratio: -1/-1 -PASS expression_should_not_be_parseable: max-aspect-ratio: invalid -PASS expression_should_not_be_parseable: max-aspect-ratio: 1 / invalid -PASS expression_should_not_be_parseable: max-aspect-ratio: 1 invalid -PASS expression_should_be_parseable: device-aspect-ratio: 1/1 -PASS expression_should_be_parseable: device-aspect-ratio: 1 /1 -PASS expression_should_be_parseable: device-aspect-ratio: 1 / +PASS expression_should_be_known: max-aspect-ratio: 1/\r1 +FAIL expression_should_be_known: max-aspect-ratio: 1 assert_true: expected true got false +FAIL expression_should_be_known: max-aspect-ratio: 0.5 assert_true: expected true got false +FAIL expression_should_be_known: max-aspect-ratio: 1.0/1 assert_true: expected true got false +FAIL expression_should_be_known: max-aspect-ratio: 1/1.0 assert_true: expected true got false +FAIL expression_should_be_known: max-aspect-ratio: 1.0/1.0 assert_true: expected true got false +FAIL expression_should_be_known: max-aspect-ratio: 0/1 assert_true: expected true got false +FAIL expression_should_be_known: max-aspect-ratio: 1/0 assert_true: expected true got false +FAIL expression_should_be_known: max-aspect-ratio: 0/0 assert_true: expected true got false +PASS expression_should_be_unknown: max-aspect-ratio: -1/1 +PASS expression_should_be_unknown: max-aspect-ratio: 1/-1 +PASS expression_should_be_unknown: max-aspect-ratio: -1/-1 +PASS expression_should_be_unknown: max-aspect-ratio: invalid +PASS expression_should_be_unknown: max-aspect-ratio: 1 / invalid +PASS expression_should_be_unknown: max-aspect-ratio: 1 invalid +PASS expression_should_be_known: device-aspect-ratio: 1/1 +PASS expression_should_be_known: device-aspect-ratio: 1 /1 +PASS expression_should_be_known: device-aspect-ratio: 1 / 1 -PASS expression_should_be_parseable: device-aspect-ratio: 1/\r1 -FAIL expression_should_be_parseable: device-aspect-ratio: 1 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 0.5 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 1.0/1 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 1/1.0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 1.0/1.0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 0/1 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 1/0 assert_true: expected true got false -FAIL expression_should_be_parseable: device-aspect-ratio: 0/0 assert_true: expected true got false -PASS expression_should_not_be_parseable: device-aspect-ratio: -1/1 -PASS expression_should_not_be_parseable: device-aspect-ratio: 1/-1 -PASS expression_should_not_be_parseable: device-aspect-ratio: -1/-1 -PASS expression_should_not_be_parseable: device-aspect-ratio: invalid -PASS expression_should_not_be_parseable: device-aspect-ratio: 1 / invalid -PASS expression_should_not_be_parseable: device-aspect-ratio: 1 invalid +PASS expression_should_be_known: device-aspect-ratio: 1/\r1 +FAIL expression_should_be_known: device-aspect-ratio: 1 assert_true: expected true got false +FAIL expression_should_be_known: device-aspect-ratio: 0.5 assert_true: expected true got false +FAIL expression_should_be_known: device-aspect-ratio: 1.0/1 assert_true: expected true got false +FAIL expression_should_be_known: device-aspect-ratio: 1/1.0 assert_true: expected true got false +FAIL expression_should_be_known: device-aspect-ratio: 1.0/1.0 assert_true: expected true got false +FAIL expression_should_be_known: device-aspect-ratio: 0/1 assert_true: expected true got false +FAIL expression_should_be_known: device-aspect-ratio: 1/0 assert_true: expected true got false +FAIL expression_should_be_known: device-aspect-ratio: 0/0 assert_true: expected true got false +PASS expression_should_be_unknown: device-aspect-ratio: -1/1 +PASS expression_should_be_unknown: device-aspect-ratio: 1/-1 +PASS expression_should_be_unknown: device-aspect-ratio: -1/-1 +PASS expression_should_be_unknown: device-aspect-ratio: invalid +PASS expression_should_be_unknown: device-aspect-ratio: 1 / invalid +PASS expression_should_be_unknown: device-aspect-ratio: 1 invalid PASS monochrome_and_color PASS find_depth PASS should_apply: all and (color:8) @@ -659,33 +856,33 @@ PASS should_not_apply: all and (max-color:7) PASS should_apply: all and (max-color:9) PASS should_apply: all and (color) -PASS expression_should_not_be_parseable: max-color -PASS expression_should_not_be_parseable: min-color +PASS expression_should_be_unknown: max-color +PASS expression_should_be_unknown: min-color PASS should_not_apply: all and (monochrome) -PASS expression_should_not_be_parseable: max-monochrome -PASS expression_should_not_be_parseable: min-monochrome +PASS expression_should_be_unknown: max-monochrome +PASS expression_should_be_unknown: min-monochrome PASS should_apply: not all and (monochrome) PASS should_not_apply: not all and (color) PASS should_apply: only all and (color) PASS should_not_apply: only all and (monochrome) -PASS expression_should_be_parseable: color: 1 -PASS expression_should_be_parseable: color: 327 -PASS expression_should_be_parseable: color: 0 -PASS expression_should_not_be_parseable: color: 1.0 -PASS expression_should_not_be_parseable: color: -1 -PASS expression_should_not_be_parseable: color: 1/1 -PASS expression_should_be_parseable: min-monochrome: 1 -PASS expression_should_be_parseable: min-monochrome: 327 -PASS expression_should_be_parseable: min-monochrome: 0 -PASS expression_should_not_be_parseable: min-monochrome: 1.0 -PASS expression_should_not_be_parseable: min-monochrome: -1 -PASS expression_should_not_be_parseable: min-monochrome: 1/1 -PASS expression_should_be_parseable: max-color-index: 1 -PASS expression_should_be_parseable: max-color-index: 327 -PASS expression_should_be_parseable: max-color-index: 0 -PASS expression_should_not_be_parseable: max-color-index: 1.0 -PASS expression_should_not_be_parseable: max-color-index: -1 -PASS expression_should_not_be_parseable: max-color-index: 1/1 +PASS expression_should_be_known: color: 1 +PASS expression_should_be_known: color: 327 +PASS expression_should_be_known: color: 0 +PASS expression_should_be_unknown: color: 1.0 +PASS expression_should_be_unknown: color: -1 +PASS expression_should_be_unknown: color: 1/1 +PASS expression_should_be_known: min-monochrome: 1 +PASS expression_should_be_known: min-monochrome: 327 +PASS expression_should_be_known: min-monochrome: 0 +PASS expression_should_be_unknown: min-monochrome: 1.0 +PASS expression_should_be_unknown: min-monochrome: -1 +PASS expression_should_be_unknown: min-monochrome: 1/1 +PASS expression_should_be_known: max-color-index: 1 +PASS expression_should_be_known: max-color-index: 327 +PASS expression_should_be_known: max-color-index: 0 +PASS expression_should_be_unknown: max-color-index: 1.0 +PASS expression_should_be_unknown: max-color-index: -1 +PASS expression_should_be_unknown: max-color-index: 1/1 PASS should_apply: (color-index: 0) PASS should_not_apply: (color-index: 1) PASS should_apply: (min-color-index: 0) @@ -693,48 +890,48 @@ PASS should_apply: (max-color-index: 0) PASS should_apply: (max-color-index: 1) PASS should_apply: (max-color-index: 157) -PASS expression_should_be_parseable: resolution: 3dpi -PASS expression_should_be_parseable: resolution:3dpi -PASS expression_should_be_parseable: resolution: 3.0dpi -PASS expression_should_be_parseable: resolution: 3.4dpi -PASS expression_should_be_parseable: resolution : 120dpcm -PASS expression_should_be_parseable: resolution: 1dppx -PASS expression_should_be_parseable: resolution: 1x -PASS expression_should_be_parseable: resolution: 1.5dppx -PASS expression_should_be_parseable: resolution: 1.5x -PASS expression_should_be_parseable: resolution: 2.0dppx -PASS expression_should_not_be_parseable: resolution: 0dpi -PASS expression_should_not_be_parseable: resolution: -3dpi -PASS expression_should_not_be_parseable: resolution: 0dppx -PASS expression_should_not_be_parseable: resolution: 0x -PASS expression_should_be_parseable: min-resolution: 3dpi -PASS expression_should_be_parseable: min-resolution:3dpi -PASS expression_should_be_parseable: min-resolution: 3.0dpi -PASS expression_should_be_parseable: min-resolution: 3.4dpi -PASS expression_should_be_parseable: min-resolution : 120dpcm -PASS expression_should_be_parseable: min-resolution: 1dppx -PASS expression_should_be_parseable: min-resolution: 1x -PASS expression_should_be_parseable: min-resolution: 1.5dppx -PASS expression_should_be_parseable: min-resolution: 1.5x -PASS expression_should_be_parseable: min-resolution: 2.0dppx -PASS expression_should_not_be_parseable: min-resolution: 0dpi -PASS expression_should_not_be_parseable: min-resolution: -3dpi -PASS expression_should_not_be_parseable: min-resolution: 0dppx -PASS expression_should_not_be_parseable: min-resolution: 0x -PASS expression_should_be_parseable: max-resolution: 3dpi -PASS expression_should_be_parseable: max-resolution:3dpi -PASS expression_should_be_parseable: max-resolution: 3.0dpi -PASS expression_should_be_parseable: max-resolution: 3.4dpi -PASS expression_should_be_parseable: max-resolution : 120dpcm -PASS expression_should_be_parseable: max-resolution: 1dppx -PASS expression_should_be_parseable: max-resolution: 1x -PASS expression_should_be_parseable: max-resolution: 1.5dppx -PASS expression_should_be_parseable: max-resolution: 1.5x -PASS expression_should_be_parseable: max-resolution: 2.0dppx -PASS expression_should_not_be_parseable: max-resolution: 0dpi -PASS expression_should_not_be_parseable: max-resolution: -3dpi -PASS expression_should_not_be_parseable: max-resolution: 0dppx -PASS expression_should_not_be_parseable: max-resolution: 0x +PASS expression_should_be_known: resolution: 3dpi +PASS expression_should_be_known: resolution:3dpi +PASS expression_should_be_known: resolution: 3.0dpi +PASS expression_should_be_known: resolution: 3.4dpi +PASS expression_should_be_known: resolution : 120dpcm +PASS expression_should_be_known: resolution: 1dppx +PASS expression_should_be_known: resolution: 1x +PASS expression_should_be_known: resolution: 1.5dppx +PASS expression_should_be_known: resolution: 1.5x +PASS expression_should_be_known: resolution: 2.0dppx +PASS expression_should_be_unknown: resolution: 0dpi +PASS expression_should_be_unknown: resolution: -3dpi +PASS expression_should_be_unknown: resolution: 0dppx +PASS expression_should_be_unknown: resolution: 0x +PASS expression_should_be_known: min-resolution: 3dpi +PASS expression_should_be_known: min-resolution:3dpi +PASS expression_should_be_known: min-resolution: 3.0dpi +PASS expression_should_be_known: min-resolution: 3.4dpi +PASS expression_should_be_known: min-resolution : 120dpcm +PASS expression_should_be_known: min-resolution: 1dppx +PASS expression_should_be_known: min-resolution: 1x +PASS expression_should_be_known: min-resolution: 1.5dppx +PASS expression_should_be_known: min-resolution: 1.5x +PASS expression_should_be_known: min-resolution: 2.0dppx +PASS expression_should_be_unknown: min-resolution: 0dpi +PASS expression_should_be_unknown: min-resolution: -3dpi +PASS expression_should_be_unknown: min-resolution: 0dppx +PASS expression_should_be_unknown: min-resolution: 0x +PASS expression_should_be_known: max-resolution: 3dpi +PASS expression_should_be_known: max-resolution:3dpi +PASS expression_should_be_known: max-resolution: 3.0dpi +PASS expression_should_be_known: max-resolution: 3.4dpi +PASS expression_should_be_known: max-resolution : 120dpcm +PASS expression_should_be_known: max-resolution: 1dppx +PASS expression_should_be_known: max-resolution: 1x +PASS expression_should_be_known: max-resolution: 1.5dppx +PASS expression_should_be_known: max-resolution: 1.5x +PASS expression_should_be_known: max-resolution: 2.0dppx +PASS expression_should_be_unknown: max-resolution: 0dpi +PASS expression_should_be_unknown: max-resolution: -3dpi +PASS expression_should_be_unknown: max-resolution: 0dppx +PASS expression_should_be_unknown: max-resolution: 0x PASS find_resolution PASS resolution is exact: should_apply: (resolution: ${resolution}dpi) PASS resolution is exact: should_apply: (resolution: ${Math.floor(resolution/96)}dppx) @@ -749,27 +946,27 @@ PASS should_apply: (max-resolution: ${dpcm_high}dpcm) PASS should_not_apply: (max-resolution: ${dpcm_low}dpcm) PASS should_apply: not all and (min-resolution: ${dpcm_high}dpcm) -PASS expression_should_be_parseable: scan -PASS expression_should_be_parseable: scan: progressive -PASS expression_should_be_parseable: scan:interlace -PASS expression_should_not_be_parseable: min-scan:interlace -PASS expression_should_not_be_parseable: scan: 1 -PASS expression_should_not_be_parseable: max-scan -PASS expression_should_not_be_parseable: max-scan: progressive +PASS expression_should_be_known: scan +PASS expression_should_be_known: scan: progressive +PASS expression_should_be_known: scan:interlace +PASS expression_should_be_unknown: min-scan:interlace +PASS expression_should_be_unknown: scan: 1 +PASS expression_should_be_unknown: max-scan +PASS expression_should_be_unknown: max-scan: progressive PASS should_not_apply: (scan) PASS should_not_apply: (scan: progressive) PASS should_not_apply: (scan: interlace) PASS should_apply: not all and (scan) PASS should_apply: not all and (scan: progressive) PASS should_apply: not all and (scan: interlace) -PASS expression_should_be_parseable: grid -PASS expression_should_be_parseable: grid: 0 -PASS expression_should_be_parseable: grid: 1 -PASS expression_should_not_be_parseable: min-grid -PASS expression_should_not_be_parseable: min-grid:0 -PASS expression_should_not_be_parseable: max-grid: 1 -PASS expression_should_not_be_parseable: grid: 2 -PASS expression_should_not_be_parseable: grid: -1 +PASS expression_should_be_known: grid +PASS expression_should_be_known: grid: 0 +PASS expression_should_be_known: grid: 1 +PASS expression_should_be_unknown: min-grid +PASS expression_should_be_unknown: min-grid:0 +PASS expression_should_be_unknown: max-grid: 1 +PASS expression_should_be_unknown: grid: 2 +PASS expression_should_be_unknown: grid: -1 PASS should_not_apply: (grid) PASS should_apply: (grid: 0) PASS should_not_apply: (grid: 1) @@ -807,39 +1004,56 @@ PASS should_not_apply: (bogus) PASS should_not_apply: not all and (bogus) PASS should_not_apply: only all and (bogus) -FAIL expression_should_be_parseable: overflow-block assert_true: expected true got false -FAIL expression_should_be_parseable: overflow-block: none assert_true: expected true got false -FAIL expression_should_be_parseable: overflow-block: paged assert_true: expected true got false -FAIL expression_should_be_parseable: overflow-block: scroll assert_true: expected true got false -FAIL expression_should_be_parseable: overflow-block: optional-paged assert_true: expected true got false -PASS expression_should_not_be_parseable: overflow-block: some-random-invalid-thing +FAIL expression_should_be_known: overflow-block assert_true: expected true got false +FAIL expression_should_be_known: overflow-block: none assert_true: expected true got false +FAIL expression_should_be_known: overflow-block: paged assert_true: expected true got false +FAIL expression_should_be_known: overflow-block: scroll assert_true: expected true got false +FAIL expression_should_be_known: overflow-block: optional-paged assert_true: expected true got false +PASS expression_should_be_unknown: overflow-block: some-random-invalid-thing FAIL Sanity check for overflow-block assert_not_equals: overflow-block should be equivalent to not (overflow-block: none) got disallowed value false -FAIL expression_should_be_parseable: overflow-inline assert_true: expected true got false -FAIL expression_should_be_parseable: overflow-inline: none assert_true: expected true got false -FAIL expression_should_be_parseable: overflow-inline: scroll assert_true: expected true got false -PASS expression_should_not_be_parseable: overflow-inline: some-random-invalid-thing +FAIL expression_should_be_known: overflow-inline assert_true: expected true got false +FAIL expression_should_be_known: overflow-inline: none assert_true: expected true got false +FAIL expression_should_be_known: overflow-inline: scroll assert_true: expected true got false +PASS expression_should_be_unknown: overflow-inline: some-random-invalid-thing FAIL Sanity check for overflow-inline assert_not_equals: overflow-inline should be equivalent to not (overflow-inline: none) got disallowed value false -PASS expression_should_be_parseable: hover -PASS expression_should_be_parseable: hover: hover -PASS expression_should_be_parseable: hover: none -PASS expression_should_be_parseable: any-hover -PASS expression_should_be_parseable: any-hover: hover -PASS expression_should_be_parseable: any-hover: none +PASS expression_should_be_known: hover +PASS expression_should_be_known: hover: hover +PASS expression_should_be_known: hover: none +PASS expression_should_be_known: any-hover +PASS expression_should_be_known: any-hover: hover +PASS expression_should_be_known: any-hover: none PASS (hover) == (hover: hover) PASS (hover) == not (hover: none) PASS (any-hover) == (any-hover: hover) PASS (any-hover) == not (any-hover: none) -PASS expression_should_be_parseable: pointer -PASS expression_should_be_parseable: pointer: coarse -PASS expression_should_be_parseable: pointer: fine -PASS expression_should_be_parseable: pointer: none -PASS expression_should_be_parseable: any-pointer -PASS expression_should_be_parseable: any-pointer: coarse -PASS expression_should_be_parseable: any-pointer: fine -PASS expression_should_be_parseable: any-pointer: none +PASS expression_should_be_known: pointer +PASS expression_should_be_known: pointer: coarse +PASS expression_should_be_known: pointer: fine +PASS expression_should_be_known: pointer: none +PASS expression_should_be_known: any-pointer +PASS expression_should_be_known: any-pointer: coarse +PASS expression_should_be_known: any-pointer: fine +PASS expression_should_be_known: any-pointer: none PASS (pointer) == (pointer: coarse) or (pointer: fine) PASS (pointer) == not (pointer: none) PASS (any-pointer) == (any-pointer: coarse) or (any-pointer: fine) PASS (any-pointer) == not (any-pointer: none) +PASS 'or' keyword: should_not_apply: (height) or (height) +PASS 'or' keyword: should_apply: (width) or (height) +PASS 'or' keyword: should_apply: (height) or (width) +PASS 'or' keyword: should_apply: (height) or (width) or (height) +PASS 'or' keyword: query_should_not_be_parseable: screen or (width) +PASS 'or' keyword: query_should_not_be_parseable: screen and (width) or (height) +PASS nesting: should_not_apply: ((height)) +PASS nesting: should_apply: ((width)) +PASS nesting: should_apply: (((((width))))) +PASS nesting: should_apply: (((((width +PASS 'not' keyword: should_not_apply: not (width) +PASS 'not' keyword: should_apply: not (height) +PASS 'not' keyword: should_apply: not ((width) and (height)) +PASS 'not' keyword: should_not_apply: not ((width) or (height)) +PASS 'not' keyword: should_not_apply: not ((width) and (not (height))) +PASS 'not' keyword: query_should_not_be_parseable: not (width) and not (height) +PASS 'not' keyword: query_should_not_be_parseable: not not (width) Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/css/selectors/scope-selector-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/css/selectors/scope-selector-expected.txt deleted file mode 100644 index 1bd746d..0000000 --- a/third_party/blink/web_tests/platform/generic/external/wpt/css/selectors/scope-selector-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -FAIL scope-selector assert_equals: should not match in shadow root expected 0 but got 1 -FAIL scope-selector 1 assert_equals: should not match in document fragment expected 0 but got 1 -PASS querySelector() with ":scope" should return the document element, if present in the subtree -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-display-none-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-display-none-expected.txt index 54eea7e0..4e331d14 100644 --- a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-display-none-expected.txt +++ b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-display-none-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 169 tests; 158 PASS, 11 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 169 tests; 165 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS <img srcset="/images/green-1x1.png?a2 300w, /images/green-16x16.png?a2 301w"> ref sizes="100vw" (display:none) PASS <img srcset="/images/green-1x1.png?b2 450w, /images/green-16x16.png?b2 451w"> ref sizes="100vw" (display:none) PASS <img srcset="/images/green-1x1.png?c2 600w, /images/green-16x16.png?c2 601w"> ref sizes="100vw" (display:none) @@ -63,13 +63,13 @@ PASS <img srcset="/images/green-1x1.png?e54 50w, /images/green-16x16.png?e54 51w" sizes="not print 100vw, 1px"> ref sizes="1px" (display:none) PASS <img srcset="/images/green-1x1.png?e55 50w, /images/green-16x16.png?e55 51w" sizes="unknown-media-type 100vw, 1px"> ref sizes="1px" (display:none) PASS <img srcset="/images/green-1x1.png?e56 50w, /images/green-16x16.png?e56 51w" sizes="not unknown-media-type 100vw, 1px"> ref sizes="1px" (display:none) -FAIL <img srcset="/images/green-1x1.png?e57 50w, /images/green-16x16.png?e57 51w" sizes="(min-width:0) or (min-width:0) 1px"> ref sizes="1px" (display:none) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e58 50w, /images/green-16x16.png?e58 51w" sizes="(min-width:0) or (unknown-mf-name) 1px"> ref sizes="1px" (display:none) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e59 50w, /images/green-16x16.png?e59 51w" sizes="(min-width:0) or (min-width:unknown-mf-value) 1px"> ref sizes="1px" (display:none) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e60 50w, /images/green-16x16.png?e60 51w" sizes="(min-width:0) or (min-width:-1px) 1px"> ref sizes="1px" (display:none) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e61 50w, /images/green-16x16.png?e61 51w" sizes="(min-width:0) or (unknown "general-enclosed") 1px"> ref sizes="1px" (display:none) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e62 50w, /images/green-16x16.png?e62 51w" sizes="(min-width:0) or unknown-general-enclosed(foo) 1px"> ref sizes="1px" (display:none) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -PASS <img srcset="/images/green-1x1.png?e63 50w, /images/green-16x16.png?e63 51w" sizes="(min-width:0) or (!) 100vw, 1px"> ref sizes="1px" (display:none) +PASS <img srcset="/images/green-1x1.png?e57 50w, /images/green-16x16.png?e57 51w" sizes="(min-width:0) or (min-width:0) 1px"> ref sizes="1px" (display:none) +PASS <img srcset="/images/green-1x1.png?e58 50w, /images/green-16x16.png?e58 51w" sizes="(min-width:0) or (unknown-mf-name) 1px"> ref sizes="1px" (display:none) +PASS <img srcset="/images/green-1x1.png?e59 50w, /images/green-16x16.png?e59 51w" sizes="(min-width:0) or (min-width:unknown-mf-value) 1px"> ref sizes="1px" (display:none) +PASS <img srcset="/images/green-1x1.png?e60 50w, /images/green-16x16.png?e60 51w" sizes="(min-width:0) or (min-width:-1px) 1px"> ref sizes="1px" (display:none) +PASS <img srcset="/images/green-1x1.png?e61 50w, /images/green-16x16.png?e61 51w" sizes="(min-width:0) or (unknown "general-enclosed") 1px"> ref sizes="1px" (display:none) +PASS <img srcset="/images/green-1x1.png?e62 50w, /images/green-16x16.png?e62 51w" sizes="(min-width:0) or unknown-general-enclosed(foo) 1px"> ref sizes="1px" (display:none) +PASS <img srcset="/images/green-1x1.png?e63 50w, /images/green-16x16.png?e63 51w" sizes="(min-width:0) or (]) 100vw, 1px"> ref sizes="1px" (display:none) PASS <img srcset="/images/green-1x1.png?e64 50w, /images/green-16x16.png?e64 51w" sizes="(min-width:0) or unknown-media-type 100vw, 1px"> ref sizes="1px" (display:none) PASS <img srcset="/images/green-1x1.png?e65 50w, /images/green-16x16.png?e65 51w" sizes="(123) 100vw, 1px"> ref sizes="1px" (display:none) PASS <img srcset="/images/green-1x1.png?e66 50w, /images/green-16x16.png?e66 51w" sizes="not (123) 100vw, 1px"> ref sizes="1px" (display:none) @@ -112,7 +112,7 @@ PASS <img srcset="/images/green-1x1.png?e103 50w, /images/green-16x16.png?e103 51w" sizes="not ("grammar does not match") 100vw, 1px"> ref sizes="1px" (display:none) PASS <img srcset="/images/green-1x1.png?e104 50w, /images/green-16x16.png?e104 51w" sizes="(unknown-general-enclosed !) 100vw, 1px"> ref sizes="1px" (display:none) PASS <img srcset="/images/green-1x1.png?e105 50w, /images/green-16x16.png?e105 51w" sizes="not (unknown-general-enclosed !) 100vw, 1px"> ref sizes="1px" (display:none) -FAIL <img srcset="/images/green-1x1.png?e106 50w, /images/green-16x16.png?e106 51w" sizes="(min-width:0) or (unknown-general-enclosed !) 1px"> ref sizes="1px" (display:none) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" +PASS <img srcset="/images/green-1x1.png?e106 50w, /images/green-16x16.png?e106 51w" sizes="(min-width:0) or (unknown-general-enclosed !) 1px"> ref sizes="1px" (display:none) PASS <img srcset="/images/green-1x1.png?e107 50w, /images/green-16x16.png?e107 51w" sizes="not ((min-width:0) or (unknown "general-enclosed")) 100vw, 1px"> ref sizes="1px" (display:none) PASS <img srcset="/images/green-1x1.png?e108 50w, /images/green-16x16.png?e108 51w" sizes="(max-width:0) or (unknown-general-enclosed !) 100vw, 1px"> ref sizes="1px" (display:none) PASS <img srcset="/images/green-1x1.png?e109 50w, /images/green-16x16.png?e109 51w" sizes="not ((max-width:0) or (unknown "general-enclosed")) 100vw, 1px"> ref sizes="1px" (display:none)
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-quirks-mode-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-quirks-mode-expected.txt index 3d2fd77..874bb8e 100644 --- a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-quirks-mode-expected.txt +++ b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-quirks-mode-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 169 tests; 158 PASS, 11 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 169 tests; 165 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS <img srcset="/images/green-1x1.png?a2 300w, /images/green-16x16.png?a2 301w"> ref sizes="100vw" (quirks mode) PASS <img srcset="/images/green-1x1.png?b2 450w, /images/green-16x16.png?b2 451w"> ref sizes="100vw" (quirks mode) PASS <img srcset="/images/green-1x1.png?c2 600w, /images/green-16x16.png?c2 601w"> ref sizes="100vw" (quirks mode) @@ -63,13 +63,13 @@ PASS <img srcset="/images/green-1x1.png?e54 50w, /images/green-16x16.png?e54 51w" sizes="not print 100vw, 1px"> ref sizes="1px" (quirks mode) PASS <img srcset="/images/green-1x1.png?e55 50w, /images/green-16x16.png?e55 51w" sizes="unknown-media-type 100vw, 1px"> ref sizes="1px" (quirks mode) PASS <img srcset="/images/green-1x1.png?e56 50w, /images/green-16x16.png?e56 51w" sizes="not unknown-media-type 100vw, 1px"> ref sizes="1px" (quirks mode) -FAIL <img srcset="/images/green-1x1.png?e57 50w, /images/green-16x16.png?e57 51w" sizes="(min-width:0) or (min-width:0) 1px"> ref sizes="1px" (quirks mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e58 50w, /images/green-16x16.png?e58 51w" sizes="(min-width:0) or (unknown-mf-name) 1px"> ref sizes="1px" (quirks mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e59 50w, /images/green-16x16.png?e59 51w" sizes="(min-width:0) or (min-width:unknown-mf-value) 1px"> ref sizes="1px" (quirks mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e60 50w, /images/green-16x16.png?e60 51w" sizes="(min-width:0) or (min-width:-1px) 1px"> ref sizes="1px" (quirks mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e61 50w, /images/green-16x16.png?e61 51w" sizes="(min-width:0) or (unknown "general-enclosed") 1px"> ref sizes="1px" (quirks mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e62 50w, /images/green-16x16.png?e62 51w" sizes="(min-width:0) or unknown-general-enclosed(foo) 1px"> ref sizes="1px" (quirks mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -PASS <img srcset="/images/green-1x1.png?e63 50w, /images/green-16x16.png?e63 51w" sizes="(min-width:0) or (!) 100vw, 1px"> ref sizes="1px" (quirks mode) +PASS <img srcset="/images/green-1x1.png?e57 50w, /images/green-16x16.png?e57 51w" sizes="(min-width:0) or (min-width:0) 1px"> ref sizes="1px" (quirks mode) +PASS <img srcset="/images/green-1x1.png?e58 50w, /images/green-16x16.png?e58 51w" sizes="(min-width:0) or (unknown-mf-name) 1px"> ref sizes="1px" (quirks mode) +PASS <img srcset="/images/green-1x1.png?e59 50w, /images/green-16x16.png?e59 51w" sizes="(min-width:0) or (min-width:unknown-mf-value) 1px"> ref sizes="1px" (quirks mode) +PASS <img srcset="/images/green-1x1.png?e60 50w, /images/green-16x16.png?e60 51w" sizes="(min-width:0) or (min-width:-1px) 1px"> ref sizes="1px" (quirks mode) +PASS <img srcset="/images/green-1x1.png?e61 50w, /images/green-16x16.png?e61 51w" sizes="(min-width:0) or (unknown "general-enclosed") 1px"> ref sizes="1px" (quirks mode) +PASS <img srcset="/images/green-1x1.png?e62 50w, /images/green-16x16.png?e62 51w" sizes="(min-width:0) or unknown-general-enclosed(foo) 1px"> ref sizes="1px" (quirks mode) +PASS <img srcset="/images/green-1x1.png?e63 50w, /images/green-16x16.png?e63 51w" sizes="(min-width:0) or (]) 100vw, 1px"> ref sizes="1px" (quirks mode) PASS <img srcset="/images/green-1x1.png?e64 50w, /images/green-16x16.png?e64 51w" sizes="(min-width:0) or unknown-media-type 100vw, 1px"> ref sizes="1px" (quirks mode) PASS <img srcset="/images/green-1x1.png?e65 50w, /images/green-16x16.png?e65 51w" sizes="(123) 100vw, 1px"> ref sizes="1px" (quirks mode) PASS <img srcset="/images/green-1x1.png?e66 50w, /images/green-16x16.png?e66 51w" sizes="not (123) 100vw, 1px"> ref sizes="1px" (quirks mode) @@ -112,7 +112,7 @@ PASS <img srcset="/images/green-1x1.png?e103 50w, /images/green-16x16.png?e103 51w" sizes="not ("grammar does not match") 100vw, 1px"> ref sizes="1px" (quirks mode) PASS <img srcset="/images/green-1x1.png?e104 50w, /images/green-16x16.png?e104 51w" sizes="(unknown-general-enclosed !) 100vw, 1px"> ref sizes="1px" (quirks mode) PASS <img srcset="/images/green-1x1.png?e105 50w, /images/green-16x16.png?e105 51w" sizes="not (unknown-general-enclosed !) 100vw, 1px"> ref sizes="1px" (quirks mode) -FAIL <img srcset="/images/green-1x1.png?e106 50w, /images/green-16x16.png?e106 51w" sizes="(min-width:0) or (unknown-general-enclosed !) 1px"> ref sizes="1px" (quirks mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" +PASS <img srcset="/images/green-1x1.png?e106 50w, /images/green-16x16.png?e106 51w" sizes="(min-width:0) or (unknown-general-enclosed !) 1px"> ref sizes="1px" (quirks mode) PASS <img srcset="/images/green-1x1.png?e107 50w, /images/green-16x16.png?e107 51w" sizes="not ((min-width:0) or (unknown "general-enclosed")) 100vw, 1px"> ref sizes="1px" (quirks mode) PASS <img srcset="/images/green-1x1.png?e108 50w, /images/green-16x16.png?e108 51w" sizes="(max-width:0) or (unknown-general-enclosed !) 100vw, 1px"> ref sizes="1px" (quirks mode) PASS <img srcset="/images/green-1x1.png?e109 50w, /images/green-16x16.png?e109 51w" sizes="not ((max-width:0) or (unknown "general-enclosed")) 100vw, 1px"> ref sizes="1px" (quirks mode)
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-standards-mode-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-standards-mode-expected.txt index 4123a75e..4c2ed3ae 100644 --- a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-standards-mode-expected.txt +++ b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-standards-mode-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 169 tests; 158 PASS, 11 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 169 tests; 165 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS <img srcset="/images/green-1x1.png?a2 300w, /images/green-16x16.png?a2 301w"> ref sizes="100vw" (standards mode) PASS <img srcset="/images/green-1x1.png?b2 450w, /images/green-16x16.png?b2 451w"> ref sizes="100vw" (standards mode) PASS <img srcset="/images/green-1x1.png?c2 600w, /images/green-16x16.png?c2 601w"> ref sizes="100vw" (standards mode) @@ -63,13 +63,13 @@ PASS <img srcset="/images/green-1x1.png?e54 50w, /images/green-16x16.png?e54 51w" sizes="not print 100vw, 1px"> ref sizes="1px" (standards mode) PASS <img srcset="/images/green-1x1.png?e55 50w, /images/green-16x16.png?e55 51w" sizes="unknown-media-type 100vw, 1px"> ref sizes="1px" (standards mode) PASS <img srcset="/images/green-1x1.png?e56 50w, /images/green-16x16.png?e56 51w" sizes="not unknown-media-type 100vw, 1px"> ref sizes="1px" (standards mode) -FAIL <img srcset="/images/green-1x1.png?e57 50w, /images/green-16x16.png?e57 51w" sizes="(min-width:0) or (min-width:0) 1px"> ref sizes="1px" (standards mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e58 50w, /images/green-16x16.png?e58 51w" sizes="(min-width:0) or (unknown-mf-name) 1px"> ref sizes="1px" (standards mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e59 50w, /images/green-16x16.png?e59 51w" sizes="(min-width:0) or (min-width:unknown-mf-value) 1px"> ref sizes="1px" (standards mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e60 50w, /images/green-16x16.png?e60 51w" sizes="(min-width:0) or (min-width:-1px) 1px"> ref sizes="1px" (standards mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e61 50w, /images/green-16x16.png?e61 51w" sizes="(min-width:0) or (unknown "general-enclosed") 1px"> ref sizes="1px" (standards mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e62 50w, /images/green-16x16.png?e62 51w" sizes="(min-width:0) or unknown-general-enclosed(foo) 1px"> ref sizes="1px" (standards mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -PASS <img srcset="/images/green-1x1.png?e63 50w, /images/green-16x16.png?e63 51w" sizes="(min-width:0) or (!) 100vw, 1px"> ref sizes="1px" (standards mode) +PASS <img srcset="/images/green-1x1.png?e57 50w, /images/green-16x16.png?e57 51w" sizes="(min-width:0) or (min-width:0) 1px"> ref sizes="1px" (standards mode) +PASS <img srcset="/images/green-1x1.png?e58 50w, /images/green-16x16.png?e58 51w" sizes="(min-width:0) or (unknown-mf-name) 1px"> ref sizes="1px" (standards mode) +PASS <img srcset="/images/green-1x1.png?e59 50w, /images/green-16x16.png?e59 51w" sizes="(min-width:0) or (min-width:unknown-mf-value) 1px"> ref sizes="1px" (standards mode) +PASS <img srcset="/images/green-1x1.png?e60 50w, /images/green-16x16.png?e60 51w" sizes="(min-width:0) or (min-width:-1px) 1px"> ref sizes="1px" (standards mode) +PASS <img srcset="/images/green-1x1.png?e61 50w, /images/green-16x16.png?e61 51w" sizes="(min-width:0) or (unknown "general-enclosed") 1px"> ref sizes="1px" (standards mode) +PASS <img srcset="/images/green-1x1.png?e62 50w, /images/green-16x16.png?e62 51w" sizes="(min-width:0) or unknown-general-enclosed(foo) 1px"> ref sizes="1px" (standards mode) +PASS <img srcset="/images/green-1x1.png?e63 50w, /images/green-16x16.png?e63 51w" sizes="(min-width:0) or (]) 100vw, 1px"> ref sizes="1px" (standards mode) PASS <img srcset="/images/green-1x1.png?e64 50w, /images/green-16x16.png?e64 51w" sizes="(min-width:0) or unknown-media-type 100vw, 1px"> ref sizes="1px" (standards mode) PASS <img srcset="/images/green-1x1.png?e65 50w, /images/green-16x16.png?e65 51w" sizes="(123) 100vw, 1px"> ref sizes="1px" (standards mode) PASS <img srcset="/images/green-1x1.png?e66 50w, /images/green-16x16.png?e66 51w" sizes="not (123) 100vw, 1px"> ref sizes="1px" (standards mode) @@ -112,7 +112,7 @@ PASS <img srcset="/images/green-1x1.png?e103 50w, /images/green-16x16.png?e103 51w" sizes="not ("grammar does not match") 100vw, 1px"> ref sizes="1px" (standards mode) PASS <img srcset="/images/green-1x1.png?e104 50w, /images/green-16x16.png?e104 51w" sizes="(unknown-general-enclosed !) 100vw, 1px"> ref sizes="1px" (standards mode) PASS <img srcset="/images/green-1x1.png?e105 50w, /images/green-16x16.png?e105 51w" sizes="not (unknown-general-enclosed !) 100vw, 1px"> ref sizes="1px" (standards mode) -FAIL <img srcset="/images/green-1x1.png?e106 50w, /images/green-16x16.png?e106 51w" sizes="(min-width:0) or (unknown-general-enclosed !) 1px"> ref sizes="1px" (standards mode) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" +PASS <img srcset="/images/green-1x1.png?e106 50w, /images/green-16x16.png?e106 51w" sizes="(min-width:0) or (unknown-general-enclosed !) 1px"> ref sizes="1px" (standards mode) PASS <img srcset="/images/green-1x1.png?e107 50w, /images/green-16x16.png?e107 51w" sizes="not ((min-width:0) or (unknown "general-enclosed")) 100vw, 1px"> ref sizes="1px" (standards mode) PASS <img srcset="/images/green-1x1.png?e108 50w, /images/green-16x16.png?e108 51w" sizes="(max-width:0) or (unknown-general-enclosed !) 100vw, 1px"> ref sizes="1px" (standards mode) PASS <img srcset="/images/green-1x1.png?e109 50w, /images/green-16x16.png?e109 51w" sizes="not ((max-width:0) or (unknown "general-enclosed")) 100vw, 1px"> ref sizes="1px" (standards mode)
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-width-1000px-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-width-1000px-expected.txt index b1184da..eb44ca6 100644 --- a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-width-1000px-expected.txt +++ b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/embedded-content/the-img-element/sizes/parse-a-sizes-attribute-width-1000px-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 169 tests; 158 PASS, 11 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 169 tests; 165 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN. PASS <img srcset="/images/green-1x1.png?a2 300w, /images/green-16x16.png?a2 301w"> ref sizes="100vw" (width:1000px) PASS <img srcset="/images/green-1x1.png?b2 450w, /images/green-16x16.png?b2 451w"> ref sizes="100vw" (width:1000px) PASS <img srcset="/images/green-1x1.png?c2 600w, /images/green-16x16.png?c2 601w"> ref sizes="100vw" (width:1000px) @@ -63,13 +63,13 @@ PASS <img srcset="/images/green-1x1.png?e54 50w, /images/green-16x16.png?e54 51w" sizes="not print 100vw, 1px"> ref sizes="1px" (width:1000px) PASS <img srcset="/images/green-1x1.png?e55 50w, /images/green-16x16.png?e55 51w" sizes="unknown-media-type 100vw, 1px"> ref sizes="1px" (width:1000px) PASS <img srcset="/images/green-1x1.png?e56 50w, /images/green-16x16.png?e56 51w" sizes="not unknown-media-type 100vw, 1px"> ref sizes="1px" (width:1000px) -FAIL <img srcset="/images/green-1x1.png?e57 50w, /images/green-16x16.png?e57 51w" sizes="(min-width:0) or (min-width:0) 1px"> ref sizes="1px" (width:1000px) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e58 50w, /images/green-16x16.png?e58 51w" sizes="(min-width:0) or (unknown-mf-name) 1px"> ref sizes="1px" (width:1000px) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e59 50w, /images/green-16x16.png?e59 51w" sizes="(min-width:0) or (min-width:unknown-mf-value) 1px"> ref sizes="1px" (width:1000px) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e60 50w, /images/green-16x16.png?e60 51w" sizes="(min-width:0) or (min-width:-1px) 1px"> ref sizes="1px" (width:1000px) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e61 50w, /images/green-16x16.png?e61 51w" sizes="(min-width:0) or (unknown "general-enclosed") 1px"> ref sizes="1px" (width:1000px) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -FAIL <img srcset="/images/green-1x1.png?e62 50w, /images/green-16x16.png?e62 51w" sizes="(min-width:0) or unknown-general-enclosed(foo) 1px"> ref sizes="1px" (width:1000px) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" -PASS <img srcset="/images/green-1x1.png?e63 50w, /images/green-16x16.png?e63 51w" sizes="(min-width:0) or (!) 100vw, 1px"> ref sizes="1px" (width:1000px) +PASS <img srcset="/images/green-1x1.png?e57 50w, /images/green-16x16.png?e57 51w" sizes="(min-width:0) or (min-width:0) 1px"> ref sizes="1px" (width:1000px) +PASS <img srcset="/images/green-1x1.png?e58 50w, /images/green-16x16.png?e58 51w" sizes="(min-width:0) or (unknown-mf-name) 1px"> ref sizes="1px" (width:1000px) +PASS <img srcset="/images/green-1x1.png?e59 50w, /images/green-16x16.png?e59 51w" sizes="(min-width:0) or (min-width:unknown-mf-value) 1px"> ref sizes="1px" (width:1000px) +PASS <img srcset="/images/green-1x1.png?e60 50w, /images/green-16x16.png?e60 51w" sizes="(min-width:0) or (min-width:-1px) 1px"> ref sizes="1px" (width:1000px) +PASS <img srcset="/images/green-1x1.png?e61 50w, /images/green-16x16.png?e61 51w" sizes="(min-width:0) or (unknown "general-enclosed") 1px"> ref sizes="1px" (width:1000px) +PASS <img srcset="/images/green-1x1.png?e62 50w, /images/green-16x16.png?e62 51w" sizes="(min-width:0) or unknown-general-enclosed(foo) 1px"> ref sizes="1px" (width:1000px) +PASS <img srcset="/images/green-1x1.png?e63 50w, /images/green-16x16.png?e63 51w" sizes="(min-width:0) or (]) 100vw, 1px"> ref sizes="1px" (width:1000px) PASS <img srcset="/images/green-1x1.png?e64 50w, /images/green-16x16.png?e64 51w" sizes="(min-width:0) or unknown-media-type 100vw, 1px"> ref sizes="1px" (width:1000px) PASS <img srcset="/images/green-1x1.png?e65 50w, /images/green-16x16.png?e65 51w" sizes="(123) 100vw, 1px"> ref sizes="1px" (width:1000px) PASS <img srcset="/images/green-1x1.png?e66 50w, /images/green-16x16.png?e66 51w" sizes="not (123) 100vw, 1px"> ref sizes="1px" (width:1000px) @@ -112,7 +112,7 @@ PASS <img srcset="/images/green-1x1.png?e103 50w, /images/green-16x16.png?e103 51w" sizes="not ("grammar does not match") 100vw, 1px"> ref sizes="1px" (width:1000px) PASS <img srcset="/images/green-1x1.png?e104 50w, /images/green-16x16.png?e104 51w" sizes="(unknown-general-enclosed !) 100vw, 1px"> ref sizes="1px" (width:1000px) PASS <img srcset="/images/green-1x1.png?e105 50w, /images/green-16x16.png?e105 51w" sizes="not (unknown-general-enclosed !) 100vw, 1px"> ref sizes="1px" (width:1000px) -FAIL <img srcset="/images/green-1x1.png?e106 50w, /images/green-16x16.png?e106 51w" sizes="(min-width:0) or (unknown-general-enclosed !) 1px"> ref sizes="1px" (width:1000px) assert_equals: expected "http://web-platform.test:8001/images/green-1x1.png" but got "http://web-platform.test:8001/images/green-16x16.png" +PASS <img srcset="/images/green-1x1.png?e106 50w, /images/green-16x16.png?e106 51w" sizes="(min-width:0) or (unknown-general-enclosed !) 1px"> ref sizes="1px" (width:1000px) PASS <img srcset="/images/green-1x1.png?e107 50w, /images/green-16x16.png?e107 51w" sizes="not ((min-width:0) or (unknown "general-enclosed")) 100vw, 1px"> ref sizes="1px" (width:1000px) PASS <img srcset="/images/green-1x1.png?e108 50w, /images/green-16x16.png?e108 51w" sizes="(max-width:0) or (unknown-general-enclosed !) 100vw, 1px"> ref sizes="1px" (width:1000px) PASS <img srcset="/images/green-1x1.png?e109 50w, /images/green-16x16.png?e109 51w" sizes="not ((max-width:0) or (unknown "general-enclosed")) 100vw, 1px"> ref sizes="1px" (width:1000px)
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/html/semantics/forms/the-input-element/selection-pointer-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/forms/the-input-element/selection-pointer-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/mac/external/wpt/html/semantics/forms/the-input-element/selection-pointer-expected.txt rename to third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/forms/the-input-element/selection-pointer-expected.txt
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/streams/piping/abort.any-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/streams/piping/abort.any-expected.txt new file mode 100644 index 0000000..7ea342caa --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/streams/piping/abort.any-expected.txt
@@ -0,0 +1,33 @@ +This is a testharness.js-based test. +PASS a signal argument 'null' should cause pipeTo() to reject +PASS a signal argument 'AbortSignal' should cause pipeTo() to reject +PASS a signal argument 'true' should cause pipeTo() to reject +PASS a signal argument '-1' should cause pipeTo() to reject +PASS a signal argument '[object AbortSignal]' should cause pipeTo() to reject +PASS an aborted signal should cause the writable stream to reject with an AbortError +PASS (reason: 'null') all the error objects should be the same object +PASS (reason: 'undefined') all the error objects should be the same object +PASS (reason: 'error1: error1') all the error objects should be the same object +PASS preventCancel should prevent canceling the readable +PASS preventAbort should prevent aborting the readable +PASS preventCancel and preventAbort should prevent canceling the readable and aborting the readable +PASS (reason: 'null') abort should prevent further reads +PASS (reason: 'undefined') abort should prevent further reads +PASS (reason: 'error1: error1') abort should prevent further reads +PASS (reason: 'null') all pending writes should complete on abort +PASS (reason: 'undefined') all pending writes should complete on abort +PASS (reason: 'error1: error1') all pending writes should complete on abort +PASS a rejection from underlyingSource.cancel() should be returned by pipeTo() +PASS a rejection from underlyingSink.abort() should be returned by pipeTo() +PASS a rejection from underlyingSink.abort() should be preferred to one from underlyingSource.cancel() +PASS abort signal takes priority over closed readable +PASS abort signal takes priority over errored readable +PASS abort signal takes priority over closed writable +PASS abort signal takes priority over errored writable +PASS abort should do nothing after the readable is closed +PASS abort should do nothing after the readable is errored +PASS abort should do nothing after the readable is errored, even with pending writes +PASS abort should do nothing after the writable is errored +FAIL pipeTo on a teed readable byte stream should only be aborted when both branches are aborted assert_true: pipeTo should not resolve yet expected true got false +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/streams/piping/abort.any.serviceworker-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/streams/piping/abort.any.serviceworker-expected.txt new file mode 100644 index 0000000..7ea342caa --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/streams/piping/abort.any.serviceworker-expected.txt
@@ -0,0 +1,33 @@ +This is a testharness.js-based test. +PASS a signal argument 'null' should cause pipeTo() to reject +PASS a signal argument 'AbortSignal' should cause pipeTo() to reject +PASS a signal argument 'true' should cause pipeTo() to reject +PASS a signal argument '-1' should cause pipeTo() to reject +PASS a signal argument '[object AbortSignal]' should cause pipeTo() to reject +PASS an aborted signal should cause the writable stream to reject with an AbortError +PASS (reason: 'null') all the error objects should be the same object +PASS (reason: 'undefined') all the error objects should be the same object +PASS (reason: 'error1: error1') all the error objects should be the same object +PASS preventCancel should prevent canceling the readable +PASS preventAbort should prevent aborting the readable +PASS preventCancel and preventAbort should prevent canceling the readable and aborting the readable +PASS (reason: 'null') abort should prevent further reads +PASS (reason: 'undefined') abort should prevent further reads +PASS (reason: 'error1: error1') abort should prevent further reads +PASS (reason: 'null') all pending writes should complete on abort +PASS (reason: 'undefined') all pending writes should complete on abort +PASS (reason: 'error1: error1') all pending writes should complete on abort +PASS a rejection from underlyingSource.cancel() should be returned by pipeTo() +PASS a rejection from underlyingSink.abort() should be returned by pipeTo() +PASS a rejection from underlyingSink.abort() should be preferred to one from underlyingSource.cancel() +PASS abort signal takes priority over closed readable +PASS abort signal takes priority over errored readable +PASS abort signal takes priority over closed writable +PASS abort signal takes priority over errored writable +PASS abort should do nothing after the readable is closed +PASS abort should do nothing after the readable is errored +PASS abort should do nothing after the readable is errored, even with pending writes +PASS abort should do nothing after the writable is errored +FAIL pipeTo on a teed readable byte stream should only be aborted when both branches are aborted assert_true: pipeTo should not resolve yet expected true got false +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/streams/piping/abort.any.sharedworker-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/streams/piping/abort.any.sharedworker-expected.txt new file mode 100644 index 0000000..7ea342caa --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/streams/piping/abort.any.sharedworker-expected.txt
@@ -0,0 +1,33 @@ +This is a testharness.js-based test. +PASS a signal argument 'null' should cause pipeTo() to reject +PASS a signal argument 'AbortSignal' should cause pipeTo() to reject +PASS a signal argument 'true' should cause pipeTo() to reject +PASS a signal argument '-1' should cause pipeTo() to reject +PASS a signal argument '[object AbortSignal]' should cause pipeTo() to reject +PASS an aborted signal should cause the writable stream to reject with an AbortError +PASS (reason: 'null') all the error objects should be the same object +PASS (reason: 'undefined') all the error objects should be the same object +PASS (reason: 'error1: error1') all the error objects should be the same object +PASS preventCancel should prevent canceling the readable +PASS preventAbort should prevent aborting the readable +PASS preventCancel and preventAbort should prevent canceling the readable and aborting the readable +PASS (reason: 'null') abort should prevent further reads +PASS (reason: 'undefined') abort should prevent further reads +PASS (reason: 'error1: error1') abort should prevent further reads +PASS (reason: 'null') all pending writes should complete on abort +PASS (reason: 'undefined') all pending writes should complete on abort +PASS (reason: 'error1: error1') all pending writes should complete on abort +PASS a rejection from underlyingSource.cancel() should be returned by pipeTo() +PASS a rejection from underlyingSink.abort() should be returned by pipeTo() +PASS a rejection from underlyingSink.abort() should be preferred to one from underlyingSource.cancel() +PASS abort signal takes priority over closed readable +PASS abort signal takes priority over errored readable +PASS abort signal takes priority over closed writable +PASS abort signal takes priority over errored writable +PASS abort should do nothing after the readable is closed +PASS abort should do nothing after the readable is errored +PASS abort should do nothing after the readable is errored, even with pending writes +PASS abort should do nothing after the writable is errored +FAIL pipeTo on a teed readable byte stream should only be aborted when both branches are aborted assert_true: pipeTo should not resolve yet expected true got false +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/streams/piping/abort.any.worker-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/streams/piping/abort.any.worker-expected.txt new file mode 100644 index 0000000..7ea342caa --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/streams/piping/abort.any.worker-expected.txt
@@ -0,0 +1,33 @@ +This is a testharness.js-based test. +PASS a signal argument 'null' should cause pipeTo() to reject +PASS a signal argument 'AbortSignal' should cause pipeTo() to reject +PASS a signal argument 'true' should cause pipeTo() to reject +PASS a signal argument '-1' should cause pipeTo() to reject +PASS a signal argument '[object AbortSignal]' should cause pipeTo() to reject +PASS an aborted signal should cause the writable stream to reject with an AbortError +PASS (reason: 'null') all the error objects should be the same object +PASS (reason: 'undefined') all the error objects should be the same object +PASS (reason: 'error1: error1') all the error objects should be the same object +PASS preventCancel should prevent canceling the readable +PASS preventAbort should prevent aborting the readable +PASS preventCancel and preventAbort should prevent canceling the readable and aborting the readable +PASS (reason: 'null') abort should prevent further reads +PASS (reason: 'undefined') abort should prevent further reads +PASS (reason: 'error1: error1') abort should prevent further reads +PASS (reason: 'null') all pending writes should complete on abort +PASS (reason: 'undefined') all pending writes should complete on abort +PASS (reason: 'error1: error1') all pending writes should complete on abort +PASS a rejection from underlyingSource.cancel() should be returned by pipeTo() +PASS a rejection from underlyingSink.abort() should be returned by pipeTo() +PASS a rejection from underlyingSink.abort() should be preferred to one from underlyingSource.cancel() +PASS abort signal takes priority over closed readable +PASS abort signal takes priority over errored readable +PASS abort signal takes priority over closed writable +PASS abort signal takes priority over errored writable +PASS abort should do nothing after the readable is closed +PASS abort should do nothing after the readable is errored +PASS abort should do nothing after the readable is errored, even with pending writes +PASS abort should do nothing after the writable is errored +FAIL pipeTo on a teed readable byte stream should only be aborted when both branches are aborted assert_true: pipeTo should not resolve yet expected true got false +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/week/week-picker-ax-expected.txt b/third_party/blink/web_tests/platform/generic/fast/forms/week/week-picker-ax-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/mac/fast/forms/week/week-picker-ax-expected.txt rename to third_party/blink/web_tests/platform/generic/fast/forms/week/week-picker-ax-expected.txt
diff --git a/third_party/blink/web_tests/platform/generic/fast/media/mq-parsing-expected.txt b/third_party/blink/web_tests/platform/generic/fast/media/mq-parsing-expected.txt index ef52b1a..0e1d54d 100644 --- a/third_party/blink/web_tests/platform/generic/fast/media/mq-parsing-expected.txt +++ b/third_party/blink/web_tests/platform/generic/fast/media/mq-parsing-expected.txt
@@ -3,6 +3,6 @@ PASS: Got "not all, not all, all, not all, not all" as expected. PASS: Got "not all, not all, all, not all, not all" as expected. PASS: Got "not all, screen, not all, not all, not all, not all" as expected. -PASS: Got "not all, screen, not all, not all, not all, not all" as expected. -PASS: Got "not all, not all, not all, not all" as expected. +PASS: Got "not all, screen, not all, (invalid,), not all, not all" as expected. +PASS: Got "not all, (all,), not all, not all" as expected.
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/styles-3/style-autocomplete-swatches-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/styles-3/style-autocomplete-swatches-expected.txt index f58145c..7e7c1131 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/styles-3/style-autocomplete-swatches-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/styles-3/style-autocomplete-swatches-expected.txt
@@ -14,5 +14,5 @@ text: --other) priority: 1 subtitle: undefined - subtitleRenderer: undefined + subtitleRenderer: function () { [native code] }
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/fenced-frame/global-commands-fenced-frame.https-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/fenced-frame/global-commands-fenced-frame.https-expected.txt new file mode 100644 index 0000000..5ba5be5 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/fenced-frame/global-commands-fenced-frame.https-expected.txt
@@ -0,0 +1,5 @@ +Tests that global commands such as captureSnapshot, captureScreenshot, or getAppManifestreturns an error with Fenced Frame target +Page.captureSnapshot: Command can only be executed on top-level targets +Page.captureScreenshot: Command can only be executed on top-level targets +Page.getAppManifest: Command can only be executed on top-level targets +
diff --git a/third_party/blink/web_tests/platform/generic/inspector-protocol/css/css-get-media-queries-expected.txt b/third_party/blink/web_tests/platform/generic/inspector-protocol/css/css-get-media-queries-expected.txt index ae7394a0a..92da54e 100644 --- a/third_party/blink/web_tests/platform/generic/inspector-protocol/css/css-get-media-queries-expected.txt +++ b/third_party/blink/web_tests/platform/generic/inspector-protocol/css/css-get-media-queries-expected.txt
@@ -166,8 +166,8 @@ mediaRule #13 text: not all source: mediaRule - range: {"endColumn":9,"endLine":29,"startColumn":7,"startLine":29} - computedText: () + range: {"endColumn":10,"endLine":29,"startColumn":7,"startLine":29} + computedText: (]) mediaList is empty mediaRule #14 text: print and (min-width: 8.5in)
diff --git a/third_party/blink/web_tests/platform/generic/virtual/document-transition/inspector-protocol/css/css-get-styles-for-document-transition-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/document-transition/inspector-protocol/css/css-get-styles-for-document-transition-expected.txt new file mode 100644 index 0000000..c678c07a --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/virtual/document-transition/inspector-protocol/css/css-get-styles-for-document-transition-expected.txt
@@ -0,0 +1,2603 @@ +The test verifies functionality of querying style information for document-transition pseudo elements +{ + id : <number> + result : { + cssKeyframesRules : [ + ] + inherited : [ + ] + inheritedPseudoElements : [ + ] + inlineStyle : { + cssProperties : [ + ] + cssText : + range : { + endColumn : 0 + endLine : 0 + startColumn : 0 + startLine : 0 + } + shorthandEntries : [ + ] + styleSheetId : <string> + } + matchedCSSRules : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html + } + ] + text : html + } + style : { + cssProperties : [ + [0] : { + name : display + value : block + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + ] + pseudoElements : [ + [0] : { + matches : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition + } + ] + text : html::page-transition + } + style : { + cssProperties : [ + [0] : { + name : position + value : fixed + } + [1] : { + name : top + value : 0px + } + [2] : { + name : right + value : 0px + } + [3] : { + name : bottom + value : 0px + } + [4] : { + name : left + value : 0px + } + ] + shorthandEntries : [ + [0] : { + name : inset + value : 0px + } + ] + } + supports : [ + ] + } + } + ] + pseudoType : page-transition + } + [1] : { + matches : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-container() + } + ] + text : html::page-transition-container() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : left + value : 0px + } + [3] : { + name : will-change + value : transform + } + [4] : { + name : transform-origin + value : left top + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [1] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-container(root) + } + ] + text : html::page-transition-container(root) + } + style : { + cssProperties : [ + [0] : { + name : right + value : 0px + } + [1] : { + name : bottom + value : 0px + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + ] + pseudoType : page-transition-container + } + [2] : { + matches : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-container() + } + ] + text : html::page-transition-container() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : left + value : 0px + } + [3] : { + name : will-change + value : transform + } + [4] : { + name : transform-origin + value : left top + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [1] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-container(shared) + } + ] + text : html::page-transition-container(shared) + } + style : { + cssProperties : [ + [0] : { + name : width + value : 100px + } + [1] : { + name : height + value : 100px + } + [2] : { + name : transform + value : matrix(1, 0, 0, 1, 8, 8) + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [2] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-container(shared) + } + ] + text : html::page-transition-container(shared) + } + style : { + cssProperties : [ + [0] : { + name : animation-duration + value : 0.25s + } + [1] : { + name : animation-timing-function + value : ease + } + [2] : { + name : animation-delay + value : 0s + } + [3] : { + name : animation-iteration-count + value : 1 + } + [4] : { + name : animation-direction + value : normal + } + [5] : { + name : animation-fill-mode + value : both + } + [6] : { + name : animation-play-state + value : running + } + [7] : { + name : animation-name + value : page-transition-container-anim-shared + } + [8] : { + name : animation-timeline + value : auto + } + ] + shorthandEntries : [ + [0] : { + name : animation + value : 0.25s ease 0s 1 normal both running page-transition-container-anim-shared + } + ] + } + supports : [ + ] + } + } + ] + pseudoType : page-transition-container + } + [3] : { + matches : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : ::page-transition-image-wrapper() + } + ] + text : ::page-transition-image-wrapper() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : right + value : 0px + } + [3] : { + name : bottom + value : 0px + } + [4] : { + name : left + value : 0px + } + [5] : { + name : isolation + value : isolate + } + ] + shorthandEntries : [ + [0] : { + name : inset + value : 0px + } + ] + } + supports : [ + ] + } + } + ] + pseudoType : page-transition-image-wrapper + } + [4] : { + matches : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : ::page-transition-image-wrapper() + } + ] + text : ::page-transition-image-wrapper() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : right + value : 0px + } + [3] : { + name : bottom + value : 0px + } + [4] : { + name : left + value : 0px + } + [5] : { + name : isolation + value : isolate + } + ] + shorthandEntries : [ + [0] : { + name : inset + value : 0px + } + ] + } + supports : [ + ] + } + } + ] + pseudoType : page-transition-image-wrapper + } + [5] : { + matches : [ + [0] : { + matchingSelectors : [ + [0] : 1 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : ::page-transition-incoming-image() + } + [1] : { + text : ::page-transition-outgoing-image() + } + ] + text : ::page-transition-incoming-image(), ::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : left + value : 0px + } + [3] : { + name : width + value : 100% + } + [4] : { + name : height + value : 100% + } + [5] : { + name : mix-blend-mode + value : plus-lighter + } + [6] : { + name : will-change + value : opacity + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [1] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-outgoing-image() + } + ] + text : html::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + name : animation-duration + value : 0.25s + } + [1] : { + name : animation-timing-function + value : ease + } + [2] : { + name : animation-delay + value : 0s + } + [3] : { + name : animation-iteration-count + value : 1 + } + [4] : { + name : animation-direction + value : normal + } + [5] : { + name : animation-fill-mode + value : both + } + [6] : { + name : animation-play-state + value : running + } + [7] : { + name : animation-name + value : fade-out + } + [8] : { + name : animation-timeline + value : auto + } + ] + shorthandEntries : [ + [0] : { + name : animation + value : 0.25s ease 0s 1 normal both running fade-out + } + ] + } + supports : [ + ] + } + } + [2] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : regular + selectorList : { + selectors : [ + [0] : { + range : { + endColumn : 36 + endLine : 0 + startColumn : 1 + startLine : 0 + } + text : ::page-transition-outgoing-image(*) + } + ] + text : ::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + disabled : false + implicit : false + name : background + range : { + endColumn : 54 + endLine : 0 + startColumn : 38 + startLine : 0 + } + text : background: red; + value : red + } + [1] : { + name : background-image + value : initial + } + [2] : { + name : background-position-x + value : initial + } + [3] : { + name : background-position-y + value : initial + } + [4] : { + name : background-size + value : initial + } + [5] : { + name : background-repeat-x + value : initial + } + [6] : { + name : background-repeat-y + value : initial + } + [7] : { + name : background-attachment + value : initial + } + [8] : { + name : background-origin + value : initial + } + [9] : { + name : background-clip + value : initial + } + [10] : { + name : background-color + value : red + } + ] + cssText : background: red; + range : { + endColumn : 54 + endLine : 0 + startColumn : 38 + startLine : 0 + } + shorthandEntries : [ + [0] : { + name : background + value : red + } + ] + styleSheetId : <string> + } + styleSheetId : <string> + supports : [ + ] + } + } + ] + pseudoType : page-transition-outgoing-image + } + [6] : { + matches : [ + [0] : { + matchingSelectors : [ + [0] : 1 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : ::page-transition-incoming-image() + } + [1] : { + text : ::page-transition-outgoing-image() + } + ] + text : ::page-transition-incoming-image(), ::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : left + value : 0px + } + [3] : { + name : width + value : 100% + } + [4] : { + name : height + value : 100% + } + [5] : { + name : mix-blend-mode + value : plus-lighter + } + [6] : { + name : will-change + value : opacity + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [1] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-outgoing-image() + } + ] + text : html::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + name : animation-duration + value : 0.25s + } + [1] : { + name : animation-timing-function + value : ease + } + [2] : { + name : animation-delay + value : 0s + } + [3] : { + name : animation-iteration-count + value : 1 + } + [4] : { + name : animation-direction + value : normal + } + [5] : { + name : animation-fill-mode + value : both + } + [6] : { + name : animation-play-state + value : running + } + [7] : { + name : animation-name + value : fade-out + } + [8] : { + name : animation-timeline + value : auto + } + ] + shorthandEntries : [ + [0] : { + name : animation + value : 0.25s ease 0s 1 normal both running fade-out + } + ] + } + supports : [ + ] + } + } + [2] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : regular + selectorList : { + selectors : [ + [0] : { + range : { + endColumn : 36 + endLine : 0 + startColumn : 1 + startLine : 0 + } + text : ::page-transition-outgoing-image(*) + } + ] + text : ::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + disabled : false + implicit : false + name : background + range : { + endColumn : 54 + endLine : 0 + startColumn : 38 + startLine : 0 + } + text : background: red; + value : red + } + [1] : { + name : background-image + value : initial + } + [2] : { + name : background-position-x + value : initial + } + [3] : { + name : background-position-y + value : initial + } + [4] : { + name : background-size + value : initial + } + [5] : { + name : background-repeat-x + value : initial + } + [6] : { + name : background-repeat-y + value : initial + } + [7] : { + name : background-attachment + value : initial + } + [8] : { + name : background-origin + value : initial + } + [9] : { + name : background-clip + value : initial + } + [10] : { + name : background-color + value : red + } + ] + cssText : background: red; + range : { + endColumn : 54 + endLine : 0 + startColumn : 38 + startLine : 0 + } + shorthandEntries : [ + [0] : { + name : background + value : red + } + ] + styleSheetId : <string> + } + styleSheetId : <string> + supports : [ + ] + } + } + ] + pseudoType : page-transition-outgoing-image + } + [7] : { + matches : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : ::page-transition-incoming-image() + } + [1] : { + text : ::page-transition-outgoing-image() + } + ] + text : ::page-transition-incoming-image(), ::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : left + value : 0px + } + [3] : { + name : width + value : 100% + } + [4] : { + name : height + value : 100% + } + [5] : { + name : mix-blend-mode + value : plus-lighter + } + [6] : { + name : will-change + value : opacity + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [1] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-incoming-image() + } + ] + text : html::page-transition-incoming-image() + } + style : { + cssProperties : [ + [0] : { + name : animation-duration + value : 0.25s + } + [1] : { + name : animation-timing-function + value : ease + } + [2] : { + name : animation-delay + value : 0s + } + [3] : { + name : animation-iteration-count + value : 1 + } + [4] : { + name : animation-direction + value : normal + } + [5] : { + name : animation-fill-mode + value : both + } + [6] : { + name : animation-play-state + value : running + } + [7] : { + name : animation-name + value : fade-in + } + [8] : { + name : animation-timeline + value : auto + } + ] + shorthandEntries : [ + [0] : { + name : animation + value : 0.25s ease 0s 1 normal both running fade-in + } + ] + } + supports : [ + ] + } + } + ] + pseudoType : page-transition-incoming-image + } + [8] : { + matches : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : ::page-transition-incoming-image() + } + [1] : { + text : ::page-transition-outgoing-image() + } + ] + text : ::page-transition-incoming-image(), ::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : left + value : 0px + } + [3] : { + name : width + value : 100% + } + [4] : { + name : height + value : 100% + } + [5] : { + name : mix-blend-mode + value : plus-lighter + } + [6] : { + name : will-change + value : opacity + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [1] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-incoming-image() + } + ] + text : html::page-transition-incoming-image() + } + style : { + cssProperties : [ + [0] : { + name : animation-duration + value : 0.25s + } + [1] : { + name : animation-timing-function + value : ease + } + [2] : { + name : animation-delay + value : 0s + } + [3] : { + name : animation-iteration-count + value : 1 + } + [4] : { + name : animation-direction + value : normal + } + [5] : { + name : animation-fill-mode + value : both + } + [6] : { + name : animation-play-state + value : running + } + [7] : { + name : animation-name + value : fade-in + } + [8] : { + name : animation-timeline + value : auto + } + ] + shorthandEntries : [ + [0] : { + name : animation + value : 0.25s ease 0s 1 normal both running fade-in + } + ] + } + supports : [ + ] + } + } + [2] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : regular + selectorList : { + selectors : [ + [0] : { + range : { + endColumn : 41 + endLine : 0 + startColumn : 1 + startLine : 0 + } + text : ::page-transition-incoming-image(shared) + } + ] + text : ::page-transition-incoming-image(shared) + } + style : { + cssProperties : [ + [0] : { + disabled : false + implicit : false + name : animation-duration + range : { + endColumn : 68 + endLine : 0 + startColumn : 43 + startLine : 0 + } + text : animation-duration: 300s; + value : 300s + } + [1] : { + name : animation-duration + value : 300s + } + ] + cssText : animation-duration: 300s; + range : { + endColumn : 68 + endLine : 0 + startColumn : 43 + startLine : 0 + } + shorthandEntries : [ + ] + styleSheetId : <string> + } + styleSheetId : <string> + supports : [ + ] + } + } + ] + pseudoType : page-transition-incoming-image + } + ] + } + sessionId : <string> +} +Dumping styles for : ::page-transition{ + id : <number> + result : { + matchedCSSRules : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition + } + ] + text : html::page-transition + } + style : { + cssProperties : [ + [0] : { + name : position + value : fixed + } + [1] : { + name : top + value : 0px + } + [2] : { + name : right + value : 0px + } + [3] : { + name : bottom + value : 0px + } + [4] : { + name : left + value : 0px + } + ] + shorthandEntries : [ + [0] : { + name : inset + value : 0px + } + ] + } + supports : [ + ] + } + } + ] + } + sessionId : <string> +} +Dumping styles for : ::page-transition-container{ + id : <number> + result : { + matchedCSSRules : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-container() + } + ] + text : html::page-transition-container() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : left + value : 0px + } + [3] : { + name : will-change + value : transform + } + [4] : { + name : transform-origin + value : left top + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [1] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-container(root) + } + ] + text : html::page-transition-container(root) + } + style : { + cssProperties : [ + [0] : { + name : right + value : 0px + } + [1] : { + name : bottom + value : 0px + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + ] + } + sessionId : <string> +} +Dumping styles for : ::page-transition-image-wrapper{ + id : <number> + result : { + matchedCSSRules : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : ::page-transition-image-wrapper() + } + ] + text : ::page-transition-image-wrapper() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : right + value : 0px + } + [3] : { + name : bottom + value : 0px + } + [4] : { + name : left + value : 0px + } + [5] : { + name : isolation + value : isolate + } + ] + shorthandEntries : [ + [0] : { + name : inset + value : 0px + } + ] + } + supports : [ + ] + } + } + ] + } + sessionId : <string> +} +Dumping styles for : ::page-transition-outgoing-image{ + id : <number> + result : { + matchedCSSRules : [ + [0] : { + matchingSelectors : [ + [0] : 1 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : ::page-transition-incoming-image() + } + [1] : { + text : ::page-transition-outgoing-image() + } + ] + text : ::page-transition-incoming-image(), ::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : left + value : 0px + } + [3] : { + name : width + value : 100% + } + [4] : { + name : height + value : 100% + } + [5] : { + name : mix-blend-mode + value : plus-lighter + } + [6] : { + name : will-change + value : opacity + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [1] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-outgoing-image() + } + ] + text : html::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + name : animation-duration + value : 0.25s + } + [1] : { + name : animation-timing-function + value : ease + } + [2] : { + name : animation-delay + value : 0s + } + [3] : { + name : animation-iteration-count + value : 1 + } + [4] : { + name : animation-direction + value : normal + } + [5] : { + name : animation-fill-mode + value : both + } + [6] : { + name : animation-play-state + value : running + } + [7] : { + name : animation-name + value : fade-out + } + [8] : { + name : animation-timeline + value : auto + } + ] + shorthandEntries : [ + [0] : { + name : animation + value : 0.25s ease 0s 1 normal both running fade-out + } + ] + } + supports : [ + ] + } + } + [2] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : regular + selectorList : { + selectors : [ + [0] : { + range : { + endColumn : 36 + endLine : 0 + startColumn : 1 + startLine : 0 + } + text : ::page-transition-outgoing-image(*) + } + ] + text : ::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + disabled : false + implicit : false + name : background + range : { + endColumn : 54 + endLine : 0 + startColumn : 38 + startLine : 0 + } + text : background: red; + value : red + } + [1] : { + name : background-image + value : initial + } + [2] : { + name : background-position-x + value : initial + } + [3] : { + name : background-position-y + value : initial + } + [4] : { + name : background-size + value : initial + } + [5] : { + name : background-repeat-x + value : initial + } + [6] : { + name : background-repeat-y + value : initial + } + [7] : { + name : background-attachment + value : initial + } + [8] : { + name : background-origin + value : initial + } + [9] : { + name : background-clip + value : initial + } + [10] : { + name : background-color + value : red + } + ] + cssText : background: red; + range : { + endColumn : 54 + endLine : 0 + startColumn : 38 + startLine : 0 + } + shorthandEntries : [ + [0] : { + name : background + value : red + } + ] + styleSheetId : <string> + } + styleSheetId : <string> + supports : [ + ] + } + } + ] + } + sessionId : <string> +} +Dumping styles for : ::page-transition-incoming-image{ + id : <number> + result : { + matchedCSSRules : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : ::page-transition-incoming-image() + } + [1] : { + text : ::page-transition-outgoing-image() + } + ] + text : ::page-transition-incoming-image(), ::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : left + value : 0px + } + [3] : { + name : width + value : 100% + } + [4] : { + name : height + value : 100% + } + [5] : { + name : mix-blend-mode + value : plus-lighter + } + [6] : { + name : will-change + value : opacity + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [1] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-incoming-image() + } + ] + text : html::page-transition-incoming-image() + } + style : { + cssProperties : [ + [0] : { + name : animation-duration + value : 0.25s + } + [1] : { + name : animation-timing-function + value : ease + } + [2] : { + name : animation-delay + value : 0s + } + [3] : { + name : animation-iteration-count + value : 1 + } + [4] : { + name : animation-direction + value : normal + } + [5] : { + name : animation-fill-mode + value : both + } + [6] : { + name : animation-play-state + value : running + } + [7] : { + name : animation-name + value : fade-in + } + [8] : { + name : animation-timeline + value : auto + } + ] + shorthandEntries : [ + [0] : { + name : animation + value : 0.25s ease 0s 1 normal both running fade-in + } + ] + } + supports : [ + ] + } + } + ] + } + sessionId : <string> +} +Dumping styles for : ::page-transition-container{ + id : <number> + result : { + matchedCSSRules : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-container() + } + ] + text : html::page-transition-container() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : left + value : 0px + } + [3] : { + name : will-change + value : transform + } + [4] : { + name : transform-origin + value : left top + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [1] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-container(shared) + } + ] + text : html::page-transition-container(shared) + } + style : { + cssProperties : [ + [0] : { + name : width + value : 100px + } + [1] : { + name : height + value : 100px + } + [2] : { + name : transform + value : matrix(1, 0, 0, 1, 8, 8) + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [2] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-container(shared) + } + ] + text : html::page-transition-container(shared) + } + style : { + cssProperties : [ + [0] : { + name : animation-duration + value : 0.25s + } + [1] : { + name : animation-timing-function + value : ease + } + [2] : { + name : animation-delay + value : 0s + } + [3] : { + name : animation-iteration-count + value : 1 + } + [4] : { + name : animation-direction + value : normal + } + [5] : { + name : animation-fill-mode + value : both + } + [6] : { + name : animation-play-state + value : running + } + [7] : { + name : animation-name + value : page-transition-container-anim-shared + } + [8] : { + name : animation-timeline + value : auto + } + ] + shorthandEntries : [ + [0] : { + name : animation + value : 0.25s ease 0s 1 normal both running page-transition-container-anim-shared + } + ] + } + supports : [ + ] + } + } + ] + } + sessionId : <string> +} +Dumping styles for : ::page-transition-image-wrapper{ + id : <number> + result : { + matchedCSSRules : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : ::page-transition-image-wrapper() + } + ] + text : ::page-transition-image-wrapper() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : right + value : 0px + } + [3] : { + name : bottom + value : 0px + } + [4] : { + name : left + value : 0px + } + [5] : { + name : isolation + value : isolate + } + ] + shorthandEntries : [ + [0] : { + name : inset + value : 0px + } + ] + } + supports : [ + ] + } + } + ] + } + sessionId : <string> +} +Dumping styles for : ::page-transition-outgoing-image{ + id : <number> + result : { + matchedCSSRules : [ + [0] : { + matchingSelectors : [ + [0] : 1 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : ::page-transition-incoming-image() + } + [1] : { + text : ::page-transition-outgoing-image() + } + ] + text : ::page-transition-incoming-image(), ::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : left + value : 0px + } + [3] : { + name : width + value : 100% + } + [4] : { + name : height + value : 100% + } + [5] : { + name : mix-blend-mode + value : plus-lighter + } + [6] : { + name : will-change + value : opacity + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [1] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-outgoing-image() + } + ] + text : html::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + name : animation-duration + value : 0.25s + } + [1] : { + name : animation-timing-function + value : ease + } + [2] : { + name : animation-delay + value : 0s + } + [3] : { + name : animation-iteration-count + value : 1 + } + [4] : { + name : animation-direction + value : normal + } + [5] : { + name : animation-fill-mode + value : both + } + [6] : { + name : animation-play-state + value : running + } + [7] : { + name : animation-name + value : fade-out + } + [8] : { + name : animation-timeline + value : auto + } + ] + shorthandEntries : [ + [0] : { + name : animation + value : 0.25s ease 0s 1 normal both running fade-out + } + ] + } + supports : [ + ] + } + } + [2] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : regular + selectorList : { + selectors : [ + [0] : { + range : { + endColumn : 36 + endLine : 0 + startColumn : 1 + startLine : 0 + } + text : ::page-transition-outgoing-image(*) + } + ] + text : ::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + disabled : false + implicit : false + name : background + range : { + endColumn : 54 + endLine : 0 + startColumn : 38 + startLine : 0 + } + text : background: red; + value : red + } + [1] : { + name : background-image + value : initial + } + [2] : { + name : background-position-x + value : initial + } + [3] : { + name : background-position-y + value : initial + } + [4] : { + name : background-size + value : initial + } + [5] : { + name : background-repeat-x + value : initial + } + [6] : { + name : background-repeat-y + value : initial + } + [7] : { + name : background-attachment + value : initial + } + [8] : { + name : background-origin + value : initial + } + [9] : { + name : background-clip + value : initial + } + [10] : { + name : background-color + value : red + } + ] + cssText : background: red; + range : { + endColumn : 54 + endLine : 0 + startColumn : 38 + startLine : 0 + } + shorthandEntries : [ + [0] : { + name : background + value : red + } + ] + styleSheetId : <string> + } + styleSheetId : <string> + supports : [ + ] + } + } + ] + } + sessionId : <string> +} +Dumping styles for : ::page-transition-incoming-image{ + id : <number> + result : { + matchedCSSRules : [ + [0] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : ::page-transition-incoming-image() + } + [1] : { + text : ::page-transition-outgoing-image() + } + ] + text : ::page-transition-incoming-image(), ::page-transition-outgoing-image() + } + style : { + cssProperties : [ + [0] : { + name : position + value : absolute + } + [1] : { + name : top + value : 0px + } + [2] : { + name : left + value : 0px + } + [3] : { + name : width + value : 100% + } + [4] : { + name : height + value : 100% + } + [5] : { + name : mix-blend-mode + value : plus-lighter + } + [6] : { + name : will-change + value : opacity + } + ] + shorthandEntries : [ + ] + } + supports : [ + ] + } + } + [1] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : user-agent + selectorList : { + selectors : [ + [0] : { + text : html::page-transition-incoming-image() + } + ] + text : html::page-transition-incoming-image() + } + style : { + cssProperties : [ + [0] : { + name : animation-duration + value : 0.25s + } + [1] : { + name : animation-timing-function + value : ease + } + [2] : { + name : animation-delay + value : 0s + } + [3] : { + name : animation-iteration-count + value : 1 + } + [4] : { + name : animation-direction + value : normal + } + [5] : { + name : animation-fill-mode + value : both + } + [6] : { + name : animation-play-state + value : running + } + [7] : { + name : animation-name + value : fade-in + } + [8] : { + name : animation-timeline + value : auto + } + ] + shorthandEntries : [ + [0] : { + name : animation + value : 0.25s ease 0s 1 normal both running fade-in + } + ] + } + supports : [ + ] + } + } + [2] : { + matchingSelectors : [ + [0] : 0 + ] + rule : { + containerQueries : [ + ] + layers : [ + ] + media : [ + ] + origin : regular + selectorList : { + selectors : [ + [0] : { + range : { + endColumn : 41 + endLine : 0 + startColumn : 1 + startLine : 0 + } + text : ::page-transition-incoming-image(shared) + } + ] + text : ::page-transition-incoming-image(shared) + } + style : { + cssProperties : [ + [0] : { + disabled : false + implicit : false + name : animation-duration + range : { + endColumn : 68 + endLine : 0 + startColumn : 43 + startLine : 0 + } + text : animation-duration: 300s; + value : 300s + } + [1] : { + name : animation-duration + value : 300s + } + ] + cssText : animation-duration: 300s; + range : { + endColumn : 68 + endLine : 0 + startColumn : 43 + startLine : 0 + } + shorthandEntries : [ + ] + styleSheetId : <string> + } + styleSheetId : <string> + supports : [ + ] + } + } + ] + } + sessionId : <string> +} +
diff --git a/third_party/blink/web_tests/platform/generic/virtual/shared-storage-fenced-frame-shadow-dom/wpt_internal/shared_storage/run-url-selection-operation.https-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/shared-storage-fenced-frame-shadow-dom/wpt_internal/shared_storage/run-url-selection-operation.https-expected.txt index 13740675..a665f1ba 100644 --- a/third_party/blink/web_tests/platform/generic/virtual/shared-storage-fenced-frame-shadow-dom/wpt_internal/shared_storage/run-url-selection-operation.https-expected.txt +++ b/third_party/blink/web_tests/platform/generic/virtual/shared-storage-fenced-frame-shadow-dom/wpt_internal/shared_storage/run-url-selection-operation.https-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. Harness Error. harness_status.status = 1 , harness_status.message = ResizeObserver loop limit exceeded -PASS runURLSelectionOperation +PASS selectURL() Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/generic/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/platform/generic/webexposed/global-interface-listing-expected.txt index b2807042..ba926d9 100644 --- a/third_party/blink/web_tests/platform/generic/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/platform/generic/webexposed/global-interface-listing-expected.txt
@@ -8525,8 +8525,8 @@ method clear method constructor method delete - method runOperation - method runURLSelectionOperation + method run + method selectURL method set interface SharedWorker : EventTarget attribute @@toStringTag
diff --git a/third_party/blink/web_tests/platform/linux/compositing/visibility/visibility-simple-video-layer-expected.png b/third_party/blink/web_tests/platform/linux/compositing/visibility/visibility-simple-video-layer-expected.png deleted file mode 100644 index f17218b9..0000000 --- a/third_party/blink/web_tests/platform/linux/compositing/visibility/visibility-simple-video-layer-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/images/yuv-decode-eligible/color-profile-layer-expected.png b/third_party/blink/web_tests/platform/linux/images/yuv-decode-eligible/color-profile-layer-expected.png deleted file mode 100644 index ea53e31..0000000 --- a/third_party/blink/web_tests/platform/linux/images/yuv-decode-eligible/color-profile-layer-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/storage-access-api/storageAccess.testdriver.sub-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/storage-access-api/storageAccess.testdriver.sub-expected.txt deleted file mode 100644 index ae1a338..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/storage-access-api/storageAccess.testdriver.sub-expected.txt +++ /dev/null
@@ -1,8 +0,0 @@ -This is a testharness.js-based test. -PASS Set up storage access rules -PASS [same-site] Cookie access is allowed: true -PASS [third-party-allowed-on-first-party-site] Cookie access is allowed: true -PASS [third-party-blocked-on-first-party-site] Cookie access is allowed: false -PASS [third-party-blocked-all] Cookie access is allowed: false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/web-animations/idlharness.window-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/web-animations/idlharness.window-expected.txt deleted file mode 100644 index 411b4dcb..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/external/wpt/web-animations/idlharness.window-expected.txt +++ /dev/null
@@ -1,219 +0,0 @@ -This is a testharness.js-based test. -Found 215 tests; 166 PASS, 49 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS idl_test setup -PASS idl_test validation -PASS Partial interface Document: original interface defined -PASS Partial interface Document: member names are unique -PASS Partial interface mixin DocumentOrShadowRoot: original interface mixin defined -PASS Partial interface mixin DocumentOrShadowRoot: member names are unique -PASS Partial interface AnimationTimeline: original interface defined -PASS Partial interface AnimationTimeline: valid exposure set -PASS Partial interface AnimationTimeline: member names are unique -PASS Partial interface Animation: original interface defined -PASS Partial interface Animation: valid exposure set -PASS Partial interface Animation: member names are unique -PASS Partial interface AnimationEffect: original interface defined -PASS Partial interface AnimationEffect: valid exposure set -PASS Partial interface AnimationEffect: member names are unique -PASS Partial dictionary EffectTiming: original dictionary defined -PASS Partial dictionary EffectTiming: member names are unique -PASS Partial dictionary OptionalEffectTiming: original dictionary defined -PASS Partial dictionary OptionalEffectTiming: member names are unique -PASS Partial dictionary ComputedEffectTiming: original dictionary defined -PASS Partial dictionary ComputedEffectTiming: member names are unique -PASS Partial interface KeyframeEffect: original interface defined -PASS Partial interface KeyframeEffect: member names are unique -PASS Partial dictionary KeyframeEffectOptions: original dictionary defined -PASS Partial dictionary KeyframeEffectOptions: member names are unique -PASS Partial interface Document[2]: member names are unique -PASS Partial interface Document[3]: member names are unique -PASS Element includes Animatable: member names are unique -PASS Document includes NonElementParentNode: member names are unique -PASS DocumentFragment includes NonElementParentNode: member names are unique -PASS Document includes DocumentOrShadowRoot: member names are unique -PASS ShadowRoot includes DocumentOrShadowRoot: member names are unique -PASS Document includes ParentNode: member names are unique -PASS DocumentFragment includes ParentNode: member names are unique -PASS Element includes ParentNode: member names are unique -PASS Element includes NonDocumentTypeChildNode: member names are unique -PASS Element includes ChildNode: member names are unique -PASS Element includes Slottable: member names are unique -PASS Document includes XPathEvaluatorBase: member names are unique -PASS Document includes GlobalEventHandlers: member names are unique -PASS Document includes DocumentAndElementEventHandlers: member names are unique -PASS AnimationTimeline interface: existence and properties of interface object -PASS AnimationTimeline interface object length -PASS AnimationTimeline interface object name -PASS AnimationTimeline interface: existence and properties of interface prototype object -PASS AnimationTimeline interface: existence and properties of interface prototype object's "constructor" property -PASS AnimationTimeline interface: existence and properties of interface prototype object's @@unscopables property -PASS AnimationTimeline interface: attribute currentTime -PASS AnimationTimeline interface: attribute phase -PASS AnimationTimeline interface: attribute duration -FAIL AnimationTimeline interface: operation play(optional AnimationEffect?) assert_own_property: interface prototype object missing non-static operation expected property "play" missing -PASS DocumentTimeline interface: existence and properties of interface object -PASS DocumentTimeline interface object length -PASS DocumentTimeline interface object name -PASS DocumentTimeline interface: existence and properties of interface prototype object -PASS DocumentTimeline interface: existence and properties of interface prototype object's "constructor" property -PASS DocumentTimeline interface: existence and properties of interface prototype object's @@unscopables property -PASS DocumentTimeline must be primary interface of document.timeline -PASS Stringification of document.timeline -PASS AnimationTimeline interface: document.timeline must inherit property "currentTime" with the proper type -PASS AnimationTimeline interface: document.timeline must inherit property "phase" with the proper type -PASS AnimationTimeline interface: document.timeline must inherit property "duration" with the proper type -FAIL AnimationTimeline interface: document.timeline must inherit property "play(optional AnimationEffect?)" with the proper type assert_inherits: property "play" not found in prototype chain -FAIL AnimationTimeline interface: calling play(optional AnimationEffect?) on document.timeline with too few arguments must throw TypeError assert_inherits: property "play" not found in prototype chain -PASS Animation interface: existence and properties of interface object -PASS Animation interface object length -PASS Animation interface object name -PASS Animation interface: existence and properties of interface prototype object -PASS Animation interface: existence and properties of interface prototype object's "constructor" property -PASS Animation interface: existence and properties of interface prototype object's @@unscopables property -PASS Animation interface: attribute id -PASS Animation interface: attribute effect -PASS Animation interface: attribute timeline -PASS Animation interface: attribute playbackRate -PASS Animation interface: attribute playState -PASS Animation interface: attribute replaceState -PASS Animation interface: attribute pending -PASS Animation interface: attribute ready -PASS Animation interface: attribute finished -PASS Animation interface: attribute onfinish -PASS Animation interface: attribute oncancel -PASS Animation interface: attribute onremove -PASS Animation interface: operation cancel() -PASS Animation interface: operation finish() -PASS Animation interface: operation play() -PASS Animation interface: operation pause() -PASS Animation interface: operation updatePlaybackRate(double) -PASS Animation interface: operation reverse() -PASS Animation interface: operation persist() -PASS Animation interface: operation commitStyles() -PASS Animation interface: attribute startTime -PASS Animation interface: attribute currentTime -PASS Animation must be primary interface of new Animation() -PASS Stringification of new Animation() -PASS Animation interface: new Animation() must inherit property "id" with the proper type -PASS Animation interface: new Animation() must inherit property "effect" with the proper type -PASS Animation interface: new Animation() must inherit property "timeline" with the proper type -PASS Animation interface: new Animation() must inherit property "playbackRate" with the proper type -PASS Animation interface: new Animation() must inherit property "playState" with the proper type -PASS Animation interface: new Animation() must inherit property "replaceState" with the proper type -PASS Animation interface: new Animation() must inherit property "pending" with the proper type -PASS Animation interface: new Animation() must inherit property "ready" with the proper type -PASS Animation interface: new Animation() must inherit property "finished" with the proper type -PASS Animation interface: new Animation() must inherit property "onfinish" with the proper type -PASS Animation interface: new Animation() must inherit property "oncancel" with the proper type -PASS Animation interface: new Animation() must inherit property "onremove" with the proper type -PASS Animation interface: new Animation() must inherit property "cancel()" with the proper type -PASS Animation interface: new Animation() must inherit property "finish()" with the proper type -PASS Animation interface: new Animation() must inherit property "play()" with the proper type -PASS Animation interface: new Animation() must inherit property "pause()" with the proper type -PASS Animation interface: new Animation() must inherit property "updatePlaybackRate(double)" with the proper type -PASS Animation interface: calling updatePlaybackRate(double) on new Animation() with too few arguments must throw TypeError -PASS Animation interface: new Animation() must inherit property "reverse()" with the proper type -PASS Animation interface: new Animation() must inherit property "persist()" with the proper type -PASS Animation interface: new Animation() must inherit property "commitStyles()" with the proper type -PASS Animation interface: new Animation() must inherit property "startTime" with the proper type -PASS Animation interface: new Animation() must inherit property "currentTime" with the proper type -PASS AnimationEffect interface: existence and properties of interface object -PASS AnimationEffect interface object length -PASS AnimationEffect interface object name -PASS AnimationEffect interface: existence and properties of interface prototype object -PASS AnimationEffect interface: existence and properties of interface prototype object's "constructor" property -PASS AnimationEffect interface: existence and properties of interface prototype object's @@unscopables property -PASS AnimationEffect interface: operation getTiming() -PASS AnimationEffect interface: operation getComputedTiming() -PASS AnimationEffect interface: operation updateTiming(optional OptionalEffectTiming) -FAIL AnimationEffect interface: attribute parent assert_true: The prototype object must have a property "parent" expected true got false -FAIL AnimationEffect interface: attribute previousSibling assert_true: The prototype object must have a property "previousSibling" expected true got false -FAIL AnimationEffect interface: attribute nextSibling assert_true: The prototype object must have a property "nextSibling" expected true got false -FAIL AnimationEffect interface: operation before(AnimationEffect...) assert_own_property: interface prototype object missing non-static operation expected property "before" missing -FAIL AnimationEffect interface: operation after(AnimationEffect...) assert_own_property: interface prototype object missing non-static operation expected property "after" missing -FAIL AnimationEffect interface: operation replace(AnimationEffect...) assert_own_property: interface prototype object missing non-static operation expected property "replace" missing -FAIL AnimationEffect interface: operation remove() assert_own_property: interface prototype object missing non-static operation expected property "remove" missing -PASS KeyframeEffect interface: existence and properties of interface object -PASS KeyframeEffect interface object length -PASS KeyframeEffect interface object name -PASS KeyframeEffect interface: existence and properties of interface prototype object -PASS KeyframeEffect interface: existence and properties of interface prototype object's "constructor" property -PASS KeyframeEffect interface: existence and properties of interface prototype object's @@unscopables property -PASS KeyframeEffect interface: attribute target -PASS KeyframeEffect interface: attribute pseudoElement -PASS KeyframeEffect interface: attribute composite -PASS KeyframeEffect interface: operation getKeyframes() -PASS KeyframeEffect interface: operation setKeyframes(object?) -FAIL KeyframeEffect interface: attribute iterationComposite assert_true: The prototype object must have a property "iterationComposite" expected true got false -PASS KeyframeEffect must be primary interface of new KeyframeEffect(null, null) -PASS Stringification of new KeyframeEffect(null, null) -PASS KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "target" with the proper type -PASS KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "pseudoElement" with the proper type -PASS KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "composite" with the proper type -PASS KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "getKeyframes()" with the proper type -PASS KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "setKeyframes(object?)" with the proper type -PASS KeyframeEffect interface: calling setKeyframes(object?) on new KeyframeEffect(null, null) with too few arguments must throw TypeError -FAIL KeyframeEffect interface: new KeyframeEffect(null, null) must inherit property "iterationComposite" with the proper type assert_inherits: property "iterationComposite" not found in prototype chain -PASS AnimationEffect interface: new KeyframeEffect(null, null) must inherit property "getTiming()" with the proper type -PASS AnimationEffect interface: new KeyframeEffect(null, null) must inherit property "getComputedTiming()" with the proper type -PASS AnimationEffect interface: new KeyframeEffect(null, null) must inherit property "updateTiming(optional OptionalEffectTiming)" with the proper type -PASS AnimationEffect interface: calling updateTiming(optional OptionalEffectTiming) on new KeyframeEffect(null, null) with too few arguments must throw TypeError -FAIL AnimationEffect interface: new KeyframeEffect(null, null) must inherit property "parent" with the proper type assert_inherits: property "parent" not found in prototype chain -FAIL AnimationEffect interface: new KeyframeEffect(null, null) must inherit property "previousSibling" with the proper type assert_inherits: property "previousSibling" not found in prototype chain -FAIL AnimationEffect interface: new KeyframeEffect(null, null) must inherit property "nextSibling" with the proper type assert_inherits: property "nextSibling" not found in prototype chain -FAIL AnimationEffect interface: new KeyframeEffect(null, null) must inherit property "before(AnimationEffect...)" with the proper type assert_inherits: property "before" not found in prototype chain -FAIL AnimationEffect interface: calling before(AnimationEffect...) on new KeyframeEffect(null, null) with too few arguments must throw TypeError assert_inherits: property "before" not found in prototype chain -FAIL AnimationEffect interface: new KeyframeEffect(null, null) must inherit property "after(AnimationEffect...)" with the proper type assert_inherits: property "after" not found in prototype chain -FAIL AnimationEffect interface: calling after(AnimationEffect...) on new KeyframeEffect(null, null) with too few arguments must throw TypeError assert_inherits: property "after" not found in prototype chain -FAIL AnimationEffect interface: new KeyframeEffect(null, null) must inherit property "replace(AnimationEffect...)" with the proper type assert_inherits: property "replace" not found in prototype chain -FAIL AnimationEffect interface: calling replace(AnimationEffect...) on new KeyframeEffect(null, null) with too few arguments must throw TypeError assert_inherits: property "replace" not found in prototype chain -FAIL AnimationEffect interface: new KeyframeEffect(null, null) must inherit property "remove()" with the proper type assert_inherits: property "remove" not found in prototype chain -FAIL GroupEffect interface: existence and properties of interface object assert_own_property: self does not have own property "GroupEffect" expected property "GroupEffect" missing -FAIL GroupEffect interface object length assert_own_property: self does not have own property "GroupEffect" expected property "GroupEffect" missing -FAIL GroupEffect interface object name assert_own_property: self does not have own property "GroupEffect" expected property "GroupEffect" missing -FAIL GroupEffect interface: existence and properties of interface prototype object assert_own_property: self does not have own property "GroupEffect" expected property "GroupEffect" missing -FAIL GroupEffect interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "GroupEffect" expected property "GroupEffect" missing -FAIL GroupEffect interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "GroupEffect" expected property "GroupEffect" missing -FAIL GroupEffect interface: attribute children assert_own_property: self does not have own property "GroupEffect" expected property "GroupEffect" missing -FAIL GroupEffect interface: attribute firstChild assert_own_property: self does not have own property "GroupEffect" expected property "GroupEffect" missing -FAIL GroupEffect interface: attribute lastChild assert_own_property: self does not have own property "GroupEffect" expected property "GroupEffect" missing -FAIL GroupEffect interface: operation clone() assert_own_property: self does not have own property "GroupEffect" expected property "GroupEffect" missing -FAIL GroupEffect interface: operation prepend(AnimationEffect...) assert_own_property: self does not have own property "GroupEffect" expected property "GroupEffect" missing -FAIL GroupEffect interface: operation append(AnimationEffect...) assert_own_property: self does not have own property "GroupEffect" expected property "GroupEffect" missing -FAIL AnimationNodeList interface: existence and properties of interface object assert_own_property: self does not have own property "AnimationNodeList" expected property "AnimationNodeList" missing -FAIL AnimationNodeList interface object length assert_own_property: self does not have own property "AnimationNodeList" expected property "AnimationNodeList" missing -FAIL AnimationNodeList interface object name assert_own_property: self does not have own property "AnimationNodeList" expected property "AnimationNodeList" missing -FAIL AnimationNodeList interface: existence and properties of interface prototype object assert_own_property: self does not have own property "AnimationNodeList" expected property "AnimationNodeList" missing -FAIL AnimationNodeList interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "AnimationNodeList" expected property "AnimationNodeList" missing -FAIL AnimationNodeList interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "AnimationNodeList" expected property "AnimationNodeList" missing -FAIL AnimationNodeList interface: attribute length assert_own_property: self does not have own property "AnimationNodeList" expected property "AnimationNodeList" missing -FAIL AnimationNodeList interface: operation item(unsigned long) assert_own_property: self does not have own property "AnimationNodeList" expected property "AnimationNodeList" missing -FAIL SequenceEffect interface: existence and properties of interface object assert_own_property: self does not have own property "SequenceEffect" expected property "SequenceEffect" missing -FAIL SequenceEffect interface object length assert_own_property: self does not have own property "SequenceEffect" expected property "SequenceEffect" missing -FAIL SequenceEffect interface object name assert_own_property: self does not have own property "SequenceEffect" expected property "SequenceEffect" missing -FAIL SequenceEffect interface: existence and properties of interface prototype object assert_own_property: self does not have own property "SequenceEffect" expected property "SequenceEffect" missing -FAIL SequenceEffect interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "SequenceEffect" expected property "SequenceEffect" missing -FAIL SequenceEffect interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "SequenceEffect" expected property "SequenceEffect" missing -FAIL SequenceEffect interface: operation clone() assert_own_property: self does not have own property "SequenceEffect" expected property "SequenceEffect" missing -PASS AnimationPlaybackEvent interface: existence and properties of interface object -PASS AnimationPlaybackEvent interface object length -PASS AnimationPlaybackEvent interface object name -PASS AnimationPlaybackEvent interface: existence and properties of interface prototype object -PASS AnimationPlaybackEvent interface: existence and properties of interface prototype object's "constructor" property -PASS AnimationPlaybackEvent interface: existence and properties of interface prototype object's @@unscopables property -PASS AnimationPlaybackEvent interface: attribute currentTime -PASS AnimationPlaybackEvent interface: attribute timelineTime -PASS AnimationPlaybackEvent must be primary interface of new AnimationPlaybackEvent("cancel") -PASS Stringification of new AnimationPlaybackEvent("cancel") -PASS AnimationPlaybackEvent interface: new AnimationPlaybackEvent("cancel") must inherit property "currentTime" with the proper type -PASS AnimationPlaybackEvent interface: new AnimationPlaybackEvent("cancel") must inherit property "timelineTime" with the proper type -PASS Document interface: attribute timeline -PASS Document interface: operation getAnimations() -PASS Document interface: document must inherit property "timeline" with the proper type -PASS Document interface: document must inherit property "getAnimations()" with the proper type -PASS ShadowRoot interface: operation getAnimations() -PASS ShadowRoot interface: shadowRoot must inherit property "getAnimations()" with the proper type -PASS Element interface: operation animate(object?, optional (unrestricted double or KeyframeAnimationOptions)) -PASS Element interface: operation getAnimations(optional GetAnimationsOptions) -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/scroll/scrollbar-damage-and-full-viewport-repaint-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/scroll/scrollbar-damage-and-full-viewport-repaint-expected.png deleted file mode 100644 index 0b8bc325..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/scroll/scrollbar-damage-and-full-viewport-repaint-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png deleted file mode 100644 index 3b06f5d9..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.13/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/scroll/scrollbar-damage-and-full-viewport-repaint-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/scroll/scrollbar-damage-and-full-viewport-repaint-expected.png deleted file mode 100644 index 0b8bc325..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.13/paint/invalidation/scroll/scrollbar-damage-and-full-viewport-repaint-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png deleted file mode 100644 index 3b06f5d9..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.14/fast/webgl/texImage-imageBitmap-from-blob-resize-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/week/week-picker-ax-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/week/week-picker-ax-expected.txt deleted file mode 100644 index dc2c727..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/week/week-picker-ax-expected.txt +++ /dev/null
@@ -1,79 +0,0 @@ -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -This is a testharness.js-based test. -FAIL Tests if typing an arrow key dispatches |Focus| and |MarkDirty| a11y events. promise_test: Unhandled rejection with value: "Didn't receive expected events. Got 0 Focus and 75 MarkDirty" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/table/table-continuation-outline-paint-crash-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/table/table-continuation-outline-paint-crash-expected.png deleted file mode 100644 index 42d9e0e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/fast/table/table-continuation-outline-paint-crash-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/paint/invalidation/scroll/sticky/invalidate-after-composited-scroll-with-sticky-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/paint/invalidation/scroll/sticky/invalidate-after-composited-scroll-with-sticky-expected.txt deleted file mode 100644 index 78b2dd46..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/paint/invalidation/scroll/sticky/invalidate-after-composited-scroll-with-sticky-expected.txt +++ /dev/null
@@ -1,84 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling background of LayoutView #document", - "bounds": [785, 656], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF" - }, - { - "name": "LayoutNGBlockFlow MAT id='scroller'", - "bounds": [345, 640], - "drawsContent": false, - "transform": 2 - }, - { - "name": "LayoutNGBlockFlow MAT id='scroller'", - "position": [0, 18], - "bounds": [345, 2000], - "contentsOpaqueForText": true, - "drawsContent": false, - "transform": 3 - }, - { - "name": "VerticalScrollbar", - "position": [345, 0], - "bounds": [15, 640], - "transform": 2 - }, - { - "name": "LayoutNGBlockFlow (sticky positioned) DIV id='sticky'", - "bounds": [345, 18], - "transform": 4 - }, - { - "name": "VerticalScrollbar", - "position": [785, 0], - "bounds": [15, 600] - } - ], - "transforms": [ - { - "id": 1, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, -0.1], - [0, 0, 0, 1] - ], - "origin": [188, 328] - }, - { - "id": 2, - "parent": 1, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [8, 8, 0, 1] - ], - "flattenInheritedTransform": false - }, - { - "id": 3, - "parent": 2, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [0, -35, 0, 1] - ] - }, - { - "id": 4, - "parent": 3, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [0, 35, 0, 1] - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/week/week-picker-ax-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/week/week-picker-ax-expected.txt deleted file mode 100644 index dc2c727..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/week/week-picker-ax-expected.txt +++ /dev/null
@@ -1,79 +0,0 @@ -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -This is a testharness.js-based test. -FAIL Tests if typing an arrow key dispatches |Focus| and |MarkDirty| a11y events. promise_test: Unhandled rejection with value: "Didn't receive expected events. Got 0 Focus and 75 MarkDirty" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/table/table-continuation-outline-paint-crash-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/table/table-continuation-outline-paint-crash-expected.png deleted file mode 100644 index 42d9e0e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/table/table-continuation-outline-paint-crash-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/scroll/sticky/invalidate-after-composited-scroll-with-sticky-expected.txt b/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/scroll/sticky/invalidate-after-composited-scroll-with-sticky-expected.txt deleted file mode 100644 index 78b2dd46..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/scroll/sticky/invalidate-after-composited-scroll-with-sticky-expected.txt +++ /dev/null
@@ -1,84 +0,0 @@ -{ - "layers": [ - { - "name": "Scrolling background of LayoutView #document", - "bounds": [785, 656], - "contentsOpaque": true, - "backgroundColor": "#FFFFFF" - }, - { - "name": "LayoutNGBlockFlow MAT id='scroller'", - "bounds": [345, 640], - "drawsContent": false, - "transform": 2 - }, - { - "name": "LayoutNGBlockFlow MAT id='scroller'", - "position": [0, 18], - "bounds": [345, 2000], - "contentsOpaqueForText": true, - "drawsContent": false, - "transform": 3 - }, - { - "name": "VerticalScrollbar", - "position": [345, 0], - "bounds": [15, 640], - "transform": 2 - }, - { - "name": "LayoutNGBlockFlow (sticky positioned) DIV id='sticky'", - "bounds": [345, 18], - "transform": 4 - }, - { - "name": "VerticalScrollbar", - "position": [785, 0], - "bounds": [15, 600] - } - ], - "transforms": [ - { - "id": 1, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, -0.1], - [0, 0, 0, 1] - ], - "origin": [188, 328] - }, - { - "id": 2, - "parent": 1, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [8, 8, 0, 1] - ], - "flattenInheritedTransform": false - }, - { - "id": 3, - "parent": 2, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [0, -35, 0, 1] - ] - }, - { - "id": 4, - "parent": 3, - "transform": [ - [1, 0, 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [0, 35, 0, 1] - ] - } - ] -} -
diff --git a/third_party/blink/web_tests/platform/win/compositing/overflow/clip-content-under-overflow-controls-expected.png b/third_party/blink/web_tests/platform/win/compositing/overflow/clip-content-under-overflow-controls-expected.png deleted file mode 100644 index 797fa6c1..0000000 --- a/third_party/blink/web_tests/platform/win/compositing/overflow/clip-content-under-overflow-controls-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/scrollbar-painting-expected.png b/third_party/blink/web_tests/platform/win/compositing/scrollbar-painting-expected.png deleted file mode 100644 index 797fa6c1..0000000 --- a/third_party/blink/web_tests/platform/win/compositing/scrollbar-painting-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/html/semantics/forms/the-input-element/selection-pointer-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/html/semantics/forms/the-input-element/selection-pointer-expected.txt deleted file mode 100644 index a46cb70..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/html/semantics/forms/the-input-element/selection-pointer-expected.txt +++ /dev/null
@@ -1,24 +0,0 @@ -This is a testharness.js-based test. -PASS Selecting texts across <input type=button> should not cancel selection -PASS Selecting texts across <input type=checkbox> should not cancel selection -PASS Selecting texts across <input type=color> should not cancel selection -PASS Selecting texts across <input type=date> should not cancel selection -PASS Selecting texts across <input type=datetime-local> should not cancel selection -PASS Selecting texts across <input type=email> should not cancel selection -PASS Selecting texts across <input type=file> should not cancel selection -FAIL Selecting texts across <input type=image> should not cancel selection promise_test: Unhandled rejection with value: object "Error: element click intercepted error" -PASS Selecting texts across <input type=month> should not cancel selection -PASS Selecting texts across <input type=number> should not cancel selection -PASS Selecting texts across <input type=password> should not cancel selection -PASS Selecting texts across <input type=radio> should not cancel selection -PASS Selecting texts across <input type=range> should not cancel selection -PASS Selecting texts across <input type=reset> should not cancel selection -PASS Selecting texts across <input type=search> should not cancel selection -PASS Selecting texts across <input type=submit> should not cancel selection -PASS Selecting texts across <input type=tel> should not cancel selection -PASS Selecting texts across <input type=text> should not cancel selection -PASS Selecting texts across <input type=time> should not cancel selection -PASS Selecting texts across <input type=url> should not cancel selection -PASS Selecting texts across <input type=week> should not cancel selection -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webrtc-encoded-transform/script-metadata-transform.https-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webrtc-encoded-transform/script-metadata-transform.https-expected.txt deleted file mode 100644 index 61cc9231..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/webrtc-encoded-transform/script-metadata-transform.https-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -FAIL audio exchange with transform promise_test: Unhandled rejection with value: object "ReferenceError: RTCRtpScriptTransform is not defined" -FAIL video exchange with transform promise_test: Unhandled rejection with value: object "ReferenceError: RTCRtpScriptTransform is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webrtc-encoded-transform/script-write-twice-transform.https-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webrtc-encoded-transform/script-write-twice-transform.https-expected.txt deleted file mode 100644 index 1efda1e..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/webrtc-encoded-transform/script-write-twice-transform.https-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL video exchange with write twice transform promise_test: Unhandled rejection with value: object "ReferenceError: RTCRtpScriptTransform is not defined" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/webrtc-encoded-transform/sframe-keys.https-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/webrtc-encoded-transform/sframe-keys.https-expected.txt deleted file mode 100644 index ed8b38d..0000000 --- a/third_party/blink/web_tests/platform/win/external/wpt/webrtc-encoded-transform/sframe-keys.https-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: SFrameTransform is not defined -FAIL Passing various key IDs promise_test: Unhandled rejection with value: object "ReferenceError: SFrameTransform is not defined" -FAIL Audio exchange with SFrame setup promise_test: Unhandled rejection with value: "Test timed out" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/week/week-picker-ax-expected.txt b/third_party/blink/web_tests/platform/win/fast/forms/week/week-picker-ax-expected.txt deleted file mode 100644 index dc2c727..0000000 --- a/third_party/blink/web_tests/platform/win/fast/forms/week/week-picker-ax-expected.txt +++ /dev/null
@@ -1,79 +0,0 @@ -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -CONSOLE MESSAGE: Received MarkDirty -This is a testharness.js-based test. -FAIL Tests if typing an arrow key dispatches |Focus| and |MarkDirty| a11y events. promise_test: Unhandled rejection with value: "Didn't receive expected events. Got 0 Focus and 75 MarkDirty" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win7/http/tests/security/video-poster-cross-origin-crash2-expected.txt b/third_party/blink/web_tests/platform/win7/http/tests/security/video-poster-cross-origin-crash2-expected.txt deleted file mode 100644 index 2ae8bc2..0000000 --- a/third_party/blink/web_tests/platform/win7/http/tests/security/video-poster-cross-origin-crash2-expected.txt +++ /dev/null
@@ -1,2 +0,0 @@ -CONSOLE ERROR: Access to image at 'http://localhost:8080/nonesuch.png' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. -Test passes if it doesn't crash.
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-view-box-overflow-clipped-ref.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-view-box-overflow-clipped-ref.html new file mode 100644 index 0000000..d0de4792 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-view-box-overflow-clipped-ref.html
@@ -0,0 +1,38 @@ +<!DOCTYPE html> +<title>Shared transitions: object-view-box with larger overflow (ref)</title> +<link rel="help" href="https://github.com/WICG/shared-element-transitions"> +<link rel="author" href="mailto:vmpstr@chromium.org"> +<style> +.target { + color: red; + width: 100px; + height: 100px; + contain: paint; + position: relative; + top: 50px; + left: 50px; +} +.child { + width: 123px; + height: 150px; + background: lightblue; + position: relative; + top: -10px; + left: -20px; +} +.grandchild { + width: 25px; + height: 25px; + position: relative; + top: 20px; + left: 40px; + background: green; +} +body { background: lightpink; } +</style> + +<div class=target> + <div class=child> + <div class=grandchild></div> + </div> +</div>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-view-box-overflow-clipped.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-view-box-overflow-clipped.html new file mode 100644 index 0000000..5774dde --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-view-box-overflow-clipped.html
@@ -0,0 +1,64 @@ +<!DOCTYPE html> +<html class=reftest-wait> +<title>Shared transitions: object-view-box with larger overflow</title> +<link rel="help" href="https://github.com/WICG/shared-element-transitions"> +<link rel="author" href="mailto:vmpstr@chromium.org"> +<link rel="match" href="new-content-object-view-box-overflow-clipped-ref.html"> +<script src="/common/reftest-wait.js"></script> +<style> +.target { + color: red; + width: 100px; + height: 100px; + contain: paint; + overflow-clip-margin: 10px; + position: relative; + top: 50px; + left: 50px; + page-transition-tag: target; +} +.child { + width: 123px; + height: 150px; + background: lightblue; + position: relative; + top: -10px; + left: -20px; +} +.grandchild { + width: 25px; + height: 25px; + position: relative; + top: 20px; + left: 40px; + background: green; +} + +html::page-transition-container(target) { animation-duration: 300s; } +html::page-transition-incoming-image(target) { + animation: unset; + opacity: 1; + + /* clip overflow, and verify inner contents only */ + overflow: hidden; +} +html::page-transition-outgoing-image(target) { animation: unset; opacity: 0; } + +html::page-transition-container(root) { animation: unset; opacity: 0; } +html::page-transition { background: lightpink; } +</style> + +<div class=target> + <div class=child> + <div class=grandchild></div> + </div> +</div> + +<script> +async function runTest() { + document.createDocumentTransition().start(() => + requestAnimationFrame(() => requestAnimationFrame(takeScreenshot))); +} +onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest)); +</script> +
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-view-box-overflow.html b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-view-box-overflow.html index e09b6b1..a37d1b8 100644 --- a/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-view-box-overflow.html +++ b/third_party/blink/web_tests/wpt_internal/document-transition/new-content-object-view-box-overflow.html
@@ -3,7 +3,7 @@ <title>Shared transitions: object-view-box with larger overflow</title> <link rel="help" href="https://github.com/WICG/shared-element-transitions"> <link rel="author" href="mailto:vmpstr@chromium.org"> -<link rel="match" href="old-content-object-view-box-overflow-ref.html"> +<link rel="match" href="new-content-object-view-box-overflow-ref.html"> <script src="/common/reftest-wait.js"></script> <style> .target {
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js index d78144cf..b55795c8 100644 --- a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js +++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/utils.js
@@ -39,7 +39,7 @@ } const full_url = generateURL(href, keylist); - return await sharedStorage.runURLSelectionOperation( + return await sharedStorage.selectURL( "test-url-selection-operation", [full_url], {data: {'mockResult': 0}} ); }
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/script-supports-speculationrules.html b/third_party/blink/web_tests/wpt_internal/prerender/script-supports-speculationrules.html deleted file mode 100644 index bd4f3cdb..0000000 --- a/third_party/blink/web_tests/wpt_internal/prerender/script-supports-speculationrules.html +++ /dev/null
@@ -1,21 +0,0 @@ -<!DOCTYPE html> -<html> -<title>HTMLScriptElement.supports speculationrules</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<meta name="timeout" content="long"> -<script> -test(function() { - assert_true(HTMLScriptElement.supports('speculationrules')); -}, 'HTMLScriptElement.supports returns true for \'speculationrules\''); - -test(function() { - assert_false(HTMLScriptElement.supports(' speculationrules')); - assert_false(HTMLScriptElement.supports('speculationrules ')); - assert_false(HTMLScriptElement.supports('Speculationrules')); - assert_false(HTMLScriptElement.supports('SpeculationRules')); - assert_false(HTMLScriptElement.supports('speculationRules')); - assert_false(HTMLScriptElement.supports('speculation-rules')); -}, 'HTMLScriptElement.supports returns false for unsupported types'); - -</script>
diff --git a/third_party/blink/web_tests/wpt_internal/resource-timing/resources/initiator-type-early-hints-preload.html b/third_party/blink/web_tests/wpt_internal/resource-timing/resources/initiator-type-early-hints-preload.html index b5e2dc0..10996a83 100644 --- a/third_party/blink/web_tests/wpt_internal/resource-timing/resources/initiator-type-early-hints-preload.html +++ b/third_party/blink/web_tests/wpt_internal/resource-timing/resources/initiator-type-early-hints-preload.html
@@ -5,7 +5,7 @@ <body> <script> -// From public/mojom/web_feature/web_feature.mojom +// From public/mojom/use_counter/metrics/web_feature.mojom const kEarlyHintsPreloadUseCounter = 3967; async_test((t) => {
diff --git a/third_party/blink/web_tests/wpt_internal/shadow-dom/shadow-dom-usecounter.html b/third_party/blink/web_tests/wpt_internal/shadow-dom/shadow-dom-usecounter.html index c5be021..4b7692a 100644 --- a/third_party/blink/web_tests/wpt_internal/shadow-dom/shadow-dom-usecounter.html +++ b/third_party/blink/web_tests/wpt_internal/shadow-dom/shadow-dom-usecounter.html
@@ -7,7 +7,7 @@ <input id="input-container"></input> <script type="module"> -import {WebFeature} from '/gen/third_party/blink/public/mojom/web_feature/web_feature.mojom.m.js'; +import {WebFeature} from '/gen/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.m.js'; test(() => { // Verify that aria-placeholder is counted in light DOM.
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/combined-setters-and-operations.https.html b/third_party/blink/web_tests/wpt_internal/shared_storage/combined-setters-and-operations.https.html index c03df23..d87574a9 100644 --- a/third_party/blink/web_tests/wpt_internal/shared_storage/combined-setters-and-operations.https.html +++ b/third_party/blink/web_tests/wpt_internal/shared_storage/combined-setters-and-operations.https.html
@@ -16,9 +16,9 @@ await sharedStorage.set('key0-set-from-document', 'value0'); await sharedStorage.worklet.addModule("resources/verify-storage-entries-module.js"); - await sharedStorage.runOperation("set-key0-operation"); + await sharedStorage.run("set-key0-operation"); - let uuid1 = await sharedStorage.runURLSelectionOperation( + let uuid1 = await sharedStorage.selectURL( "verify-storage-entries-url-selection-operation", [url0, url1]); attachFencedFrame(uuid1, 'opaque-ads');
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/resources/simple-module.js b/third_party/blink/web_tests/wpt_internal/shared_storage/resources/simple-module.js index 5c006449..72d42195 100644 --- a/third_party/blink/web_tests/wpt_internal/shared_storage/resources/simple-module.js +++ b/third_party/blink/web_tests/wpt_internal/shared_storage/resources/simple-module.js
@@ -12,4 +12,4 @@ } } -registerURLSelectionOperation("test-url-selection-operation", TestURLSelectionOperation); +register("test-url-selection-operation", TestURLSelectionOperation);
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/resources/verify-storage-entries-module.js b/third_party/blink/web_tests/wpt_internal/shared_storage/resources/verify-storage-entries-module.js index 86b263e..db5aead 100644 --- a/third_party/blink/web_tests/wpt_internal/shared_storage/resources/verify-storage-entries-module.js +++ b/third_party/blink/web_tests/wpt_internal/shared_storage/resources/verify-storage-entries-module.js
@@ -19,7 +19,7 @@ } } -registerOperation("set-key0-operation", SetKey0Operation); +register("set-key0-operation", SetKey0Operation); -registerURLSelectionOperation("verify-storage-entries-url-selection-operation", - VerifyStorageEntriesURLSelectionOperation); +register("verify-storage-entries-url-selection-operation", + VerifyStorageEntriesURLSelectionOperation);
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation-in-detached-frame.html b/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation-in-detached-frame.html index 61013f55..a7ef103d 100644 --- a/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation-in-detached-frame.html +++ b/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation-in-detached-frame.html
@@ -10,7 +10,13 @@ const childSharedStorage = iframe.contentWindow.sharedStorage; iframe.remove(); - return childSharedStorage.runOperation("operation1"); - }, 'runOperation when frame is detached'); + try { + await childSharedStorage.run("operation1"); + } catch (e) { + assert_equals(e.name, 'InvalidAccessError'); + return; + } + assert_unreached("did not reject"); + }, 'run() when frame is detached'); </script> </body>
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation.html b/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation.html index 65b9eea..73bdbff2 100644 --- a/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation.html +++ b/third_party/blink/web_tests/wpt_internal/shared_storage/run-operation.html
@@ -7,13 +7,13 @@ 'use strict'; promise_test(() => { - return sharedStorage.runOperation("operation1"); -}, 'runOperation'); + return sharedStorage.run("operation1"); +}, 'run()'); promise_test(() => { - return sharedStorage.runOperation("operation1", + return sharedStorage.run("operation1", {data: {'custom-key': 'custom-value'}}); -}, 'runOperation with custom data'); +}, 'run() with custom data'); </script> </body>
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html b/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html index 7c6738c..5dc945f8 100644 --- a/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html +++ b/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation-without-add-module.html
@@ -8,13 +8,13 @@ promise_test(async t => { return promise_rejects_dom(t, "OperationError", - sharedStorage.runURLSelectionOperation( + sharedStorage.selectURL( "test-url-selection-operation", ["resources/frame0.html"])); -}, 'runURLSelectionOperation without addModule'); +}, 'selectURL() without addModule'); promise_test(async t => { try { - await sharedStorage.runURLSelectionOperation( + await sharedStorage.selectURL( "test-url-selection-operation", ["1", "2", "3", "4", "5", "6", "7", "8", "9"]); } catch (e) { assert_equals(e.name, 'DataError'); @@ -22,11 +22,11 @@ return; } assert_unreached("did not reject"); -}, 'runURLSelectionOperation with urls array length too big'); +}, 'selectURL() with urls array length too big'); promise_test(async t => { try { - await sharedStorage.runURLSelectionOperation( + await sharedStorage.selectURL( "test-url-selection-operation", []); } catch (e) { assert_equals(e.name, 'DataError'); @@ -34,7 +34,7 @@ return; } assert_unreached("did not reject"); -}, 'runURLSelectionOperation with empty urls array'); +}, 'selectURL() with empty urls array'); </script> </body>
diff --git a/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation.https.html b/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation.https.html index 1cb3778..8a07d568 100644 --- a/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation.https.html +++ b/third_party/blink/web_tests/wpt_internal/shared_storage/run-url-selection-operation.https.html
@@ -16,27 +16,27 @@ await sharedStorage.worklet.addModule("resources/simple-module.js"); - let uuid0 = await sharedStorage.runURLSelectionOperation( + let uuid0 = await sharedStorage.selectURL( "test-url-selection-operation", [url0, url1], {data: {'mockResult': 0}}); assert_true(uuid0.startsWith('urn:uuid:')); attachFencedFrame(uuid0, 'opaque-ads'); const result0 = await nextValueFromServer(ancestor_key); assert_equals(result0, "frame0_loaded"); - let uuid1 = await sharedStorage.runURLSelectionOperation( + let uuid1 = await sharedStorage.selectURL( "test-url-selection-operation", [url0, url1], {data: {'mockResult': 1}}); assert_true(uuid1.startsWith('urn:uuid:')); attachFencedFrame(uuid1, 'opaque-ads'); const result1 = await nextValueFromServer(ancestor_key); assert_equals(result1, "frame1_loaded"); - let uuid2 = await sharedStorage.runURLSelectionOperation( + let uuid2 = await sharedStorage.selectURL( "test-url-selection-operation", [url0, url1], {data: {'mockResult': -1}}); assert_true(uuid2.startsWith('urn:uuid:')); attachFencedFrame(uuid2, 'opaque-ads'); const result2 = await nextValueFromServer(ancestor_key); assert_equals(result2, "frame0_loaded"); -}, 'runURLSelectionOperation'); +}, 'selectURL()'); </script> </body>
diff --git a/third_party/closure_compiler/externs/accessibility_private.js b/third_party/closure_compiler/externs/accessibility_private.js index fc8ee65..f47d88d 100644 --- a/third_party/closure_compiler/externs/accessibility_private.js +++ b/third_party/closure_compiler/externs/accessibility_private.js
@@ -285,6 +285,7 @@ TALKBACK_NOT_INSTALLED: 'talkbackNotInstalled', WINDOW_NOT_FOUND: 'windowNotFound', FAILURE: 'failure', + NEED_DEPRECATION_CONFIRMATION: 'needDeprecationConfirmation', }; /**
diff --git a/third_party/harfbuzz-ng/README.chromium b/third_party/harfbuzz-ng/README.chromium index 2098e90..b7a6c8d 100644 --- a/third_party/harfbuzz-ng/README.chromium +++ b/third_party/harfbuzz-ng/README.chromium
@@ -1,10 +1,10 @@ Name: harfbuzz-ng Short Name: harfbuzz-ng URL: http://harfbuzz.org -Version: 4.2.1-1 +Version: 4.2.1-124 CPEPrefix: cpe:/a:harfbuzz_project:harfbuzz:4.2.1 -Date: 20220425 -Revision: 6454cec085ba51cefcd12b1f8027bc4a647347d5 +Date: 20220516 +Revision: acdab17ed3507bc9524cb57bef703a983e1031cf Security Critical: yes License: MIT License File: src/COPYING
diff --git a/third_party/node/PRESUBMIT.py b/third_party/node/PRESUBMIT.py index c6822d62..7f18abb 100644 --- a/third_party/node/PRESUBMIT.py +++ b/third_party/node/PRESUBMIT.py
@@ -19,6 +19,7 @@ if any(f for f in files if f.startswith('clean_json_attrs')): tests = [path.join(cwd, 'clean_json_attrs_test.py')] - return input_api.canned_checks.RunUnitTests(input_api, output_api, tests) + return input_api.canned_checks.RunUnitTests( + input_api, output_api, tests, run_on_python2=False) return []
diff --git a/third_party/node/clean_json_attrs_test.py b/third_party/node/clean_json_attrs_test.py index a77c098..db067de 100755 --- a/third_party/node/clean_json_attrs_test.py +++ b/third_party/node/clean_json_attrs_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import clean_json_attrs import json @@ -21,7 +21,8 @@ shutil.rmtree(self._start_dir) def _read_temp_file(self, filename): - return json.loads(open(os.path.join(self._start_dir, filename)).read()) + with open(os.path.join(self._start_dir, filename)) as f: + return json.loads(f.read()) def _write_temp_file(self, filename, json_dict): with open(os.path.join(self._start_dir, filename), 'w') as f: @@ -37,7 +38,7 @@ args['attr_pattern'] = '^delete' self.assertTrue(clean_json_attrs.Clean(**args)) json_dict = self._read_temp_file('package.json') - self.assertEquals(['ignore_me', 'version'], sorted(json_dict.keys())) + self.assertEqual(['ignore_me', 'version'], sorted(json_dict.keys())) def testFilePattern(self): self._write_temp_file('clean_me.json', {'_where': '/a/b/c'}) @@ -45,8 +46,10 @@ args = self._kwargs.copy() args['file_pattern'] = '^clean_' self.assertTrue(clean_json_attrs.Clean(**args)) - self.assertEquals([], self._read_temp_file('clean_me.json').keys()) - self.assertEquals(['_args'], self._read_temp_file('ignore_me.json').keys()) + self.assertListEqual( + [], list(self._read_temp_file('clean_me.json').keys())) + self.assertListEqual( + ['_args'], list(self._read_temp_file('ignore_me.json').keys())) def testNestedKeys(self): self._write_temp_file('package.json', { @@ -62,14 +65,15 @@ }) self.assertTrue(clean_json_attrs.Clean(**self._kwargs)) json_dict = self._read_temp_file('package.json') - self.assertEquals(['nested', 'version'], sorted(json_dict.keys())) - self.assertEquals(['also'], json_dict['nested'].keys()) - self.assertEquals([], json_dict['nested']['also'].keys()) + self.assertListEqual(['nested', 'version'], sorted(json_dict.keys())) + self.assertListEqual(['also'], list(json_dict['nested'].keys())) + self.assertListEqual([], list(json_dict['nested']['also'].keys())) def testNothingToRemove(self): self._write_temp_file('package.json', {'version': '2.0.0'}) self.assertFalse(clean_json_attrs.Clean(**self._kwargs)) - self.assertEquals(['version'], self._read_temp_file('package.json').keys()) + self.assertListEqual( + ['version'], list(self._read_temp_file('package.json').keys())) def testSimple(self): self._write_temp_file('package.json', { @@ -78,7 +82,8 @@ '_where': '/some/path' }) self.assertTrue(clean_json_attrs.Clean(**self._kwargs)) - self.assertEquals(['version'], self._read_temp_file('package.json').keys()) + self.assertListEqual( + ['version'], list(self._read_temp_file('package.json').keys())) if __name__ == '__main__':
diff --git a/third_party/polymer/v1_0/PRESUBMIT.py b/third_party/polymer/v1_0/PRESUBMIT.py index 2b8e3f50..dfc4a128 100644 --- a/third_party/polymer/v1_0/PRESUBMIT.py +++ b/third_party/polymer/v1_0/PRESUBMIT.py
@@ -70,7 +70,8 @@ if any(f for f in files if f.startswith('rgbify_hex_vars')): tests.append(path.join(cwd, 'rgbify_hex_vars_test.py')) - return input_api.canned_checks.RunUnitTests(input_api, output_api, tests) + return input_api.canned_checks.RunUnitTests( + input_api, output_api, tests, run_on_python2=False) def CheckChangeOnUpload(input_api, output_api):
diff --git a/third_party/polymer/v1_0/css_strip_prefixes_test.py b/third_party/polymer/v1_0/css_strip_prefixes_test.py index e23e8df..f8ac6b0 100755 --- a/third_party/polymer/v1_0/css_strip_prefixes_test.py +++ b/third_party/polymer/v1_0/css_strip_prefixes_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright 2017 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/third_party/polymer/v1_0/rgbify_hex_vars_test.py b/third_party/polymer/v1_0/rgbify_hex_vars_test.py index d815c4be..1901e97 100755 --- a/third_party/polymer/v1_0/rgbify_hex_vars_test.py +++ b/third_party/polymer/v1_0/rgbify_hex_vars_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # 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. @@ -10,7 +10,7 @@ class RgbifyHexVarsTest(unittest.TestCase): def checkProduces(self, content, expected, **kwargs): actual = rgbify_hex_vars.Rgbify(content, **kwargs) - self.assertEquals(actual, expected) + self.assertEqual(actual, expected) def checkSame(self, content): self.checkProduces(content, content)
diff --git a/third_party/zlib/contrib/bench/zlib_bench.cc b/third_party/zlib/contrib/bench/zlib_bench.cc index 3d996462..097f14f 100644 --- a/third_party/zlib/contrib/bench/zlib_bench.cc +++ b/third_party/zlib/contrib/bench/zlib_bench.cc
@@ -146,6 +146,8 @@ stream.avail_in = (uInt)input_size; result = deflate(&stream, Z_FINISH); + if (stream.avail_in > 0) + error_exit("compress: input was not consumed", Z_DATA_ERROR); if (result == Z_STREAM_END) output_size = stream.total_out; result |= deflateEnd(&stream);
diff --git a/tools/captured_sites/control.py b/tools/captured_sites/control.py index f39829f..c104cff5 100755 --- a/tools/captured_sites/control.py +++ b/tools/captured_sites/control.py
@@ -209,6 +209,11 @@ default='', type=str, help='Location of "pipe: file') + parser.add_argument('-w', + '--wpr_verbose', + dest='wpr_verbose', + action='store_true', + help='Also include verbose WPR output.') def _add_shared_args(parser): @@ -359,6 +364,9 @@ if options.add_break_on_failure: command_args.append(_RUN_DEBUGGING_TESTS) + if options.wpr_verbose: + command_args.append('--wpr_verbose') + if options.retry_count > 0: command_args.append('--test-launcher-retry-limit=%d' % options.retry_count)
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index fb0d759..cb2a5a3 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py
@@ -100,9 +100,12 @@ request = urllib.request.Request(url) request.add_header('Accept-Encoding', 'gzip') response = urllib.request.urlopen(request) - total_size = int(response.info().get('Content-Length').strip()) + total_size = None + if 'Content-Length' in response.headers: + total_size = int(response.headers['Content-Length'].strip()) - is_gzipped = response.info().get('Content-Encoding', '').strip() == 'gzip' + is_gzipped = response.headers.get('Content-Encoding', + '').strip() == 'gzip' if is_gzipped: gzip_decode = zlib.decompressobj(zlib.MAX_WBITS + 16) @@ -118,11 +121,12 @@ chunk = gzip_decode.decompress(chunk) output_file.write(chunk) - num_dots = TOTAL_DOTS * bytes_done // total_size - sys.stdout.write('.' * (num_dots - dots_printed)) - sys.stdout.flush() - dots_printed = num_dots - if bytes_done != total_size: + if total_size is not None: + num_dots = TOTAL_DOTS * bytes_done // total_size + sys.stdout.write('.' * (num_dots - dots_printed)) + sys.stdout.flush() + dots_printed = num_dots + if total_size is not None and bytes_done != total_size: raise urllib.error.URLError("only got %d of %d bytes" % (bytes_done, total_size)) if is_gzipped:
diff --git a/tools/fuchsia/size_tests/fyi_sizes_warning.json b/tools/fuchsia/size_tests/fyi_sizes_warning.json index a08a9af..b349273 100644 --- a/tools/fuchsia/size_tests/fyi_sizes_warning.json +++ b/tools/fuchsia/size_tests/fyi_sizes_warning.json
@@ -5,6 +5,6 @@ ], "far_total_name" : "chrome_fuchsia", "size_limits" : { - "chrome_fuchsia_compressed": 41418752 + "chrome_fuchsia_compressed": 41718752 } }
diff --git a/tools/json_schema_compiler/PRESUBMIT.py b/tools/json_schema_compiler/PRESUBMIT.py index 31c26dc..84092f7 100644 --- a/tools/json_schema_compiler/PRESUBMIT.py +++ b/tools/json_schema_compiler/PRESUBMIT.py
@@ -14,10 +14,10 @@ def CheckChangeOnUpload(input_api, output_api): return input_api.canned_checks.RunUnitTestsInDirectory( input_api, output_api, '.', files_to_check=FILE_PATTERN, - skip_shebang_check=True) + run_on_python2=False) def CheckChangeOnCommit(input_api, output_api): return input_api.canned_checks.RunUnitTestsInDirectory( input_api, output_api, '.', files_to_check=FILE_PATTERN, - skip_shebang_check=True) + run_on_python2=False)
diff --git a/tools/json_schema_compiler/feature_compiler_test.py b/tools/json_schema_compiler/feature_compiler_test.py index 93c4838..6edd50ce 100755 --- a/tools/json_schema_compiler/feature_compiler_test.py +++ b/tools/json_schema_compiler/feature_compiler_test.py
@@ -365,8 +365,8 @@ 'contexts': ['webui'], }]) - with self.assertRaisesRegexp(AssertionError, - 'No default parent found for bookmarks'): + with self.assertRaisesRegex(AssertionError, + 'No default parent found for bookmarks'): c._CompileFeature('bookmarks.export', { "allowlist": ["asdf"] }) def testRealIdsDisallowedInAllowlist(self):
diff --git a/tools/json_schema_compiler/model_test.py b/tools/json_schema_compiler/model_test.py index 7ad34744..b7b2e3e 100755 --- a/tools/json_schema_compiler/model_test.py +++ b/tools/json_schema_compiler/model_test.py
@@ -121,7 +121,7 @@ def testDefaultSpecifiedRedundantly(self): test_json = CachedLoad('test/redundant_default_attribute.json') - self.assertRaisesRegexp( + self.assertRaisesRegex( model.ParseException, 'Model parse exception at:\nredundantDefaultAttribute\noptionalFalse\n' ' in path/to/redundant_default_attribute.json\n' @@ -134,7 +134,7 @@ def testReturnsAsyncMissingParametersKey(self): test_json = CachedLoad('test/returns_async_missing_parameters_key.json') - self.assertRaisesRegexp( + self.assertRaisesRegex( ValueError, 'parameters key not specified on returns_async: ' 'returnsAsyncMissingParametersKey.asyncNoParametersKey in '
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index f77fa05..f6cfc18 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -16219,6 +16219,27 @@ </description> </action> +<action name="MediaApp.PDF.DefaultApp.SwitchedAway"> + <owner>patricialor@chromium.org</owner> + <owner>backlight-swe@google.com</owner> + <description> + Records that the user used the Files App to change their default app for PDF + to a different app, including if they change it from non-MediaApp to another + non-MediaApp. Recorded only when the MediaApp is enabled as a handler for + PDF files. + </description> +</action> + +<action name="MediaApp.PDF.DefaultApp.SwitchedTo"> + <owner>patricialor@chromium.org</owner> + <owner>backlight-swe@google.com</owner> + <description> + Records that the user used the Files App to change their default app for PDF + from a different app back to MediaApp, which is the factory setting. + Recorded only when the MediaApp is enabled as a handler for PDF files. + </description> +</action> + <action name="MediaContextMenu_Controls"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 1756d52..9712f0c 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -3576,7 +3576,9 @@ <int value="44" label="Help App (Updates page)"/> <int value="45" label="Help App (Discover page)"/> <int value="46" label="Keyboard Shortcut"/> - <int value="47" label="None"/> + <int value="47" label="Open Tab"/> + <int value="48" label="None"/> + <int value="49" label="Game search"/> <int value="50" label="Personalization"/> </enum> @@ -35716,7 +35718,7 @@ </enum> <enum name="FeatureObserver"> -<!-- Generated from third_party/blink/public/mojom/web_feature/web_feature.mojom. +<!-- Generated from third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom. Called by update_use_counter_feature_enum.py.--> <int value="0" label="OBSOLETE_PageDestruction"/> @@ -40618,6 +40620,8 @@ <int value="43" label="User tapped "Hidden" in the feed management interstitial."/> + <int value="44" + label="User tapped the Follow button on the page overflow menu."/> </enum> <enum name="FeedUserCommandType"> @@ -55837,6 +55841,8 @@ <int value="-1234518922" label="ChromeLabs:disabled"/> <int value="-1234385389" label="TextFragmentColorChange:enabled"/> <int value="-1232629319" label="ResamplingScrollEvents:disabled"/> + <int value="-1232521924" + label="AutofillRemoveCardExpiryFromDownstreamSuggestion:disabled"/> <int value="-1231507397" label="NtpZeroSuggest:enabled"/> <int value="-1230678816" label="PersonalizationHub:disabled"/> <int value="-1230610048" label="SyncWifiConfigurations:disabled"/> @@ -56476,6 +56482,8 @@ <int value="-821635312" label="EyeDropper:enabled"/> <int value="-820676825" label="MessagesPreinstall:enabled"/> <int value="-820041355" label="enable-transition-compositing"/> + <int value="-819810429" + label="AutofillRemoveCardExpiryFromDownstreamSuggestion:enabled"/> <int value="-819165158" label="ScrollableTabStripButtons:enabled"/> <int value="-816984237" label="OfflinePagesAsyncDownload:enabled"/> <int value="-816895294" label="DiscoverApp:disabled"/> @@ -56754,6 +56762,7 @@ label="OmniboxUIExperimentUnboldSuggestionText:enabled"/> <int value="-633955136" label="ShowScrollableMVTOnNTPAndroid:disabled"/> <int value="-633274640" label="WebRTCPipeWireCapturer:enabled"/> + <int value="-633143294" label="MoreVideoCaptureBuffers:enabled"/> <int value="-632030508" label="NativeWindowNavButtons:disabled"/> <int value="-631740127" label="inert-visual-viewport"/> <int value="-631614101" label="CameraSystemWebApp:enabled"/> @@ -58098,6 +58107,7 @@ <int value="296215399" label="WindowsMixedReality:disabled"/> <int value="296296761" label="MediaFoundationVideoCapture:disabled"/> <int value="297095559" label="ShowBluetoothDebugLogToggle:disabled"/> + <int value="297354085" label="MoreVideoCaptureBuffers:disabled"/> <int value="297750703" label="DesktopPWAsAppIconShortcutsMenu:enabled"/> <int value="299466814" label="ChromeWhatsNewUI:enabled"/> <int value="299792415" label="OmniboxSuggestionTransparencyOptions:enabled"/> @@ -60912,6 +60922,13 @@ <int value="2" label="Unknown or invalid switch found"/> </enum> +<enum name="LoginFlowUserLoginType"> + <int value="0" label="New User Online Login"/> + <int value="1" label="Existing User Online Login"/> + <int value="2" label="User Offline Login"/> + <int value="3" label="Ephemeral User Login"/> +</enum> + <enum name="LoginIsKnownUser"> <int value="0" label="Unknown user"/> <int value="1" label="Known user"/> @@ -61752,7 +61769,7 @@ </enum> <enum name="MappedCSSProperties"> -<!-- Generated from third_party/blink/public/mojom/use_counter/css_property_id.mojom. +<!-- Generated from third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom. Called by update_use_counter_css.py.--> <int value="1" label="Total Pages Measured"/>
diff --git a/tools/metrics/histograms/metadata/bluetooth/histograms.xml b/tools/metrics/histograms/metadata/bluetooth/histograms.xml index b2a8818..2bef8c2 100644 --- a/tools/metrics/histograms/metadata/bluetooth/histograms.xml +++ b/tools/metrics/histograms/metadata/bluetooth/histograms.xml
@@ -893,6 +893,32 @@ <histogram name="Bluetooth.ChromeOS.FastPair.TotalUxPairTime.{FastPairPairingProtocol}" units="ms" expires_after="2022-09-20"> + <obsolete> + Deprecated April 2022. Use + Bluetooth.ChromeOS.FastPair.TotalUxPairTime.{FastPairPairingProtocol}2 + instead. + </obsolete> + <owner>shanefitz@google.com</owner> + <owner>julietlevesque@google.com</owner> + <owner>chromeos-cross-device-eng@google.com</owner> + <summary> + Records the time necessary to reach a terminal Fast Pair pair state, either + success or failure, after pairing begins to a device, from the user's + perspective. Time is calculated as the difference between when the user + selects to pair a device via Fast Pair, and when it reaches a pair failure + or pair succeeded state. The metric is emitted after a final pairing state + has been reached. + </summary> + <token key="FastPairPairingProtocol"> + <variant name="InitialPairingProtocol" summary="initial pairing protocol"/> + <variant name="SubsequentPairingProtocol" + summary="subsequent pairing protocol"/> + </token> +</histogram> + +<histogram + name="Bluetooth.ChromeOS.FastPair.TotalUxPairTime.{FastPairPairingProtocol}2" + units="ms" expires_after="2022-09-20"> <owner>shanefitz@google.com</owner> <owner>julietlevesque@google.com</owner> <owner>chromeos-cross-device-eng@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/local/histograms.xml b/tools/metrics/histograms/metadata/local/histograms.xml index eca17e5..0b8155f9 100644 --- a/tools/metrics/histograms/metadata/local/histograms.xml +++ b/tools/metrics/histograms/metadata/local/histograms.xml
@@ -328,49 +328,6 @@ </summary> </histogram> -<histogram name="LocalStorageContext.DatabaseOpenError" enum="LevelDBStatus" - expires_after="M87"> - <owner>mek@chromium.org</owner> - <summary> - The result of a failed attempt to open a LevelDB database for LocalStorage. - </summary> -</histogram> - -<histogram name="LocalStorageContext.DatabaseOpenError.Disk" - enum="LevelDBStatus" expires_after="M87"> - <owner>mek@chromium.org</owner> - <summary> - The result of a failed attempt to open a LevelDB database for LocalStorage - on disk. - </summary> -</histogram> - -<histogram name="LocalStorageContext.DatabaseOpenError.Memory" - enum="LevelDBStatus" expires_after="M87"> - <owner>mek@chromium.org</owner> - <summary> - The result of a failed attempt to open a LevelDB database for LocalStorage - in memory. - </summary> -</histogram> - -<histogram name="LocalStorageContext.DestroyDBResult" enum="LevelDBStatus" - expires_after="M87"> - <owner>mek@chromium.org</owner> - <summary> - The result of attempting to delete the LocalStorage database. - </summary> -</histogram> - -<histogram name="LocalStorageContext.DirectoryOpenError" - enum="PlatformFileError" expires_after="M87"> - <owner>mek@chromium.org</owner> - <summary> - The reason opening a directory for the LevelDB database that backs - LocalStorage failed. - </summary> -</histogram> - <histogram name="LocalStorageContext.OpenError" enum="LocalStorageOpenError" expires_after="M87"> <owner>mek@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/login/histograms.xml b/tools/metrics/histograms/metadata/login/histograms.xml index 99c6263..1fee147 100644 --- a/tools/metrics/histograms/metadata/login/histograms.xml +++ b/tools/metrics/histograms/metadata/login/histograms.xml
@@ -125,6 +125,27 @@ <summary>Chrome OS login failure reason.</summary> </histogram> +<histogram name="Login.Flow.{UserVisibility}.{UserCount}" + enum="LoginFlowUserLoginType" expires_after="2022-12-15"> + <owner>sherrilin@google.com</owner> + <owner>cros-lurs@google.com</owner> + <summary> + Report the type of user login and the number of it on a device. It is + triggered when a login is successful + </summary> + <token key="UserVisibility"> + <variant name="HideUsers" summary="ShowUserOnSignin policy is set false"/> + <variant name="ShowUsers" summary="ShowUserOnSignin policy is set true"/> + </token> + <token key="UserCount"> + <variant name="0" summary="0 users"/> + <variant name="1" summary="1 users"/> + <variant name="2" summary="2 users"/> + <variant name="Few" summary="3 to 5 users"/> + <variant name="Many" summary="More than 5 users"/> + </token> +</histogram> + <histogram name="Login.InvalidCombinationsOfAllowedUsersPolicies" enum="AllowedUsersPoliciesInvalidState" expires_after="2022-10-17"> <owner>emaamari@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml index 191530d..8fc4f1f6 100644 --- a/tools/metrics/histograms/metadata/optimization/histograms.xml +++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -96,6 +96,7 @@ <variants name="PageContentAnnotationsStorageType"> <variant name="ModelAnnotations" summary="Model Annotations"/> <variant name="RelatedSearches" summary="Related Searches"/> + <variant name="RemoteMetadata" summary="Remote Metadata"/> <variant name="SearchMetadata" summary="Search Metadata"/> <variant name="Unknown" summary="Unknown"/> </variants>
diff --git a/tools/metrics/histograms/metadata/power/histograms.xml b/tools/metrics/histograms/metadata/power/histograms.xml index 1930924..e020b1f 100644 --- a/tools/metrics/histograms/metadata/power/histograms.xml +++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -631,7 +631,7 @@ </token> </histogram> -<histogram name="Power.BacklightLevelOnAC" units="%" expires_after="2022-04-17"> +<histogram name="Power.BacklightLevelOnAC" units="%" expires_after="2023-05-12"> <owner>puthik@chromium.org</owner> <owner>chromeos-platform-power@google.com</owner> <summary> @@ -641,7 +641,7 @@ </histogram> <histogram name="Power.BacklightLevelOnBattery" units="%" - expires_after="2022-04-10"> + expires_after="2023-05-12"> <owner>puthik@chromium.org</owner> <owner>chromeos-platform-power@google.com</owner> <summary> @@ -651,7 +651,7 @@ </histogram> <histogram name="Power.BatteryChargeHealth" units="%" - expires_after="2022-04-24"> + expires_after="2023-05-13"> <owner>puthik@chromium.org</owner> <owner>chromeos-platform-power@google.com</owner> <summary> @@ -702,7 +702,7 @@ </histogram> <histogram name="Power.BatteryDischargeRateWhileSuspended" units="mW" - expires_after="2022-04-03"> + expires_after="2023-05-12"> <owner>puthik@chromium.org</owner> <owner>chromeos-platform-power@google.com</owner> <summary> @@ -1529,7 +1529,7 @@ </histogram> <histogram name="Power.KernelResumeTimeOnAC" units="ms" - expires_after="2021-10-17"> + expires_after="2023-05-12"> <owner>puthik@chromium.org</owner> <owner>chromeos-platform-power@google.com</owner> <summary> @@ -1567,7 +1567,7 @@ </histogram> <histogram name="Power.KeyboardBacklightLevel" units="%" - expires_after="2020-06-21"> + expires_after="2023-05-12"> <owner>tbroch@chromium.org</owner> <summary> The level of the keyboard backlight as a percentage. Sampled every 30 @@ -1829,7 +1829,7 @@ </histogram> <histogram name="Power.SuspendAttempt" enum="SuspendAttempt" - expires_after="2022-04-17"> + expires_after="2023-05-12"> <owner>puthik@chromium.org</owner> <owner>chromeos-platform-power@google.com</owner> <summary> @@ -1840,7 +1840,7 @@ </histogram> <histogram name="Power.SuspendAttemptsBeforeCancel" units="units" - expires_after="2022-04-24"> + expires_after="2023-05-12"> <owner>puthik@chromium.org</owner> <owner>chromeos-platform-power@google.com</owner> <summary> @@ -1852,7 +1852,7 @@ </histogram> <histogram name="Power.SuspendAttemptsBeforeSuccess" units="units" - expires_after="2022-04-24"> + expires_after="2023-05-12"> <owner>puthik@chromium.org</owner> <owner>chromeos-platform-power@google.com</owner> <summary> @@ -1863,7 +1863,7 @@ </histogram> <histogram name="Power.SuspendResult" enum="SuspendResult" - expires_after="2022-04-24"> + expires_after="2023-05-12"> <owner>puthik@chromium.org</owner> <owner>chromeos-platform-power@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/update_use_counter_css.py b/tools/metrics/histograms/update_use_counter_css.py index 5b1b78e..5d4204e 100755 --- a/tools/metrics/histograms/update_use_counter_css.py +++ b/tools/metrics/histograms/update_use_counter_css.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # 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. @@ -22,7 +22,7 @@ USE_COUNTER_MOJOM_PATH = 'third_party/blink/public/mojom/use_counter/'\ - 'css_property_id.mojom' + 'metrics/css_property_id.mojom' def EnumToCssProperty(enum_name):
diff --git a/tools/metrics/histograms/update_use_counter_feature_enum.py b/tools/metrics/histograms/update_use_counter_feature_enum.py index fc58d2c..566c0c1 100755 --- a/tools/metrics/histograms/update_use_counter_feature_enum.py +++ b/tools/metrics/histograms/update_use_counter_feature_enum.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # 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. @@ -34,7 +34,7 @@ 'https://github.com/GoogleChrome/chromium-dashboard') options, args = parser.parse_args() - source_path = 'third_party/blink/public/mojom/web_feature/web_feature.mojom' + source_path = 'third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom' START_MARKER = '^enum WebFeature {' END_MARKER = '^kNumberOfFeatures'
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 9852ac4..7bcf3d50e 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -13,16 +13,16 @@ "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "mac": { - "hash": "6176023ff9a8f24132ab890f4f26b851dab0c770", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/d09ebb9e2ba6d6d26640dfb9d19fdf9412d233c2/trace_processor_shell" + "hash": "c9426d0d1a9450a88de0a409b4426b078ae5040a", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/378c48e919baf08561d11f8261629bf007779131/trace_processor_shell" }, "mac_arm64": { "hash": "e1ad4861384b06d911a65f035317914b8cc975c6", "full_remote_path": "perfetto-luci-artifacts/v25.0/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "992b1a7cb10510d33c7d65a1efbaa21e23628671", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/d09ebb9e2ba6d6d26640dfb9d19fdf9412d233c2/trace_processor_shell" + "hash": "6aac32f5f073df525fd01c1fa8560b8835ee2507", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/378c48e919baf08561d11f8261629bf007779131/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/perf/process_perf_results.py b/tools/perf/process_perf_results.py index c5f2d2d..3e9ce15b 100755 --- a/tools/perf/process_perf_results.py +++ b/tools/perf/process_perf_results.py
@@ -5,6 +5,7 @@ from __future__ import print_function +from __future__ import absolute_import import argparse import collections import json @@ -16,6 +17,7 @@ import tempfile import time import uuid +import six logging.basicConfig( level=logging.INFO, @@ -102,7 +104,7 @@ '--perf-dashboard-machine-group', _GetMachineGroup(build_properties) ] buildbucket = build_properties.get('buildbucket', {}) - if isinstance(buildbucket, basestring): + if isinstance(buildbucket, six.string_types): buildbucket = json.loads(buildbucket) if 'build' in buildbucket: @@ -296,7 +298,7 @@ # the lists were written to. for directory in benchmark_directory_list: benchmark_name = _get_benchmark_name(directory) - if benchmark_name in benchmark_directory_map.keys(): + if benchmark_name in benchmark_directory_map: benchmark_directory_map[benchmark_name].append(directory) else: benchmark_directory_map[benchmark_name] = [directory]
diff --git a/tools/perf/process_perf_results_unittest.py b/tools/perf/process_perf_results_unittest.py index 1f16652..aeb2089 100755 --- a/tools/perf/process_perf_results_unittest.py +++ b/tools/perf/process_perf_results_unittest.py
@@ -3,6 +3,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +from __future__ import absolute_import import json import os import shutil @@ -136,7 +137,7 @@ filename[UUID_SIZE:]: os.stat(os.path.join( output_results_dir, filename)).st_size for filename in os.listdir(output_results_dir)} - self.assertEquals(32, len(output_results)) + self.assertEqual(32, len(output_results)) self.assertLess(10 << 10, output_results["power.desktop.reference"]) self.assertLess(10 << 10, output_results["blink_perf.image_decoder"]) @@ -179,41 +180,43 @@ self.assertLess(10 << 10, output_results["octane"]) self.assertLess(10 << 10, output_results["speedometer.reference"]) - self.assertEquals(return_code, 1) - self.assertEquals(benchmark_upload_result_map, + self.assertEqual(return_code, 1) + self.assertEqual( + benchmark_upload_result_map, { - "power.desktop.reference": True, - "blink_perf.image_decoder": True, - "octane.reference": True, - "power.desktop": True, - "speedometer-future": True, - "blink_perf.owp_storage": True, - "memory.desktop": True, - "wasm": True, - "dummy_benchmark.histogram_benchmark_1": True, - "dummy_benchmark.histogram_benchmark_1.reference": True, - "wasm.reference": True, - "speedometer": True, - "memory.long_running_idle_gmail_tbmv2": True, - "v8.runtime_stats.top_25": True, - "dummy_benchmark.noisy_benchmark_1": True, - "blink_perf.svg": True, - "v8.runtime_stats.top_25.reference": True, - "jetstream.reference": True, - "jetstream": True, - "speedometer2-future.reference": True, - "speedometer2-future": False, # Only this fails due to malformed data - "blink_perf.svg.reference": True, - "blink_perf.image_decoder.reference": True, - "power.idle_platform.reference": True, - "power.idle_platform": True, - "dummy_benchmark.noisy_benchmark_1.reference": True, - "speedometer-future.reference": True, - "memory.long_running_idle_gmail_tbmv2.reference": True, - "memory.desktop.reference": True, - "blink_perf.owp_storage.reference": True, - "octane": True, - "speedometer.reference": True + "power.desktop.reference": True, + "blink_perf.image_decoder": True, + "octane.reference": True, + "power.desktop": True, + "speedometer-future": True, + "blink_perf.owp_storage": True, + "memory.desktop": True, + "wasm": True, + "dummy_benchmark.histogram_benchmark_1": True, + "dummy_benchmark.histogram_benchmark_1.reference": True, + "wasm.reference": True, + "speedometer": True, + "memory.long_running_idle_gmail_tbmv2": True, + "v8.runtime_stats.top_25": True, + "dummy_benchmark.noisy_benchmark_1": True, + "blink_perf.svg": True, + "v8.runtime_stats.top_25.reference": True, + "jetstream.reference": True, + "jetstream": True, + "speedometer2-future.reference": True, + "speedometer2-future": + False, # Only this fails due to malformed data + "blink_perf.svg.reference": True, + "blink_perf.image_decoder.reference": True, + "power.idle_platform.reference": True, + "power.idle_platform": True, + "dummy_benchmark.noisy_benchmark_1.reference": True, + "speedometer-future.reference": True, + "memory.long_running_idle_gmail_tbmv2.reference": True, + "memory.desktop.reference": True, + "blink_perf.owp_storage.reference": True, + "octane": True, + "speedometer.reference": True })
diff --git a/tools/privacy_budget/blink_apis/BUILD.gn b/tools/privacy_budget/blink_apis/BUILD.gn index 31d2bc2..e87e843 100644 --- a/tools/privacy_budget/blink_apis/BUILD.gn +++ b/tools/privacy_budget/blink_apis/BUILD.gn
@@ -34,7 +34,7 @@ rebase_path(output_data_file, root_build_dir), "--web_feature_mojom", rebase_path( - "//third_party/blink/public/mojom/web_feature/web_feature.mojom", + "//third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom", root_build_dir), "--path", string_join(":",
diff --git a/tools/resources/PRESUBMIT.py b/tools/resources/PRESUBMIT.py index 12fccbe..2c66d04 100644 --- a/tools/resources/PRESUBMIT.py +++ b/tools/resources/PRESUBMIT.py
@@ -23,6 +23,6 @@ return input_api.canned_checks.RunUnitTests(input_api, output_api, tests, - skip_shebang_check=True) + run_on_python2=False) return []
diff --git a/ui/accessibility/platform/BUILD.gn b/ui/accessibility/platform/BUILD.gn index 0e455cf..5203c533 100644 --- a/ui/accessibility/platform/BUILD.gn +++ b/ui/accessibility/platform/BUILD.gn
@@ -110,8 +110,10 @@ "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.accessibility.semantics", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.math", "//third_party/fuchsia-sdk/sdk/pkg/inspect", + "//third_party/fuchsia-sdk/sdk/pkg/scenic_cpp", "//third_party/fuchsia-sdk/sdk/pkg/sys_cpp", "//ui/aura", + "//ui/gfx/geometry", ] }
diff --git a/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_impl.cc b/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_impl.cc index 9949564..6da22793 100644 --- a/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_impl.cc +++ b/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_impl.cc
@@ -51,7 +51,6 @@ AccessibilityBridgeFuchsiaImpl::AccessibilityBridgeFuchsiaImpl( aura::Window* window, fuchsia::ui::views::ViewRef view_ref, - base::RepeatingCallback<float()> get_pixel_scale, base::RepeatingCallback<void(bool)> on_semantics_enabled, OnConnectionClosedCallback on_connection_closed, inspect::Node inspect_node) @@ -60,7 +59,7 @@ on_connection_closed_(std::move(on_connection_closed)), inspect_node_(std::move(inspect_node)) { semantic_provider_ = std::make_unique<ui::AXFuchsiaSemanticProviderImpl>( - std::move(view_ref), std::move(get_pixel_scale), this); + std::move(view_ref), this); ui::AccessibilityBridgeFuchsiaRegistry* registry = ui::AccessibilityBridgeFuchsiaRegistry::GetInstance(); @@ -252,4 +251,8 @@ base::StringPrintf("AXTree-%d", next_inspect_tree_number_++)); } +void AccessibilityBridgeFuchsiaImpl::SetPixelScale(float pixel_scale) { + semantic_provider_->SetPixelScale(pixel_scale); +} + } // namespace ui
diff --git a/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_impl.h b/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_impl.h index 780dac2..8721ff1 100644 --- a/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_impl.h +++ b/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_impl.h
@@ -35,10 +35,6 @@ // |view_ref|: The fuchsia ViewRef for the fuchsia view that corresponds to // |root_window|. // - // |get_pixel_scale|: Callback used to retrieve the pixel scale for this - // device. We use a callback here, because the correct value may not be - // available at the time of construction. - // // |on_semantics_enabled|: Callback invoked when fuchsia's accessibility // platform component requests to enable/disable semantics (e.g. when the // screen reader is toggled on/off). The boolean argument to the callback @@ -52,7 +48,6 @@ AccessibilityBridgeFuchsiaImpl( aura::Window* root_window, fuchsia::ui::views::ViewRef view_ref, - base::RepeatingCallback<float()> get_pixel_scale, base::RepeatingCallback<void(bool)> on_semantics_enabled, OnConnectionClosedCallback on_connection_closed, inspect::Node inspect_node); @@ -78,10 +73,13 @@ callback) override; void OnSemanticsEnabled(bool enabled) override; - // Test-only method to set |semantic_provider_|. + // Test-only method to set `semantic_provider_`. void set_semantic_provider_for_test( std::unique_ptr<AXFuchsiaSemanticProvider> semantic_provider); + // Propagates new pixel scale to `semantic_provider_`. + void SetPixelScale(float pixel_scale); + private: // Returns kFuchsiaRootNodeId if node_id == *root_node_id_. Otherwise, returns // node_id.
diff --git a/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_unittest.cc b/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_unittest.cc index 4de376c4c..416f9d6 100644 --- a/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_unittest.cc +++ b/ui/accessibility/platform/fuchsia/accessibility_bridge_fuchsia_unittest.cc
@@ -40,6 +40,8 @@ float GetPixelScale() const override { return pixel_scale_; } + void SetPixelScale(float pixel_scale) override { pixel_scale_ = pixel_scale; } + const absl::optional<fuchsia::accessibility::semantics::Node>& last_update() const { return last_update_; @@ -52,8 +54,6 @@ return last_event_; } - void set_pixel_scale(float pixel_scale) { pixel_scale_ = pixel_scale; } - private: absl::optional<fuchsia::accessibility::semantics::Node> last_update_; absl::optional<uint32_t> last_deletion_; @@ -99,7 +99,6 @@ auto view_ref_pair = scenic::ViewRefPair::New(); accessibility_bridge_ = std::make_unique<AccessibilityBridgeFuchsiaImpl>( /*root_window=*/nullptr, std::move(view_ref_pair.view_ref), - base::BindRepeating([]() { return 1.0f; }), base::RepeatingCallback<void(bool)>(), base::RepeatingCallback<bool(zx_status_t)>(), inspect::Node()); accessibility_bridge_->set_semantic_provider_for_test(
diff --git a/ui/accessibility/platform/fuchsia/semantic_provider.h b/ui/accessibility/platform/fuchsia/semantic_provider.h index 137b5625..338795a 100644 --- a/ui/accessibility/platform/fuchsia/semantic_provider.h +++ b/ui/accessibility/platform/fuchsia/semantic_provider.h
@@ -78,9 +78,11 @@ // Returns true if there are pending updates or deletions to be made. virtual bool HasPendingUpdates() const = 0; - // TODO(abrusher): Push updates to the semantic provider, rather than polling. // Returns the pixel scale. virtual float GetPixelScale() const = 0; + + // Sets the pixel scale. + virtual void SetPixelScale(float pixel_scale) = 0; }; } // namespace ui
diff --git a/ui/accessibility/platform/fuchsia/semantic_provider_impl.cc b/ui/accessibility/platform/fuchsia/semantic_provider_impl.cc index d1dc495..3c00e8f 100644 --- a/ui/accessibility/platform/fuchsia/semantic_provider_impl.cc +++ b/ui/accessibility/platform/fuchsia/semantic_provider_impl.cc
@@ -5,11 +5,13 @@ #include "ui/accessibility/platform/fuchsia/semantic_provider_impl.h" #include <lib/sys/cpp/component_context.h> +#include <lib/ui/scenic/cpp/commands.h> #include "base/check.h" #include "base/check_op.h" #include "base/fuchsia/fuchsia_logging.h" #include "base/fuchsia/process_context.h" +#include "ui/gfx/geometry/transform.h" namespace ui { namespace { @@ -61,10 +63,8 @@ AXFuchsiaSemanticProviderImpl::AXFuchsiaSemanticProviderImpl( fuchsia::ui::views::ViewRef view_ref, - base::RepeatingCallback<float()> get_pixel_scale, Delegate* delegate) : view_ref_(std::move(view_ref)), - get_pixel_scale_(std::move(get_pixel_scale)), delegate_(delegate), semantic_listener_binding_(this) { sys::ComponentContext* component_context = base::ComponentContextForProcess(); @@ -92,7 +92,24 @@ DCHECK(node.has_node_id()); - if (node.node_id() != kFuchsiaRootNodeId) { + // If the updated node is the root, we need to account for the pixel scale in + // its transform. + // + // Otherwise, we need to update our connectivity book-keeping. + if (node.node_id() == kFuchsiaRootNodeId) { + gfx::Transform transform; + transform.PostScale(1 / pixel_scale_, 1 / pixel_scale_); + + // Convert to fuchsia's transform type. + std::array<float, 16> mat = {}; + transform.matrix().getColMajor(mat.data()); + fuchsia::ui::gfx::Matrix4Value fuchsia_transform = + scenic::NewMatrix4Value(mat); + + // The root node will never have an offset container, so its transform will + // always be the identity matrix. Thus, we can safely overwrite it here. + node.set_node_to_container_transform(std::move(fuchsia_transform.value)); + } else { auto found_not_reachable = not_reachable_.find(node.node_id()); const bool is_not_reachable = found_not_reachable != not_reachable_.end(); const absl::optional<uint32_t> parent_node_id = @@ -211,10 +228,9 @@ void AXFuchsiaSemanticProviderImpl::HitTest(fuchsia::math::PointF local_point, HitTestCallback callback) { - float pixel_scale = get_pixel_scale_.Run(); fuchsia::math::PointF point; - point.x = local_point.x * pixel_scale; - point.y = local_point.y * pixel_scale; + point.x = local_point.x * pixel_scale_; + point.y = local_point.y * pixel_scale_; delegate_->OnHitTest(point, std::move(callback)); return; @@ -307,10 +323,24 @@ } float AXFuchsiaSemanticProviderImpl::GetPixelScale() const { - if (get_pixel_scale_) - return get_pixel_scale_.Run(); + return pixel_scale_; +} - return 1.f; +void AXFuchsiaSemanticProviderImpl::SetPixelScale(float pixel_scale) { + pixel_scale_ = pixel_scale; + + // If the root node exists, then we need to update its transform to reflect + // the new pixel scale. + if (nodes_.find(kFuchsiaRootNodeId) == nodes_.end()) + return; + + // We need to fill the `child_ids` field to prevent Update() from trampling + // our connectivity bookkeeping. Update() will handle setting the + // `node_to_container_transform` field. + fuchsia::accessibility::semantics::Node root_node_update; + root_node_update.set_node_id(kFuchsiaRootNodeId); + root_node_update.set_child_ids(nodes_[kFuchsiaRootNodeId].children); + Update(std::move(root_node_update)); } } // namespace ui
diff --git a/ui/accessibility/platform/fuchsia/semantic_provider_impl.h b/ui/accessibility/platform/fuchsia/semantic_provider_impl.h index 6652e04b..6ef97c4 100644 --- a/ui/accessibility/platform/fuchsia/semantic_provider_impl.h +++ b/ui/accessibility/platform/fuchsia/semantic_provider_impl.h
@@ -30,17 +30,14 @@ // Arguments: // |view_ref|: identifies the view providing semantics. Please consult // |fuchsia.accessibility.semantics| API documentation. - // |get_pixel_scale|: Callback to retrieve the pixel scale factor. // |delegate|: Handles semantic requests, please see Delegate class for more // documentation. Caller is responsible for ensuring that |delegate| outlives // |this|. // During construction, this class connects to // |fuchsia.accessibility.semantics.SemanticsManager| to register itself as a // semantic provider. - AXFuchsiaSemanticProviderImpl( - fuchsia::ui::views::ViewRef view_ref, - base::RepeatingCallback<float()> get_pixel_scale, - Delegate* delegate); + AXFuchsiaSemanticProviderImpl(fuchsia::ui::views::ViewRef view_ref, + Delegate* delegate); ~AXFuchsiaSemanticProviderImpl() override; // Returns true if Fuchsia has enabled semantics. @@ -54,6 +51,7 @@ fuchsia::accessibility::semantics::SemanticEvent event) override; bool HasPendingUpdates() const override; float GetPixelScale() const override; + void SetPixelScale(float pixel_scale) override; private: // Holds information about a Fuchsia Semantic Node. It contains only the @@ -152,9 +150,6 @@ fuchsia::ui::views::ViewRef view_ref_; - // Callback used to retrieve the pixel scale. - base::RepeatingCallback<float()> get_pixel_scale_; - Delegate* const delegate_; fidl::Binding<fuchsia::accessibility::semantics::SemanticListener> @@ -186,6 +181,10 @@ std::vector<Batch> batches_; bool commit_inflight_ = false; + + // The scale factor used to convert between the coordinate space chrome + // allocates for the view and the view's logical size reported by scenic. + float pixel_scale_ = 1.f; }; } // namespace ui
diff --git a/ui/accessibility/platform/fuchsia/semantic_provider_unittest.cc b/ui/accessibility/platform/fuchsia/semantic_provider_unittest.cc index 655d9fc..fbf9aa4b 100644 --- a/ui/accessibility/platform/fuchsia/semantic_provider_unittest.cc +++ b/ui/accessibility/platform/fuchsia/semantic_provider_unittest.cc
@@ -19,6 +19,7 @@ #include "base/test/bind.h" #include "base/test/task_environment.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/geometry/transform.h" namespace ui { namespace { @@ -117,8 +118,7 @@ delegate_ = std::make_unique<AXFuchsiaSemanticProviderDelegate>(); semantic_provider_ = std::make_unique<ui::AXFuchsiaSemanticProviderImpl>( - std::move(view_ref_pair.view_ref), - base::BindRepeating([]() { return 2.0f; }), delegate_.get()); + std::move(view_ref_pair.view_ref), delegate_.get()); // Spin the loop to allow registration with the SemanticsManager to be // processed. @@ -146,6 +146,7 @@ void UpdateSemanticNodes( std::vector<fuchsia::accessibility::semantics::Node> nodes) final { num_update_semantic_nodes_called_++; + node_updates_.push_back(std::move(nodes)); } void DeleteSemanticNodes(std::vector<uint32_t> node_ids) final { num_delete_semantic_nodes_called_++; @@ -157,6 +158,11 @@ callback(); } + const std::vector<std::vector<fuchsia::accessibility::semantics::Node>>& + node_updates() { + return node_updates_; + } + // Required because of |test_context_|. base::test::SingleThreadTaskEnvironment task_environment_{ base::test::SingleThreadTaskEnvironment::MainThreadType::IO}; @@ -177,6 +183,10 @@ semantic_tree_binding_; std::unique_ptr<AXFuchsiaSemanticProviderDelegate> delegate_; std::unique_ptr<ui::AXFuchsiaSemanticProviderImpl> semantic_provider_; + + // Node updates batched per API call to UpdateSemanticNodes(). + std::vector<std::vector<fuchsia::accessibility::semantics::Node>> + node_updates_; }; TEST_F(AXFuchsiaSemanticProviderTest, HandlesOnSemanticsConnectionClosed) { @@ -205,6 +215,8 @@ } TEST_F(AXFuchsiaSemanticProviderTest, HandlesOnHitTest) { + semantic_provider_->SetPixelScale(2.f); + // Note that the point is sent here and will be converted according to the // device scale used. Only then it gets sent to the handler, which receives // the value already with the proper scaling. @@ -490,5 +502,92 @@ EXPECT_FALSE(semantic_provider_->HasPendingUpdates()); } +TEST_F(AXFuchsiaSemanticProviderTest, UpdateScaleFactor) { + // Send an initial root node update. At this point, the pixel scale is 1, the + // root node's transform will be the identity matrix. Thus, the resulting + // update sent to fuchsia should not contain a transform. + { + Node node; + node.set_node_id(0u); + // Set child_ids to make sure they're not overwritten later. + node.set_child_ids({1u}); + semantic_provider_->Update(std::move(node)); + Node child; + child.set_node_id(1u); + semantic_provider_->Update(std::move(child)); + } + + // Spin the loop to process the queued update calls. + base::RunLoop().RunUntilIdle(); + + // Check that the first update sent to fuchsia reflects a pixel scale of 1. + { + ASSERT_EQ(node_updates().size(), 1u); + const auto& first_update_batch = node_updates()[0]; + ASSERT_EQ(first_update_batch.size(), 2u); + EXPECT_EQ(first_update_batch[0].node_id(), 0u); + const fuchsia::accessibility::semantics::Node& node = first_update_batch[0]; + ASSERT_TRUE(node.has_node_to_container_transform()); + const auto& transform = node.node_to_container_transform().matrix; + EXPECT_EQ(transform[0], 1.f); + EXPECT_EQ(transform[5], 1.f); + ASSERT_EQ(node.child_ids().size(), 1u); + EXPECT_EQ(node.child_ids()[0], 1u); + } + + // Now, set a new pixel scale != 1. This step should force an update to + // fuchsia. + const auto kPixelScale = 0.5f; + semantic_provider_->SetPixelScale(kPixelScale); + + // Spin the loop to process the queued update calls. + base::RunLoop().RunUntilIdle(); + + // Check that the root node's node_to_conatiner_transform field was set when + // the pixel scale was updated. + { + ASSERT_EQ(node_updates().size(), 2u); + const auto& second_update_batch = node_updates()[1]; + ASSERT_EQ(second_update_batch.size(), 1u); + const fuchsia::accessibility::semantics::Node& node = + second_update_batch[0]; + EXPECT_EQ(node.node_id(), 0u); + ASSERT_TRUE(node.has_node_to_container_transform()); + const auto& transform = node.node_to_container_transform().matrix; + EXPECT_EQ(transform[0], 1.f / kPixelScale); + EXPECT_EQ(transform[5], 1.f / kPixelScale); + ASSERT_EQ(node.child_ids().size(), 1u); + EXPECT_EQ(node.child_ids()[0], 1u); + } + + // Finally, send one more update, and verify that the semantic provider + // accounted for the new pixel scale in the root node's transform. + { + Node node; + node.set_node_id(0u); + node.set_child_ids({1u}); + semantic_provider_->Update(std::move(node)); + } + + // Spin the loop to process the queued update calls. + base::RunLoop().RunUntilIdle(); + + // Check that the root node's node_to_conatiner_transform field was set using + // the new pixel scale. + { + ASSERT_EQ(node_updates().size(), 3u); + const auto& third_update_batch = node_updates()[2]; + ASSERT_EQ(third_update_batch.size(), 1u); + const fuchsia::accessibility::semantics::Node& node = third_update_batch[0]; + EXPECT_EQ(node.node_id(), 0u); + ASSERT_TRUE(node.has_node_to_container_transform()); + const auto& transform = node.node_to_container_transform().matrix; + EXPECT_EQ(transform[0], 1.f / kPixelScale); + EXPECT_EQ(transform[5], 1.f / kPixelScale); + ASSERT_EQ(node.child_ids().size(), 1u); + EXPECT_EQ(node.child_ids()[0], 1u); + } +} + } // namespace } // namespace ui
diff --git a/ui/aura/client/aura_constants.cc b/ui/aura/client/aura_constants.cc index bea5795..409191bb 100644 --- a/ui/aura/client/aura_constants.cc +++ b/ui/aura/client/aura_constants.cc
@@ -68,18 +68,14 @@ kParentNativeViewAccessibleKey, nullptr) DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::Size, kPreferredSize, nullptr) -DEFINE_UI_CLASS_PROPERTY_KEY(ui::WindowShowState, - kPreMinimizedShowStateKey, - ui::SHOW_STATE_DEFAULT) -DEFINE_UI_CLASS_PROPERTY_KEY(ui::WindowShowState, - kPreFullscreenShowStateKey, - ui::SHOW_STATE_DEFAULT) DEFINE_UI_CLASS_PROPERTY_KEY(int, kResizeBehaviorKey, kResizeBehaviorCanResize) DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(gfx::Rect, kRestoreBoundsKey, nullptr) DEFINE_UI_CLASS_PROPERTY_KEY(ui::WindowShowState, kShowStateKey, ui::SHOW_STATE_DEFAULT) -DEFINE_UI_CLASS_PROPERTY_KEY(bool, kIsRestoringKey, false) +DEFINE_UI_CLASS_PROPERTY_KEY(ui::WindowShowState, + kRestoreShowStateKey, + ui::SHOW_STATE_NORMAL) DEFINE_UI_CLASS_PROPERTY_KEY(bool, kSkipImeProcessing, false) DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(std::u16string, kTitleKey, nullptr) DEFINE_UI_CLASS_PROPERTY_KEY(int, kTopViewInset, 0)
diff --git a/ui/aura/client/aura_constants.h b/ui/aura/client/aura_constants.h index 932f168..abf3c63e 100644 --- a/ui/aura/client/aura_constants.h +++ b/ui/aura/client/aura_constants.h
@@ -135,18 +135,6 @@ // A property key to store the preferred size of the window. AURA_EXPORT extern const WindowProperty<gfx::Size*>* const kPreferredSize; -// A property key to store ui::WindowShowState for restoring a window from -// minimized show state. -// Used in Ash to remember the show state before the window was minimized. -AURA_EXPORT extern const WindowProperty<ui::WindowShowState>* const - kPreMinimizedShowStateKey; - -// A property key to store ui::WindowShowState for restoring a window from -// fullscreen show state. -// Used in Ash to remember the show state before the window was fullscreen. -AURA_EXPORT extern const WindowProperty<ui::WindowShowState>* const - kPreFullscreenShowStateKey; - // A property key to store the resize behavior, which is a bitmask of the // ResizeBehavior values. AURA_EXPORT extern const WindowProperty<int>* const kResizeBehaviorKey; @@ -160,14 +148,10 @@ AURA_EXPORT extern const WindowProperty<ui::WindowShowState>* const kShowStateKey; -// A property key to indicate if a window is currently being restored. Normally -// restoring a window equals to changing window's state to normal window state. -// This property will be used in ash to decide if we should use window state -// restore stack to decide which window state the window should restore back to, -// and it's not unnecessarily always the normal window state. As an example, -// unminimizing a window will restore the window back to its pre-minimized -// window state. -AURA_EXPORT extern const WindowProperty<bool>* const kIsRestoringKey; +// A property key to store ui::WindowShowState for a window to restore back to +// from the current window show state. +AURA_EXPORT extern const WindowProperty<ui::WindowShowState>* const + kRestoreShowStateKey; // A property key to store key event dispatch policy. The default value is // false, which means IME receives a key event in PREDISPATCH phace before a
diff --git a/ui/base/models/dialog_model.cc b/ui/base/models/dialog_model.cc index 8985208..8d5c0ad 100644 --- a/ui/base/models/dialog_model.cc +++ b/ui/base/models/dialog_model.cc
@@ -58,15 +58,25 @@ return *this; } -DialogModel::Builder& DialogModel::Builder::AddDialogExtraButton( +DialogModel::Builder& DialogModel::Builder::AddExtraButton( base::RepeatingCallback<void(const Event&)> callback, std::u16string label, const DialogModelButton::Params& params) { + DCHECK(!model_->extra_button_); + DCHECK(!model_->extra_link_); model_->extra_button_.emplace(model_->GetPassKey(), model_.get(), std::move(callback), std::move(label), params); return *this; } +DialogModel::Builder& DialogModel::Builder::AddExtraLink( + ui::DialogModelLabel::Link link) { + DCHECK(!model_->extra_button_); + DCHECK(!model_->extra_link_); + model_->extra_link_.emplace(std::move(link)); + return *this; +} + DialogModel::Builder& DialogModel::Builder::SetInitiallyFocusedField( int unique_id) { // This must be called with unique_id >= 0 (-1 is "no ID").
diff --git a/ui/base/models/dialog_model.h b/ui/base/models/dialog_model.h index 2378b565b4..dd36cad 100644 --- a/ui/base/models/dialog_model.h +++ b/ui/base/models/dialog_model.h
@@ -192,11 +192,14 @@ // Use of the extra button in new dialogs are discouraged. If this is deemed // necessary please double-check with UX before adding any new dialogs with // them. - Builder& AddDialogExtraButton( + Builder& AddExtraButton( base::RepeatingCallback<void(const Event&)> callback, std::u16string label, const DialogModelButton::Params& params = DialogModelButton::Params()); + // Adds an extra link to the dialog. + Builder& AddExtraLink(ui::DialogModelLabel::Link link); + // Adds body text. See DialogModel::AddBodyText(). Builder& AddBodyText(const DialogModelLabel& label) { model_->AddBodyText(label); @@ -371,6 +374,10 @@ return extra_button_.has_value() ? &extra_button_.value() : nullptr; } + DialogModelLabel::Link* extra_link(base::PassKey<DialogModelHost>) { + return extra_link_.has_value() ? &extra_link_.value() : nullptr; + } + bool close_on_deactivate(base::PassKey<DialogModelHost>) const { return close_on_deactivate_; } @@ -406,6 +413,7 @@ absl::optional<DialogModelButton> ok_button_; absl::optional<DialogModelButton> cancel_button_; absl::optional<DialogModelButton> extra_button_; + absl::optional<DialogModelLabel::Link> extra_link_; base::OnceClosure accept_action_callback_; base::OnceClosure cancel_action_callback_;
diff --git a/ui/base/models/dialog_model_unittest.cc b/ui/base/models/dialog_model_unittest.cc index 77d425f..242ba15 100644 --- a/ui/base/models/dialog_model_unittest.cc +++ b/ui/base/models/dialog_model_unittest.cc
@@ -55,12 +55,12 @@ // dialogs are supported. auto host = std::make_unique<TestDialogModelHost>( DialogModel::Builder() - .AddDialogExtraButton( - base::BindLambdaForTesting([&](const Event& event) { - ++callback_count; - last_event = std::make_unique<KeyEvent>(*event.AsKeyEvent()); - }), - std::u16string()) + .AddExtraButton(base::BindLambdaForTesting([&](const Event& event) { + ++callback_count; + last_event = + std::make_unique<KeyEvent>(*event.AsKeyEvent()); + }), + std::u16string()) .Build()); KeyEvent first_event(ET_KEY_PRESSED, VKEY_RETURN, EF_NONE); @@ -101,7 +101,7 @@ case TestDialogModelHost::ButtonId::kExtra: // Wrap the callback into a repeating callback that'll only be called // once so the same verification can be used for the extra button. - builder.AddDialogExtraButton( + builder.AddExtraButton( base::BindRepeating( [](base::OnceClosure* callback, const Event& event) { std::move(*callback).Run();
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc index 39771c3..67d7e641 100644 --- a/ui/compositor/compositor.cc +++ b/ui/compositor/compositor.cc
@@ -755,11 +755,6 @@ ReportMetricsForTracker(pair.first, std::move(pair.second)); } -void Compositor::ReportEventLatency( - std::vector<cc::EventLatencyTracker::LatencyData> latencies) { - // TODO(crbug.com/1321193): Report EventLatency as appropriate. -} - void Compositor::DidReceiveCompositorFrameAck() { ++activated_frame_count_; for (auto& observer : observer_list_)
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h index 2f6d2ee..80bff73a 100644 --- a/ui/compositor/compositor.h +++ b/ui/compositor/compositor.h
@@ -384,8 +384,6 @@ void DidObserveFirstScrollDelay( base::TimeDelta first_scroll_delay, base::TimeTicks first_scroll_timestamp) override {} - void ReportEventLatency( - std::vector<cc::EventLatencyTracker::LatencyData> latencies) override; // cc::LayerTreeHostSingleThreadClient implementation. void DidSubmitCompositorFrame() override;
diff --git a/ui/file_manager/integration_tests/file_manager/zip_files.js b/ui/file_manager/integration_tests/file_manager/zip_files.js index 96f7e03d7..3aeef16 100644 --- a/ui/file_manager/integration_tests/file_manager/zip_files.js +++ b/ui/file_manager/integration_tests/file_manager/zip_files.js
@@ -643,3 +643,50 @@ await remoteCall.waitForElement( appId, '[command="#extract-all"][role="menuitem"]'); }; + +/** + * Tests extraction of a ZIP archive fails if there's not enough disk space. + */ +testcase.zipExtractNotEnoughSpace = async () => { + const entry = ENTRIES.zipExtArchive; // 120TB fake archive. + + // Open files app. + const appId = await setupAndWaitUntilReady(RootPath.DOWNLOADS, [entry], []); + + // Select the file. + chrome.test.assertTrue(await remoteCall.callRemoteTestUtil( + 'selectFile', appId, [entry.nameText])); + + // Right-click the selected file. + chrome.test.assertTrue( + !!await remoteCall.callRemoteTestUtil( + 'fakeMouseRightClick', appId, ['.table-row[selected]']), + 'fakeMouseRightClick failed'); + + // Check: the context menu should appear. + await remoteCall.waitForElement(appId, '#file-context-menu:not([hidden])'); + + // Click the 'Extract all' menu command. + const extract = '[command="#extract-all"]'; + chrome.test.assertTrue( + !!await remoteCall.callRemoteTestUtil('fakeMouseClick', appId, [extract]), + 'fakeMouseClick failed'); + + // Check: Error panel appears. + let element = {}; + const caller = getCaller(); + await repeatUntil(async () => { + element = await remoteCall.waitForElement( + appId, ['#progress-panel', 'xf-panel-item']); + const expectedMsg = 'Extract operation failed. An error occurred.'; + const actualMsg = element.attributes['primary-text']; + + if (actualMsg === expectedMsg) { + return; + } + + return pending( + caller, + `Expected feedback panel msg: "${expectedMsg}", got "${actualMsg}"`); + }); +};
diff --git a/ui/file_manager/integration_tests/test_util.js b/ui/file_manager/integration_tests/test_util.js index ddf2602..53eaef6 100644 --- a/ui/file_manager/integration_tests/test_util.js +++ b/ui/file_manager/integration_tests/test_util.js
@@ -1071,6 +1071,17 @@ typeText: 'Zip archive' }), + zipExtArchive: new TestEntryInfo({ + type: EntryType.FILE, + sourceFileName: 'tera.zip', + targetPath: 'tera.zip', + mimeType: 'application/x-zip', + lastModifiedTime: 'Apr 6, 2022, 1:00 AM', + nameText: 'tera.zip', + sizeText: '250 bytes', + typeText: 'Zip archive' + }), + debPackage: new TestEntryInfo({ type: EntryType.FILE, sourceFileName: 'package.deb',
diff --git a/ui/ozone/platform/wayland/host/wayland_surface.cc b/ui/ozone/platform/wayland/host/wayland_surface.cc index 59852bd..59a4d10 100644 --- a/ui/ozone/platform/wayland/host/wayland_surface.cc +++ b/ui/ozone/platform/wayland/host/wayland_surface.cc
@@ -557,6 +557,23 @@ wl_fixed_from_double(viewport_src_dip.height()) == 0) { LOG(ERROR) << "Sending viewport src with width/height zero will result " "in wayland disconnection"; + // TODO(crbug.com/1325344): Resolve why this viewport size ends up being + // zero and remove the fix below. + LOG(ERROR) << "viewport_src_dip=" << viewport_src_dip.ToString() + << " pending_state_.crop=" << pending_state_.crop.ToString() + << " bounds=" << bounds.ToString() + << " pending_state_.buffer_size_px=" + << pending_state_.buffer_size_px.ToString(); + constexpr wl_fixed_t kViewportSizeMin = 1; + const float kViewPortSizeMinFloat = + static_cast<float>(wl_fixed_to_double(kViewportSizeMin)); + LOG(ERROR) + << "Limiting viewport_src_dip size to be non zero with a minium of " + << kViewportSizeMin; + viewport_src_dip.set_width( + std::max(viewport_src_dip.width(), kViewPortSizeMinFloat)); + viewport_src_dip.set_height( + std::max(viewport_src_dip.height(), kViewPortSizeMinFloat)); } src_to_set[0] = wl_fixed_from_double(viewport_src_dip.x()), src_to_set[1] = wl_fixed_from_double(viewport_src_dip.y());
diff --git a/ui/views/bubble/bubble_dialog_model_host.cc b/ui/views/bubble/bubble_dialog_model_host.cc index 6bfe879..fc496e8 100644 --- a/ui/views/bubble/bubble_dialog_model_host.cc +++ b/ui/views/bubble/bubble_dialog_model_host.cc
@@ -287,12 +287,19 @@ // TODO(pbos): Consider refactoring ::SetExtraView() so it can be called after // the Widget is created and still be picked up. Moving this to // OnWidgetInitialized() will not work until then. - auto* extra_button = model_->extra_button(GetPassKey()); - if (extra_button) { + if (ui::DialogModelButton* extra_button = + model_->extra_button(GetPassKey())) { + DCHECK(!model_->extra_link(GetPassKey())); SetExtraView(std::make_unique<MdTextButton>( base::BindRepeating(&ui::DialogModelButton::OnPressed, base::Unretained(extra_button), GetPassKey()), extra_button->label(GetPassKey()))); + } else if (ui::DialogModelLabel::Link* extra_link = + model_->extra_link(GetPassKey())) { + auto link = std::make_unique<views::Link>( + l10n_util::GetStringUTF16(extra_link->message_id)); + link->SetCallback(extra_link->callback); + SetExtraView(std::move(link)); } SetButtons(button_mask);
diff --git a/ui/views/controls/native/native_view_host.cc b/ui/views/controls/native/native_view_host.cc index 09a21bc..eee9604 100644 --- a/ui/views/controls/native/native_view_host.cc +++ b/ui/views/controls/native/native_view_host.cc
@@ -245,17 +245,16 @@ } bool NativeViewHost::OnMousePressed(const ui::MouseEvent& event) { - NOTREACHED() - << "This view is not expected to receive events directly. Event " - "targeting should find the native view as target window instead of " - "the view hierarchy. This is likely due to an overlapping View that " - "receives but is not handling this event. See crbug.com/1263413 and " - "Widget::ShouldDescendIntoChildForEventHandling() for some more " - "leads. If the overlapping view was not intended to receive events, " - "call SetCanProcessEventsWithinSubtree(false) on the overlapping " - "View that paints to a layer. If it's intended to receive some, but " - "not this event, event targeting needs to be fixed for this case.\n" - << GetViewDebugInfo(this); + // In the typical case the attached NativeView receives the events directly + // from the system and this function is not called. There are scenarios + // where that may not happen. For example, if the NativeView is configured + // not to receive events, then this function will be called. An additional + // scenario is if the WidgetDelegate overrides + // ShouldDescendIntoChildForEventHandling(). In that case the NativeView + // will not receive the events, and this function will be called. Regardless, + // this function does not need to forward to the NativeView, because it is + // expected to be done by the system, and the only cases where this is called + // is if the NativeView should not receive events. return View::OnMousePressed(event); }
diff --git a/ui/views/controls/native/native_view_host_aura_unittest.cc b/ui/views/controls/native/native_view_host_aura_unittest.cc index 2e6c6d9..b1d7084 100644 --- a/ui/views/controls/native/native_view_host_aura_unittest.cc +++ b/ui/views/controls/native/native_view_host_aura_unittest.cc
@@ -17,6 +17,7 @@ #include "ui/base/cursor/cursor.h" #include "ui/base/cursor/mojom/cursor_type.mojom-shared.h" #include "ui/events/event_utils.h" +#include "ui/events/test/event_generator.h" #include "ui/views/controls/native/native_view_host.h" #include "ui/views/controls/native/native_view_host_test_base.h" #include "ui/views/focus/focus_manager.h" @@ -595,4 +596,53 @@ EXPECT_EQ(gfx::Size(200, 200), window->bounds().size()); } +class WidgetDelegateForShouldDescendIntoChildForEventHandling + : public WidgetDelegate { + public: + void set_window(aura::Window* window) { window_ = window; } + + bool ShouldDescendIntoChildForEventHandling( + gfx::NativeView child, + const gfx::Point& location) override { + return child != window_; + } + + private: + aura::Window* window_ = nullptr; +}; + +TEST_F(NativeViewHostAuraTest, ShouldDescendIntoChildForEventHandling) { + WidgetDelegateForShouldDescendIntoChildForEventHandling widget_delegate; + CreateTopLevel(&widget_delegate); + toplevel()->SetSize(gfx::Size(200, 200)); + toplevel()->Show(); + + std::unique_ptr<aura::Window> window = + std::make_unique<aura::Window>(nullptr); + window->Init(ui::LAYER_NOT_DRAWN); + window->set_owned_by_parent(false); + window->SetBounds(gfx::Rect(0, 0, 200, 200)); + window->Show(); + + widget_delegate.set_window(window.get()); + + CreateTestingHost(); + toplevel()->GetRootView()->AddChildView(host()); + host()->SetVisible(true); + host()->SetBoundsRect(gfx::Rect(0, 0, 200, 200)); + host()->Attach(window.get()); + + ui::test::EventGenerator event_generator(window->GetRootWindow()); + gfx::Point press_location(100, 100); + aura::Window::ConvertPointToTarget(toplevel()->GetNativeView(), + window->GetRootWindow(), &press_location); + event_generator.MoveMouseTo(press_location); + event_generator.PressLeftButton(); + // Because the delegate overrides ShouldDescendIntoChildForEventHandling() + // the NativeView does not get the event, but NativeViewHost will. + EXPECT_EQ(1, on_mouse_pressed_called_count()); + DestroyHost(); + DestroyTopLevel(); +} + } // namespace views
diff --git a/ui/views/controls/native/native_view_host_test_base.cc b/ui/views/controls/native/native_view_host_test_base.cc index a07c54e..1e8e4e64 100644 --- a/ui/views/controls/native/native_view_host_test_base.cc +++ b/ui/views/controls/native/native_view_host_test_base.cc
@@ -24,6 +24,12 @@ ~NativeViewHostTesting() override { owner_->host_destroyed_count_++; } + // NativeViewHost: + bool OnMousePressed(const ui::MouseEvent& event) override { + ++owner_->on_mouse_pressed_called_count_; + return NativeViewHost::OnMousePressed(event); + } + private: raw_ptr<NativeViewHostTestBase> owner_; }; @@ -37,10 +43,11 @@ ViewsTestBase::TearDown(); } -void NativeViewHostTestBase::CreateTopLevel() { +void NativeViewHostTestBase::CreateTopLevel(WidgetDelegate* widget_delegate) { toplevel_ = std::make_unique<Widget>(); Widget::InitParams toplevel_params = CreateParams(Widget::InitParams::TYPE_WINDOW); + toplevel_params.delegate = widget_delegate; toplevel_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; toplevel_->Init(std::move(toplevel_params)); }
diff --git a/ui/views/controls/native/native_view_host_test_base.h b/ui/views/controls/native/native_view_host_test_base.h index 8686c17..4f2eda4 100644 --- a/ui/views/controls/native/native_view_host_test_base.h +++ b/ui/views/controls/native/native_view_host_test_base.h
@@ -14,6 +14,7 @@ class NativeViewHost; class NativeViewHostWrapper; class Widget; +class WidgetDelegate; namespace test { @@ -31,7 +32,7 @@ void TearDown() override; // Create the |toplevel_| widget. - void CreateTopLevel(); + void CreateTopLevel(WidgetDelegate* widget_delegate = nullptr); // Create a testing |host_| that tracks destructor calls. void CreateTestingHost(); @@ -58,12 +59,16 @@ NativeViewHostWrapper* GetNativeWrapper(); + protected: + int on_mouse_pressed_called_count() { return on_mouse_pressed_called_count_; } + private: class NativeViewHostTesting; std::unique_ptr<Widget> toplevel_; std::unique_ptr<NativeViewHost> host_; int host_destroyed_count_ = 0; + int on_mouse_pressed_called_count_ = 0; }; } // namespace test
diff --git a/ui/webui/resources/PRESUBMIT.py b/ui/webui/resources/PRESUBMIT.py index c3838a4..ced44a5 100644 --- a/ui/webui/resources/PRESUBMIT.py +++ b/ui/webui/resources/PRESUBMIT.py
@@ -89,7 +89,7 @@ sources = [input_api.os_path.join('tools', 'js_modulizer_test.py')] tests = [input_api.os_path.join(presubmit_path, s) for s in sources] results += input_api.canned_checks.RunUnitTests( - input_api, output_api, tests) + input_api, output_api, tests, run_on_python2=False) return results
diff --git a/ui/webui/resources/tools/js_modulizer_test.py b/ui/webui/resources/tools/js_modulizer_test.py index d0cf6ce..0be7ca2 100755 --- a/ui/webui/resources/tools/js_modulizer_test.py +++ b/ui/webui/resources/tools/js_modulizer_test.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # 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. @@ -22,7 +22,8 @@ def _read_out_file(self, file_name): assert self._out_folder - return open(os.path.join(self._out_folder, file_name), 'rb').read() + with open (os.path.join(self._out_folder, file_name), 'rb') as f: + return f.read() def _run_test_(self, js_file, js_file_expected, namespace_rewrites=None, preserve_offsets=False): @@ -43,9 +44,9 @@ js_out_file = os.path.basename(js_file).replace('.js', '.m.js') actual_js = self._read_out_file(js_out_file) - expected_js = open( - os.path.join(_HERE_DIR, 'tests', js_file_expected), 'rb').read() - self.assertEqual(expected_js, actual_js) + with open(os.path.join(_HERE_DIR, 'tests', js_file_expected), 'rb') as f: + expected_js = f.read(); + self.assertEqual(expected_js, actual_js) def testSuccess_WithoutCrDefine(self): self._run_test_('without_cr_define.js', 'without_cr_define_expected.js')
diff --git a/ui/wm/core/window_util.cc b/ui/wm/core/window_util.cc index 8df91937..b3899607 100644 --- a/ui/wm/core/window_util.cc +++ b/ui/wm/core/window_util.cc
@@ -89,35 +89,24 @@ DCHECK(window); ui::WindowShowState current_show_state = window->GetProperty(aura::client::kShowStateKey); - bool is_fullscreen = current_show_state == ui::SHOW_STATE_FULLSCREEN; + const bool is_fullscreen = current_show_state == ui::SHOW_STATE_FULLSCREEN; if (fullscreen == is_fullscreen) return; if (fullscreen) { - // Save the previous show state so that we can correctly restore it after - // exiting the fullscreen mode. - ui::WindowShowState pre_show_state = current_show_state; - // If the previous show state is ui::SHOW_STATE_MINIMIZED, we will use - // the show state before the window was minimized. But if the window was - // fullscreen before it was minimized, we will keep the - // PreMinimizedShowState unchanged. - if (pre_show_state == ui::SHOW_STATE_MINIMIZED) { - pre_show_state = - window->GetProperty(aura::client::kPreMinimizedShowStateKey); - } - if (pre_show_state != ui::SHOW_STATE_FULLSCREEN) { - window->SetProperty(aura::client::kPreFullscreenShowStateKey, - pre_show_state); + // Save the current show state as its restore show state so that we can + // correctly restore it after exiting the fullscreen mode. + // Note `aura::client::kRestoreShowStateKey` can be overwritten later by the + // window state restore history stack on Chrome OS, see the function + // WindowState::UpdateWindowStateRestoreHistoryStack(). But We still set the + // `aura::client::kRestoreShowStateKey` here since this function is also + // used on other non-ChromeOS platforms. + if (current_show_state != ui::SHOW_STATE_MINIMIZED) { + window->SetProperty(aura::client::kRestoreShowStateKey, + current_show_state); } window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN); } else { - // TODO: change to call into Restore() function and remove - // kPreFullscreenShowStateKey key. - - ui::WindowShowState pre_fullscreen_show_state = - window->GetProperty(aura::client::kPreFullscreenShowStateKey); - DCHECK_NE(pre_fullscreen_show_state, ui::SHOW_STATE_MINIMIZED); - window->SetProperty(aura::client::kShowStateKey, pre_fullscreen_show_state); - window->ClearProperty(aura::client::kPreFullscreenShowStateKey); + Restore(window); } } @@ -130,19 +119,14 @@ } void Restore(aura::Window* window) { - window->SetProperty(aura::client::kIsRestoringKey, true); - window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); - window->ClearProperty(aura::client::kIsRestoringKey); + window->SetProperty(aura::client::kShowStateKey, + window->GetProperty(aura::client::kRestoreShowStateKey)); } void Unminimize(aura::Window* window) { - // TODO: change to call into Restore() function and remove - // kPreMinimizedShowStateKey key. DCHECK_EQ(window->GetProperty(aura::client::kShowStateKey), ui::SHOW_STATE_MINIMIZED); - window->SetProperty( - aura::client::kShowStateKey, - window->GetProperty(aura::client::kPreMinimizedShowStateKey)); + Restore(window); } aura::Window* GetActivatableWindow(aura::Window* window) {
diff --git a/weblayer/browser/autofill_assistant/weblayer_dependencies.cc b/weblayer/browser/autofill_assistant/weblayer_dependencies.cc index 17e0664b..362d52c 100644 --- a/weblayer/browser/autofill_assistant/weblayer_dependencies.cc +++ b/weblayer/browser/autofill_assistant/weblayer_dependencies.cc
@@ -83,8 +83,8 @@ return std::make_unique<WebLayerAssistantFieldTrialUtil>(); } -autofill::PersonalDataManager* WebLayerDependencies::GetPersonalDataManager() - const { +autofill::PersonalDataManager* WebLayerDependencies::GetPersonalDataManager( + content::BrowserContext* browser_context) const { // TODO(b/222671580): Add NOTREACHED? return nullptr; }
diff --git a/weblayer/browser/autofill_assistant/weblayer_dependencies.h b/weblayer/browser/autofill_assistant/weblayer_dependencies.h index 1fd3d57..3b3f8f2 100644 --- a/weblayer/browser/autofill_assistant/weblayer_dependencies.h +++ b/weblayer/browser/autofill_assistant/weblayer_dependencies.h
@@ -41,7 +41,8 @@ // Overrides CommonDependencies std::unique_ptr<::autofill_assistant::AssistantFieldTrialUtil> CreateFieldTrialUtil() const override; - autofill::PersonalDataManager* GetPersonalDataManager() const override; + autofill::PersonalDataManager* GetPersonalDataManager( + content::BrowserContext* browser_context) const override; password_manager::PasswordManagerClient* GetPasswordManagerClient( content::WebContents* web_contents) const override; std::string GetLocale() const override;