diff --git a/DEPS b/DEPS index 0dbce8a2..12842f2 100644 --- a/DEPS +++ b/DEPS
@@ -295,11 +295,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'src_internal_revision': 'fc8270585d35ff4b1d05c06fbc75fa5fb7d8d63e', + 'src_internal_revision': '1352cfbc23726d06daa6dc8320c8eea7da7ce099', # 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': 'f8cd9fe75f21d3be759cbf9491ddc582efcf1e2a', + 'skia_revision': 'dc1958e7118c351cef5adae548337f7f11746b95', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -307,7 +307,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '79ec8b3400ceeafc3e69b9bec29fa39a0e1a9a16', + 'angle_revision': '94ee620d2e2f771d350e14ca90804bf1457834d3', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -375,7 +375,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. - 'crossbench_revision': '1de2eca3495784b797d977b40b7291a4a7cd06c1', + 'crossbench_revision': 'e80b653acb5d31fa6de5079b47e61b8aaa2f83fa', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -391,7 +391,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': '7ad25e25037043f7a75e7a838a651c110b918d48', + 'devtools_frontend_revision': '668292f6e38a78c16e1877c6e9919716bd7da04d', # 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. @@ -415,11 +415,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': 'fd276573ab859ea73c18581c018a773e4e3b8902', + 'dawn_revision': 'f5267414465b15f31e7cf9d930c0c0ba50579560', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'quiche_revision': '611b64ffd0f17e96d31ff1d3e52ff1df0c9219f8', + 'quiche_revision': '446875b7172a09b60be78acf8eacb67de54815ec', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ink # and whatever else without interference from each other. @@ -850,143 +850,143 @@ 'objects': [ { # The Android libclang_rt.builtins libraries are currently only included in the Linux clang package. - 'object_name': 'Linux_x64/clang-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': '9f86993ed0ce45d14ea53c43928a1d7ec352f1c1f7fa8a54c55d93ca78d48bed', - 'size_bytes': 55784776, - 'generation': 1749626956578778, + 'object_name': 'Linux_x64/clang-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '5f69279b3697166facfc354634157e0a8a32fa6e36864200ad8a8f85add3f3f6', + 'size_bytes': 55654416, + 'generation': 1747138963230938, 'condition': '(host_os == "linux" or checkout_android) and non_git_source', }, { - 'object_name': 'Linux_x64/clang-tidy-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': '7783998e7e2d9010783e1080bbbd1bc1892977a6e6ba81464d6268869db3b6f9', - 'size_bytes': 13662996, - 'generation': 1749626956847038, + 'object_name': 'Linux_x64/clang-tidy-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '9c9cd089b46f36232d7553d03a0b30cf509f5e42b2113fe8172ba14f905b91df', + 'size_bytes': 13597708, + 'generation': 1747138963497696, 'condition': 'host_os == "linux" and checkout_clang_tidy and non_git_source', }, { - 'object_name': 'Linux_x64/clangd-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': '7c04a0d24acce8bb0250c6b212771e99c077851029e9e87389e5aa1ed800d0d9', - 'size_bytes': 13920240, - 'generation': 1749626957024098, + 'object_name': 'Linux_x64/clangd-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': 'cf580450a46e262d899c2d48fff2b6ea8f6691a6bcfc0c280f87d8b6da088e5f', + 'size_bytes': 13854788, + 'generation': 1747138963598582, 'condition': 'host_os == "linux" and checkout_clangd and non_git_source', }, { - 'object_name': 'Linux_x64/llvm-code-coverage-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': 'b7d6be309a728091cb8e609e745e854ab683142d78f7de630a85f55a798ce815', - 'size_bytes': 2311844, - 'generation': 1749626957514658, + 'object_name': 'Linux_x64/llvm-code-coverage-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '1a3488e55d62bda48d09b69fb4e5267ac64247258dc51fd9dabdb7fe5d66da4c', + 'size_bytes': 2297996, + 'generation': 1747138964068040, 'condition': 'host_os == "linux" and checkout_clang_coverage_tools and non_git_source', }, { - 'object_name': 'Linux_x64/llvmobjdump-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': '585d78b18b902e6042a90f51065717906d1ea600f2f93fea95eb4c06fd3bf3ce', - 'size_bytes': 5680112, - 'generation': 1749626957464808, + 'object_name': 'Linux_x64/llvmobjdump-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': 'efb127c69ac198284ff3622cd173e9dc4839d0bed33dbcaa96501db169607a2e', + 'size_bytes': 5701128, + 'generation': 1747138963789285, 'condition': '((checkout_linux or checkout_mac or checkout_android) and host_os == "linux") and non_git_source', }, { - 'object_name': 'Mac/clang-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': 'f8cac57592d9f34b6d43581c690cf1a561b1d984723ef846acb4763bdcb29348', - 'size_bytes': 52450752, - 'generation': 1749626959234300, + 'object_name': 'Mac/clang-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '3d83bd33ae0a0331ba8e23340023ae05174128503d94116cd8a855913fca88c7', + 'size_bytes': 52212572, + 'generation': 1747138966013176, 'condition': 'host_os == "mac" and host_cpu == "x64"', }, { - 'object_name': 'Mac/clang-mac-runtime-library-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': '4bb68cabb11f36872a2c373595fa6bb93e3c5c2cb2775451917f2aa70b63755c', - 'size_bytes': 996764, - 'generation': 1749626980736930, + 'object_name': 'Mac/clang-mac-runtime-library-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '809b6f72718d9bcbf25ad6ab80517f215ed2526435a095ee9bceb5ed40f989a2', + 'size_bytes': 993800, + 'generation': 1747138984414942, 'condition': 'checkout_mac and not host_os == "mac"', }, { - 'object_name': 'Mac/clang-tidy-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': '62a707e60fdb521ec20d93f430cf6fbfafaba1513e297c1d437aa40fc497090a', - 'size_bytes': 13779328, - 'generation': 1749626959542852, + 'object_name': 'Mac/clang-tidy-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': 'c1fd7930eadede03470cbc8d38697669c6254069da2f6bd58328a8654d68f70d', + 'size_bytes': 13699584, + 'generation': 1747138966324770, 'condition': 'host_os == "mac" and host_cpu == "x64" and checkout_clang_tidy', }, { - 'object_name': 'Mac/clangd-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': '476b22ed20947dbc2036439eac1f007a5b5be09f53fe4960e6c82b3ffd0241cc', - 'size_bytes': 15213968, - 'generation': 1749626959730099, + 'object_name': 'Mac/clangd-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '3aa82177f6e03da693d93aa9f8052fa669af1bd897359a20eaf01379db0924b8', + 'size_bytes': 15136432, + 'generation': 1747138966446697, 'condition': 'host_os == "mac" and host_cpu == "x64" and checkout_clangd', }, { - 'object_name': 'Mac/llvm-code-coverage-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': '74c7aac36f182a6662ef6f7f66d13ceac783692f75347495d6dd7277da02af23', - 'size_bytes': 2283840, - 'generation': 1749626960228506, + 'object_name': 'Mac/llvm-code-coverage-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '1f8d0d65f9d027707890c28433b0bfe29e32551008e9f3c1b9803318ede2bfc6', + 'size_bytes': 2272500, + 'generation': 1747138966854415, 'condition': 'host_os == "mac" and host_cpu == "x64" and checkout_clang_coverage_tools', }, { - 'object_name': 'Mac_arm64/clang-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': 'c4d0f7d816ffe49e8db16c27a85dc692b4bbf404d75fe0e5711e116dae9d19ef', - 'size_bytes': 44410088, - 'generation': 1749626982459682, + 'object_name': 'Mac_arm64/clang-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '2d5660c50637a7ee6e5501525e7588bb255cdfd48e792b12b86ae7113c31b8ae', + 'size_bytes': 44214476, + 'generation': 1747138986010150, 'condition': 'host_os == "mac" and host_cpu == "arm64"', }, { - 'object_name': 'Mac_arm64/clang-tidy-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': 'f2346895f4e3fac52330171313f39241b28cab40a9923608280eb679f36362bd', - 'size_bytes': 11928836, - 'generation': 1749626982775711, + 'object_name': 'Mac_arm64/clang-tidy-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': 'c17b6d7d112ff54699477d5fc7f5009e7b650d263d127cad4f8406f8df914996', + 'size_bytes': 11838956, + 'generation': 1747138986259606, 'condition': 'host_os == "mac" and host_cpu == "arm64" and checkout_clang_tidy', }, { - 'object_name': 'Mac_arm64/clangd-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': 'a3f645efa6dbdb806c8133be391f09823bf955c5402ab49269ceda31cb3dccf2', - 'size_bytes': 12184988, - 'generation': 1749626982968083, + 'object_name': 'Mac_arm64/clangd-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': 'd6c134df8273fe9c4c2b5ff5786f2ceeb9ed5f251e223e55edbc0cd7aa772e83', + 'size_bytes': 12115024, + 'generation': 1747138986359326, 'condition': 'host_os == "mac" and host_cpu == "arm64" and checkout_clangd', }, { - 'object_name': 'Mac_arm64/llvm-code-coverage-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': '17a011d7bb395741ef12e4631151ad5f0d62ce7cff263aaebb15b2978b2a48c1', - 'size_bytes': 1990792, - 'generation': 1749626983445673, + 'object_name': 'Mac_arm64/llvm-code-coverage-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '82ca9187d1fd5ed14266612339b921d560b1008f92e1719255b755ff882d23e3', + 'size_bytes': 1982036, + 'generation': 1747138986831545, 'condition': 'host_os == "mac" and host_cpu == "arm64" and checkout_clang_coverage_tools', }, { - 'object_name': 'Win/clang-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': '121690620f369ed32e633941b0eba1334c5e6db9faebd16301e642b798966e7d', - 'size_bytes': 47358588, - 'generation': 1749627006959319, + 'object_name': 'Win/clang-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '39e17b8282b9f1e3cbc6b22d3144696728c867f3ae66694b0125c3ed60755401', + 'size_bytes': 47250032, + 'generation': 1747139012194774, 'condition': 'host_os == "win"', }, { - 'object_name': 'Win/clang-tidy-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': '349fa971f1d6d00b051ab19810cbd1a762a41544b959b580665d780022f6e438', - 'size_bytes': 13542676, - 'generation': 1749627007293307, + 'object_name': 'Win/clang-tidy-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '9dec82a917bd55947e39891137ba5c13663ca94d2c102d56eb52b9b176365910', + 'size_bytes': 13492960, + 'generation': 1747139012510054, 'condition': 'host_os == "win" and checkout_clang_tidy', }, { - 'object_name': 'Win/clang-win-runtime-library-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': 'c3504ea2196becfca54f00e0c71f2d5ffd77e37a48fd172931dbc7cc31e47040', - 'size_bytes': 2505740, - 'generation': 1749627029752519, + 'object_name': 'Win/clang-win-runtime-library-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '220abd9ce9a85446a2e7879aab3c1f2f5393665f6b13b067f8cec565ae7d36eb', + 'size_bytes': 2486856, + 'generation': 1747139033547001, 'condition': 'checkout_win and not host_os == "win"', }, { - 'object_name': 'Win/clangd-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': 'ae06186314646ffe1ed0497d13006ca79100a3fc60b2faf07a83e409d652deaf', - 'size_bytes': 13980236, - 'generation': 1749627007458183, + 'object_name': 'Win/clangd-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '81fa230b6311e3e50147cae3acd6d2c83c1bef13ff46df3df3d580ca911e9d15', + 'size_bytes': 13918432, + 'generation': 1747139013351355, 'condition': 'host_os == "win" and checkout_clangd', }, { - 'object_name': 'Win/llvm-code-coverage-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': '239f3b933fa531c70b66fd80a8c900d080ed4d8153aa05781287e0a63ec407d2', - 'size_bytes': 2388288, - 'generation': 1749627008214902, + 'object_name': 'Win/llvm-code-coverage-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '611b9689c3d3e80ab7485e698f6b67e0df328b5407f30f177c29fe394b81a13e', + 'size_bytes': 2378584, + 'generation': 1747139013764369, 'condition': 'host_os == "win" and checkout_clang_coverage_tools', }, { - 'object_name': 'Win/llvmobjdump-llvmorg-21-init-15009-g841a7f08-1.tar.xz', - 'sha256sum': 'fce654527aad54b01d6d19b2cd5d79264cf1f7195cd17a1eeef2626dad09cd26', - 'size_bytes': 5665536, - 'generation': 1749627007640649, + 'object_name': 'Win/llvmobjdump-llvmorg-21-init-11777-gfd3fecfc-1.tar.xz', + 'sha256sum': '67a05210ee38b2f575df3cc1feb04ed36b4186748c2d769e2201572b413305fe', + 'size_bytes': 5698204, + 'generation': 1747139013159526, 'condition': '(checkout_linux or checkout_mac or checkout_android) and host_os == "win"', }, ] @@ -997,31 +997,31 @@ 'bucket': 'chromium-browser-clang', 'objects': [ { - 'object_name': 'Linux_x64/rust-toolchain-0b65d0db5f77c44bf37b4a25489562d68c14aecf-1-llvmorg-21-init-15009-g841a7f08.tar.xz', - 'sha256sum': 'e2292abfbbebe5d5cf50c144cd2987a386af4018cfc2b5d221b3732801d0f890', - 'size_bytes': 119462048, - 'generation': 1749732327927434, + 'object_name': 'Linux_x64/rust-toolchain-4a0969e06dbeaaa43914d2d00b2e843d49aa3886-1-llvmorg-21-init-11777-gfd3fecfc.tar.xz', + 'sha256sum': 'df1573701599cb7d00c1050b71636a436320b8ad47bb09cb46d6e96b3f8ac585', + 'size_bytes': 118529212, + 'generation': 1747160498430964, 'condition': 'host_os == "linux" and non_git_source', }, { - 'object_name': 'Mac/rust-toolchain-0b65d0db5f77c44bf37b4a25489562d68c14aecf-1-llvmorg-21-init-15009-g841a7f08.tar.xz', - 'sha256sum': '333819bfe3e903294240aa523f910f6914ef480bda0bfc671b271ae7ec4a902c', - 'size_bytes': 112578376, - 'generation': 1749732329993214, + 'object_name': 'Mac/rust-toolchain-4a0969e06dbeaaa43914d2d00b2e843d49aa3886-1-llvmorg-21-init-11777-gfd3fecfc.tar.xz', + 'sha256sum': '83836493c8a81b212c20e16666c6b918bff28748f4d6685c5107eb7e9d16f6fe', + 'size_bytes': 111691772, + 'generation': 1747160500088595, 'condition': 'host_os == "mac" and host_cpu == "x64"', }, { - 'object_name': 'Mac_arm64/rust-toolchain-0b65d0db5f77c44bf37b4a25489562d68c14aecf-1-llvmorg-21-init-15009-g841a7f08.tar.xz', - 'sha256sum': '39d95b5a58c74fc15be52ebd1bd83c36e0b312397c15ce1871b175ace5e5944e', - 'size_bytes': 102896060, - 'generation': 1749732331745908, + 'object_name': 'Mac_arm64/rust-toolchain-4a0969e06dbeaaa43914d2d00b2e843d49aa3886-1-llvmorg-21-init-11777-gfd3fecfc.tar.xz', + 'sha256sum': 'd975e322a2e5c680b54f27a6545c63c0de2c5367ca6ffefda04de491d6b76553', + 'size_bytes': 102206348, + 'generation': 1747160501743827, 'condition': 'host_os == "mac" and host_cpu == "arm64"', }, { - 'object_name': 'Win/rust-toolchain-0b65d0db5f77c44bf37b4a25489562d68c14aecf-1-llvmorg-21-init-15009-g841a7f08.tar.xz', - 'sha256sum': '4745c67218ddcea9502bd6bc7944f3b726ca8014ad0d4300c6c630c0f011cd78', - 'size_bytes': 194910004, - 'generation': 1749732333543007, + 'object_name': 'Win/rust-toolchain-4a0969e06dbeaaa43914d2d00b2e843d49aa3886-1-llvmorg-21-init-11777-gfd3fecfc.tar.xz', + 'sha256sum': '25c51b4c2e0e8b4e974973f0357b12ecb645a0a7a136f9e0a6604e87c21acc7a', + 'size_bytes': 193582440, + 'generation': 1747160503376785, 'condition': 'host_os == "win"', }, ], @@ -1521,7 +1521,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'e4201862b5cd95321ccc5abba80f47a502829743', + '36c23c84ecbd0d6f2633e7aae5f64cf4245061c4', 'condition': 'checkout_android and checkout_src_internal', }, @@ -1680,7 +1680,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'Y-CbCN6v5_4a_FprX22MQBJmya6JbjaSA-BUTEYbBdoC', + 'version': 'H6x4BaAUOpgCkrOkyQktag4FqE5GBL3v75XZFrFcsscC', }, ], 'condition': 'checkout_android and non_git_source', @@ -2262,7 +2262,7 @@ 'packages': [ { 'package': 'chromium/third_party/kotlin_stdlib', - 'version': '8XeqF76rn8_JTQhKeVQl7VP6j626lwcLXU8ASXeiyAkC', + 'version': 'E405j4iATVcDLLGq9LbG61CRuyD0rs08XuMkg_GCJAwC', }, ], 'condition': 'checkout_android and non_git_source', @@ -2273,7 +2273,7 @@ 'packages': [ { 'package': 'chromium/third_party/kotlinc', - 'version': 'HxFoeMO-z9z7CdPhYkAvJf2yyBAx7dCO0j7U8gkYUa4C', + 'version': 'mGeAAvYPiWnWdB1IzKIoMQGoAMYI3GYfT7zWdPTypJEC', }, ], 'condition': 'checkout_android and non_git_source', @@ -2296,7 +2296,7 @@ Var('chromium_git') + '/external/libaddressinput.git' + '@' + '2610f7b1043d6784ada41392fc9392d1ea09ea07', 'src/third_party/libaom/source/libaom': - Var('aomedia_git') + '/aom.git' + '@' + '6c4010bde34318fd6c1f0d10196f27ac9908eeb8', + Var('aomedia_git') + '/aom.git' + '@' + '3304ee478e7e8e41da2d9f96e5c5fc9b1e5bb043', 'src/third_party/crabbyavif/src': Var('chromium_git') + '/external/github.com/webmproject/CrabbyAvif.git' + '@' + Var('crabbyavif_revision'), @@ -2559,7 +2559,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '15b79e4bc067016a592fac0b9875eb0322ea9a1a', + Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '167e1f0dab2691a4b2a911e001317353405d83d9', 'src/base/tracing/test/data': { 'bucket': 'perfetto', @@ -2932,7 +2932,7 @@ Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'), 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '4c619d7b0f2020e1b54fc62aaafc24fc34af78f8', + Var('webrtc_git') + '/src.git' + '@' + '2f61be11629916ec0d3f083ef16b85113ee1db54', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -3109,7 +3109,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': 'qnUuqZLgBkSQ-LGRFCVJvE057zWEX6q9oUHKJuy0kXIC', + 'version': 'fvHZxDf4ktU9oynNmyMNwzGESzFZ8rh6zPXlazdytdgC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -4498,7 +4498,7 @@ 'src/chrome/browser/platform_experience/win': { 'url': Var('chrome_git') + '/chrome/browser/platform_experience/win.git' + '@' + - '58ae7971c82fe41c26e3052d97dc5b5e2461cab8', + '0dfacedf1672ac9e62c300a331435fcc127478a8', 'condition': 'checkout_src_internal', }, @@ -4718,7 +4718,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - '3b581c6c47e23717766c2c1922d6c7111db6cb4c', + 'b254cb46f918229d29978dcd9685439f27798668', 'condition': 'checkout_ios and checkout_src_internal', },
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java index ccbac159d..96bdaa1e 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java
@@ -2544,6 +2544,7 @@ @Test @SmallTest @Feature({"AndroidWebView"}) + @DisabledTest(message = "crbug.com/424007303") @CommandLineFlags.Add({"disable-features=AutofillServerCommunication"}) public void testNoEventSentToAutofillServiceForFocusedDatalist() throws Throwable { final String url = getAbsoluteTestPageUrl("form_with_datalist.html");
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ProfileExtraHeadersTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ProfileExtraHeadersTest.java index 8ce33e8..553a16f 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/ProfileExtraHeadersTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/ProfileExtraHeadersTest.java
@@ -4,8 +4,6 @@ package org.chromium.android_webview.test; -import android.webkit.WebSettings; - import androidx.annotation.NonNull; import androidx.test.filters.LargeTest; import androidx.test.filters.MediumTest; @@ -31,7 +29,6 @@ import org.chromium.base.ThreadUtils; import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.HistogramWatcher; import org.chromium.components.embedder_support.util.WebResourceResponseInfo; @@ -570,24 +567,14 @@ @MediumTest @Feature({"AndroidWebView"}) @Test - @DisabledTest(message = "https://crbug.com/424621656") public void willAttachHeaderOnCrossOriginResourceRequests() throws Exception { - ThreadUtils.runOnUiThreadBlocking( - () -> mAwContents.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE)); - AwActivityTestRule.enableJavaScriptOnUiThread(mAwContents); - TestWebMessageListener listener = addTestWebMessageListener(); + // Explicitly enable image loading to make the test resilient against external settings + // changes (e.g. variations). + ThreadUtils.runOnUiThreadBlocking(() -> mAwContents.getSettings().setImagesEnabled(true)); String mainContentTemplate = """ <!DOCTYPE html> - <html> - <script> - function onImageLoaded() { - testListener.postMessage("loaded"); - } - </script> - <!-- onerror because we are returning an invalid result from the test server. --> - <body><img onerror="onImageLoaded()" src="%s"> - </body></html> + <html><body><img src="%s"></body></html> """; try (TestWebServer server = TestWebServer.start(); TestWebServer corsServer = TestWebServer.startAdditional()) { @@ -601,8 +588,8 @@ String mainContent = String.format(mainContentTemplate, corsUrl); String mainUrl = server.setResponse("/index.html", mainContent, null); - mActivityTestRule.loadUrlAsync(mAwContents, mainUrl); - listener.waitForOnPostMessage(); + mActivityTestRule.loadUrlSync( + mAwContents, mContentsClient.getOnPageFinishedHelper(), mainUrl); HTTPRequest lastRequest = server.getLastRequest("/index.html"); Assert.assertEquals("", lastRequest.headerValue("X-ApplicationHeader"));
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 932fff6..994f9c2 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -1963,9 +1963,6 @@ # Note we apply the actual lint flags in config("compiler"). All warnings # are suppressed in third-party crates. rustflags = [ "-Dwarnings" ] - - # TODO(crbug.com/424424323): Clean up and enable. - rustflags += [ "-Amismatched_lifetime_syntaxes" ] } # tot_warnings ---------------------------------------------------------------- @@ -1986,6 +1983,14 @@ # Entries should generally require both is_clang and llvm_force_head_revision, # but may have additional constraints as well (e.g. only some OSes) if (is_clang && llvm_force_head_revision && !is_nacl) { + cflags_cc += [ + # TODO(crbug.com/417996267): Fix and re-enable + "-Wno-character-conversion", + ] + cflags_objcc += [ + # TODO(crbug.com/417996267): Fix and re-enable + "-Wno-character-conversion", + ] } } @@ -2154,12 +2159,6 @@ # New clang warnings usually go here during a roll ] - - if (default_toolchain != "//build/toolchain/cros:target" && - !llvm_android_mainline && !is_nacl_saigo) { - # TODO(crbug.com/417996267): Fix and re-enable - cflags += [ "-Wno-character-conversion" ] - } } if (is_component_build && use_clang_warning_suppression_file) {
diff --git a/build/rust/cargo_crate.gni b/build/rust/cargo_crate.gni index 0e002ef..0e73b54 100644 --- a/build/rust/cargo_crate.gni +++ b/build/rust/cargo_crate.gni
@@ -310,9 +310,6 @@ rustflags += [ "-Awarnings" ] # Suppress other warnings in 3rd-party crates. - # TODO(crbug.com/424424323): Clean up and enable. - rustflags += [ "-Amismatched_lifetime_syntaxes" ] - if (!defined(build_native_rust_unit_tests)) { build_native_rust_unit_tests = _crate_type != "proc-macro" }
diff --git a/build/rust/std/rules/BUILD.gn b/build/rust/std/rules/BUILD.gn index f59b367..8806893 100644 --- a/build/rust/std/rules/BUILD.gn +++ b/build/rust/std/rules/BUILD.gn
@@ -298,203 +298,233 @@ } cargo_crate("compiler_builtins") { crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/lib.rs" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/lib.rs" sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/aarch64_linux.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/arm_linux.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/avr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/float/add.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/float/cmp.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/float/conv.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/float/div.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/float/extend.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/float/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/float/mul.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/float/pow.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/float/sub.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/float/traits.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/float/trunc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/hexagon.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/addsub.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/big.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/bswap.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/leading_zeros.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/mul.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/sdiv.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/shift.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/specialized_div_rem/asymmetric.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/specialized_div_rem/binary_long.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/specialized_div_rem/delegate.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/specialized_div_rem/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/specialized_div_rem/norm_shift.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/specialized_div_rem/trifecta.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/trailing_zeros.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/traits.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/int/udiv.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/lib.miri.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/macros.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/acos.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/acosf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/acosh.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/acoshf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/arch/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/arch/i586.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/arch/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/arch/wasm32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/arch/x86.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/arch/x86/detect.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/arch/x86/fma.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/asin.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/asinf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/asinh.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/asinhf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/atan.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/atan2.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/atan2f.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/atanf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/atanh.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/atanhf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/cbrt.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/cbrtf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/ceil.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/copysign.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/cos.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/cosf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/cosh.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/coshf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/erf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/erff.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/exp.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/exp10.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/exp10f.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/exp2.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/exp2f.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/expf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/expm1.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/expm1f.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/expo2.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/fabs.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/fdim.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/floor.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/fma.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/fmin_fmax.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/fminimum_fmaximum.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/fminimum_fmaximum_num.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/fmod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/frexp.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/frexpf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/ceil.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/copysign.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/fabs.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/fdim.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/floor.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/fma.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/fma_wide.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/fmax.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/fmaximum.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/fmaximum_num.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/fmin.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/fminimum.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/fminimum_num.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/fmod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/rint.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/round.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/scalbn.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/sqrt.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/generic/trunc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/hypot.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/hypotf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/ilogb.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/ilogbf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/j0.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/j0f.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/j1.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/j1f.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/jn.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/jnf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/k_cos.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/k_cosf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/k_expo2.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/k_expo2f.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/k_sin.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/k_sinf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/k_tan.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/k_tanf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/ldexp.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/lgamma.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/lgamma_r.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/lgammaf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/lgammaf_r.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/log.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/log10.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/log10f.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/log1p.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/log1pf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/log2.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/log2f.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/logf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/modf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/modff.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/nextafter.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/nextafterf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/pow.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/powf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/rem_pio2.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/rem_pio2_large.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/rem_pio2f.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/remainder.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/remainderf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/remquo.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/remquof.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/rint.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/round.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/roundeven.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/scalbn.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/sin.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/sincos.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/sincosf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/sinf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/sinh.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/sinhf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/sqrt.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/support/big.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/support/big/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/support/env.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/support/feature_detect.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/support/float_traits.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/support/hex_float.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/support/int_traits.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/support/macros.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/support/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/tan.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/tanf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/tanh.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/tanhf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/tgamma.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/tgammaf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/libm_math/trunc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/math/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/mem/impls.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/mem/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/mem/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/probestack.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/riscv.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/x86.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/aarch64_linux.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/arm_linux.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/avr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/float/add.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/float/cmp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/float/conv.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/float/div.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/float/extend.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/float/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/float/mul.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/float/pow.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/float/sub.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/float/traits.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/float/trunc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/hexagon.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/addsub.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/big.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/bswap.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/leading_zeros.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/mul.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/sdiv.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/shift.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/specialized_div_rem/asymmetric.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/specialized_div_rem/binary_long.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/specialized_div_rem/delegate.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/specialized_div_rem/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/specialized_div_rem/norm_shift.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/specialized_div_rem/trifecta.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/trailing_zeros.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/traits.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/int/udiv.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/lib.miri.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/macros.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/acos.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/acosf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/acosh.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/acoshf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/arch/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/arch/i586.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/arch/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/arch/wasm32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/arch/x86.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/arch/x86/detect.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/arch/x86/fma.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/asin.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/asinf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/asinh.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/asinhf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/atan.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/atan2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/atan2f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/atanf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/atanh.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/atanhf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/cbrt.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/cbrtf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/ceil.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/copysign.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/copysignf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/copysignf128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/copysignf16.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/cos.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/cosf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/cosh.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/coshf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/erf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/erff.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/exp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/exp10.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/exp10f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/exp2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/exp2f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/expf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/expm1.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/expm1f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/expo2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fabs.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fabsf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fabsf128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fabsf16.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fdim.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fdimf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fdimf128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fdimf16.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/floor.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/floorf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/floorf128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/floorf16.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fma.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fmin_fmax.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fminimum_fmaximum.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fminimum_fmaximum_num.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fmod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fmodf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fmodf128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/fmodf16.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/frexp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/frexpf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/ceil.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/copysign.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/fabs.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/fdim.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/floor.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/fma.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/fma_wide.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/fmax.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/fmaximum.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/fmaximum_num.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/fmin.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/fminimum.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/fminimum_num.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/fmod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/rint.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/round.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/scalbn.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/sqrt.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/generic/trunc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/hypot.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/hypotf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/ilogb.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/ilogbf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/j0.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/j0f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/j1.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/j1f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/jn.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/jnf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/k_cos.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/k_cosf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/k_expo2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/k_expo2f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/k_sin.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/k_sinf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/k_tan.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/k_tanf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/ldexp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/ldexpf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/ldexpf128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/ldexpf16.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/lgamma.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/lgamma_r.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/lgammaf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/lgammaf_r.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/log.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/log10.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/log10f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/log1p.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/log1pf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/log2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/log2f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/logf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/modf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/modff.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/nextafter.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/nextafterf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/pow.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/powf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/rem_pio2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/rem_pio2_large.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/rem_pio2f.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/remainder.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/remainderf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/remquo.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/remquof.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/rint.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/round.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/roundeven.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/roundf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/roundf128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/roundf16.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/scalbn.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/scalbnf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/scalbnf128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/scalbnf16.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/sin.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/sincos.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/sincosf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/sinf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/sinh.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/sinhf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/sqrt.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/sqrtf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/sqrtf128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/sqrtf16.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/support/big.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/support/big/tests.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/support/env.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/support/feature_detect.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/support/float_traits.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/support/hex_float.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/support/int_traits.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/support/macros.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/support/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/tan.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/tanf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/tanh.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/tanhf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/tgamma.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/tgammaf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/trunc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/truncf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/truncf128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/libm_math/truncf16.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/math/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/mem/impls.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/mem/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/mem/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/probestack.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/riscv.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/x86.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/x86_64.rs", ] inputs = [] no_std = true # Unit tests skipped. Generate with --with-tests to include them. build_native_rust_unit_tests = false - edition = "2024" - cargo_pkg_version = "0.1.160" + edition = "2021" + cargo_pkg_version = "0.1.157" cargo_pkg_authors = "Jorge Aparicio <japaricious@gmail.com>" cargo_pkg_name = "compiler_builtins" cargo_pkg_description = "Compiler intrinsics used by the Rust compiler." @@ -521,9 +551,9 @@ "default", "rustc-dep-of-std", ] - build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/build.rs" - build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/build.rs" ] - build_script_inputs = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.160/src/../configure.rs" ] + build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/build.rs" + build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/build.rs" ] + build_script_inputs = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/compiler_builtins-0.1.157/src/../configure.rs" ] rustenv = [ "CFG_DISABLE_UNSTABLE_FEATURES=0", "STD_ENV_ARCH=$rust_target_arch", @@ -604,7 +634,6 @@ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/hash/sip.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/hint.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/internal_macros.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/intrinsics/bounds.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/intrinsics/fallback.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/intrinsics/mir.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/intrinsics/mod.rs", @@ -643,7 +672,6 @@ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/empty.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/from_coroutine.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/from_fn.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/generator.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/once.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/once_with.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/iter/sources/repeat.rs", @@ -698,7 +726,6 @@ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/int_log10.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/int_macros.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/int_sqrt.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/libm.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/niche_types.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/num/nonzero.rs", @@ -1039,8 +1066,6 @@ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ffi/c_void.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/fmt/fmt_trait_method_doc.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/macros/panic.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ptr/docs/add.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/core/src/ptr/docs/offset.md", ] no_std = true @@ -1900,16 +1925,15 @@ ] executable_configs += [ "//build/config/compiler:no_chromium_code" ] deps = [ + ":alloc", + ":cfg_if", ":compiler_builtins", ":core", "//build/rust/std:profiler_builtins_group", "//build/rust/std:std_build_deps", ] - if (is_android) { - deps += [ - ":alloc", - ":libc", - ] + if (!is_win) { + deps += [ ":libc" ] } rustenv = [ "CFG_DISABLE_UNSTABLE_FEATURES=0", @@ -2024,10 +2048,6 @@ "//build/rust/std:profiler_builtins_group", "//build/rust/std:std_build_deps", ] - features = [ - "default", - "rustc-dep-of-std", - ] rustenv = [ "CFG_DISABLE_UNSTABLE_FEATURES=0", "STD_ENV_ARCH=$rust_target_arch", @@ -2315,6 +2335,10 @@ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/collections/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/env.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/error.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/f128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/f16.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/f32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/f64.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/ffi/c_str.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/ffi/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/ffi/os_str.rs", @@ -2363,11 +2387,7 @@ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/net/test.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/net/udp.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/net/udp/tests.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/num/f128.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/num/f16.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/num/f32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/num/f64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/num/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/num.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/aix/fs.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/aix/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/os/aix/raw.rs", @@ -2633,8 +2653,6 @@ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/socket/wasip2.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/socket/windows.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/uefi/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/uefi/tcp.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/uefi/tcp4.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/unsupported.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/wasip1.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/net/connection/xous/dns.rs", @@ -2717,7 +2735,6 @@ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/os/tests.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/pipe.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/stack_overflow.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/stack_overflow/thread_info.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/sync/condvar.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/sync/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/pal/unix/sync/mutex.rs", @@ -2779,11 +2796,9 @@ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/personality/emcc.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/personality/gcc.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/personality/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/process/env.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/process/mod.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/process/uefi.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/process/unix/common.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/process/unix/common/cstring_array.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/process/unix/common/tests.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/process/unix/fuchsia.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/process/unix/mod.rs", @@ -2886,6 +2901,7 @@ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread_local/no_threads.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys/thread_local/os.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys_common/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys_common/process.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys_common/tests.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys_common/wstr.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/sys_common/wtf8.rs", @@ -2954,8 +2970,6 @@ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/fmt/fmt_trait_method_doc.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/macros/panic.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/primitive_docs.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/ptr/docs/add.md", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../core/src/ptr/docs/offset.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../portable-simd/crates/core_simd/src/core_simd_docs.md", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../portable-simd/crates/std_float/src/lib.rs", "//third_party/rust-toolchain/lib/rustlib/src/rust/library/std/src/../../stdarch/crates/core_arch/src/core_arch_docs.md",
diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc index 82d26cd..7e028b9d 100644 --- a/cc/layers/texture_layer_unittest.cc +++ b/cc/layers/texture_layer_unittest.cc
@@ -100,9 +100,17 @@ } viz::TransferableResource MakeFakeSoftwareResource() { + // Generate verified tokens, as (a) + // ClientResourceProvider::PrepareSendToParent() does not verify tokens for + // software resources, and (b) when these tests are run with TreesInViz the + // tokens go through serialization, which enforces the invariant that they be + // verified. + auto sync_token = GenSyncToken(); + sync_token.SetVerifyFlush(); + return viz::TransferableResource::Make( gpu::ClientSharedImage::CreateSoftwareForTesting(), - viz::TransferableResource::ResourceSource::kTest, GenSyncToken()); + viz::TransferableResource::ResourceSource::kTest, sync_token); } class MockLayerTreeHost : public LayerTreeHost {
diff --git a/chrome/VERSION b/chrome/VERSION index b3f28095..ff11796 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=139 MINOR=0 -BUILD=7243 +BUILD=7244 PATCH=0
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java index 64035db..d018e10 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java
@@ -364,7 +364,11 @@ private void clearBackgroundViewAccessibilityImportance() { assert mAccessibilityImportanceMap.isEmpty(); ViewGroup parent = (ViewGroup) getParent(); - ViewGroup grandparent = (ViewGroup) parent.getParent(); + ViewGroup grandparent = parent == null ? null : (ViewGroup) parent.getParent(); + // Fix for crbug.com/424865865, this can happen if the animation is forced to finish before + // it is attached to the view hierarchy after which the view is dismissed anyways. + if (parent == null || grandparent == null) return; + for (int i = 0; i < grandparent.getChildCount(); i++) { View view = grandparent.getChildAt(i); if (view == parent) { @@ -381,7 +385,8 @@ private void restoreBackgroundViewAccessibilityImportance() { ViewGroup parent = (ViewGroup) getParent(); ViewGroup grandparent = parent == null ? null : (ViewGroup) parent.getParent(); - // Fix for crbug.com/424749240, it is not clear why this would be null. + // Fix for crbug.com/424749240, this can happen if the animation is forced to finish before + // it is attached to the view hierarchy after which the view is dismissed anyways. if (parent == null || grandparent == null) { for (View view : mAccessibilityImportanceMap.keySet()) { view.setImportantForAccessibility(mAccessibilityImportanceMap.get(view));
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb index 9963943..f1793b3 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb
@@ -86,7 +86,7 @@ <translation id="47070857600201406">{DAY_COUNT,plural, =1{Luk efter 1 dag}one{Luk efter <ph name="DAY_COUNT_MANY" /> dag}other{Luk efter <ph name="DAY_COUNT_MANY" /> dage}}</translation> <translation id="4783638485675352219">Del titler og webadresser på åbne faner fra denne enhed med operativsystemet</translation> <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> anmeldelse)}one{(<ph name="REVIEWS_COUNT_MANY" /> anmeldelse)}other{(<ph name="REVIEWS_COUNT_MANY" /> anmeldelser)}}</translation> -<translation id="4850886885716139402">Vis</translation> +<translation id="4850886885716139402">Se</translation> <translation id="4852605713297257667">{TABS_COUNT,plural, =1{Føj <ph name="TABS_COUNT_ONE" /> valgt fane til gruppen}one{Føj <ph name="TABS_COUNT_MANY" /> valgt fane til gruppen}other{Føj <ph name="TABS_COUNT_MANY" /> valgte faner til gruppen}}</translation> <translation id="4861611890274104875">Luk kortet.</translation> <translation id="4861953997778766866">Alle kan ændre dine delte fanegrupper</translation>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AppRestrictionSupplier.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AppRestrictionSupplier.java index 59e13f2..4553462 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/AppRestrictionSupplier.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/AppRestrictionSupplier.java
@@ -14,6 +14,8 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.ThreadUtils; +import org.chromium.base.supplier.OneshotSupplier; +import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.task.AsyncTask; import org.chromium.base.task.TaskTraits; import org.chromium.build.annotations.NullMarked; @@ -35,15 +37,13 @@ * <p>This class is used during fullscreen signin flows, so its lifecycle ends when the flow * completes. At which point {@link #destroy()} should be called. */ -// TODO(crbug.com/385693639): This class should implement ObservableSupplier<Boolean>. @NullMarked -public class AppRestrictionSupplier { +public class AppRestrictionSupplier implements OneshotSupplier<Boolean> { private static final String TAG = "AppRestriction"; private boolean mInitialized; - private boolean mHasAppRestriction; private long mCompletionElapsedRealtimeMs; - private final Queue<Callback<Boolean>> mCallbacks = new LinkedList<>(); + private final OneshotSupplierImpl<Boolean> mSupplier = new OneshotSupplierImpl<>(); private final Queue<Callback<Long>> mCompletionTimeCallbacks = new LinkedList<>(); private @Nullable AsyncTask<Boolean> mFetchAppRestrictionAsyncTask; @@ -53,20 +53,18 @@ initialize(); } - /** - * Register a callback whether app restriction is found on device. If app restrictions have - * already been fetched, the callback will be invoked immediately. - * - * @param callback Callback to run with whether app restriction is found on device. - */ - public void getHasAppRestriction(Callback<Boolean> callback) { + @Override + public @Nullable Boolean onAvailable(Callback<Boolean> callback) { ThreadUtils.assertOnUiThread(); + return mSupplier.onAvailable(callback); + } - if (mInitialized) { - callback.onResult(mHasAppRestriction); - } else { - mCallbacks.add(callback); - } + @Override + // TODO(https://github.com/uber/NullAway/issues/1209): Remove @SuppressWarnings("NullAway") + // when the issue gets fixed + @SuppressWarnings("NullAway") + public @Nullable Boolean get() { + return mSupplier.get(); } /** @@ -131,7 +129,6 @@ } private void onRestrictionDetected(boolean isAppRestricted, long startTime) { - mHasAppRestriction = isAppRestricted; mInitialized = true; // Only record histogram when startTime is valid. @@ -146,10 +143,7 @@ runTime, isAppRestricted)); } - - while (!mCallbacks.isEmpty()) { - mCallbacks.remove().onResult(mHasAppRestriction); - } + mSupplier.set(isAppRestricted); while (!mCompletionTimeCallbacks.isEmpty()) { mCompletionTimeCallbacks.remove().onResult(mCompletionElapsedRealtimeMs); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/ChildAccountStatusSupplier.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/ChildAccountStatusSupplier.java index 6839755..0983bd49 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/ChildAccountStatusSupplier.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/ChildAccountStatusSupplier.java
@@ -44,7 +44,7 @@ AccountManagerFacade accountManagerFacade, AppRestrictionSupplier appRestrictionInfo) { mChildAccountStatusStartTime = SystemClock.elapsedRealtime(); - appRestrictionInfo.getHasAppRestriction(this::onAppRestrictionDetected); + appRestrictionInfo.onAvailable(this::onAppRestrictionDetected); accountManagerFacade .getAccounts()
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/PolicyLoadListener.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/PolicyLoadListener.java index 1120f96..ef7c3f47 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/PolicyLoadListener.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/PolicyLoadListener.java
@@ -58,7 +58,7 @@ mPolicyServiceSupplier = policyServiceSupplier; - appRestrictionInfo.getHasAppRestriction( + appRestrictionInfo.onAvailable( mCallbackController.makeCancelable(this::onAppRestrictionDetected)); policyServiceSupplier.onAvailable( mCallbackController.makeCancelable(this::onPolicyServiceAvailable));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesLayout.java index 4b38979..711c1e57 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesLayout.java
@@ -11,6 +11,8 @@ import androidx.annotation.Px; +import org.chromium.build.annotations.Initializer; +import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; import org.chromium.chrome.R; import org.chromium.chrome.browser.suggestions.SiteSuggestion; @@ -18,6 +20,7 @@ import org.chromium.ui.base.DeviceFormFactor; /** The most visited tiles layout. */ +@NullMarked public class MostVisitedTilesLayout extends TilesLinearLayout { private final boolean mIsTablet; @@ -97,6 +100,7 @@ } @Override + @Initializer protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (mInitialTileCount == null) { mInitialTileCount = getTileCount();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessage.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessage.java index 5b26d709..12f1b73 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessage.java
@@ -276,6 +276,8 @@ return R.string.identity_error_message_button_verify; case 2: return R.string.identity_error_card_button_okay; + case 3: + return R.string.identity_error_card_button_get; default: // This should never happen, as there are only two versions. assert false
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelImplCreator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelImplCreator.java index 3accc7e..4b9e6b9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelImplCreator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/IncognitoTabModelImplCreator.java
@@ -78,7 +78,8 @@ mActivityType, /* isArchivedTabModel= */ false, mRegularTabCreator, - mIncognitoTabCreator); + mIncognitoTabCreator, + mModelDelegate); } return new TabModelImpl( assumeNonNull(mProfileProvider.getOffTheRecordProfile(true)),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl.java index 371ffcb..4beb130b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl.java
@@ -7,8 +7,10 @@ import org.jni_zero.JNINamespace; import org.jni_zero.NativeMethods; +import org.chromium.base.MathUtils; import org.chromium.base.ObserverList; import org.chromium.base.Token; +import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.LazyOneshotSupplier; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplierImpl; @@ -55,14 +57,18 @@ // counterparts. private final Map<Integer, Tab> mTabIdToTabs = new HashMap<>(); + private final boolean mIsArchivedTabModel; private final TabCreator mRegularTabCreator; private final TabCreator mIncognitoTabCreator; + private final TabModelDelegate mModelDelegate; // TODO(crbug.com/405343634): Replace this with the appropriate TabUngrouper. private final TabUngrouper mTabUngrouper = new PassthroughTabUngrouper(() -> this); private long mNativeTabCollectionTabModelImplPtr; private boolean mInitializationComplete; private boolean mActive; + // TODO(crbug.com/425345868): Consider using indexOf(mCurrentTabSupplier.get()) instead. + private int mIndex = TabList.INVALID_TAB_INDEX; /** * @param profile The {@link Profile} tabs in the tab collection tab model belongs to. @@ -70,16 +76,20 @@ * @param isArchivedTabModel Whether the tab collection tab model stored archived tabs. * @param regularTabCreator The tab creator for regular tabs. * @param incognitoTabCreator The tab creator for incognito tabs. + * @param modelDelegate The {@link TabModelDelegate} for interacting outside the tab model. */ public TabCollectionTabModelImpl( Profile profile, @ActivityType int activityType, boolean isArchivedTabModel, TabCreator regularTabCreator, - TabCreator incognitoTabCreator) { + TabCreator incognitoTabCreator, + TabModelDelegate modelDelegate) { super(profile); + mIsArchivedTabModel = isArchivedTabModel; mRegularTabCreator = regularTabCreator; mIncognitoTabCreator = incognitoTabCreator; + mModelDelegate = modelDelegate; initializeNative(activityType, isArchivedTabModel); } @@ -104,12 +114,15 @@ @Override public int index() { - return TabList.INVALID_TAB_INDEX; + if (mIsArchivedTabModel) return TabList.INVALID_TAB_INDEX; + return mIndex; } @Override public int getCount() { - return 0; + if (mNativeTabCollectionTabModelImplPtr == 0) return 0; + return TabCollectionTabModelImplJni.get() + .getTabCountRecursive(mNativeTabCollectionTabModelImplPtr); } @Override @@ -119,7 +132,12 @@ @Override public int indexOf(@Nullable Tab tab) { - return TabList.INVALID_TAB_INDEX; + if (tab == null || mNativeTabCollectionTabModelImplPtr == 0) { + return TabList.INVALID_TAB_INDEX; + } + assert tab.isInitialized(); + return TabCollectionTabModelImplJni.get() + .getIndexOfTabRecursive(mNativeTabCollectionTabModelImplPtr, tab); } // SupportsTabModelObserver overrides. @@ -184,7 +202,44 @@ } @Override - public void setIndex(int i, final @TabSelectionType int type) {} + public void setIndex(int i, final @TabSelectionType int type) { + // TODO(crbug.com/425344200): Prevent passing negative indices. + if (mIsArchivedTabModel) return; + if (mNativeTabCollectionTabModelImplPtr == 0) return; + + // When we select a tab in this model it should become the active model. This is the + // existing behavior of TabModelImpl. + if (!isActiveModel()) mModelDelegate.selectModel(isIncognitoBranded()); + + Tab oldSelectedTab = mCurrentTabSupplier.get(); + int lastId = (oldSelectedTab == null) ? Tab.INVALID_TAB_ID : oldSelectedTab.getId(); + + int currentTabCount = getCount(); + + if (currentTabCount == 0) { + // INVALID_TAB_INDEX is only permitted when the tab model is empty. + mIndex = TabList.INVALID_TAB_INDEX; + } else { + mIndex = MathUtils.clamp(i, 0, currentTabCount - 1); + } + + Tab newSelectedTab = (mIndex == TabList.INVALID_TAB_INDEX) ? null : getTabAt(mIndex); + // Request to show the tab first so that it gets loaded; i.e. has a view, web contents, etc. + mModelDelegate.requestToShowTab(newSelectedTab, type); + mCurrentTabSupplier.set(newSelectedTab); + + if (newSelectedTab != null) { + for (TabModelObserver obs : mTabModelObservers) { + obs.didSelectTab(newSelectedTab, type, lastId); + } + + boolean wasAlreadySelected = + (newSelectedTab.getId() == lastId && lastId != Tab.INVALID_TAB_ID); + if (!wasAlreadySelected && type == TabSelectionType.FROM_USER) { + RecordUserAction.record("MobileTabSwitched"); + } + } + } @Override public boolean isActiveModel() { @@ -529,5 +584,9 @@ long init(TabCollectionTabModelImpl javaObject, Profile profile); void destroy(long nativeTabCollectionTabModelImpl); + + int getTabCountRecursive(long nativeTabCollectionTabModelImpl); + + int getIndexOfTabRecursive(long nativeTabCollectionTabModelImpl, Tab tab); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImplUnitTest.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImplUnitTest.java index ffde98bf..fbc093b9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImplUnitTest.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImplUnitTest.java
@@ -8,7 +8,9 @@ import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -44,6 +46,7 @@ @Mock private Profile mOtrProfile; @Mock private TabCreator mRegularTabCreator; @Mock private TabCreator mIncognitoTabCreator; + @Mock private TabModelDelegate mTabModelDelegate; @Mock private TabModelObserver mTabModelObserver; private TabCollectionTabModelImpl mTabModel; @@ -77,7 +80,8 @@ ActivityType.TABBED, /* isArchivedTabModel= */ false, mRegularTabCreator, - mIncognitoTabCreator); + mIncognitoTabCreator, + mTabModelDelegate); mTabModel.addObserver(mTabModelObserver); } @@ -157,4 +161,66 @@ TabLaunchType.FROM_CHROME_UI, TabCreationState.LIVE_IN_FOREGROUND)); } + + @Test + public void testGetCount() { + when(mTabCollectionTabModelImplJni.getTabCountRecursive( + eq(TAB_COLLECTION_TAB_MODEL_IMPL_PTR))) + .thenReturn(5); + assertEquals("Incorrect tab count", 5, mTabModel.getCount()); + verify(mTabCollectionTabModelImplJni) + .getTabCountRecursive(eq(TAB_COLLECTION_TAB_MODEL_IMPL_PTR)); + } + + @Test + public void testGetCount_nativeNotInitialized() { + mTabModel.destroy(); + assertEquals( + "Tab count should be 0 when native is not initialized", 0, mTabModel.getCount()); + verify(mTabCollectionTabModelImplJni, never()).getTabCountRecursive(anyLong()); + } + + @Test + public void testIndexOf() { + MockTab tab = MockTab.createAndInitialize(123, mProfile); + tab.setIsInitialized(true); + when(mTabCollectionTabModelImplJni.getIndexOfTabRecursive( + eq(TAB_COLLECTION_TAB_MODEL_IMPL_PTR), eq(tab))) + .thenReturn(2); + assertEquals("Incorrect tab index", 2, mTabModel.indexOf(tab)); + verify(mTabCollectionTabModelImplJni) + .getIndexOfTabRecursive(eq(TAB_COLLECTION_TAB_MODEL_IMPL_PTR), eq(tab)); + } + + @Test + public void testIndexOf_tabNotFound() { + MockTab tab = MockTab.createAndInitialize(123, mProfile); + tab.setIsInitialized(true); + when(mTabCollectionTabModelImplJni.getIndexOfTabRecursive( + eq(TAB_COLLECTION_TAB_MODEL_IMPL_PTR), eq(tab))) + .thenReturn(TabList.INVALID_TAB_INDEX); + assertEquals( + "Incorrect tab index for non-existent tab", + TabList.INVALID_TAB_INDEX, + mTabModel.indexOf(tab)); + } + + @Test + public void testIndexOf_nullTab() { + assertEquals( + "Index of null tab should be invalid", + TabList.INVALID_TAB_INDEX, + mTabModel.indexOf(null)); + verify(mTabCollectionTabModelImplJni, never()).getIndexOfTabRecursive(anyLong(), any()); + } + + @Test + public void testIndexOf_nativeNotInitialized() { + mTabModel.destroy(); // Destroys native ptr. + assertEquals( + "Index should be invalid when native is not initialized", + TabList.INVALID_TAB_INDEX, + mTabModel.indexOf(MockTab.createAndInitialize(123, mProfile))); + verify(mTabCollectionTabModelImplJni, never()).getIndexOfTabRecursive(anyLong(), any()); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelHolderFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelHolderFactory.java index 7994355..4792cd5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelHolderFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelHolderFactory.java
@@ -42,7 +42,8 @@ activityType, isArchivedTabModel, regularTabCreator, - incognitoTabCreator); + incognitoTabCreator, + modelDelegate); } return createLegacyTabModelHolder( profile, @@ -114,14 +115,16 @@ @ActivityType int activityType, boolean isArchivedTabModel, TabCreator regularTabCreator, - TabCreator incognitoTabCreator) { + TabCreator incognitoTabCreator, + TabModelDelegate modelDelegate) { TabCollectionTabModelImpl regularTabModel = new TabCollectionTabModelImpl( profile, activityType, isArchivedTabModel, regularTabCreator, - incognitoTabCreator); + incognitoTabCreator, + modelDelegate); return new TabModelHolder(regularTabModel, regularTabModel); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java index ce69adaa..3e6c11b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java
@@ -864,7 +864,7 @@ .ensurePagesCreationSucceeded() .ensureWelcomePageIsCurrentPage(); - histograms.assertExpected("Child status or policies fetch time not recorded"); + histograms.pollInstrumentationThreadUntilSatisfied(); } @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageTest.java index d2b88e4..3613f5d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessageTest.java
@@ -287,6 +287,33 @@ @Test @LargeTest + @EnableFeatures( + ChromeFeatureList.SYNC_ENABLE_PASSWORDS_SYNC_ERROR_MESSAGE_ALTERNATIVE + ":version/3") + public void testSyncErrorMessageForTrustedVaultKeyRequiredContent_alternativeThree() + throws Exception { + ArgumentCaptor<PropertyModel> mModelCaptor = ArgumentCaptor.forClass(PropertyModel.class); + + // Sign in. + mSyncTestRule.setUpAccountAndSignInForTesting(); + mFakeSyncServiceImpl.setEngineInitialized(true); + mFakeSyncServiceImpl.setTrustedVaultKeyRequiredForPreferredDataTypes(true); + mSyncTestRule.loadUrl(UrlConstants.VERSION_URL); + + verify(mMessageDispatcher).enqueueWindowScopedMessage(mModelCaptor.capture(), anyBoolean()); + PropertyModel mModel = mModelCaptor.getValue(); + Assert.assertEquals( + mContext.getString(R.string.password_sync_trusted_vault_error_title), + mModel.get(MessageBannerProperties.TITLE)); + Assert.assertEquals( + mContext.getString(R.string.password_sync_trusted_vault_error_hint), + mModel.get(MessageBannerProperties.DESCRIPTION)); + Assert.assertEquals( + mContext.getString(R.string.identity_error_card_button_get), + mModel.get(MessageBannerProperties.PRIMARY_BUTTON_TEXT)); + } + + @Test + @LargeTest public void testSyncErrorMessageShownForTrustedVaultRecoverabilityDegradedForSignedInUsers() throws Exception { HistogramWatcher watchIdentityErrorMessageShownHistogram =
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java index 417b64e..de341242 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunAppRestrictionInfoTest.java
@@ -90,7 +90,7 @@ ThreadUtils.runOnUiThreadBlocking( () -> { AppRestrictionSupplier info = new AppRestrictionSupplier(); - info.getHasAppRestriction(appResCallbackHelper::notifyCalled); + info.onAvailable(appResCallbackHelper::notifyCalled); info.getCompletionElapsedRealtimeMs( (ignored) -> completionCallbackHelper.notifyCalled()); }); @@ -115,9 +115,9 @@ ThreadUtils.runOnUiThreadBlocking( () -> { AppRestrictionSupplier info = new AppRestrictionSupplier(); - info.getHasAppRestriction(appResCallbackHelper1::notifyCalled); - info.getHasAppRestriction(appResCallbackHelper2::notifyCalled); - info.getHasAppRestriction(appResCallbackHelper3::notifyCalled); + info.onAvailable(appResCallbackHelper1::notifyCalled); + info.onAvailable(appResCallbackHelper2::notifyCalled); + info.onAvailable(appResCallbackHelper3::notifyCalled); info.getCompletionElapsedRealtimeMs( (ignored) -> completionCallbackHelper1.notifyCalled()); info.getCompletionElapsedRealtimeMs( @@ -173,7 +173,7 @@ ThreadUtils.runOnUiThreadBlocking( () -> { AppRestrictionSupplier info = new AppRestrictionSupplier(); - info.getHasAppRestriction(appResCallbackHelper::notifyCalled); + info.onAvailable(appResCallbackHelper::notifyCalled); info.getCompletionElapsedRealtimeMs( (ignored) -> completionCallbackHelper.notifyCalled()); @@ -194,9 +194,7 @@ public void testCommandLine() { final PayloadCallbackHelper<Boolean> appResCallbackHelper = new PayloadCallbackHelper<>(); ThreadUtils.runOnUiThreadBlocking( - () -> - new AppRestrictionSupplier() - .getHasAppRestriction(appResCallbackHelper::notifyCalled)); + () -> new AppRestrictionSupplier().onAvailable(appResCallbackHelper::notifyCalled)); Assert.assertTrue(appResCallbackHelper.getOnlyPayloadBlocking()); } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/signin/ChildAccountStatusSupplierTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/signin/ChildAccountStatusSupplierTest.java index 61f8fad..2076ce25 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/signin/ChildAccountStatusSupplierTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/signin/ChildAccountStatusSupplierTest.java
@@ -9,7 +9,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; import static org.chromium.ui.test.util.MockitoHelper.doCallback; @@ -126,9 +126,8 @@ mAccountManagerTestRule.addAccount(ADULT_ACCOUNT_EMAIL); // Block getAccounts call to make sure ChildAccountStatusSupplier checks app restrictions. try (var ignored = mAccountManagerFacade.blockGetAccounts(/* populateCache= */ false)) { - doNothing() - .when(mAppRestrictionSupplierMock) - .getHasAppRestriction(mCallbackCaptor.capture()); + when(mAppRestrictionSupplierMock.onAvailable(mCallbackCaptor.capture())) + .thenReturn(false); ChildAccountStatusSupplier supplier = new ChildAccountStatusSupplier( mAccountManagerFacade, mAppRestrictionSupplierMock); @@ -156,7 +155,7 @@ try (var ignored = mAccountManagerFacade.blockGetAccounts(/* populateCache= */ false)) { doCallback((Callback<Boolean> callback) -> callback.onResult(true)) .when(mAppRestrictionSupplierMock) - .getHasAppRestriction(any()); + .onAvailable(any()); supplier = new ChildAccountStatusSupplier( mAccountManagerFacade, mAppRestrictionSupplierMock);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/signin/PolicyLoadListenerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/signin/PolicyLoadListenerUnitTest.java index 2b031e8..d280701 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/signin/PolicyLoadListenerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/signin/PolicyLoadListenerUnitTest.java
@@ -64,13 +64,13 @@ .addObserver(any()); doCallback((Callback<Boolean> callback) -> mAppRestrictionsCallback = callback) .when(mTestAppRestrictionInfo) - .getHasAppRestriction(any()); + .onAvailable(any()); mPolicyLoadListener = new PolicyLoadListener(mTestAppRestrictionInfo, mTestPolicyServiceSupplier); Assert.assertNull(LOADING_NOT_FINISHED, mPolicyLoadListener.get()); - Mockito.verify(mTestAppRestrictionInfo).getHasAppRestriction(mAppRestrictionsCallback); + Mockito.verify(mTestAppRestrictionInfo).onAvailable(mAppRestrictionsCallback); Mockito.verify(mTestPolicyServiceSupplier).onAvailable(any()); }
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 887f11e8..57fa90ac 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -2171,6 +2171,7 @@ <translation id="24786041351753425">تفعيل خدمة استرداد البيانات</translation> <translation id="2479541499757560845">إعدادات لوحة مفاتيح تسهيل الاستخدام</translation> <translation id="2480868415629598489">تعديل البيانات التي يتم نسخها ولصقها</translation> +<translation id="2480881140544300950">محرّك البحث الحالي الذي يدير صفحة علامة التبويب الجديدة</translation> <translation id="2482878487686419369">الإشعارات</translation> <translation id="2482895651873876648">تم نقل علامة التبويب إلى المجموعة <ph name="GROUP_NAME" /> والتي تحتوي على <ph name="GROUP_CONTENTS" />.</translation> <translation id="2483627560139625913">ضبط محرك البحث في إعدادات متصفّح Chrome</translation> @@ -5370,6 +5371,7 @@ <translation id="4742970037960872810">إزالة التمييز</translation> <translation id="4743260470722568160"><ph name="BEGIN_LINK" />التعرّف على كيفية تحديث التطبيقات<ph name="END_LINK" /></translation> <translation id="4743990041512863976">تم منح إذن الوصول إلى الميكروفون: <ph name="PERMISSION_DETAILS" />. فعِّل إذن <ph name="LINK_BEGIN" />الوصول إلى ميكروفون النظام<ph name="LINK_END" />.</translation> +<translation id="4744172369799559159">يراجع فريق من المراجعين صفحات كلمات المرور والمعلومات ذات الصلة لتحسين هذه الميزة، على الرغم من أنّ كلمة مرورك مشفَّرة ولا يمكن لأي شخص الاطّلاع عليها.</translation> <translation id="4744260496658845719">مستوى سطوع الإضاءة الخلفية للوحة المفاتيح</translation> <translation id="4744268813103118742">زيارة الموقع الإلكتروني</translation> <translation id="4744571849207727284">Excel</translation> @@ -6329,6 +6331,7 @@ <translation id="5434065355175441495">ترميز PKCS #1 RSA</translation> <translation id="5435274640623994081">تفعيل ميزة تسجيل الرمز الصوتي</translation> <translation id="5435779377906857208">السماح دائمًا للنطاق <ph name="HOST" /> بالوصول إلى موقعك الجغرافي</translation> +<translation id="5436211819997237281">الإضافة الحالية التي تدير صفحة علامة التبويب الجديدة</translation> <translation id="5436492226391861498">في انتظار قناة الخادم...</translation> <translation id="5436510242972373446">البحث في الموقع <ph name="SITE_NAME" />:</translation> <translation id="5438014818441491616">النافذة <ph name="WINDOW_SIDE" /> أصبحت الآن بعرض <ph name="WINDOW_SIZE_PERCENT" /> من الشاشة، واللوحة <ph name="PANE_SIDE" /> أصبحت الآن بعرض <ph name="PANE_SIZE_PERCENT" /> من الشاشة.</translation> @@ -9227,6 +9230,7 @@ <translation id="7529411698175791732">تحقق من اتصالك بالإنترنت. وإذا استمرت المشكلة، فحاول الخروج ثم تسجيل الدخول مرة أخرى.</translation> <translation id="7529865045818406536">سيتم استخدام الشبكات المفضَّلة في حال توفُّر أكثر من شبكة معروفة سابقًا.</translation> <translation id="7530016656428373557">معدل التفريغ بوحدة الوات</translation> +<translation id="7530215951451994972">إنشاء صورة</translation> <translation id="7531771599742723865">الجهاز قيد الاستخدام</translation> <translation id="7531779363494549572">يُرجى الانتقال إلى "الإعدادات" > "التطبيقات والإشعارات" > "الإشعارات".</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> لا يستجيب. اختَر "فرض الإغلاق" لإغلاق التطبيق.</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 7a7d67c2..7205487e 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -5541,7 +5541,7 @@ <translation id="485053257961878904">Synkronisering af notifikationer kunne ikke konfigureres</translation> <translation id="4850548109381269495">Tjek din internetforbindelse på begge enheder, og aktivér Bluetooth. Prøv derefter igen.</translation> <translation id="4850669014075537160">Rulning</translation> -<translation id="4850886885716139402">Vis</translation> +<translation id="4850886885716139402">Se</translation> <translation id="485088796993065002">Websites kan afspille lyd for at levere lyd til musik, videoer og andre medier</translation> <translation id="4850919322897956733">Dataene er slettet.</translation> <translation id="4852383141291180386">Administrer appnotifikationer</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index a9f8a9be2..b77b6887 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -2176,6 +2176,7 @@ <translation id="24786041351753425">فعال کردن سرویس بازیابی داده.</translation> <translation id="2479541499757560845">تنظیمات صفحهکلید دسترسپذیری</translation> <translation id="2480868415629598489">اصلاح دادههایی که کپی و جایگذاری میکنید</translation> +<translation id="2480881140544300950">صفحه زبانه جدید شما را موتور جستجوی فعلی مدیریت میکند</translation> <translation id="2482878487686419369">اعلانها</translation> <translation id="2482895651873876648">برگه به گروه <ph name="GROUP_NAME" /> منتقل شد - <ph name="GROUP_CONTENTS" /></translation> <translation id="2483627560139625913">تنظیم موتور جستجو در تنظیمات مرورگر Chrome</translation> @@ -5377,6 +5378,7 @@ <translation id="4742970037960872810">برداشتن برجستهسازی</translation> <translation id="4743260470722568160"><ph name="BEGIN_LINK" />با نحوه بهروزرسانی برنامهها آشنا شوید<ph name="END_LINK" /></translation> <translation id="4743990041512863976">مجاز است – <ph name="PERMISSION_DETAILS" />. <ph name="LINK_BEGIN" />دسترسی میکروفون سیستم<ph name="LINK_END" /> را روشن کنید.</translation> +<translation id="4744172369799559159">برای بهبود این ویژگی، افراد بازبین صفحات گذرواژه و اطلاعات مرتبط را بازبینی میکنند، هرچند گذرواژه شما رمزگذاری شده است و برای هیچکس قابلمشاهده نیست.</translation> <translation id="4744260496658845719">روشنایی نور پسزمینه صفحهکلید</translation> <translation id="4744268813103118742">رفتن به سایت</translation> <translation id="4744571849207727284">Excel</translation> @@ -6336,6 +6338,7 @@ <translation id="5434065355175441495">PKCS #1 RSA رمزگذاری</translation> <translation id="5435274640623994081">فعال کردن گزارشگیری از نماد شنیداری</translation> <translation id="5435779377906857208">دسترسی <ph name="HOST" /> به مکان شما همیشه مجاز باشد</translation> +<translation id="5436211819997237281">صفحه زبانه جدید شما را افزونه فعلی مدیریت میکند</translation> <translation id="5436492226391861498">منتظر تونل پراکسی...</translation> <translation id="5436510242972373446">جستجوی <ph name="SITE_NAME" />:</translation> <translation id="5438014818441491616">عرض پنجره <ph name="WINDOW_SIDE" /> اکنون <ph name="WINDOW_SIZE_PERCENT" /> است، عرض قاب <ph name="PANE_SIDE" /> اکنون <ph name="PANE_SIZE_PERCENT" /> است.</translation> @@ -9228,6 +9231,7 @@ <translation id="7529411698175791732">اتصال اینترنت را بررسی کنید. اگر مشکل حل نشد، از سیستم خارج شوید و دوباره به آن وارد شوید.</translation> <translation id="7529865045818406536">اگر بیشاز یک شبکه قبلی دردسترس باشد، از شبکههای برگزیده استفاده خواهد شد</translation> <translation id="7530016656428373557">نسبت تخلیه به وات</translation> +<translation id="7530215951451994972">ساخت تصویر</translation> <translation id="7531771599742723865">دستگاه درحال استفاده است</translation> <translation id="7531779363494549572">به «تنظیمات > برنامهها و اعلانها > اعلانها» بروید.</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> پاسخ نمیدهد. برای بستن برنامه، «بستن اجباری» را انتخاب کنید.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index e96979df..5a7f9e6 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -2234,6 +2234,7 @@ <translation id="2514326558286966059">Mas mabilis na mag-unlock gamit ang iyong fingerprint</translation> <translation id="2514465118223423406">Kapag nakakonekta ang mouse</translation> <translation id="2514938842036917377">Ide-delete nito ang <ph name="TOTAL_USAGE" /> na data na sino-store ng <ph name="SITE_NAME" />, magkakaugnay na site, at mga naka-install na app</translation> +<translation id="2515489088825102986">Higit pa tungkol sa feature na ito at ang iyong privacy</translation> <translation id="2515586267016047495">Alt</translation> <translation id="251722524540674480">Kumpirmahin ang iyong username</translation> <translation id="2517472476991765520">I-scan</translation> @@ -3437,6 +3438,7 @@ <translation id="3387829698079331264">Hindi pinapayagang makaalam kung aktibo mong ginagamit ang iyong device</translation> <translation id="3388094447051599208">Malapit nang mapuno ang tray para sa output</translation> <translation id="3388788256054548012">Naka-encrypt ang file na ito. Hilingin sa may-ari nitong i-decrypt ito.</translation> +<translation id="3389326266972418853">Higit pa tungkol sa naka-automate na pagpapalit ng password</translation> <translation id="3390013585654699824">Mga detalye ng app</translation> <translation id="3390442085511866400">I-save ang Video &Frame Bilang...</translation> <translation id="3390530051434634135">Tandaan: <ph name="NOTE" /></translation> @@ -5385,6 +5387,7 @@ <translation id="4744268813103118742">Pumunta Sa Site</translation> <translation id="4744571849207727284">Excel</translation> <translation id="4744981231093950366">{NUM_TABS,plural, =1{I-unmute ang site}one{I-unmute ang mga site}other{I-unmute ang mga site}}</translation> +<translation id="4745096442457817087">Nakita sa isang pampublikong breach sa data ang iyong password</translation> <translation id="4745500401920035244">Gumawa ang iyong administrator ng pagbabago sa buong system na nagdi-disable sa ilang lumang profile. Hindi mo na maa-access ang profile na ito pero puwede mo pa rin itong alisin</translation> <translation id="474609389162964566">I-access ang iyong Assistant gamit ang "Hey Google"</translation> <translation id="4746757725581505837">Ide-delete mo ang iyong data sa <ph name="BRAND" /> na naka-save sa device na ito</translation> @@ -6481,6 +6484,7 @@ <translation id="5533343601674003130">Serbisyo sa PDF</translation> <translation id="5537725057119320332">I-cast</translation> <translation id="5539070192556911367">Hindi maabot ang Google</translation> +<translation id="5541091577812545428">Hindi nabago ang password</translation> <translation id="5542132724887566711">Profile</translation> <translation id="5542750926112347543">Na-block ang cookies mula sa <ph name="DOMAIN" /></translation> <translation id="5542949973455282971">Kumokonekta sa <ph name="CARRIER_NAME" /></translation> @@ -8285,6 +8289,7 @@ <translation id="6841186874966388268">Mga error</translation> <translation id="6842135459748401207">Mga device lang na naka-sign in sa <ph name="USER_EMAIL" /></translation> <translation id="6842136130964845393">Para matiyak na maa-access mo anumang oras ang iyong mga naka-save na password, i-verify na ikaw ito</translation> +<translation id="6842670680297285750">Bagong split view sa kasalukuyang tab</translation> <translation id="6842749380892715807">Huling na-download ang mga sitelist ng XML noong <ph name="LAST_DATE_DOWNLOAD" />.</translation> <translation id="6842868554183332230">Karaniwang nade-detect ng mga site kung aktibo mong ginagamit ang iyong device para maitakda ang iyong availability sa mga chat app</translation> <translation id="6843264316370513305">Pag-debug sa Network</translation> @@ -9304,6 +9309,7 @@ <translation id="7585106857920830898">Sinusuri gamit ang mga patakaran sa seguridad ng iyong organisasyon...</translation> <translation id="7586498138629385861">Patuloy na tatakbo ang Chrome habang nakabukas ang Chrome Apps.</translation> <translation id="7587806318633605613">History ng suhestyon</translation> +<translation id="7589448773774086276">Bagong Split View sa Kasalukuyang Tab</translation> <translation id="7589461650300748890">Naku. Mag-ingat.</translation> <translation id="7590883480672980941">Mga setting ng input</translation> <translation id="7592060599656252486">Ilan</translation> @@ -10041,6 +10047,7 @@ <translation id="8077579734294125741">Iba pang Profile sa Chrome</translation> <translation id="8077749280021225629">I-delete din ang data mula sa pag-browse (<ph name="URL" />) na posibleng mag-sign out sa iyo sa <ph name="DOMAIN" />.<ph name="LEARN_MORE" /></translation> <translation id="80790299200510644">Paghahanap ng Larawan</translation> +<translation id="8079606020824373126">Puwedeng i-update ng Google Password Manager ang iyong account para magkaroon ng malakas na password at i-save ito sa <ph name="EMAIL" />. <ph name="PASSWORD_CHANGE" /></translation> <translation id="80798452873915119">Puwedeng magtanong ang mga site na pamahalaan ang mga window sa lahat ng iyong display</translation> <translation id="8080028325999236607">Isara ang Lahat ng Tab</translation> <translation id="8081989000209387414">I-disable ang pag-debug ng ADB?</translation> @@ -10252,6 +10259,7 @@ <translation id="8230134520748321204">I-save ang password para sa <ph name="ORIGIN" />?</translation> <translation id="8230326817897075865">I-delete ang <ph name="CREDENTIAL_TYPE" /></translation> <translation id="8230446983261649357">Huwag payagan ang mga site na magpakita ng mga imahe</translation> +<translation id="8231438895476693774">Magdagdag ng Tab sa Bagong Split View</translation> <translation id="823226567613548870">i-delete ang iyong data sa <ph name="BRAND" /></translation> <translation id="8233028084277069927">Buksan na Ngayon</translation> <translation id="8234795456569844941">Pakitulungan ang aming mga engineer na ayusin ang problemang ito. Sabihin sa amin kung ano ang nangyari bago mo nakuha ang mensahe ng error sa profile:</translation> @@ -10264,6 +10272,7 @@ <translation id="8239932336306009582">Hindi pinapayagang magpadala ng mga notification</translation> <translation id="8241040075392580210">Makulimlim</translation> <translation id="8241338426526905580">Walang certificate</translation> +<translation id="8241650983304689286">Magdagdag ng tab sa bagong split view</translation> <translation id="8241806945692107836">Tinutukoy ang configuration ng device...</translation> <translation id="8241868517363889229">Basahin at baguhin ang iyong mga bookmark</translation> <translation id="8242273718576931540">Hindi makakonekta ang iyong device sa network na ito. <ph name="BEGIN_LINK_LEARN_MORE" />Matuto pa<ph name="END_LINK_LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 603bcd3..3a57631 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -2220,6 +2220,7 @@ <translation id="2514326558286966059">Արագ ապակողպեք մատնահետքի օգնությամբ</translation> <translation id="2514465118223423406">Երբ մկնիկը միացված է</translation> <translation id="2514938842036917377"><ph name="SITE_NAME" /> կայքի, առնչվող կայքերի և տեղադրված հավելվածների կողմից պահված <ph name="TOTAL_USAGE" /> ծավալով տվյալները կջնջվեն</translation> +<translation id="2515489088825102986">Իմանալ ավելին այս գործառույթի և ձեր գաղտնիության մասին</translation> <translation id="2515586267016047495">Alt</translation> <translation id="251722524540674480">Հաստատեք ձեր օգտանունը</translation> <translation id="2517472476991765520">Որոնել</translation> @@ -3421,6 +3422,7 @@ <translation id="3387829698079331264">Կայքեր, որոնց թույլատրված չէ տեղեկանալ, երբ դուք ակտիվորեն օգտագործում եք ձեր սարքը</translation> <translation id="3388094447051599208">Տպիչի ելքային դարակը գրեթե լցված է</translation> <translation id="3388788256054548012">Այս ֆայլը գաղտնագրված է։ Խնդրեք սեփականատիրոջը վերծանել այն։</translation> +<translation id="3389326266972418853">Իմանալ ավելին գաղտնաբառի ավտոմատ փոփոխության մասին</translation> <translation id="3390013585654699824">Հավելվածի մասին</translation> <translation id="3390442085511866400">Պահել տեսանյութի կադրը որպես...</translation> <translation id="3390530051434634135">Նշում՝ <ph name="NOTE" /></translation> @@ -5369,6 +5371,7 @@ <translation id="4744268813103118742">Անցնել կայք</translation> <translation id="4744571849207727284">Excel</translation> <translation id="4744981231093950366">{NUM_TABS,plural, =1{Միացնել կայքի ձայնը}one{Միացնել կայքի ձայնը}other{Միացնել կայքերի ձայնը}}</translation> +<translation id="4745096442457817087">Տվյալների հրապարակային արտահոսքի արդյունքում ձեր գաղտնաբառը բացահայտվել է</translation> <translation id="4745500401920035244">Ձեր ադմինիստրատորը համակարգի ընդհանուր փոփոխություններ է կատարել, որի հետևանքով որոշ հին պրոֆիլներ անջատվել են։ Դուք այլևս չեք կարող օգտագործել այս պրոֆիլը, սակայն կարող եք ջնջել այն</translation> <translation id="474609389162964566">Ակտիվացրեք ձեր Օգնականը՝ ասելով «Ok Google»</translation> <translation id="4746757725581505837">Դուք պատրաստվում եք ջնջել «<ph name="BRAND" />» ծառայության ձեր տվյալները, որոնք պահված են այս սարքում</translation> @@ -10018,6 +10021,7 @@ <translation id="8077579734294125741">Այլ Chrome պրոֆիլներ</translation> <translation id="8077749280021225629">Ջնջել նաև այցելությունների պատմությունը (<ph name="URL" />)։ Նկատի ունեցեք, որ արդյունքում հնարավոր է դուրս գաք ձեր հաշվից <ph name="DOMAIN" /> կայքում։ <ph name="LEARN_MORE" /></translation> <translation id="80790299200510644">Որոնում պատկերով</translation> +<translation id="8079606020824373126">Google գաղտնաբառերի կառավարիչը կարող է թարմացնել ձեր հաշիվը նոր հուսալի գաղտնաբառով և պահել <ph name="EMAIL" /> էլփոստում։ <ph name="PASSWORD_CHANGE" /></translation> <translation id="80798452873915119">Կայքերը կարող են հայցել պատուհանները բոլոր էկրաններին կառավարելու թույլտվություն</translation> <translation id="8080028325999236607">Փակել բոլոր ներդիրները</translation> <translation id="8081989000209387414">Անջատե՞լ ADB վրիպազերծումը</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 9214945..473d5e2 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -6470,6 +6470,7 @@ <translation id="5533343601674003130">PDF სერვისი</translation> <translation id="5537725057119320332">მაუწყებლობა</translation> <translation id="5539070192556911367">Google-თან დაკავშირება ვერ ხერხდება</translation> +<translation id="5541091577812545428">პაროლი არ შეცვლილა</translation> <translation id="5542132724887566711">პროფილი</translation> <translation id="5542750926112347543">ქუქი-ჩანაწერები <ph name="DOMAIN" />-დან დაბლოკილია</translation> <translation id="5542949973455282971">მიმდინარეობს <ph name="CARRIER_NAME" />-თან დაკავშირება</translation> @@ -8272,6 +8273,7 @@ <translation id="6841186874966388268">შეცდომები</translation> <translation id="6842135459748401207">მხოლოდ <ph name="USER_EMAIL" />-ში შესული მოწყობილობები</translation> <translation id="6842136130964845393">იმაში დასარწმუნებლად, რომ ყოველთვის შეძლებთ თქვენს შენახულ პაროლებზე წვდომას, დაადასტურეთ, რომ ეს თქვენ ხართ</translation> +<translation id="6842670680297285750">გაყოფის ახალი ხედი მიმდინარე ჩანართით</translation> <translation id="6842749380892715807">საიტების XML სიების ბოლო ჩამოტვირთვის თარიღია <ph name="LAST_DATE_DOWNLOAD" />.</translation> <translation id="6842868554183332230">თქვენ მიერ თქვენი მოწყობილობის აქტიურად გამოყენების შესახებ ინფორმაცია საიტებს, როგორც წესი, სჭირდება თქვენი ხელმისაწვდომობის მისათითებლად ჩეთის აპებში</translation> <translation id="6843264316370513305">ქსელის გამართვა</translation> @@ -9290,6 +9292,7 @@ <translation id="7585106857920830898">მიმდინარეობს თქვენი ორგანიზაციის უსაფრთხოების წესებთან შესაბამისობის შემოწმება...</translation> <translation id="7586498138629385861">Chrome გააგრძელებს მუშაობას, სანამ Chrome პროგრამები გახსნილი იქნება.</translation> <translation id="7587806318633605613">შემოთავაზებების ისტორია</translation> +<translation id="7589448773774086276">გაყოფის ახალი ხედი მიმდინარე ჩანართით</translation> <translation id="7589461650300748890">ფრთხილად!</translation> <translation id="7590883480672980941">შეყვანის პარამეტრები</translation> <translation id="7592060599656252486">ზოგიერთი</translation> @@ -10237,6 +10240,7 @@ <translation id="8230134520748321204">გსურთ, <ph name="ORIGIN" />-ის პაროლის შენახვა?</translation> <translation id="8230326817897075865"><ph name="CREDENTIAL_TYPE" />-ის წაშლა</translation> <translation id="8230446983261649357">საიტებისთვის სურათების ჩვენების აკრძალვა</translation> +<translation id="8231438895476693774">დაამატეთ ჩანართი გაყოფის ახალ ხედში</translation> <translation id="823226567613548870">თქვენი <ph name="BRAND" />-ის მონაცემების წაშლა</translation> <translation id="8233028084277069927">ახლავე გახსნა</translation> <translation id="8234795456569844941">დაეხმარეთ ჩვენს ინჟინრებს ამ პრობლემის მოგვარებაში. გვიამბეთ, რა უძღვოდა წინ პროფილთან დაკავშირებული შეცდომის გამოჩენას:</translation> @@ -10249,6 +10253,7 @@ <translation id="8239932336306009582">შეტყობინებების გამოგზავნა დაუშვებელია</translation> <translation id="8241040075392580210">ჩრდილოვანი</translation> <translation id="8241338426526905580">სერტიფიკატები არ არის</translation> +<translation id="8241650983304689286">დაამატეთ ჩანართი გაყოფის ახალ ხედში</translation> <translation id="8241806945692107836">მოწყობილობის კონფიგურაციის განსაზღვრა...</translation> <translation id="8241868517363889229">სანიშნეების წაკითხვა და შეცვლა</translation> <translation id="8242273718576931540">თქვენი მოწყობილობა ვერ ახერხებს ამ ქსელთან დაკავშირებას. <ph name="BEGIN_LINK_LEARN_MORE" />შეიტყვეთ მეტი<ph name="END_LINK_LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 7c1d5a2..54e124a3 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -2236,6 +2236,7 @@ <translation id="2514326558286966059">Atrakinkite greičiau kontroliniu kodu</translation> <translation id="2514465118223423406">Kai prijungta pelė</translation> <translation id="2514938842036917377">Bus ištrinta <ph name="TOTAL_USAGE" /> duomenų, kuriuos saugo <ph name="SITE_NAME" />, susijusios svetainės ir įdiegtos programos</translation> +<translation id="2515489088825102986">Daugiau apie šią funkciją ir jūsų privatumą</translation> <translation id="2515586267016047495">Alt</translation> <translation id="251722524540674480">Naudotojo vardo patvirtinimas</translation> <translation id="2517472476991765520">Nuskaityti</translation> @@ -3439,6 +3440,7 @@ <translation id="3387829698079331264">Neleidžiama sužinoti, kada aktyviai naudojate įrenginį</translation> <translation id="3388094447051599208">Išvesties dėklas beveik pilnas</translation> <translation id="3388788256054548012">Šis failas šifruotas. Paprašykite jo savininko iššifruoti.</translation> +<translation id="3389326266972418853">Daugiau apie automatinį slaptažodžio keitimą</translation> <translation id="3390013585654699824">Išsami programos informacija</translation> <translation id="3390442085511866400">Išsaugoti vaizdo įrašo &rėmelį kaip...</translation> <translation id="3390530051434634135">Pastaba: <ph name="NOTE" /></translation> @@ -5387,6 +5389,7 @@ <translation id="4744268813103118742">Eiti į svetainę</translation> <translation id="4744571849207727284">Excel</translation> <translation id="4744981231093950366">{NUM_TABS,plural, =1{Įjungti svetainės garsą}one{Įjungti svetainių garsą}few{Įjungti svetainių garsą}many{Įjungti svetainių garsą}other{Įjungti svetainių garsą}}</translation> +<translation id="4745096442457817087">Jūsų slaptažodis rastas viešajame duomenų saugos pažeidime</translation> <translation id="4745500401920035244">Administratorius atliko visos sistemos pakeitimą, dėl kurio buvo išjungti kai kurie seni profiliai. Nebegalite pasiekti šio profilio, bet vis tiek galite jį pašalinti</translation> <translation id="474609389162964566">Galimybė pasiekti Padėjėją pasakius „Ok Google“</translation> <translation id="4746757725581505837">Ketinate ištrinti <ph name="BRAND" /> duomenis, išsaugotus šiame įrenginyje</translation> @@ -10048,6 +10051,7 @@ <translation id="8077579734294125741">Kiti „Chrome“ profiliai</translation> <translation id="8077749280021225629">Taip pat ištrinti naršymo duomenis (<ph name="URL" />). Tai padarius būsite atjungti nuo <ph name="DOMAIN" />. <ph name="LEARN_MORE" /></translation> <translation id="80790299200510644">Vaizdų paieška</translation> +<translation id="8079606020824373126">„Google“ slaptažodžių tvarkyklė gali atnaujinti paskyrą taikydama sudėtingą slaptažodį ir išsaugoti jį adresu <ph name="EMAIL" />. <ph name="PASSWORD_CHANGE" /></translation> <translation id="80798452873915119">Svetainėse gali būti prašoma tvarkyti langus visuose ekranuose</translation> <translation id="8080028325999236607">Uždaryti visus skirtukus</translation> <translation id="8081989000209387414">Išjungti ADB derinimą?</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 14c8dd9..d96f70df 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -2179,6 +2179,7 @@ <translation id="24786041351753425">Dayakan perkhidmatan pemulihan data.</translation> <translation id="2479541499757560845">Tetapan kebolehaksesan papan kekunci</translation> <translation id="2480868415629598489">Ubah suai data yang anda salin dan tampal</translation> +<translation id="2480881140544300950">Enjin carian semasa mengurus halaman tab baharu anda</translation> <translation id="2482878487686419369">Pemberitahuan</translation> <translation id="2482895651873876648">Tab dialihkan ke kumpulan <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="2483627560139625913">Tetapkan enjin carian dalam tetapan penyemak imbas Chrome</translation> @@ -5380,6 +5381,7 @@ <translation id="4742970037960872810">Alih keluar serlahan</translation> <translation id="4743260470722568160"><ph name="BEGIN_LINK" />Ketahui cara mengemas kini aplikasi<ph name="END_LINK" /></translation> <translation id="4743990041512863976">Dibenarkan – <ph name="PERMISSION_DETAILS" />. Hidupkan <ph name="LINK_BEGIN" />akses mikrofon sistem<ph name="LINK_END" />.</translation> +<translation id="4744172369799559159">Jurusemak menyemak halaman kata laluan dan maklumat yang berkaitan untuk meningkatkan ciri ini, walaupun kata laluan anda disulitkan dan tidak pernah dilihat oleh sesiapa.</translation> <translation id="4744260496658845719">Kecerahan cahaya latar papan kekunci</translation> <translation id="4744268813103118742">Pergi ke Laman</translation> <translation id="4744571849207727284">Excel</translation> @@ -6339,6 +6341,7 @@ <translation id="5434065355175441495">PKCS #1 Penyulitan RSA</translation> <translation id="5435274640623994081">Dayakan pengelogan ikon audio</translation> <translation id="5435779377906857208">Sentiasa membenarkan <ph name="HOST" /> untuk mengakses lokasi anda</translation> +<translation id="5436211819997237281">Sambungan semasa mengurus halaman tab baharu anda</translation> <translation id="5436492226391861498">Menunggu terowong proksi...</translation> <translation id="5436510242972373446">Cari <ph name="SITE_NAME" />:</translation> <translation id="5438014818441491616">Tetingkap <ph name="WINDOW_SIDE" /> kini <ph name="WINDOW_SIZE_PERCENT" /> lebar, anak tetingkap <ph name="PANE_SIDE" /> kini <ph name="PANE_SIZE_PERCENT" /> lebar.</translation> @@ -9229,6 +9232,7 @@ <translation id="7529411698175791732">Semak sambungan Internet anda. Jika masalah ini masih berterusan, cuba log keluar dan log masuk semula.</translation> <translation id="7529865045818406536">Rangkaian pilihan akan digunakan jika lebih daripada satu rangkaian terdahulu tersedia</translation> <translation id="7530016656428373557">Kadar Nyahcas dalam Watt</translation> +<translation id="7530215951451994972">Buat Imej</translation> <translation id="7531771599742723865">Peranti sedang digunakan</translation> <translation id="7531779363494549572">Pergi ke Tetapan > Apl & pemberitahuan > Pemberitahuan.</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> tiada respons. Pilih "Paksa tutup" untuk menutup apl.</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index 2a89658d..28f0e04 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -2164,6 +2164,7 @@ <translation id="24786041351753425">ଡାଟା ରିକଭରି ସେବାକୁ ସକ୍ଷମ କରନ୍ତୁ।</translation> <translation id="2479541499757560845">ଆକ୍ସେସିବିଲିଟୀ କୀବୋର୍ଡ ସେଟିଂସ</translation> <translation id="2480868415629598489">ଆପଣ କପି ଏବଂ ପେଷ୍ଟ କରୁଥିବା ଡାଟା ସଂଶୋଧନ କରନ୍ତୁ</translation> +<translation id="2480881140544300950">ଆପଣଙ୍କ ନୂଆ ଟାବ ପୃଷ୍ଠାକୁ ପରିଚାଳନା କରୁଥିବା ବର୍ତ୍ତମାନର ସର୍ଚ୍ଚ ଇଞ୍ଜିନ</translation> <translation id="2482878487686419369">ବିଜ୍ଞପ୍ତି</translation> <translation id="2482895651873876648"><ph name="GROUP_NAME" /> ଗୋଷ୍ଠୀକୁ ଟାବ୍ ମୁଭ୍ କରାଯାଇଛି - <ph name="GROUP_CONTENTS" /></translation> <translation id="2483627560139625913">Chrome ବ୍ରାଉଜର ସେଟିଂସରେ ସର୍ଚ୍ଚ ଇଞ୍ଜିନ ସେଟ କରନ୍ତୁ</translation> @@ -5364,6 +5365,7 @@ <translation id="4742970037960872810">ହାଇଲାଇଟ୍ କାଢ଼ି ଦିଅନ୍ତୁ</translation> <translation id="4743260470722568160"><ph name="BEGIN_LINK" /> ଏହା ଜାଣନ୍ତୁ ଯେ କିପରି ଆପ୍ଲିକେସନ୍ଗୁଡ଼ିକୁ ଅପ୍ଡେଟ୍ କରିବେ<ph name="END_LINK" /></translation> <translation id="4743990041512863976">ଅନୁମତି ଦିଆଯାଇଛି – <ph name="PERMISSION_DETAILS" />। <ph name="LINK_BEGIN" />ସିଷ୍ଟମ ମାଇକ୍ରୋଫୋନ ଆକ୍ସେସ<ph name="LINK_END" />କୁ ଚାଲୁ କରନ୍ତୁ।</translation> +<translation id="4744172369799559159">ଏହି ଫିଚରକୁ ଉନ୍ନତ କରିବା ପାଇଁ ମାନବମାନେ ପାସୱାର୍ଡ ପୃଷ୍ଠା ଏବଂ ସମ୍ବନ୍ଧିତ ସୂଚନାର ସମୀକ୍ଷା କରନ୍ତି, ଯଦିଓ ଆପଣଙ୍କର ପାସୱାର୍ଡକୁ ଏନକ୍ରିପ୍ଟ କରାଯାଇଛି ଏବଂ ଯେ କୌଣସି ବ୍ୟକ୍ତି କେବେ ବି ଦେଖିନଥାନ୍ତି।</translation> <translation id="4744260496658845719">କୀବୋର୍ଡ ବେକଲାଇଟର ଉଜ୍ଜ୍ୱଳତା</translation> <translation id="4744268813103118742">ସାଇଟକୁ ଯାଆନ୍ତୁ</translation> <translation id="4744571849207727284">Excel</translation> @@ -6322,6 +6324,7 @@ <translation id="5434065355175441495">PKCS #1 RSA ଏନ୍କ୍ରିପ୍ସନ୍</translation> <translation id="5435274640623994081">ଇୟରକନ୍ ଲଗ୍ଇନ୍କୁ ସକ୍ଷମ କରନ୍ତୁ</translation> <translation id="5435779377906857208">ଆପଣଙ୍କ ଲୋକେସନ୍ ଆକ୍ସେସ୍ କରିବାକୁ <ph name="HOST" />କୁ ସର୍ବଦା ଅନୁମତି ଦିଅନ୍ତୁ</translation> +<translation id="5436211819997237281">ଆପଣଙ୍କ ନୂଆ ଟାବ ପୃଷ୍ଠାକୁ ପରିଚାଳନା କରୁଥିବା ବର୍ତ୍ତମାନର ଏକ୍ସଟେନସନ</translation> <translation id="5436492226391861498">ପ୍ରକ୍ସି ଟନେଲ୍ ପାଇଁ ଅପେକ୍ଷାରତ...</translation> <translation id="5436510242972373446"><ph name="SITE_NAME" /> ସର୍ଚ୍ଚ କରନ୍ତୁ:</translation> <translation id="5438014818441491616"><ph name="WINDOW_SIDE" /> ୱିଣ୍ଡୋ ବର୍ତ୍ତମାନ <ph name="WINDOW_SIZE_PERCENT" /> ୱାଇଡ, <ph name="PANE_SIDE" /> ପେନ ବର୍ତ୍ତମାନ <ph name="PANE_SIZE_PERCENT" /> ୱାଇଡ।</translation> @@ -9210,6 +9213,7 @@ <translation id="7529411698175791732">ଆପଣଙ୍କର ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ଯାଞ୍ଚ କରନ୍ତୁ। ଯଦି ସମସ୍ୟା ଜାରି ରହେ, ସାଇନ୍ ଆଉଟ୍ କରି ପୁଣି ସାଇନ୍ ଇନ୍ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="7529865045818406536">ଯଦି ଗୋଟିଏରୁ ଅଧିକ ପୂର୍ବବର୍ତ୍ତୀ ନେଟୱାର୍କ ଉପଲବ୍ଧ ଥାଏ ତେବେ ପସନ୍ଦର ନେଟୱାର୍କଗୁଡ଼ିକୁ ବ୍ୟବହାର କରାଯିବ</translation> <translation id="7530016656428373557">ୱାଟ୍ରେ ଡିସ୍ଚାର୍ଜ୍ ହାର</translation> +<translation id="7530215951451994972">ଇମେଜ ତିଆରି କରନ୍ତୁ</translation> <translation id="7531771599742723865">ଡିଭାଇସଟି ବ୍ୟବହାର କରାଯାଉଛି</translation> <translation id="7531779363494549572">ସେଟିଂସ୍ > ଆପ୍ସ ଏବଂ ବିଜ୍ଞପ୍ତି > ବିଜ୍ଞପ୍ତିକୁ ଯାଆନ୍ତୁ।</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> କୌଣସି ପ୍ରତିକ୍ରିୟା କରୁନାହିଁ। ଆପ୍କୁ ବନ୍ଦ କରିବା ପାଇଁ "ବଳପୂର୍ବକ ବନ୍ଦ କରନ୍ତୁ"କୁ ଚୟନ କରନ୍ତୁ।</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 29eed12..1dcdcfa2 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -2234,6 +2234,7 @@ <translation id="2514326558286966059">ਆਪਣੇ ਫਿੰਗਰਪ੍ਰਿੰਟ ਨਾਲ ਵਧੇਰੇ ਤੇਜ਼ੀ ਨਾਲ ਅਣਲਾਕ ਕਰੋ</translation> <translation id="2514465118223423406">ਕਿਸੇ ਮਾਊਸ ਦੇ ਪਹਿਲਾਂ ਤੋਂ ਕਨੈਕਟ ਹੋਣ 'ਤੇ</translation> <translation id="2514938842036917377">ਇੰਝ ਕਰਨ ਨਾਲ <ph name="SITE_NAME" />, ਸੰਬੰਧਿਤ ਸਾਈਟਾਂ ਅਤੇ ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਾਂ ਦਾ ਸਟੋਰ ਕੀਤਾ <ph name="TOTAL_USAGE" /> ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ</translation> +<translation id="2515489088825102986">ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਅਤੇ ਤੁਹਾਡੀ ਪਰਦੇਦਾਰੀ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ</translation> <translation id="2515586267016047495">Alt</translation> <translation id="251722524540674480">ਆਪਣੇ ਵਰਤੋਂਕਾਰ ਨਾਮ ਦੀ ਤਸਦੀਕ ਕਰੋ</translation> <translation id="2517472476991765520">ਸਕੈਨ ਕਰੋ</translation> @@ -3438,6 +3439,7 @@ <translation id="3387829698079331264">ਤੁਹਾਡੇ ਵੱਲੋਂ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਸਰਗਰਮੀ ਨਾਲ ਵਰਤਣ ਦੇ ਸਮੇਂ ਨੂੰ ਜਾਣਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ</translation> <translation id="3388094447051599208">ਆਊਟਪੁੱਟ ਟ੍ਰੇਅ ਲਗਭਗ ਭਰ ਗਈ ਹੈ</translation> <translation id="3388788256054548012">ਇਹ ਫ਼ਾਈਲ ਇਨਕ੍ਰਿਪਟਡ ਹੈ। ਇਸਦੇ ਮਾਲਕ ਨੂੰ ਡਿਕ੍ਰਿਪਟ ਕਰਨ ਲਈ ਕਹੋ।</translation> +<translation id="3389326266972418853">ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਪਾਸਵਰਡ ਬਦਲਣ ਦੀ ਸੁਵਿਧਾ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ</translation> <translation id="3390013585654699824">ਐਪ ਸੰਬੰਧੀ ਵੇਰਵੇ</translation> <translation id="3390442085511866400">ਵੀਡੀਓ ਫ੍ਰੇਮ ਨੂੰ ਇਸ ਵਜੋਂ ਰੱਖਿਅਤ ਕਰੋ...</translation> <translation id="3390530051434634135">ਨੋਟ: <ph name="NOTE" /></translation> @@ -5386,6 +5388,7 @@ <translation id="4744268813103118742">ਸਾਈਟ 'ਤੇ ਜਾਓ</translation> <translation id="4744571849207727284">Excel</translation> <translation id="4744981231093950366">{NUM_TABS,plural, =1{ਸਾਈਟ ਅਣਮਿਊਟ ਕਰੋ}one{ਸਾਈਟ ਅਣਮਿਊਟ ਕਰੋ}other{ਸਾਈਟਾਂ ਅਣਮਿਊਟ ਕਰੋ}}</translation> +<translation id="4745096442457817087">ਤੁਹਾਡਾ ਪਾਸਵਰਡ ਕਿਸੇ ਜਨਤਕ ਡਾਟਾ ਉਲੰਘਣਾ ਵਿੱਚ ਮਿਲਿਆ ਸੀ</translation> <translation id="4745500401920035244">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਸਮੁੱਚੇ ਸਿਸਟਮ ਵਿੱਚ ਅਜਿਹਾ ਬਦਲਾਅ ਕੀਤਾ ਹੈ ਜੋ ਕੁਝ ਪੁਰਾਣੇ ਪ੍ਰੋਫਾਈਲਾਂ ਨੂੰ ਬੰਦ ਕਰ ਦਿੰਦਾ ਹੈ। ਤੁਸੀਂ ਹੁਣ ਇਸ ਪ੍ਰੋਫਾਈਲ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕਰ ਸਕਦੇ ਹੋ, ਪਰ ਇਸਨੂੰ ਹਾਲੇ ਹੀ ਹਟਾ ਸਕਦੇ ਹੋ</translation> <translation id="474609389162964566">"Ok Google" ਬੋਲ ਕੇ ਆਪਣੀ Assistant ਤੱਕ ਪਹੁੰਚ ਕਰੋ</translation> <translation id="4746757725581505837">ਤੁਸੀਂ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਰੱਖਿਅਤ ਕੀਤਾ ਆਪਣਾ <ph name="BRAND" /> ਡਾਟਾ ਮਿਟਾਉਣ ਲੱਗੇ ਹੋ</translation> @@ -10039,6 +10042,7 @@ <translation id="8077579734294125741">ਹੋਰ Chrome ਪ੍ਰੋਫਾਈਲਾਂ</translation> <translation id="8077749280021225629">ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ (<ph name="URL" />) ਵੀ ਮਿਟਾਓ, ਜੋ ਤੁਹਾਨੂੰ <ph name="DOMAIN" /> ਤੋਂ ਸਾਈਨ-ਆਊਟ ਕਰ ਦੇਵੇਗਾ।<ph name="LEARN_MORE" /></translation> <translation id="80790299200510644">ਚਿੱਤਰ ਖੋਜ</translation> +<translation id="8079606020824373126">Google Password Manager ਤੁਹਾਡੇ ਖਾਤੇ ਨੂੰ ਮਜ਼ਬੂਤ ਪਾਸਵਰਡ ਨਾਲ ਅੱਪਡੇਟ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਇਸਨੂੰ <ph name="EMAIL" /> ਵਿੱਚ ਰੱਖਿਅਤ ਕਰ ਸਕਦਾ ਹੈ। <ph name="PASSWORD_CHANGE" /></translation> <translation id="80798452873915119">ਸਾਈਟਾਂ ਤੁਹਾਡੀਆਂ ਸਾਰੀਆਂ ਡਿਸਪਲੇਆਂ 'ਤੇ ਵਿੰਡੋਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ ਪੁੱਛ ਸਕਦੀਆਂ ਹਨ</translation> <translation id="8080028325999236607">ਸਾਰੀਆਂ ਟੈਬਸ ਬੰਦ ਕਰੋ</translation> <translation id="8081989000209387414">ਕੀ ADB ਡੀਬੱਗਿੰਗ ਨੂੰ ਬੰਦ ਕਰਨਾ ਹੈ?</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index b7eeec8..b37ed9c 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -2164,6 +2164,7 @@ <translation id="24786041351753425">Omogućite uslugu vraćanja podataka.</translation> <translation id="2479541499757560845">Podešavanja tastature za pristupnost</translation> <translation id="2480868415629598489">Menjanje podataka koje prekopirate</translation> +<translation id="2480881140544300950">Aktuelni pretraživač koji upravlja stranicom nove kartice</translation> <translation id="2482878487686419369">Obaveštenja</translation> <translation id="2482895651873876648">Kartica je premeštena u grupu <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="2483627560139625913">Podesite pretraživač u podešavanjima Chrome pregledača</translation> @@ -5365,6 +5366,7 @@ <translation id="4742970037960872810">Ukloni isticanje</translation> <translation id="4743260470722568160"><ph name="BEGIN_LINK" />Saznajte kako da ažurirate aplikacije<ph name="END_LINK" /></translation> <translation id="4743990041512863976">Dozvoljeno je – <ph name="PERMISSION_DETAILS" />. Uključite <ph name="LINK_BEGIN" />pristup sistemskom mikrofonu<ph name="LINK_END" />.</translation> +<translation id="4744172369799559159">Ljudi pregledaju stranice sa lozinkama i povezane informacije da bi poboljšali ovu funkciju, iako je lozinka šifrovana i niko ne može da je vidi.</translation> <translation id="4744260496658845719">Pozadinsko osvetljenje tastature</translation> <translation id="4744268813103118742">Idi na sajt</translation> <translation id="4744571849207727284">Excel</translation> @@ -6322,6 +6324,7 @@ <translation id="5434065355175441495">PKCS #1 RSA šifrovanje</translation> <translation id="5435274640623994081">Omogući evidentiranje audio ikona</translation> <translation id="5435779377906857208">Uvek dozvoli da <ph name="HOST" /> pristupa mikrofonu</translation> +<translation id="5436211819997237281">Aktuelni dodatak koji upravlja stranicom nove kartice</translation> <translation id="5436492226391861498">Čekanje na proksi tunel...</translation> <translation id="5436510242972373446">Pretraži sajt <ph name="SITE_NAME" />:</translation> <translation id="5438014818441491616">Prozor <ph name="WINDOW_SIDE" /> je sada širok <ph name="WINDOW_SIZE_PERCENT" />, a okno <ph name="PANE_SIDE" /> je sada široko <ph name="PANE_SIZE_PERCENT" />.</translation> @@ -9217,6 +9220,7 @@ <translation id="7529411698175791732">Proverite internet vezu. Ako se problem i dalje javlja, probajte da se odjavite i ponovo prijavite.</translation> <translation id="7529865045818406536">Željene mreže će se koristiti ako je dostupno više od jedne prethodne mreže</translation> <translation id="7530016656428373557">Nivo potrošnje u vatima</translation> +<translation id="7530215951451994972">Napravite sliku</translation> <translation id="7531771599742723865">Uređaj se koristi</translation> <translation id="7531779363494549572">Idite u Podešavanja > Aplikacije i obaveštenja > Obaveštenja.</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> ne reaguje. Izaberite „Prinudno zatvori“ da biste zatvorili aplikaciju.</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 1c3f827be..627bc9ea 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -2164,6 +2164,7 @@ <translation id="24786041351753425">Омогућите услугу враћања података.</translation> <translation id="2479541499757560845">Подешавања тастатуре за приступност</translation> <translation id="2480868415629598489">Мењање података које прекопирате</translation> +<translation id="2480881140544300950">Актуелни претраживач који управља страницом нове картице</translation> <translation id="2482878487686419369">Обавештења</translation> <translation id="2482895651873876648">Картица је премештена у групу <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> <translation id="2483627560139625913">Подесите претраживач у подешавањима Chrome прегледача</translation> @@ -5365,6 +5366,7 @@ <translation id="4742970037960872810">Уклони истицање</translation> <translation id="4743260470722568160"><ph name="BEGIN_LINK" />Сазнајте како да ажурирате апликације<ph name="END_LINK" /></translation> <translation id="4743990041512863976">Дозвољено је – <ph name="PERMISSION_DETAILS" />. Укључите <ph name="LINK_BEGIN" />приступ системском микрофону<ph name="LINK_END" />.</translation> +<translation id="4744172369799559159">Људи прегледају странице са лозинкама и повезане информације да би побољшали ову функцију, иако је лозинка шифрована и нико не може да је види.</translation> <translation id="4744260496658845719">Позадинско осветљење тастатуре</translation> <translation id="4744268813103118742">Иди на сајт</translation> <translation id="4744571849207727284">Excel</translation> @@ -6322,6 +6324,7 @@ <translation id="5434065355175441495">PKCS #1 RSA шифровање</translation> <translation id="5435274640623994081">Омогући евидентирање аудио икона</translation> <translation id="5435779377906857208">Увек дозволи да <ph name="HOST" /> приступа микрофону</translation> +<translation id="5436211819997237281">Актуелни додатак који управља страницом нове картице</translation> <translation id="5436492226391861498">Чекање на прокси тунел...</translation> <translation id="5436510242972373446">Претражи сајт <ph name="SITE_NAME" />:</translation> <translation id="5438014818441491616">Прозор <ph name="WINDOW_SIDE" /> је сада широк <ph name="WINDOW_SIZE_PERCENT" />, а окно <ph name="PANE_SIDE" /> је сада широко <ph name="PANE_SIZE_PERCENT" />.</translation> @@ -9217,6 +9220,7 @@ <translation id="7529411698175791732">Проверите интернет везу. Ако се проблем и даље јавља, пробајте да се одјавите и поново пријавите.</translation> <translation id="7529865045818406536">Жељене мреже ће се користити ако је доступно више од једне претходне мреже</translation> <translation id="7530016656428373557">Ниво потрошње у ватима</translation> +<translation id="7530215951451994972">Направите слику</translation> <translation id="7531771599742723865">Уређај се користи</translation> <translation id="7531779363494549572">Идите у Подешавања > Апликације и обавештења > Обавештења.</translation> <translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> не реагује. Изаберите „Принудно затвори“ да бисте затворили апликацију.</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index e048b53..66dfac3 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -6466,6 +6466,7 @@ <translation id="5533343601674003130">PDF xizmati</translation> <translation id="5537725057119320332">Cast</translation> <translation id="5539070192556911367">Googlega ulanmadi</translation> +<translation id="5541091577812545428">Parol yangilanmadi</translation> <translation id="5542132724887566711">Profil</translation> <translation id="5542750926112347543"><ph name="DOMAIN" /> saytidan cookie fayllar bloklandi</translation> <translation id="5542949973455282971"><ph name="CARRIER_NAME" /> nomli tarmoqqa ulanmoqda</translation> @@ -8268,6 +8269,7 @@ <translation id="6841186874966388268">Xatoliklar</translation> <translation id="6842135459748401207">Faqat <ph name="USER_EMAIL" /> hisobiga kirilgan qurilmalar</translation> <translation id="6842136130964845393">Parollarni istalgan vaqt ochish uchun shaxsingizni tasdiqlang</translation> +<translation id="6842670680297285750">Joriy varaqni yangi ajratilgan rejimga olish</translation> <translation id="6842749380892715807">XML saytlar roʻyxati oxirgi marta <ph name="LAST_DATE_DOWNLOAD" />sanasida yuklab olingan.</translation> <translation id="6842868554183332230">Chat ilovalarida onlayn ekaningizni aniqlash uchun saytlarga qurilmalardan foydalanish axboroti kerak.</translation> <translation id="6843264316370513305">Tarmoq xatolarini aniqlash</translation> @@ -9286,6 +9288,7 @@ <translation id="7585106857920830898">Tashkilotingizning xavfsizlik siyosati asosida tekshirilmoqda...</translation> <translation id="7586498138629385861">Chrome ilovalari yopilmaguncha brauzer ishlashda davom etadi.</translation> <translation id="7587806318633605613">Tavsiyalar tarixi</translation> +<translation id="7589448773774086276">Joriy varaqni yangi ajratilgan rejimga olish</translation> <translation id="7589461650300748890">Ehtiyot bo‘ling.</translation> <translation id="7590883480672980941">Kiritish sozlamalari</translation> <translation id="7592060599656252486">Ayrimlar</translation> @@ -10232,6 +10235,7 @@ <translation id="8230134520748321204"><ph name="ORIGIN" /> uchun parol saqlansinmi?</translation> <translation id="8230326817897075865">Oʻchirish: <ph name="CREDENTIAL_TYPE" /></translation> <translation id="8230446983261649357">Bu saytga rasmlarni chiqarishni taqiqlash</translation> +<translation id="8231438895476693774">Yangi ajratilgan rejimga varaq kiritish</translation> <translation id="823226567613548870"><ph name="BRAND" /> maʼlumotlaringizni oʻchirmoqchi</translation> <translation id="8233028084277069927">Hozir ochish</translation> <translation id="8234795456569844941">Profil xatolik xabaridan oldin nima bo‘lganligi haqida ma’lumot bering:</translation> @@ -10244,6 +10248,7 @@ <translation id="8239932336306009582">Bildirishnomalar yuborishga ruxsat berilmagan</translation> <translation id="8241040075392580210">Bulutcha</translation> <translation id="8241338426526905580">Sertifikatlar topilmadi</translation> +<translation id="8241650983304689286">Yangi ajratilgan rejimga varaq kiritish</translation> <translation id="8241806945692107836">Qurilma sozlamalari aniqlanmoqda...</translation> <translation id="8241868517363889229">Xatcho‘plarni ko‘rish va o‘zgartirish</translation> <translation id="8242273718576931540">Qurilma bu tarmoqqa ulanmadi. <ph name="BEGIN_LINK_LEARN_MORE" />Batafsil<ph name="END_LINK_LEARN_MORE" /></translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 27b7c66..8a11afe 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -2180,6 +2180,7 @@ <translation id="24786041351753425">Nika amandla isevisi yokuthola idatha.</translation> <translation id="2479541499757560845">Amasethingi ekhibhodi lokufinyeleleka</translation> <translation id="2480868415629598489">Shintsha idatha oyikopishayo futhi uyinamathisele</translation> +<translation id="2480881140544300950">Injini yokusesha yamanje ilawula ikhasi lakho lethebhu entsha</translation> <translation id="2482878487686419369">Izaziso</translation> <translation id="2482895651873876648">Ithebhu ihanjswe eqenjini le-<ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> <translation id="2483627560139625913">Setha injini yokusesha kumasethingi ebhrawuza ye-Chrome</translation> @@ -5380,6 +5381,7 @@ <translation id="4742970037960872810">Susa ukugqama</translation> <translation id="4743260470722568160"><ph name="BEGIN_LINK" />Funda ukuthi ungabuyekeza kanjani izinhlelo zokusebenza<ph name="END_LINK" /></translation> <translation id="4743990041512863976">Kuvunyelwe – <ph name="PERMISSION_DETAILS" />. Vula <ph name="LINK_BEGIN" />ukufinyelela imakrofoni yesistimu<ph name="LINK_END" />.</translation> +<translation id="4744172369799559159">Abantu babuyekeza amakhasi ephasiwedi nolwazi oluhlobene ukuze bathuthukise lesi sakhi, nakuba iphasiwedi yakho ibethelwe futhi ingakaze ibonwe muntu.</translation> <translation id="4744260496658845719">Ukukhanya kwangemuva kwekhibhodi</translation> <translation id="4744268813103118742">Iya kusayithi</translation> <translation id="4744571849207727284">I-Excel</translation> @@ -6339,6 +6341,7 @@ <translation id="5434065355175441495">Ukubethelwa kwe-PKCS #1 RSA</translation> <translation id="5435274640623994081">Nika amandla ukungena ngemvume kwe-earcon</translation> <translation id="5435779377906857208">Vumela i-<ph name="HOST" /> njalo ukuba ifinyelele indawo yakho</translation> +<translation id="5436211819997237281">Isandiso samanje silawula ikhasi lakho lethebhu entsha</translation> <translation id="5436492226391861498">Ilinde ithonela yommeleli...</translation> <translation id="5436510242972373446">Sesha i-<ph name="SITE_NAME" />:</translation> <translation id="5438014818441491616">Iwindi <ph name="WINDOW_SIDE" /> manje lingu-<ph name="WINDOW_SIZE_PERCENT" /> ububanzi, ipane <ph name="PANE_SIDE" /> manje ingu-<ph name="PANE_SIZE_PERCENT" /> ububanzi.</translation> @@ -9231,6 +9234,7 @@ <translation id="7529411698175791732">Hlola uxhumo lwakho lwe-inthanethi. Uma inkinga iqhubeka, zama ukuphuma bese ungene futhi.</translation> <translation id="7529865045818406536">Amanethiwekhi ancanyelwayo azosetshenziswa uma inethiwekhi yangaphambilini engaphezu kweyodwa itholakala</translation> <translation id="7530016656428373557">Ukulinganiselwa kokukhishwa ngamawathi</translation> +<translation id="7530215951451994972">Sungula Isithombe</translation> <translation id="7531771599742723865">Idivayisi iyasetshenziswa</translation> <translation id="7531779363494549572">Hamba kuzilungiselelo > Izinhlelo zokusebenza nezaziso > Izaziso.</translation> <translation id="7532009420053991888">I-<ph name="LINUX_APP_NAME" /> ayiphenduli. Khetha okuthi "Phoqa ukuvala" ukuze uvale uhlelo lokusebenza.</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index c53e314..c0851e2 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -1526,7 +1526,7 @@ Web & App Activity </message> <message name="IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_AI_SETTINGS_LABEL" desc="Text of the AI Innovations sublabel in the completion card of the 'Privacy Guide'."> - Explore how AI shapes your experience and make informed choices about your privacy + Learn more about how AI shapes your experience and the controls provided by Chrome </message> <message name="IDS_SETTINGS_PRIVACY_GUIDE_MSBB_CARD_HEADER" desc="Header of the 'make searches and browsing better' card in the 'Privacy Guide'."> Choose your search and browsing quality
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_AI_SETTINGS_LABEL.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_AI_SETTINGS_LABEL.png.sha1 index 81976bd..a24502a 100644 --- a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_AI_SETTINGS_LABEL.png.sha1 +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PRIVACY_GUIDE_COMPLETION_CARD_AI_SETTINGS_LABEL.png.sha1
@@ -1 +1 @@ -1bbd2960bf290bba9aa43452cef7aa06bf661a58 \ No newline at end of file +9b7975d9b54d8e69034de1614ce4f633cbad2046 \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 11b893ea..5189d765 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -3651,8 +3651,6 @@ "apps/intent_helper/intent_chip_display_prefs.h", "autocomplete/tab_matcher_desktop.cc", "autocomplete/tab_matcher_desktop.h", - "autofill_ai/chrome_autofill_ai_client.cc", - "autofill_ai/chrome_autofill_ai_client.h", "badging/badge_manager.cc", "badging/badge_manager.h", "badging/badge_manager_delegate.h",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index c61c0d2..91acf3f 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -11635,11 +11635,6 @@ {"permissions-ai-v3", flag_descriptions::kPermissionsAIv3Name, flag_descriptions::kPermissionsAIv3Description, kOsDesktop, FEATURE_VALUE_TYPE(permissions::features::kPermissionsAIv3)}, - - {"permissions-ai-v3-geolocation", - flag_descriptions::kPermissionsAIv3GeolocationName, - flag_descriptions::kPermissionsAIv3GeolocationDescription, kOsDesktop, - FEATURE_VALUE_TYPE(permissions::features::kPermissionsAIv3Geolocation)}, #if BUILDFLAG(IS_CHROMEOS) {"exclude-display-in-mirror-mode", flag_descriptions::kExcludeDisplayInMirrorModeName,
diff --git a/chrome/browser/ash/base/locale_util.cc b/chrome/browser/ash/base/locale_util.cc index 6f612175..a64d531 100644 --- a/chrome/browser/ash/base/locale_util.cc +++ b/chrome/browser/ash/base/locale_util.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/ash/base/locale_util.h" +#include <optional> +#include <string> #include <utility> #include <vector> @@ -160,8 +162,10 @@ loaded_locale == locale) { // Use resolved locale to match `ResourceBundle::LoadLocaleResources` // behavior. And skip reloading if locale is resolved successfully. - if (l10n_util::CheckAndResolveLocale(locale, &data->result.loaded_locale, - /*perform_io=*/false)) { + if (std::optional<std::string> resolved_locale = + l10n_util::CheckAndResolveLocale( + locale, l10n_util::CheckLocaleMode::kUseKnownLocalesList)) { + data->result.loaded_locale = std::move(*resolved_locale); data->result.success = true; data->keep_cached_fonts = true; FinishSwitchLanguage(std::move(data));
diff --git a/chrome/browser/ash/customization/customization_document_browsertest.cc b/chrome/browser/ash/customization/customization_document_browsertest.cc index 6819876..9aea446 100644 --- a/chrome/browser/ash/customization/customization_document_browsertest.cc +++ b/chrome/browser/ash/customization/customization_document_browsertest.cc
@@ -25,6 +25,7 @@ #include "chromeos/ash/components/system/statistics_provider.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_utils.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/l10n/l10n_util.h" @@ -34,6 +35,8 @@ using locale_util::LanguageSwitchResult; using locale_util::SwitchLanguageCallback; +using ::testing::Optional; +using ::testing::StrEq; class LanguageSwitchedWaiter { public: @@ -200,11 +203,9 @@ ProfileManager::GetActiveUserProfile()); waiter.Wait(); { - std::string resolved_locale; base::ScopedAllowBlockingForTesting allow_blocking; - l10n_util::CheckAndResolveLocale(languages_available[i], - &resolved_locale); - EXPECT_EQ(GetExpectedLanguage(languages_available[i]), resolved_locale) + EXPECT_THAT(l10n_util::CheckAndResolveLocale(languages_available[i]), + Optional(StrEq(GetExpectedLanguage(languages_available[i])))) << "CheckAndResolveLocale() failed for language='" << languages_available[i] << "'"; }
diff --git a/chrome/browser/ash/input_method/input_method_syncer.cc b/chrome/browser/ash/input_method/input_method_syncer.cc index 8a4294e..5b4fc04 100644 --- a/chrome/browser/ash/input_method/input_method_syncer.cc +++ b/chrome/browser/ash/input_method/input_method_syncer.cc
@@ -5,7 +5,9 @@ #include "chrome/browser/ash/input_method/input_method_syncer.h" #include <algorithm> +#include <optional> #include <set> +#include <string> #include <string_view> #include <vector> @@ -81,11 +83,11 @@ // If a language code resolves to a supported backup locale, replace it // with the resolved locale. - std::string resolved_locale; - if (l10n_util::CheckAndResolveLocale(*value_iter, &resolved_locale)) { + if (std::optional<std::string> resolved_locale = + l10n_util::CheckAndResolveLocale(*value_iter)) { if (binary_search(accept_language_codes.begin(), - accept_language_codes.end(), resolved_locale)) { - *value_iter = resolved_locale; + accept_language_codes.end(), *resolved_locale)) { + *value_iter = *resolved_locale; ++value_iter; continue; }
diff --git a/chrome/browser/autofill/autocomplete_browsertest.cc b/chrome/browser/autofill/autocomplete_browsertest.cc index 1e04332..85db450 100644 --- a/chrome/browser/autofill/autocomplete_browsertest.cc +++ b/chrome/browser/autofill/autocomplete_browsertest.cc
@@ -147,6 +147,7 @@ };)", kDefaultAutocompleteInputId); ASSERT_TRUE(content::ExecJs(web_contents(), js)); + content::SimulateEndOfPaintHoldingOnPrimaryMainFrame(web_contents()); for (const char c : value) { ui::DomKey key = ui::DomKey::FromCharacter(c);
diff --git a/chrome/browser/autofill_ai/OWNERS b/chrome/browser/autofill_ai/OWNERS deleted file mode 100644 index a6bd72a..0000000 --- a/chrome/browser/autofill_ai/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://components/autofill_ai/OWNERS \ No newline at end of file
diff --git a/chrome/browser/autofill_ai/chrome_autofill_ai_client.cc b/chrome/browser/autofill_ai/chrome_autofill_ai_client.cc deleted file mode 100644 index f8e44a5..0000000 --- a/chrome/browser/autofill_ai/chrome_autofill_ai_client.cc +++ /dev/null
@@ -1,64 +0,0 @@ -// Copyright 2024 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/autofill_ai/chrome_autofill_ai_client.h" - -#include "base/check_deref.h" -#include "base/feature_list.h" -#include "base/functional/callback_helpers.h" -#include "chrome/browser/autofill/autofill_entity_data_manager_factory.h" -#include "chrome/browser/autofill/strike_database_factory.h" -#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" -#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/signin/identity_manager_factory.h" -#include "chrome/browser/signin/signin_util.h" -#include "chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller.h" -#include "components/autofill/content/browser/content_autofill_driver.h" -#include "components/autofill/content/browser/content_autofill_driver_factory.h" -#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h" -#include "components/autofill/core/browser/field_types.h" -#include "components/autofill/core/browser/form_types.h" -#include "components/autofill/core/common/autofill_features.h" -#include "components/autofill/core/common/autofill_prefs.h" -#include "components/autofill_ai/core/browser/autofill_ai_client.h" -#include "components/autofill_ai/core/browser/autofill_ai_manager.h" -#include "components/prefs/pref_service.h" -#include "content/public/browser/web_contents.h" - -ChromeAutofillAiClient::ChromeAutofillAiClient( - content::WebContents* web_contents) - : web_contents_(CHECK_DEREF(web_contents)), - prediction_improvements_manager_{ - this, - autofill::StrikeDatabaseFactory::GetForProfile( - Profile::FromBrowserContext(web_contents->GetBrowserContext())), - } { - DCHECK(base::FeatureList::IsEnabled( - autofill::features::kAutofillAiWithDataSchema)); -} - -ChromeAutofillAiClient::~ChromeAutofillAiClient() = default; - -// static -std::unique_ptr<ChromeAutofillAiClient> -ChromeAutofillAiClient::MaybeCreateForWebContents( - content::WebContents* web_contents) { - if (!base::FeatureList::IsEnabled( - autofill::features::kAutofillAiWithDataSchema)) { - return nullptr; - } - return base::WrapUnique<ChromeAutofillAiClient>( - new ChromeAutofillAiClient(web_contents)); -} - -autofill::ContentAutofillClient& ChromeAutofillAiClient::GetAutofillClient() { - // TODO: crbug.com/371534239 - Make the lifecycle relationships explicit. - return CHECK_DEREF( - autofill::ContentAutofillClient::FromWebContents(&*web_contents_)); -} - -autofill_ai::AutofillAiManager& ChromeAutofillAiClient::GetManager() { - return prediction_improvements_manager_; -}
diff --git a/chrome/browser/autofill_ai/chrome_autofill_ai_client.h b/chrome/browser/autofill_ai/chrome_autofill_ai_client.h deleted file mode 100644 index c484810..0000000 --- a/chrome/browser/autofill_ai/chrome_autofill_ai_client.h +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2024 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_AUTOFILL_AI_CHROME_AUTOFILL_AI_CLIENT_H_ -#define CHROME_BROWSER_AUTOFILL_AI_CHROME_AUTOFILL_AI_CLIENT_H_ - -#include <memory> -#include <optional> - -#include "components/autofill/content/browser/content_autofill_client.h" -#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h" -#include "components/autofill_ai/core/browser/autofill_ai_client.h" -#include "components/autofill_ai/core/browser/autofill_ai_manager.h" - -namespace content { -class WebContents; -} // namespace content - -// An implementation of `AutofillAiClient` for Desktop and -// Android. -class ChromeAutofillAiClient : public autofill_ai::AutofillAiClient { - public: - ChromeAutofillAiClient(const ChromeAutofillAiClient&) = delete; - ChromeAutofillAiClient& operator=(const ChromeAutofillAiClient&) = delete; - ~ChromeAutofillAiClient() override; - - // Creates a `ChromeAutofillAiClient` for `web_contents` if - // `kAutofillAiWithDataSchema` is enabled. Returns `nullptr` otherwise. - [[nodiscard]] static std::unique_ptr<ChromeAutofillAiClient> - MaybeCreateForWebContents(content::WebContents* web_contents); - - // AutofillAiClient: - autofill::ContentAutofillClient& GetAutofillClient() override; - autofill_ai::AutofillAiManager& GetManager() override; - - private: - explicit ChromeAutofillAiClient(content::WebContents* web_contents); - - const raw_ref<content::WebContents> web_contents_; - - autofill_ai::AutofillAiManager prediction_improvements_manager_; -}; - -#endif // CHROME_BROWSER_AUTOFILL_AI_CHROME_AUTOFILL_AI_CLIENT_H_
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc index e64d972..2bf81f9 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -87,6 +87,7 @@ #include "chrome/common/buildflags.h" #include "chrome/common/url_constants.h" #include "components/autofill/core/browser/data_manager/addresses/address_data_manager.h" +#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h" #include "components/autofill/core/browser/data_manager/payments/payments_data_manager.h" #include "components/autofill/core/browser/data_manager/personal_data_manager.h" #include "components/autofill/core/browser/strike_databases/strike_database.h"
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_features.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_features.cc index dfa752a..c739511 100644 --- a/chrome/browser/enterprise/connectors/analysis/content_analysis_features.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_features.cc
@@ -10,7 +10,7 @@ BASE_FEATURE(kEnableAsyncUploadAfterVerdict, "EnableAsyncUploadAfterVerdict", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kEnableResumableUploadOnConsumerScan, "EnableResumableUploadOnConsumerScan",
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index d7b86895..ce9301e 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn
@@ -91,6 +91,8 @@ "api/developer_private/inspectable_views_finder.h", "api/developer_private/profile_info_generator.cc", "api/developer_private/profile_info_generator.h", + "api/gcm/gcm_api.cc", + "api/gcm/gcm_api.h", "api/history/history_api.cc", "api/history/history_api.h", "api/identity/extension_token_key.cc", @@ -266,6 +268,8 @@ "extension_garbage_collector.h", "extension_garbage_collector_factory.cc", "extension_garbage_collector_factory.h", + "extension_gcm_app_handler.cc", + "extension_gcm_app_handler.h", "extension_install_error_menu_item_id_provider.cc", "extension_install_error_menu_item_id_provider.h", "extension_install_prompt.cc", @@ -621,8 +625,6 @@ "api/file_system/chrome_file_system_delegate.h", "api/file_system/file_entry_picker.cc", "api/file_system/file_entry_picker.h", - "api/gcm/gcm_api.cc", - "api/gcm/gcm_api.h", "api/identity/gaia_remote_consent_flow.cc", "api/identity/gaia_remote_consent_flow.h", "api/identity/identity_clear_all_cached_auth_tokens_function.cc", @@ -759,8 +761,6 @@ "extension_disabled_ui_desktop.cc", "extension_error_ui_desktop.cc", "extension_error_ui_desktop.h", - "extension_gcm_app_handler.cc", - "extension_gcm_app_handler.h", "extension_menu_icon_loader.cc", "extension_menu_icon_loader.h", "extension_uninstall_dialog.cc",
diff --git a/chrome/browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc b/chrome/browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc index c296881..c9b0d497 100644 --- a/chrome/browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc +++ b/chrome/browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc
@@ -41,6 +41,7 @@ #include "components/gcm_driver/fake_gcm_app_handler.h" #include "components/gcm_driver/fake_gcm_client.h" #include "components/gcm_driver/fake_gcm_client_factory.h" +#include "components/gcm_driver/fake_gcm_profile_service.h" #include "components/gcm_driver/gcm_client_factory.h" #include "components/gcm_driver/gcm_driver.h" #include "components/gcm_driver/gcm_profile_service.h" @@ -55,6 +56,7 @@ #include "extensions/browser/extension_registrar.h" #include "extensions/browser/extension_system.h" #include "extensions/browser/uninstall_reason.h" +#include "extensions/buildflags/buildflags.h" #include "extensions/common/extension.h" #include "extensions/common/extension_builder.h" #include "extensions/common/extension_features.h" @@ -79,12 +81,15 @@ #include "components/user_manager/user_manager_impl.h" #endif +static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE)); + namespace extensions { namespace { const char kTestExtensionName[] = "FooBar"; +#if !BUILDFLAG(IS_ANDROID) void RequestProxyResolvingSocketFactoryOnUIThread( Profile* profile, base::WeakPtr<gcm::GCMProfileService> service, @@ -106,6 +111,7 @@ FROM_HERE, base::BindOnce(&RequestProxyResolvingSocketFactoryOnUIThread, profile, service, std::move(receiver))); } +#endif // !BUILDFLAG(IS_ANDROID) } // namespace @@ -230,6 +236,9 @@ public: static std::unique_ptr<KeyedService> BuildGCMProfileService( content::BrowserContext* context) { +#if BUILDFLAG(IS_ANDROID) + return gcm::FakeGCMProfileService::Build(context); +#else Profile* profile = Profile::FromBrowserContext(context); scoped_refptr<base::SequencedTaskRunner> ui_thread = content::GetUIThreadTaskRunner({}); @@ -249,6 +258,7 @@ IdentityManagerFactory::GetForProfile(profile), base::WrapUnique(new gcm::FakeGCMClientFactory(ui_thread, io_thread)), ui_thread, io_thread, blocking_task_runner); +#endif // BUILDFLAG(IS_ANDROID) } ExtensionGCMAppHandlerTest() @@ -485,8 +495,15 @@ waiter()->WaitUntilCompleted(); EXPECT_EQ(instance_id::InstanceID::SUCCESS, gcm_app_handler()->delete_id_result()); +#if BUILDFLAG(IS_ANDROID) + // Unregistration is not supported on Android. + // TODO(crbug.com/421235963): Consider dropping support on other platforms. + EXPECT_EQ(gcm::GCMClient::UNKNOWN_ERROR, + gcm_app_handler()->unregistration_result()); +#else EXPECT_EQ(gcm::GCMClient::SUCCESS, gcm_app_handler()->unregistration_result()); +#endif } TEST_F(ExtensionGCMAppHandlerTest, UpdateExtensionWithGcmPermissionKept) {
diff --git a/chrome/browser/extensions/api/gcm/gcm_api.cc b/chrome/browser/extensions/api/gcm/gcm_api.cc index 7543362..85651256 100644 --- a/chrome/browser/extensions/api/gcm/gcm_api.cc +++ b/chrome/browser/extensions/api/gcm/gcm_api.cc
@@ -15,10 +15,12 @@ #include "base/functional/bind.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" +#include "chrome/browser/extensions/extension_gcm_app_handler.h" #include "chrome/browser/gcm/gcm_profile_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/extensions/api/gcm.h" #include "components/gcm_driver/common/gcm_message.h" +#include "components/gcm_driver/gcm_client.h" #include "components/gcm_driver/gcm_driver.h" #include "components/gcm_driver/gcm_profile_service.h" #include "extensions/browser/event_router.h" @@ -110,12 +112,19 @@ api::gcm::Register::Params::Create(args()); EXTENSION_FUNCTION_VALIDATE(params); +#if BUILDFLAG(IS_ANDROID) + // This server API was deprecated by Firebase in 2019. Don't bother trying to + // implement register() on Android - it will just return an error. + // TODO(crbug.com/421235963): Consider deprecating on other platforms. + return RespondNow(Error(GcmResultToError(gcm::GCMClient::UNKNOWN_ERROR))); +#else GetGCMDriver()->Register( extension()->id(), params->sender_ids, base::BindOnce(&GcmRegisterFunction::CompleteFunctionWithResult, this)); // Register() might have returned synchronously. return did_respond() ? AlreadyResponded() : RespondLater(); +#endif // BUILDFLAG(IS_ANDROID) } void GcmRegisterFunction::CompleteFunctionWithResult( @@ -137,12 +146,19 @@ GcmUnregisterFunction::~GcmUnregisterFunction() = default; ExtensionFunction::ResponseAction GcmUnregisterFunction::Run() { +#if BUILDFLAG(IS_ANDROID) + // This server API was deprecated by Firebase in 2019. Don't bother trying to + // implement register() on Android - it will just return an error. + // TODO(crbug.com/421235963): Consider deprecating on other platforms. + return RespondNow(Error(GcmResultToError(gcm::GCMClient::UNKNOWN_ERROR))); +#else GetGCMDriver()->Unregister( extension()->id(), base::BindOnce(&GcmUnregisterFunction::CompleteFunctionWithResult, this)); // Unregister might have responded already (synchronously). return did_respond() ? AlreadyResponded() : RespondLater(); +#endif // BUILDFLAG(IS_ANDROID) } void GcmUnregisterFunction::CompleteFunctionWithResult(
diff --git a/chrome/browser/extensions/api/gcm/gcm_api.h b/chrome/browser/extensions/api/gcm/gcm_api.h index b1d6ecd4..1936c53 100644 --- a/chrome/browser/extensions/api/gcm/gcm_api.h +++ b/chrome/browser/extensions/api/gcm/gcm_api.h
@@ -9,6 +9,9 @@ #include "chrome/common/extensions/api/gcm.h" #include "components/gcm_driver/gcm_client.h" #include "extensions/browser/extension_function.h" +#include "extensions/buildflags/buildflags.h" + +static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE)); namespace gcm { class GCMDriver;
diff --git a/chrome/browser/extensions/api/gcm/gcm_apitest.cc b/chrome/browser/extensions/api/gcm/gcm_apitest.cc index 273f4c31..47bd891 100644 --- a/chrome/browser/extensions/api/gcm/gcm_apitest.cc +++ b/chrome/browser/extensions/api/gcm/gcm_apitest.cc
@@ -10,12 +10,11 @@ #include "chrome/browser/extensions/extension_gcm_app_handler.h" #include "chrome/browser/gcm/gcm_profile_service_factory.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser.h" #include "chrome/common/chrome_switches.h" -#include "chrome/test/base/ui_test_utils.h" #include "components/gcm_driver/fake_gcm_profile_service.h" #include "components/sync/base/command_line_switches.h" #include "content/public/test/browser_test.h" +#include "content/public/test/browser_test_utils.h" #include "extensions/test/result_catcher.h" using extensions::ResultCatcher; @@ -70,7 +69,7 @@ const Extension* LoadTestExtension(const std::string& extension_path, const std::string& page_name); - gcm::FakeGCMProfileService* service() const; + gcm::FakeGCMProfileService* service(); }; void GcmApiTest::SetUpCommandLine(base::CommandLine* command_line) { @@ -94,10 +93,9 @@ service()->set_collect(true); } -gcm::FakeGCMProfileService* GcmApiTest::service() const { +gcm::FakeGCMProfileService* GcmApiTest::service() { return static_cast<gcm::FakeGCMProfileService*>( - gcm::GCMProfileServiceFactory::GetInstance()->GetForProfile( - browser()->profile())); + gcm::GCMProfileServiceFactory::GetInstance()->GetForProfile(profile())); } const Extension* GcmApiTest::LoadTestExtension( @@ -108,11 +106,15 @@ if (extension) { const GURL extension_url = extension->ResolveExtensionURL(page_name); EXPECT_TRUE(extension_url.is_valid()); - EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), extension_url)); + EXPECT_TRUE(NavigateToURL(extension_url)); + EXPECT_TRUE(content::WaitForLoadStop(GetActiveWebContents())); } return extension; } +#if !BUILDFLAG(IS_ANDROID) +// Register and unregister are deprecated on the server. Don't test them. +// TODO(crbug.com/421235963): Consider deprecating on other platforms. IN_PROC_BROWSER_TEST_F(GcmApiTest, RegisterValidation) { ASSERT_TRUE(RunExtensionTest("gcm/functions/register_validation")); } @@ -133,6 +135,7 @@ ASSERT_TRUE(RunExtensionTest("gcm/functions/unregister")); } +#endif // !BUILDFLAG(IS_ANDROID) IN_PROC_BROWSER_TEST_F(GcmApiTest, SendValidation) { ASSERT_TRUE(RunExtensionTest("gcm/functions/send")); @@ -250,6 +253,9 @@ EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); } +#if !BUILDFLAG(IS_ANDROID) +// Register and unregister are deprecated on the server. Don't test them. +// TODO(crbug.com/421235963): Consider deprecating on other platforms. IN_PROC_BROWSER_TEST_F(GcmApiTest, Incognito) { ResultCatcher catcher; catcher.RestrictToBrowserContext(profile()); @@ -263,5 +269,6 @@ EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); EXPECT_TRUE(incognito_catcher.GetNextResult()) << incognito_catcher.message(); } +#endif // !BUILDFLAG(IS_ANDROID) } // namespace extensions
diff --git a/chrome/browser/extensions/extension_gcm_app_handler.cc b/chrome/browser/extensions/extension_gcm_app_handler.cc index bd6352e..0f945068 100644 --- a/chrome/browser/extensions/extension_gcm_app_handler.cc +++ b/chrome/browser/extensions/extension_gcm_app_handler.cc
@@ -40,7 +40,6 @@ } // namespace - // static BrowserContextKeyedAPIFactory<ExtensionGCMAppHandler>* ExtensionGCMAppHandler::GetFactoryInstance() { @@ -180,10 +179,20 @@ } void ExtensionGCMAppHandler::OnDeleteIDCompleted( - const std::string& app_id, instance_id::InstanceID::Result result) { + const std::string& app_id, + instance_id::InstanceID::Result result) { +#if BUILDFLAG(IS_ANDROID) + // The server-side unregister API is deprecated, so don't try to unregister. + // TODO(crbug.com/421235963): Consider deprecating on other platforms. + base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, base::BindOnce(&ExtensionGCMAppHandler::OnUnregisterCompleted, + weak_factory_.GetWeakPtr(), app_id, + gcm::GCMClient::UNKNOWN_ERROR)); +#else GetGCMDriver()->Unregister( app_id, base::BindOnce(&ExtensionGCMAppHandler::OnUnregisterCompleted, weak_factory_.GetWeakPtr(), app_id)); +#endif // BUILDFLAG(IS_ANDROID) // InstanceIDDriver::RemoveInstanceID will delete the InstanceID itself. // Postpone to do it outside this calling context to avoid any risk to
diff --git a/chrome/browser/extensions/extension_gcm_app_handler.h b/chrome/browser/extensions/extension_gcm_app_handler.h index f8c3d542..6c9fd08 100644 --- a/chrome/browser/extensions/extension_gcm_app_handler.h +++ b/chrome/browser/extensions/extension_gcm_app_handler.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_GCM_APP_HANDLER_H_ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_GCM_APP_HANDLER_H_ +#include <map> #include <memory> #include <string> @@ -18,6 +19,9 @@ #include "extensions/browser/browser_context_keyed_api_factory.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_registry_observer.h" +#include "extensions/buildflags/buildflags.h" + +static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE)); class Profile;
diff --git a/chrome/browser/extensions/keyed_services/chrome_browser_context_keyed_service_factories.cc b/chrome/browser/extensions/keyed_services/chrome_browser_context_keyed_service_factories.cc index 805c38e..2760933 100644 --- a/chrome/browser/extensions/keyed_services/chrome_browser_context_keyed_service_factories.cc +++ b/chrome/browser/extensions/keyed_services/chrome_browser_context_keyed_service_factories.cc
@@ -18,6 +18,7 @@ #include "chrome/browser/extensions/extension_action_dispatcher.h" #include "chrome/browser/extensions/extension_allowlist_factory.h" #include "chrome/browser/extensions/extension_garbage_collector_factory.h" +#include "chrome/browser/extensions/extension_gcm_app_handler.h" #include "chrome/browser/extensions/extension_management.h" #include "chrome/browser/extensions/extension_sync_service_factory.h" #include "chrome/browser/extensions/extension_web_ui_override_registrar.h" @@ -34,7 +35,6 @@ #if BUILDFLAG(ENABLE_EXTENSIONS) #include "chrome/browser/extensions/chrome_app_icon_service_factory.h" #include "chrome/browser/extensions/extension_error_controller_factory.h" -#include "chrome/browser/extensions/extension_gcm_app_handler.h" #include "chrome/browser/extensions/extension_web_ui_override_registrar.h" #include "chrome/browser/extensions/menu_manager_factory.h" #include "chrome/browser/extensions/permissions/permissions_updater.h" @@ -67,6 +67,7 @@ extensions::ExtensionActionDispatcher::GetFactoryInstance(); extensions::ExtensionAllowlistFactory::GetInstance(); extensions::ExtensionGarbageCollectorFactory::GetInstance(); + extensions::ExtensionGCMAppHandler::GetFactoryInstance(); extensions::ExtensionManagementFactory::GetInstance(); extensions::ExtensionUpdaterFactory::GetInstance(); extensions::ExtensionWebUIOverrideRegistrar::GetFactoryInstance(); @@ -82,7 +83,6 @@ #if BUILDFLAG(ENABLE_EXTENSIONS) extensions::ChromeAppIconServiceFactory::GetInstance(); extensions::ExtensionErrorControllerFactory::GetInstance(); - extensions::ExtensionGCMAppHandler::GetFactoryInstance(); extensions::MenuManagerFactory::GetInstance(); #if BUILDFLAG(ENABLE_PLUGINS) extensions::PluginManager::GetFactoryInstance();
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 66e9aa5..366b9de 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -6995,6 +6995,11 @@ "expiry_milestone": 140 }, { + "name": "ntp-mia-entrypoint", + "owners": [ "radunitescu@google.com", "stkhapugin@chromium.org" ], + "expiry_milestone": 148 + }, + { "name": "ntp-microsoft-authentication-module", "owners": [ "pauladedeji@google.com", "rtatum@google.com", "tiborg@chromium.org" ], "expiry_milestone": 150
diff --git a/chrome/browser/l10n_util_browsertest.cc b/chrome/browser/l10n_util_browsertest.cc index 60f1062..57422a8 100644 --- a/chrome/browser/l10n_util_browsertest.cc +++ b/chrome/browser/l10n_util_browsertest.cc
@@ -2,16 +2,22 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "ui/base/l10n/l10n_util.h" + #include <string> #include <vector> + #include "base/threading/thread_restrictions.h" #include "build/build_config.h" #include "chrome/test/base/in_process_browser_test.h" #include "content/public/test/browser_test.h" -#include "ui/base/l10n/l10n_util.h" +#include "testing/gmock/include/gmock/gmock.h" namespace { +using ::testing::Optional; +using ::testing::StrEq; + class L10nUtilBrowserTest : public InProcessBrowserTest { public: L10nUtilBrowserTest() = default; @@ -30,20 +36,20 @@ l10n_util::GetAcceptLanguages(&accept_languages); for (const std::string& locale : accept_languages) { - std::string resolved_locale; - bool resolved = l10n_util::CheckAndResolveLocale(locale, &resolved_locale, - /*perform_io=*/false); - std::string resolved_locale_with_io; - bool resolved_with_io = l10n_util::CheckAndResolveLocale( - locale, &resolved_locale_with_io, /*perform_io=*/true); + const std::optional<std::string> resolved_locale = + l10n_util::CheckAndResolveLocale( + locale, l10n_util::CheckLocaleMode::kUseKnownLocalesList); + const std::optional<std::string> resolved_locale_with_io = + l10n_util::CheckAndResolveLocale( + locale, l10n_util::CheckLocaleMode::kVerifyLocalizationDataExists); #if BUILDFLAG(IS_ANDROID) // False positives may occur on Android and iOS (and chrome/ isn't used on // iOS, so we only need to check for Android). // False negatives should never occur - so if the call without IO returns // false, the call with I/O must return false too. - if (!resolved) { - EXPECT_FALSE(resolved_with_io) + if (!resolved_locale) { + EXPECT_FALSE(resolved_locale_with_io) << "Couldn't resolve " << locale << " without IO, but resolving with IO successfully returned " << resolved_locale_with_io; @@ -53,15 +59,15 @@ // like this as well - if the call without I/O returns something different // to the input, the same should apply to the call with I/O. if (resolved_locale != locale) { - EXPECT_NE(resolved_locale_with_io, locale) + EXPECT_THAT(resolved_locale_with_io, Optional(StrEq(locale))) << "Resolving " << locale << " without IO returned a different locale (" - << (resolved_locale.empty() ? "an empty string" : resolved_locale) + << (resolved_locale.value_or("")->empty() ? "an empty string" + : resolved_locale) << "), but resolving with IO returned the same locale"; } #else // On other platforms, the two function calls should be identical. - EXPECT_EQ(resolved, resolved_with_io); EXPECT_EQ(resolved_locale, resolved_locale_with_io); #endif }
diff --git a/chrome/browser/password_manager/chrome_password_change_service.cc b/chrome/browser/password_manager/chrome_password_change_service.cc index c313b21..ed88e4c 100644 --- a/chrome/browser/password_manager/chrome_password_change_service.cc +++ b/chrome/browser/password_manager/chrome_password_change_service.cc
@@ -121,12 +121,6 @@ tabs::TabInterface::GetFromContents(web_contents)); delegate->AddObserver(this); password_change_delegates_.push_back(std::move(delegate)); - - // Init only after `delegate` was added to the vector, so it can be - // immediately returned by GetPasswordChangeDelegate() when the flow starts. - static_cast<PasswordChangeDelegateImpl*>( - password_change_delegates_.back().get()) - ->OfferPasswordChangeUi(); #else NOTREACHED(); #endif // BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/password_manager/password_change/change_password_form_filling_submission_helper_unittest.cc b/chrome/browser/password_manager/password_change/change_password_form_filling_submission_helper_unittest.cc index afea4cc..85f29a64 100644 --- a/chrome/browser/password_manager/password_change/change_password_form_filling_submission_helper_unittest.cc +++ b/chrome/browser/password_manager/password_change/change_password_form_filling_submission_helper_unittest.cc
@@ -318,8 +318,7 @@ EXPECT_EQ(presaved_generated_password_form.url, existing_credential()->url); EXPECT_EQ(presaved_generated_password_form.signon_realm, existing_credential()->signon_realm); - EXPECT_EQ(presaved_generated_password_form.GetPasswordBackupNote(), - kNewPassword); + EXPECT_EQ(presaved_generated_password_form.GetPasswordBackup(), kNewPassword); } // If the password being changed was not stored, we will add a new credential. @@ -370,8 +369,7 @@ EXPECT_EQ(presaved_generated_password_form.password_value, kOldPassword); EXPECT_EQ(presaved_generated_password_form.url, url()); EXPECT_EQ(presaved_generated_password_form.signon_realm, kUrlString); - EXPECT_EQ(presaved_generated_password_form.GetPasswordBackupNote(), - kNewPassword); + EXPECT_EQ(presaved_generated_password_form.GetPasswordBackup(), kNewPassword); } TEST_F(ChangePasswordFormFillingSubmissionHelperTest, Failed) { @@ -417,8 +415,7 @@ EXPECT_EQ(presaved_generated_password_form.url, existing_credential()->url); EXPECT_EQ(presaved_generated_password_form.signon_realm, existing_credential()->signon_realm); - EXPECT_EQ(presaved_generated_password_form.GetPasswordBackupNote(), - kNewPassword); + EXPECT_EQ(presaved_generated_password_form.GetPasswordBackup(), kNewPassword); } TEST_F(ChangePasswordFormFillingSubmissionHelperTest, OnTimeout) { @@ -472,8 +469,7 @@ EXPECT_EQ(presaved_generated_password_form.url, existing_credential()->url); EXPECT_EQ(presaved_generated_password_form.signon_realm, existing_credential()->signon_realm); - EXPECT_EQ(presaved_generated_password_form.GetPasswordBackupNote(), - kNewPassword); + EXPECT_EQ(presaved_generated_password_form.GetPasswordBackup(), kNewPassword); histogram_tester.ExpectUniqueSample( "PasswordManager.PasswordChangeVerificationTriggeredAutomatically", false, 1); @@ -508,8 +504,7 @@ EXPECT_EQ(presaved_generated_password_form.url, existing_credential()->url); EXPECT_EQ(presaved_generated_password_form.signon_realm, existing_credential()->signon_realm); - EXPECT_EQ(presaved_generated_password_form.GetPasswordBackupNote(), - kNewPassword); + EXPECT_EQ(presaved_generated_password_form.GetPasswordBackup(), kNewPassword); } TEST_F(ChangePasswordFormFillingSubmissionHelperTest,
diff --git a/chrome/browser/password_manager/password_change_browsertest.cc b/chrome/browser/password_manager/password_change_browsertest.cc index c42b90e..5656f4a5 100644 --- a/chrome/browser/password_manager/password_change_browsertest.cc +++ b/chrome/browser/password_manager/password_change_browsertest.cc
@@ -59,35 +59,33 @@ #include "ui/views/controls/button/image_button.h" #include "ui/views/test/button_test_api.h" -using affiliations::AffiliationService; -using affiliations::MockAffiliationService; -using PasswordChangeOutcome = ::optimization_guide::proto:: - PasswordChangeSubmissionData_PasswordChangeOutcome; -using PasswordChangeErrorCase = ::optimization_guide::proto:: - PasswordChangeSubmissionData_PasswordChangeErrorCase; -using OptimizationGuideModelExecutionError = optimization_guide:: - OptimizationGuideModelExecutionError::ModelExecutionError; +namespace { + +using ::affiliations::MockAffiliationService; +using ::optimization_guide::TestModelQualityLogsUploaderService; using ::testing::_; using ::testing::An; -using ::testing::Contains; using ::testing::DoAll; using ::testing::Invoke; using ::testing::NiceMock; using ::testing::Return; +using ::testing::SizeIs; using ::testing::WithArg; -using SubmissionOutcome = PasswordChangeSubmissionVerifier::SubmissionOutcome; -using QualityStatus = optimization_guide::proto:: +using FinalModelStatus = ::optimization_guide::proto::FinalModelStatus; +using OptimizationGuideModelExecutionError = ::optimization_guide:: + OptimizationGuideModelExecutionError::ModelExecutionError; +using PasswordChangeErrorCase = ::optimization_guide::proto:: + PasswordChangeSubmissionData_PasswordChangeErrorCase; +using PasswordChangeOutcome = ::optimization_guide::proto:: + PasswordChangeSubmissionData_PasswordChangeOutcome; +using QualityStatus = ::optimization_guide::proto:: PasswordChangeQuality_StepQuality_SubmissionStatus; using SubmissionOutcome = PasswordChangeSubmissionVerifier::SubmissionOutcome; -using optimization_guide::TestModelQualityLogsUploaderService; -using FinalModelStatus = optimization_guide::proto::FinalModelStatus; -const char kPasswordChangeSubmissionOutcomeHistogram[] = +constexpr char kPasswordChangeSubmissionOutcomeHistogram[] = "PasswordManager.PasswordChangeSubmissionOutcome"; -const char kMainHost[] = "example.com"; -const char kChangePasswordURL[] = "https://example.com/password/"; - -namespace { +constexpr char kMainHost[] = "example.com"; +constexpr char kChangePasswordURL[] = "https://example.com/password/"; class MockPasswordChangeDelegateObserver : public PasswordChangeDelegate::Observer { @@ -104,13 +102,12 @@ std::unique_ptr<KeyedService> CreateTestAffiliationService( content::BrowserContext* context) { - return std::make_unique<testing::NiceMock<MockAffiliationService>>(); + return std::make_unique<NiceMock<MockAffiliationService>>(); } std::unique_ptr<KeyedService> CreateOptimizationService( content::BrowserContext* context) { - return std::make_unique< - testing::NiceMock<MockOptimizationGuideKeyedService>>(); + return std::make_unique<NiceMock<MockOptimizationGuideKeyedService>>(); } // Verifies that |test_ukm_recorder| recorder has a single entry called |entry| @@ -120,7 +117,7 @@ std::string_view entry) { std::vector<raw_ptr<const ukm::mojom::UkmEntry, VectorExperimental>> ukm_entries = test_ukm_recorder.GetEntriesByName(entry); - EXPECT_EQ(1u, ukm_entries.size()); + EXPECT_THAT(ukm_entries, SizeIs(1)); return ukm_entries[0]; } @@ -179,7 +176,7 @@ ShouldFeatureBeCurrentlyEnabledForUser( optimization_guide::UserVisibleFeatureKey:: kPasswordChangeSubmission)) - .WillByDefault(testing::Return(true)); + .WillByDefault(Return(true)); } TestModelQualityLogsUploaderService& logs_uploader() { @@ -248,19 +245,6 @@ })))); } - void StartPasswordChange(const GURL& url, - const std::u16string& username, - const std::u16string& password, - content::WebContents* web_contents) { - password_change_service()->OfferPasswordChangeUi(url, username, password, - web_contents); - // Close the leak detection bubble and simulate that it was accepted. - PasswordBubbleViewBase::CloseCurrentBubble(); - password_change_service() - ->GetPasswordChangeDelegate(web_contents) - ->StartPasswordChangeFlow(); - } - private: base::CallbackListSubscription create_services_subscription_; base::WeakPtrFactory<PasswordChangeBrowserTest> weak_ptr_factory_{this}; @@ -270,16 +254,16 @@ PasswordChangeDoesNotStartUntilPrivacyNoticeAccepted) { TabStripModel* tab_strip = browser()->tab_strip_model(); // Assert that there is a single tab. - ASSERT_EQ(1, tab_strip->count()); + ASSERT_EQ(tab_strip->count(), 1); ASSERT_FALSE( password_change_service()->GetPasswordChangeDelegate(WebContents())); const GURL main_url = WebContents()->GetLastCommittedURL(); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url)) - .WillOnce(testing::Return(GURL(kChangePasswordURL))); + .WillOnce(Return(GURL(kChangePasswordURL))); - StartPasswordChange(main_url, u"test", u"password", WebContents()); - + password_change_service()->OfferPasswordChangeUi(main_url, u"test", + u"password", WebContents()); auto* delegate = password_change_service()->GetPasswordChangeDelegate(WebContents()); @@ -296,7 +280,7 @@ static_cast<PasswordChangeDelegateImpl*>(delegate)->executor(); EXPECT_TRUE(web_contents); // Verify a new web_contents is opened with a change pwd url. - EXPECT_EQ(GURL(kChangePasswordURL), web_contents->GetURL()); + EXPECT_EQ(web_contents->GetURL(), GURL(kChangePasswordURL)); EXPECT_EQ(delegate->GetCurrentState(), PasswordChangeDelegate::State::kWaitingForChangePasswordForm); } @@ -307,15 +291,16 @@ const GURL main_url = WebContents()->GetLastCommittedURL(); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url)) - .WillOnce(testing::Return(embedded_test_server()->GetURL( + .WillOnce(Return(embedded_test_server()->GetURL( "/password/update_form_empty_fields_no_submit.html"))); - StartPasswordChange(main_url, u"test", u"pa$$word", WebContents()); - + password_change_service()->OfferPasswordChangeUi(main_url, u"test", + u"pa$$word", WebContents()); PasswordChangeDelegate* delegate = password_change_service()->GetPasswordChangeDelegate(WebContents()); + delegate->StartPasswordChangeFlow(); - auto* web_contents = + content::WebContents* web_contents = static_cast<PasswordChangeDelegateImpl*>(delegate)->executor(); // Start observing web_contents where password change happens. SetWebContents(web_contents); @@ -339,29 +324,34 @@ SetPrivacyNoticeAcceptedPref(); const GURL main_url = WebContents()->GetLastCommittedURL(); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url)) - .WillOnce(testing::Return(embedded_test_server()->GetURL( + .WillOnce(Return(embedded_test_server()->GetURL( "/password/update_form_empty_fields.html"))); - StartPasswordChange(main_url, u"test", u"pa$$word", WebContents()); + password_change_service()->OfferPasswordChangeUi(main_url, u"test", + u"pa$$word", WebContents()); - // Verify the delegate is created and it's currently waiting for change - // password form. + // Verify the delegate is created. base::WeakPtr<PasswordChangeDelegate> delegate = password_change_service() ->GetPasswordChangeDelegate(WebContents()) ->AsWeakPtr(); ASSERT_TRUE(delegate); + + // Verify delegate is waiting for change password form when password change + // starts. delegate->AddObserver(&observer); - EXPECT_EQ(PasswordChangeDelegate::State::kWaitingForChangePasswordForm, - delegate->GetCurrentState()); + delegate->StartPasswordChangeFlow(); + EXPECT_EQ(delegate->GetCurrentState(), + PasswordChangeDelegate::State::kWaitingForChangePasswordForm); // Verify observer is invoked when the state changes. EXPECT_CALL(observer, OnStateChanged(PasswordChangeDelegate::State::kChangingPassword)); - auto web_contents = static_cast<PasswordChangeDelegateImpl*>(delegate.get()) - ->executor() - ->GetWeakPtr(); + base::WeakPtr<content::WebContents> web_contents = + static_cast<PasswordChangeDelegateImpl*>(delegate.get()) + ->executor() + ->GetWeakPtr(); // Start observing web_contents where password change happens. SetWebContents(web_contents.get()); PasswordsNavigationObserver navigation_observer(web_contents.get()); @@ -369,8 +359,8 @@ // Wait and verify the old password is filled correctly. WaitForElementValue("password", "pa$$word"); - EXPECT_EQ(PasswordChangeDelegate::State::kChangingPassword, - delegate->GetCurrentState()); + EXPECT_EQ(delegate->GetCurrentState(), + PasswordChangeDelegate::State::kChangingPassword); // Observe original web_contnets again to avoid dangling ptr. SetWebContents(browser()->tab_strip_model()->GetWebContentsAt(0)); @@ -390,13 +380,14 @@ SetPrivacyNoticeAcceptedPref(); const GURL main_url = WebContents()->GetLastCommittedURL(); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url)) - .WillOnce(testing::Return(embedded_test_server()->GetURL( + .WillOnce(Return(embedded_test_server()->GetURL( "/password/update_form_empty_fields_no_submit.html"))); - StartPasswordChange(main_url, u"test", u"pa$$word", WebContents()); - + password_change_service()->OfferPasswordChangeUi(main_url, u"test", + u"pa$$word", WebContents()); PasswordChangeDelegate* delegate = password_change_service()->GetPasswordChangeDelegate(WebContents()); + delegate->StartPasswordChangeFlow(); // Start observing web_contents where password change happens. SetWebContents( @@ -407,11 +398,12 @@ // Verify generated password is pre-saved. WaitForPasswordStore(); - auto generated_password = delegate->GetGeneratedPassword(); - EXPECT_EQ(base::UTF16ToUTF8(generated_password), + std::string generated_password = + base::UTF16ToUTF8(delegate->GetGeneratedPassword()); + EXPECT_EQ(generated_password, GetElementValue(/*iframe_id=*/"null", "new_password_1")); CheckThatCredentialsStored( - /*username=*/"test", "pa$$word", base::UTF16ToUTF8(generated_password)); + /*username=*/"test", "pa$$word", generated_password); } // Verify that after password change is stopped, password change delegate is not @@ -421,16 +413,14 @@ const GURL main_url = WebContents()->GetLastCommittedURL(); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url)) - .WillOnce(testing::Return( - embedded_test_server()->GetURL("/password/done.html"))); + .WillOnce(Return(embedded_test_server()->GetURL("/password/done.html"))); - StartPasswordChange(main_url, u"test", u"pa$$word", WebContents()); - + password_change_service()->OfferPasswordChangeUi(main_url, u"test", + u"pa$$word", WebContents()); ASSERT_TRUE( password_change_service()->GetPasswordChangeDelegate(WebContents())); password_change_service()->GetPasswordChangeDelegate(WebContents())->Stop(); - EXPECT_FALSE( password_change_service()->GetPasswordChangeDelegate(WebContents())); } @@ -441,10 +431,14 @@ SetPrivacyNoticeAcceptedPref(); const GURL main_url = WebContents()->GetLastCommittedURL(); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url)) - .WillOnce(testing::Return(embedded_test_server()->GetURL( + .WillOnce(Return(embedded_test_server()->GetURL( "/password/update_form_empty_fields.html"))); - StartPasswordChange(main_url, u"test", u"pa$$word", WebContents()); + password_change_service()->OfferPasswordChangeUi(main_url, u"test", + u"pa$$word", WebContents()); + password_change_service() + ->GetPasswordChangeDelegate(WebContents()) + ->StartPasswordChangeFlow(); MockPasswordChangeOutcome( PasswordChangeOutcome:: PasswordChangeSubmissionData_PasswordChangeOutcome_SUCCESSFUL_OUTCOME); @@ -510,17 +504,18 @@ WaitForPasswordStore(); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(url)) - .WillOnce(testing::Return(embedded_test_server()->GetURL( + .WillOnce(Return(embedded_test_server()->GetURL( kMainHost, "/password/update_form_empty_fields.html"))); - StartPasswordChange(url, form.username_value, form.password_value, - WebContents()); + password_change_service()->OfferPasswordChangeUi(url, u"test", u"pa$$word", + WebContents()); + PasswordChangeDelegate* delegate = + password_change_service()->GetPasswordChangeDelegate(WebContents()); + delegate->StartPasswordChangeFlow(); MockPasswordChangeOutcome( PasswordChangeOutcome:: PasswordChangeSubmissionData_PasswordChangeOutcome_SUCCESSFUL_OUTCOME); - PasswordChangeDelegate* delegate = - password_change_service()->GetPasswordChangeDelegate(WebContents()); EXPECT_TRUE(base::test::RunUntil([delegate]() { return delegate->GetCurrentState() == PasswordChangeDelegate::State::kPasswordSuccessfullyChanged; @@ -554,11 +549,14 @@ WaitForPasswordStore(); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(origin)) - .WillOnce(testing::Return(embedded_test_server()->GetURL( + .WillOnce(Return(embedded_test_server()->GetURL( kMainHost, "/password/update_form_empty_fields.html"))); - StartPasswordChange(origin, form.username_value, form.password_value, - WebContents()); + password_change_service()->OfferPasswordChangeUi(origin, u"test", u"pa$$word", + WebContents()); + PasswordChangeDelegate* delegate = + password_change_service()->GetPasswordChangeDelegate(WebContents()); + delegate->StartPasswordChangeFlow(); EXPECT_CALL( *mock_optimization_guide_keyed_service(), ExecuteModel(optimization_guide::ModelBasedCapabilityKey:: @@ -576,8 +574,6 @@ /*execution_info=*/nullptr), /*log_entry=*/nullptr)); - PasswordChangeDelegate* delegate = - password_change_service()->GetPasswordChangeDelegate(WebContents()); EXPECT_TRUE(base::test::RunUntil([delegate]() { return delegate->GetCurrentState() == PasswordChangeDelegate::State::kPasswordChangeFailed; @@ -615,11 +611,14 @@ WaitForPasswordStore(); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(origin)) - .WillOnce(testing::Return(embedded_test_server()->GetURL( + .WillOnce(Return(embedded_test_server()->GetURL( kMainHost, "/password/update_form_empty_fields.html"))); - StartPasswordChange(origin, form.username_value, form.password_value, - WebContents()); + password_change_service()->OfferPasswordChangeUi(origin, u"test", u"pa$$word", + WebContents()); + password_change_service() + ->GetPasswordChangeDelegate(WebContents()) + ->StartPasswordChangeFlow(); MockPasswordChangeOutcome( PasswordChangeOutcome:: @@ -676,30 +675,32 @@ embedded_test_server()->GetURL("/password/update_form_empty_fields.html"); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url)) - .WillOnce(testing::Return(change_password_url)); - StartPasswordChange(main_url, u"test", u"password", WebContents()); + .WillOnce(Return(change_password_url)); + password_change_service()->OfferPasswordChangeUi(main_url, u"test", + u"pa$$word", WebContents()); + PasswordChangeDelegate* delegate = + password_change_service()->GetPasswordChangeDelegate(WebContents()); + delegate->StartPasswordChangeFlow(); TabStripModel* tab_strip = browser()->tab_strip_model(); - ASSERT_EQ(1, tab_strip->count()); + ASSERT_EQ(tab_strip->count(), 1); - EXPECT_EQ(0, tab_strip->active_index()); - password_change_service() - ->GetPasswordChangeDelegate(WebContents()) - ->OpenPasswordChangeTab(); + EXPECT_EQ(tab_strip->active_index(), 0); + delegate->OpenPasswordChangeTab(); - EXPECT_EQ(2, tab_strip->count()); - EXPECT_EQ(1, tab_strip->active_index()); + EXPECT_EQ(tab_strip->count(), 2); + EXPECT_EQ(tab_strip->active_index(), 1); } IN_PROC_BROWSER_TEST_F(PasswordChangeBrowserTest, - PrivacyNoticeDialogDisplayed) { + LeakCheckDialogWithPrivacyNoticeDisplayed) { const GURL main_url = WebContents()->GetLastCommittedURL(); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url)) - .WillOnce(testing::Return(embedded_test_server()->GetURL( + .WillOnce(Return(embedded_test_server()->GetURL( "/password/update_form_empty_fields.html"))); - StartPasswordChange(main_url, u"test", u"pa$$word", WebContents()); - + password_change_service()->OfferPasswordChangeUi(main_url, u"test", + u"password", WebContents()); PasswordChangeDelegate* delegate = password_change_service()->GetPasswordChangeDelegate(WebContents()); EXPECT_EQ(delegate->GetCurrentState(), @@ -714,16 +715,18 @@ SetPrivacyNoticeAcceptedPref(); const GURL main_url = WebContents()->GetLastCommittedURL(); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url)) - .WillOnce(testing::Return(embedded_test_server()->GetURL( + .WillOnce(Return(embedded_test_server()->GetURL( "/password/update_form_empty_fields.html"))); - StartPasswordChange(main_url, u"test", u"pa$$word", WebContents()); + password_change_service()->OfferPasswordChangeUi(main_url, u"test", + u"pa$$word", WebContents()); + PasswordChangeDelegate* delegate = + password_change_service()->GetPasswordChangeDelegate(WebContents()); + delegate->StartPasswordChangeFlow(); MockPasswordChangeOutcome( PasswordChangeOutcome:: PasswordChangeSubmissionData_PasswordChangeOutcome_UNSUCCESSFUL_OUTCOME); - PasswordChangeDelegate* delegate = - password_change_service()->GetPasswordChangeDelegate(WebContents()); ASSERT_TRUE(base::test::RunUntil([delegate]() { return delegate->GetCurrentState() == PasswordChangeDelegate::State::kPasswordChangeFailed; @@ -735,10 +738,12 @@ ->IsVisible()); } -IN_PROC_BROWSER_TEST_F(PasswordChangeBrowserTest, LeakCheckDialogDisplayed) { +IN_PROC_BROWSER_TEST_F(PasswordChangeBrowserTest, + LeakCheckDialogWithoutPrivacyNoticeDisplayed) { + SetPrivacyNoticeAcceptedPref(); const GURL main_url = WebContents()->GetLastCommittedURL(); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url)) - .WillOnce(testing::Return(embedded_test_server()->GetURL( + .WillOnce(Return(embedded_test_server()->GetURL( "/password/update_form_empty_fields.html"))); password_change_service()->OfferPasswordChangeUi(main_url, u"test", @@ -758,22 +763,22 @@ SetPrivacyNoticeAcceptedPref(); const GURL main_url = WebContents()->GetLastCommittedURL(); EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url)) - .WillOnce(testing::Return( - embedded_test_server()->GetURL("/password/done.html"))); + .WillOnce(Return(embedded_test_server()->GetURL("/password/done.html"))); - StartPasswordChange(main_url, u"test", u"pa$$word", WebContents()); - + password_change_service()->OfferPasswordChangeUi(main_url, u"test", + u"pa$$word", WebContents()); PasswordChangeDelegate* delegate = password_change_service()->GetPasswordChangeDelegate(WebContents()); + delegate->StartPasswordChangeFlow(); ASSERT_TRUE(delegate); - EXPECT_EQ(PasswordChangeDelegate::State::kWaitingForChangePasswordForm, - delegate->GetCurrentState()); + EXPECT_EQ(delegate->GetCurrentState(), + PasswordChangeDelegate::State::kWaitingForChangePasswordForm); auto* delegate_impl = static_cast<PasswordChangeDelegateImpl*>(delegate); delegate->OnOtpFieldDetected(delegate_impl->executor()); - EXPECT_EQ(PasswordChangeDelegate::State::kOtpDetected, - delegate->GetCurrentState()); + EXPECT_EQ(delegate->GetCurrentState(), + PasswordChangeDelegate::State::kOtpDetected); EXPECT_TRUE(delegate_impl->ui_controller()->dialog_widget()->IsVisible()); EXPECT_EQ(browser()->tab_strip_model()->count(), 1); } @@ -787,12 +792,13 @@ .WillOnce(testing::Return( embedded_test_server()->GetURL("/password/done.html"))); - StartPasswordChange(main_url, u"test", u"pa$$word", WebContents()); - + password_change_service()->OfferPasswordChangeUi(main_url, u"test", + u"pa$$word", WebContents()); PasswordChangeDelegate* delegate = password_change_service()->GetPasswordChangeDelegate(WebContents()); EXPECT_TRUE(delegate); - auto* ui_controller = + delegate->StartPasswordChangeFlow(); + PasswordChangeUIController* ui_controller = static_cast<PasswordChangeDelegateImpl*>(delegate)->ui_controller(); EXPECT_TRUE(ui_controller->toast_view()); // Verify action button is present and visible. @@ -821,14 +827,16 @@ .WillOnce(testing::Return(embedded_test_server()->GetURL( "/password/update_form_empty_fields.html"))); - StartPasswordChange(main_url, u"test", u"pa$$word", WebContents()); + password_change_service()->OfferPasswordChangeUi(main_url, u"test", + u"pa$$word", WebContents()); + PasswordChangeDelegate* delegate = + password_change_service()->GetPasswordChangeDelegate(WebContents()); + delegate->StartPasswordChangeFlow(); MockPasswordChangeOutcome( PasswordChangeOutcome:: PasswordChangeSubmissionData_PasswordChangeOutcome_SUCCESSFUL_OUTCOME); - PasswordChangeDelegate* delegate = - password_change_service()->GetPasswordChangeDelegate(WebContents()); EXPECT_TRUE(base::test::RunUntil([delegate]() { return delegate->GetCurrentState() == PasswordChangeDelegate::State::kPasswordSuccessfullyChanged;
diff --git a/chrome/browser/password_manager/password_change_delegate.h b/chrome/browser/password_manager/password_change_delegate.h index 9ce5dfe..e85fe80e 100644 --- a/chrome/browser/password_manager/password_change_delegate.h +++ b/chrome/browser/password_manager/password_change_delegate.h
@@ -66,14 +66,14 @@ virtual ~PasswordChangeDelegate() = default; - // Starts the password change flow (including showing the privacy notice - // agreement if necessary). + // Starts performing password change by looking for a change password form in + // a hidden tab. virtual void StartPasswordChangeFlow() = 0; // Cancels any password change operation. virtual void CancelPasswordChangeFlow() = 0; - // Responds whether password change is ongoing for a given |web_contents|. + // Responds whether password change is ongoing for a given `web_contents`. // This is true both for originator and a tab where password change is // performed. virtual bool IsPasswordChangeOngoing(content::WebContents* web_contents) = 0;
diff --git a/chrome/browser/password_manager/password_change_delegate_impl.cc b/chrome/browser/password_manager/password_change_delegate_impl.cc index 3b35161..fb9b075 100644 --- a/chrome/browser/password_manager/password_change_delegate_impl.cc +++ b/chrome/browser/password_manager/password_change_delegate_impl.cc
@@ -140,6 +140,9 @@ logger->LogMessage( BrowserSavePasswordProgressLogger::STRING_PASSWORD_CHANGE_STARTED); } + + UpdateState(IsPrivacyNoticeAcknowledged() ? State::kOfferingPasswordChange + : State::kWaitingForAgreement); } PasswordChangeDelegateImpl::~PasswordChangeDelegateImpl() { @@ -152,27 +155,7 @@ } } -void PasswordChangeDelegateImpl::OfferPasswordChangeUi() { - UpdateState(PasswordChangeDelegate::State::kOfferingPasswordChange); -} - void PasswordChangeDelegateImpl::StartPasswordChangeFlow() { - if (IsPrivacyNoticeAcknowledged()) { - StartPasswordChange(); - return; - } - UpdateState(State::kWaitingForAgreement); -} - -void PasswordChangeDelegateImpl::CancelPasswordChangeFlow() { - submission_verifier_.reset(); - form_finder_.reset(); - executor_.reset(); - - UpdateState(State::kCanceled); -} - -void PasswordChangeDelegateImpl::StartPasswordChange() { flow_start_time_ = base::Time::Now(); UpdateState(State::kWaitingForChangePasswordForm); @@ -185,6 +168,14 @@ weak_ptr_factory_.GetWeakPtr())); } +void PasswordChangeDelegateImpl::CancelPasswordChangeFlow() { + submission_verifier_.reset(); + form_finder_.reset(); + executor_.reset(); + + UpdateState(State::kCanceled); +} + void PasswordChangeDelegateImpl::OnPasswordChangeFormFound( password_manager::PasswordFormManager* form_manager) { form_finder_.reset(); @@ -210,7 +201,7 @@ weak_ptr_factory_.GetWeakPtr())); submission_verifier_->FillChangePasswordForm( form_manager, username_, original_password_, generated_password_); - UpdateState(PasswordChangeDelegate::State::kChangingPassword); + UpdateState(State::kChangingPassword); } void PasswordChangeDelegateImpl::OnTabWillDetach( @@ -308,11 +299,10 @@ optimization_guide::prefs::GetSettingEnabledPrefName( optimization_guide::UserVisibleFeatureKey::kPasswordChangeSubmission), static_cast<int>(optimization_guide::prefs::FeatureOptInState::kEnabled)); - StartPasswordChange(); + StartPasswordChangeFlow(); } -void PasswordChangeDelegateImpl::UpdateState( - PasswordChangeDelegate::State new_state) { +void PasswordChangeDelegateImpl::UpdateState(State new_state) { if (new_state == current_state_) { return; }
diff --git a/chrome/browser/password_manager/password_change_delegate_impl.h b/chrome/browser/password_manager/password_change_delegate_impl.h index b261e9b..65a667e 100644 --- a/chrome/browser/password_manager/password_change_delegate_impl.h +++ b/chrome/browser/password_manager/password_change_delegate_impl.h
@@ -49,9 +49,6 @@ PasswordChangeDelegateImpl& operator=(const PasswordChangeDelegateImpl&) = delete; - // Sets `kOfferingPasswordChange` state and triggers the leak check bubble. - void OfferPasswordChangeUi(); - base::WeakPtr<PasswordChangeDelegate> AsWeakPtr() override; #if defined(UNIT_TEST) @@ -84,10 +81,6 @@ void OnTabWillDetach(tabs::TabInterface* tab_interface, tabs::TabInterface::DetachReason reason); - // Opens the tab for password change and start looking for change password - // form. - void StartPasswordChange(); - // Updates `current_state_` and notifies `observers_`. void UpdateState(State new_state);
diff --git a/chrome/browser/password_manager/password_change_delegate_impl_unittest.cc b/chrome/browser/password_manager/password_change_delegate_impl_unittest.cc index a56f1a0..eeaab09 100644 --- a/chrome/browser/password_manager/password_change_delegate_impl_unittest.cc +++ b/chrome/browser/password_manager/password_change_delegate_impl_unittest.cc
@@ -24,9 +24,10 @@ namespace { -using testing::Return; +using ::testing::NiceMock; +using ::testing::Return; -const char kChangePasswordURL[] = "https://example.com/password/"; +constexpr char kChangePasswordURL[] = "https://example.com/password/"; const std::u16string kTestEmail = u"elisa.buckett@gmail.com"; const std::u16string kPassword = u"cE1L45Vgxyzlu8"; @@ -70,7 +71,7 @@ ShouldFeatureBeCurrentlyEnabledForUser( optimization_guide::UserVisibleFeatureKey:: kPasswordChangeSubmission)) - .WillByDefault(testing::Return(enabled)); + .WillByDefault(Return(enabled)); } void SetUp() override { @@ -82,17 +83,11 @@ profile(), base::BindRepeating([](content::BrowserContext* context) -> std::unique_ptr<KeyedService> { - return std::make_unique<testing::NiceMock< - MockOptimizationGuideKeyedService>>(); + return std::make_unique< + NiceMock<MockOptimizationGuideKeyedService>>(); }))); tab_interface_ = std::make_unique<tabs::MockTabInterface>(); - ON_CALL(*tab_interface_, GetContents) - .WillByDefault(testing::Return(web_contents())); - delegate_ = std::make_unique<PasswordChangeDelegateImpl>( - GURL(kChangePasswordURL), kTestEmail, kPassword, tab_interface_.get()); - delegate_->SetCustomUIController( - std::make_unique<MockPasswordChangeUIController>(delegate_.get())); - delegate_->OfferPasswordChangeUi(); + ON_CALL(*tab_interface_, GetContents).WillByDefault(Return(web_contents())); } void TearDown() override { @@ -104,6 +99,13 @@ PasswordChangeDelegate* delegate() { return delegate_.get(); } + void CreateDelegate() { + delegate_ = std::make_unique<PasswordChangeDelegateImpl>( + GURL(kChangePasswordURL), kTestEmail, kPassword, tab_interface_.get()); + delegate_->SetCustomUIController( + std::make_unique<MockPasswordChangeUIController>(delegate_.get())); + } + void ResetDelegate() { delegate_.reset(); } private: @@ -115,8 +117,7 @@ }; TEST_F(PasswordChangeDelegateImplTest, WaitingForAgreement) { - delegate()->StartPasswordChangeFlow(); - + CreateDelegate(); EXPECT_EQ( prefs()->GetInteger(optimization_guide::prefs::GetSettingEnabledPrefName( optimization_guide::UserVisibleFeatureKey:: @@ -124,35 +125,37 @@ static_cast<int>( optimization_guide::prefs::FeatureOptInState::kNotInitialized)); - EXPECT_EQ(PasswordChangeDelegate::State::kWaitingForAgreement, - delegate()->GetCurrentState()); + EXPECT_EQ(delegate()->GetCurrentState(), + PasswordChangeDelegate::State::kWaitingForAgreement); delegate()->OnPrivacyNoticeAccepted(); - SetOptimizationFeatureEnabled(/*enabled=*/true); + SetOptimizationFeatureEnabled(true); // Both pref and state reflect acceptance. EXPECT_EQ( prefs()->GetInteger(optimization_guide::prefs::GetSettingEnabledPrefName( optimization_guide::UserVisibleFeatureKey:: kPasswordChangeSubmission)), static_cast<int>(optimization_guide::prefs::FeatureOptInState::kEnabled)); - EXPECT_EQ(PasswordChangeDelegate::State::kWaitingForChangePasswordForm, - delegate()->GetCurrentState()); + EXPECT_EQ(delegate()->GetCurrentState(), + PasswordChangeDelegate::State::kWaitingForChangePasswordForm); } TEST_F(PasswordChangeDelegateImplTest, PasswordChangeFormNotFound) { - SetOptimizationFeatureEnabled(/*enabled=*/true); + SetOptimizationFeatureEnabled(true); + CreateDelegate(); base::HistogramTester histogram_tester; + delegate()->StartPasswordChangeFlow(); - EXPECT_EQ(PasswordChangeDelegate::State::kWaitingForChangePasswordForm, - delegate()->GetCurrentState()); + EXPECT_EQ(delegate()->GetCurrentState(), + PasswordChangeDelegate::State::kWaitingForChangePasswordForm); static_cast<PasswordChangeDelegateImpl*>(delegate()) ->form_finder() ->RespondWithFormNotFound(); - EXPECT_EQ(PasswordChangeDelegate::State::kChangePasswordFormNotFound, - delegate()->GetCurrentState()); + EXPECT_EQ(delegate()->GetCurrentState(), + PasswordChangeDelegate::State::kChangePasswordFormNotFound); ResetDelegate(); histogram_tester.ExpectUniqueSample( PasswordChangeDelegateImpl::kFinalPasswordChangeStatusHistogram, @@ -160,7 +163,10 @@ } TEST_F(PasswordChangeDelegateImplTest, MetricsReportedFlowOffered) { + SetOptimizationFeatureEnabled(true); + CreateDelegate(); base::HistogramTester histogram_tester; + ResetDelegate(); histogram_tester.ExpectUniqueSample( PasswordChangeDelegateImpl::kFinalPasswordChangeStatusHistogram, @@ -169,9 +175,9 @@ TEST_F(PasswordChangeDelegateImplTest, MetricsReportedFlowCanceledInPrivacyNotice) { - SetOptimizationFeatureEnabled(/*enabled=*/false); + SetOptimizationFeatureEnabled(false); + CreateDelegate(); base::HistogramTester histogram_tester; - delegate()->StartPasswordChangeFlow(); ResetDelegate(); histogram_tester.ExpectUniqueSample( @@ -181,7 +187,8 @@ TEST_F(PasswordChangeDelegateImplTest, MetricsReportedFlowCanceledDuringSignInCheck) { - SetOptimizationFeatureEnabled(/*enabled=*/true); + SetOptimizationFeatureEnabled(true); + CreateDelegate(); base::HistogramTester histogram_tester; delegate()->StartPasswordChangeFlow(); @@ -192,51 +199,50 @@ } TEST_F(PasswordChangeDelegateImplTest, - OtpDetectionIgnoredWhenFlowIsNotStarted) { - - ASSERT_EQ(PasswordChangeDelegate::State::kOfferingPasswordChange, - delegate()->GetCurrentState()); + OtpDetectionIgnoredWhenPasswordChangeNotStarted) { + SetOptimizationFeatureEnabled(true); + CreateDelegate(); + ASSERT_EQ(delegate()->GetCurrentState(), + PasswordChangeDelegate::State::kOfferingPasswordChange); delegate()->OnOtpFieldDetected(web_contents()); - EXPECT_EQ(PasswordChangeDelegate::State::kOfferingPasswordChange, - delegate()->GetCurrentState()); + EXPECT_EQ(delegate()->GetCurrentState(), + PasswordChangeDelegate::State::kOfferingPasswordChange); } TEST_F(PasswordChangeDelegateImplTest, OtpDetectionIgnoredWhenWaitingForAgreement) { - delegate()->StartPasswordChangeFlow(); - - ASSERT_EQ(PasswordChangeDelegate::State::kWaitingForAgreement, - delegate()->GetCurrentState()); + CreateDelegate(); + ASSERT_EQ(delegate()->GetCurrentState(), + PasswordChangeDelegate::State::kWaitingForAgreement); delegate()->OnOtpFieldDetected( static_cast<PasswordChangeDelegateImpl*>(delegate())->executor()); - EXPECT_EQ(PasswordChangeDelegate::State::kWaitingForAgreement, - delegate()->GetCurrentState()); + EXPECT_EQ(delegate()->GetCurrentState(), + PasswordChangeDelegate::State::kWaitingForAgreement); } TEST_F(PasswordChangeDelegateImplTest, OtpDetectionIgnoredOnOriginalTab) { - SetOptimizationFeatureEnabled(/*enabled=*/true); - + SetOptimizationFeatureEnabled(true); + CreateDelegate(); delegate()->StartPasswordChangeFlow(); - - EXPECT_EQ(PasswordChangeDelegate::State::kWaitingForChangePasswordForm, - delegate()->GetCurrentState()); + EXPECT_EQ(delegate()->GetCurrentState(), + PasswordChangeDelegate::State::kWaitingForChangePasswordForm); delegate()->OnOtpFieldDetected(web_contents()); - EXPECT_EQ(PasswordChangeDelegate::State::kWaitingForChangePasswordForm, - delegate()->GetCurrentState()); + EXPECT_EQ(delegate()->GetCurrentState(), + PasswordChangeDelegate::State::kWaitingForChangePasswordForm); } TEST_F(PasswordChangeDelegateImplTest, OtpDetectionProcessed) { - SetOptimizationFeatureEnabled(/*enabled=*/true); + SetOptimizationFeatureEnabled(true); + CreateDelegate(); delegate()->StartPasswordChangeFlow(); - - EXPECT_EQ(PasswordChangeDelegate::State::kWaitingForChangePasswordForm, - delegate()->GetCurrentState()); + EXPECT_EQ(delegate()->GetCurrentState(), + PasswordChangeDelegate::State::kWaitingForChangePasswordForm); delegate()->OnOtpFieldDetected( static_cast<PasswordChangeDelegateImpl*>(delegate())->executor()); - EXPECT_EQ(PasswordChangeDelegate::State::kOtpDetected, - delegate()->GetCurrentState()); + EXPECT_EQ(delegate()->GetCurrentState(), + PasswordChangeDelegate::State::kOtpDetected); }
diff --git a/chrome/browser/password_manager/password_manager_test_base.cc b/chrome/browser/password_manager/password_manager_test_base.cc index bb6073829..e975f3e 100644 --- a/chrome/browser/password_manager/password_manager_test_base.cc +++ b/chrome/browser/password_manager/password_manager_test_base.cc
@@ -486,7 +486,7 @@ EXPECT_EQ(base::ASCIIToUTF16(password), form.password_value); if (backup_password.has_value()) { EXPECT_EQ(base::ASCIIToUTF16(backup_password.value()), - form.GetPasswordBackupNote()); + form.GetPasswordBackup()); } if (type.has_value()) { EXPECT_EQ(type.value(), form.type);
diff --git a/chrome/browser/permissions/prediction_based_permission_ui_selector.cc b/chrome/browser/permissions/prediction_based_permission_ui_selector.cc index 1dc82b2c..fa99656 100644 --- a/chrome/browser/permissions/prediction_based_permission_ui_selector.cc +++ b/chrome/browser/permissions/prediction_based_permission_ui_selector.cc
@@ -479,9 +479,7 @@ // `ConvertToProtoRelevance` execution. features.permission_relevance = PermissionRequestRelevance::kUnspecified; // if both Aiv3 and Aiv1 are enabled, we want to chose Aiv3. - if (base::FeatureList::IsEnabled(permissions::features::kPermissionsAIv3) || - base::FeatureList::IsEnabled( - permissions::features::kPermissionsAIv3Geolocation)) { + if (base::FeatureList::IsEnabled(permissions::features::kPermissionsAIv3)) { features.experiment_id = PredictionRequestFeatures::ExperimentId::kAiV3ExperimentId; } else if (base::FeatureList::IsEnabled( @@ -670,9 +668,7 @@ if (use_server_side) { // Aiv3 takes priority over Aiv1 if both are enabled. #if BUILDFLAG(BUILD_WITH_TFLITE_LIB) - if (base::FeatureList::IsEnabled(permissions::features::kPermissionsAIv3) || - base::FeatureList::IsEnabled( - permissions::features::kPermissionsAIv3Geolocation)) { + if (base::FeatureList::IsEnabled(permissions::features::kPermissionsAIv3)) { return PredictionSource::kOnDeviceAiv3AndServerSideModel; } #endif // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
diff --git a/chrome/browser/permissions/prediction_model_handler_provider.cc b/chrome/browser/permissions/prediction_model_handler_provider.cc index 27f933e..d6f6da4 100644 --- a/chrome/browser/permissions/prediction_model_handler_provider.cc +++ b/chrome/browser/permissions/prediction_model_handler_provider.cc
@@ -37,9 +37,7 @@ optimization_guide::proto::OptimizationTarget:: OPTIMIZATION_TARGET_GEOLOCATION_PERMISSION_PREDICTIONS); - if (base::FeatureList::IsEnabled(permissions::features::kPermissionsAIv3) || - base::FeatureList::IsEnabled( - permissions::features::kPermissionsAIv3Geolocation)) { + if (base::FeatureList::IsEnabled(permissions::features::kPermissionsAIv3)) { notification_aiv3_handler_ = std::make_unique<PermissionsAiv3Handler>( optimization_guide, optimization_guide::proto::OptimizationTarget::
diff --git a/chrome/browser/permissions/prediction_service_browsertest.cc b/chrome/browser/permissions/prediction_service_browsertest.cc index 3995a6b9..bc99f55 100644 --- a/chrome/browser/permissions/prediction_service_browsertest.cc +++ b/chrome/browser/permissions/prediction_service_browsertest.cc
@@ -408,9 +408,7 @@ permissions::features:: kPermissionsAIv1, permissions::features:: - kPermissionsAIv3, - permissions::features:: - kPermissionsAIv3Geolocation}) {} + kPermissionsAIv3}) {} void SetUpOnMainThread() override { PredictionServiceBrowserTestBase::SetUpOnMainThread(); @@ -525,9 +523,7 @@ {permissions::features:: kPermissionsAIv1, permissions::features:: - kPermissionsAIv3, - permissions::features:: - kPermissionsAIv3Geolocation}) {} + kPermissionsAIv3}) {} void TriggerCpssV1AndVerifyUi( PermissionAction permission_action, @@ -792,11 +788,9 @@ std::vector<PermissionRequestMetadata> request_data_testcase = { { - /*optimization_target=*/kAiv3OptTargetGeolocation, /*request_type=*/RequestType::kGeolocation}, { - /*optimization_target=*/kAiv3OptTargetNotification, /*request_type=*/RequestType::kNotifications}, };
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_window_manager.cc b/chrome/browser/picture_in_picture/picture_in_picture_window_manager.cc index 90346363..fdafa0e 100644 --- a/chrome/browser/picture_in_picture/picture_in_picture_window_manager.cc +++ b/chrome/browser/picture_in_picture/picture_in_picture_window_manager.cc
@@ -9,6 +9,7 @@ #include "chrome/browser/picture_in_picture/picture_in_picture_bounds_cache.h" #include "chrome/browser/picture_in_picture/picture_in_picture_occlusion_tracker.h" #include "chrome/browser/ui/browser_navigator_params.h" +#include "chrome/common/url_constants.h" #include "content/public/browser/document_picture_in_picture_window_controller.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/picture_in_picture_window_controller.h" @@ -569,7 +570,8 @@ #endif // BUILDFLAG(ENABLE_EXTENSIONS) return url.SchemeIs(url::kHttpsScheme) || url.SchemeIsFile() || - net::IsLocalhost(url) || url.SchemeIs(content::kChromeUIScheme); + net::IsLocalhost(url) || url.SchemeIs(content::kChromeUIScheme) || + url.SchemeIs(chrome::kIsolatedAppScheme); #else return false; #endif // !BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/picture_in_picture/picture_in_picture_window_manager_unittest.cc b/chrome/browser/picture_in_picture/picture_in_picture_window_manager_unittest.cc index aaa616e8..719b368 100644 --- a/chrome/browser/picture_in_picture/picture_in_picture_window_manager_unittest.cc +++ b/chrome/browser/picture_in_picture/picture_in_picture_window_manager_unittest.cc
@@ -311,6 +311,9 @@ EXPECT_TRUE( PictureInPictureWindowManager::IsSupportedForDocumentPictureInPicture( GURL("chrome://newtab"))); + EXPECT_TRUE( + PictureInPictureWindowManager::IsSupportedForDocumentPictureInPicture( + GURL("isolated-app://asdf"))); } TEST_F(PictureInPictureWindowManagerTest, RecordsInitialSizeHistograms) {
diff --git a/chrome/browser/platform_experience/win b/chrome/browser/platform_experience/win index 58ae797..0dfaced 160000 --- a/chrome/browser/platform_experience/win +++ b/chrome/browser/platform_experience/win
@@ -1 +1 @@ -Subproject commit 58ae7971c82fe41c26e3052d97dc5b5e2461cab8 +Subproject commit 0dfacedf1672ac9e62c300a331435fcc127478a8
diff --git a/chrome/browser/policy/test/autofill_ai_policy_browsertest.cc b/chrome/browser/policy/test/autofill_ai_policy_browsertest.cc index 7dd81601..9f0ba96 100644 --- a/chrome/browser/policy/test/autofill_ai_policy_browsertest.cc +++ b/chrome/browser/policy/test/autofill_ai_policy_browsertest.cc
@@ -7,7 +7,6 @@ #include "base/types/cxx23_to_underlying.h" #include "base/values.h" -#include "chrome/browser/autofill_ai/chrome_autofill_ai_client.h" #include "chrome/browser/policy/policy_test_utils.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h" @@ -73,7 +72,7 @@ UpdateProviderPolicy(policies); // The base test fixture creates a tab before we set the policy. We create a - // new tab so a new ChromeAutofillAiClient is created. + // new tab so a new `AutofillClient` is created. AddBlankTabAndShow(browser()); ASSERT_TRUE(embedded_test_server()->Start()); }
diff --git a/chrome/browser/resources/bookmarks/app.css b/chrome/browser/resources/bookmarks/app.css index 7f46d6b..6ffa6537 100644 --- a/chrome/browser/resources/bookmarks/app.css +++ b/chrome/browser/resources/bookmarks/app.css
@@ -58,6 +58,11 @@ width: var(--min-sidebar-width); } +#sidebar-folders { + flex-grow: 1; + overflow: auto; +} + bookmarks-folder-node { flex: 1; overflow-y: auto;
diff --git a/chrome/browser/resources/bookmarks/app.html.ts b/chrome/browser/resources/bookmarks/app.html.ts index d27276b..4db5483 100644 --- a/chrome/browser/resources/bookmarks/app.html.ts +++ b/chrome/browser/resources/bookmarks/app.html.ts
@@ -13,9 +13,11 @@ </bookmarks-toolbar> <div id="drop-shadow" class="cr-container-shadow"></div> <div id="main-container"> - <div id="sidebar" role="tree" aria-label="$i18n{sidebarAxLabel}"> - <bookmarks-folder-node item-id="0" depth="-1"></bookmarks-folder-node> - <managed-footnote></managed-footnote> + <div id="sidebar"> + <div id="sidebar-folders" role="tree" aria-label="$i18n{sidebarAxLabel}"> + <bookmarks-folder-node item-id="0" depth="-1"></bookmarks-folder-node> + </div> + <managed-footnote tabindex="0"></managed-footnote> </div> <cr-splitter id="splitter"></cr-splitter> <bookmarks-list @scroll="${this.onListScroll_}"></bookmarks-list>
diff --git a/chrome/browser/resources/bookmarks/folder_node.html.ts b/chrome/browser/resources/bookmarks/folder_node.html.ts index d68ee7de..fe00e8fa 100644 --- a/chrome/browser/resources/bookmarks/folder_node.html.ts +++ b/chrome/browser/resources/bookmarks/folder_node.html.ts
@@ -13,12 +13,14 @@ class="cr-vertical-tab cr-nav-menu-item ${this.getContainerClass_()}" ?hidden="${this.isRootFolder_()}" role="treeitem" + aria-level="${this.getAriaLevel_()}" aria-owns="descendants" tabindex="${this.getTabIndex_()}" @click="${this.selectFolder_}" @dblclick="${this.toggleFolder_}" @contextmenu="${this.onContextMenu_}" - ?selected="${this.isSelectedFolder_}"> + ?selected="${this.isSelectedFolder_}" + aria-selected="${this.isSelectedFolder_}"> <div id="inner-container"> ${this.hasChildFolder_ ? html` <cr-icon-button id="arrow" iron-icon="cr:arrow-drop-down"
diff --git a/chrome/browser/resources/bookmarks/folder_node.ts b/chrome/browser/resources/bookmarks/folder_node.ts index 66e78af..057a33be 100644 --- a/chrome/browser/resources/bookmarks/folder_node.ts +++ b/chrome/browser/resources/bookmarks/folder_node.ts
@@ -376,6 +376,11 @@ return this.selectedFolder_ === this.itemId ? '0' : '-1'; } + protected getAriaLevel_(): number { + // Converts (-1)-indexed depth to 1-based ARIA level. + return this.depth + 2; + } + /** * Sets the 'aria-expanded' accessibility on nodes which need it. Note that * aria-expanded="false" is different to having the attribute be undefined.
diff --git a/chrome/browser/resources/inspect/inspect.js b/chrome/browser/resources/inspect/inspect.js index 380db2f..3208517 100644 --- a/chrome/browser/resources/inspect/inspect.js +++ b/chrome/browser/resources/inspect/inspect.js
@@ -471,12 +471,11 @@ row, 'close', sendTargetCommand.bind(null, 'close', page), false); } - if (browserNeedsFallback) { - addActionLink( - row, 'inspect fallback', - sendTargetCommand.bind(null, 'inspect-fallback', page), - page.hasNoUniqueId || page.adbAttachedForeign); - } + addActionLink( + row, 'inspect fallback', + sendTargetCommand.bind(null, 'inspect-fallback', page), + page.hasNoUniqueId || page.adbAttachedForeign, + 'Best-effort fallback to debug the target using this browser instance\'s potentially mismatching DevTools version.'); } } updateBrowserVisibility(browserSection); @@ -712,10 +711,13 @@ return row; } -function addActionLink(row, text, handler, opt_disabled) { +function addActionLink(row, text, handler, opt_disabled, opt_title) { const link = document.createElement('span'); link.classList.add('action'); link.setAttribute('tabindex', 1); + if (opt_title) { + link.title = opt_title; + } if (opt_disabled) { link.classList.add('disabled'); } else {
diff --git a/chrome/browser/resources/settings/autofill_page/payments_section.ts b/chrome/browser/resources/settings/autofill_page/payments_section.ts index 0e8753a..4227a85 100644 --- a/chrome/browser/resources/settings/autofill_page/payments_section.ts +++ b/chrome/browser/resources/settings/autofill_page/payments_section.ts
@@ -65,6 +65,7 @@ canMakePaymentToggle: SettingsToggleButtonElement, creditCardSharedMenu: CrActionMenuElement, ibanSharedActionMenu: CrLazyRenderElement<CrActionMenuElement>, + manageLink: HTMLElement, mandatoryAuthToggle: SettingsToggleButtonElement, menuEditCreditCard: HTMLElement, menuRemoveCreditCard: HTMLElement, @@ -281,6 +282,15 @@ // Record that the user opened the payments settings. chrome.metricsPrivate.recordUserAction('AutofillCreditCardsViewed'); + + // Measure clicks on the 'Google Account' link for managing payment methods. + const manageAccountAnchor = this.$.manageLink.querySelector('a'); + if (manageAccountAnchor !== null) { + manageAccountAnchor.addEventListener('click', () => { + MetricsBrowserProxyImpl.getInstance().recordAction( + 'Autofill.PaymentMethodsSettingsPage.ManagePaymentMethodsLinkClicked'); + }); + } } override disconnectedCallback() {
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.html b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.html index c93d17cc..c82e241e 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.html +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.html
@@ -108,15 +108,18 @@ <div class="checkbox-title">[[item.label]]</div> </settings-checkbox> </template> - <template is="dom-if" if="[[dataTypesExpanded_]]"> - <template is="dom-repeat" items="[[moreBrowsingDataTypeOptionsList_]]"> - <settings-checkbox pref="[[item.pref]]" no-set-pref - sub-label="[[item.subLabel]]" - disabled="[[isDeletionInProgress_]]"> - <div class="checkbox-title">[[item.label]]</div> - </settings-checkbox> + <div id="moreOptionsList"> + <template is="dom-if" if="[[dataTypesExpanded_]]"> + <template is="dom-repeat" + items="[[moreBrowsingDataTypeOptionsList_]]"> + <settings-checkbox pref="[[item.pref]]" no-set-pref + sub-label="[[item.subLabel]]" + disabled="[[isDeletionInProgress_]]"> + <div class="checkbox-title">[[item.label]]</div> + </settings-checkbox> + </template> </template> - </template> + </div> </div> <cr-button id="showMoreButton" on-click="onShowMoreClick_" hidden="[[shouldHideShowMoreButton_(
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.ts b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.ts index 531dc56..072bde1 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.ts +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.ts
@@ -59,6 +59,7 @@ deleteButton: CrButtonElement, deleteBrowsingDataDialog: CrDialogElement, manageOtherGoogleDataRow: HTMLElement, + moreOptionsList: HTMLElement, showMoreButton: CrButtonElement, spinner: HTMLElement, timePicker: SettingsClearBrowsingDataTimePicker, @@ -370,6 +371,13 @@ private onShowMoreClick_() { this.dataTypesExpanded_ = true; + + // Set the focus to the first checkbox in the 'more' options list. + afterNextRender(this, () => { + const toFocus = this.$.moreOptionsList.querySelector('settings-checkbox'); + assert(toFocus); + toFocus.focus(); + }); } private shouldHideShowMoreButton_() {
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_time_picker.html b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_time_picker.html index 348770b..11695dce 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_time_picker.html +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_time_picker.html
@@ -10,6 +10,7 @@ .row { align-items: center; display: flex; + overflow: auto; } .time-period-chip { @@ -17,7 +18,7 @@ } </style> -<div class="row"> +<div class="row" scrollable> <template is="dom-repeat" items="[[expandedOptionList_]]"> <!-- TODO(crbug.com/397187800): Handle content overflow, current behavior is to scroll.-->
diff --git a/chrome/browser/resources/settings/controls/settings_checkbox.ts b/chrome/browser/resources/settings/controls/settings_checkbox.ts index 466e779..2ad9b59 100644 --- a/chrome/browser/resources/settings/controls/settings_checkbox.ts +++ b/chrome/browser/resources/settings/controls/settings_checkbox.ts
@@ -58,6 +58,11 @@ ]; } + /** Focus on the inner cr-checkbox. */ + override focus() { + this.$.checkbox.focus(); + } + private onSubLabelChanged_() { this.$.checkbox.ariaDescription = this.$.subLabel.textContent!; }
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_completion_fragment.html b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_completion_fragment.html index 002fbeb6..0a3f8aa8 100644 --- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_completion_fragment.html +++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_completion_fragment.html
@@ -63,7 +63,6 @@ role="none"></a> </div> </template> -<!-- TODO(crbug.com/362225975): Update icon and strings for AI row. --> <template is="dom-if" if="[[shouldShowAiSettings_]]"> <cr-link-row id="aiRow" using-slotted-label sub-label="$i18n{privacyGuideCompletionCardAiSettingsLabel}"
diff --git a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogCoordinator.java b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogCoordinator.java index 065d1f8..eaa14f7 100644 --- a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogCoordinator.java +++ b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogCoordinator.java
@@ -117,7 +117,7 @@ searchEngineChoiceService != null && searchEngineChoiceService.isDeviceChoiceDialogEligible(); - if (SearchEnginesFeatureUtils.isChoiceApisDebugEnabled()) { + if (SearchEnginesFeatureUtils.getInstance().isChoiceApisDebugEnabled()) { Log.i(TAG, "maybeShow() - Client eligible for the device choice dialog: %b", canShow); } @@ -169,7 +169,7 @@ @Override public void updateDialogType(@DialogType int dialogType) { - if (SearchEnginesFeatureUtils.isChoiceApisDebugEnabled()) { + if (SearchEnginesFeatureUtils.getInstance().isChoiceApisDebugEnabled()) { Log.i(TAG, "updateDialogType(%d)", dialogType); } @@ -254,7 +254,7 @@ int blockLimit = SearchEnginesFeatureUtils.getInstance().clayBlockingEscapeHatchBlockLimit(); if (blockCount >= blockLimit) { - if (SearchEnginesFeatureUtils.isChoiceApisDebugEnabled()) { + if (SearchEnginesFeatureUtils.getInstance().isChoiceApisDebugEnabled()) { Log.i( TAG, "The dialog is suppressed: Escape Hatch triggered, blocked %d times"
diff --git a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogMediator.java b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogMediator.java index 82d7220..fc95b96 100644 --- a/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogMediator.java +++ b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/choice_screen/ChoiceDialogMediator.java
@@ -217,7 +217,7 @@ mObservationStartedTimeMillis = TimeUtils.currentTimeMillis(); changeDialogType(DialogType.LOADING); - if (SearchEnginesFeatureUtils.isChoiceApisDebugEnabled()) { + if (SearchEnginesFeatureUtils.getInstance().isChoiceApisDebugEnabled()) { Log.i(TAG, "Mediator initializing"); } @@ -237,7 +237,7 @@ changeDialogType(DialogType.UNKNOWN); delegate.onMediatorDestroyed(); - if (SearchEnginesFeatureUtils.isChoiceApisDebugEnabled()) { + if (SearchEnginesFeatureUtils.getInstance().isChoiceApisDebugEnabled()) { Log.i(TAG, "Mediator destroyed"); } } @@ -263,7 +263,7 @@ mDialogAddedTimeMillis = TimeUtils.currentTimeMillis(); mSearchEngineChoiceService.notifyDeviceChoiceBlockShown(); - if (SearchEnginesFeatureUtils.isChoiceApisDebugEnabled()) { + if (SearchEnginesFeatureUtils.getInstance().isChoiceApisDebugEnabled()) { Log.i( TAG, "onDialogAdded(), time since observation start: %s millis", @@ -285,7 +285,7 @@ if (mFirstServiceEventTimeMillis == null) { mFirstServiceEventTimeMillis = TimeUtils.currentTimeMillis(); - if (SearchEnginesFeatureUtils.isChoiceApisDebugEnabled()) { + if (SearchEnginesFeatureUtils.getInstance().isChoiceApisDebugEnabled()) { Log.i( TAG, "onIsDeviceChoiceRequiredChanged(%s), time since dialog added: %s millis, " @@ -318,7 +318,7 @@ if (!wasDialogShown) { mDelegate.showDialog(); - if (SearchEnginesFeatureUtils.isChoiceApisDebugEnabled()) { + if (SearchEnginesFeatureUtils.getInstance().isChoiceApisDebugEnabled()) { Log.i(TAG, "Dialog shown after a positive backend response."); } } @@ -352,7 +352,7 @@ // Indicates that the backend was disconnected. This would make the dialog non-functional if // it is still shown, so let's dismiss it and let the user proceed to Chrome. // TODO(b/355201070): Add UMA recording. - if (SearchEnginesFeatureUtils.isChoiceApisDebugEnabled()) { + if (SearchEnginesFeatureUtils.getInstance().isChoiceApisDebugEnabled()) { Log.w( TAG, "Unexpected backend update received. State: "
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsMediator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsMediator.java index 06a12a14..2f6dda6 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsMediator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsMediator.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.share.long_screenshots; +import static org.chromium.build.NullUtil.assumeNonNull; import static org.chromium.chrome.browser.share.long_screenshots.LongScreenshotsAreaSelectionDialogProperties.CLOSE_BUTTON_CALLBACK; import static org.chromium.chrome.browser.share.long_screenshots.LongScreenshotsAreaSelectionDialogProperties.DONE_BUTTON_CALLBACK; import static org.chromium.chrome.browser.share.long_screenshots.LongScreenshotsAreaSelectionDialogProperties.DOWN_BUTTON_CALLBACK; @@ -23,9 +24,11 @@ import android.widget.LinearLayout; import android.widget.ScrollView; -import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import org.chromium.build.annotations.MonotonicNonNull; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import org.chromium.chrome.R; import org.chromium.chrome.browser.share.long_screenshots.bitmap_generation.EntryManager; import org.chromium.chrome.browser.share.long_screenshots.bitmap_generation.LongScreenshotsEntry; @@ -41,26 +44,27 @@ * LongScreenshotsMediator is responsible for retrieving the long screenshot Bitmaps and displaying * them in the area selection dialog. */ +@NullMarked public class LongScreenshotsMediator implements LongScreenshotsEntry.EntryListener, EditorScreenshotSource, View.OnTouchListener, DialogInterface.OnShowListener { - private Dialog mDialog; + private @MonotonicNonNull Dialog mDialog; private boolean mDone; - private Runnable mDoneCallback; - private PropertyModel mModel; - private View mDialogView; - private ScrollView mScrollView; - private View mTopAreaMaskView; - private View mBottomAreaMaskView; - private View mInstructionalTextView; - private View mUpButton; - private View mDownButton; - private ImageView mImageView; + private @Nullable Runnable mDoneCallback; + private @Nullable PropertyModel mModel; + private @Nullable View mDialogView; + private @Nullable ScrollView mScrollView; + private @Nullable View mTopAreaMaskView; + private @Nullable View mBottomAreaMaskView; + private @Nullable View mInstructionalTextView; + private @Nullable View mUpButton; + private @Nullable View mDownButton; + private @Nullable ImageView mImageView; private final Activity mActivity; private final EntryManager mEntryManager; - private Bitmap mFullBitmap; + private @Nullable Bitmap mFullBitmap; private final float mDisplayDensity; // Variables for tracking drag action. @@ -127,7 +131,7 @@ return; } Bitmap entryBitmap = entry.getBitmap(); - long bitmapByteCount = entryBitmap.getAllocationByteCount(); + long bitmapByteCount = assumeNonNull(entryBitmap).getAllocationByteCount(); // Scale down the bitmap if passing it to // ImageView.setImageBitmap() would throw a too-large // error due to OOM (out of memory). @@ -200,13 +204,16 @@ @Override public void onShow(DialogInterface dialog) { // Adjust bottom mask selector. + assumeNonNull(mBottomAreaMaskView); ViewGroup.LayoutParams bottomParams = mBottomAreaMaskView.getLayoutParams(); + assumeNonNull(mFullBitmap); + assumeNonNull(mScrollView); bottomParams.height = mFullBitmap.getHeight() - mScrollView.getHeight() + getTopMaskY(); mBottomAreaMaskView.setLayoutParams(bottomParams); } public void areaSelectionDone(View view) { - mDialog.cancel(); + assumeNonNull(mDialog).cancel(); mDone = true; if (mDoneCallback != null) { mDoneCallback.run(); @@ -215,7 +222,7 @@ } public void areaSelectionClose(View view) { - mDialog.cancel(); + assumeNonNull(mDialog).cancel(); } /** @@ -229,10 +236,11 @@ } private int getTopMaskY() { - return mTopAreaMaskView.getHeight(); + return assumeNonNull(mTopAreaMaskView).getHeight(); } private int getBottomMaskY() { + assumeNonNull(mBottomAreaMaskView); return ((View) mBottomAreaMaskView.getParent()).getHeight() - mBottomAreaMaskView.getHeight(); } @@ -251,6 +259,7 @@ // Tapping on the buttons shrinks a mask region, expanding the screenshot area. private void expandScreenshotRegion(boolean isTop) { View maskView = (isTop ? mTopAreaMaskView : mBottomAreaMaskView); + assumeNonNull(maskView); int oldHeight = maskView.getHeight(); // Message if we reached the extent of allowable capture. @@ -270,6 +279,7 @@ ViewGroup.LayoutParams params = maskView.getLayoutParams(); params.height = newHeight; maskView.setLayoutParams(params); + assumeNonNull(mScrollView); mScrollView.smoothScrollBy(0, (isTop ? 1 : -1) * (newHeight - oldHeight)); } @@ -282,7 +292,7 @@ } @VisibleForTesting - public Dialog getDialog() { + public @Nullable Dialog getDialog() { return mDialog; } @@ -305,18 +315,20 @@ // Called by host after the dialog is canceled to obtain screenshot data. // Invalidates |mFullBitmap|. @Override - public Bitmap getScreenshot() { + public @Nullable Bitmap getScreenshot() { // Extract bitmap data from the bottom of the top mask to the top of the bottom mask. int startY = getTopMaskY(); int endY = getBottomMaskY(); // Account for ImageView margin inside the view containing the image and the masks. + assumeNonNull(mImageView); ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mImageView.getLayoutParams(); startY -= params.topMargin; endY -= params.topMargin; // Account for the imageview being zoomed out due to margins. + assumeNonNull(mFullBitmap); int bitmapWidth = mFullBitmap.getWidth(); int imageViewWidth = mImageView.getWidth(); if (bitmapWidth > imageViewWidth) { @@ -346,6 +358,7 @@ // Logic for the two views has substantial overlap, but we must flip/mirror most behaviors. boolean isTop = (view == mUpButton); View maskView = isTop ? mTopAreaMaskView : mBottomAreaMaskView; + assumeNonNull(maskView); // Track vertical dragging from the buttons. int y = (int) motionEvent.getRawY(); @@ -359,11 +372,12 @@ mDragStartViewHeight = params.height; mDragIsPossibleClick = true; handled = true; + assumeNonNull(mScrollView); mScrollView.requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_MOVE: // Hide "Drag to select Long Screenshot" instructional text after first user action. - mInstructionalTextView.setVisibility(View.INVISIBLE); + assumeNonNull(mInstructionalTextView).setVisibility(View.INVISIBLE); // Update top or bottom mask selector. params = maskView.getLayoutParams(); int deltaY = (isTop ? 1 : -1) * (y - mDragStartEventY); @@ -373,6 +387,7 @@ // Prevent mask regions from overlapping. int topMaskY = getTopMaskY(); int bottomMaskY = getBottomMaskY(); + assumeNonNull(mBottomAreaMaskView); int layoutHeight = ((View) mBottomAreaMaskView.getParent()).getHeight(); int minimumVerticalSelectionPx = dpToPx(MINIMUM_VERTICAL_SELECTION_DP); // Ensure masks don't overlap and are separated by a minimum distance. @@ -395,6 +410,7 @@ case MotionEvent.ACTION_UP: if (mDragIsPossibleClick) { View button = (isTop ? mUpButton : mDownButton); + assumeNonNull(button); button.performClick(); mDragIsPossibleClick = false; }
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetDialogCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetDialogCoordinator.java index e2f9894f..ebcbf76 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetDialogCoordinator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetDialogCoordinator.java
@@ -11,10 +11,12 @@ import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; +import org.chromium.build.annotations.NullMarked; import org.chromium.chrome.browser.share.share_sheet.ChromeOptionShareCallback; import org.chromium.ui.base.WindowAndroid; /** Coordinator for displaying the screenshot share sheet dialog. */ +@NullMarked public class ScreenshotShareSheetDialogCoordinator { private final ScreenshotShareSheetDialog mDialog; private final FragmentManager mFragmentManager;
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 5c4a281..c95aebe7 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
@@ -58,7 +58,38 @@ base::CallbackListSubscription test_signin_client_subscription_; }; -#if BUILDFLAG(IS_CHROMEOS) +// The unconsented primary account isn't supported on ChromeOS. +#if !BUILDFLAG(IS_CHROMEOS) +IN_PROC_BROWSER_TEST_F(SingleClientSecondaryAccountSyncTest, + StartsSyncTransportOnSignin) { + ASSERT_TRUE(SetupClients()); + + // Signing in (without granting sync consent or explicitly setting up Sync) + // should trigger starting the Sync machinery in standalone transport mode. + secondary_account_helper::SignInUnconsentedAccount( + profile(), &test_url_loader_factory_, "user@email.com"); + + EXPECT_TRUE(GetClient(0)->AwaitSyncTransportActive()); + + EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE, + GetSyncService(0)->GetTransportState()); + + ASSERT_FALSE(GetSyncService(0) + ->GetUserSettings() + ->IsInitialSyncFeatureSetupComplete()); + + EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); + EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureActive()); + + // Make sure that only the allowed types got activated. Note that, depending + // on some other feature flags, not all of the allowed types are necessarily + // active, and that's okay. + syncer::DataTypeSet bad_types = + base::Difference(GetSyncService(0)->GetActiveDataTypes(), + AllowedTypesInStandaloneTransportMode()); + EXPECT_TRUE(bad_types.empty()) << syncer::DataTypeSetToDebugString(bad_types); +} +#else IN_PROC_BROWSER_TEST_F(SingleClientSecondaryAccountSyncTest, DoesNotStartSyncTransportOnSignin) { ASSERT_TRUE(SetupClients()); @@ -71,7 +102,7 @@ EXPECT_EQ(syncer::SyncService::TransportState::DISABLED, GetSyncService(0)->GetTransportState()); } -#endif // BUILDFLAG(IS_CHROMEOS) +#endif // !BUILDFLAG(IS_CHROMEOS) // ChromeOS doesn't support changes to the primary account after startup, so // this test doesn't apply.
diff --git a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc index cb06b47..13f91cc 100644 --- a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
@@ -10,7 +10,6 @@ #include "build/build_config.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/test/integration/encryption_helper.h" -#include "chrome/browser/sync/test/integration/secondary_account_helper.h" #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h" #include "chrome/browser/sync/test/integration/sync_service_impl_harness.h" #include "chrome/browser/sync/test/integration/sync_test.h" @@ -25,8 +24,6 @@ #include "components/sync/test/nigori_test_utils.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_launcher.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" #if BUILDFLAG(IS_CHROMEOS) #include "ash/constants/ash_features.h" @@ -34,18 +31,6 @@ namespace { -using testing::ContainerEq; - -constexpr syncer::DataTypeSet kTypesGatedBehindHistoryOptIn{ - syncer::COLLABORATION_GROUP, - syncer::HISTORY, - syncer::HISTORY_DELETE_DIRECTIVES, - syncer::SAVED_TAB_GROUP, - syncer::SHARED_TAB_GROUP_DATA, - syncer::SHARED_TAB_GROUP_ACCOUNT_DATA, - syncer::SESSIONS, - syncer::USER_EVENTS}; - #if !BUILDFLAG(IS_ANDROID) base::FilePath GetTestFilePathForCacheGuid() { base::FilePath user_data_path; @@ -78,34 +63,14 @@ }; #endif // BUILDFLAG(IS_CHROMEOS) -class SingleClientStandaloneTransportSyncTest - : public SyncTest, - public testing::WithParamInterface<bool> { +class SingleClientStandaloneTransportSyncTest : public SyncTest { public: - SingleClientStandaloneTransportSyncTest() : SyncTest(SINGLE_CLIENT) { - if (GetParam()) { - override_features_ - .InitWithFeatures(/*enabled_features=*/ - {syncer:: - kSyncEnableContactInfoDataTypeForCustomPassphraseUsers, - syncer::kReplaceSyncPromosWithSignInPromos}, - /*disabled_features=*/{}); - } else { - override_features_.InitWithFeatures( - /*enabled_features=*/{}, - /*disabled_features=*/ - {syncer::kSyncEnableContactInfoDataTypeForCustomPassphraseUsers, - syncer::kReplaceSyncPromosWithSignInPromos}); - } - } - - private: - base::test::ScopedFeatureList override_features_; + SingleClientStandaloneTransportSyncTest() : SyncTest(SINGLE_CLIENT) {} }; // On Chrome OS sync auto-starts on sign-in. #if !BUILDFLAG(IS_CHROMEOS) -IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, +IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest, StartsSyncTransportOnSignin) { ASSERT_TRUE(SetupClients()); @@ -129,16 +94,20 @@ EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureActive()); + + // Make sure that only the allowed types got activated. Note that, depending + // on some other feature flags, not all of the allowed types are necessarily + // active, and that's okay. + syncer::DataTypeSet bad_types = + base::Difference(GetSyncService(0)->GetActiveDataTypes(), + AllowedTypesInStandaloneTransportMode()); + EXPECT_TRUE(bad_types.empty()) << syncer::DataTypeSetToDebugString(bad_types); } #endif // !BUILDFLAG(IS_CHROMEOS) #if !BUILDFLAG(IS_ANDROID) -IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, +IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest, SwitchesBetweenTransportAndFeature) { - const syncer::DataType kDataTypeExcludedInTransportMode = syncer::AUTOFILL; - CHECK(!AllowedTypesInStandaloneTransportMode().Has( - kDataTypeExcludedInTransportMode)); - ASSERT_TRUE(SetupClients()); // Setup a primary account, but don't actually enable Sync-the-feature (so @@ -150,26 +119,10 @@ GetSyncService(0)->GetTransportState()); ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureActive()); - syncer::DataTypeSet expected_types = Difference( - AllowedTypesInStandaloneTransportMode(), kTypesGatedBehindHistoryOptIn); - - // Bookmarks and reading list require a separate opt in, unless - // `syncer::kReplaceSyncPromosWithSignInPromos` is enabled. - // TODO(crbug.com/424124636): This shouldn't be necessary if - // `kReplaceSyncPromosWithSignInPromos` is enabled. - expected_types.Remove(syncer::BOOKMARKS); - expected_types.Remove(syncer::READING_LIST); - - // TODO(crbug.com/424124636): The types below should probably be excluded. - if (base::FeatureList::IsEnabled( - syncer::kReplaceSyncPromosWithSignInPromos)) { - expected_types.Put(syncer::PRODUCT_COMPARISON); - expected_types.Put(syncer::AUTOFILL_WALLET_METADATA); - expected_types.Put(syncer::AUTOFILL_WALLET_OFFER); - } - - ASSERT_THAT(GetSyncService(0)->GetActiveDataTypes(), - ContainerEq(expected_types)); + syncer::DataTypeSet bad_types = + base::Difference(GetSyncService(0)->GetActiveDataTypes(), + AllowedTypesInStandaloneTransportMode()); + EXPECT_TRUE(bad_types.empty()) << syncer::DataTypeSetToDebugString(bad_types); // Turn Sync-the-feature on. ASSERT_TRUE(GetClient(0)->SetupSync()); @@ -179,18 +132,18 @@ EXPECT_TRUE(GetSyncService(0)->IsSyncFeatureActive()); // Make sure that some data type which is not allowed in transport-only mode // got activated. + ASSERT_FALSE(AllowedTypesInStandaloneTransportMode().Has(syncer::AUTOFILL)); ASSERT_TRUE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( syncer::UserSelectableType::kAutofill)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( - kDataTypeExcludedInTransportMode)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::AUTOFILL)); } -#endif // !BUILDFLAG(IS_ANDROID) +#endif // BUILDFLAG(IS_ANDROID) // Tests the behavior of receiving a "Reset Sync" operation from the dashboard // while Sync-the-feature is active: On non-ChromeOS, this signs the user out, // so Sync will be fully disabled. On ChromeOS, there is no sign-out, so // Sync-the-transport will start. -IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, +IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest, HandlesResetFromDashboardWhenSyncActive) { ASSERT_TRUE(SetupClients()); @@ -220,39 +173,6 @@ EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE, GetSyncService(0)->GetTransportState()); EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); - - // There are no immediate plans to launch additional types on ChromeOS, so the - // list is hardcoded here. - EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(), - ContainerEq(syncer::DataTypeSet{ - syncer::AUTOFILL_WALLET_CREDENTIAL, - syncer::AUTOFILL_WALLET_DATA, - syncer::AUTOFILL_WALLET_USAGE, - syncer::DEVICE_INFO, - syncer::NIGORI, - syncer::USER_CONSENTS, - syncer::SEND_TAB_TO_SELF, - syncer::SECURITY_EVENTS, - syncer::SHARING_MESSAGE, - syncer::ARC_PACKAGE, - syncer::OS_PREFERENCES, - syncer::OS_PRIORITY_PREFERENCES, - // TODO(crbug.com/424698545): This seems off: many of the - // datatypes below should not start. - syncer::APP_LIST, - syncer::COLLABORATION_GROUP, - syncer::CONTACT_INFO, - syncer::EXTENSIONS, - syncer::EXTENSION_SETTINGS, - syncer::INCOMING_PASSWORD_SHARING_INVITATION, - syncer::OUTGOING_PASSWORD_SHARING_INVITATION, - syncer::PASSWORDS, - syncer::PRODUCT_COMPARISON, - syncer::SAVED_TAB_GROUP, - syncer::SHARED_TAB_GROUP_DATA, - syncer::SHARED_TAB_GROUP_ACCOUNT_DATA, - syncer::WEBAUTHN_CREDENTIAL, - })); #else // On platforms other than Ash, the "Reset Sync" operation should revoke // the Sync consent. On Mobile, "Reset Sync" also clears the primary account. @@ -269,7 +189,7 @@ #if !BUILDFLAG(IS_ANDROID) // Regression test for crbug.com/955989 that verifies the cache GUID is not // reset upon restart of the browser, in standalone transport mode. -IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, +IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest, PRE_ReusesSameCacheGuid) { ASSERT_TRUE(SetupClients()); ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); @@ -300,7 +220,7 @@ ASSERT_TRUE(base::WriteFile(GetTestFilePathForCacheGuid(), cache_guid)); } -IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, +IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest, ReusesSameCacheGuid) { ASSERT_TRUE(SetupClients()); ASSERT_FALSE(GetSyncService(0)->HasDisableReason( @@ -335,43 +255,40 @@ } #endif // BUILDFLAG(IS_ANDROID) -IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, - DataTypesEnabledInTransportModeWithoutAdditionalOptIns) { - ASSERT_TRUE(SetupClients()); - // Sign in, without turning on Sync-the-feature. - ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); - ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); - ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, - GetSyncService(0)->GetTransportState()); - ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); - ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( - syncer::UserSelectableType::kHistory)); +class SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest + : public SingleClientStandaloneTransportSyncTest { + public: + SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest() { + override_features_.InitWithFeatures( + /*enabled_features=*/ + {switches::kEnablePreferencesAccountStorage, + syncer::kSeparateLocalAndAccountSearchEngines, + syncer::kSyncEnableContactInfoDataTypeForCustomPassphraseUsers, + syncer::kReplaceSyncPromosWithSignInPromos, + syncer::kSyncAutofillWalletCredentialData}, + /*disabled_features=*/{}); + } + ~SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest() override = + default; - // Make sure that only the allowed types got activated. - syncer::DataTypeSet expected_types = Difference( - AllowedTypesInStandaloneTransportMode(), kTypesGatedBehindHistoryOptIn); - -#if !BUILDFLAG(IS_ANDROID) - // Bookmarks and reading list require a separate opt in, unless - // `syncer::kReplaceSyncPromosWithSignInPromos` is enabled. - // TODO(crbug.com/424124636): This shouldn't be necessary if - // `kReplaceSyncPromosWithSignInPromos` is enabled. - expected_types.Remove(syncer::BOOKMARKS); - expected_types.Remove(syncer::READING_LIST); -#endif // !BUILDFLAG(IS_ANDROID) - - EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(), - ContainerEq(expected_types)); -} - -IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, - DataTypesEnabledInTransportModeWithHistorySync) { - // Opting into history is only meaningful if - // `kReplaceSyncPromosWithSignInPromos` is enabled. - if (!GetParam()) { - GTEST_SKIP(); + bool WaitForPassphraseRequired() { + return PassphraseRequiredChecker(GetSyncService(0)).Wait(); } + bool WaitForPassphraseAccepted() { + return PassphraseAcceptedChecker(GetSyncService(0)).Wait(); + } + + private: + base::test::ScopedFeatureList override_features_; +}; + +// This test is disabled on CrOS as the signed in, non-syncing state does not +// exist. +#if !BUILDFLAG(IS_CHROMEOS) +IN_PROC_BROWSER_TEST_F( + SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest, + DataTypesEnabledInTransportModeWithoutHistorySync) { ASSERT_TRUE(SetupClients()); // Sign in, without turning on Sync-the-feature. ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); @@ -382,81 +299,79 @@ ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( syncer::UserSelectableType::kHistory)); + // With `kReplaceSyncPromosWithSignInPromos` and by default (without opting + // into history), all the history-related should be disabled in transport + // mode. + EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY)); + EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::HISTORY_DELETE_DIRECTIVES)); + EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS)); + EXPECT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS)); + + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::PRIORITY_PREFERENCES)); + + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::AUTOFILL_WALLET_CREDENTIAL)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::AUTOFILL_WALLET_DATA)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::AUTOFILL_WALLET_METADATA)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::AUTOFILL_WALLET_OFFER)); + EXPECT_TRUE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO)); +} + +IN_PROC_BROWSER_TEST_F( + SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest, + DataTypesEnabledInTransportModeWithHistorySync) { + ASSERT_TRUE(SetupClients()); + // Sign in, without turning on Sync-the-feature. + ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); + ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); + // Opt in to history and tabs. GetSyncService(0)->GetUserSettings()->SetSelectedType( syncer::UserSelectableType::kHistory, true); GetSyncService(0)->GetUserSettings()->SetSelectedType( syncer::UserSelectableType::kTabs, true); -#if !BUILDFLAG(IS_ANDROID) - GetSyncService(0)->GetUserSettings()->SetSelectedType( - syncer::UserSelectableType::kSavedTabGroups, true); -#endif // !BUILDFLAG(IS_ANDROID) ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, GetSyncService(0)->GetTransportState()); - // With the history opt in, all types that can run in transport mode should - // be active. - syncer::DataTypeSet expected_types = AllowedTypesInStandaloneTransportMode(); + // With `kReplaceSyncPromosWithSignInPromos`, all the history-related types + // should be enabled in transport mode. + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::HISTORY_DELETE_DIRECTIVES)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS)); -#if !BUILDFLAG(IS_ANDROID) - // Bookmarks and reading list require a separate opt in, unless - // `syncer::kReplaceSyncPromosWithSignInPromos` is enabled. - // TODO(crbug.com/424124636): This shouldn't be necessary if - // `kReplaceSyncPromosWithSignInPromos` is enabled. - expected_types.Remove(syncer::BOOKMARKS); - expected_types.Remove(syncer::READING_LIST); -#endif // !BUILDFLAG(IS_ANDROID) + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::PRIORITY_PREFERENCES)); - EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(), - ContainerEq(expected_types)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::AUTOFILL_WALLET_CREDENTIAL)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::AUTOFILL_WALLET_DATA)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::AUTOFILL_WALLET_METADATA)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::AUTOFILL_WALLET_OFFER)); + EXPECT_TRUE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO)); } - -#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) -IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, - DataTypesEnabledForImplicitSignIn) { - ASSERT_TRUE(SetupClients()); - - // Signing in (without granting sync consent or explicitly setting up Sync) - // should trigger starting the Sync machinery in standalone transport mode. - secondary_account_helper::ImplicitSignInUnconsentedAccount( - GetProfile(0), &test_url_loader_factory_, "user@email.com"); - - ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); - ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, - GetSyncService(0)->GetTransportState()); - - // There are no immediate plans to launch additional types to implicitly - // signed in users, so the list is hardcoded here. - syncer::DataTypeSet expected_types{syncer::AUTOFILL_WALLET_CREDENTIAL, - syncer::AUTOFILL_WALLET_DATA, - syncer::AUTOFILL_WALLET_USAGE, - syncer::DEVICE_INFO, - syncer::NIGORI, - syncer::PRIORITY_PREFERENCES, - syncer::USER_CONSENTS, - syncer::SEND_TAB_TO_SELF, - syncer::SECURITY_EVENTS, - syncer::SHARING_MESSAGE}; - - // TODO(crbug.com/424124636): The types below should probably be excluded. - if (base::FeatureList::IsEnabled( - syncer::kReplaceSyncPromosWithSignInPromos)) { - expected_types.Put(syncer::PRODUCT_COMPARISON); - expected_types.Put(syncer::AUTOFILL_WALLET_METADATA); - expected_types.Put(syncer::AUTOFILL_WALLET_OFFER); - } - - EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(), - ContainerEq(expected_types)); -} -#endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) +#endif // !BUILDFLAG(IS_CHROMEOS) // TODO(crbug.com/40200835): Android currently doesn't support PRE_ tests. #if !BUILDFLAG(IS_ANDROID) -IN_PROC_BROWSER_TEST_P( - SingleClientStandaloneTransportSyncTest, +IN_PROC_BROWSER_TEST_F( + SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest, PRE_DataTypesEnabledInTransportModeWithCustomPassphrase) { // There's a custom passphrase on the server. const syncer::KeyParamsForTesting kKeyParams = @@ -467,89 +382,63 @@ ASSERT_TRUE(SetupClients()); // Sign in, without turning on Sync-the-feature. ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); - ASSERT_TRUE(PassphraseRequiredChecker(GetSyncService(0)).Wait()); + ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); + + // Opt in to history and tabs. + GetSyncService(0)->GetUserSettings()->SetSelectedType( + syncer::UserSelectableType::kHistory, true); + GetSyncService(0)->GetUserSettings()->SetSelectedType( + syncer::UserSelectableType::kTabs, true); + // Preferences are opted-into by default. + ASSERT_TRUE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( + syncer::UserSelectableType::kPreferences)); + + ASSERT_TRUE(WaitForPassphraseRequired()); ASSERT_TRUE(GetSyncService(0)->GetUserSettings()->SetDecryptionPassphrase( kKeyParams.password)); - ASSERT_TRUE(PassphraseAcceptedChecker(GetSyncService(0)).Wait()); + ASSERT_TRUE(WaitForPassphraseAccepted()); ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, GetSyncService(0)->GetTransportState()); - ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); - // Make sure that only the allowed types got activated. - syncer::DataTypeSet expected_types = Difference( - AllowedTypesInStandaloneTransportMode(), kTypesGatedBehindHistoryOptIn); + // With a custom passphrase, the actual HISTORY types are not supported. + EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY)); + EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::HISTORY_DELETE_DIRECTIVES)); + EXPECT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS)); + // But SESSIONS aka Open Tabs still works. + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS)); + + // With `kReplaceSyncPromosWithSignInPromos`, both PREFERENCES and + // PRIORITY_PREFERENCES should be enabled in transport mode. + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::PRIORITY_PREFERENCES)); // CONTACT_INFO should be disabled by default for explicit-passphrase users. - expected_types.Remove(syncer::CONTACT_INFO); + EXPECT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO)); - // Bookmarks and reading list require a separate opt in, unless - // `syncer::kReplaceSyncPromosWithSignInPromos` is enabled. - // TODO(crbug.com/424124636): This shouldn't be necessary if - // `kReplaceSyncPromosWithSignInPromos` is enabled. - expected_types.Remove(syncer::BOOKMARKS); - expected_types.Remove(syncer::READING_LIST); + // Enabling kAutofill to enable CONTACT_INFO. + GetSyncService(0)->GetUserSettings()->SetSelectedType( + syncer::UserSelectableType::kAutofill, true); - ASSERT_THAT(GetSyncService(0)->GetActiveDataTypes(), - ContainerEq(expected_types)); + ASSERT_NE(syncer::SyncService::TransportState::ACTIVE, + GetSyncService(0)->GetTransportState()); + ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); - // Opting into history is only meaningful if - // `kReplaceSyncPromosWithSignInPromos` is enabled. - if (GetParam()) { - // Opt in to history and tabs. - GetSyncService(0)->GetUserSettings()->SetSelectedType( - syncer::UserSelectableType::kHistory, true); - GetSyncService(0)->GetUserSettings()->SetSelectedType( - syncer::UserSelectableType::kTabs, true); - GetSyncService(0)->GetUserSettings()->SetSelectedType( - syncer::UserSelectableType::kSavedTabGroups, true); - - ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); - ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, - GetSyncService(0)->GetTransportState()); - - syncer::DataTypeSet expected_types_after_history_opt_in = - AllowedTypesInStandaloneTransportMode(); - - // CONTACT_INFO should remain disabled since it's gated by kAutofill. - expected_types_after_history_opt_in.Remove(syncer::CONTACT_INFO); - - // With a custom passphrase, the actual HISTORY types are not supported. - expected_types_after_history_opt_in.Remove(syncer::HISTORY); - expected_types_after_history_opt_in.Remove( - syncer::HISTORY_DELETE_DIRECTIVES); - expected_types_after_history_opt_in.Remove(syncer::USER_EVENTS); - - // But SESSIONS aka Open Tabs still works. - CHECK(expected_types_after_history_opt_in.Has(syncer::SESSIONS)); - -#if !BUILDFLAG(IS_ANDROID) - // On desktop, bookmarks and reading list require a separate opt in. - // TODO(crbug.com/424124636): This shouldn't be necessary if - // `kReplaceSyncPromosWithSignInPromos` is enabled. - expected_types_after_history_opt_in.Remove(syncer::BOOKMARKS); - expected_types_after_history_opt_in.Remove(syncer::READING_LIST); -#endif // !BUILDFLAG(IS_ANDROID) - - EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(), - ContainerEq(expected_types_after_history_opt_in)); - - // Enabling kAutofill to enable CONTACT_INFO. - GetSyncService(0)->GetUserSettings()->SetSelectedType( - syncer::UserSelectableType::kAutofill, true); - ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); - - // CONTACT_INFO should be enabled. - EXPECT_TRUE( - GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO)); - } + // CONTACT_INFO should be enabled. + EXPECT_TRUE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO)); } // Tests that a custom passphrase user's opt-in to kAutofill (which happened in // the PRE_ test) survives a browser restart. -IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, - DataTypesEnabledInTransportModeWithCustomPassphrase) { +IN_PROC_BROWSER_TEST_F( + SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest, + DataTypesEnabledInTransportModeWithCustomPassphrase) { ASSERT_TRUE(SetupClients()); ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); @@ -557,30 +446,152 @@ ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, GetSyncService(0)->GetTransportState()); - // CONTACT_INFO should be enabled after restarting, if and only if - // `kSyncEnableContactInfoDataTypeForCustomPassphraseUsers` is enabled. - EXPECT_EQ(GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO), - GetParam()); + // CONTACT_INFO should be enabled after restarting. + EXPECT_TRUE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO)); } #endif // BUILDFLAG(IS_ANDROID) -INSTANTIATE_TEST_SUITE_P(ReplaceSyncWithSignin, - SingleClientStandaloneTransportSyncTest, -#if BUILDFLAG(IS_CHROMEOS) - // On ChromeOS, the behavior after enabling - // `syncer::kReplaceSyncPromosWithSignInPromos` is - // unspecified, so no need to test it. - ::testing::Values(false)); -#elif BUILDFLAG(IS_ANDROID) - // On Android, the feature has been enabled by - // default for a long time. There is no need to - // test the flag-disabled case. - ::testing::Values(true)); +class SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest + : public SingleClientStandaloneTransportSyncTest { + public: + SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest() { +#if BUILDFLAG(IS_ANDROID) + // On Android, PREFERENCES is active in transport mode only with + // `kReplaceSyncPromosWithSignInPromos` enabled. + override_features_.InitWithFeatures( + /*enabled_features=*/{switches::kEnablePreferencesAccountStorage}, + /*disabled_features=*/{syncer::kReplaceSyncPromosWithSignInPromos}); #else - ::testing::Bool()); -#endif + // On Desktop, PREFERENCES, SEARCH_ENGINES and THEMES are active in + // transport mode irrespective of `kReplaceSyncPromosWithSignInPromos`. + // TODO(crbug.com/330677712): Merge this with the Android branch once + // `kReplaceSyncPromosWithSignInPromos` is removed. + override_features_.InitWithFeatures( + /*enabled_features=*/{switches::kEnablePreferencesAccountStorage, + syncer::kSeparateLocalAndAccountSearchEngines, + syncer::kSeparateLocalAndAccountThemes}, + /*disabled_features=*/{syncer::kReplaceSyncPromosWithSignInPromos}); +#endif // BUILDFLAG(IS_ANDROID) + } + ~SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest() + override = default; -// ReplaceSyncWithSigninMigrationSyncTest is + private: + base::test::ScopedFeatureList override_features_; +}; + +#if BUILDFLAG(IS_ANDROID) + +IN_PROC_BROWSER_TEST_F( + SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest, + DataTypesNotEnabledInTransportMode) { + ASSERT_TRUE(SetupClients()); + // Sign in, without turning on Sync-the-feature. + ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); + ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); + + // Without `kReplaceSyncPromosWithSignInPromos`, neither History/Tabs nor + // Preferences are supported in transport mode, so they're reported as not + // selected even if the user explicitly tries to turn them on. + syncer::UserSelectableTypeSet types = + GetSyncService(0)->GetUserSettings()->GetRegisteredSelectableTypes(); + ASSERT_TRUE(types.HasAll({syncer::UserSelectableType::kHistory, + syncer::UserSelectableType::kTabs, + syncer::UserSelectableType::kPreferences})); + GetSyncService(0)->GetUserSettings()->SetSelectedTypes( + /*sync_everything=*/true, types); + ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( + syncer::UserSelectableType::kHistory)); + ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( + syncer::UserSelectableType::kTabs)); + ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( + syncer::UserSelectableType::kPreferences)); + + ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); + ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, + GetSyncService(0)->GetTransportState()); + + // Without `kReplaceSyncPromosWithSignInPromos`, none of the history-related + // types should be active in transport mode (even if the user has opted in). + EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY)); + EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::HISTORY_DELETE_DIRECTIVES)); + EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS)); + EXPECT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS)); + + // Without `kReplaceSyncPromosWithSignInPromos`, PREFERENCES should not be + // active in transport mode (even if the user has opted in). + EXPECT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + // TODO(crbug.com/412602018): With + // `kSyncSupportAlwaysSyncingPriorityPreferences` enabled, + // PRIORITY_PREFERENCES are active in transport mode and decoupled from user + // toggle. Update or add new test to cover PRIORITY_PREFERENCES. +} + +#else + +IN_PROC_BROWSER_TEST_F( + SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest, + DataTypesNotEnabledInTransportMode) { + ASSERT_TRUE(SetupClients()); + // Sign in, without turning on Sync-the-feature. + ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); + ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); + + // Without `kReplaceSyncPromosWithSignInPromos`, History/Tabs are not are + // supported in transport mode, so they're reported as not selected even if + // the user explicitly tries to turn them on. + syncer::UserSelectableTypeSet types = + GetSyncService(0)->GetUserSettings()->GetRegisteredSelectableTypes(); + ASSERT_TRUE(types.HasAll({syncer::UserSelectableType::kHistory, + syncer::UserSelectableType::kTabs, + syncer::UserSelectableType::kPreferences})); + GetSyncService(0)->GetUserSettings()->SetSelectedTypes( + /*sync_everything=*/true, types); + ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( + syncer::UserSelectableType::kHistory)); + ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( + syncer::UserSelectableType::kTabs)); + // Preferences, Themes and Search Engines are supported in transport mode, + // provided the enabled feature flags, irrespective of + // `kReplaceSyncPromosWithSignInPromos`. So they're reported as selected even + // when the user explicitly turns them on. + ASSERT_TRUE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().HasAll( + {syncer::UserSelectableType::kPreferences, + syncer::UserSelectableType::kThemes})); + + ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); + ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, + GetSyncService(0)->GetTransportState()); + + // Without `kReplaceSyncPromosWithSignInPromos`, none of the history-related + // types should be active in transport mode (even if the user has opted in). + EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY)); + EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has( + syncer::HISTORY_DELETE_DIRECTIVES)); + EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS)); + EXPECT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS)); + + // PREFERENCES, SEARCH_ENGINES and THEMES are active in transport mode + // irrespective of `kReplaceSyncPromosWithSignInPromos`, provided the + // enabled feature flags. + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::THEMES)); + EXPECT_TRUE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::SEARCH_ENGINES)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + // TODO(crbug.com/412602018): With + // `kSyncSupportAlwaysSyncingPriorityPreferences` enabled, + // PRIORITY_PREFERENCES are active in transport mode and decoupled from user + // toggle. Update or add new test to cover PRIORITY_PREFERENCES. +} + +#endif // BUILDFLAG(IS_ANDROID) + +// SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest is // disabled on CrOS as the signed in, non-syncing state does not exist. // TODO(crbug.com/40145099): Android currently doesn't support PRE_ tests and // all of these are. @@ -591,9 +602,10 @@ // This test intends to test the mobile migration behavior, but runs on desktop. // Desktop and mobile have different behaviors, and as a consequence is test is // only an approximation. -class ReplaceSyncWithSigninMigrationSyncTest : public SyncTest { +class SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest + : public SingleClientStandaloneTransportSyncTest { public: - ReplaceSyncWithSigninMigrationSyncTest() : SyncTest(SINGLE_CLIENT) { + SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest() { // Various features that are required for types to be supported in transport // mode are unconditionally enabled. default_features_.InitWithFeatures( @@ -610,15 +622,17 @@ {{syncer::kReplaceSyncPromosWithSignInPromos, !content::IsPreTest()}, {switches::kEnablePreferencesAccountStorage, !content::IsPreTest()}}); } - ~ReplaceSyncWithSigninMigrationSyncTest() override = default; + ~SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest() + override = default; private: base::test::ScopedFeatureList default_features_; base::test::ScopedFeatureList sync_to_signin_feature_; }; -IN_PROC_BROWSER_TEST_F(ReplaceSyncWithSigninMigrationSyncTest, - PRE_MigratesSignedInUser) { +IN_PROC_BROWSER_TEST_F( + SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest, + PRE_MigratesSignedInUser) { ASSERT_TRUE(SetupClients()); // Sign in, without turning on Sync-the-feature. ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); @@ -647,8 +661,9 @@ GetSyncService(0)->GetTransportState()); } -IN_PROC_BROWSER_TEST_F(ReplaceSyncWithSigninMigrationSyncTest, - MigratesSignedInUser) { +IN_PROC_BROWSER_TEST_F( + SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest, + MigratesSignedInUser) { ASSERT_TRUE(SetupClients()); ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); @@ -672,8 +687,9 @@ syncer::UserSelectableType::kPreferences)); } -IN_PROC_BROWSER_TEST_F(ReplaceSyncWithSigninMigrationSyncTest, - PRE_MigratesSignedInCustomPassphraseUser) { +IN_PROC_BROWSER_TEST_F( + SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest, + PRE_MigratesSignedInCustomPassphraseUser) { ASSERT_TRUE(SetupClients()); // Sign in, without turning on Sync-the-feature. ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); @@ -698,8 +714,9 @@ syncer::UserSelectableType::kPreferences)); } -IN_PROC_BROWSER_TEST_F(ReplaceSyncWithSigninMigrationSyncTest, - MigratesSignedInCustomPassphraseUser) { +IN_PROC_BROWSER_TEST_F( + SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest, + MigratesSignedInCustomPassphraseUser) { ASSERT_TRUE(SetupClients()); ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc index c2eddc6c..5744fb9c 100644 --- a/chrome/browser/sync/test/integration/sync_test.cc +++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -58,8 +58,6 @@ #include "chrome/common/chrome_switches.h" #include "components/bookmarks/test/bookmark_test_helpers.h" #include "components/browser_sync/browser_sync_switches.h" -#include "components/commerce/core/commerce_feature_list.h" -#include "components/data_sharing/public/features.h" #include "components/gcm_driver/fake_gcm_profile_service.h" #include "components/gcm_driver/gcm_profile_service.h" #include "components/gcm_driver/instance_id/instance_id.h" @@ -67,8 +65,6 @@ #include "components/gcm_driver/instance_id/instance_id_profile_service.h" #include "components/keyed_service/core/keyed_service.h" #include "components/os_crypt/sync/os_crypt_mocker.h" -#include "components/password_manager/core/browser/password_manager_buildflags.h" -#include "components/plus_addresses/features.h" #include "components/prefs/scoped_user_pref_update.h" #include "components/signin/public/base/consent_level.h" #include "components/signin/public/base/signin_switches.h" @@ -109,7 +105,6 @@ #endif // BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(IS_ANDROID) -#include "chrome/browser/password_manager/android/password_manager_util_bridge.h" #include "chrome/browser/sync/test/integration/sync_test_utils_android.h" #else // BUILDFLAG(IS_ANDROID) #include "chrome/browser/ui/browser.h" @@ -1080,19 +1075,12 @@ syncer::DataTypeSet AllowedTypesInStandaloneTransportMode() { static_assert(55 == syncer::GetNumDataTypes(), "Add new types below if they can run in transport mode"); - -#if BUILDFLAG(IS_ANDROID) - // On Android, `kReplaceSyncPromosWithSignInPromos` has been enabled by - // default for a long time, so it is not expected to be exercised in tests. - CHECK( - base::FeatureList::IsEnabled(syncer::kReplaceSyncPromosWithSignInPromos)); -#endif // BUILDFLAG(IS_ANDROID) - // Only some types will run by default in transport mode (i.e. without their // own separate opt-in). syncer::DataTypeSet allowed_types = {syncer::AUTOFILL_WALLET_CREDENTIAL, syncer::AUTOFILL_WALLET_DATA, syncer::AUTOFILL_WALLET_USAGE, + syncer::CONTACT_INFO, syncer::DEVICE_INFO, syncer::SECURITY_EVENTS, syncer::SEND_TAB_TO_SELF, @@ -1100,20 +1088,12 @@ syncer::USER_CONSENTS}; allowed_types.PutAll(syncer::ControlTypes()); -#if BUILDFLAG(IS_CHROMEOS) - // OS sync types run in transport mode. - allowed_types.PutAll({syncer::APP_LIST, syncer::ARC_PACKAGE, - syncer::OS_PREFERENCES, - syncer::OS_PRIORITY_PREFERENCES}); - - // Some of the feature-guarded logic in the #else branch below could make - // sense for ChromeOS too. However, since there are no immediate plans to - // roll them out on ChromeOS, they are excluded in this test to avoid - // accidental rollouts on ChromeOS transport mode (which is somewhat special, - // and reachable only in advanced scenarios such as the user having cleared - // data via sync dashboard). -#else // BUILDFLAG(IS_CHROMEOS) - allowed_types.Put(syncer::CONTACT_INFO); + allowed_types.Put(syncer::PLUS_ADDRESS); + allowed_types.Put(syncer::PLUS_ADDRESS_SETTING); + allowed_types.Put(syncer::PASSWORDS); + allowed_types.Put(syncer::WEBAUTHN_CREDENTIAL); + allowed_types.Put(syncer::INCOMING_PASSWORD_SHARING_INVITATION); + allowed_types.Put(syncer::OUTGOING_PASSWORD_SHARING_INVITATION); if (base::FeatureList::IsEnabled( switches::kEnablePreferencesAccountStorage)) { @@ -1131,44 +1111,37 @@ syncer::kReplaceSyncPromosWithSignInPromos)) { allowed_types.Put(syncer::AUTOFILL_WALLET_METADATA); allowed_types.Put(syncer::AUTOFILL_WALLET_OFFER); + allowed_types.Put(syncer::COLLABORATION_GROUP); allowed_types.Put(syncer::HISTORY); allowed_types.Put(syncer::HISTORY_DELETE_DIRECTIVES); + allowed_types.Put(syncer::PRODUCT_COMPARISON); allowed_types.Put(syncer::SAVED_TAB_GROUP); allowed_types.Put(syncer::SESSIONS); + allowed_types.Put(syncer::SHARED_TAB_GROUP_DATA); allowed_types.Put(syncer::USER_EVENTS); - - if (data_sharing::features::IsDataSharingFunctionalityEnabled()) { - allowed_types.Put(syncer::SHARED_TAB_GROUP_DATA); - allowed_types.Put(syncer::COLLABORATION_GROUP); - - if (base::FeatureList::IsEnabled( - syncer::kSyncSharedTabGroupAccountData)) { - allowed_types.Put(syncer::SHARED_TAB_GROUP_ACCOUNT_DATA); - } - } - - if (base::FeatureList::IsEnabled(commerce::kProductSpecifications)) { - allowed_types.Put(syncer::PRODUCT_COMPARISON); - } } if (base::FeatureList::IsEnabled(syncer::kSyncAutofillLoyaltyCard)) { allowed_types.Put(syncer::AUTOFILL_VALUABLE); } - -#if BUILDFLAG(IS_ANDROID) && !BUILDFLAG(USE_LOGIN_DATABASE_AS_BACKEND) - // On Android, PASSWORDS require that Google Play Services is present. - password_manager_android_util::PasswordManagerUtilBridge util_bridge; - if (util_bridge.IsInternalBackendPresent()) { - allowed_types.Put(syncer::PASSWORDS); + if (base::FeatureList::IsEnabled(syncer::kSyncSharedTabGroupAccountData)) { + allowed_types.Put(syncer::SHARED_TAB_GROUP_ACCOUNT_DATA); } -#else // BUILDFLAG(IS_ANDROID) && !BUILDFLAG(USE_LOGIN_DATABASE_AS_BACKEND) - allowed_types.Put(syncer::PASSWORDS); -#endif // BUILDFLAG(IS_ANDROID) && !BUILDFLAG(USE_LOGIN_DATABASE_AS_BACKEND) - #if BUILDFLAG(IS_ANDROID) - // TODO(crbug.com/420912307): Allow `syncer::WEB_APKS` if - // `syncer::kWebApkBackupAndRestoreBackend` is enabled. -#else // BUILDFLAG(IS_ANDROID) + if (base::FeatureList::IsEnabled(syncer::kWebApkBackupAndRestoreBackend)) { + allowed_types.Put(syncer::WEB_APKS); + } +#endif + +#if BUILDFLAG(IS_CHROMEOS) + // OS sync types run in transport mode. + allowed_types.PutAll({syncer::APP_LIST, syncer::ARC_PACKAGE, + syncer::OS_PREFERENCES, syncer::OS_PRIORITY_PREFERENCES, + syncer::PRINTERS, + syncer::PRINTERS_AUTHORIZATION_SERVERS, + syncer::WIFI_CONFIGURATIONS, syncer::WORKSPACE_DESK}); +#endif // BUILDFLAG(IS_CHROMEOS) + +#if !BUILDFLAG(IS_ANDROID) if (base::FeatureList::IsEnabled(syncer::kSeparateLocalAndAccountThemes)) { allowed_types.Put(syncer::THEMES); } @@ -1177,21 +1150,7 @@ syncer::kSeparateLocalAndAccountSearchEngines)) { allowed_types.Put(syncer::SEARCH_ENGINES); } - - // These types are excluded on Android as they run outside Chrome. - allowed_types.Put(syncer::INCOMING_PASSWORD_SHARING_INVITATION); - allowed_types.Put(syncer::OUTGOING_PASSWORD_SHARING_INVITATION); - allowed_types.Put(syncer::WEBAUTHN_CREDENTIAL); -#endif // BUILDFLAG(IS_ANDROID) -#endif // BUILDFLAG(IS_CHROMEOS) - - if (base::FeatureList::IsEnabled( - plus_addresses::features::kPlusAddressesEnabled) && - !plus_addresses::features::kEnterprisePlusAddressServerUrl.Get() - .empty()) { - allowed_types.Put(syncer::PLUS_ADDRESS); - allowed_types.Put(syncer::PLUS_ADDRESS_SETTING); - } +#endif // !BUILDFLAG(IS_ANDROID) return allowed_types; }
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index c9ed87f..669be14f 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -2959,6 +2959,9 @@ <message name="IDS_IDENTITY_ERROR_CARD_BUTTON_OKAY" desc="Button label for the message shown in the Sync Error Card (due to missing trusted vault keys) for confirming that a user wants to get all their passwords on their device."> Okay </message> + <message name="IDS_IDENTITY_ERROR_CARD_BUTTON_GET" desc="Button label for the message shown in the Sync Error Card (due to missing trusted vault keys) for fixing the issue and getting all passwords of a user on their device."> + Get + </message> <!-- Identity error message and notification strings --> <message name="IDS_IDENTITY_ERROR_MESSAGE_BODY" desc="Error message/notification to resolve passphrase required error, sync encryption error, auth error, outdated client error."> Keep using the Chrome data in your Google Account
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IDENTITY_ERROR_CARD_BUTTON_GET.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IDENTITY_ERROR_CARD_BUTTON_GET.png.sha1 new file mode 100644 index 0000000..b498017f --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IDENTITY_ERROR_CARD_BUTTON_GET.png.sha1
@@ -0,0 +1 @@ +7a5ff5c30e4ae06a280d5cec98f4c2c9196e00a1 \ No newline at end of file
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 469e3ac0..ba2f58b 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
@@ -342,6 +342,7 @@ </translation> <translation id="2547843573592965873">يحافظ قفل الملف الشخصي على أمان معلوماتك في السيارة، بما في ذلك كلمات المرور ومعلومات الدفع وغيرها من المعلومات المحفوظة في حسابك على Google.</translation> <translation id="254973855621628293">كلمات المرور المحفوظة على هذا الجهاز</translation> +<translation id="2566471851103108967">{FILE_COUNT,plural, =1{تم حظر عملية تنزيل خطيرة}zero{تم حظر # عملية تنزيل خطيرة}two{تم حظر عمليتَي تنزيل خطيرتَين}few{تم حظر # عمليات تنزيل خطيرة}many{تم حظر # عملية تنزيل خطيرة}other{تم حظر # عملية تنزيل خطيرة}}</translation> <translation id="2567385386134582609">صورة</translation> <translation id="2569733278091928697">ستتمكّن بسهولة من إدارة عناصر التحكم في الوسائط وجلسات التصفح المتخفي وعمليات التنزيل وغيرها.</translation> <translation id="2571711316400087311">اقتراح إرسال صفحات بلغات أخرى إلى "ترجمة Google"</translation> @@ -752,6 +753,7 @@ <translation id="4479972344484327217">جارٍ تثبيت <ph name="MODULE" /> لمتصفِّح Chrome…</translation> <translation id="4484496141267039529">لا يتوفّر اتصال بالإنترنت. يُرجى إعادة المحاولة لاحقًا.</translation> <translation id="4487967297491345095">سيتم حذف جميع بيانات تطبيق Chrome نهائيًا. ويشمل ذلك جميع الملفات والإعدادات والحسابات وقواعد البيانات وما إلى ذلك.</translation> +<translation id="4494315997125191493">يمكنك انقر على "إدارة" للاطّلاع على جميع النوافذ</translation> <translation id="4494806687727322324">فعَّل المشرف ميزة "حفظ كلمات المرور".</translation> <translation id="4508528996305412043">قائمة بطاقة الخلاصة مفتوحة</translation> <translation id="4509741852167209430">تتم مشاركة أنواع محدودة من البيانات بين المواقع الإلكترونية لقياس أداء إعلاناتها، مثل ما إذا كان قد تم إجراء عملية شراء بعد زيارة موقع إلكتروني.</translation> @@ -792,6 +794,7 @@ <translation id="4668279686271488041">يتم بانتظام حذف بيانات "قياس أداء الإعلانات" من جهازك.</translation> <translation id="4668347365065281350">جميع البيانات المُخزَّنة من خلال المواقع الإلكترونية بما في ذلك ملفات تعريف الارتباط وغيرها من البيانات المُخزَّنَة محليًا</translation> <translation id="4678082183394354975">وضع "المظهر الداكن" مفعَّل للمواقع الإلكترونية في Chrome.</translation> +<translation id="4682306524980568490">الحدّ الأقصى لعدد النوافذ التي يمكن عرضها هو <ph name="MAX_INSTANCE_COUNT" /></translation> <translation id="4684427112815847243">مزامنة جميع البيانات</translation> <translation id="4685741273709472646">الاختيار من القائمة المنسدلة</translation> <translation id="4687718960473379118">الإعلانات المقترَحة من المواقع الإلكترونية</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 c4df444c..155943a 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
@@ -839,7 +839,7 @@ <translation id="483742037940503070">{TAB_COUNT,plural, =1{Gendan fanegruppen med <ph name="TAB_COUNT_ONE" /> fane og farven <ph name="COLOR_NAME" /> som en ny fanegruppe i baggrunden.}one{Gendan fanegruppen med <ph name="TAB_COUNT_MANY" /> fane og farven <ph name="COLOR_NAME" /> som en ny fanegruppe i baggrunden.}other{Gendan fanegruppen med <ph name="TAB_COUNT_MANY" /> faner og farven <ph name="COLOR_NAME" /> som en ny fanegruppe i baggrunden.}}</translation> <translation id="4844633725025837809">For at beskytte adgangskoderne yderligere krypteres de på din enhed, inden de gemmes i Googles Adgangskodeadministrator</translation> <translation id="4849731766219625109">Brug din <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />-konto</translation> -<translation id="4850886885716139402">Vis</translation> +<translation id="4850886885716139402">Se</translation> <translation id="4852014461738377247">Logger ind\u2026</translation> <translation id="4860895144060829044">Ring op</translation> <translation id="4864369630010738180">Logger ind...</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 5ea61a2..6cb76d0 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
@@ -341,6 +341,7 @@ <translation id="2546283357679194313">کوکیها و دادههای سایت</translation> <translation id="2547843573592965873">قفل نمایه اطلاعات شما را در خودرو ایمن نگه میدارد، ازجمله گذرواژهها، پرداختها، و اطلاعات دیگری که در «حساب Google» شما ذخیره میشود.</translation> <translation id="254973855621628293">گذرواژههای ذخیرهشده در این دستگاه</translation> +<translation id="2566471851103108967">{FILE_COUNT,plural, =1{بارگیری خطرناک مسدود شد}one{# بارگیری خطرناک مسدود شد}other{# بارگیری خطرناک مسدود شد}}</translation> <translation id="2567385386134582609">تصویر</translation> <translation id="2569733278091928697">بهراحتی میتوانید کنترلهای رسانه، جلسههای «ناشناس»، بارگیریها، و موارد دیگر را مدیریت کنید</translation> <translation id="2571711316400087311">پیشنهاد ارسال صفحههای نوشتهشده به زبانهای دیگر به «ترجمه Google»</translation> @@ -750,6 +751,7 @@ <translation id="4479972344484327217">درحال نصب <ph name="MODULE" /> برای Chrome…</translation> <translation id="4484496141267039529">اتصال برقرار نیست. بعداً دوباره امتحان کنید.</translation> <translation id="4487967297491345095">همه دادههای برنامه Chrome بهطور دائم حذف خواهند شد. این دادهها شامل همه فایلها، تنظیمات، حسابها، پایگاههای داده و غیره میشود.</translation> +<translation id="4494315997125191493">برای دیدن همه پنجرهها، مدیریت کردن را انتخاب کنید</translation> <translation id="4494806687727322324">سرپرستتان ذخیره گذرواژه را روشن کرده است</translation> <translation id="4508528996305412043">منوی کارت فید باز شد</translation> <translation id="4509741852167209430">انواع محدودی از دادهها بین سایتها همرسانی میشود تا سایتها بتوانند عملکرد آگهیهایشان را بسنجند؛ مثلاً آیا پساز بازدید از سایت خریدی انجام دادهاید یا نه.</translation> @@ -790,6 +792,7 @@ <translation id="4668279686271488041">دادههای سنجش آگهی مرتباً از دستگاهتان حذف میشود</translation> <translation id="4668347365065281350">همه دادههایی که سایتها ذخیره کردهاند، ازجمله کوکیها و دیگر دادههایی که بهطور محلی ذخیره شدهاند</translation> <translation id="4678082183394354975">زمینه تاریک برای سایتها در Chrome روشن است</translation> +<translation id="4682306524980568490">فقط <ph name="MAX_INSTANCE_COUNT" /> پنجره را میتوان نمایش داد</translation> <translation id="4684427112815847243">همگامسازی همه</translation> <translation id="4685741273709472646">انتخاب از فهرست کرکرهای</translation> <translation id="4687718960473379118">آگهیهای پیشنهادی سایت</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 2644cbf..3d0f17c 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
@@ -674,6 +674,7 @@ <translation id="4116038641877404294">I-download ang mga page para magamit ang mga ito offline</translation> <translation id="4121654769234887259">Hindi mo kailangang tandaan ang password na ito. Mase-save ito sa Google Password Manager para sa <ph name="USERNAME" /></translation> <translation id="4124152339699379357">Nakabukas ang proseso ng pahintulot sa notification nang buo ang taas</translation> +<translation id="4129668596244365470">{NUM_REVOKED_PERMISSIONS,plural, =1{Inihinto ng Chrome ang mga notification mula sa site na ito. Puwede mong suriin at pamahalaan.}one{Inihinto ng Chrome ang mga notification mula sa mga site na ito. Puwede mong suriin at pamahalaan.}other{Inihinto ng Chrome ang mga notification mula sa mga site na ito. Puwede mong suriin at pamahalaan.}}</translation> <translation id="4132137475637520539">Hayaang sumali ang sinumang may link</translation> <translation id="4135200667068010335">Nakasara ang listahan ng mga device kung saan magbabahagi ng tab.</translation> <translation id="4137746084635924146">Kasalukuyang wika ng device</translation> @@ -936,6 +937,7 @@ <translation id="5267572070504076962">I-on ang Ligtas na Pag-browse para magkaroon ng proteksyon laban sa mga mapanganib na site</translation> <translation id="5271967389191913893">Hindi mabuksan ng device ang content na ida-download.</translation> <translation id="5273031377282080577">Pinapamahalaan ng iyong administrator ang setting na ito.</translation> +<translation id="5287338992381051621">{NUM_REVOKED_PERMISSIONS,plural, =1{Nag-unsubscribe mula sa isang hindi ginagamit na site}one{Nag-unsubscribe mula sa # hindi ginagamit na site}other{Nag-unsubscribe mula sa # na hindi ginagamit na site}}</translation> <translation id="5292796745632149097">Ipadala kay</translation> <translation id="5301876394151419436">Naka-sign in ka bilang si <ph name="EMAIL" /> Puwede mong ihinto ang pag-sync anumang oras sa mga setting. Puwedeng i-personalize ng Google ang Search at iba pang serbisyo batay sa iyong history.</translation> <translation id="5304593522240415983">Hindi maaaring maging blangko ang field na ito</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 a590d858..d00541d 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
@@ -674,6 +674,7 @@ <translation id="4116038641877404294">Ներբեռնեք էջերը՝ անցանց ռեժիմում օգտագործելու համար</translation> <translation id="4121654769234887259">Այս գաղտնաբառը հիշելու կարիք չկա։ Այն կպահվի <ph name="USERNAME" /> հաշվի Google գաղտնաբառերի կառավարչում։</translation> <translation id="4124152339699379357">Ծանուցումների թույլտվության պատուհանը բացված է ամբողջությամբ</translation> +<translation id="4129668596244365470">{NUM_REVOKED_PERMISSIONS,plural, =1{Chrome-ը դադարեցրել է ծանուցումներ ուղարկել այս կայքից։ Դիտեք և կառավարեք կարգավորումները։}one{Chrome-ը դադարեցրել է ծանուցումներ ուղարկել այս կայքից։ Դիտեք և կառավարեք կարգավորումները։}other{Chrome-ը դադարեցրել է ծանուցումներ ուղարկել այս կայքերից։ Դիտեք և կառավարեք կարգավորումները։}}</translation> <translation id="4132137475637520539">Թույլ տալ հղումն ունեցող ցանկացած օգտատիրոջ միանալ</translation> <translation id="4135200667068010335">Սարքերը, որոնց հետ կիսվելու եք ներդիրով, ցուցադրված չեն էկրանին:</translation> <translation id="4137746084635924146">Սարքի ընթացիկ լեզուն</translation> @@ -936,6 +937,7 @@ <translation id="5267572070504076962">Միացրեք Անվտանգ դիտարկումը՝ վտանգավոր կայքերից պաշտպանվելու համար</translation> <translation id="5271967389191913893">Սարքը չի կարող բացել ներբեռնվող բովանդակությունը:</translation> <translation id="5273031377282080577">Այս կարգավորումը կառավարվում է ձեր ադմինիստրատորի կողմից։</translation> +<translation id="5287338992381051621">{NUM_REVOKED_PERMISSIONS,plural, =1{Մեկ չօգտագործվող կայքի բաժանորդագրությունը չեղարկվեց}one{# չօգտագործվող կայքի բաժանորդագրությունը չեղարկվեց}other{# չօգտագործվող կայքի բաժանորդագրությունը չեղարկվեց}}</translation> <translation id="5292796745632149097">Ուղարկել</translation> <translation id="5301876394151419436">Դուք մուտք եք գործել որպես <ph name="EMAIL" />։ Ցանկացած ժամանակ կարգավորումներում կարող եք կանգնեցնել համաժամացումը։ Google-ը կարող է ձեր պատմության հիման վրա անհատականացնել Որոնումը և այլ ծառայություններ։</translation> <translation id="5304593522240415983">Այս դաշտը չի կարող դատարկ լինել</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 b90f62a..ff81350 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
@@ -674,6 +674,7 @@ <translation id="4116038641877404294">Atsisiųskite puslapius, kad galėtumėte naudoti juos neprisijungę</translation> <translation id="4121654769234887259">Jums nereikės prisiminti šio slaptažodžio. Jis bus išsaugotas „Google“ slaptažodžių tvarkyklėje kaip priskirtas el. pašto adresui <ph name="USERNAME" />.</translation> <translation id="4124152339699379357">Pranešimų leidimo srautas atidarytas per visą ekrano aukštį</translation> +<translation id="4129668596244365470">{NUM_REVOKED_PERMISSIONS,plural, =1{„Chrome“ sustabdė pranešimus iš šios svetainės. Galite peržiūrėti ir tvarkyti.}one{„Chrome“ sustabdė pranešimus iš šių svetainių. Galite peržiūrėti ir tvarkyti.}few{„Chrome“ sustabdė pranešimus iš šių svetainių. Galite peržiūrėti ir tvarkyti.}many{„Chrome“ sustabdė pranešimus iš šių svetainių. Galite peržiūrėti ir tvarkyti.}other{„Chrome“ sustabdė pranešimus iš šių svetainių. Galite peržiūrėti ir tvarkyti.}}</translation> <translation id="4132137475637520539">Leisti prisijungti visiems nuorodą turintiems žmonėms</translation> <translation id="4135200667068010335">Įrenginių, su kuriais reikia bendrinti skirtuką, sąrašas uždarytas.</translation> <translation id="4137746084635924146">Dabartinės įrenginio kalba</translation> @@ -936,6 +937,7 @@ <translation id="5267572070504076962">Įjunkite Saugų naršymą, kad būtumėte apsaugoti nuo pavojingų svetainių</translation> <translation id="5271967389191913893">Įrenginyje nepavyksta atidaryti norimo atsisiųsti turinio.</translation> <translation id="5273031377282080577">Šį nustatymą tvarko administratorius.</translation> +<translation id="5287338992381051621">{NUM_REVOKED_PERMISSIONS,plural, =1{Atšaukta vienos nenaudojamos svetainės prenumerata}one{Atšaukta # nenaudojamos svetainės prenumerata}few{Atšaukta # nenaudojamų svetainių prenumerata}many{Atšaukta # nenaudojamos svetainės prenumerata}other{Atšaukta # nenaudojamų svetainių prenumerata}}</translation> <translation id="5292796745632149097">Siųsti į</translation> <translation id="5301876394151419436">Esate prisijungę kaip <ph name="EMAIL" />. Galite bet kada sustabdyti sinchronizavimą skiltyje „Nustatymai“. „Google“ gali suasmeninti Paiešką ir kitas paslaugas pagal jūsų istoriją.</translation> <translation id="5304593522240415983">Šis laukas negali būti tuščias</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 d86505f..fca6d4d 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
@@ -341,6 +341,7 @@ <translation id="2546283357679194313">Kuki dan data tapak</translation> <translation id="2547843573592965873">Kunci profil anda melindungi maklumat anda di dalam kereta, termasuk kata laluan, pembayaran dan pelbagai lagi yang disimpan pada Google Account anda.</translation> <translation id="254973855621628293">Kata laluan disimpan pada peranti ini</translation> +<translation id="2566471851103108967">{FILE_COUNT,plural, =1{Muat turun berbahaya disekat}other{# muat turun berbahaya disekat}}</translation> <translation id="2567385386134582609">IMEJ</translation> <translation id="2569733278091928697">Anda akan dapat mengurus kawalan media, sesi Inkognito, muat turun dan pelbagai lagi dengan mudah</translation> <translation id="2571711316400087311">Tawarkan untuk menghantar halaman dalam bahasa lain kepada Google Translate</translation> @@ -750,6 +751,7 @@ <translation id="4479972344484327217">Memasang <ph name="MODULE" /> untuk Chrome…</translation> <translation id="4484496141267039529">Tiada sambungan. Cuba lagi nanti.</translation> <translation id="4487967297491345095">Semua data apl Chrome akan dipadamkan selama-lamanya. Ini termasuk semua fail, tetapan, akaun, pangkalan data dan sebagainya.</translation> +<translation id="4494315997125191493">Pilih urus untuk melihat semua tetingkap</translation> <translation id="4494806687727322324">Penyimpanan kata laluan dihidupkan oleh pentadbir anda</translation> <translation id="4508528996305412043">Menu kad suapan dibuka</translation> <translation id="4509741852167209430">Jenis data yang terhad akan dikongsi antara laman untuk mengukur prestasi iklan laman, seperti sama ada anda membuat pembelian atau tidak selepas melawat laman</translation> @@ -790,6 +792,7 @@ <translation id="4668279686271488041">Data ukuran iklan dipadamkan dengan kerap daripada peranti anda</translation> <translation id="4668347365065281350">Semua data yang disimpan oleh tapak, termasuk kuki dan data lain yang disimpan setempat</translation> <translation id="4678082183394354975">Tema gelap untuk laman dihidupkan dalam Chrome</translation> +<translation id="4682306524980568490">Hanya <ph name="MAX_INSTANCE_COUNT" /> tetingkap dapat ditunjukkan</translation> <translation id="4684427112815847243">Segerakkan semua</translation> <translation id="4685741273709472646">Pilih daripada senarai lungsur</translation> <translation id="4687718960473379118">Iklan yang dicadangkan laman</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb index 222d998..8402c18 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -341,6 +341,7 @@ <translation id="2546283357679194313">କୁକିସ୍ ଏବଂ ସାଇଟ୍ ଡାଟା</translation> <translation id="2547843573592965873">ଆପଣଙ୍କ ପ୍ରୋଫାଇଲ ଲକ ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟରେ ସେଭ କରାଯାଇଥିବା ପାସୱାର୍ଡ, ପେମେଣ୍ଟ ଏବଂ ଆହୁରି ଅନେକ କିଛି ସମେତ ଆପଣଙ୍କ ସୂଚନା କାରରେ ସୁରକ୍ଷିତ ରଖେ।</translation> <translation id="254973855621628293">ଏହି ଡିଭାଇସରେ ପାସୱାର୍ଡଗୁଡ଼ିକ ସେଭ କରାଯାଇଛି</translation> +<translation id="2566471851103108967">{FILE_COUNT,plural, =1{ବିପଦଜନକ ଡାଉନଲୋଡକୁ ବ୍ଲକ କରାଯାଇଛି}other{# ବିପଦଜନକ ଡାଉନଲୋଡକୁ ବ୍ଲକ କରାଯାଇଛି}}</translation> <translation id="2567385386134582609">ଛବି</translation> <translation id="2569733278091928697">ଆପଣ ମିଡିଆ ନିୟନ୍ତ୍ରଣ, ଇନକଗ୍ନିଟୋ ସେସନ, ଡାଉନଲୋଡଗୁଡ଼ିକ ଏବଂ ଆହୁରି ଅନେକ କିଛିକୁ ସହଜରେ ପରିଚାଳନା କରିବା ପାଇଁ ସକ୍ଷମ ହେବେ</translation> <translation id="2571711316400087311">ଅନ୍ୟ ଭାଷାରେ ଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକୁ Google Translateକୁ ପଠାଇବା ପାଇଁ ଅଫର୍ କରନ୍ତୁ</translation> @@ -750,6 +751,7 @@ <translation id="4479972344484327217">Chrome ପାଇଁ <ph name="MODULE" /> ଇନ୍ଷ୍ଟଲ୍ କରାଯାଉଛି …</translation> <translation id="4484496141267039529">କୌଣସି ସଂଯୋଗ ନାହିଁ। ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="4487967297491345095">Chromeର ସମସ୍ତ ଆପ୍ ଡାଟା ସ୍ଥାୟୀ ଭାବରେ ଡିଲିଟ୍ ହୋଇଯିବ। ଏଥିରେ ସମସ୍ତ ଫାଇଲ୍, ସେଟିଂସ୍, ଡାଟାବେସ୍, ଇତ୍ୟାଦି ଅନ୍ତର୍ଭୁକ୍ତ ଅଛି।</translation> +<translation id="4494315997125191493">ସମସ୍ତ ୱିଣ୍ଡୋକୁ ଦେଖିବା ପାଇଁ ପରିଚାଳନା କରନ୍ତୁକୁ ଚୟନ କରନ୍ତୁ</translation> <translation id="4494806687727322324">ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କ ଦ୍ୱାରା ପାସୱାର୍ଡ ସେଭ କରିବା ଚାଲୁ କରାଯାଇଛି</translation> <translation id="4508528996305412043">ଫିଡ୍ କାର୍ଡ ମେନୁ ଖୋଲା ଅଛି</translation> <translation id="4509741852167209430">ସାଇଟଗୁଡ଼ିକର ବିଜ୍ଞାପନର ପରଫରମାନ୍ସ ମାପିବା ପାଇଁ ସେଗୁଡ଼ିକ ମଧ୍ୟରେ ସୀମିତ ପ୍ରକାରର ଡାଟା ସେୟାର କରାଯାଏ, ଯେପରି ଆପଣ ଏକ ସାଇଟକୁ ଭିଜିଟ କରିବା ପରେ କୌଣସି କ୍ରୟ କରିଛନ୍ତି ନା ନାହିଁ</translation> @@ -790,6 +792,7 @@ <translation id="4668279686271488041">ଆପଣଙ୍କ ଡିଭାଇସରୁ ବିଜ୍ଞାପନ-ପରିମାପ ଡାଟାକୁ ନିୟମିତ ଭାବେ ଡିଲିଟ କରାଯାଏ</translation> <translation id="4668347365065281350">କୁକୀ ଏବଂ ଡିଭାଇସରେ ଷ୍ଟୋର୍ ଥିବା ଅନ୍ୟ ଡାଟା ସମେତ ସମସ୍ତ ଡାଟା ସାଇଟଗୁଡ଼ିକ ଦ୍ୱାରା ଷ୍ଟୋର୍ କରାଯାଇଛି</translation> <translation id="4678082183394354975">Chromeରେ ସାଇଟଗୁଡ଼ିକ ପାଇଁ ଗାଢ଼ା ଥିମ ଚାଲୁ ଅଛି</translation> +<translation id="4682306524980568490">କେବଳ <ph name="MAX_INSTANCE_COUNT" /> ୱିଣ୍ଡୋକୁ ଦେଖାଯାଇପାରିବ</translation> <translation id="4684427112815847243">ସବୁକିଛି ସିଙ୍କ୍ କରନ୍ତୁ</translation> <translation id="4685741273709472646">ଡ୍ରପଡାଉନ ତାଲିକାରୁ ଚୟନ କରନ୍ତୁ</translation> <translation id="4687718960473379118">ସାଇଟ ଦ୍ୱାରା-ପରାମର୍ଶ ଦିଆଯାଇଥିବା ବିଜ୍ଞାପନଗୁଡ଼ିକ</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 9eb34d1..6bf6af7 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
@@ -674,6 +674,7 @@ <translation id="4116038641877404294">ਪੰਨਿਆਂ ਨੂੰ ਆਫ਼ਲਾਈਨ ਵਰਤਣ ਲਈ ਉਹਨਾਂ ਨੂੰ ਡਾਊਨਲੋਡ ਕਰੋ</translation> <translation id="4121654769234887259">ਤੁਹਾਨੂੰ ਇਸ ਪਾਸਵਰਡ ਨੂੰ ਯਾਦ ਰੱਖਣ ਦੀ ਲੋੜ ਨਹੀਂ ਪਵੇਗੀ। ਇਸਨੂੰ <ph name="USERNAME" /> ਲਈ Google Password Manager ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="4124152339699379357">ਸੂਚਨਾ ਸੰਬੰਧੀ ਇਜਾਜ਼ਤ ਸੰਬੰਧੀ ਪ੍ਰਵਾਹ ਪੂਰੀ ਉਚਾਈ ਤੱਕ ਖੁੱਲ੍ਹਿਆ ਹੈ</translation> +<translation id="4129668596244365470">{NUM_REVOKED_PERMISSIONS,plural, =1{Chrome ਨੇ ਇਸ ਸਾਈਟ ਤੋਂ ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰ ਦਿੱਤੀਆਂ ਹਨ। ਤੁਸੀਂ ਸਮੀਖਿਆ ਅਤੇ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦੇ ਹੋ।}one{Chrome ਨੇ ਇਸ ਸਾਈਟ ਤੋਂ ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰ ਦਿੱਤੀਆਂ ਹਨ। ਤੁਸੀਂ ਸਮੀਖਿਆ ਅਤੇ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦੇ ਹੋ।}other{Chrome ਨੇ ਇਨ੍ਹਾਂ ਸਾਈਟ ਤੋਂ ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰ ਦਿੱਤੀਆਂ ਹਨ। ਤੁਸੀਂ ਸਮੀਖਿਆ ਅਤੇ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦੇ ਹੋ।}}</translation> <translation id="4132137475637520539">ਜਿਸ ਕੋਲ ਵੀ ਲਿੰਕ ਹੈ, ਉਸ ਨੂੰ ਸ਼ਾਮਲ ਹੋਣ ਦੀ ਆਗਿਆ ਦਿਓ</translation> <translation id="4135200667068010335">ਟੈਬ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਲਈ ਡੀਵਾਈਸਾਂ ਦੀ ਸੂਚੀ ਬੰਦ ਹੈ।</translation> <translation id="4137746084635924146">ਡੀਵਾਈਸ ਦੀ ਮੌਜੂਦਾ ਭਾਸ਼ਾ</translation> @@ -936,6 +937,7 @@ <translation id="5267572070504076962">ਖਤਰਨਾਕ ਸਾਈਟਾਂ ਵਿਰੁੱਧ ਸੁਰੱਖਿਆ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਚਾਲੂ ਕਰੋ</translation> <translation id="5271967389191913893">ਡੀਵਾਈਸ ਡਾਊਨਲੋਡ ਕੀਤੀ ਜਾਣ ਵਾਲੀ ਸਮੱਗਰੀ ਨੂੰ ਨਹੀਂ ਖੋਲ੍ਹ ਸਕਦਾ ਹੈ।</translation> <translation id="5273031377282080577">ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਇਸ ਸੈਟਿੰਗ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਦਾ ਹੈ।</translation> +<translation id="5287338992381051621">{NUM_REVOKED_PERMISSIONS,plural, =1{ਇੱਕ ਅਣਵਰਤੀ ਸਾਈਟ ਤੋਂ ਅਣਸਬਸਕ੍ਰਾਈਬ ਕੀਤਾ}one{# ਅਣਵਰਤੀ ਸਾਈਟ ਤੋਂ ਅਣਸਬਸਕ੍ਰਾਈਬ ਕੀਤਾ}other{# ਅਣਵਰਤੀਆਂ ਸਾਈਟਾਂ ਤੋਂ ਅਣਸਬਸਕ੍ਰਾਈਬ ਕੀਤਾ}}</translation> <translation id="5292796745632149097">ਇਸ 'ਤੇ ਭੇਜੋ</translation> <translation id="5301876394151419436">ਤੁਸੀਂ <ph name="EMAIL" /> ਵਜੋਂ ਸਾਈਨ-ਇਨ ਕੀਤਾ ਹੋਇਆ ਹੈ। ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਕਿਸੇ ਵੇਲੇ ਵੀ ਸਿੰਕ ਕਰਨਾ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ। Google ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਦੇ ਆਧਾਰ 'ਤੇ Search ਅਤੇ ਹੋਰ ਸੇਵਾਵਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾ ਸਕਦਾ ਹੈ।</translation> <translation id="5304593522240415983">ਇਹ ਖੇਤਰ ਖਾਲੀ ਨਹੀਂ ਛੱਡਿਆ ਜਾ ਸਕਦਾ</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 a67c94b..984f32b 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
@@ -341,6 +341,7 @@ <translation id="2546283357679194313">Kolačići i podaci o sajtovima</translation> <translation id="2547843573592965873">Zaključavanje profila štiti podatke u automobilu, uključujući lozinke, plaćanja i drugo sačuvano na Google nalogu.</translation> <translation id="254973855621628293">Lozinke su sačuvane na ovom uređaju</translation> +<translation id="2566471851103108967">{FILE_COUNT,plural, =1{Opasno preuzimanje je blokirano}one{# opasno preuzimanje je blokirano}few{# opasna preuzimanja su blokirana}other{# opasnih preuzimanja je blokirano}}</translation> <translation id="2567385386134582609">SLIKA</translation> <translation id="2569733278091928697">Moći ćete lako da upravljate kontrolama medija, sesijama bez arhiviranja, preuzimanjima i drugim sadržajem</translation> <translation id="2571711316400087311">Ponudi slanje stranica na drugim jezicima u Google prevodilac</translation> @@ -750,6 +751,7 @@ <translation id="4479972344484327217">Instalira se <ph name="MODULE" /> za Chrome…</translation> <translation id="4484496141267039529">Nema internet veze. Probajte ponovo kasnije.</translation> <translation id="4487967297491345095">Svi podaci Chrome aplikacija će biti trajno izbrisani. To obuhvata sve datoteke, podešavanja, naloge, baze podataka itd.</translation> +<translation id="4494315997125191493">Izaberite Upravljajte da biste videli sve prozore</translation> <translation id="4494806687727322324">Administrator je uključio čuvanje lozinki</translation> <translation id="4508528996305412043">Meni kartice fida je otvoren</translation> <translation id="4509741852167209430">Ograničeni tipovi podataka se dele između sajtova radi merenja učinka oglasa, na primer, da li ste obavili kupovinu posle posete sajtu</translation> @@ -790,6 +792,7 @@ <translation id="4668279686271488041">Podaci merenja oglasa se redovno brišu sa uređaja</translation> <translation id="4668347365065281350">Svi podaci koje čuvaju sajtovi, uključujući kolačiće i druge lokalno sačuvane podatke</translation> <translation id="4678082183394354975">Tamna tema za sajtove je uključena u Chrome-u</translation> +<translation id="4682306524980568490">Maksimalni broj prozora koji mogu da se prikazuju je <ph name="MAX_INSTANCE_COUNT" /></translation> <translation id="4684427112815847243">Sinhronizuj sve</translation> <translation id="4685741273709472646">Izaberite sa padajuće liste</translation> <translation id="4687718960473379118">Oglasi koje predlažu sajtovi</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 a320af8..e4e6d324 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
@@ -341,6 +341,7 @@ <translation id="2546283357679194313">Колачићи и подаци о сајтовима</translation> <translation id="2547843573592965873">Закључавање профила штити податке у аутомобилу, укључујући лозинке, плаћања и друго сачувано на Google налогу.</translation> <translation id="254973855621628293">Лозинке су сачуване на овом уређају</translation> +<translation id="2566471851103108967">{FILE_COUNT,plural, =1{Опасно преузимање је блокирано}one{# опасно преузимање је блокирано}few{# опасна преузимања су блокирана}other{# опасних преузимања је блокирано}}</translation> <translation id="2567385386134582609">СЛИКА</translation> <translation id="2569733278091928697">Моћи ћете лако да управљате контролама медија, сесијама без архивирања, преузимањима и другим садржајем</translation> <translation id="2571711316400087311">Понуди слање страница на другим језицима у Google преводилац</translation> @@ -750,6 +751,7 @@ <translation id="4479972344484327217">Инсталира се <ph name="MODULE" /> за Chrome…</translation> <translation id="4484496141267039529">Нема интернет везе. Пробајте поново касније.</translation> <translation id="4487967297491345095">Сви подаци Chrome апликација ће бити трајно избрисани. То обухвата све датотеке, подешавања, налоге, базе података итд.</translation> +<translation id="4494315997125191493">Изаберите Управљајте да бисте видели све прозоре</translation> <translation id="4494806687727322324">Администратор је укључио чување лозинки</translation> <translation id="4508528996305412043">Мени картице фида је отворен</translation> <translation id="4509741852167209430">Ограничени типови података се деле између сајтова ради мерења учинка огласа, на пример, да ли сте обавили куповину после посете сајту</translation> @@ -790,6 +792,7 @@ <translation id="4668279686271488041">Подаци мерења огласа се редовно бришу са уређаја</translation> <translation id="4668347365065281350">Сви подаци које чувају сајтови, укључујући колачиће и друге локално сачуване податке</translation> <translation id="4678082183394354975">Тамна тема за сајтове је укључена у Chrome-у</translation> +<translation id="4682306524980568490">Максимални број прозора који могу да се приказују је <ph name="MAX_INSTANCE_COUNT" /></translation> <translation id="4684427112815847243">Синхронизуј све</translation> <translation id="4685741273709472646">Изаберите са падајуће листе</translation> <translation id="4687718960473379118">Огласи које предлажу сајтови</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 f958bcc..1ee2ba66 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
@@ -1054,7 +1054,7 @@ <translation id="583281660410589416">ไม่รู้จัก</translation> <translation id="5833984609253377421">แชร์ลิงก์</translation> <translation id="5839058148541733625">ไดโนเสาร์ Chrome</translation> -<translation id="5848257610304005265">เปิด PDF ด้วย <ph name="APP_NAME" /> ใช่ไหม</translation> +<translation id="5848257610304005265">เปิด PDF ด้วย "<ph name="APP_NAME" />" ใช่ไหม</translation> <translation id="5849288995120328556">หยุดการแชร์ใช่ไหม</translation> <translation id="5853623416121554550">หยุดชั่วคราว</translation> <translation id="5855546874025048181">ปรับแต่ง "<ph name="REFINE_TEXT" />"</translation> @@ -1625,7 +1625,7 @@ <translation id="8128734975707333498">เปิดตัวเลือกในการบันทึก</translation> <translation id="8130309322784422030">ข้อมูลการลงชื่อเข้าใช้ที่คุณเก็บไว้อาจล้าสมัย</translation> <translation id="813082847718468539">ดูข้อมูลเว็บไซต์</translation> -<translation id="8135406045838672858">PDF ที่ดาวน์โหลดจะเปิดด้วย <ph name="APP_NAME" /> โดยอัตโนมัติ</translation> +<translation id="8135406045838672858">PDF ที่ดาวน์โหลดจะเปิดด้วย "<ph name="APP_NAME" />" โดยอัตโนมัติ</translation> <translation id="8137562778192957619">คุณไม่ต้องจำรหัสผ่านนี้ เพราะระบบจะบันทึกไว้ในเครื่องมือจัดการรหัสผ่านบน Google</translation> <translation id="8152331954420209374">ไปที่ Lens</translation> <translation id="8163820386638255770">โปรดยืนยันว่าเป็นคุณเพื่อใช้และบันทึกรหัสผ่านในบัญชี Google</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 8dc402c..9cade6f 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
@@ -341,6 +341,7 @@ <translation id="2546283357679194313">Amakhukhi nedatha yesayithi</translation> <translation id="2547843573592965873">Ukukhiya iphrofayela yakho kugcina ulwazi lwakho luvikelekile emotweni, okuhlanganisa amaphasiwedi, ukukhokha, kanye nokunye okulondolozwe kuGoogle Account yakho.</translation> <translation id="254973855621628293">Iphasiwedi ilondolozwe kule divayisi</translation> +<translation id="2566471851103108967">{FILE_COUNT,plural, =1{Ukudawuniloda okuyingozi kuvinjiwe}one{Ukudawuniloda okuyingozi okungu-# kuvinjiwe}other{Ukudawuniloda okuyingozi okungu-# kuvinjiwe}}</translation> <translation id="2567385386134582609">ISITHOMBE</translation> <translation id="2569733278091928697">Uzokwazi ukuphatha kalula izilawuli zemidiya, amaseshini we-Incognito, okudawunilodiwe nokuningi</translation> <translation id="2571711316400087311">Nikezela ukuthumela amakhasi ngezinye izilimi ku-Google Translate</translation> @@ -750,6 +751,7 @@ <translation id="4479972344484327217">Ifaka i-<ph name="MODULE" /> ye-Chrome…</translation> <translation id="4484496141267039529">Akukho ukuxhumana. Zama futhi emuva kwesikhathi.</translation> <translation id="4487967297491345095">Yonke idatha yohlelo lokusebenza le-Chrome izosuswa ngunaphakade. Lokhu kufaka phakathi onke amafayela, izilungiselelo, ama-akhawunti, isizindalwazi, njll.</translation> +<translation id="4494315997125191493">Khetha okuthi lawula ukuze ubone wonke amawindi</translation> <translation id="4494806687727322324">Ukulondolozwa kwephasiwedi kuvulwe ngumlawuli wakho</translation> <translation id="4508528996305412043">Imenyu yekhadi lokuphakelayo ivuliwe</translation> <translation id="4509741852167209430">Izinhlobo zedatha ezikhawulelwe zabiwa phakathi kwamasayithi ukuze kulinganiswe ukusebenza kwezikhangiso zawo, njengokuthi uthenge yini ngemva kokuvakashela isayithi</translation> @@ -790,6 +792,7 @@ <translation id="4668279686271488041">Idatha yokulinganisela izikhangiso isulwa njalo kudivayisi yakho</translation> <translation id="4668347365065281350">Yonke idatha egcinwe amasayithi, okufaka phakathi amakhukhi nenye idatha egcinwe endaweni</translation> <translation id="4678082183394354975">Itimu emnyama yamasayithi ivuliwe ku-Chrome</translation> +<translation id="4682306524980568490">Amawindi angu-<ph name="MAX_INSTANCE_COUNT" /> kuphela angaboniswa</translation> <translation id="4684427112815847243">Vumelanisa yonke into</translation> <translation id="4685741273709472646">Khetha ohlwini lokwehlayo</translation> <translation id="4687718960473379118">Izikhangiso eziphakanyiswe yisayithi</translation>
diff --git a/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.cc b/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.cc index 10cc99d..faba73c 100644 --- a/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.cc +++ b/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.cc
@@ -7,7 +7,10 @@ #include <utility> #include "base/android/jni_android.h" +#include "base/numerics/safe_conversions.h" +#include "chrome/browser/android/tab_android.h" #include "chrome/browser/profiles/profile.h" +#include "components/tabs/public/tab_interface.h" #include "components/tabs/public/tab_strip_collection.h" // Must come after all headers that specialize FromJniType() / ToJniType(). @@ -16,6 +19,10 @@ namespace tabs { +namespace { +constexpr int kInvalidTabIndex = -1; +} // namespace + TabCollectionTabModelImpl::TabCollectionTabModelImpl( JNIEnv* env, const jni_zero::JavaRef<jobject>& java_object, @@ -30,6 +37,28 @@ delete this; } +int TabCollectionTabModelImpl::GetTabCountRecursive(JNIEnv* env) const { + return base::checked_cast<int>(tab_strip_collection_->TabCountRecursive()); +} + +int TabCollectionTabModelImpl::GetIndexOfTabRecursive( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& j_tab_android) const { + TabAndroid* target_tab = TabAndroid::GetNativeTab(env, j_tab_android); + if (!target_tab) { + return kInvalidTabIndex; + } + + int current_index = 0; + for (tabs::TabInterface* tab_in_collection : *tab_strip_collection_) { + if (tab_in_collection == target_tab) { + return current_index; + } + current_index++; + } + return kInvalidTabIndex; +} + static jlong JNI_TabCollectionTabModelImpl_Init( JNIEnv* env, const base::android::JavaParamRef<jobject>& j_java_object,
diff --git a/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.h b/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.h index c306e40..51ce4ca 100644 --- a/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.h +++ b/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.h
@@ -32,10 +32,20 @@ TabCollectionTabModelImpl& operator=(const TabCollectionTabModelImpl&) = delete; + // Returns the total number of tabs in the collection, including + // sub-collections. + int GetTabCountRecursive(JNIEnv* env) const; + + // Returns the recursive index of the given tab, or -1 if not found. + int GetIndexOfTabRecursive( + JNIEnv* env, + const jni_zero::JavaParamRef<jobject>& j_tab_android) const; + private: JavaObjectWeakGlobalRef java_object_; raw_ptr<Profile> profile_; + // Always valid until destroyed. std::unique_ptr<tabs::TabStripCollection> tab_strip_collection_; };
diff --git a/chrome/browser/ui/ash/quick_answers/quick_answers_state_ash.cc b/chrome/browser/ui/ash/quick_answers/quick_answers_state_ash.cc index 073dead..3efa5d1 100644 --- a/chrome/browser/ui/ash/quick_answers/quick_answers_state_ash.cc +++ b/chrome/browser/ui/ash/quick_answers/quick_answers_state_ash.cc
@@ -238,19 +238,18 @@ // We should not directly use the pref locale, resolve the generic locale name // to one of the locally defined ones first. - std::string resolved_locale; - bool resolve_success = - l10n_util::CheckAndResolveLocale(locale, &resolved_locale, - /*perform_io=*/false); - DCHECK(resolve_success); + const std::optional<std::string> resolved_locale = + l10n_util::CheckAndResolveLocale( + locale, l10n_util::CheckLocaleMode::kUseKnownLocalesList); + DCHECK(resolved_locale); if (resolved_application_locale_ == resolved_locale) { return; } - resolved_application_locale_ = resolved_locale; + resolved_application_locale_ = resolved_locale.value_or(""); for (auto& observer : observers_) { - observer.OnApplicationLocaleReady(resolved_locale); + observer.OnApplicationLocaleReady(resolved_locale.value_or("")); } MaybeNotifyEligibilityChanged();
diff --git a/chrome/browser/ui/autofill/BUILD.gn b/chrome/browser/ui/autofill/BUILD.gn index 371a00ee..5e709279 100644 --- a/chrome/browser/ui/autofill/BUILD.gn +++ b/chrome/browser/ui/autofill/BUILD.gn
@@ -292,7 +292,6 @@ ] } else { sources += [ - "address_bubbles_controller_unittest.cc", "address_editor_controller_unittest.cc", "autofill_field_promo_controller_impl_unittest.cc", "autofill_popup_controller_impl_unittest.cc", @@ -438,6 +437,7 @@ defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] sources = [ + "address_bubbles_controller_browsertest.cc", "autofill_ai/save_or_update_autofill_ai_data_controller_impl_browsertest.cc", "autofill_context_menu_manager_browsertest.cc", ]
diff --git a/chrome/browser/ui/autofill/address_bubbles_controller_unittest.cc b/chrome/browser/ui/autofill/address_bubbles_controller_browsertest.cc similarity index 74% rename from chrome/browser/ui/autofill/address_bubbles_controller_unittest.cc rename to chrome/browser/ui/autofill/address_bubbles_controller_browsertest.cc index cd643cb..5053285b 100644 --- a/chrome/browser/ui/autofill/address_bubbles_controller_unittest.cc +++ b/chrome/browser/ui/autofill/address_bubbles_controller_browsertest.cc
@@ -1,65 +1,45 @@ -// Copyright 2020 The Chromium Authors +// Copyright 2025 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/ui/autofill/address_bubbles_controller.h" -#include <string> - -#include "base/functional/callback_helpers.h" -#include "base/memory/raw_ptr.h" #include "base/test/mock_callback.h" -#include "base/test/scoped_feature_list.h" -#include "chrome/browser/autofill/ui/ui_util.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/global_features.h" -#include "chrome/browser/ui/tabs/tab_enums.h" -#include "chrome/browser/ui/views/frame/test_with_browser_view.h" -#include "components/application_locale_storage/application_locale_storage.h" -#include "components/autofill/core/browser/data_model/addresses/autofill_profile.h" -#include "components/autofill/core/browser/field_types.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/test/base/in_process_browser_test.h" #include "components/autofill/core/browser/foundations/autofill_client.h" #include "components/autofill/core/browser/test_utils/autofill_test_utils.h" -#include "components/autofill/core/browser/ui/addresses/autofill_address_util.h" -#include "components/autofill/core/common/autofill_features.h" -#include "components/strings/grit/components_strings.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/base/l10n/l10n_util.h" +#include "content/public/test/browser_test.h" namespace autofill { using ::testing::Property; using profile_ref = base::optional_ref<const AutofillProfile>; -// TODO(crbug.com/384547121): Unit test shouldn't use BrowserWithTestWindowTest -// or TestWithBrowserView. -class AddressBubblesControllerTest : public TestWithBrowserView { +class AddressBubblesControllerBrowserTest : public InProcessBrowserTest { public: - AddressBubblesControllerTest() = default; - void SetUp() override { - TestWithBrowserView::SetUp(); - AddTab(browser(), GURL("about:blank")); - } - - AddressBubblesController* controller() { - return AddressBubblesController::FromWebContents(web_contents()); - } + AddressBubblesControllerBrowserTest() = default; + AddressBubblesControllerBrowserTest( + const AddressBubblesControllerBrowserTest&) = delete; + AddressBubblesControllerBrowserTest& operator=( + const AddressBubblesControllerBrowserTest&) = delete; + ~AddressBubblesControllerBrowserTest() override = default; protected: raw_ptr<content::WebContents> web_contents() const { return browser()->tab_strip_model()->GetActiveWebContents(); } - const std::string& app_locale() const { - return g_browser_process->GetFeatures() - ->application_locale_storage() - ->Get(); + AddressBubblesController* controller() { + return AddressBubblesController::FromWebContents(web_contents()); } }; -TEST_F(AddressBubblesControllerTest, DialogAcceptedInvokesCallback) { +IN_PROC_BROWSER_TEST_F(AddressBubblesControllerBrowserTest, + DialogAcceptedInvokesCallback) { AutofillProfile profile = test::GetFullProfile(); base::MockCallback<AutofillClient::AddressProfileSavePromptCallback> callback; + AddressBubblesController::SetUpAndShowSaveOrUpdateAddressBubble( web_contents(), profile, /*original_profile=*/nullptr, /*is_migration_to_account=*/{}, callback.Get()); @@ -71,7 +51,8 @@ AutofillClient::AddressPromptUserDecision::kAccepted, std::nullopt); } -TEST_F(AddressBubblesControllerTest, DialogCancelledInvokesCallback) { +IN_PROC_BROWSER_TEST_F(AddressBubblesControllerBrowserTest, + DialogCancelledInvokesCallback) { AutofillProfile profile = test::GetFullProfile(); base::MockCallback<AutofillClient::AddressProfileSavePromptCallback> callback; AddressBubblesController::SetUpAndShowSaveOrUpdateAddressBubble( @@ -88,7 +69,8 @@ // This is testing that closing all tabs (which effectively destroys the web // contents) will trigger the save callback with kIgnored decions if the users // hasn't interacted with the prompt already. -TEST_F(AddressBubblesControllerTest, WebContentsDestroyedInvokesCallback) { +IN_PROC_BROWSER_TEST_F(AddressBubblesControllerBrowserTest, + WebContentsDestroyedInvokesCallback) { AutofillProfile profile = test::GetFullProfile(); base::MockCallback<AutofillClient::AddressProfileSavePromptCallback> callback; AddressBubblesController::SetUpAndShowSaveOrUpdateAddressBubble( @@ -96,6 +78,7 @@ /*is_migration_to_account=*/{}, callback.Get()); TabStripModel* tab_strip_model = browser()->tab_strip_model(); + CHECK_EQ(1, tab_strip_model->count()); // There is only now tab open, so the active web contents, are the // controller's web contents. content::WebContents* controller_web_contents = @@ -104,7 +87,8 @@ // Now add another tab, and close the controller tab to make sure the window // remains open. This should destroy the web contents of the controller and // invoke the callback with a decision kIgnored. - AddTab(browser(), GURL("http://foo.com/")); + GURL url(url::kAboutBlankURL); + ASSERT_TRUE(AddTabAtIndex(0, url, ui::PAGE_TRANSITION_TYPED)); EXPECT_EQ(2, tab_strip_model->count()); EXPECT_CALL(callback, Run(AutofillClient::AddressPromptUserDecision::kIgnored, Property(&profile_ref::has_value, false))); @@ -117,7 +101,8 @@ } // This is testing that the bubble is visible and active when shown. -TEST_F(AddressBubblesControllerTest, BubbleShouldBeVisibleByDefault) { +IN_PROC_BROWSER_TEST_F(AddressBubblesControllerBrowserTest, + BubbleShouldBeVisibleByDefault) { AutofillProfile profile = test::GetFullProfile(); AddressBubblesController::SetUpAndShowSaveOrUpdateAddressBubble( web_contents(), profile, /*original_profile=*/nullptr, @@ -132,8 +117,8 @@ // This is testing that when a second prompt comes while another prompt is // shown, the controller will ignore it, and inform the backend that the second // prompt has been auto declined. -TEST_F(AddressBubblesControllerTest, - SecondPromptWillBeAutoDeclinedWhileFirstIsVisible) { +IN_PROC_BROWSER_TEST_F(AddressBubblesControllerBrowserTest, + SecondPromptWillBeAutoDeclinedWhileFirstIsVisible) { AutofillProfile profile = test::GetFullProfile(); AddressBubblesController::SetUpAndShowSaveOrUpdateAddressBubble( @@ -154,8 +139,8 @@ // This is testing that when a second prompt comes while another prompt is in // progress but not shown, the controller will inform the backend that the first // process is ignored. -TEST_F(AddressBubblesControllerTest, - FirstHiddenPromptWillBeIgnoredWhenSecondPromptArrives) { +IN_PROC_BROWSER_TEST_F(AddressBubblesControllerBrowserTest, + FirstHiddenPromptWillBeIgnoredWhenSecondPromptArrives) { AutofillProfile profile = test::GetFullProfile(); base::MockCallback<AutofillClient::AddressProfileSavePromptCallback> callback;
diff --git a/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller.h b/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller.h index 291caab..c0f4b5dc 100644 --- a/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller.h +++ b/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller.h
@@ -10,8 +10,8 @@ #include "base/memory/weak_ptr.h" #include "base/types/optional_ref.h" +#include "components/autofill/core/browser/foundations/autofill_client.h" #include "components/autofill/core/browser/integrators/autofill_ai/autofill_ai_delegate.h" -#include "components/autofill_ai/core/browser/autofill_ai_client.h" #include "content/public/browser/web_contents.h" namespace autofill {
diff --git a/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.cc b/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.cc index feec165..9e43dd19 100644 --- a/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.cc +++ b/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.cc
@@ -23,7 +23,6 @@ #include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h" #include "components/autofill/core/browser/integrators/autofill_ai/autofill_ai_delegate.h" #include "components/autofill/core/browser/integrators/autofill_ai/autofill_ai_import_utils.h" -#include "components/autofill_ai/core/browser/autofill_ai_client.h" #include "components/strings/grit/components_strings.h" #include "content/public/browser/navigation_handle.h" #include "ui/base/l10n/l10n_util.h"
diff --git a/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.h b/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.h index 68c23539..18e3ddb6 100644 --- a/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.h +++ b/chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller_impl.h
@@ -16,7 +16,6 @@ #include "chrome/browser/ui/autofill/autofill_bubble_controller_base.h" #include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h" #include "components/autofill/core/browser/integrators/autofill_ai/autofill_ai_delegate.h" -#include "components/autofill_ai/core/browser/autofill_ai_client.h" #include "components/optimization_guide/proto/features/common_quality_data.pb.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h"
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index 15ac269d..511f947f 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -157,7 +157,6 @@ #include "components/messages/android/messages_feature.h" #include "components/strings/grit/components_strings.h" #else // !BUILDFLAG(IS_ANDROID) -#include "chrome/browser/autofill_ai/chrome_autofill_ai_client.h" #include "chrome/browser/ui/autofill/autofill_ai/save_or_update_autofill_ai_data_controller.h" #include "chrome/browser/ui/autofill/delete_address_profile_dialog_controller_impl.h" #include "chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.h" @@ -515,14 +514,10 @@ AutofillAiDelegate* ChromeAutofillClient::GetAutofillAiDelegate() { #if !BUILDFLAG(IS_ANDROID) - if (tabs::TabInterface* tab = tabs::TabInterface::MaybeGetFromContents( - web_contents()->GetOutermostWebContents())) { - ChromeAutofillAiClient* client = - tab->GetTabFeatures()->chrome_autofill_ai_client(); - return client ? &client->GetManager() : nullptr; - } -#endif + return &autofill_ai_manager_; +#else return nullptr; +#endif } AutofillAiModelCache* ChromeAutofillClient::GetAutofillAiModelCache() { @@ -1089,6 +1084,12 @@ ChromeAutofillClient::ChromeAutofillClient(content::WebContents* web_contents) : ContentAutofillClient(web_contents), content::WebContentsObserver(web_contents), +#if !BUILDFLAG(IS_ANDROID) + autofill_ai_manager_( + this, + StrikeDatabaseFactory::GetForProfile( + Profile::FromBrowserContext(web_contents->GetBrowserContext()))), +#endif ablation_study_(g_browser_process->local_state()), identity_credential_delegate_(web_contents) { // Initialize StrikeDatabase so its cache will be loaded and ready to use
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h index 798daef..ae5295c 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.h +++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -36,6 +36,7 @@ #include "components/autofill/core/browser/single_field_fillers/single_field_fill_router.h" #include "components/autofill/core/browser/studies/autofill_ablation_study.h" #include "components/autofill/core/browser/ui/payments/card_unmask_prompt_options.h" +#include "components/autofill_ai/core/browser/autofill_ai_manager.h" #include "components/optimization_guide/proto/features/common_quality_data.pb.h" #include "components/signin/public/identity_manager/account_info.h" #include "content/public/browser/visibility.h" @@ -275,6 +276,10 @@ autofill_metrics::FormInteractionsUkmLogger form_interactions_ukm_logger_{ this}; +#if !BUILDFLAG(IS_ANDROID) + autofill_ai::AutofillAiManager autofill_ai_manager_; +#endif + // These members are initialized lazily in their respective getters. // Therefore, do not access the members directly. std::unique_ptr<AutofillCrowdsourcingManager> crowdsourcing_manager_;
diff --git a/chrome/browser/ui/omnibox/omnibox_search_aggregator_browsertest.cc b/chrome/browser/ui/omnibox/omnibox_search_aggregator_browsertest.cc index 657c5002..74b9577 100644 --- a/chrome/browser/ui/omnibox/omnibox_search_aggregator_browsertest.cc +++ b/chrome/browser/ui/omnibox/omnibox_search_aggregator_browsertest.cc
@@ -121,75 +121,6 @@ ] })"); -const std::string kQueryGoodJsonResponse = R"({ - "querySuggestions": [ - { - "suggestion": "John's Demise", - "score": 0.1, - "dataStore": [] - } - ] - })"; - -const std::string kPeopleGoodJsonResponse = R"({ - "peopleSuggestions": [ - { - "suggestion": "john@example.com", - "document": { - "name": "sundar", - "derivedStructData": { - "name": { - "display_name_lower": "john doe", - "familyName": "Doe", - "givenName": "John", - "given_name_lower": "john", - "family_name_lower": "doe", - "displayName": "John Doe", - "userName": "john" - }, - "emails": [ - { - "type": "primary", - "value": "john@example.com" - } - ], - "displayPhoto": { - "url": "https://example.com/image.png" - } - } - }, - "destinationUri": "https://www.example.com/people/john", - "score": 0.8, - "dataStore": "project 1" - } - ] - })"; - -const std::string kContentGoodJsonResponse = R"({ - "contentSuggestions": [ - { - "suggestion": "John's Document", - "contentType": "THIRD_PARTY", - "document": { - "name": "Document 2", - "structData": { - "title": "John's Document", - "uri": "www.example.com" - }, - "derivedStructData": { - "source_type": "jira", - "entity_type": "issue", - "title": "John's Document", - "link": "https://www.example.co.uk" - } - }, - "destinationUri": "https://www.example.com/", - "score": 0.4, - "dataStore": "project2" - } - ] - })"; - } // namespace class OmniboxSearchAggregatorTest : public InProcessBrowserTest { @@ -404,12 +335,13 @@ IN_PROC_BROWSER_TEST_F(OmniboxSearchAggregatorTest, GoodJsonResponseMultipleRequests) { - net::test_server::ControllableHttpResponse search_aggregator_people_response( - embedded_test_server(), kSearchAggregatorPolicySuggestPath); - net::test_server::ControllableHttpResponse search_aggregator_content_response( - embedded_test_server(), kSearchAggregatorPolicySuggestPath); - net::test_server::ControllableHttpResponse search_aggregator_query_response( - embedded_test_server(), kSearchAggregatorPolicySuggestPath); + std::vector<std::unique_ptr<net::test_server::ControllableHttpResponse>> + requests = {}; + for (size_t i = 0; i < 3; ++i) { + requests.push_back( + std::make_unique<net::test_server::ControllableHttpResponse>( + embedded_test_server(), kSearchAggregatorPolicySuggestPath)); + } ASSERT_TRUE(embedded_test_server()->Start()); base::Value policy_value = CreateEnterpriseSearchAggregatorPolicyValue( @@ -428,42 +360,30 @@ input.set_keyword_mode_entry_method(metrics::OmniboxEventProto::TAB); controller()->Start(input); - // Respond to the first SearchAggregator request (1 - query). - search_aggregator_people_response.WaitForRequest(); - EXPECT_EQ(search_aggregator_people_response.http_request()->method, - net::test_server::METHOD_POST); - EXPECT_EQ(search_aggregator_people_response.http_request()->content, - base::StringPrintf(R"({"experimentIds":["%s"],)" - R"("query":"john d","suggestionTypes":[1]})", - kEnterpriseSearchAggregatorExperimentId)); - search_aggregator_people_response.Send(net::HTTP_OK, "application/json", - kQueryGoodJsonResponse); - search_aggregator_people_response.Done(); - - // Respond to the second SearchAggregator request (2 - people). - search_aggregator_content_response.WaitForRequest(); - EXPECT_EQ(search_aggregator_content_response.http_request()->method, - net::test_server::METHOD_POST); - EXPECT_EQ(search_aggregator_content_response.http_request()->content, - base::StringPrintf(R"({"experimentIds":["%s"],)" - R"("query":"john d","suggestionTypes":[2]})", - kEnterpriseSearchAggregatorExperimentId)); - search_aggregator_content_response.Send(net::HTTP_OK, "application/json", - kPeopleGoodJsonResponse); - search_aggregator_content_response.Done(); - - // Respond to the third SearchAggregator request (3,5 - content/Google - // Workspace). - search_aggregator_query_response.WaitForRequest(); - EXPECT_EQ(search_aggregator_query_response.http_request()->method, - net::test_server::METHOD_POST); - EXPECT_EQ(search_aggregator_query_response.http_request()->content, - base::StringPrintf(R"({"experimentIds":["%s"],)" - R"("query":"john d","suggestionTypes":[3,5]})", - kEnterpriseSearchAggregatorExperimentId)); - search_aggregator_query_response.Send(net::HTTP_OK, "application/json", - kContentGoodJsonResponse); - search_aggregator_query_response.Done(); + std::vector<std::string> request_bodies = {}; + for (auto& request : requests) { + request->WaitForRequest(); + EXPECT_EQ(request->http_request()->method, net::test_server::METHOD_POST); + request_bodies.push_back(request->http_request()->content); + } + constexpr char expected_request[] = + R"({"experimentIds":["%s"],)" + R"("query":"john d","suggestionTypes":[%s]})"; + // Expect unordered because there's no guarantee what order the service starts + // the requests. + EXPECT_THAT( + request_bodies, + testing::UnorderedElementsAre( + base::StringPrintf(expected_request, + kEnterpriseSearchAggregatorExperimentId, "1"), + base::StringPrintf(expected_request, + kEnterpriseSearchAggregatorExperimentId, "2"), + base::StringPrintf(expected_request, + kEnterpriseSearchAggregatorExperimentId, "3,5"))); + for (auto& request : requests) { + request->Send(net::HTTP_OK, "application/json", kGoodJsonResponse); + request->Done(); + } // Wait for the autocomplete controller to finish. WaitForAutocompleteDone(browser());
diff --git a/chrome/browser/ui/tabs/public/tab_features.h b/chrome/browser/ui/tabs/public/tab_features.h index 3b2f7f2..432915e 100644 --- a/chrome/browser/ui/tabs/public/tab_features.h +++ b/chrome/browser/ui/tabs/public/tab_features.h
@@ -13,7 +13,6 @@ #include "base/memory/weak_ptr.h" #include "chrome/common/buildflags.h" -class ChromeAutofillAiClient; class FileSystemAccessPageActionController; class FromGWSNavigationAndKeepAliveRequestObserver; class IntentPickerViewPageActionController; @@ -157,10 +156,6 @@ return side_panel_registry_.get(); } - ChromeAutofillAiClient* chrome_autofill_ai_client() { - return chrome_autofill_ai_client_.get(); - } - ReadAnythingSidePanelController* read_anything_side_panel_controller() { return read_anything_side_panel_controller_.get(); } @@ -302,8 +297,6 @@ std::unique_ptr<customize_chrome::SidePanelController> customize_chrome_side_panel_controller_; - std::unique_ptr<ChromeAutofillAiClient> chrome_autofill_ai_client_; - std::unique_ptr<ReadAnythingSidePanelController> read_anything_side_panel_controller_;
diff --git a/chrome/browser/ui/tabs/tab_features.cc b/chrome/browser/ui/tabs/tab_features.cc index fd4e08e..b939072 100644 --- a/chrome/browser/ui/tabs/tab_features.cc +++ b/chrome/browser/ui/tabs/tab_features.cc
@@ -9,7 +9,6 @@ #include "base/feature_list.h" #include "base/memory/ptr_util.h" #include "base/no_destructor.h" -#include "chrome/browser/autofill_ai/chrome_autofill_ai_client.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/browsing_topics/browsing_topics_service_factory.h" #include "chrome/browser/commerce/shopping_service_factory.h" @@ -230,9 +229,6 @@ std::make_unique<permissions::PermissionIndicatorsTabData>( tab.GetContents()); - chrome_autofill_ai_client_ = - ChromeAutofillAiClient::MaybeCreateForWebContents(tab.GetContents()); - pinned_translate_action_listener_ = std::make_unique<PinnedTranslateActionListener>(&tab); @@ -403,11 +399,6 @@ side_panel_registry_->Deregister( SidePanelEntry::Key(SidePanelEntry::Id::kAboutThisSite)); - if (chrome_autofill_ai_client_) { - chrome_autofill_ai_client_ = - ChromeAutofillAiClient::MaybeCreateForWebContents(new_contents); - } - if (privacy_sandbox_tab_observer_) { privacy_sandbox_tab_observer_.reset(); privacy_sandbox_tab_observer_ =
diff --git a/chrome/browser/ui/views/autofill/autofill_ai/save_or_update_autofill_ai_data_bubble_view_unittest.cc b/chrome/browser/ui/views/autofill/autofill_ai/save_or_update_autofill_ai_data_bubble_view_unittest.cc index 6c0fe87..dc0feb5d 100644 --- a/chrome/browser/ui/views/autofill/autofill_ai/save_or_update_autofill_ai_data_bubble_view_unittest.cc +++ b/chrome/browser/ui/views/autofill/autofill_ai/save_or_update_autofill_ai_data_bubble_view_unittest.cc
@@ -13,7 +13,6 @@ #include "chrome/test/base/testing_profile.h" #include "chrome/test/views/chrome_views_test_base.h" #include "components/autofill/core/browser/test_utils/autofill_test_utils.h" -#include "components/autofill_ai/core/browser/autofill_ai_client.h" #include "components/optimization_guide/proto/features/common_quality_data.pb.h" #include "content/public/browser/web_contents.h" #include "content/public/test/test_renderer_host.h"
diff --git a/chrome/browser/ui/views/autofill/popup/popup_cell_utils.cc b/chrome/browser/ui/views/autofill/popup/popup_cell_utils.cc index 8ceba7c..f46f55a3 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_cell_utils.cc +++ b/chrome/browser/ui/views/autofill/popup/popup_cell_utils.cc
@@ -35,6 +35,7 @@ #include "components/autofill/core/browser/suggestions/suggestion_type.h" #include "components/autofill/core/browser/ui/autofill_resource_utils.h" #include "components/omnibox/browser/vector_icons.h" +#include "components/password_manager/core/common/password_manager_constants.h" #include "components/strings/grit/components_strings.h" #include "components/vector_icons/vector_icons.h" #include "ui/base/l10n/l10n_util.h" @@ -71,6 +72,7 @@ // The default icon size used in the suggestion drop down. constexpr int kIconSize = 16; +constexpr int kRecoveryPasswordIconSize = 20; constexpr int kChromeRefreshIconSize = 20; #if BUILDFLAG(GOOGLE_CHROME_BRANDING) constexpr int kGooglePayLogoWidth = 40; @@ -106,6 +108,10 @@ // The text color of the letter monochrome icons. constexpr SkColor kMonochromeIconTextColor = SkColorSetARGB(255, 71, 71, 71); +constexpr auto kSuggestionTypesWithDoubleHeight = + DenseSet<SuggestionType>({SuggestionType::kBackupPasswordEntry, + SuggestionType::kTroubleSigningInEntry}); + // Returns the name of the network for payment method icons, empty string // otherwise. std::u16string GetIconAccessibleName(Suggestion::Icon icon) { @@ -214,7 +220,8 @@ std::unique_ptr<views::Label> main_text_label, std::vector<std::unique_ptr<views::View>> minor_text_labels, std::unique_ptr<views::Label> description_label, - std::vector<std::unique_ptr<views::View>> subtext_views) { + std::vector<std::unique_ptr<views::View>> subtext_views, + bool align_description_label_to_right) { const bool has_two_columns = !!description_label; auto table = views::Builder<views::TableLayoutView>() @@ -224,12 +231,17 @@ views::TableLayout::ColumnSize::kUsePreferred, 0, 0) .Build(); if (has_two_columns) { + const views::LayoutAlignment kHorizontalAlignment = + align_description_label_to_right ? views::LayoutAlignment::kEnd + : views::LayoutAlignment::kStart; + const float kHorizontalResize = align_description_label_to_right + ? 1.0f + : views::TableLayout::kFixedSize; const int kDividerSpacing = ChromeLayoutProvider::Get()->GetDistanceMetric( DISTANCE_RELATED_LABEL_HORIZONTAL_LIST); table->AddPaddingColumn(views::TableLayout::kFixedSize, kDividerSpacing); - table->AddColumn(views::LayoutAlignment::kStart, - views::LayoutAlignment::kStretch, - views::TableLayout::kFixedSize, + table->AddColumn(kHorizontalAlignment, views::LayoutAlignment::kStretch, + kHorizontalResize, views::TableLayout::ColumnSize::kUsePreferred, 0, 0); } @@ -360,10 +372,10 @@ #endif case Suggestion::Icon::kQuestionMark: return ImageModelFromVectorIcon(vector_icons::kHelpOutlineIcon, - kIconSize); + kRecoveryPasswordIconSize); case Suggestion::Icon::kRecoveryPassword: return ImageModelFromVectorIcon(vector_icons::kHistoryChromeRefreshIcon, - kIconSize); + kRecoveryPasswordIconSize); case Suggestion::Icon::kSaveAndFill: return ImageModelFromVectorIcon(kCreditCardIcon, kIconSize); case Suggestion::Icon::kSettings: @@ -548,7 +560,8 @@ PopupRowContentView& content_view) { // Adjust the row height based on the number of subtexts (lines of text). int row_height = views::MenuConfig::instance().touchable_menu_height; - if (!subtext_views.empty()) { + if (!subtext_views.empty() || + kSuggestionTypesWithDoubleHeight.contains(suggestion.type)) { row_height += kAutofillPopupAdditionalDoubleRowHeight; } content_view.SetMinimumCrossAxisSize(row_height); @@ -588,7 +601,8 @@ content_view.SetFlexForView( content_view.AddChildView(CreateSuggestionContentTable( std::move(main_text_label), std::move(minor_text_labels), - std::move(description_label), std::move(subtext_views))), + std::move(description_label), std::move(subtext_views), + suggestion.additional_label_alignment_right)), 1); // The trailing icon.
diff --git a/chrome/browser/ui/views/autofill/popup/popup_row_factory_utils.cc b/chrome/browser/ui/views/autofill/popup/popup_row_factory_utils.cc index 5573389..7e29b29 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_row_factory_utils.cc +++ b/chrome/browser/ui/views/autofill/popup/popup_row_factory_utils.cc
@@ -297,7 +297,8 @@ } main_text_label->SetEnabled(!suggestion.is_loading); - if (suggestion.type == SuggestionType::kPendingStateSignin) { + if (suggestion.type == SuggestionType::kPendingStateSignin || + suggestion.type == SuggestionType::kFreeformFooter) { main_text_label->SetMultiLine(true); main_text_label->SetHorizontalAlignment(gfx::ALIGN_TO_HEAD); } @@ -415,7 +416,9 @@ } std::vector<std::unique_ptr<views::View>> subtext_views; - subtext_views.push_back(CreatePasswordSubtextView(suggestion)); + if (!suggestion.labels.empty()) { + subtext_views.push_back(CreatePasswordSubtextView(suggestion)); + } popup_cell_utils::AddSuggestionContentToView( suggestion, std::move(main_text_label), CreateMinorTextLabels(suggestion), CreatePasswordDescriptionLabel(suggestion), std::move(subtext_views), @@ -679,6 +682,8 @@ case SuggestionType::kInsecureContextPaymentDisabledMessage: NOTREACHED(); case SuggestionType::kPasswordEntry: + case SuggestionType::kBackupPasswordEntry: + case SuggestionType::kTroubleSigningInEntry: case SuggestionType::kAccountStoragePasswordEntry: return std::make_unique<PopupRowView>( a11y_selection_delegate, selection_delegate, controller, line_number,
diff --git a/chrome/browser/ui/views/autofill/popup/popup_row_factory_utils_browsertest.cc b/chrome/browser/ui/views/autofill/popup/popup_row_factory_utils_browsertest.cc index a154a82..45ad15c8 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_row_factory_utils_browsertest.cc +++ b/chrome/browser/ui/views/autofill/popup/popup_row_factory_utils_browsertest.cc
@@ -49,6 +49,39 @@ return suggestion; } +Suggestion CreateTryThisRecoverySuggestion(const std::u16string& main_text) { + Suggestion suggestion(main_text, SuggestionType::kBackupPasswordEntry); + suggestion.icon = Suggestion::Icon::kRecoveryPassword; + suggestion.additional_label = u"******"; + suggestion.additional_label_alignment_right = true; + return suggestion; +} + +Suggestion CreateTroubleSigninInSuggestion(const std::u16string& main_text) { + Suggestion suggestion(main_text, SuggestionType::kBackupPasswordEntry); + suggestion.icon = Suggestion::Icon::kQuestionMark; + suggestion.main_text.is_primary = Suggestion::Text::IsPrimary(false); + return suggestion; +} + +Suggestion CreateBackupPasswordSuggestion(const std::u16string& main_text) { + Suggestion suggestion(main_text, SuggestionType::kBackupPasswordEntry); + suggestion.icon = Suggestion::Icon::kRecoveryPassword; + suggestion.labels = {{Suggestion::Text(u"*****")}}; + suggestion.additional_label = u"Recovery"; + return suggestion; +} + +Suggestion CreateFreeformFooter() { + const std::u16string kMainText = + u"You recently changed a password found in a public data breach. In case " + "of trouble, Google Password Manager can help you sign in."; + Suggestion suggestion(kMainText, SuggestionType::kFreeformFooter); + suggestion.acceptability = + Suggestion::Acceptability::kUnacceptableWithDeactivatedStyle; + return suggestion; +} + Suggestion CreateSuggestionWithChildren(const std::u16string& main_text, std::vector<Suggestion> children) { Suggestion suggestion(main_text, SuggestionType::kAddressEntry); @@ -65,6 +98,9 @@ Suggestion::Icon::kLocation, SuggestionType::kAddressEntry), CreatePasswordSuggestion(u"Password_entry"), + CreateTryThisRecoverySuggestion(u"Try_this_recovery_password"), + CreateTroubleSigninInSuggestion(u"Trouble_signing_in_entry"), + CreateBackupPasswordSuggestion(u"Backup_password_entry"), Suggestion("Autofill_options", minor_texts, "label", @@ -203,13 +239,7 @@ user_education::NewBadgeController::DisableNewBadgesForTesting(); }; -// TODO(crbug.com/40261456): Re-enable failing test on Windows. -#if BUILDFLAG(IS_WIN) -#define MAYBE_SuggestionRowUiTest DISABLED_SuggestionRowUiTest -#else -#define MAYBE_SuggestionRowUiTest SuggestionRowUiTest -#endif -IN_PROC_BROWSER_TEST_P(CreatePopupRowViewTest, MAYBE_SuggestionRowUiTest) { +IN_PROC_BROWSER_TEST_P(CreatePopupRowViewTest, SuggestionRowUiTest) { CreateRowView(std::get<Suggestion>(GetParam()), std::get<std::optional<PopupRowView::CellType>>(GetParam())); ShowAndVerifyUi(); @@ -246,6 +276,13 @@ ShowAndVerifyUi(); } +IN_PROC_BROWSER_TEST_F(CreatePopupRowViewTest, FreeformFooter) { + CreateRowView(CreateFreeformFooter(), + /*selected_cell=*/std::nullopt, + /*filter_match=*/std::nullopt); + ShowAndVerifyUi(); +} + IN_PROC_BROWSER_TEST_F(CreatePopupRowViewTest, PasswordWithFaviconPlaceholder) { Suggestion suggestion = CreatePasswordSuggestion(u"Password_entry"); suggestion.custom_icon =
diff --git a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc index 1dd8ec1..07e57aa 100644 --- a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc
@@ -21,6 +21,7 @@ #include "chrome/browser/ui/views/page_info/page_info_bubble_view.h" #include "chrome/browser/ui/views/picture_in_picture/picture_in_picture_bounds_change_animation.h" #include "chrome/browser/ui/views/picture_in_picture/picture_in_picture_tucker.h" +#include "chrome/common/url_constants.h" #include "chrome/grit/generated_resources.h" #include "components/omnibox/browser/location_bar_model_impl.h" #include "components/vector_icons/vector_icons.h" @@ -488,13 +489,18 @@ ? gfx::ELIDE_TAIL : gfx::ELIDE_HEAD; - // Similarly for extension URLs, the tail is more important to elide. + // Similarly for extension URLs and isolated-app URLs, the tail is more + // important to elide. #if BUILDFLAG(ENABLE_EXTENSIONS) - if (location_bar_model_->GetURL().SchemeIs(extensions::kExtensionScheme)) { + if (location_bar_model_->GetURL().SchemeIs(extensions::kExtensionScheme) || + location_bar_model_->GetURL().SchemeIs(chrome::kIsolatedAppScheme)) { elide_behavior = gfx::ELIDE_TAIL; } #endif // BUILDFLAG(ENABLE_EXTENSIONS) + // TODO(crbug.com/424715850): use IWA app name in title (plus why registrar + // based on browser_view->GetProfile doesn't know about the app). + // Creates the window title. top_bar_container_view_->AddChildView( views::Builder<views::Label>()
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view_browsertest.cc b/chrome/browser/ui/views/frame/webui_tab_strip_container_view_browsertest.cc new file mode 100644 index 0000000..a395a1a3 --- /dev/null +++ b/chrome/browser/ui/views/frame/webui_tab_strip_container_view_browsertest.cc
@@ -0,0 +1,134 @@ +// Copyright 2019 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/views/frame/webui_tab_strip_container_view.h" + +#include <utility> + +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/ui_features.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/toolbar/toolbar_view.h" +#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "content/public/test/browser_test.h" +#include "ui/base/pointer/touch_ui_controller.h" + +class WebUITabStripContainerViewBrowserTest : public InProcessBrowserTest { + public: + WebUITabStripContainerViewBrowserTest() { + feature_override_.InitAndEnableFeature(features::kWebUITabStrip); + } + + ~WebUITabStripContainerViewBrowserTest() override = default; + + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + browser_view_ = BrowserView::GetBrowserViewForBrowser(browser()); + } + + void TearDownOnMainThread() override { + browser_view_ = nullptr; + InProcessBrowserTest::TearDownOnMainThread(); + } + + BrowserView* browser_view() { return browser_view_; } + + private: + base::test::ScopedFeatureList feature_override_; + ui::TouchUiController::TouchUiScoperForTesting touch_ui_scoper_{true}; + + protected: + raw_ptr<BrowserView> browser_view_ = nullptr; +}; + +IN_PROC_BROWSER_TEST_F(WebUITabStripContainerViewBrowserTest, + TabStripStartsClosed) { + EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip( + browser_view()->browser())); + ASSERT_NE(nullptr, browser_view()->webui_tab_strip()); + EXPECT_FALSE(browser_view()->webui_tab_strip()->GetVisible()); +} + +IN_PROC_BROWSER_TEST_F(WebUITabStripContainerViewBrowserTest, + TouchModeTransition) { + EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip( + browser_view()->browser())); + EXPECT_NE(nullptr, browser_view()->webui_tab_strip()); + EXPECT_FALSE(browser_view()->GetTabStripVisible()); + + ui::TouchUiController::TouchUiScoperForTesting disable_touch_mode(false); + EXPECT_FALSE(WebUITabStripContainerView::UseTouchableTabStrip( + browser_view()->browser())); + EXPECT_TRUE(browser_view()->GetTabStripVisible()); + + ui::TouchUiController::TouchUiScoperForTesting reenable_touch_mode(true); + EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip( + browser_view()->browser())); + EXPECT_FALSE(browser_view()->GetTabStripVisible()); + ASSERT_NE(nullptr, browser_view()->webui_tab_strip()); +} + +IN_PROC_BROWSER_TEST_F(WebUITabStripContainerViewBrowserTest, + ButtonsPresentInToolbar) { + ASSERT_NE(nullptr, browser_view()->toolbar()->new_tab_button_for_testing()); + EXPECT_TRUE(browser_view()->toolbar()->Contains( + browser_view()->toolbar()->new_tab_button_for_testing())); + EXPECT_TRUE( + browser_view()->toolbar()->new_tab_button_for_testing()->GetVisible()); + ASSERT_NE(nullptr, browser_view()->webui_tab_strip()->tab_counter()); + EXPECT_TRUE(browser_view()->toolbar()->Contains( + browser_view()->webui_tab_strip()->tab_counter())); +} + +IN_PROC_BROWSER_TEST_F(WebUITabStripContainerViewBrowserTest, + CloseContainerOnRendererCrash) { + auto* webui_tab_strip = browser_view()->webui_tab_strip(); + webui_tab_strip->PrimaryMainFrameRenderProcessGone( + base::TerminationStatus::TERMINATION_STATUS_PROCESS_CRASHED); + EXPECT_EQ(false, webui_tab_strip->GetVisible()); + webui_tab_strip->SetVisibleForTesting(true); + EXPECT_EQ(true, webui_tab_strip->GetVisible()); +} + +class WebUITabStripDevToolsBrowserTest + : public WebUITabStripContainerViewBrowserTest { + public: + WebUITabStripDevToolsBrowserTest() = default; + ~WebUITabStripDevToolsBrowserTest() override = default; + + void SetUpOnMainThread() override { + WebUITabStripContainerViewBrowserTest::SetUpOnMainThread(); + Browser::CreateParams params = + Browser::CreateParams::CreateForDevTools(browser()->profile()); + devtools_browser_ = Browser::Create(params); + } + + void TearDownOnMainThread() override { + devtools_browser_ = nullptr; + WebUITabStripContainerViewBrowserTest::TearDownOnMainThread(); + } + + protected: + raw_ptr<Browser> devtools_browser_ = nullptr; +}; + +// Regression test for crbug.com/1010247, crbug.com/1090208. +IN_PROC_BROWSER_TEST_F(WebUITabStripDevToolsBrowserTest, + DevToolsWindowHasNoTabStrip) { + BrowserView* devtools_browser_view = + BrowserView::GetBrowserViewForBrowser(devtools_browser_); + ASSERT_TRUE(devtools_browser_view); + + EXPECT_FALSE( + WebUITabStripContainerView::UseTouchableTabStrip(devtools_browser_)); + EXPECT_EQ(nullptr, devtools_browser_view->webui_tab_strip()); + + ui::TouchUiController::TouchUiScoperForTesting disable_touch_mode(false); + ui::TouchUiController::TouchUiScoperForTesting reenable_touch_mode(true); + EXPECT_EQ(nullptr, devtools_browser_view->webui_tab_strip()); +} + +// TODO(crbug.com/40124617): add coverage of open and close gestures.
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view_unittest.cc b/chrome/browser/ui/views/frame/webui_tab_strip_container_view_unittest.cc deleted file mode 100644 index 8dc737e..0000000 --- a/chrome/browser/ui/views/frame/webui_tab_strip_container_view_unittest.cc +++ /dev/null
@@ -1,104 +0,0 @@ -// Copyright 2019 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/views/frame/webui_tab_strip_container_view.h" - -#include <utility> - -#include "base/functional/bind.h" -#include "base/test/scoped_feature_list.h" -#include "chrome/browser/extensions/extension_tab_util.h" -#include "chrome/browser/feature_engagement/tracker_factory.h" -#include "chrome/browser/ui/browser_commands.h" -#include "chrome/browser/ui/ui_features.h" -#include "chrome/browser/ui/views/frame/browser_view.h" -#include "chrome/browser/ui/views/frame/test_with_browser_view.h" -#include "chrome/browser/ui/views/toolbar/toolbar_view.h" -#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui.h" -#include "chrome/test/base/test_browser_window.h" -#include "components/feature_engagement/public/feature_constants.h" -#include "components/feature_engagement/test/mock_tracker.h" -#include "content/public/common/drop_data.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "ui/base/pointer/touch_ui_controller.h" - -class WebUITabStripContainerViewTest : public TestWithBrowserView { - public: - template <typename... Args> - explicit WebUITabStripContainerViewTest(Args... args) - : TestWithBrowserView(args...) { - feature_override_.InitAndEnableFeature(features::kWebUITabStrip); - } - - ~WebUITabStripContainerViewTest() override = default; - - private: - base::test::ScopedFeatureList feature_override_; - ui::TouchUiController::TouchUiScoperForTesting touch_ui_scoper_{true}; -}; - -TEST_F(WebUITabStripContainerViewTest, TabStripStartsClosed) { - EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip( - browser_view()->browser())); - ASSERT_NE(nullptr, browser_view()->webui_tab_strip()); - EXPECT_FALSE(browser_view()->webui_tab_strip()->GetVisible()); -} - -TEST_F(WebUITabStripContainerViewTest, TouchModeTransition) { - EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip( - browser_view()->browser())); - EXPECT_NE(nullptr, browser_view()->webui_tab_strip()); - EXPECT_FALSE(browser_view()->GetTabStripVisible()); - - ui::TouchUiController::TouchUiScoperForTesting disable_touch_mode(false); - EXPECT_FALSE(WebUITabStripContainerView::UseTouchableTabStrip( - browser_view()->browser())); - EXPECT_TRUE(browser_view()->GetTabStripVisible()); - - ui::TouchUiController::TouchUiScoperForTesting reenable_touch_mode(true); - EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip( - browser_view()->browser())); - EXPECT_FALSE(browser_view()->GetTabStripVisible()); - ASSERT_NE(nullptr, browser_view()->webui_tab_strip()); -} - -TEST_F(WebUITabStripContainerViewTest, ButtonsPresentInToolbar) { - ASSERT_NE(nullptr, browser_view()->toolbar()->new_tab_button_for_testing()); - EXPECT_TRUE(browser_view()->toolbar()->Contains( - browser_view()->toolbar()->new_tab_button_for_testing())); - EXPECT_TRUE( - browser_view()->toolbar()->new_tab_button_for_testing()->GetVisible()); - ASSERT_NE(nullptr, browser_view()->webui_tab_strip()->tab_counter()); - EXPECT_TRUE(browser_view()->toolbar()->Contains( - browser_view()->webui_tab_strip()->tab_counter())); -} - -TEST_F(WebUITabStripContainerViewTest, CloseContainerOnRendererCrash) { - auto* webui_tab_strip = browser_view()->webui_tab_strip(); - webui_tab_strip->PrimaryMainFrameRenderProcessGone( - base::TerminationStatus::TERMINATION_STATUS_PROCESS_CRASHED); - EXPECT_EQ(false, webui_tab_strip->GetVisible()); - webui_tab_strip->SetVisibleForTesting(true); - EXPECT_EQ(true, webui_tab_strip->GetVisible()); -} - -class WebUITabStripDevToolsTest : public WebUITabStripContainerViewTest { - public: - WebUITabStripDevToolsTest() - : WebUITabStripContainerViewTest(Browser::TYPE_DEVTOOLS) {} - ~WebUITabStripDevToolsTest() override = default; -}; - -// Regression test for crbug.com/1010247, crbug.com/1090208. -TEST_F(WebUITabStripDevToolsTest, DevToolsWindowHasNoTabStrip) { - EXPECT_FALSE(WebUITabStripContainerView::UseTouchableTabStrip( - browser_view()->browser())); - EXPECT_EQ(nullptr, browser_view()->webui_tab_strip()); - - ui::TouchUiController::TouchUiScoperForTesting disable_touch_mode(false); - ui::TouchUiController::TouchUiScoperForTesting reenable_touch_mode(true); - EXPECT_EQ(nullptr, browser_view()->webui_tab_strip()); -} - -// TODO(crbug.com/40124617): add coverage of open and close gestures.
diff --git a/chrome/browser/ui/views/passwords/password_change/password_change_ui_browsertest.cc b/chrome/browser/ui/views/passwords/password_change/password_change_ui_browsertest.cc index a566faee..8b7d6ee7 100644 --- a/chrome/browser/ui/views/passwords/password_change/password_change_ui_browsertest.cc +++ b/chrome/browser/ui/views/passwords/password_change/password_change_ui_browsertest.cc
@@ -3,6 +3,9 @@ // found in the LICENSE file. #include "chrome/browser/affiliations/affiliation_service_factory.h" +#include "chrome/browser/optimization_guide/mock_optimization_guide_keyed_service.h" +#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" +#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" #include "chrome/browser/password_manager/chrome_password_change_service.h" #include "chrome/browser/password_manager/password_change_service_factory.h" #include "chrome/browser/ui/browser.h" @@ -17,14 +20,23 @@ #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" -using affiliations::AffiliationService; -using affiliations::MockAffiliationService; - namespace { + +using ::affiliations::AffiliationService; +using ::affiliations::MockAffiliationService; +using ::testing::NiceMock; +using ::testing::Return; + std::unique_ptr<KeyedService> CreateTestAffiliationService( content::BrowserContext* context) { - return std::make_unique<testing::NiceMock<MockAffiliationService>>(); + return std::make_unique<NiceMock<MockAffiliationService>>(); } + +std::unique_ptr<KeyedService> CreateMockOptimizationService( + content::BrowserContext* context) { + return std::make_unique<NiceMock<MockOptimizationGuideKeyedService>>(); +} + } // namespace class PasswordChangeUiBrowserTest : public DialogBrowserTest { @@ -37,6 +49,10 @@ AffiliationServiceFactory::GetInstance()->SetTestingFactory( context, base::BindRepeating(&CreateTestAffiliationService)); + OptimizationGuideKeyedServiceFactory::GetInstance() + ->SetTestingFactory( + context, + base::BindRepeating(&CreateMockOptimizationService)); })); } @@ -45,32 +61,36 @@ AffiliationServiceFactory::GetForProfile(browser()->profile())); } + MockOptimizationGuideKeyedService* mock_optimization_guide_keyed_service() { + return static_cast<MockOptimizationGuideKeyedService*>( + OptimizationGuideKeyedServiceFactory::GetForProfile( + browser()->profile())); + } + private: void ShowUi(const std::string& name) override { GURL main_url = GURL("https://example.com/"); GURL password_change_url = GURL("https://example.com/password"); ON_CALL(*affiliation_service(), GetChangePasswordURL(main_url)) - .WillByDefault(testing::Return(password_change_url)); - content::WebContents* web_contents = - browser()->tab_strip_model()->GetActiveWebContents(); - if (StartsWith(name, "PrivacyNotice", base::CompareCase::SENSITIVE)) { - password_change_service()->OfferPasswordChangeUi( - main_url, u"test", u"password", web_contents); - password_change_service() - ->GetPasswordChangeDelegate(web_contents) - ->StartPasswordChangeFlow(); - } else if (StartsWith(name, "LeakBubble", base::CompareCase::SENSITIVE)) { - auto* controller = - ManagePasswordsUIController::FromWebContents(web_contents); - controller->OnCredentialLeak(password_manager::LeakedPasswordDetails( - password_manager::CreateLeakType( - password_manager::IsSaved(true), - password_manager::IsReused(false), - password_manager::IsSyncing(true), - password_manager::HasChangePasswordUrl(true)), - GURL("https://example.com/"), u"username", u"password", - /*in_account_store=*/false)); + .WillByDefault(Return(password_change_url)); + if (StartsWith(name, "LeakBubble", base::CompareCase::SENSITIVE)) { + ON_CALL(*mock_optimization_guide_keyed_service(), + ShouldFeatureBeCurrentlyEnabledForUser( + optimization_guide::UserVisibleFeatureKey:: + kPasswordChangeSubmission)) + .WillByDefault(Return(true)); } + + ManagePasswordsUIController::FromWebContents( + browser()->tab_strip_model()->GetActiveWebContents()) + ->OnCredentialLeak(password_manager::LeakedPasswordDetails( + password_manager::CreateLeakType( + password_manager::IsSaved(true), + password_manager::IsReused(false), + password_manager::IsSyncing(true), + password_manager::HasChangePasswordUrl(true)), + GURL("https://example.com/"), u"username", u"password", + /*in_account_store=*/false)); } ChromePasswordChangeService* password_change_service() {
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view.cc b/chrome/browser/ui/views/profiles/profile_menu_view.cc index f07ef740..a294ecc7 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view.cc
@@ -78,6 +78,7 @@ #include "components/signin/public/identity_manager/account_info.h" #include "components/signin/public/identity_manager/primary_account_mutator.h" #include "components/strings/grit/components_strings.h" +#include "components/sync/service/sync_service.h" #include "components/vector_icons/vector_icons.h" #include "net/base/url_util.h" #include "ui/base/l10n/l10n_util.h"
diff --git a/chrome/browser/ui/web_applications/navigation_capturing_process.cc b/chrome/browser/ui/web_applications/navigation_capturing_process.cc index b9674c6de..e7aea7a7 100644 --- a/chrome/browser/ui/web_applications/navigation_capturing_process.cc +++ b/chrome/browser/ui/web_applications/navigation_capturing_process.cc
@@ -690,9 +690,10 @@ NavigationCapturingInitialResult::kNavigationCanceled; return CancelInitialNavigation(); } - // App popups are handled in the switch statement in + // App popups and picture-in-picture are handled in the switch statement in // `GetBrowserAndTabForDisposition()`. - if (disposition_ == WindowOpenDisposition::NEW_POPUP) { + if (disposition_ == WindowOpenDisposition::NEW_POPUP || + disposition_ == WindowOpenDisposition::NEW_PICTURE_IN_PICTURE) { return CapturingDisabled(); }
diff --git a/chrome/browser/ui/webauthn/sheet_models.cc b/chrome/browser/ui/webauthn/sheet_models.cc index 27d6cccb..5f828ed1 100644 --- a/chrome/browser/ui/webauthn/sheet_models.cc +++ b/chrome/browser/ui/webauthn/sheet_models.cc
@@ -2163,7 +2163,9 @@ CombinedSelectorSheetModel::CombinedSelectorSheetModel( AuthenticatorRequestDialogModel* dialog_model) : AuthenticatorSheetModelBase(dialog_model, - OtherMechanismButtonVisibility::kHidden) {} + OtherMechanismButtonVisibility::kHidden) { + webauthn::user_actions::RecordCombinedSelectorShown(); +} CombinedSelectorSheetModel::SelectionStatus CombinedSelectorSheetModel::GetSelectionStatus(size_t index) const { @@ -2217,5 +2219,6 @@ void CombinedSelectorSheetModel::OnAccept() { const auto& mech = dialog_model()->mechanisms.at(selection_index_); + webauthn::user_actions::RecordMechanismClick(mech); mech.callback.Run(); }
diff --git a/chrome/browser/ui/webauthn/user_actions.cc b/chrome/browser/ui/webauthn/user_actions.cc index 91fdae3c..5a8cf0f 100644 --- a/chrome/browser/ui/webauthn/user_actions.cc +++ b/chrome/browser/ui/webauthn/user_actions.cc
@@ -37,6 +37,7 @@ constexpr std::string_view kICloudOnly = "ICloudOnly"; constexpr std::string_view kWinOnly = "WinOnly"; constexpr std::string_view kProfileOnly = "ProfileOnly"; +constexpr std::string_view kPasswordOnly = "PasswordOnly"; constexpr std::string_view kOthers = "Others"; @@ -45,6 +46,7 @@ kICloud, kWindows, kProfile, + kPassword, kOther, }; @@ -64,6 +66,8 @@ case AuthenticatorType::kOther: return AuthenticatorCategory::kOther; } + } else if (std::holds_alternative<Mechanism::Password>(mechanism.type)) { + return AuthenticatorCategory::kPassword; } else if (std::holds_alternative<Mechanism::Enclave>(mechanism.type)) { return AuthenticatorCategory::kGpm; } else if (std::holds_alternative<Mechanism::WindowsAPI>(mechanism.type)) { @@ -97,6 +101,7 @@ case AuthenticatorCategory::kWindows: has_win = true; break; + case AuthenticatorCategory::kPassword: case AuthenticatorCategory::kOther: break; } @@ -167,6 +172,7 @@ case AuthenticatorCategory::kWindows: metric_to_emit = kWinOnly; break; + case AuthenticatorCategory::kPassword: case AuthenticatorCategory::kOther: break; } @@ -179,6 +185,11 @@ } } +void RecordCombinedSelectorShown() { + base::RecordAction( + base::UserMetricsAction("WebAuthn.GetAssertion.CombinedSelectorShown")); +} + void RecordHybridAndSecurityKeyDialogShown( device::FidoRequestType request_type) { switch (request_type) { @@ -221,6 +232,9 @@ case AuthenticatorCategory::kWindows: metric_to_emit = kWinOnly; break; + case AuthenticatorCategory::kPassword: + metric_to_emit = kPasswordOnly; + break; case AuthenticatorCategory::kOther: metric_to_emit = kOthers; break;
diff --git a/chrome/browser/ui/webauthn/user_actions.h b/chrome/browser/ui/webauthn/user_actions.h index 1650c7f..d403da0 100644 --- a/chrome/browser/ui/webauthn/user_actions.h +++ b/chrome/browser/ui/webauthn/user_actions.h
@@ -24,6 +24,10 @@ void RecordPriorityOptionShown( const AuthenticatorRequestDialogModel::Mechanism& mechanism); +// Emits when the combined selector is shown. This is used for get() requests +// with mediation "immediate". +void RecordCombinedSelectorShown(); + void RecordHybridAndSecurityKeyDialogShown( device::FidoRequestType request_type); void RecordSecurityKeyDialogShown(device::FidoRequestType request_type);
diff --git a/chrome/browser/ui/webui/ash/login/l10n_util.cc b/chrome/browser/ui/webui/ash/login/l10n_util.cc index a900e95..d70e58d 100644 --- a/chrome/browser/ui/webui/ash/login/l10n_util.cc +++ b/chrome/browser/ui/webui/ash/login/l10n_util.cc
@@ -161,12 +161,13 @@ // Language is supported. No need to replace continue; } - std::string resolved_locale; - if (!l10n_util::CheckAndResolveLocale(language_id, &resolved_locale)) { + const std::optional<std::string> resolved_locale = + l10n_util::CheckAndResolveLocale(language_id); + if (!resolved_locale) { continue; } - if (!base::Contains(base_language_codes, resolved_locale)) { + if (!base::Contains(base_language_codes, *resolved_locale)) { // Resolved locale is not supported. continue; } @@ -337,8 +338,9 @@ // "selected" only if loaded_locale is a backup for "requested_locale". std::string CalculateSelectedLanguage(const std::string& requested_locale, const std::string& loaded_locale) { - std::string resolved_locale; - if (!l10n_util::CheckAndResolveLocale(requested_locale, &resolved_locale)) { + const std::optional<std::string> resolved_locale = + l10n_util::CheckAndResolveLocale(requested_locale); + if (!resolved_locale) { return loaded_locale; }
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc index 7eacd848..4b495c2 100644 --- a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc +++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
@@ -936,6 +936,9 @@ // Always return not allowed immediate in incognito. if (profile()->IsOffTheRecord()) { + base::UmaHistogramEnumeration( + "WebAuthentication.GetAssertion.Immediate.RejectionReason", + content::ImmediateMediationRejectionReason::kIncognito); return true; } @@ -945,11 +948,17 @@ if (!rate_limiter->IsRequestAllowed(origin)) { FIDO_LOG(ERROR) << "Immediate request rate limit exceeded for the origin."; + base::UmaHistogramEnumeration( + "WebAuthentication.GetAssertion.Immediate.RejectionReason", + content::ImmediateMediationRejectionReason::kRateLimited); return true; } } if (data.recognized_credentials.size() + passwords.size() == 0) { + base::UmaHistogramEnumeration( + "WebAuthentication.GetAssertion.Immediate.RejectionReason", + content::ImmediateMediationRejectionReason::kNoCredentials); return true; }
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt index df3cb591..c668686 100644 --- a/chrome/build/android-arm32.pgo.txt +++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@ -chrome-android32-main-1750053232-d5e827b0aae26bd92cef8256c29d0eec51b348e6-1e7bd3c1484bb4a9e8c3ff5e58bcfe93f4fe86ba.profdata +chrome-android32-main-1750075037-9fdd93ded420c6659efa2be98a33e5db289a50ae-e4f8e195a8345123a44875816a9e4f0d6e81cc76.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt index e7afea96..69dd992 100644 --- a/chrome/build/android-arm64.pgo.txt +++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@ -chrome-android64-main-1750059333-20e55cfa5577ef42522c4973ab6147afc1acf57c-2dde65da9b24ed2fcf986f8ce3ab6aaa5c0f0da5.profdata +chrome-android64-main-1750081143-02a1187a76c1b51afe472fba8e61184aa7e931bc-e8210b0c49f70985863715d21f6b080ce7a9960a.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 61adb2c..daf040a 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1750053232-9965326834ecf9c33e3fb654f094cd1899a47b64-1e7bd3c1484bb4a9e8c3ff5e58bcfe93f4fe86ba.profdata +chrome-linux-main-1750075037-e55f3c206df4b458ef691b51f69dff8d5c48e678-e4f8e195a8345123a44875816a9e4f0d6e81cc76.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 63d0154f..287de5a 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1750060693-c2a26aec9aa22aefec7d6151373d8d8989dee0cb-8d8a660571fbfbc6989167053297f9d8f84aa315.profdata +chrome-mac-arm-main-1750082360-981f89a10895f9029b8453d757e8e2c883b21ed9-c84d5761297ba5c1fd1c78c3556878e2d5ac8bbb.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index d62823999..b695b55 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1750053232-55f1879cb103295582b4ad7a15ac82753f013e00-1e7bd3c1484bb4a9e8c3ff5e58bcfe93f4fe86ba.profdata +chrome-mac-main-1750075037-192dbee501e933dee57c59da6d2fa109f8060924-e4f8e195a8345123a44875816a9e4f0d6e81cc76.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt index d8f0642..981ccec 100644 --- a/chrome/build/win-arm64.pgo.txt +++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@ -chrome-win-arm64-main-1750053232-33b168960ff3c97f61df406ebc8f69dec041a246-1e7bd3c1484bb4a9e8c3ff5e58bcfe93f4fe86ba.profdata +chrome-win-arm64-main-1750075037-ac54afa6f95a424fe8abd4b992fdbe110e9e53c7-e4f8e195a8345123a44875816a9e4f0d6e81cc76.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 5c960237..393bc0e7 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1750042359-79ec791e4b9dafe825d5c07bec701a38be69f1b8-5175ec0ed798bc0e0853112f2aca712067e5c1d4.profdata +chrome-win32-main-1750053232-7d69de9c36d51e9ae0238330d322e0e70e4929c2-1e7bd3c1484bb4a9e8c3ff5e58bcfe93f4fe86ba.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index d74227f..52ec6260 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1750042359-0e9d34015b69504bc6585da69dbbf7b3a25d22f9-5175ec0ed798bc0e0853112f2aca712067e5c1d4.profdata +chrome-win64-main-1750064332-46c982fa88d5c2af61bc4b896d231c91708afebc-ea889c052c9544f31174a229c79bacaa0fd36694.profdata
diff --git a/chrome/common/extensions/api/api_sources.gni b/chrome/common/extensions/api/api_sources.gni index 1baac29d..0b21112a 100644 --- a/chrome/common/extensions/api/api_sources.gni +++ b/chrome/common/extensions/api/api_sources.gni
@@ -18,6 +18,7 @@ "developer_private.idl", "enterprise_hardware_platform.idl", "font_settings.json", + "gcm.json", "history.json", "identity.idl", "instance_id.json", @@ -62,7 +63,6 @@ "downloads.idl", "downloads_internal.idl", "enterprise_reporting_private.idl", - "gcm.json", "image_writer_private.idl", "language_settings_private.idl", "omnibox.json",
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 9b0778b8a..2a74de7 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1532,6 +1532,7 @@ "../browser/extensions/api/extension_action/test_icon_image_observer.cc", "../browser/extensions/api/extension_action/test_icon_image_observer.h", "../browser/extensions/api/font_settings/font_settings_apitest.cc", + "../browser/extensions/api/gcm/gcm_apitest.cc", "../browser/extensions/api/history/history_apitest.cc", "../browser/extensions/api/i18n/i18n_apitest.cc", "../browser/extensions/api/idle/idle_apitest.cc", @@ -4447,7 +4448,6 @@ "../browser/extensions/api/favicon/favicon_apitest.cc", "../browser/extensions/api/feedback_private/feedback_browsertest.cc", "../browser/extensions/api/file_system/file_system_apitest.cc", - "../browser/extensions/api/gcm/gcm_apitest.cc", "../browser/extensions/api/identity/gaia_remote_consent_flow_browsertest.cc", "../browser/extensions/api/identity/identity_apitest.cc", "../browser/extensions/api/identity/web_auth_flow_browsertest.cc", @@ -5744,6 +5744,7 @@ if (enable_webui_tab_strip) { sources += [ + "../browser/ui/views/frame/webui_tab_strip_container_view_browsertest.cc", "../browser/ui/views/frame/webui_tab_strip_field_trial_browsertest.cc", "../browser/ui/views/toolbar/webui_tab_counter_button_browsertest.cc", "../browser/ui/webui/tab_strip/tab_strip_ui_browsertest.cc", @@ -6613,7 +6614,6 @@ if (enable_webui_tab_strip) { sources += [ - "../browser/ui/views/frame/webui_tab_strip_container_view_unittest.cc", "../browser/ui/webui/tab_strip/tab_strip_page_handler_unittest.cc", "../browser/ui/webui/tab_strip/tab_strip_ui_layout_unittest.cc", "../browser/ui/webui/tab_strip/thumbnail_tracker_unittest.cc", @@ -9083,6 +9083,7 @@ "../browser/extensions/api/declarative_net_request/ruleset_manager_unittest.cc", "../browser/extensions/api/enterprise_hardware_platform/enterprise_hardware_platform_api_unittest.cc", "../browser/extensions/api/extension_action/extension_action_api_unittest.cc", + "../browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc", "../browser/extensions/api/permissions/permissions_api_helpers_unittest.cc", "../browser/extensions/api/permissions/permissions_api_unittest.cc", "../browser/extensions/api/preference/preference_api_prefs_unittest.cc", @@ -9220,7 +9221,6 @@ "../browser/extensions/api/downloads/downloads_api_unittest.cc", "../browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc", "../browser/extensions/api/file_system/file_system_api_unittest.cc", - "../browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc", "../browser/extensions/api/identity/extension_token_key_unittest.cc", "../browser/extensions/api/identity/gaia_remote_consent_flow_unittest.cc", "../browser/extensions/api/identity/identity_api_unittest.cc", @@ -12209,13 +12209,10 @@ "//components/bookmarks/browser:test_support", "//components/bookmarks/managed", "//components/browser_sync", - "//components/commerce/core:feature_list", "//components/favicon/core", "//components/invalidation/impl", "//components/invalidation/impl:test_support", "//components/os_crypt/sync:test_support", - "//components/password_manager/core/browser:password_manager_buildflags", - "//components/plus_addresses:features", "//components/saved_tab_groups/public", "//components/signin/public/identity_manager:test_support", "//components/sync", @@ -12273,7 +12270,6 @@ ":sync_integration_test_support_jni_headers", ":test_support_jni_headers", "//chrome/browser/android/webapk:webapk_sources", - "//chrome/browser/password_manager/android:utils", "//chrome/browser/ui/android/tab_model", "//components/saved_tab_groups/public:conversion_utils", ]
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/AccountManagerTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/AccountManagerTestRule.java index cbe76c2..160ea68 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/AccountManagerTestRule.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/AccountManagerTestRule.java
@@ -175,13 +175,6 @@ mFakeAccountManagerFacade.setAccountFetchFailed(); } - /** Scheduled for removal. Use blockGetAccountsUpdate instead. */ - @Deprecated - public FakeAccountManagerFacade.UpdateBlocker blockGetCoreAccountInfosUpdate( - boolean populateCache) { - return mFakeAccountManagerFacade.blockGetAccounts(populateCache); - } - /** See {@link FakeAccountManagerFacade#blockGetAccounts(boolean)}. */ public FakeAccountManagerFacade.UpdateBlocker blockGetAccountsUpdate(boolean populateCache) { return mFakeAccountManagerFacade.blockGetAccounts(populateCache);
diff --git a/chrome/test/data/webui/settings/clear_browsing_data_dialog_v2_test.ts b/chrome/test/data/webui/settings/clear_browsing_data_dialog_v2_test.ts index 3cf0a48..5d7d046 100644 --- a/chrome/test/data/webui/settings/clear_browsing_data_dialog_v2_test.ts +++ b/chrome/test/data/webui/settings/clear_browsing_data_dialog_v2_test.ts
@@ -148,7 +148,7 @@ assertFalse(historyCheckbox.$.checkbox.disabled); dialog.$.showMoreButton.click(); - await flushTasks(); + await waitAfterNextRender(dialog); const formDataCheckbox = getCheckboxForDataType(BrowsingDataType.FORM_DATA); assertTrue(!!formDataCheckbox); @@ -230,10 +230,15 @@ dialog.$.deleteButton.innerText.trim()); }); - test('ShowMoreButton', function() { + test('ShowMoreButton', async function() { assertTrue(isVisible(dialog.$.showMoreButton)); dialog.$.showMoreButton.click(); + await waitAfterNextRender(dialog); + // Verify the focus is not lost after expanding the checkboxes. + assertEquals( + dialog.$.moreOptionsList.firstElementChild, + dialog.shadowRoot!.activeElement); assertFalse(isVisible(dialog.$.showMoreButton)); }); @@ -247,7 +252,7 @@ ]); dialog.$.showMoreButton.click(); - await flushTasks(); + await waitAfterNextRender(dialog); // On show more click, all checkboxes should be visible in default order. verifyCheckboxesVisibleForDataTypesInOrder([ BrowsingDataType.HISTORY, @@ -279,7 +284,7 @@ ]); dialog.$.showMoreButton.click(); - await flushTasks(); + await waitAfterNextRender(dialog); // On show more click, all checkboxes should be visible with the unselected // checkboxes at the bottom. verifyCheckboxesVisibleForDataTypesInOrder([ @@ -346,7 +351,7 @@ // Case 2, selection from more checkboxes. dialog.$.showMoreButton.click(); - await flushTasks(); + await waitAfterNextRender(dialog); // All checkboxes should be visible. verifyCheckboxesVisibleForDataTypesInOrder([ @@ -407,7 +412,7 @@ ]); dialog.$.showMoreButton.click(); - await flushTasks(); + await waitAfterNextRender(dialog); const formDataCheckbox = getCheckboxForDataType(BrowsingDataType.FORM_DATA); assertTrue(!!formDataCheckbox); @@ -489,7 +494,7 @@ 'site settings result'); dialog.$.showMoreButton.click(); - await flushTasks(); + await waitAfterNextRender(dialog); const siteSettingsCheckbox = getCheckboxForDataType(BrowsingDataType.SITE_SETTINGS); @@ -503,7 +508,7 @@ // Select datatypes for deletion. dialog.$.showMoreButton.click(); - await flushTasks(); + await waitAfterNextRender(dialog); const historyCheckbox = getCheckboxForDataType(BrowsingDataType.HISTORY); assertTrue(!!historyCheckbox); historyCheckbox.$.checkbox.click();
diff --git a/chrome/test/data/webui/settings/payments_section_test.ts b/chrome/test/data/webui/settings/payments_section_test.ts index 56013282..bb1ef5a 100644 --- a/chrome/test/data/webui/settings/payments_section_test.ts +++ b/chrome/test/data/webui/settings/payments_section_test.ts
@@ -53,6 +53,31 @@ }); }); + test('ManagePaymentMethodsLink_RecordsMetrics', async function() { + const testMetricsBrowserProxy = new TestMetricsBrowserProxy(); + MetricsBrowserProxyImpl.setInstance(testMetricsBrowserProxy); + + const section = await createPaymentsSection( + /*creditCards=*/[], /*ibans=*/[], /*payOverTimeIssuers=*/[], + /*prefValues=*/ {}); + + const manageAnchor = section.$.manageLink.querySelector('a'); + assertTrue(!!manageAnchor); + + // To avoid opening a new tab in the test (which ends up breaking the other + // tests), make the anchor basically non-operable before clicking it. + manageAnchor.href = '#'; + manageAnchor.target = ''; + + manageAnchor.click(); + const recordedAction = + await testMetricsBrowserProxy.whenCalled('recordAction'); + + assertEquals( + 'Autofill.PaymentMethodsSettingsPage.ManagePaymentMethodsLinkClicked', + recordedAction); + }); + test('verifyNoCreditCards', async function() { const section = await createPaymentsSection( /*creditCards=*/[], /*ibans=*/[], /*payOverTimeIssuers=*/[],
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index eaf0bfd9..be7dabc 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -16320.0.0-1069621 \ No newline at end of file +16321.0.0-1069629 \ No newline at end of file
diff --git a/clank b/clank index e420186..36c23c8 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit e4201862b5cd95321ccc5abba80f47a502829743 +Subproject commit 36c23c84ecbd0d6f2633e7aae5f64cf4245061c4
diff --git a/components/BUILD.gn b/components/BUILD.gn index e8b6bff..d06ef3ae 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -1161,6 +1161,7 @@ "//content/test:content_test_bundle_data", "//content/test:gpu_process_bundle", "//content/test:network_process_bundle", + "//testing/buildbot/filters:components_browsertests_use_blink_filters_bundle_data", ] }
diff --git a/components/android_autofill/browser/android_autofill_client.cc b/components/android_autofill/browser/android_autofill_client.cc index 13f35a63..3cb75388 100644 --- a/components/android_autofill/browser/android_autofill_client.cc +++ b/components/android_autofill/browser/android_autofill_client.cc
@@ -52,7 +52,7 @@ content_credential_manager_( std::make_unique< credential_management::ThirdPartyCredentialManagerImpl>( - web_contents->GetPrimaryMainFrame())) {} + web_contents)) {} AndroidAutofillClient::~AndroidAutofillClient() { HideAutofillSuggestions(autofill::SuggestionHidingReason::kTabGone);
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index c3a502a..1e95bdd 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -1109,6 +1109,7 @@ "single_field_fillers/autocomplete/mock_autocomplete_history_manager.h", "single_field_fillers/mock_single_field_fill_router.cc", "single_field_fillers/mock_single_field_fill_router.h", + "single_field_fillers/payments/merchant_promo_code_manager_test_api.h", "single_field_fillers/payments/mock_merchant_promo_code_manager.cc", "single_field_fillers/payments/mock_merchant_promo_code_manager.h", "strike_databases/payments/test_credit_card_save_strike_database.cc",
diff --git a/components/autofill/core/browser/crowdsourcing/votes_uploader.cc b/components/autofill/core/browser/crowdsourcing/votes_uploader.cc index 4ee5de8..51c9df2 100644 --- a/components/autofill/core/browser/crowdsourcing/votes_uploader.cc +++ b/components/autofill/core/browser/crowdsourcing/votes_uploader.cc
@@ -13,6 +13,7 @@ #include "components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h" #include "components/autofill/core/browser/crowdsourcing/determine_possible_field_types.h" #include "components/autofill/core/browser/crowdsourcing/randomized_encoder.h" +#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h" #include "components/autofill/core/browser/data_manager/personal_data_manager.h" #include "components/autofill/core/browser/data_model/addresses/autofill_profile.h" #include "components/autofill/core/browser/data_model/payments/credit_card.h"
diff --git a/components/autofill/core/browser/data_manager/payments/payments_data_manager.cc b/components/autofill/core/browser/data_manager/payments/payments_data_manager.cc index 9b42bf5..39f3564 100644 --- a/components/autofill/core/browser/data_manager/payments/payments_data_manager.cc +++ b/components/autofill/core/browser/data_manager/payments/payments_data_manager.cc
@@ -557,6 +557,16 @@ return iter != local_ibans_.end() ? iter->get() : nullptr; } +const AutofillOfferData* PaymentsDataManager::GetMerchantPromoCodeByOfferId( + const int64_t offer_id) const { + auto iter = std::ranges::find_if( + autofill_offer_data_, + [&offer_id](const std::unique_ptr<AutofillOfferData>& offer_data) { + return offer_data->GetOfferId() == offer_id; + }); + return iter != autofill_offer_data_.end() ? iter->get() : nullptr; +} + const Iban* PaymentsDataManager::GetIbanByInstrumentId( int64_t instrument_id) const { for (const Iban* iban : GetServerIbans()) {
diff --git a/components/autofill/core/browser/data_manager/payments/payments_data_manager.h b/components/autofill/core/browser/data_manager/payments/payments_data_manager.h index 1ff1bcd..54aa250 100644 --- a/components/autofill/core/browser/data_manager/payments/payments_data_manager.h +++ b/components/autofill/core/browser/data_manager/payments/payments_data_manager.h
@@ -130,6 +130,11 @@ // with the specified `guid`. const Iban* GetIbanByGUID(const std::string& guid) const; + // Returns the `AutofillOfferData` with the specified `offer_id`, or nullptr + // if there is no promo code with the specified `offer_id`. + const AutofillOfferData* GetMerchantPromoCodeByOfferId( + const int64_t offer_id) const; + // Returns the IBAN if any cached IBAN in `server_ibans_` has the same // `instrument_id` as the given `instrument_id`, otherwise returns nullptr. const Iban* GetIbanByInstrumentId(int64_t instrument_id) const;
diff --git a/components/autofill/core/browser/foundations/autofill_client.h b/components/autofill/core/browser/foundations/autofill_client.h index 4b97a3d..86770719 100644 --- a/components/autofill/core/browser/foundations/autofill_client.h +++ b/components/autofill/core/browser/foundations/autofill_client.h
@@ -21,7 +21,6 @@ #include "build/build_config.h" #include "components/autofill/core/browser/autofill_trigger_source.h" #include "components/autofill/core/browser/country_type.h" -#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h" #include "components/autofill/core/browser/data_manager/valuables/valuables_data_manager.h" #include "components/autofill/core/browser/filling/filling_product.h" #include "components/autofill/core/browser/integrators/fast_checkout/fast_checkout_client.h" @@ -43,7 +42,6 @@ #include "components/security_state/core/security_state.h" #include "components/translate/core/browser/language_state.h" #include "services/metrics/public/cpp/ukm_source_id.h" -#include "services/network/public/cpp/shared_url_loader_factory.h" #include "ui/base/window_open_disposition.h" #include "ui/gfx/geometry/rect_f.h" #include "ui/gfx/image/image.h" @@ -53,6 +51,10 @@ class GoogleGroupsManager; class PrefService; +namespace network { +class SharedURLLoaderFactory; +} + namespace signin { class IdentityManager; } @@ -61,10 +63,6 @@ class SyncService; } -namespace ukm { -class UkmRecorder; -} - namespace optimization_guide { class ModelQualityLogsUploaderService; } @@ -73,6 +71,10 @@ class AnnotatedPageContent; } +namespace ukm { +class UkmRecorder; +} + namespace version_info { enum class Channel; } @@ -95,6 +97,7 @@ class AutofillAiModelCache; class AutofillAiModelExecutor; class AutofillProfile; +class EntityDataManager; class FieldClassificationModelHandler; class FormDataImporter; class LogManager;
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager.cc b/components/autofill/core/browser/foundations/browser_autofill_manager.cc index 52a4a0c..a9f8061c 100644 --- a/components/autofill/core/browser/foundations/browser_autofill_manager.cc +++ b/components/autofill/core/browser/foundations/browser_autofill_manager.cc
@@ -2092,6 +2092,31 @@ ->OnIbanSuggestionsShown(field_id); } + if (shown_suggestion_types.contains( + SuggestionType::kMerchantPromoCodeEntry)) { + std::vector<const AutofillOfferData*> shown_offers; + for (const Suggestion& suggestion : suggestions) { + if (suggestion.type == SuggestionType::kMerchantPromoCodeEntry) { + int64_t offer_id; + base::StringToInt64( + std::get<Suggestion::Guid>(suggestion.payload).value(), &offer_id); + const AutofillOfferData* offer = + client() + .GetPaymentsAutofillClient() + ->GetPaymentsDataManager() + .GetMerchantPromoCodeByOfferId(offer_id); + if (offer) { + shown_offers.push_back(offer); + } + } + } + + client() + .GetPaymentsAutofillClient() + ->GetMerchantPromoCodeManager() + ->OnOffersSuggestionsShown(field_id, shown_offers); + } + FormStructure* form_structure = nullptr; AutofillField* autofill_field = nullptr; const bool has_cached_form_and_field = GetCachedFormAndField(
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc index 83166fc..8a33b9f 100644 --- a/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc +++ b/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc
@@ -85,6 +85,7 @@ #include "components/autofill/core/browser/integrators/plus_addresses/mock_autofill_plus_address_delegate.h" #include "components/autofill/core/browser/metrics/form_events/form_events.h" #include "components/autofill/core/browser/metrics/log_event.h" +#include "components/autofill/core/browser/metrics/payments/offers_metrics.h" #include "components/autofill/core/browser/metrics/ukm_metrics_test_utils.h" #include "components/autofill/core/browser/ml_model/autofill_ai/mock_autofill_ai_model_cache.h" #include "components/autofill/core/browser/ml_model/autofill_ai/mock_autofill_ai_model_executor.h" @@ -5924,6 +5925,29 @@ 1))); } +TEST_F(BrowserAutofillManagerTest, + DidShowSuggestions_LogPromoCodeSuggestionsShownMetric) { + FormData form = test::CreateTestMerchantPromoCodeFormData(); + FormsSeen({form}); + + base::HistogramTester histogram_tester; + manager().DidShowSuggestions( + {Suggestion(SuggestionType::kMerchantPromoCodeEntry)}, form, + form.fields().back().global_id(), {}); + manager().DidShowSuggestions( + {Suggestion(SuggestionType::kMerchantPromoCodeEntry)}, form, + form.fields().back().global_id(), {}); + + EXPECT_THAT( + histogram_tester.GetAllSamples("Autofill.Offer.SuggestionsPopupShown2"), + BucketsAre(base::Bucket(autofill_metrics::OffersSuggestionsPopupEvent:: + kOffersSuggestionsPopupShown, + 2), + base::Bucket(autofill_metrics::OffersSuggestionsPopupEvent:: + kOffersSuggestionsPopupShownOnce, + 1))); +} + TEST_F(BrowserAutofillManagerTest, DidShowSuggestions_LogByType_AddressOnly) { // Create a form with name and address fields. FormData form;
diff --git a/components/autofill/core/browser/payments/mock_test_payments_network_interface.cc b/components/autofill/core/browser/payments/mock_test_payments_network_interface.cc index ae60111..1900622 100644 --- a/components/autofill/core/browser/payments/mock_test_payments_network_interface.cc +++ b/components/autofill/core/browser/payments/mock_test_payments_network_interface.cc
@@ -4,6 +4,8 @@ #include "components/autofill/core/browser/payments/mock_test_payments_network_interface.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" + namespace autofill { MockTestPaymentsNetworkInterface::MockTestPaymentsNetworkInterface()
diff --git a/components/autofill/core/browser/payments/multiple_request_payments_network_interface.cc b/components/autofill/core/browser/payments/multiple_request_payments_network_interface.cc index 6d5ae1e..9fb73d64 100644 --- a/components/autofill/core/browser/payments/multiple_request_payments_network_interface.cc +++ b/components/autofill/core/browser/payments/multiple_request_payments_network_interface.cc
@@ -4,11 +4,15 @@ #include "components/autofill/core/browser/payments/multiple_request_payments_network_interface.h" +#include <string> +#include <vector> + #include "components/autofill/core/browser/metrics/payments/credit_card_save_metrics.h" #include "components/autofill/core/browser/payments/payments_requests/create_card_request.h" #include "components/autofill/core/browser/payments/payments_requests/get_details_for_create_card_request.h" #include "components/autofill/core/browser/payments/payments_requests/get_details_for_enrollment_request.h" #include "components/autofill/core/browser/payments/payments_requests/update_virtual_card_enrollment_request.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" namespace autofill::payments {
diff --git a/components/autofill/core/browser/payments/multiple_request_payments_network_interface_base.cc b/components/autofill/core/browser/payments/multiple_request_payments_network_interface_base.cc index 80cdc1f..ea9b0d0 100644 --- a/components/autofill/core/browser/payments/multiple_request_payments_network_interface_base.cc +++ b/components/autofill/core/browser/payments/multiple_request_payments_network_interface_base.cc
@@ -27,6 +27,7 @@ #include "net/http/http_status_code.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/resource_request.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/public/mojom/url_response_head.mojom.h"
diff --git a/components/autofill/core/browser/payments/payments_network_interface.cc b/components/autofill/core/browser/payments/payments_network_interface.cc index 140f1320..fa6506d 100644 --- a/components/autofill/core/browser/payments/payments_network_interface.cc +++ b/components/autofill/core/browser/payments/payments_network_interface.cc
@@ -38,6 +38,7 @@ #include "components/autofill/core/browser/studies/autofill_experiments.h" #include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_payments_features.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" namespace autofill::payments { namespace {
diff --git a/components/autofill/core/browser/payments/payments_network_interface_base.cc b/components/autofill/core/browser/payments/payments_network_interface_base.cc index 904e8afb..91e6d49 100644 --- a/components/autofill/core/browser/payments/payments_network_interface_base.cc +++ b/components/autofill/core/browser/payments/payments_network_interface_base.cc
@@ -21,6 +21,7 @@ #include "net/http/http_status_code.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/resource_request.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/public/mojom/url_response_head.mojom.h"
diff --git a/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager.cc b/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager.cc index 3b56ca49..bb462b2 100644 --- a/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager.cc +++ b/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager.cc
@@ -55,6 +55,12 @@ uma_recorder_.OnOfferSuggestionSelected(suggestion.type); } +void MerchantPromoCodeManager::OnOffersSuggestionsShown( + const FieldGlobalId& field_global_id, + const std::vector<const AutofillOfferData*>& offers) { + uma_recorder_.OnOffersSuggestionsShown(field_global_id, offers); +} + void MerchantPromoCodeManager::UMARecorder::OnOffersSuggestionsShown( const FieldGlobalId& field_global_id, const std::vector<const AutofillOfferData*>& offers) { @@ -144,9 +150,6 @@ std::move(on_suggestions_returned) .Run(field.global_id(), GetPromoCodeSuggestionsFromPromoCodeOffers(promo_code_offers)); - - // Log that promo code autofill suggestions were shown. - uma_recorder_.OnOffersSuggestionsShown(field.global_id(), promo_code_offers); } } // namespace autofill
diff --git a/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager.h b/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager.h index d3486d34..32d5238c 100644 --- a/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager.h +++ b/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager.h
@@ -55,8 +55,15 @@ on_suggestions_returned); virtual void OnSingleFieldSuggestionSelected(const Suggestion& suggestion); + // Called when offer suggestions are shown; used to record metrics. + // `field_global_id` is the global id of the field that had suggestions shown. + void OnOffersSuggestionsShown( + const FieldGlobalId& field_global_id, + const std::vector<const AutofillOfferData*>& offers); + private: friend class MerchantPromoCodeManagerTest; + friend class MerchantPromoCodeManagerTestApi; FRIEND_TEST_ALL_PREFIXES(MerchantPromoCodeManagerTest, DoesNotShowPromoCodeOffersForOffTheRecord); FRIEND_TEST_ALL_PREFIXES( @@ -79,6 +86,8 @@ void OnOfferSuggestionSelected(SuggestionType type); private: + friend class MerchantPromoCodeManagerTestApi; + // The global id of the field that most recently had suggestions shown. FieldGlobalId most_recent_suggestions_shown_field_global_id_;
diff --git a/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager_test_api.h b/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager_test_api.h new file mode 100644 index 0000000..9e07a16e --- /dev/null +++ b/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager_test_api.h
@@ -0,0 +1,34 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_SINGLE_FIELD_FILLERS_PAYMENTS_MERCHANT_PROMO_CODE_MANAGER_TEST_API_H_ +#define COMPONENTS_AUTOFILL_CORE_BROWSER_SINGLE_FIELD_FILLERS_PAYMENTS_MERCHANT_PROMO_CODE_MANAGER_TEST_API_H_ + +#include "components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager.h" + +namespace autofill { + +class MerchantPromoCodeManagerTestApi { + public: + explicit MerchantPromoCodeManagerTestApi( + MerchantPromoCodeManager& promo_manager) + : promo_manager_(promo_manager) {} + + void set_most_recent_suggestions_shown_field_global_id( + FieldGlobalId field_global_id) { + promo_manager_->uma_recorder_ + .most_recent_suggestions_shown_field_global_id_ = field_global_id; + } + + private: + const raw_ref<MerchantPromoCodeManager> promo_manager_; +}; + +inline MerchantPromoCodeManagerTestApi test_api( + MerchantPromoCodeManager& promo_manager) { + return MerchantPromoCodeManagerTestApi(promo_manager); +} + +} // namespace autofill +#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_SINGLE_FIELD_FILLERS_PAYMENTS_MERCHANT_PROMO_CODE_MANAGER_TEST_API_H_
diff --git a/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager_unittest.cc b/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager_unittest.cc index 253e113..5ddedd7 100644 --- a/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager_unittest.cc +++ b/components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager_unittest.cc
@@ -23,6 +23,7 @@ #include "components/autofill/core/browser/form_structure_test_api.h" #include "components/autofill/core/browser/foundations/test_autofill_client.h" #include "components/autofill/core/browser/metrics/payments/offers_metrics.h" +#include "components/autofill/core/browser/single_field_fillers/payments/merchant_promo_code_manager_test_api.h" #include "components/autofill/core/browser/test_utils/autofill_test_utils.h" #include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_test_utils.h" @@ -130,7 +131,6 @@ }; TEST_F(MerchantPromoCodeManagerTest, ShowsPromoCodeSuggestions) { - base::HistogramTester histogram_tester; std::string promo_code = SetUpPromoCodeOffer( "https://www.example.com", GURL("https://offer-details-url.com/")); Suggestion promo_code_suggestion = Suggestion(base::ASCIIToUTF16(promo_code)); @@ -167,23 +167,6 @@ FormControlType::kInputTelephone); EXPECT_TRUE(promo_manager().OnGetSingleFieldSuggestions( form(), other_field, field(), client(), mock_callback.GetNewRef())); - - histogram_tester.ExpectBucketCount( - "Autofill.Offer.SuggestionsPopupShown2", - autofill_metrics::OffersSuggestionsPopupEvent:: - kOffersSuggestionsPopupShownOnce, - 2); - histogram_tester.ExpectBucketCount( - "Autofill.Offer.SuggestionsPopupShown2", - autofill_metrics::OffersSuggestionsPopupEvent:: - kOffersSuggestionsPopupShown, - 3); - histogram_tester.ExpectBucketCount( - "Autofill.Offer.Suggestion2.GPayPromoCodeOffer", - autofill_metrics::OffersSuggestionsEvent::kOfferSuggestionShownOnce, 2); - histogram_tester.ExpectBucketCount( - "Autofill.Offer.Suggestion2.GPayPromoCodeOffer", - autofill_metrics::OffersSuggestionsEvent::kOfferSuggestionShown, 3); } TEST_F(MerchantPromoCodeManagerTest, @@ -221,7 +204,6 @@ TEST_F(MerchantPromoCodeManagerTest, DoesNotShowPromoCodeOffersForOffTheRecord) { - base::HistogramTester histogram_tester; std::string promo_code = SetUpPromoCodeOffer( "https://www.example.com", GURL("https://offer-details-url.com/")); promo_manager().is_off_the_record_ = true; @@ -234,24 +216,6 @@ // Simulate request for suggestions. EXPECT_FALSE(promo_manager().OnGetSingleFieldSuggestions( form(), field(), field(), client(), mock_callback.GetNewRef())); - - // Ensure that no metrics were logged. - histogram_tester.ExpectBucketCount( - "Autofill.Offer.SuggestionsPopupShown2", - autofill_metrics::OffersSuggestionsPopupEvent:: - kOffersSuggestionsPopupShownOnce, - 0); - histogram_tester.ExpectBucketCount( - "Autofill.Offer.SuggestionsPopupShown2", - autofill_metrics::OffersSuggestionsPopupEvent:: - kOffersSuggestionsPopupShown, - 0); - histogram_tester.ExpectBucketCount( - "Autofill.Offer.Suggestion2.GPayPromoCodeOffer", - autofill_metrics::OffersSuggestionsEvent::kOfferSuggestionShownOnce, 0); - histogram_tester.ExpectBucketCount( - "Autofill.Offer.Suggestion2.GPayPromoCodeOffer", - autofill_metrics::OffersSuggestionsEvent::kOfferSuggestionShown, 0); } TEST_F(MerchantPromoCodeManagerTest, @@ -397,7 +361,6 @@ // This test case exists to ensure that we do not offer promo code offer // suggestions if the field already contains a promo code. TEST_F(MerchantPromoCodeManagerTest, PrefixMatched) { - base::HistogramTester histogram_tester; field().set_value(base::ASCIIToUTF16(SetUpPromoCodeOffer( "https://www.example.com", GURL("https://offer-details-url.com/")))); @@ -414,24 +377,6 @@ // Simulate request for suggestions. EXPECT_TRUE(promo_manager().OnGetSingleFieldSuggestions( form(), field(), field(), client(), mock_callback.GetNewRef())); - - // No metrics should be logged because no suggestions were shown. - histogram_tester.ExpectBucketCount( - "Autofill.Offer.SuggestionsPopupShown2", - autofill_metrics::OffersSuggestionsPopupEvent:: - kOffersSuggestionsPopupShownOnce, - 0); - histogram_tester.ExpectBucketCount( - "Autofill.Offer.SuggestionsPopupShown2", - autofill_metrics::OffersSuggestionsPopupEvent:: - kOffersSuggestionsPopupShown, - 0); - histogram_tester.ExpectBucketCount( - "Autofill.Offer.Suggestion2.GPayPromoCodeOffer", - autofill_metrics::OffersSuggestionsEvent::kOfferSuggestionShownOnce, 0); - histogram_tester.ExpectBucketCount( - "Autofill.Offer.Suggestion2.GPayPromoCodeOffer", - autofill_metrics::OffersSuggestionsEvent::kOfferSuggestionShown, 0); } TEST_F(MerchantPromoCodeManagerTest, @@ -447,6 +392,8 @@ Suggestion autocomplete_suggestion(test_promo_code, SuggestionType::kAutocompleteEntry); promo_manager().OnSingleFieldSuggestionSelected(autocomplete_suggestion); + test_api(promo_manager()).set_most_recent_suggestions_shown_field_global_id( + field().global_id()); histogram_tester.ExpectBucketCount( "Autofill.Offer.Suggestion2.GPayPromoCodeOffer", autofill_metrics::OffersSuggestionsEvent::kOfferSuggestionSelected, 0); @@ -499,6 +446,8 @@ Suggestion autocomplete_suggestion(test_promo_code, SuggestionType::kAutocompleteEntry); promo_manager().OnSingleFieldSuggestionSelected(autocomplete_suggestion); + test_api(promo_manager()).set_most_recent_suggestions_shown_field_global_id( + field().global_id()); histogram_tester.ExpectBucketCount( "Autofill.Offer.Suggestion2.GPayPromoCodeOffer", autofill_metrics::OffersSuggestionsEvent::
diff --git a/components/autofill/core/browser/suggestions/suggestion.h b/components/autofill/core/browser/suggestions/suggestion.h index 127a919..2c68cdb 100644 --- a/components/autofill/core/browser/suggestions/suggestion.h +++ b/components/autofill/core/browser/suggestions/suggestion.h
@@ -481,11 +481,18 @@ // the second line, third column in the grid view of label). std::vector<std::vector<Text>> labels; - // Used only for passwords to show the credential signon realm if applicable. - // Also used to display an extra line of information if two line - // display is enabled. + // Used only for passwords to: + // 1. show the credential signon realm if applicable + // 2. show the obfuscated backup password in a password recovery flow. + // 3. show a "recovery" string next to the backup credential when displaying + // backups alongside the primary credentials. + // Also used to display an extra line of information if two line display is + // enabled. std::u16string additional_label; + // Whether the additional label is aligned to the right (or left in RTL). + bool additional_label_alignment_right = false; + // This field outlines various methods for specifying the custom icon. // Depending on the use case and platform, it can be a `gfx::Image` instance // or imply more complex semantic of fetching the icon (see `CustomIconUrl`,
diff --git a/components/autofill/core/browser/ui/autofill_external_delegate.cc b/components/autofill/core/browser/ui/autofill_external_delegate.cc index 468182ec7..a2fa9cb 100644 --- a/components/autofill/core/browser/ui/autofill_external_delegate.cc +++ b/components/autofill/core/browser/ui/autofill_external_delegate.cc
@@ -33,6 +33,7 @@ #include "components/autofill/core/browser/autofill_trigger_source.h" #include "components/autofill/core/browser/autofill_type.h" #include "components/autofill/core/browser/data_manager/addresses/address_data_manager.h" +#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h" #include "components/autofill/core/browser/data_manager/payments/payments_data_manager.h" #include "components/autofill/core/browser/field_type_utils.h" #include "components/autofill/core/browser/field_types.h"
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc index 04553d7..bb4d0e4 100644 --- a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc +++ b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
@@ -43,6 +43,7 @@ #include "components/autofill/core/common/dense_set.h" #include "components/autofill/core/common/form_field_data.h" #include "components/sync/base/data_type.h" +#include "components/sync/protocol/autofill_specifics.pb.h" #include "components/webdata/common/web_database_backend.h" namespace autofill {
diff --git a/components/autofill/core/browser/webdata/payments/payments_autofill_table.h b/components/autofill/core/browser/webdata/payments/payments_autofill_table.h index 89dd29f..51e3a65 100644 --- a/components/autofill/core/browser/webdata/payments/payments_autofill_table.h +++ b/components/autofill/core/browser/webdata/payments/payments_autofill_table.h
@@ -13,12 +13,15 @@ #include <vector> #include "components/autofill/core/browser/data_model/payments/credit_card_benefit.h" -#include "components/sync/base/data_type.h" -#include "components/sync/protocol/autofill_specifics.pb.h" #include "components/webdata/common/web_database_table.h" class WebDatabase; +namespace sync_pb { +class PaymentInstrument; +class PaymentInstrumentCreationOption; +} // namespace sync_pb + namespace autofill { class AutofillOfferData;
diff --git a/components/autofill_ai/core/browser/BUILD.gn b/components/autofill_ai/core/browser/BUILD.gn index cee25bc..fa6ac01 100644 --- a/components/autofill_ai/core/browser/BUILD.gn +++ b/components/autofill_ai/core/browser/BUILD.gn
@@ -7,8 +7,6 @@ if (is_win || is_mac || is_linux || is_chromeos) { static_library("browser") { sources = [ - "autofill_ai_client.cc", - "autofill_ai_client.h", "autofill_ai_manager.cc", "autofill_ai_manager.h", "autofill_ai_metrics.cc", @@ -37,9 +35,8 @@ static_library("test_support") { testonly = true sources = [ + "autofill_ai_manager_test_api.cc", "autofill_ai_manager_test_api.h", - "mock_autofill_ai_client.cc", - "mock_autofill_ai_client.h", ] deps = [ ":browser",
diff --git a/components/autofill_ai/core/browser/autofill_ai_client.cc b/components/autofill_ai/core/browser/autofill_ai_client.cc deleted file mode 100644 index 63e8e0db..0000000 --- a/components/autofill_ai/core/browser/autofill_ai_client.cc +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2025 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/autofill_ai/core/browser/autofill_ai_client.h" - -#include <optional> -#include <utility> - -#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h" - -namespace autofill_ai { - -} // namespace autofill_ai
diff --git a/components/autofill_ai/core/browser/autofill_ai_client.h b/components/autofill_ai/core/browser/autofill_ai_client.h deleted file mode 100644 index 5067eae8..0000000 --- a/components/autofill_ai/core/browser/autofill_ai_client.h +++ /dev/null
@@ -1,48 +0,0 @@ -// Copyright 2024 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_AUTOFILL_AI_CORE_BROWSER_AUTOFILL_AI_CLIENT_H_ -#define COMPONENTS_AUTOFILL_AI_CORE_BROWSER_AUTOFILL_AI_CLIENT_H_ - -#include <optional> - -#include "base/functional/callback_forward.h" -#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h" -#include "components/autofill/core/browser/foundations/autofill_client.h" -#include "components/autofill/core/browser/integrators/autofill_ai/autofill_ai_delegate.h" -#include "components/autofill/core/common/unique_ids.h" -#include "components/optimization_guide/core/model_quality/model_quality_logs_uploader_service.h" - -namespace autofill_ai { - -class AutofillAiModelExecutor; -class AutofillAiManager; - -// An interface for embedder actions, e.g. Chrome on Desktop. -// -// A client should be created only if -// `AutofillAiIsPlatformAndEnterprisePolicyEligible()`. However, -// `AutofillAiIsPlatformAndEnterprisePolicyEligible()` is not necessarily a -// constant over the lifetime of the client. For example, the user may disable -// Autofill in the settings while the client is alive. -class AutofillAiClient { - public: - virtual ~AutofillAiClient() = default; - - // Returns the AutofillClient that is scoped to the same object (e.g., tab) as - // this AutofillAiClient. - virtual autofill::AutofillClient& GetAutofillClient() = 0; - const autofill::AutofillClient& GetAutofillClient() const { - return const_cast<const autofill::AutofillClient&>( - const_cast<AutofillAiClient*>(this)->GetAutofillClient()); - } - - // Returns the `AutofillAiManager` associated with this - // client. - virtual AutofillAiManager& GetManager() = 0; -}; - -} // namespace autofill_ai - -#endif // COMPONENTS_AUTOFILL_AI_CORE_BROWSER_AUTOFILL_AI_CLIENT_H_
diff --git a/components/autofill_ai/core/browser/autofill_ai_manager.cc b/components/autofill_ai/core/browser/autofill_ai_manager.cc index c31912d..09223cf 100644 --- a/components/autofill_ai/core/browser/autofill_ai_manager.cc +++ b/components/autofill_ai/core/browser/autofill_ai_manager.cc
@@ -64,7 +64,6 @@ #include "components/autofill/core/common/logging/log_macros.h" #include "components/autofill/core/common/signatures.h" #include "components/autofill/core/common/unique_ids.h" -#include "components/autofill_ai/core/browser/autofill_ai_client.h" #include "components/autofill_ai/core/browser/metrics/autofill_ai_logger.h" #include "components/strings/grit/components_strings.h" #include "ui/base/l10n/l10n_util.h" @@ -191,7 +190,7 @@ } // namespace -AutofillAiManager::AutofillAiManager(AutofillAiClient* client, +AutofillAiManager::AutofillAiManager(autofill::AutofillClient* client, autofill::StrikeDatabase* strike_database) : client_(CHECK_DEREF(client)) { if (strike_database) { @@ -221,8 +220,7 @@ return; } - autofill::EntityDataManager* entity_manager = - client_->GetAutofillClient().GetEntityDataManager(); + autofill::EntityDataManager* entity_manager = client_->GetEntityDataManager(); if (!entity_manager) { return; } @@ -245,8 +243,7 @@ for (const autofill::AutofillField* const field : filled_fields) { logger_.OnDidFillField(form, CHECK_DEREF(field), ukm_source_id); } - autofill::EntityDataManager* entity_manager = - client_->GetAutofillClient().GetEntityDataManager(); + autofill::EntityDataManager* entity_manager = client_->GetEntityDataManager(); if (!entity_manager) { return; } @@ -266,21 +263,19 @@ form.fields(), [](const std::unique_ptr<AutofillField>& field) { return field->GetAutofillAiServerTypePredictions() != std::nullopt; })) { - logger_.RecordFormMetrics( - form, ukm_source_id, /*submission_state=*/true, - autofill::GetAutofillAiOptInStatus(client_->GetAutofillClient())); + logger_.RecordFormMetrics(form, ukm_source_id, /*submission_state=*/true, + autofill::GetAutofillAiOptInStatus(*client_)); } return MaybeImportForm(form); } bool AutofillAiManager::MaybeImportForm(const FormStructure& form) { if (!autofill::MayPerformAutofillAiAction( - client_->GetAutofillClient(), autofill::AutofillAiAction::kImport)) { + *client_, autofill::AutofillAiAction::kImport)) { return false; } - autofill::EntityDataManager* entity_manager = - client_->GetAutofillClient().GetEntityDataManager(); + autofill::EntityDataManager* entity_manager = client_->GetEntityDataManager(); if (!entity_manager) { LOG_AF(GetCurrentLogManager()) << LoggingScope::kAutofillAi << LogMessage::kAutofillAi @@ -288,8 +283,8 @@ return false; } std::vector<EntityInstance> entity_instances_from_form = - GetPossibleEntitiesFromSubmittedForm( - form.fields(), client_->GetAutofillClient().GetAppLocale()); + GetPossibleEntitiesFromSubmittedForm(form.fields(), + client_->GetAppLocale()); if (entity_instances_from_form.empty()) { return false; } @@ -306,9 +301,9 @@ auto prompt_result_callback = BindOnce(&AutofillAiManager::HandleSavePromptResult, GetWeakPtr(), form.source_url(), entity); - client_->GetAutofillClient().ShowEntitySaveOrUpdateBubble( - std::move(entity), - /*old_entity=*/std::nullopt, std::move(prompt_result_callback)); + client_->ShowEntitySaveOrUpdateBubble(std::move(entity), + /*old_entity=*/std::nullopt, + std::move(prompt_result_callback)); return true; } if (std::optional<std::pair<EntityInstance, EntityInstance>> @@ -320,9 +315,9 @@ auto prompt_result_callback = BindOnce(&AutofillAiManager::HandleUpdatePromptResult, GetWeakPtr(), old_entity.guid()); - client_->GetAutofillClient().ShowEntitySaveOrUpdateBubble( - std::move(new_entity), std::move(old_entity), - std::move(prompt_result_callback)); + client_->ShowEntitySaveOrUpdateBubble(std::move(new_entity), + std::move(old_entity), + std::move(prompt_result_callback)); return true; } } @@ -340,8 +335,7 @@ return; } - autofill::EntityDataManager* entity_manager = - client_->GetAutofillClient().GetEntityDataManager(); + autofill::EntityDataManager* entity_manager = client_->GetEntityDataManager(); if (!entity_manager) { return; } @@ -360,8 +354,7 @@ return; } - autofill::EntityDataManager* entity_manager = - client_->GetAutofillClient().GetEntityDataManager(); + autofill::EntityDataManager* entity_manager = client_->GetEntityDataManager(); if (!entity_manager) { return; } @@ -373,14 +366,12 @@ std::vector<autofill::Suggestion> AutofillAiManager::GetSuggestions( const FormStructure& form, const autofill::FormFieldData& trigger_field) { - const AutofillClient& autofill_client = client_->GetAutofillClient(); if (!autofill::MayPerformAutofillAiAction( - autofill_client, autofill::AutofillAiAction::kFilling)) { + *client_, autofill::AutofillAiAction::kFilling)) { return {}; } - autofill::EntityDataManager* entity_manager = - client_->GetAutofillClient().GetEntityDataManager(); + autofill::EntityDataManager* entity_manager = client_->GetEntityDataManager(); if (!entity_manager) { return {}; } @@ -399,24 +390,22 @@ } return autofill::CreateFillingSuggestions(form, trigger_field, entities, - autofill_client.GetAppLocale()); + client_->GetAppLocale()); } bool AutofillAiManager::ShouldDisplayIph(const autofill::FormStructure& form, autofill::FieldGlobalId field) const { - const autofill::AutofillClient& autofill_client = - client_->GetAutofillClient(); if (!autofill::MayPerformAutofillAiAction( - autofill_client, autofill::AutofillAiAction::kIphForOptIn)) { + *client_, autofill::AutofillAiAction::kIphForOptIn)) { return false; } // The user must have at least one address or payments instrument to indicate // that they are an active Autofill user. const autofill::AddressDataManager& adm = - autofill_client.GetPersonalDataManager().address_data_manager(); + client_->GetPersonalDataManager().address_data_manager(); const autofill::PaymentsDataManager& paydm = - autofill_client.GetPersonalDataManager().payments_data_manager(); + client_->GetPersonalDataManager().payments_data_manager(); if (adm.GetProfiles().empty() && paydm.GetCreditCards().empty() && paydm.GetIbans().empty() && !paydm.HasEwalletAccounts() && !paydm.HasMaskedBankAccounts()) { @@ -463,7 +452,7 @@ } autofill::LogManager* AutofillAiManager::GetCurrentLogManager() { - return client_->GetAutofillClient().GetCurrentLogManager(); + return client_->GetCurrentLogManager(); } void AutofillAiManager::AddStrikeForSaveAttempt(const GURL& url, @@ -474,8 +463,8 @@ entity.type().name_as_string(), url.host())); } if (save_strike_db_by_attribute_) { - for (const std::string& key : GetAttributeStrikeKeys( - entity, client_->GetAutofillClient().GetAppLocale())) { + for (const std::string& key : + GetAttributeStrikeKeys(entity, client_->GetAppLocale())) { save_strike_db_by_attribute_->AddStrike(key); } } @@ -497,8 +486,8 @@ entity.type().name_as_string(), url.host())); } if (save_strike_db_by_attribute_) { - for (const std::string& key : GetAttributeStrikeKeys( - entity, client_->GetAutofillClient().GetAppLocale())) { + for (const std::string& key : + GetAttributeStrikeKeys(entity, client_->GetAppLocale())) { save_strike_db_by_attribute_->ClearStrikes(key); } } @@ -522,8 +511,7 @@ if (!save_strike_db_by_attribute_ || std::ranges::any_of( - GetAttributeStrikeKeys(entity, - client_->GetAutofillClient().GetAppLocale()), + GetAttributeStrikeKeys(entity, client_->GetAppLocale()), [&](const std::string& key) { return save_strike_db_by_attribute_->ShouldBlockFeature(key); })) {
diff --git a/components/autofill_ai/core/browser/autofill_ai_manager.h b/components/autofill_ai/core/browser/autofill_ai_manager.h index 4932eb6..077d273 100644 --- a/components/autofill_ai/core/browser/autofill_ai_manager.h +++ b/components/autofill_ai/core/browser/autofill_ai_manager.h
@@ -10,13 +10,13 @@ #include "base/memory/weak_ptr.h" #include "base/uuid.h" #include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h" +#include "components/autofill/core/browser/foundations/autofill_client.h" #include "components/autofill/core/browser/integrators/autofill_ai/autofill_ai_delegate.h" #include "components/autofill/core/browser/strike_databases/autofill_ai/autofill_ai_save_strike_database_by_attribute.h" #include "components/autofill/core/browser/strike_databases/autofill_ai/autofill_ai_save_strike_database_by_host.h" #include "components/autofill/core/browser/strike_databases/autofill_ai/autofill_ai_update_strike_database.h" #include "components/autofill/core/common/aliases.h" #include "components/autofill/core/common/unique_ids.h" -#include "components/autofill_ai/core/browser/autofill_ai_client.h" #include "components/autofill_ai/core/browser/metrics/autofill_ai_logger.h" namespace autofill { @@ -37,7 +37,7 @@ // class is an interface. class AutofillAiManager : public autofill::AutofillAiDelegate { public: - AutofillAiManager(AutofillAiClient* client, + AutofillAiManager(autofill::AutofillClient* client, autofill::StrikeDatabase* strike_database); AutofillAiManager(const AutofillAiManager&) = delete; AutofillAiManager& operator=(const AutofillAiManager&) = delete; @@ -102,7 +102,7 @@ // A raw reference to the client, which owns `this` and therefore outlives // it. - const raw_ref<AutofillAiClient> client_; + const raw_ref<autofill::AutofillClient> client_; // Logger that records various Autofill AI metrics. AutofillAiLogger logger_{&*client_};
diff --git a/components/autofill_ai/core/browser/autofill_ai_manager_test_api.cc b/components/autofill_ai/core/browser/autofill_ai_manager_test_api.cc new file mode 100644 index 0000000..5df3566 --- /dev/null +++ b/components/autofill_ai/core/browser/autofill_ai_manager_test_api.cc
@@ -0,0 +1,5 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill_ai/core/browser/autofill_ai_manager_test_api.h"
diff --git a/components/autofill_ai/core/browser/autofill_ai_manager_unittest.cc b/components/autofill_ai/core/browser/autofill_ai_manager_unittest.cc index 74acaa4f..d809a4a 100644 --- a/components/autofill_ai/core/browser/autofill_ai_manager_unittest.cc +++ b/components/autofill_ai/core/browser/autofill_ai_manager_unittest.cc
@@ -33,9 +33,7 @@ #include "components/autofill/core/common/form_data.h" #include "components/autofill/core/common/form_data_test_api.h" #include "components/autofill/core/common/form_field_data.h" -#include "components/autofill_ai/core/browser/autofill_ai_client.h" #include "components/autofill_ai/core/browser/autofill_ai_manager_test_api.h" -#include "components/autofill_ai/core/browser/mock_autofill_ai_client.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -143,8 +141,6 @@ {autofill::features::kAutofillAiWithDataSchema, autofill::features::kAutofillAiServerModel}, {}); - ON_CALL(client(), GetAutofillClient) - .WillByDefault(ReturnRef(autofill_client_)); autofill_client().GetPersonalDataManager().SetPrefService( autofill_client().GetPrefs()); autofill_client().set_entity_data_manager( @@ -198,7 +194,6 @@ } MockAutofillClient& autofill_client() { return autofill_client_; } - MockAutofillAiClient& client() { return client_; } autofill::EntityDataManager& edm() { return *autofill_client().GetEntityDataManager(); } @@ -212,9 +207,8 @@ autofill::AutofillWebDataServiceTestHelper webdata_helper_{ std::make_unique<autofill::EntityTable>()}; NiceMock<MockAutofillClient> autofill_client_; - NiceMock<MockAutofillAiClient> client_; autofill::TestStrikeDatabase strike_database_; - AutofillAiManager manager_{&client(), &strike_database_}; + AutofillAiManager manager_{&autofill_client(), &strike_database_}; }; // Tests that the user receives a filling suggestion when interacting with
diff --git a/components/autofill_ai/core/browser/metrics/autofill_ai_logger.cc b/components/autofill_ai/core/browser/metrics/autofill_ai_logger.cc index 4d98a8b..9cc8009f 100644 --- a/components/autofill_ai/core/browser/metrics/autofill_ai_logger.cc +++ b/components/autofill_ai/core/browser/metrics/autofill_ai_logger.cc
@@ -32,7 +32,7 @@ } // namespace -AutofillAiLogger::AutofillAiLogger(AutofillAiClient* client) +AutofillAiLogger::AutofillAiLogger(autofill::AutofillClient* client) : ukm_logger_(client) {} AutofillAiLogger::~AutofillAiLogger() = default;
diff --git a/components/autofill_ai/core/browser/metrics/autofill_ai_logger.h b/components/autofill_ai/core/browser/metrics/autofill_ai_logger.h index 5d0841b..463f9cf4 100644 --- a/components/autofill_ai/core/browser/metrics/autofill_ai_logger.h +++ b/components/autofill_ai/core/browser/metrics/autofill_ai_logger.h
@@ -10,7 +10,6 @@ #include "base/memory/raw_ref.h" #include "components/autofill/core/browser/form_structure.h" #include "components/autofill/core/common/unique_ids.h" -#include "components/autofill_ai/core/browser/autofill_ai_client.h" #include "components/autofill_ai/core/browser/metrics/autofill_ai_ukm_logger.h" #include "services/metrics/public/cpp/ukm_source_id.h" @@ -20,7 +19,7 @@ // interactions with forms. class AutofillAiLogger { public: - explicit AutofillAiLogger(AutofillAiClient* client); + explicit AutofillAiLogger(autofill::AutofillClient* client); AutofillAiLogger(const AutofillAiLogger&) = delete; AutofillAiLogger& operator=(const AutofillAiLogger&) = delete; ~AutofillAiLogger();
diff --git a/components/autofill_ai/core/browser/metrics/autofill_ai_logger_unittest.cc b/components/autofill_ai/core/browser/metrics/autofill_ai_logger_unittest.cc index e01fa04..5891438 100644 --- a/components/autofill_ai/core/browser/metrics/autofill_ai_logger_unittest.cc +++ b/components/autofill_ai/core/browser/metrics/autofill_ai_logger_unittest.cc
@@ -30,7 +30,6 @@ #include "components/autofill_ai/core/browser/autofill_ai_manager.h" #include "components/autofill_ai/core/browser/autofill_ai_manager_test_api.h" #include "components/autofill_ai/core/browser/metrics/autofill_ai_ukm_logger.h" -#include "components/autofill_ai/core/browser/mock_autofill_ai_client.h" #include "components/optimization_guide/core/model_execution/model_execution_prefs.h" #include "components/optimization_guide/core/model_quality/test_model_quality_logs_uploader_service.h" #include "components/optimization_guide/proto/features/forms_classifications.pb.h" @@ -106,23 +105,20 @@ class BaseAutofillAiTest : public testing::Test { public: BaseAutofillAiTest() { - ON_CALL(client_, GetAutofillClient) - .WillByDefault(ReturnRef(autofill_client())); autofill_client().set_entity_data_manager( std::make_unique<autofill::EntityDataManager>( webdata_helper_.autofill_webdata_service(), /*history_service=*/nullptr, /*strike_database=*/nullptr)); - manager_ = std::make_unique<AutofillAiManager>(&client_, &strike_database_); + manager_ = std::make_unique<AutofillAiManager>(&autofill_client_, + &strike_database_); } AutofillAiManager& manager() { return *manager_; } void AddOrUpdateEntityInstance(autofill::EntityInstance entity) { - client() - .GetAutofillClient() - .GetEntityDataManager() - ->AddOrUpdateEntityInstance(std::move(entity)); + autofill_client().GetEntityDataManager()->AddOrUpdateEntityInstance( + std::move(entity)); webdata_helper_.WaitUntilIdle(); } @@ -153,7 +149,6 @@ } MockAutofillClient& autofill_client() { return autofill_client_; } - MockAutofillAiClient& client() { return client_; } private: base::test::ScopedFeatureList scoped_feature_list_{ @@ -161,7 +156,6 @@ autofill::test::AutofillUnitTestEnvironment autofill_test_env_; base::test::SingleThreadTaskEnvironment task_environment_; NiceMock<MockAutofillClient> autofill_client_; - NiceMock<MockAutofillAiClient> client_; std::unique_ptr<AutofillAiManager> manager_; autofill::TestStrikeDatabase strike_database_; autofill::AutofillWebDataServiceTestHelper webdata_helper_{
diff --git a/components/autofill_ai/core/browser/metrics/autofill_ai_ukm_logger.cc b/components/autofill_ai/core/browser/metrics/autofill_ai_ukm_logger.cc index c613417..433b775 100644 --- a/components/autofill_ai/core/browser/metrics/autofill_ai_ukm_logger.cc +++ b/components/autofill_ai/core/browser/metrics/autofill_ai_ukm_logger.cc
@@ -99,8 +99,8 @@ } // namespace -AutofillAiUkmLogger::AutofillAiUkmLogger(AutofillAiClient* autofill_client) - : autofill_client_(CHECK_DEREF(autofill_client)) {} +AutofillAiUkmLogger::AutofillAiUkmLogger(autofill::AutofillClient* client) + : client_(CHECK_DEREF(client)) {} AutofillAiUkmLogger::~AutofillAiUkmLogger() = default; @@ -112,10 +112,9 @@ bool edited_autofilled_field, bool opt_in_status) { if (optimization_guide::ModelQualityLogsUploaderService* uploader_ = - autofill_client_->GetAutofillClient().GetMqlsUploadService(); + client_->GetMqlsUploadService(); uploader_ && autofill::MayPerformAutofillAiAction( - autofill_client_->GetAutofillClient(), - autofill::AutofillAiAction::kLogToMqls)) { + *client_, autofill::AutofillAiAction::kLogToMqls)) { // Note that the actual logging of the metric happens when `log_entry` goes // out of scope and is destroyed. optimization_guide::ModelQualityLogEntry log_entry(uploader_->GetWeakPtr()); @@ -160,7 +159,7 @@ if (suggestion_filled) { builder.SetFillingCorrectness(!edited_autofilled_field); } - builder.Record(autofill_client_->GetAutofillClient().GetUkmRecorder()); + builder.Record(client_->GetUkmRecorder()); } void AutofillAiUkmLogger::LogFieldEvent(ukm::SourceId ukm_source_id, @@ -179,18 +178,15 @@ autofill::UNKNOWN_TYPE)); if (optimization_guide::ModelQualityLogsUploaderService* uploader_ = - autofill_client_->GetAutofillClient().GetMqlsUploadService(); + client_->GetMqlsUploadService(); uploader_ && autofill::MayPerformAutofillAiAction( - autofill_client_->GetAutofillClient(), - autofill::AutofillAiAction::kLogToMqls)) { + *client_, autofill::AutofillAiAction::kLogToMqls)) { // Note that the actual logging of the metric happens when `log_entry` goes // out of scope and is destroyed. Also note that in this case it is not // necessary to check if the user is opted in because it is assumed that all // field event types can only occur if the user is opted in for Autofill AI. optimization_guide::ModelQualityLogEntry log_entry( - autofill_client_->GetAutofillClient() - .GetMqlsUploadService() - ->GetWeakPtr()); + client_->GetMqlsUploadService()->GetWeakPtr()); optimization_guide::proto::AutofillAiFieldEvent* mqls_field_event = log_entry.log_ai_data_request() @@ -233,11 +229,11 @@ .SetFieldType(field_type) .SetAiFieldType(ai_field_type) .SetEventType(base::to_underlying(event_type)) - .Record(autofill_client_->GetAutofillClient().GetUkmRecorder()); + .Record(client_->GetUkmRecorder()); } bool AutofillAiUkmLogger::CanLogUkm(ukm::SourceId ukm_source_id) const { - return autofill_client_->GetAutofillClient().GetUkmRecorder() != nullptr && + return client_->GetUkmRecorder() != nullptr && ukm_source_id != ukm::kInvalidSourceId; }
diff --git a/components/autofill_ai/core/browser/metrics/autofill_ai_ukm_logger.h b/components/autofill_ai/core/browser/metrics/autofill_ai_ukm_logger.h index 9021150..75d08d0 100644 --- a/components/autofill_ai/core/browser/metrics/autofill_ai_ukm_logger.h +++ b/components/autofill_ai/core/browser/metrics/autofill_ai_ukm_logger.h
@@ -11,16 +11,18 @@ #include "components/autofill/core/browser/data_model/autofill_ai/entity_type.h" #include "components/autofill/core/browser/form_structure.h" #include "components/autofill/core/common/unique_ids.h" -#include "components/autofill_ai/core/browser/autofill_ai_client.h" #include "services/metrics/public/cpp/ukm_source_id.h" +namespace autofill { +class AutofillClient; +} namespace autofill_ai { // Utility to log URL keyed form interaction events for Autofill AI. // Owned by AutofillAiLogger. class AutofillAiUkmLogger { public: - explicit AutofillAiUkmLogger(AutofillAiClient* autofill_client); + explicit AutofillAiUkmLogger(autofill::AutofillClient* client); ~AutofillAiUkmLogger(); void LogKeyMetrics(ukm::SourceId ukm_source_id, @@ -56,7 +58,7 @@ // The top owning client. Note that the client owns the AutofillAiManager that // owns the AutofillAiLogger that owns this object. - const raw_ref<AutofillAiClient> autofill_client_; + const raw_ref<autofill::AutofillClient> client_; }; } // namespace autofill_ai
diff --git a/components/autofill_ai/core/browser/mock_autofill_ai_client.cc b/components/autofill_ai/core/browser/mock_autofill_ai_client.cc deleted file mode 100644 index 96e023af..0000000 --- a/components/autofill_ai/core/browser/mock_autofill_ai_client.cc +++ /dev/null
@@ -1,13 +0,0 @@ -// Copyright 2024 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/autofill_ai/core/browser/mock_autofill_ai_client.h" - -namespace autofill_ai { - -MockAutofillAiClient::MockAutofillAiClient() = default; - -MockAutofillAiClient::~MockAutofillAiClient() = default; - -} // namespace autofill_ai
diff --git a/components/autofill_ai/core/browser/mock_autofill_ai_client.h b/components/autofill_ai/core/browser/mock_autofill_ai_client.h deleted file mode 100644 index 9be3bd37..0000000 --- a/components/autofill_ai/core/browser/mock_autofill_ai_client.h +++ /dev/null
@@ -1,27 +0,0 @@ -// Copyright 2024 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_AUTOFILL_AI_CORE_BROWSER_MOCK_AUTOFILL_AI_CLIENT_H_ -#define COMPONENTS_AUTOFILL_AI_CORE_BROWSER_MOCK_AUTOFILL_AI_CLIENT_H_ - -#include "components/autofill/core/browser/data_model/autofill_ai/entity_instance.h" -#include "components/autofill_ai/core/browser/autofill_ai_client.h" -#include "testing/gmock/include/gmock/gmock.h" - -namespace autofill_ai { - -class MockAutofillAiClient : public AutofillAiClient { - public: - MockAutofillAiClient(); - MockAutofillAiClient(const MockAutofillAiClient&) = delete; - MockAutofillAiClient& operator=(const MockAutofillAiClient&) = delete; - ~MockAutofillAiClient() override; - - MOCK_METHOD(autofill::AutofillClient&, GetAutofillClient, (), (override)); - MOCK_METHOD(AutofillAiManager&, GetManager, (), (override)); -}; - -} // namespace autofill_ai - -#endif // COMPONENTS_AUTOFILL_AI_CORE_BROWSER_MOCK_AUTOFILL_AI_CLIENT_H_
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb index 6c04d981..983dfb6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Kry jou geskiedenis op al jou toestelle sodat jy maklik kan voortgaan waar jy opgehou het</translation> <translation id="5749158352074143502">Gaan voort met hierdie oortjie</translation> <translation id="5750869797196646528">Handnasporing</translation> +<translation id="5753570386948603678">Vee uit in geskiedenis</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> word geblokkeer</translation> <translation id="5804241973901381774">Toestemmings</translation> <translation id="5822675474983796325">Pasmaak die onderste blad van jou Nuwe Oortjie-bladsy is teen volle hoogte oopgemaak</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Nee, dankie</translation> <translation id="7804248752222191302">'n Werf gebruik tans jou kamera</translation> <translation id="7807060072011926525">Verskaf deur Google</translation> +<translation id="7815680994978050279">Gevaarlike aflaai is geblokkeer</translation> <translation id="7835852323729233924">Speel tans media</translation> <translation id="783819812427904514">Ontdemp video</translation> <translation id="7846076177841592234">Kanselleer keuse</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb index 53c7786..8e7c145 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">በቀላሉ ካቆሙበት መቀጠል እንዲችሉ ታሪክዎን በሁሉም መሣሪያዎችዎ ላይ ያብሩ</translation> <translation id="5749158352074143502">በዚህ ትር ላይ ይቀጥሉ</translation> <translation id="5750869797196646528">የእጅ ክትትል</translation> +<translation id="5753570386948603678">ከታሪክ ሰርዝ</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> ታግዷል</translation> <translation id="5804241973901381774">ፍቃዶች</translation> <translation id="5822675474983796325">የእርስዎ አዲስ የትር ገፅ የግርጌ ሉህ በሙሉ ቁመት እንደተከፈተ ያብጁ</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">አይ፣ አመሰግናለሁ</translation> <translation id="7804248752222191302">አንድ ጣቢያ ካሜራዎን እየተጠቀመ ነው</translation> <translation id="7807060072011926525">በGoogle የቀረበ</translation> +<translation id="7815680994978050279">አደገኛ ውርድ ታግዷል</translation> <translation id="7835852323729233924">ሚዲያን በማጫወት ላይ</translation> <translation id="783819812427904514">የቪዲዮን ድምጸ-ከል አንሳ</translation> <translation id="7846076177841592234">ምርጫ ሰርዝ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb index 54559dc9..906ec60 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -390,6 +390,7 @@ <translation id="5743425052258407233">يمكنك الوصول إلى سجلّ التصفّح على جميع أجهزتك لمواصلة التصفّح من حيث توقفت</translation> <translation id="5749158352074143502">المتابعة باستخدام علامة التبويب هذه</translation> <translation id="5750869797196646528">تتبُّع اليد</translation> +<translation id="5753570386948603678">الحذف من السجلّ</translation> <translation id="5771720122942595109">تم حظر <ph name="PERMISSION_1" />.</translation> <translation id="5804241973901381774">الأذونات</translation> <translation id="5822675474983796325">تم فتح البطاقة السفلية لتخصيص صفحة علامة التبويب الجديدة بطول الشاشة</translation> @@ -541,6 +542,7 @@ <translation id="780301667611848630">لا، شكرًا</translation> <translation id="7804248752222191302">هناك موقع إلكتروني يستخدم الكاميرا.</translation> <translation id="7807060072011926525">خلاصة مقدَّمة من Google</translation> +<translation id="7815680994978050279">تم حظر عملية تنزيل خطيرة</translation> <translation id="7835852323729233924">تشغيل الوسائط</translation> <translation id="783819812427904514">إعادة صوت الفيديو</translation> <translation id="7846076177841592234">إلغاء الاختيار</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb index e4d103d..bf8487b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">আপোনাৰ আটাইবোৰ ডিভাইচত আপোনাৰ ইতিহাস লাভ কৰক, যাতে আপুনি য’ত এৰিছিল তাৰ পৰাই সহজে আৰম্ভ কৰিব পাৰে</translation> <translation id="5749158352074143502">এই টেবটোৰ জৰিয়তে অব্যাহত ৰাখক</translation> <translation id="5750869797196646528">হাতৰ ট্ৰেকিং</translation> +<translation id="5753570386948603678">ইতিহাসৰ পৰা মচক</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" />ক অৱৰোধ কৰা আছে</translation> <translation id="5804241973901381774">অনুমতি</translation> <translation id="5822675474983796325">আপোনাৰ নতুন টেবৰ পৃষ্ঠাৰ তলৰ শ্বীটখন কাষ্টমাইজ কৰাটো পূৰ্ণ উচ্চতাত খোলা হৈছে</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">নালাগে, ধন্যবাদ</translation> <translation id="7804248752222191302">এটা ছাইটে আপোনাৰ কেমেৰা ব্যৱহাৰ কৰি আছে</translation> <translation id="7807060072011926525">Googleএ প্ৰদান কৰিছে</translation> +<translation id="7815680994978050279">ক্ষতিকাৰক সমলৰ ডাউনল’ড অৱৰোধ কৰা হৈছে</translation> <translation id="7835852323729233924">মিডিয়া প্লে’ হৈ আছে</translation> <translation id="783819812427904514">ভিডিঅ' আনমিউট কৰক</translation> <translation id="7846076177841592234">বাছনি বাতিল কৰক</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb index d8149ebb..e92332c9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Qaldığınız yerdən asanlıqla davam edə bilmək üçün tarixçəni bütün cihazlarda əldə edin</translation> <translation id="5749158352074143502">Bu tab ilə davam edin</translation> <translation id="5750869797196646528">Əlin izlənilməsi</translation> +<translation id="5753570386948603678">Tarixçədən silin</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> bloklanıb</translation> <translation id="5804241973901381774">İcazələr</translation> <translation id="5822675474983796325">Yeni tab səhifəsinin tam hündürlükdə açılmış aşağıdakı vərəqini fərdiləşdirin</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Yox, çox sağ olun</translation> <translation id="7804248752222191302">Sayt kameranızdan istifadə edir</translation> <translation id="7807060072011926525">Google tərəfindən təmin edilib</translation> +<translation id="7815680994978050279">Təhlükəli endirmə blok edildi</translation> <translation id="7835852323729233924">Medianın oxudulması</translation> <translation id="783819812427904514">Videonu səssiz rejimdən çıxarın</translation> <translation id="7846076177841592234">Seçimi ləğv edin</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb index 854de996..d13018e8a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Сінхранізуйце гісторыю на ўсіх прыладах, каб вы маглі заўсёды працягнуць з месца, на якім спыніліся</translation> <translation id="5749158352074143502">Працягвайце працу з гэтай укладкай</translation> <translation id="5750869797196646528">Адсочванне рухаў рук</translation> +<translation id="5753570386948603678">Выдаліць з гісторыі</translation> <translation id="5771720122942595109">Заблакіравана: <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Дазволы</translation> <translation id="5822675474983796325">Ніжні аркуш "Наладзіць старонку новай укладкі" адкрыты на ўвесь экран</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Не, дзякуй</translation> <translation id="7804248752222191302">Сайт выкарыстоўвае камеру</translation> <translation id="7807060072011926525">Ад кампаніі Google</translation> +<translation id="7815680994978050279">Небяспечная спампоўка заблакіравана</translation> <translation id="7835852323729233924">Прайграванне мультымедыя</translation> <translation id="783819812427904514">Уключыць гук відэа</translation> <translation id="7846076177841592234">Скасаваць выбар</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb index 64f02c2..550b50e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Получете историята си на всичките си устройства, за да можете лесно да продължите оттам, откъдето сте прекъснали</translation> <translation id="5749158352074143502">Продължаване с този раздел</translation> <translation id="5750869797196646528">Проследяване на ръцете</translation> +<translation id="5753570386948603678">Изтриване от историята</translation> <translation id="5771720122942595109">Достъпът до <ph name="PERMISSION_1" /> е блокиран</translation> <translation id="5804241973901381774">Разрешения</translation> <translation id="5822675474983796325">Персонализирането на долния лист на новия раздел е отворено на пълната височина</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Не, благодаря</translation> <translation id="7804248752222191302">Сайт използва камерата ви</translation> <translation id="7807060072011926525">Предоставено от Google</translation> +<translation id="7815680994978050279">Блокирано е опасно изтегляне</translation> <translation id="7835852323729233924">Възпроизвеждане на мултимедия</translation> <translation id="783819812427904514">С образ</translation> <translation id="7846076177841592234">Анулиране на избора</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb index f7743306..62b4f91 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">আপনার সবকটি ডিভাইস থেকে ইতিহাস দেখুন, যাতে আপনি সহজেই যেখানে শেষ করেছেন সেখান থেকেই শুরু করতে পারেন</translation> <translation id="5749158352074143502">এই ট্যাবের মাধ্যমে চালিয়ে যান</translation> <translation id="5750869797196646528">হ্যান্ড ট্র্যাকিং</translation> +<translation id="5753570386948603678">সার্চ ইতিহাস থেকে মুছে ফেলুন</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> ব্লক করা হয়েছে</translation> <translation id="5804241973901381774">অনুমতিগুলি</translation> <translation id="5822675474983796325">আপনার 'নতুন ট্যাব' পৃষ্ঠা কাস্টমাইজ করার জন্য স্ক্রিনের নিচে অ্যাটাচ করা শিট ফুল স্ক্রিনে খোলা আছে</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">না থাক</translation> <translation id="7804248752222191302">একটি সাইট আপনার ক্যামেরা ব্যবহার করছে</translation> <translation id="7807060072011926525">Google-এর প্রদান করা ফিড</translation> +<translation id="7815680994978050279">ক্ষতিকারক ডাউনলোড ব্লক করা হয়েছে</translation> <translation id="7835852323729233924">মিডিয়া চালানো হচ্ছে</translation> <translation id="783819812427904514">ভিডিওটি আনমিউট করুন</translation> <translation id="7846076177841592234">নির্বাচন বাতিল করুন</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb index fc498c3a..9232918c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Dobijajte historiju na svim svojim uređajima da možete lako nastaviti tamo gdje ste stali</translation> <translation id="5749158352074143502">Nastavi s ovom karticom</translation> <translation id="5750869797196646528">Praćenje ruku</translation> +<translation id="5753570386948603678">Izbriši iz historije</translation> <translation id="5771720122942595109">Blokirano: <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Odobrenja</translation> <translation id="5822675474983796325">Donja tabela prilagođavanja stranice nove kartice je otvorena u punoj visini</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Ne, hvala</translation> <translation id="7804248752222191302">Web lokacija koristi vašu kameru</translation> <translation id="7807060072011926525">Pruža Google</translation> +<translation id="7815680994978050279">Opasno preuzimanje je blokirano</translation> <translation id="7835852323729233924">Reproduciranje medija</translation> <translation id="783819812427904514">Uključi zvuk videozapisa</translation> <translation id="7846076177841592234">Otkazivanje odabira</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb index 94cd7c2..c1ce58ed 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Obtén l'historial en tots els teus dispositius perquè puguis continuar fàcilment des d'on ho vas deixar</translation> <translation id="5749158352074143502">Continua amb aquesta pestanya</translation> <translation id="5750869797196646528">Seguiment de mans</translation> +<translation id="5753570386948603678">Suprimeix de l'historial</translation> <translation id="5771720122942595109">S'ha bloquejat <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Permisos</translation> <translation id="5822675474983796325">Full inferior de personalització de la pàgina Pestanya nova obert a alçada completa</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">No, gràcies</translation> <translation id="7804248752222191302">Un lloc web està utilitzant la càmera</translation> <translation id="7807060072011926525">Proporcionat per Google</translation> +<translation id="7815680994978050279">S'ha bloquejat una baixada perillosa</translation> <translation id="7835852323729233924">Reproduint contingut multimèdia</translation> <translation id="783819812427904514">Deixa de silenciar el vídeo</translation> <translation id="7846076177841592234">Cancel·la la selecció</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb index 1d7db5f..f336b20 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Synchronizujte svou historii do všech svých zařízení, abyste mohli snadno pokračovat, kde jste přestali</translation> <translation id="5749158352074143502">Pokračovat s touto kartou</translation> <translation id="5750869797196646528">Sledování rukou</translation> +<translation id="5753570386948603678">Vymazat z historie</translation> <translation id="5771720122942595109">Oprávnění <ph name="PERMISSION_1" /> je zablokováno</translation> <translation id="5804241973901381774">Oprávnění</translation> <translation id="5822675474983796325">Spodní panel Přizpůsobení stránky Nová karta otevřený na celou výšku</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Ne, děkuji</translation> <translation id="7804248752222191302">Web používá váš fotoaparát</translation> <translation id="7807060072011926525">Poskytuje Google</translation> +<translation id="7815680994978050279">Bylo zablokováno stahování nebezpečného souboru</translation> <translation id="7835852323729233924">Přehrávání médií</translation> <translation id="783819812427904514">Zapnout zvuk videa</translation> <translation id="7846076177841592234">Zrušit výběr</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb index 63a2d37..d9b0b80 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Cewch eich hanes ar eich holl ddyfeisiau, fel y barhau â'r hyn yr oeddech yn ei wneud yn hawdd</translation> <translation id="5749158352074143502">Parhau gyda'r tab hwn</translation> <translation id="5750869797196646528">Olrhain dwylo</translation> +<translation id="5753570386948603678">Dileu o hanes</translation> <translation id="5771720122942595109">Rhwystrwyd <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Caniatadau</translation> <translation id="5822675474983796325">Dalen waelod addasu eich tudalen tab newydd wedi'i hagor ar uchder llawn</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Dim diolch</translation> <translation id="7804248752222191302">Mae gwefan yn defnyddio'ch camera</translation> <translation id="7807060072011926525">Darperir gan Google</translation> +<translation id="7815680994978050279">Rhwystrwyd lawrlwythiad peryglus</translation> <translation id="7835852323729233924">Chwarae cyfryngau</translation> <translation id="783819812427904514">Dad-ddistewi'r fideo</translation> <translation id="7846076177841592234">Canslo dewis</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb index f30baae6..77028be 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Se din historik på alle dine enheder, så du nemt kan fortsætte, hvor du slap</translation> <translation id="5749158352074143502">Fortsæt med denne fane</translation> <translation id="5750869797196646528">Registrering af håndbevægelser</translation> +<translation id="5753570386948603678">Slet fra historik</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> blev blokeret</translation> <translation id="5804241973901381774">Tilladelser</translation> <translation id="5822675474983796325">Feltet i bunden med tilpasning af siden Ny fane er åbnet i fuld højde</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Nej tak</translation> <translation id="7804248752222191302">Et website anvender dit kamera</translation> <translation id="7807060072011926525">Leveret af Google</translation> +<translation id="7815680994978050279">En farlig download blev blokeret</translation> <translation id="7835852323729233924">Afspilning af medier</translation> <translation id="783819812427904514">Slå lyden i videoen til</translation> <translation id="7846076177841592234">Annuller valg</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb index 807438e..fa0e691 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Du kannst deinen Verlauf auf allen deinen Geräten abrufen und ganz einfach dort weitermachen, wo du vorher aufgehört hast</translation> <translation id="5749158352074143502">Mit diesem Tab fortfahren</translation> <translation id="5750869797196646528">Handtracking</translation> +<translation id="5753570386948603678">Aus Verlauf löschen</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> blockiert</translation> <translation id="5804241973901381774">Berechtigungen</translation> <translation id="5822675474983796325">Ansicht am unteren Rand für „Seite ‚Neuer Tab‘ anpassen“ ist vollständig geöffnet</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Nein, danke</translation> <translation id="7804248752222191302">Eine Website verwendet deine Kamera</translation> <translation id="7807060072011926525">Von Google bereitgestellt</translation> +<translation id="7815680994978050279">Gefährlicher Download blockiert</translation> <translation id="7835852323729233924">Medien werden wiedergegeben</translation> <translation id="783819812427904514">Stummschaltung des Videos aufheben</translation> <translation id="7846076177841592234">Auswahl aufheben</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb index 54d03875..cdf71983 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Μεταφέρετε το ιστορικό σας σε όλες τις συσκευές σας, για να μπορείτε να συνεχίσετε εύκολα από εκεί που σταματήσατε</translation> <translation id="5749158352074143502">Συνέχεια με αυτή την καρτέλα</translation> <translation id="5750869797196646528">Παρακολούθηση κινήσεων των χεριών</translation> +<translation id="5753570386948603678">Διαγραφή από το ιστορικό</translation> <translation id="5771720122942595109">Η άδεια <ph name="PERMISSION_1" /> αποκλείστηκε.</translation> <translation id="5804241973901381774">Άδειες</translation> <translation id="5822675474983796325">Το φύλλο κάτω μέρους για την προσαρμογή της σελίδας νέας καρτέλας άνοιξε σε πλήρες ύψος</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Όχι, ευχαριστώ</translation> <translation id="7804248752222191302">Ένας ιστότοπος χρησιμοποιεί την κάμερά σας.</translation> <translation id="7807060072011926525">Παρέχεται από την Google</translation> +<translation id="7815680994978050279">Αποκλεισμός επικίνδυνης λήψης</translation> <translation id="7835852323729233924">Αναπαραγωγή πολυμέσων</translation> <translation id="783819812427904514">Κατάργηση σίγασης βίντεο</translation> <translation id="7846076177841592234">Ακύρωση επιλογής</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb index 4b06972..8a9d97e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Get your history on all your devices, so that you can easily pick up where you left off</translation> <translation id="5749158352074143502">Continue with this tab</translation> <translation id="5750869797196646528">Hand tracking</translation> +<translation id="5753570386948603678">Delete from history</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> blocked</translation> <translation id="5804241973901381774">Permissions</translation> <translation id="5822675474983796325">Customise your new tab page bottom sheet opened at full height</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">No, thanks</translation> <translation id="7804248752222191302">A site is using your camera</translation> <translation id="7807060072011926525">Provided by Google</translation> +<translation id="7815680994978050279">Dangerous download blocked</translation> <translation id="7835852323729233924">Playing media</translation> <translation id="783819812427904514">Unmute video</translation> <translation id="7846076177841592234">Cancel selection</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb index 6844c6a9..187a090 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Obtén tu historial en todos los dispositivos para que puedas retomar fácilmente la navegación</translation> <translation id="5749158352074143502">Continuar en esta pestaña</translation> <translation id="5750869797196646528">Seguimiento de manos</translation> +<translation id="5753570386948603678">Borrar del historial</translation> <translation id="5771720122942595109">Bloqueado: <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Permisos</translation> <translation id="5822675474983796325">Hoja inferior de personalización de la página de nueva pestaña abierta en tamaño completo</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">No, gracias</translation> <translation id="7804248752222191302">Un sitio está utilizando la cámara</translation> <translation id="7807060072011926525">Proporcionado por Google</translation> +<translation id="7815680994978050279">Se bloqueó una descarga peligrosa</translation> <translation id="7835852323729233924">Reproduciendo contenido multimedia</translation> <translation id="783819812427904514">Activar sonido del video</translation> <translation id="7846076177841592234">Cancelar la selección</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb index 1782694..15d0af2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Accede a tu historial en todos tus dispositivos para retomar fácilmente lo que estabas haciendo</translation> <translation id="5749158352074143502">Continuar con esta pestaña</translation> <translation id="5750869797196646528">Seguimiento de manos</translation> +<translation id="5753570386948603678">Eliminar del historial</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> bloqueado</translation> <translation id="5804241973901381774">Permisos</translation> <translation id="5822675474983796325">Hoja inferior de Personalizar la página Nueva pestaña abierta a altura completa</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">No, gracias</translation> <translation id="7804248752222191302">Un sitio web está usando tu cámara</translation> <translation id="7807060072011926525">Proporcionado por Google</translation> +<translation id="7815680994978050279">Descarga peligrosa bloqueada</translation> <translation id="7835852323729233924">Reproduciendo contenido multimedia</translation> <translation id="783819812427904514">Dejar de silenciar vídeo</translation> <translation id="7846076177841592234">Cancelar selección</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb index a1d9ffe4..c4e0a961 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Hankige oma ajalugu kõikides seadmetes, et saaksite lihtsalt jätkata sealt, kus pooleli jäite</translation> <translation id="5749158352074143502">Jätka selle vahekaardiga</translation> <translation id="5750869797196646528">Käeliigutuste jälgimine</translation> +<translation id="5753570386948603678">Kustuta ajaloost</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> on keelatud</translation> <translation id="5804241973901381774">Load</translation> <translation id="5822675474983796325">Uue vahelehe kohandamise alumine leht on avatud täispikkuses</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Tänan, ei</translation> <translation id="7804248752222191302">Sait kasutab teie kaamerat</translation> <translation id="7807060072011926525">Pakub Google</translation> +<translation id="7815680994978050279">Ohtlik allalaadimine blokeeriti</translation> <translation id="7835852323729233924">Meedia esitamine</translation> <translation id="783819812427904514">Video vaigistuse tühistamine</translation> <translation id="7846076177841592234">Tühista valik</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb index c9e546f..2cdbe1a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Eduki zure historia gailu guztietan, utzi zenuen tokitik erraz jarraitzeko</translation> <translation id="5749158352074143502">Egin aurrera fitxa honekin</translation> <translation id="5750869797196646528">Eskuen jarraipena</translation> +<translation id="5753570386948603678">Ezabatu historiatik</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> blokeatu egin da</translation> <translation id="5804241973901381774">Baimenak</translation> <translation id="5822675474983796325">Fitxa berriaren orria pertsonalizatzeko pantailaren behealdean ainguratutako orria altuera osoan ireki da</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Ez, eskerrik asko</translation> <translation id="7804248752222191302">Webgune bat kamera erabiltzen ari da</translation> <translation id="7807060072011926525">Google-k eman du</translation> +<translation id="7815680994978050279">Deskarga arriskutsu bat blokeatu da</translation> <translation id="7835852323729233924">Multimedia-edukia erreproduzitzen</translation> <translation id="783819812427904514">Aktibatu bideoaren audioa</translation> <translation id="7846076177841592234">Utzi hautapena bertan behera</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb index c95648b9..f53209c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">در همه دستگاههایتان سابقه را دریافت میکنید تا بتوانید بهراحتی کارتان از جایی که متوقف کردید ادامه دهید</translation> <translation id="5749158352074143502">ادامه کار با این برگه</translation> <translation id="5750869797196646528">ردیابی دست</translation> +<translation id="5753570386948603678">حذف از سابقه</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> مسدود شد</translation> <translation id="5804241973901381774">اجازهها</translation> <translation id="5822675474983796325">برگ زیرین «سفارشیسازی صفحه برگه جدید» بهطور کامل باز شده است</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">نه متشکرم</translation> <translation id="7804248752222191302">سایتی درحال استفاده از دوربینتان است</translation> <translation id="7807060072011926525">ارائه از Google</translation> +<translation id="7815680994978050279">بارگیری خطرناک مسدود شد</translation> <translation id="7835852323729233924">درحال پخش رسانه</translation> <translation id="783819812427904514">با صدا کردن ویدیو</translation> <translation id="7846076177841592234">لغو انتخاب</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb index 2882f11..9749d74 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Historia löytyy kaikilta laitteilta, joten voit helposti jatkaa siitä, mihin jäit</translation> <translation id="5749158352074143502">Jatka tällä välilehdellä</translation> <translation id="5750869797196646528">Käsien seuranta</translation> +<translation id="5753570386948603678">Poista historiasta</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> estetty</translation> <translation id="5804241973901381774">Luvat</translation> <translation id="5822675474983796325">"Muuta Uusi välilehti ‑sivua" -alapaneeli avattu koko näytölle</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Ei kiitos</translation> <translation id="7804248752222191302">Sivusto käyttää kameraasi</translation> <translation id="7807060072011926525">Googlen tarjoama</translation> +<translation id="7815680994978050279">Vaarallinen lataus estettiin</translation> <translation id="7835852323729233924">Toistetaan mediaa</translation> <translation id="783819812427904514">Poista videon mykistys</translation> <translation id="7846076177841592234">Peru valinta</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb index aa0a034..86089650 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Makuha ang iyong history sa lahat ng device mo, para madali kang makapagpatuloy sa kung saan ka huminto</translation> <translation id="5749158352074143502">Magpatuloy sa tab na ito</translation> <translation id="5750869797196646528">Pag-track sa kamay</translation> +<translation id="5753570386948603678">I-delete sa history</translation> <translation id="5771720122942595109">Naka-block ang <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Mga Pahintulot</translation> <translation id="5822675474983796325">Binuksan nang buo ang bottom sheet ng pag-customize ng page ng bagong tab mo</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Hindi salamat</translation> <translation id="7804248752222191302">Ginagamit ng isang site ang iyong camera</translation> <translation id="7807060072011926525">Ibinibigay ng Google</translation> +<translation id="7815680994978050279">Na-block ang mapanganib na download</translation> <translation id="7835852323729233924">Nagpe-play ng media</translation> <translation id="783819812427904514">I-unmute ang video</translation> <translation id="7846076177841592234">Kanselahin ang pinili</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb index c39046e..9ca57b9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Accédez à votre historique sur tous vos appareils, pour reprendre facilement là où vous en étiez</translation> <translation id="5749158352074143502">Continuer avec cet onglet</translation> <translation id="5750869797196646528">Suivi des mains</translation> +<translation id="5753570386948603678">Supprimer de l'historique</translation> <translation id="5771720122942595109">Autorisation <ph name="PERMISSION_1" /> bloquée</translation> <translation id="5804241973901381774">Autorisations</translation> <translation id="5822675474983796325">Zone de contenu dans le bas de l'écran de Personnaliser votre page Nouvel onglet ouverte à pleine hauteur</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Non merci</translation> <translation id="7804248752222191302">Un site utilise votre appareil photo</translation> <translation id="7807060072011926525">Fourni par Google</translation> +<translation id="7815680994978050279">Téléchargement dangereux bloqué</translation> <translation id="7835852323729233924">Élém. multim. en cours de lecture</translation> <translation id="783819812427904514">Réactiver le son de la vidéo</translation> <translation id="7846076177841592234">Annuler la sélection</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb index b7999a1..2f3364d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Accédez à votre historique sur tous vos appareils pour reprendre facilement là où vous vous étiez arrêté</translation> <translation id="5749158352074143502">Continuer avec cet onglet</translation> <translation id="5750869797196646528">Suivi des mains</translation> +<translation id="5753570386948603678">Supprimer de l'historique</translation> <translation id="5771720122942595109">Autorisation refusée : <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Autorisations</translation> <translation id="5822675474983796325">Bottom sheet de personnalisation de la page Nouvel onglet ouverte à pleine hauteur</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Non, merci</translation> <translation id="7804248752222191302">Un site utilise actuellement votre appareil photo</translation> <translation id="7807060072011926525">Fourni par Google</translation> +<translation id="7815680994978050279">Téléchargement dangereux bloqué</translation> <translation id="7835852323729233924">Contenu en cours de lecture</translation> <translation id="783819812427904514">Réactiver le son de la vidéo</translation> <translation id="7846076177841592234">Annuler la sélection</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb index cb5c345a..122206c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Accede ao teu historial en todos os teus dispositivos para que poidas continuar onde o deixaches</translation> <translation id="5749158352074143502">Continuar con esta pestana</translation> <translation id="5750869797196646528">Seguimento das mans</translation> +<translation id="5753570386948603678">Eliminar do historial</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> (bloqueado)</translation> <translation id="5804241973901381774">Permisos</translation> <translation id="5822675474983796325">Panel inferior de Personaliza a páxina Nova pestana aberto a altura completa</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Non, grazas</translation> <translation id="7804248752222191302">Un sitio está utilizando a cámara</translation> <translation id="7807060072011926525">Ofrecido por Google</translation> +<translation id="7815680994978050279">Bloqueouse unha descarga perigosa</translation> <translation id="7835852323729233924">Reproducindo contido multimedia</translation> <translation id="783819812427904514">Activar o son do vídeo</translation> <translation id="7846076177841592234">Cancelar selección</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb index 383786a..5fe07a3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">તમારા બધા ડિવાઇસ પર તમારો ઇતિહાસ મેળવો, જેથી તમે જ્યાંથી છોડ્યું હોય ત્યાંથી સરળતાથી શરૂ કરી શકો</translation> <translation id="5749158352074143502">આ ટૅબ સાથે આગળ ચાલુ રાખો</translation> <translation id="5750869797196646528">હાથ ટ્રૅક કરવાની સુવિધા</translation> +<translation id="5753570386948603678">ઇતિહાસમાંથી ડિલીટ કરો</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> બ્લૉક કરી</translation> <translation id="5804241973901381774">પરવાનગીઓ</translation> <translation id="5822675474983796325">'તમારું નવું ટૅબ પેજ કસ્ટમાઇઝ કરો'ની બોટમ શીટ સંપૂર્ણ ઊંચાઈએ ખોલવામાં આવી</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">ના, આભાર</translation> <translation id="7804248752222191302">કોઈ સાઇટ તમારા કૅમેરાનો ઉપયોગ કરી રહી છે</translation> <translation id="7807060072011926525">Google દ્વારા પ્રદાન કરાયેલું</translation> +<translation id="7815680994978050279">જોખમી ડાઉનલોડને અવરોધ્યું</translation> <translation id="7835852323729233924">મીડિયા ચલાવી રહ્યાં છીએ</translation> <translation id="783819812427904514">વીડિયોને અનમ્યૂટ કરો</translation> <translation id="7846076177841592234">પસંદગી રદ કરો</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb index f00d2ff..522789e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">अपने सभी डिवाइसों पर अपना ब्राउज़िंग इतिहास देखें, ताकि जहां आपने पिछली बार छोड़ा था वहीं से शुरू कर सकें</translation> <translation id="5749158352074143502">इस टैब के साथ जारी रखें</translation> <translation id="5750869797196646528">हाथ ट्रैक करने की सुविधा</translation> +<translation id="5753570386948603678">इतिहास से मिटाएं</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> को ब्लॉक किया गया</translation> <translation id="5804241973901381774">अनुमतियां</translation> <translation id="5822675474983796325">'नया टैब' पेज को कस्टमाइज़ करने की जानकारी देने वाली बॉटम शीट, पूरी स्क्रीन पर खोल दी गई है</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">नहीं, रहने दें</translation> <translation id="7804248752222191302">कोई साइट आपका कैमरा इस्तेमाल कर रही है</translation> <translation id="7807060072011926525">Google से मिला फ़ीड</translation> +<translation id="7815680994978050279">खतरनाक डाउनलोड अवरोधित किया गया</translation> <translation id="7835852323729233924">चलाया जा रहा मीडिया</translation> <translation id="783819812427904514">वीडियो अनम्यूट करें</translation> <translation id="7846076177841592234">चुना गया हटाएं</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb index 37bb7a7c..77b38fd 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Dohvatite svoju povijest na svim svojim uređajima kako biste lako nastavili tamo gdje ste stali</translation> <translation id="5749158352074143502">Nastavi s ovom karticom</translation> <translation id="5750869797196646528">Praćenje pokreta ruku</translation> +<translation id="5753570386948603678">Izbrišite iz povijesti</translation> <translation id="5771720122942595109">Blokirano je dopuštenje <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Dopuštenja</translation> <translation id="5822675474983796325">Prilagodba donje tablice stranice nove kartice otvorena je u punoj visini</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Ne, hvala</translation> <translation id="7804248752222191302">Web-lokacija upotrebljava vašu kameru</translation> <translation id="7807060072011926525">Omogućuje Google</translation> +<translation id="7815680994978050279">Blokirano je opasno preuzimanje</translation> <translation id="7835852323729233924">Reprodukcija medija</translation> <translation id="783819812427904514">Uključi kameru</translation> <translation id="7846076177841592234">Poništi odabir</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb index e97b77bb..6ede65f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Előzményeihez minden eszközén hozzáférhet, így könnyen folytathatja ott, ahol abbahagyta</translation> <translation id="5749158352074143502">Folytatás ezen a lapon</translation> <translation id="5750869797196646528">Kézmozgás követése</translation> +<translation id="5753570386948603678">Törlés az előzmények közül</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> letiltva</translation> <translation id="5804241973901381774">Engedélyek</translation> <translation id="5822675474983796325">Az Új lap oldal alsó lapjának személyre szabása teljes magasságban megnyitva</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Köszönöm, nem</translation> <translation id="7804248752222191302">Egy webhely használja az Ön kameráját</translation> <translation id="7807060072011926525">A Google biztosítja</translation> +<translation id="7815680994978050279">Veszélyes letöltés letiltva</translation> <translation id="7835852323729233924">Médiatartalom lejátszása…</translation> <translation id="783819812427904514">Videó némításának feloldása</translation> <translation id="7846076177841592234">Kijelölés törlése</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb index 2f666df..c8fa5a5 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Համաժամացրեք պատմությունը ձեր բոլոր սարքերում, որպեսզի կարողանաք հեշտությամբ շարունակել այն պահից, որտեղ կանգ եք առել։</translation> <translation id="5749158352074143502">Շարունակել այս ներդիրի դիտումը</translation> <translation id="5750869797196646528">Ձեռքերի շարժումների հետագծում</translation> +<translation id="5753570386948603678">Ջնջել պատմությունից</translation> <translation id="5771720122942595109">Արգելափակված է՝ «<ph name="PERMISSION_1" />»</translation> <translation id="5804241973901381774">Թույլտվություններ</translation> <translation id="5822675474983796325">Անհատականացրեք ձեր նոր ներդիրի էջի ներքևի էկրանը, որը բացվել է ամբողջական էկրանի վրա</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Ոչ</translation> <translation id="7804248752222191302">Կայքն օգտագործում է ձեր տեսախցիկը</translation> <translation id="7807060072011926525">Տրամադրված է Google-ի կողմից</translation> +<translation id="7815680994978050279">Արգելափակվել է վտանգավոր ներբեռնում</translation> <translation id="7835852323729233924">Մեդիա բովանդակության նվագարկում</translation> <translation id="783819812427904514">Միացնել տեսանյութի ձայնը</translation> <translation id="7846076177841592234">Չեղարկել ընտրվածքը</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb index 77f815e..f0b498a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Dapatkan histori Anda di semua perangkat, sehingga Anda dapat dengan mudah melanjutkan dari bagian yang terakhir dibuka</translation> <translation id="5749158352074143502">Lanjutkan dengan tab ini</translation> <translation id="5750869797196646528">Pelacakan tangan</translation> +<translation id="5753570386948603678">Hapus dari histori</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> diblokir</translation> <translation id="5804241973901381774">Izin</translation> <translation id="5822675474983796325">Sheet bawah sesuaikan halaman tab baru terbuka sepenuhnya</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Lain kali</translation> <translation id="7804248752222191302">Situs menggunakan kamera Anda</translation> <translation id="7807060072011926525">Disediakan oleh Google</translation> +<translation id="7815680994978050279">Download berbahaya diblokir</translation> <translation id="7835852323729233924">Media yang sedang diputar</translation> <translation id="783819812427904514">Bunyikan video</translation> <translation id="7846076177841592234">Batalkan pilihan</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb index 8f2320b1..9d8f013c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Fáðu ferilinn þinn í öllum tækjunum þínum, svo þú getir auðveldlega haldið áfram þar sem frá var horfið</translation> <translation id="5749158352074143502">Halda áfram á þessum flipa</translation> <translation id="5750869797196646528">Rakning handahreyfinga</translation> +<translation id="5753570386948603678">Eyða úr ferli</translation> <translation id="5771720122942595109">Lokað er fyrir <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Heimildir</translation> <translation id="5822675474983796325">Sérsníða blað neðst á síðu nýrra flipa opið til fulls</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Nei, takk</translation> <translation id="7804248752222191302">Vefsvæði er að nota myndavélina</translation> <translation id="7807060072011926525">Frá Google</translation> +<translation id="7815680994978050279">Lokað á hættulegt niðurhal</translation> <translation id="7835852323729233924">Spilar efni</translation> <translation id="783819812427904514">Kveikja á mynd</translation> <translation id="7846076177841592234">Hætta við val</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb index 0d6af480..7cf424f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Attiva la tua cronologia su tutti i dispositivi, così potrai riprendere facilmente da dove avevi interrotto</translation> <translation id="5749158352074143502">Continua con questa scheda</translation> <translation id="5750869797196646528">Tracciamento delle mani</translation> +<translation id="5753570386948603678">Elimina dalla cronologia</translation> <translation id="5771720122942595109">Autorizzazione <ph name="PERMISSION_1" /> bloccata</translation> <translation id="5804241973901381774">Autorizzazioni</translation> <translation id="5822675474983796325">Riquadro inferiore di Personalizza la pagina Nuova scheda aperto a schermo intero</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">No, grazie</translation> <translation id="7804248752222191302">Un sito sta utilizzando la fotocamera</translation> <translation id="7807060072011926525">Fornito da Google</translation> +<translation id="7815680994978050279">Download pericoloso bloccato</translation> <translation id="7835852323729233924">Contenuti in riproduzione</translation> <translation id="783819812427904514">Riattiva audio video</translation> <translation id="7846076177841592234">Annulla selezione</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb index 6b5456c..f561662 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
@@ -390,6 +390,7 @@ <translation id="5743425052258407233">ההיסטוריה שלך תופיע בכל המכשירים, אז יהיה לך קל להמשיך מהמקום שבו הפסקת</translation> <translation id="5749158352074143502">המשך הגלישה בכרטיסייה הזו</translation> <translation id="5750869797196646528">מעקב אחר תנועות הידיים</translation> +<translation id="5753570386948603678">מחיקה מההיסטוריה</translation> <translation id="5771720122942595109">חסומה: <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">הרשאות</translation> <translation id="5822675474983796325">הגיליון התחתון להתאמה אישית של דף הכרטיסייה החדשה נפתח בגובה מלא</translation> @@ -541,6 +542,7 @@ <translation id="780301667611848630">לא תודה</translation> <translation id="7804248752222191302">אתר כלשהו משתמש במצלמה שלך</translation> <translation id="7807060072011926525">סופק על ידי Google</translation> +<translation id="7815680994978050279">הורדה מסוכנת נחסמה</translation> <translation id="7835852323729233924">מדיה פועלת</translation> <translation id="783819812427904514">ביטול ההשתקה של הסרטון</translation> <translation id="7846076177841592234">ביטול הבחירה</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb index 6639bac..ff95bbd 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">すべてのデバイスで履歴にアクセスできるため、作業を中断したところから簡単に再開できます</translation> <translation id="5749158352074143502">このタブを続行</translation> <translation id="5750869797196646528">ハンド トラッキング</translation> +<translation id="5753570386948603678">履歴から削除</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" />をブロック</translation> <translation id="5804241973901381774">権限</translation> <translation id="5822675474983796325">[新しいタブページをカスタマイズ] のボトムシートが画面全体に表示されています</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">キャンセル</translation> <translation id="7804248752222191302">サイトでカメラが使用されています</translation> <translation id="7807060072011926525">Google から提供</translation> +<translation id="7815680994978050279">危険なダウンロードがブロックされました</translation> <translation id="7835852323729233924">再生中のメディア</translation> <translation id="783819812427904514">動画のミュートを解除</translation> <translation id="7846076177841592234">選択解除</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb index 59ca4c21..eca28940 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">მიიღეთ ისტორია თქვენს ყველა მოწყობილობაზე, რომ მარტივად განაგრძოთ იქიდან, სადაც შეჩერდით</translation> <translation id="5749158352074143502">ამ ჩანართით გაგრძელება</translation> <translation id="5750869797196646528">ხელების მოძრაობაზე თვალის დევნება</translation> +<translation id="5753570386948603678">ისტორიიდან წაშლა</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> დაბლოკილია</translation> <translation id="5804241973901381774">ნებართვები</translation> <translation id="5822675474983796325">ახალი ჩანართის გვერდის ქვედა ფურცლის მორგების ფანჯარა გაიხსნა სრულ სიმაღლეზე</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">არა, გმადლობთ</translation> <translation id="7804248752222191302">ეს საიტი იყენებს თქვენს კამერას</translation> <translation id="7807060072011926525">უზრუნველყოფს Google</translation> +<translation id="7815680994978050279">სახიფათო ჩამოტვირთვა დაიბლოკა</translation> <translation id="7835852323729233924">გაშვებული მედია</translation> <translation id="783819812427904514">ვიდეოს დადუმების მოხსნა</translation> <translation id="7846076177841592234">შერჩევის გაუქმება</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb index c020e4a..5786f6b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Келген жеріңізден жалғастыра алуыңыз үшін, тарихты барлық құрылғыңыздан алыңыз.</translation> <translation id="5749158352074143502">Осы қойындымен жалғастыру</translation> <translation id="5750869797196646528">Қолды бақылау</translation> +<translation id="5753570386948603678">Тарихтан жою</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> үшін тыйым салынған.</translation> <translation id="5804241973901381774">Рұқсаттар</translation> <translation id="5822675474983796325">"Жаңа қойынды бетін бейімдеу" төменгі парақшасы толық ашылды.</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Жоқ, рақмет</translation> <translation id="7804248752222191302">Сайт камераны пайдаланып жатыр.</translation> <translation id="7807060072011926525">Google ұсынған деректер</translation> +<translation id="7815680994978050279">Қауіпті жүктеп алу әрекеті бөгелді</translation> <translation id="7835852323729233924">Медиамазмұн ойнату</translation> <translation id="783819812427904514">Бейненің дыбысын қосу</translation> <translation id="7846076177841592234">Таңдаудан бас тарту</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb index e7ee3fb..42586fe 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">យកប្រវត្តិរបស់អ្នកនៅលើឧបករណ៍ទាំងអស់របស់អ្នក ដូច្នេះអ្នកអាចងាយស្រួលបន្តពីចំណុចដែលអ្នកបានចាកចេញ</translation> <translation id="5749158352074143502">បន្តជាមួយផ្ទាំងនេះ</translation> <translation id="5750869797196646528">ការតាមដានដៃ</translation> +<translation id="5753570386948603678">លុបពីប្រវត្តិ</translation> <translation id="5771720122942595109">បានទប់ស្កាត់ <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">ការអនុញ្ញាត</translation> <translation id="5822675474983796325">បានបើកសន្លឹកខាងក្រោម "ប្ដូរទំព័រផ្ទាំងថ្មីរបស់អ្នកតាមបំណង" ពេញអេក្រង់</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">ទេ អរគុណ</translation> <translation id="7804248752222191302">គេហទំព័រមួយកំពុងប្រើប្រាស់កាមេរ៉ារបស់អ្នក</translation> <translation id="7807060072011926525">បានផ្ដល់ដោយ Google</translation> +<translation id="7815680994978050279">បានទប់ស្កាត់ការទាញយកដែលមានគ្រោះថ្នាក់</translation> <translation id="7835852323729233924">ការចាក់មេឌៀ</translation> <translation id="783819812427904514">បើកសំឡេងវីដេអូ</translation> <translation id="7846076177841592234">បោះបង់ការជ្រើសរើស</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb index 71489de..0de6967 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
@@ -387,6 +387,7 @@ <translation id="5743425052258407233">ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಇತಿಹಾಸವನ್ನು ಪಡೆಯಿರಿ, ಇದರಿಂದ ನೀವು ಎಲ್ಲಿಗೆ ನಿಲ್ಲಿಸಿದ್ದಿರೋ, ಅಲ್ಲಿಂದಲೇ ಸುಲಭವಾಗಿ ಮುಂದುವರಿಸಬಹುದು</translation> <translation id="5749158352074143502">ಈ ಟ್ಯಾಬ್ನೊಂದಿಗೆ ಮುಂದುವರಿಯಿರಿ</translation> <translation id="5750869797196646528">ಹ್ಯಾಂಡ್ ಟ್ರ್ಯಾಕಿಂಗ್</translation> +<translation id="5753570386948603678">ಇತಿಹಾಸದಲ್ಲಿರುವುದನ್ನು ಅಳಿಸಿ</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="5804241973901381774">ಅನುಮತಿಗಳು</translation> <translation id="5822675474983796325">ಪೂರ್ಣ ಎತ್ತರದಲ್ಲಿ ತೆರೆಯಲಾದ ನಿಮ್ಮ ಹೊಸ ಟ್ಯಾಬ್ ಪುಟದ ಕೆಳಭಾಗದ ಶೀಟ್ ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ</translation> @@ -538,6 +539,7 @@ <translation id="780301667611848630">ಬೇಡ</translation> <translation id="7804248752222191302">ಒಂದು ಸೈಟ್ ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸುತ್ತಿದೆ</translation> <translation id="7807060072011926525">Google ಮೂಲಕ ಒದಗಿಸಲಾಗಿದೆ</translation> +<translation id="7815680994978050279">ಅಪಾಯಕಾರಿ ಡೌನ್ಲೋಡ್ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="7835852323729233924">ಮೀಡಿಯಾ ಪ್ಲೇ ಆಗುತ್ತಿದೆ</translation> <translation id="783819812427904514">ವೀಡಿಯೊ ಅನ್ಮ್ಯೂಟ್ ಮಾಡಿ</translation> <translation id="7846076177841592234">ಆಯ್ಕೆ ರದ್ದುಮಾಡಿ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb index dfc9bbb0..026cc9c6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">모든 기기에서 방문 기록을 확인하면 중단한 부분부터 쉽게 다시 시작할 수 있습니다.</translation> <translation id="5749158352074143502">이 탭으로 계속</translation> <translation id="5750869797196646528">손 추적</translation> +<translation id="5753570386948603678">기록에서 삭제</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> 차단됨</translation> <translation id="5804241973901381774">권한</translation> <translation id="5822675474983796325">새 탭 페이지 맞춤설정 하단 시트가 전체 높이로 열림</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">나중에</translation> <translation id="7804248752222191302">사이트에서 카메라 사용 중</translation> <translation id="7807060072011926525">Google 제공</translation> +<translation id="7815680994978050279">위험한 다운로드가 차단됨</translation> <translation id="7835852323729233924">재생 중인 미디어</translation> <translation id="783819812427904514">동영상 음소거 해제</translation> <translation id="7846076177841592234">선택 취소</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb index cd78d3e..2f68851 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Токтогон жерден оңой улантуу үчүн бардык түзмөктөрүңүздө таржымалды шайкештириңиз</translation> <translation id="5749158352074143502">Ушул өтмөктө улантуу</translation> <translation id="5750869797196646528">Колдорго көз салуу</translation> +<translation id="5753570386948603678">Таржымалдан өчүрүү</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> бөгөттөлдү</translation> <translation id="5804241973901381774">Уруксаттар</translation> <translation id="5822675474983796325">Жаңы өтмөктү тууралоо бетинин ылдыйкы экраны толук ачылды</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Жок, рахмат</translation> <translation id="7804248752222191302">Сайт камераңызды колдонуп жатат</translation> <translation id="7807060072011926525">Google сунуштайт</translation> +<translation id="7815680994978050279">Кооптуу файлды жүктөп алуу бөгөттөлдү</translation> <translation id="7835852323729233924">Медиа ойнотулууда</translation> <translation id="783819812427904514">Видеонун үнүн чыгаруу</translation> <translation id="7846076177841592234">Тандоону жокко чыгаруу</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb index f8cceb93..28db41d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">ຮັບເອົາປະຫວັດຂອງທ່ານຢູ່ທຸກອຸປະກອນຂອງທ່ານ, ເພື່ອໃຫ້ທ່ານສາມາດດຳເນີນຕໍ່ຈາກບ່ອນທີ່ທ່ານປະໄວ້ໄດ້ຢ່າງງ່າຍດາຍ</translation> <translation id="5749158352074143502">ສືບຕໍ່ໃຊ້ແຖບນີ້</translation> <translation id="5750869797196646528">ການຕິດຕາມມື</translation> +<translation id="5753570386948603678">ລຶບອອກຈາກປະຫວັດ</translation> <translation id="5771720122942595109">ບລັອກ <ph name="PERMISSION_1" /> ໄວ້ແລ້ວ</translation> <translation id="5804241973901381774">ການອະນຸຍາດ</translation> <translation id="5822675474983796325">ເປີດຊີດລຸ່ມສຸດຂອງການປັບແຕ່ງໜ້າແຖບໃໝ່ຂອງທ່ານຢູ່ລະດັບຄວາມສູງເຕັມໜ້າຈໍແລ້ວ</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">ບໍ່, ຂອບໃຈ</translation> <translation id="7804248752222191302">ເວັບໄຊກຳລັງໃຊ້ກ້ອງຂອງທ່ານຢູ່</translation> <translation id="7807060072011926525">ສະໜອງໃຫ້ໂດຍ Google</translation> +<translation id="7815680994978050279">ບລັອກການດາວໂຫຼດອັນຕະລາຍໄວ້ແລ້ວ</translation> <translation id="7835852323729233924">ກຳລັງຫຼິ້ນສື່</translation> <translation id="783819812427904514">ເປີດສຽງວິດີໂອ</translation> <translation id="7846076177841592234">ຍົກເລີກການເລືອກ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb index b38767d2..c689e66c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Gaukite istoriją visuose įrenginiuose, kad galėtumėte lengvai tęsti darbą nuo ten, kur baigėte</translation> <translation id="5749158352074143502">Tęsti naudojant šį skirtuką</translation> <translation id="5750869797196646528">Rankų stebėjimas</translation> +<translation id="5753570386948603678">Ištrinti iš istorijos</translation> <translation id="5771720122942595109">Užblokuota: <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Leidimai</translation> <translation id="5822675474983796325">Naujo skirtuko puslapio tinkinimo apatinis lapas atidarytas per visą ekrano aukštį</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Ačiū, ne</translation> <translation id="7804248752222191302">Svetainėje naudojamas jūsų fotoaparatas</translation> <translation id="7807060072011926525">Pateikė „Google“</translation> +<translation id="7815680994978050279">Užblokuotas pavojingas atsisiuntimas</translation> <translation id="7835852323729233924">Leidžiama medija</translation> <translation id="783819812427904514">Įjungti vaizdo įrašo garsą</translation> <translation id="7846076177841592234">Atšaukti pasirinkimą</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb index c85bd36..f357e10 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Iegūstiet savu vēsturi visās savās ierīcēs, lai varētu ērti turpināt iesākto.</translation> <translation id="5749158352074143502">Turpiniet pārlūkot šo cilni</translation> <translation id="5750869797196646528">Roku kustību izsekošana</translation> +<translation id="5753570386948603678">Dzēst no vēstures</translation> <translation id="5771720122942595109">Bloķēta: <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Atļaujas</translation> <translation id="5822675474983796325">Jaunas cilnes lapas pielāgošanas ekrāna apakšdaļas lapa ir atvērta pilnā augstumā</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Nē, paldies</translation> <translation id="7804248752222191302">Kāda vietne izmanto jūsu kameru</translation> <translation id="7807060072011926525">Nodrošina Google</translation> +<translation id="7815680994978050279">Tika bloķēta bīstama lejupielāde</translation> <translation id="7835852323729233924">Multivides atskaņošana</translation> <translation id="783819812427904514">Ieslēgt video skaņu</translation> <translation id="7846076177841592234">Atcelt atlasi</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb index cb8e542..9d68349 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Добијте ја историјата на сите ваши уреди за да може лесно да продолжувате каде што сте застанале</translation> <translation id="5749158352074143502">Продолжете со картичкава</translation> <translation id="5750869797196646528">Следење раце</translation> +<translation id="5753570386948603678">Избриши од историјата</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> е блокирана</translation> <translation id="5804241973901381774">Дозволи</translation> <translation id="5822675474983796325">Долниот лист за приспособување на страницата во нова картичка е отворен на целосна висина</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Не, фала</translation> <translation id="7804248752222191302">Сајтот ја користи камерата</translation> <translation id="7807060072011926525">Обезбедено од Google</translation> +<translation id="7815680994978050279">Блокирано е опасно преземање</translation> <translation id="7835852323729233924">Пуштање аудиовизуелни содржини</translation> <translation id="783819812427904514">Вклучете звук на видео</translation> <translation id="7846076177841592234">Откажи избор</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb index b65b2aff..f008a6b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">നിർത്തിയിടത്ത് നിന്ന് തുടരാൻ, നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും നിങ്ങളുടെ ചരിത്രം നേടൂ</translation> <translation id="5749158352074143502">ഈ ടാബ് ഉപയോഗിച്ച് തുടരുക</translation> <translation id="5750869797196646528">കൈകൾ ട്രാക്ക് ചെയ്യൽ</translation> +<translation id="5753570386948603678">ചരിത്രത്തിൽ നിന്ന് ഇല്ലാതാക്കുക</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> ബ്ലോക്ക് ചെയ്തു</translation> <translation id="5804241973901381774">അനുമതികൾ</translation> <translation id="5822675474983796325">'നിങ്ങളുടെ പുതിയ ടാബ് പേജ് ഇഷ്ടാനുസൃതമാക്കുക' ബോട്ടം ഷീറ്റ് സ്ക്രീനിന്റെ പൂർണ്ണ ഉയരത്തിൽ തുറന്നിരിക്കുന്നു</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">വേണ്ട</translation> <translation id="7804248752222191302">ഒരു സൈറ്റ് നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കുന്നു</translation> <translation id="7807060072011926525">Google നൽകുന്നത്</translation> +<translation id="7815680994978050279">ദോഷകരമായ ഡൗൺലോഡ് ബ്ലോക്ക് ചെയ്തു</translation> <translation id="7835852323729233924">മീഡിയ പ്ലേ ചെയ്യുന്നു</translation> <translation id="783819812427904514">വീഡിയോ അൺമ്യൂട്ട് ചെയ്യുക</translation> <translation id="7846076177841592234">തിരഞ്ഞെടുത്തത് റദ്ദാക്കുക</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb index e0d3c71..f2b590f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Та түүхээ бүх төхөөрөмж дээрээ авснаар орхисон газраасаа хялбархан үргэлжлүүлэх боломжтой</translation> <translation id="5749158352074143502">Энэ табтай үргэлжлүүлэх</translation> <translation id="5750869797196646528">Гар хянах</translation> +<translation id="5753570386948603678">Түүхээс устгах</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" />-г блоклосон</translation> <translation id="5804241973901381774">Зөвшөөрлүүд</translation> <translation id="5822675474983796325">Шинэ таб хуудсаа өөрчлөх доод хүснэгтийг бүтэн өндрөөр нээсэн</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Үгүй, баярлалаа</translation> <translation id="7804248752222191302">Сайт таны камерыг ашиглаж байна</translation> <translation id="7807060072011926525">Google-с олгосон</translation> +<translation id="7815680994978050279">Аюултай таталтыг блоклосон</translation> <translation id="7835852323729233924">Медиаг тоглуулж байна</translation> <translation id="783819812427904514">Видеоны дууг нээх</translation> <translation id="7846076177841592234">Сонголтыг цуцлах</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb index 697d484..96a1daa63 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">तुमच्या सर्व डिव्हाइसवर तुमचा इतिहास मिळवा, जेणेकरून तुम्ही सोडले होते तिथून सहजपणे सुरू करू शकाल.</translation> <translation id="5749158352074143502">या टॅबसह पुढे सुरू ठेवा</translation> <translation id="5750869797196646528">हँड ट्रॅकिंग</translation> +<translation id="5753570386948603678">इतिहासामधून हटवा</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> ला ब्लॉक केले</translation> <translation id="5804241973901381774">परवानग्या</translation> <translation id="5822675474983796325">तुमच्या नवीन टॅब पेजच्या तळाशी असलेली शीट कस्टमाइझ करा हे पूर्ण उंचीवर उघडले आहे</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">नाही, नको</translation> <translation id="7804248752222191302">साइट तुमचा कॅमेरा वापरत आहे</translation> <translation id="7807060072011926525">Google द्वारे पुरवलेली</translation> +<translation id="7815680994978050279">धोकादायक डाउनलोड ब्लॉक केले</translation> <translation id="7835852323729233924">मीडिया प्ले करत आहे</translation> <translation id="783819812427904514">व्हिडिओ अनम्यूट करा</translation> <translation id="7846076177841592234">निवड रद्द करा</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb index 989b2b0..aced89d0 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Dapatkan sejarah anda pada semua peranti anda agar anda boleh menyambung semula pada tempat anda berhenti dengan mudah</translation> <translation id="5749158352074143502">Teruskan dengan tab ini</translation> <translation id="5750869797196646528">Penjejakan tangan</translation> +<translation id="5753570386948603678">Padam daripada sejarah</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> disekat</translation> <translation id="5804241973901381774">Kebenaran</translation> <translation id="5822675474983796325">Sesuaikan helaian bawah halaman tab baharu anda dibuka pada ketinggian penuh</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Tidak, terima kasih</translation> <translation id="7804248752222191302">Suatu tapak sedang menggunakan kamera anda</translation> <translation id="7807060072011926525">Disediakan oleh Google</translation> +<translation id="7815680994978050279">Muat turun berbahaya disekat</translation> <translation id="7835852323729233924">Memainkan media</translation> <translation id="783819812427904514">Nyahredam video</translation> <translation id="7846076177841592234">Batalkan pilihan</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb index 3fd5b46d..5345597 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">သင်ထားခဲ့သည့်နေရာမှ အလွယ်တကူ ဆက်သုံးရန်အတွက် သင့်စက်အားလုံးရှိ မှတ်တမ်းကို ရယူနိုင်သည်</translation> <translation id="5749158352074143502">ဤတဘ်ဖြင့် ရှေ့ဆက်ရန်</translation> <translation id="5750869797196646528">လက်ကို စောင့်ကြည့်ခြင်း</translation> +<translation id="5753570386948603678">မှတ်တမ်းမှ ဖျက်ရန်</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> ပိတ်ထားသည်</translation> <translation id="5804241973901381774">ခွင့်ပြုချက်များ</translation> <translation id="5822675474983796325">တဘ်အသစ်စာမျက်နှာ စိတ်ကြိုက်လုပ်ခြင်း အောက်ခြေအပိုဆောင်း စာမျက်နှာကို မြင်ကွင်းအပြည့် ဖွင့်လိုက်သည်</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">မလိုပါ</translation> <translation id="7804248752222191302">ဝဘ်ဆိုက်တစ်ခုက သင့်ကင်မရာကို အသုံးပြုနေသည်</translation> <translation id="7807060072011926525">Google က ပံ့ပိုးထားသည်</translation> +<translation id="7815680994978050279">အန္တရာယ်ရှိသော ဒေါင်းလုဒ်ကို ပိတ်ဆို့ထားသည်</translation> <translation id="7835852323729233924">မီဒီယာ ဖွင့်နေသည်</translation> <translation id="783819812427904514">ဗီဒီယိုကို အသံပြန်ဖွင့်ရန်</translation> <translation id="7846076177841592234">ရွေးချယ်ထားသောဖိုင်များကို ပြန်ဖျက်ပါ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb index bf4cd3e..a02f979 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">तपाईं आफूले छाडेकै ठाउँबाट सुरु गर्न सक्नुहोस् भन्नाका लागि आफ्ना सबै डिभाइसमा आफ्नो हिस्ट्री प्राप्त गर्नुहोस्</translation> <translation id="5749158352074143502">यो ट्याब प्रयोग गरी जारी राख्नुहोस्</translation> <translation id="5750869797196646528">हात ट्र्याक गर्ने सुविधा</translation> +<translation id="5753570386948603678">हिस्ट्रीबाट मेटाउनुहोस्</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> ब्लक गरिएको छ</translation> <translation id="5804241973901381774">अनुमतिहरू</translation> <translation id="5822675474983796325">नयाँ ट्याब पेज कस्टमाइज गर्नेसम्बन्धी जानकारी दिने पुछारको पाना पूरै स्क्रिनमा खोलिएको छ</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">पर्दैन, धन्यवाद</translation> <translation id="7804248752222191302">कुनै साइटले तपाईंको क्यामेरा प्रयोग गर्दै छ</translation> <translation id="7807060072011926525">Google ले प्रदान गरेको</translation> +<translation id="7815680994978050279">खतरनाक डाउनलोडमाथि रोक लगाइयो</translation> <translation id="7835852323729233924">प्ले भइरहेको मिडिया</translation> <translation id="783819812427904514">भिडियो अनम्युट गर्नुहोस्</translation> <translation id="7846076177841592234">चयन रद्द गर्नुहोस्</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb index a0006255..b1aa3f5 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Krijg toegang tot je geschiedenis op al je apparaten, zodat je makkelijk verder kunt gaan waar je gebleven was</translation> <translation id="5749158352074143502">Doorgaan met dit tabblad</translation> <translation id="5750869797196646528">Handen volgen</translation> +<translation id="5753570386948603678">Verwijderen uit geschiedenis</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> geblokkeerd</translation> <translation id="5804241973901381774">Rechten</translation> <translation id="5822675474983796325">Blad onderaan voor De pagina Nieuw tabblad aanpassen is op volledige hoogte geopend</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Nee, bedankt</translation> <translation id="7804248752222191302">Een site gebruikt de camera</translation> <translation id="7807060072011926525">Geleverd door Google</translation> +<translation id="7815680994978050279">Gevaarlijke download geblokkeerd</translation> <translation id="7835852323729233924">Media afspelen</translation> <translation id="783819812427904514">Dempen van video opheffen</translation> <translation id="7846076177841592234">Selectie opheffen</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb index 282b8159..f957404 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Få loggen din på alle enhetene dine, slik at du enkelt kan fortsette der du slapp</translation> <translation id="5749158352074143502">Fortsett med denne fanen</translation> <translation id="5750869797196646528">Håndsporing</translation> +<translation id="5753570386948603678">Slett fra loggen</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> er blokkert</translation> <translation id="5804241973901381774">Tillatelser</translation> <translation id="5822675474983796325">Feltet nederst for tilpasning av Ny fane-siden er åpnet i full høyde</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Nei takk</translation> <translation id="7804248752222191302">Et nettsted bruker kameraet ditt</translation> <translation id="7807060072011926525">Levert av Google</translation> +<translation id="7815680994978050279">En farlig nedlasting er blokkert</translation> <translation id="7835852323729233924">Spiller av medier</translation> <translation id="783819812427904514">Slå på lyden i videoen</translation> <translation id="7846076177841592234">Opphev valget</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb index 018253b..24ec31bc 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">ଆପଣଙ୍କର ସମସ୍ତ ଡିଭାଇସରେ ଆପଣଙ୍କ ଇତିହାସ ପାଆନ୍ତୁ, ଯାହା ଫଳରେ ଆପଣ ଯେଉଁଠାରୁ ଛାଡ଼ିଥିଲେ ସେଠାରୁ ସହଜରେ ଆରମ୍ଭ କରିପାରିବେ</translation> <translation id="5749158352074143502">ଏହି ଟାବ ବ୍ୟବହାର କରିବା ଜାରି ରଖନ୍ତୁ</translation> <translation id="5750869797196646528">ହେଣ୍ଡ ଟ୍ରାକିଂ</translation> +<translation id="5753570386948603678">ଇତିହାସରୁ ଡିଲିଟ କରନ୍ତୁ</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> ବ୍ଲକ୍ କରାଯାଇଛି</translation> <translation id="5804241973901381774">ଅନୁମତିଗୁଡ଼ିକ</translation> <translation id="5822675474983796325">'ଆପଣଙ୍କ ନୂଆ ଟାବ ପୃଷ୍ଠାକୁ କଷ୍ଟମାଇଜ କରନ୍ତୁ' ବଟମ ସିଟ ସମ୍ପୂର୍ଣ୍ଣ ଭାବେ ଖୋଲାଯାଇଛି</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">ନା, ଧନ୍ୟବାଦ</translation> <translation id="7804248752222191302">କୌଣସି ସାଇଟ୍ ଆପଣଙ୍କ କ୍ୟାମେରା ବ୍ୟବହାର କରୁଛି</translation> <translation id="7807060072011926525">Google ଦ୍ୱାରା ପ୍ରଦାନ କରାଯାଇଛି</translation> +<translation id="7815680994978050279">ବିପଜ୍ଜନକ ଡାଉନ୍ଲୋଡ୍ ବ୍ଲକ୍ କରାଯାଇଛି</translation> <translation id="7835852323729233924">ମିଡିଆ ପ୍ଲେ ହେଉଛି</translation> <translation id="783819812427904514">ଭିଡିଓ ଅନମ୍ୟୁଟ୍ କରନ୍ତୁ</translation> <translation id="7846076177841592234">ଚୟନିତ ଆଇଟମ୍ ବାତିଲ୍ କରନ୍ତୁ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb index f32ad94..0f8638eb 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">ਆਪਣੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਆਪਣਾ ਇਤਿਹਾਸ ਪ੍ਰਾਪਤ ਕਰੋ, ਤਾਂ ਜੋ ਤੁਸੀਂ ਆਸਾਨੀ ਨਾਲ ਉੱਥੋਂ ਸ਼ੁਰੂ ਕਰ ਸਕੋ ਜਿੱਥੇ ਛੱਡਿਆ ਸੀ</translation> <translation id="5749158352074143502">ਇਸ ਟੈਬ 'ਤੇ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="5750869797196646528">ਹੱਥ ਟਰੈਕ ਕਰਨਾ</translation> +<translation id="5753570386948603678">ਇਤਿਹਾਸ ਵਿੱਚੋਂ ਮਿਟਾਓ</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ</translation> <translation id="5804241973901381774">ਅਨੁਮਤੀਆਂ</translation> <translation id="5822675474983796325">ਤੁਹਾਡੇ 'ਨਵੀਂ ਟੈਬ' ਪੰਨੇ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰਨ ਦੀ ਜਾਣਕਾਰੀ ਦੇਣ ਵਾਲੀ ਹੇਠਲੀ ਸ਼ੀਟ ਪੂਰੀ ਸਕ੍ਰੀਨ 'ਤੇ ਖੁੱਲ੍ਹੀ ਹੈ</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">ਨਹੀਂ ਧੰਨਵਾਦ</translation> <translation id="7804248752222191302">ਕੋਈ ਸਾਈਟ ਤੁਹਾਡਾ ਕੈਮਰਾ ਵਰਤ ਰਹੀ ਹੈ</translation> <translation id="7807060072011926525">Google ਵੱਲੋਂ ਮੁਹੱਈਆ ਕਰਵਾਈ ਗਈ</translation> +<translation id="7815680994978050279">ਖਤਰਨਾਕ ਡਾਊਨਲੋਡ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ</translation> <translation id="7835852323729233924">ਮੀਡੀਆ ਚਲਾਇਆ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="783819812427904514">ਵੀਡੀਓ ਅਣਮਿਊਟ ਕਰੋ</translation> <translation id="7846076177841592234">ਚੋਣ ਰੱਦ ਕਰੋ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb index 89fe245b..f26f715 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Zyskaj dostęp do swojej historii na wszystkich urządzeniach, aby móc łatwo wznawiać przeglądanie od ostatniego miejsca</translation> <translation id="5749158352074143502">Kontynuuj na tej karcie</translation> <translation id="5750869797196646528">Śledzenie rąk</translation> +<translation id="5753570386948603678">Usuń z historii</translation> <translation id="5771720122942595109">Zablokowane: <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Uprawnienia</translation> <translation id="5822675474983796325">Plansza dolna Dostosuj stronę nowej karty otwarta na całą wysokość</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Nie, dziękuję</translation> <translation id="7804248752222191302">Strona używa kamery</translation> <translation id="7807060072011926525">Udostępniany przez Google</translation> +<translation id="7815680994978050279">Zablokowano niebezpieczne pobieranie</translation> <translation id="7835852323729233924">Odtwarzanie multimediów</translation> <translation id="783819812427904514">Wyłącz wyciszenie filmu</translation> <translation id="7846076177841592234">Anuluj wybór</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb index 3c57faef..0499af4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Tenha seu histórico em todos os dispositivos para continuar facilmente de onde parou</translation> <translation id="5749158352074143502">Continuar com esta guia</translation> <translation id="5750869797196646528">Rastreamento de mãos</translation> +<translation id="5753570386948603678">Excluir do histórico</translation> <translation id="5771720122942595109">Bloqueada: <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Permissões</translation> <translation id="5822675474983796325">A página inferior "Personalizar 'Nova guia'" está aberta no tamanho máximo</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Agora não</translation> <translation id="7804248752222191302">Um site está usando sua câmera</translation> <translation id="7807060072011926525">Fornecido pelo Google</translation> +<translation id="7815680994978050279">Download perigoso bloqueado</translation> <translation id="7835852323729233924">Tocando mídia</translation> <translation id="783819812427904514">Ativar som do vídeo</translation> <translation id="7846076177841592234">Cancelar seleção</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb index 98df2c0..d4f10156 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Aceda ao histórico em todos os seus dispositivos para que possa continuar facilmente a partir do ponto em que ficou</translation> <translation id="5749158352074143502">Continue com este separador</translation> <translation id="5750869797196646528">Monitorização das mãos</translation> +<translation id="5753570386948603678">Eliminar do histórico</translation> <translation id="5771720122942595109">Bloqueio de <ph name="PERMISSION_1" />.</translation> <translation id="5804241973901381774">Permissões</translation> <translation id="5822675474983796325">Secção inferior de Personalize a página Novo separador aberta à altura total</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Não, obrigado</translation> <translation id="7804248752222191302">Um site está a utilizar a sua câmara.</translation> <translation id="7807060072011926525">Disponibilizados pela Google</translation> +<translation id="7815680994978050279">Transferência perigosa bloqueada</translation> <translation id="7835852323729233924">Multimédia em reprodução</translation> <translation id="783819812427904514">Reativar o som do vídeo</translation> <translation id="7846076177841592234">Cancelar seleção</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb index 0140a76..236b197 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Istoricul apare pe toate dispozitivele tale. Astfel, poți continua ceea ce făceai.</translation> <translation id="5749158352074143502">Continuă cu această filă</translation> <translation id="5750869797196646528">Urmărirea mâinilor</translation> +<translation id="5753570386948603678">Șterge din istoric</translation> <translation id="5771720122942595109">S-a blocat <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Permisiuni</translation> <translation id="5822675474983796325">Foaia de jos a paginii Personalizează Fila nouă este deschisă la înălțime completă</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Nu, mulțumesc</translation> <translation id="7804248752222191302">Un site folosește camera foto</translation> <translation id="7807060072011926525">Oferit de Google</translation> +<translation id="7815680994978050279">A fost blocată o descărcare periculoasă</translation> <translation id="7835852323729233924">Se redă conținutul media</translation> <translation id="783819812427904514">Activează sunetul videoclipului</translation> <translation id="7846076177841592234">Anulează selecția</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb index a03ce7a9..b2940cb 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Синхронизируйте историю на всех своих устройствах, чтобы продолжать с того места, на котором вы остановились.</translation> <translation id="5749158352074143502">Снова открыть эту вкладку</translation> <translation id="5750869797196646528">Отслеживание рук</translation> +<translation id="5753570386948603678">Удалить из истории</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" />: заблокировано</translation> <translation id="5804241973901381774">Разрешения</translation> <translation id="5822675474983796325">Нижний экран с настройками страницы быстрого доступа открыт</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Нет, спасибо</translation> <translation id="7804248752222191302">Сайт использует вашу камеру</translation> <translation id="7807060072011926525">Данные от Google</translation> +<translation id="7815680994978050279">Заблокировано скачивание опасного файла</translation> <translation id="7835852323729233924">Воспроизведение медиаконтента</translation> <translation id="783819812427904514">Включить звук для видео</translation> <translation id="7846076177841592234">Отменить выбор</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb index c318d90..67835b96 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">ඔබ නතර කළ තැනින් පහසුවෙන් සොයා ගත හැකි වන පරිදි, ඔබේ සියලු උපාංගවල ඔබේ ඉතිහාසය ලබා ගන්න</translation> <translation id="5749158352074143502">මෙම පටිත්ත සමග ඉදිරියට යන්න</translation> <translation id="5750869797196646528">දෑත් නිරීක්ෂණය</translation> +<translation id="5753570386948603678">ඉතිහාසයෙන් මකන්න</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> අවහිර කරන ලදී</translation> <translation id="5804241973901381774">අවසර</translation> <translation id="5822675474983796325">සම්පූර්ණ උසින් විවෘත කර ඇති ඔබේ නව පටිති පිටුවේ පහළ පත්රය අභිරුචිකරණය කරන්න</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">එපා, ස්තූතියි</translation> <translation id="7804248752222191302">වෙබ් අඩවියක් ඔබේ කැමරාව භාවිත කරයි</translation> <translation id="7807060072011926525">Google විසින් සපයනු ලැබේ</translation> +<translation id="7815680994978050279">හානිකර බාගැනීම් අවහිර කරන ලදී</translation> <translation id="7835852323729233924">මාධ්ය ධාවනය</translation> <translation id="783819812427904514">වීඩියෝව නිහඬ නොකරන්න</translation> <translation id="7846076177841592234">තේරීම අවලංගු කරන්න</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb index f60b89b..38b4569 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Získajte históriu vo všetkých zariadeniach, aby ste mohli ľahko pokračovať tam, kde ste skončili</translation> <translation id="5749158352074143502">Pokračovať s touto kartou</translation> <translation id="5750869797196646528">Sledovanie rúk</translation> +<translation id="5753570386948603678">Odstrániť z histórie</translation> <translation id="5771720122942595109">Blokované: <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Povolenia</translation> <translation id="5822675474983796325">Dolný hárok úprav stránky na novej karte je otvorený na celú výšku</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Nie, ďakujem</translation> <translation id="7804248752222191302">Váš fotoaparát používa nejaký web</translation> <translation id="7807060072011926525">Poskytuje Google</translation> +<translation id="7815680994978050279">Bolo zablokované sťahovanie nebezpečného súboru</translation> <translation id="7835852323729233924">Prehrávanie médií</translation> <translation id="783819812427904514">Zapnúť zvuk videa</translation> <translation id="7846076177841592234">Zrušiť výber</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb index 50ddeb37dd..6f337e6b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Zagotovite si zgodovino v vseh napravah, da boste lahko preprosto nadaljevali, kjer ste nehali</translation> <translation id="5749158352074143502">Nadaljuj s tem zavihkom</translation> <translation id="5750869797196646528">Sledenje potezam dlani</translation> +<translation id="5753570386948603678">Izbriši iz zgodovine</translation> <translation id="5771720122942595109">Blokirano: <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Dovoljenja</translation> <translation id="5822675474983796325">Razdelek na dnu zaslona za prilagajanje strani »Nov zavihek« je odprt pri polni višini</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Ne, hvala</translation> <translation id="7804248752222191302">Spletno mesto uporablja kamero</translation> <translation id="7807060072011926525">Zagotavlja Google</translation> +<translation id="7815680994978050279">Nevaren prenos je bil blokiran</translation> <translation id="7835852323729233924">Predvajanje predstavnosti</translation> <translation id="783819812427904514">Vklop videa</translation> <translation id="7846076177841592234">Prekliči izbor</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb index 4c85e9b..c9aee8f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Merr historikun tënd në të gjitha pajisjet e tua, në mënyrë që të mund të vazhdosh me lehtësi aty ku e ke lënë</translation> <translation id="5749158352074143502">Vazhdo me këtë skedë</translation> <translation id="5750869797196646528">Gjurmimi i duarve</translation> +<translation id="5753570386948603678">Fshije nga historiku</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> është bllokuar</translation> <translation id="5804241973901381774">Lejet</translation> <translation id="5822675474983796325">Fleta e poshtme "Personalizo faqen e skedës së re" u hap në lartësi të plotë</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Jo, faleminderit</translation> <translation id="7804248752222191302">Një sajt po përdor kamerën tënde</translation> <translation id="7807060072011926525">Ofruar nga Google</translation> +<translation id="7815680994978050279">Një shkarkim i rrezikshëm u bllokua</translation> <translation id="7835852323729233924">Po luan media</translation> <translation id="783819812427904514">Aktivizo zërin e videos</translation> <translation id="7846076177841592234">Anulo zgjedhjen</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb index 935b441..e4a413b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Dobijte istoriju na svim uređajima da biste lako nastavili tamo gde ste stali</translation> <translation id="5749158352074143502">Nastavite sa ovom karticom</translation> <translation id="5750869797196646528">Praćenje ruku</translation> +<translation id="5753570386948603678">Izbriši iz istorije</translation> <translation id="5771720122942595109">Dozvola <ph name="PERMISSION_1" /> je blokirana</translation> <translation id="5804241973901381774">Dozvole</translation> <translation id="5822675474983796325">Prilagodite donju tabelu stranice nove kartice otvorenu na celom ekranu</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Ne, hvala</translation> <translation id="7804248752222191302">Sajt koristi kameru</translation> <translation id="7807060072011926525">Pruža Google</translation> +<translation id="7815680994978050279">Opasno preuzimanje je blokirano</translation> <translation id="7835852323729233924">Reprodukcija medija</translation> <translation id="783819812427904514">Uključite zvuk videa</translation> <translation id="7846076177841592234">Otkaži izbor</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb index c0d20a4..f12f520 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Добијте историју на свим уређајима да бисте лако наставили тамо где сте стали</translation> <translation id="5749158352074143502">Наставите са овом картицом</translation> <translation id="5750869797196646528">Праћење руку</translation> +<translation id="5753570386948603678">Избриши из историје</translation> <translation id="5771720122942595109">Дозвола <ph name="PERMISSION_1" /> је блокирана</translation> <translation id="5804241973901381774">Дозволе</translation> <translation id="5822675474983796325">Прилагодите доњу табелу странице нове картице отворену на целом екрану</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Не, хвала</translation> <translation id="7804248752222191302">Сајт користи камеру</translation> <translation id="7807060072011926525">Пружа Google</translation> +<translation id="7815680994978050279">Опасно преузимање је блокирано</translation> <translation id="7835852323729233924">Репродукција медија</translation> <translation id="783819812427904514">Укључите звук видеа</translation> <translation id="7846076177841592234">Откажи избор</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb index 59f830d..3e650d0 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Få din historik på alla dina enheter så att du enkelt kan fortsätta där du slutade</translation> <translation id="5749158352074143502">Fortsätt med den här fliken</translation> <translation id="5750869797196646528">Handspårning</translation> +<translation id="5753570386948603678">Radera från historiken</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> blockeras</translation> <translation id="5804241973901381774">Behörigheter</translation> <translation id="5822675474983796325">Arket på nedre delen av skärmen för att anpassa sidan ny flik har öppnats över hela skärmen</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Nej tack</translation> <translation id="7804248752222191302">En webbplats använder kameran</translation> <translation id="7807060072011926525">Tillhandahålls av Google</translation> +<translation id="7815680994978050279">En farlig nedladdning blockerades</translation> <translation id="7835852323729233924">Spelar upp media</translation> <translation id="783819812427904514">Slå på ljudet för videon</translation> <translation id="7846076177841592234">Rensa val</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb index c3b951e..e71fd21 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Pata historia kwenye vifaa vyako vyote ili uendelee ulipoachia kwa urahisi</translation> <translation id="5749158352074143502">Endelea ukitumia kichupo hiki</translation> <translation id="5750869797196646528">Ufuatiliaji wa mijongeo ya mikono</translation> +<translation id="5753570386948603678">Futa kwenye historia</translation> <translation id="5771720122942595109">Umezuia <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Idhini</translation> <translation id="5822675474983796325">Badilisha upendavyo safu ya chini ya ukurasa wako mpya wa kichupo iliyofunguliwa katika hali ya skrini nzima</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Hapana</translation> <translation id="7804248752222191302">Tovuti inatumia kamera yako</translation> <translation id="7807060072011926525">Imetolewa na Google</translation> +<translation id="7815680994978050279">Upakuaji hatari umezuiwa</translation> <translation id="7835852323729233924">Kucheza maudhui</translation> <translation id="783819812427904514">Rejesha sauti ya video</translation> <translation id="7846076177841592234">Ghairi uchaguzi</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb index d0e1d11..4eb41665 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">உங்கள் சாதனங்கள் அனைத்திலும் பதிவுகளை இயக்குவதன் மூலம் நீங்கள் விட்ட இடத்திலிருந்து எளிதாகத் தொடரலாம்</translation> <translation id="5749158352074143502">இந்தப் பக்கத்தில் தொடர்தல்</translation> <translation id="5750869797196646528">கை அசைவை டிராக் செய்தல்</translation> +<translation id="5753570386948603678">இதுவரை பதிவிறக்கியவற்றில் இருந்து நீக்கு</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" />க்கான அனுமதி தடுக்கப்பட்டது</translation> <translation id="5804241973901381774">அனுமதிகள்</translation> <translation id="5822675474983796325">உங்கள் புதிய பிரவுசர் பக்க கீழ்ப்புறச் சீட்டைப் பிரத்தியேகமாக்குதல் முழு உயரத்தில் திறக்கப்பட்டது</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">வேண்டாம்</translation> <translation id="7804248752222191302">ஒரு தளம் உங்கள் கேமராவைப் பயன்படுத்துகிறது</translation> <translation id="7807060072011926525">Google வழங்கியது</translation> +<translation id="7815680994978050279">ஆபத்தான பதிவிறக்கம் தடுக்கப்பட்டது</translation> <translation id="7835852323729233924">மீடியாவைப் பிளே செய்கிறது</translation> <translation id="783819812427904514">வீடியோவின் ஒலியை இயக்கு</translation> <translation id="7846076177841592234">தேர்வை ரத்துசெய்</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb index 7a88645..92164e36 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">మీ డివైజ్లన్నింటిలోని హిస్టరీని పొందండి, తద్వారా మీరు ఆపిన చోటు నుండి సులభంగా ప్రారంభించవచ్చు</translation> <translation id="5749158352074143502">ఈ ట్యాబ్తో కొనసాగించండి</translation> <translation id="5750869797196646528">చేతి కదలికల ట్రాకింగ్</translation> +<translation id="5753570386948603678">హిస్టరీ నుండి తొలగించండి</translation> <translation id="5771720122942595109">'<ph name="PERMISSION_1" />'ను బ్లాక్ చేశారు</translation> <translation id="5804241973901381774">అనుమతులు</translation> <translation id="5822675474983796325">పూర్తి స్క్రీన్లో తెరవబడిన మీ కొత్త ట్యాబ్ పేజీ దిగువున ఉన్న షీట్ను అనుకూలంగా మార్చండి</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">వద్దు</translation> <translation id="7804248752222191302">ఒక సైట్ మీ కెమెరాను ఉపయోగిస్తోంది</translation> <translation id="7807060072011926525">దీనిని Google అందించినది</translation> +<translation id="7815680994978050279">ప్రమాదకరమైన డౌన్లోడ్ బ్లాక్ చేయబడింది</translation> <translation id="7835852323729233924">మీడియా ప్లే అవుతోంది</translation> <translation id="783819812427904514">వీడియోను అన్మ్యూట్ చేయండి</translation> <translation id="7846076177841592234">ఎంపికను రద్దు చేయండి</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb index 96b48c5..9277b4e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">ดูประวัติการเข้าชมในอุปกรณ์ทุกเครื่องเพื่อให้คุณดูต่อจากที่ค้างไว้ได้อย่างง่ายดาย</translation> <translation id="5749158352074143502">ดำเนินการต่อโดยใช้แท็บนี้</translation> <translation id="5750869797196646528">การติดตามการเคลื่อนไหวของมือ</translation> +<translation id="5753570386948603678">ลบจากประวัติ</translation> <translation id="5771720122942595109">บล็อก<ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">สิทธิ์</translation> <translation id="5822675474983796325">Bottom Sheet สำหรับปรับแต่งหน้าแท็บใหม่เปิดอยู่แบบเต็มความสูง</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">ไม่เป็นไร</translation> <translation id="7804248752222191302">มีเว็บไซต์กำลังใช้กล้อง</translation> <translation id="7807060072011926525">ให้บริการโดย Google</translation> +<translation id="7815680994978050279">บล็อกการดาวน์โหลดที่เป็นอันตรายแล้ว</translation> <translation id="7835852323729233924">การเล่นสื่อ</translation> <translation id="783819812427904514">เปิดเสียงวิดีโอ</translation> <translation id="7846076177841592234">ยกเลิกการเลือก</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb index 2bc96a6..1a8ecf5 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Tüm cihazlarınızda geçmişinizi görüntüleyin, böylece kaldığınız yerden kolayca devam edebilirsiniz</translation> <translation id="5749158352074143502">Bu sekmeyle devam et</translation> <translation id="5750869797196646528">El takibi</translation> +<translation id="5753570386948603678">Geçmişten sil</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> engellendi</translation> <translation id="5804241973901381774">İzinler</translation> <translation id="5822675474983796325">Yeni sekme sayfanızı özelleştirin alt sayfası tam ekranda açıldı</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Hayır, teşekkürler</translation> <translation id="7804248752222191302">Bir site kameranızı kullanıyor</translation> <translation id="7807060072011926525">Google tarafından sağlanır</translation> +<translation id="7815680994978050279">Tehlikeli indirme işlemi engellendi</translation> <translation id="7835852323729233924">Medya oynatma/çalma</translation> <translation id="783819812427904514">Videonun sesini aç</translation> <translation id="7846076177841592234">Seçimi iptal et</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb index 2e1ab73..271479c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Синхронізуйте історію дій на всіх своїх пристроях, щоб легко продовжувати роботу з того місця, на якому зупинилися</translation> <translation id="5749158352074143502">Продовжити на цій вкладці</translation> <translation id="5750869797196646528">Відстеження рук</translation> +<translation id="5753570386948603678">Видалити з історії</translation> <translation id="5771720122942595109">Заблоковано: "<ph name="PERMISSION_1" />"</translation> <translation id="5804241973901381774">Дозволи</translation> <translation id="5822675474983796325">Нижній екран "Налаштуйте сторінку нової вкладки" відкрито на всю висоту</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Ні, дякую</translation> <translation id="7804248752222191302">Сайт використовує камеру</translation> <translation id="7807060072011926525">Надано компанією Google</translation> +<translation id="7815680994978050279">Заблоковано небезпечне завантаження</translation> <translation id="7835852323729233924">Відтворення медіафайлу</translation> <translation id="783819812427904514">Увімкнути звук у відео</translation> <translation id="7846076177841592234">Скасувати вибір</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb index d59a6f01..b0769188 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">اپنے تمام آلات پر اپنی سرگزشت حاصل کریں تاکہ آپ آسانی سے وہیں سے شروع کر سکیں جہاں آپ نے چھوڑا تھا</translation> <translation id="5749158352074143502">اس ٹیب کے ساتھ جاری رکھیں</translation> <translation id="5750869797196646528">ہاتھ کی ٹریکنگ</translation> +<translation id="5753570386948603678">سرگزشت سے حذف کریں</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> مسدود ہو گیا</translation> <translation id="5804241973901381774">اجازتیں</translation> <translation id="5822675474983796325">اپنے نئے ٹیب کے صفحہ کے نیچے کی شیٹ کو حسب ضرورت بنائیں پورا کھلا ہے</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">نہیں شکریہ</translation> <translation id="7804248752222191302">ایک سائٹ آپ کا کیمرا استعمال کر رہی ہے</translation> <translation id="7807060072011926525">Google کے ذریعے فراہم کردہ</translation> +<translation id="7815680994978050279">خطرناک ڈاؤن لوڈ مسدود کیا گیا</translation> <translation id="7835852323729233924">میڈیا کو چلایا جا رہا ہے</translation> <translation id="783819812427904514">ویڈیو کی آواز چلائیں</translation> <translation id="7846076177841592234">انتخاب منسوخ کریں</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb index 6d86605e..ef1863d8 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Brauzer tarixini barcha qurilmalarda oling va ishni kelgan joyidan oson davom ettiring</translation> <translation id="5749158352074143502">Shu varaqda davom etish</translation> <translation id="5750869797196646528">Qoʻllar holatini kuzatish</translation> +<translation id="5753570386948603678">Tarixdan oʻchirib tashlash</translation> <translation id="5771720122942595109">Bloklandi: <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Ruxsatlar</translation> <translation id="5822675474983796325">Yangi varaq sahifasini moslash quyi ekrani toʻliq hajmda ochildi</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Kerak emas</translation> <translation id="7804248752222191302">Sayt kameradan foydalanmoqda</translation> <translation id="7807060072011926525">Google taqdim qilgan</translation> +<translation id="7815680994978050279">Xavfli yuklanma bloklandi</translation> <translation id="7835852323729233924">Mediani ijro etish</translation> <translation id="783819812427904514">Video ovozini yoqish</translation> <translation id="7846076177841592234">Belgilashni bekor qilish</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb index eb377a1c..eaca172 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
@@ -388,6 +388,7 @@ <translation id="5743425052258407233">Đồng bộ hoá nhật ký trên mọi thiết bị để dễ dàng xem tiếp nội dung bạn đang xem dở</translation> <translation id="5749158352074143502">Tiếp tục duyệt xem thẻ này</translation> <translation id="5750869797196646528">Theo dõi cử chỉ tay</translation> +<translation id="5753570386948603678">Xoá khỏi nhật ký</translation> <translation id="5771720122942595109">Đã chặn: <ph name="PERMISSION_1" /></translation> <translation id="5804241973901381774">Quyền</translation> <translation id="5822675474983796325">Bảng tuỳ chỉnh trang thẻ mới của bạn ở dưới cùng đã mở trên toàn màn hình</translation> @@ -539,6 +540,7 @@ <translation id="780301667611848630">Không, cảm ơn</translation> <translation id="7804248752222191302">Một trang web đang sử dụng máy ảnh của bạn</translation> <translation id="7807060072011926525">Do Google cung cấp</translation> +<translation id="7815680994978050279">Tải xuống nguy hiểm đã chặn</translation> <translation id="7835852323729233924">Phát nội dung nghe nhìn</translation> <translation id="783819812427904514">Bật tiếng video</translation> <translation id="7846076177841592234">Hủy chọn</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb index 1da35a41..85f96ee 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">在您的所有设备上同步历史记录,以便您轻松继续未完成的操作</translation> <translation id="5749158352074143502">继续使用此标签页</translation> <translation id="5750869797196646528">手部跟踪</translation> +<translation id="5753570386948603678">从下载记录中删除</translation> <translation id="5771720122942595109">已禁用“<ph name="PERMISSION_1" />”权限</translation> <translation id="5804241973901381774">权限</translation> <translation id="5822675474983796325">自定义新标签页页面底部动作条已全屏打开</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">不用了,谢谢</translation> <translation id="7804248752222191302">有一个网站正在使用您的摄像头</translation> <translation id="7807060072011926525">由 Google 提供</translation> +<translation id="7815680994978050279">已屏蔽危险的下载内容</translation> <translation id="7835852323729233924">正在播放媒体</translation> <translation id="783819812427904514">将视频取消静音</translation> <translation id="7846076177841592234">取消选择</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb index fb70f54f..7ec2c7e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">讓記錄同步到你的所有裝置,方便你繼續執行先前的工作</translation> <translation id="5749158352074143502">繼續使用此分頁</translation> <translation id="5750869797196646528">手部追蹤</translation> +<translation id="5753570386948603678">從記錄中刪除</translation> <translation id="5771720122942595109">已封鎖「<ph name="PERMISSION_1" />」</translation> <translation id="5804241973901381774">權限</translation> <translation id="5822675474983796325">自訂新分頁頁底面板宜家顯示喺成個畫面</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">不用了,謝謝</translation> <translation id="7804248752222191302">有網站正在使用您的相機</translation> <translation id="7807060072011926525">由 Google 提供</translation> +<translation id="7815680994978050279">已封鎖危險的下載項目</translation> <translation id="7835852323729233924">正在播放媒體</translation> <translation id="783819812427904514">將影片取消靜音</translation> <translation id="7846076177841592234">取消選取</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb index 2bfcf37..3118826 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">在所有裝置上存取歷史記錄,輕鬆接續瀏覽進度</translation> <translation id="5749158352074143502">繼續使用這個分頁</translation> <translation id="5750869797196646528">手勢追蹤</translation> +<translation id="5753570386948603678">從記錄中刪除</translation> <translation id="5771720122942595109">已封鎖「<ph name="PERMISSION_1" />」</translation> <translation id="5804241973901381774">權限</translation> <translation id="5822675474983796325">自訂新分頁底部功能表已開啟,並顯示在整個畫面</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">不用了,謝謝</translation> <translation id="7804248752222191302">有網站正在使用你的攝影機</translation> <translation id="7807060072011926525">由 Google 提供</translation> +<translation id="7815680994978050279">已封鎖危險下載內容</translation> <translation id="7835852323729233924">正在播放媒體</translation> <translation id="783819812427904514">將影片取消靜音</translation> <translation id="7846076177841592234">全部取消選取</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb index a001cd0..380b0ded 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
@@ -389,6 +389,7 @@ <translation id="5743425052258407233">Thola umlando wakho kuwo wonke amadivayisi akho, ukuze ukwazi ukuqhubeka lapho ugcine khona</translation> <translation id="5749158352074143502">Qhubeka nale thebhu</translation> <translation id="5750869797196646528">Ukulandelela isandla</translation> +<translation id="5753570386948603678">Sula emlandweni</translation> <translation id="5771720122942595109">I-<ph name="PERMISSION_1" /> ivinjiwe</translation> <translation id="5804241973901381774">Izimvume</translation> <translation id="5822675474983796325">Hlela ngendlela oyithandayo ikhasi lakho elisha lethebhu yeshidi eliphansi elivulwe ngokuphakama okuphelele</translation> @@ -540,6 +541,7 @@ <translation id="780301667611848630">Cha ngiyabonga</translation> <translation id="7804248752222191302">Isayithi lisebenzisa ikhamera yakho</translation> <translation id="7807060072011926525">Kuhlinzekwe yi-Google</translation> +<translation id="7815680994978050279">Ukulanda okuyingozi kuvinjiwe</translation> <translation id="7835852323729233924">Ukudlala imidiya</translation> <translation id="783819812427904514">Susa ukuthula kuvidiyo</translation> <translation id="7846076177841592234">Khansela ukukhetha</translation>
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index d2419984..1cc7148 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "55.6", - "log_list_timestamp": "2025-06-15T13:01:36Z", + "version": "55.7", + "log_list_timestamp": "2025-06-16T12:53:26Z", "operators": [ { "name": "Google",
diff --git a/components/credential_management/android/BUILD.gn b/components/credential_management/android/BUILD.gn index 5e81ffb..f66bc17 100644 --- a/components/credential_management/android/BUILD.gn +++ b/components/credential_management/android/BUILD.gn
@@ -35,6 +35,7 @@ srcjar_deps = [ ":jni_headers" ] sources = [ + "java/src/org/chromium/components/credential_management/CredentialManagerAndroidGetResult.java", "java/src/org/chromium/components/credential_management/CredentialManagerStoreResult.java", "java/src/org/chromium/components/credential_management/PasswordCredentialResponse.java", "java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerBridge.java",
diff --git a/components/credential_management/android/java/src/org/chromium/components/credential_management/CredentialManagerAndroidGetResult.java b/components/credential_management/android/java/src/org/chromium/components/credential_management/CredentialManagerAndroidGetResult.java new file mode 100644 index 0000000..b4d6f24 --- /dev/null +++ b/components/credential_management/android/java/src/org/chromium/components/credential_management/CredentialManagerAndroidGetResult.java
@@ -0,0 +1,64 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.credential_management; + +import androidx.annotation.IntDef; + +import org.chromium.build.annotations.NullMarked; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +// +// LINT.IfChange(CredentialManagerAndroidGetResult) +@IntDef({ + CredentialManagerAndroidGetResult.UNEXPECTED_ERROR, + CredentialManagerAndroidGetResult.SUCCESS, + CredentialManagerAndroidGetResult.USER_CANCELED, + CredentialManagerAndroidGetResult.CUSTOM_ERROR, + CredentialManagerAndroidGetResult.INTERRUPTED, + CredentialManagerAndroidGetResult.PROVIDER_CONFIGURATION_ERROR, + CredentialManagerAndroidGetResult.UNKNOWN, + CredentialManagerAndroidGetResult.UNSUPPORTED, + CredentialManagerAndroidGetResult.COUNT +}) +@Target(ElementType.TYPE_USE) +@Retention(RetentionPolicy.SOURCE) +@NullMarked +public @interface CredentialManagerAndroidGetResult { + /** An error that's not yet explicitly handled in Chrome code. */ + int UNEXPECTED_ERROR = 0; + + /** The operation succeeded. */ + int SUCCESS = 1; + + /** The user intentionally canceled the flow. */ + int USER_CANCELED = 2; + + /** An error by the third-party sdk with which was used to make the GetCredentialRequest. */ + int CUSTOM_ERROR = 3; + + /** The operation failed due to a transient internal API interruption. */ + int INTERRUPTED = 4; + + /** Configurations are mismatched for the provider. */ + int PROVIDER_CONFIGURATION_ERROR = 5; + + /** Get credential operation failed with no more detailed information. */ + int UNKNOWN = 6; + + /** + * Credential manager is unsupported. It could be disabled on the device so a software update or + * a restart after enabling may fix this issue. Sometimes hardware may be the limiting factor. + */ + int UNSUPPORTED = 7; + + int COUNT = 8; +} +// LINT.ThenChange(//tools/metrics/histograms/metadata/password/enums.xml:CredentialManagerAndroidGetResult)
diff --git a/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerBridge.java b/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerBridge.java index f94d6c9..744ddd5 100644 --- a/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerBridge.java +++ b/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerBridge.java
@@ -78,13 +78,19 @@ credentialCallback = new CredentialManagerCallback<>() { @Override - public void onError(GetCredentialException e) { + public void onError(GetCredentialException error) { callback.onResult(new PasswordCredentialResponse(false, "", "")); + ThirdPartyCredentialManagerMetricsRecorder + .recordCredentialManagerGetResult( + /* success= */ false, /* error= */ error); } @Override public void onResult(GetCredentialResponse result) { onGetCredentialResponse(result, callback); + ThirdPartyCredentialManagerMetricsRecorder + .recordCredentialManagerGetResult( + /* success= */ true, /* error= */ null); } }; credentialManager.getCredentialAsync(
diff --git a/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerBridgeTest.java b/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerBridgeTest.java index db6d4d57..5ea7ccb 100644 --- a/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerBridgeTest.java +++ b/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerBridgeTest.java
@@ -67,6 +67,10 @@ @Test public void testOnPasswordCredentialReceivedCalled() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.GET_RESULT_HISTOGRAM_NAME, + CredentialManagerAndroidGetResult.SUCCESS); PasswordCredential passwordCredential = new PasswordCredential(USERNAME, PASSWORD); GetCredentialResponse response = new GetCredentialResponse(passwordCredential); @@ -93,10 +97,15 @@ argThat( new PasswordCredentialResponseMatcher( new PasswordCredentialResponse(true, USERNAME, PASSWORD)))); + histogramWatcher.assertExpected(); } @Test public void testOnGetCredentialErrorCalled() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.GET_RESULT_HISTOGRAM_NAME, + CredentialManagerAndroidGetResult.UNEXPECTED_ERROR); doAnswer(invocation -> respondToGetCallback(invocation, null, mGetCredentialException)) .when(mCredentialManager) .getCredentialAsync( @@ -120,6 +129,7 @@ argThat( new PasswordCredentialResponseMatcher( new PasswordCredentialResponse(false, "", "")))); + histogramWatcher.assertExpected(); } @Test
diff --git a/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerMetricsRecorder.java b/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerMetricsRecorder.java index 5af23ac2..17a88a0 100644 --- a/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerMetricsRecorder.java +++ b/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerMetricsRecorder.java
@@ -9,6 +9,13 @@ import androidx.credentials.exceptions.CreateCredentialInterruptedException; import androidx.credentials.exceptions.CreateCredentialNoCreateOptionException; import androidx.credentials.exceptions.CreateCredentialUnknownException; +import androidx.credentials.exceptions.GetCredentialCancellationException; +import androidx.credentials.exceptions.GetCredentialCustomException; +import androidx.credentials.exceptions.GetCredentialException; +import androidx.credentials.exceptions.GetCredentialInterruptedException; +import androidx.credentials.exceptions.GetCredentialProviderConfigurationException; +import androidx.credentials.exceptions.GetCredentialUnknownException; +import androidx.credentials.exceptions.GetCredentialUnsupportedException; import org.chromium.base.metrics.RecordHistogram; import org.chromium.build.annotations.NullMarked; @@ -18,6 +25,8 @@ public final class ThirdPartyCredentialManagerMetricsRecorder { public static final String STORE_RESULT_HISTOGRAM_NAME = "PasswordManager.CredentialRequest.ThirdParty.Store"; + public static final String GET_RESULT_HISTOGRAM_NAME = + "PasswordManager.CredentialRequest.ThirdParty.Get"; private ThirdPartyCredentialManagerMetricsRecorder() {} @@ -40,4 +49,28 @@ RecordHistogram.recordEnumeratedHistogram( STORE_RESULT_HISTOGRAM_NAME, result, CredentialManagerStoreResult.COUNT); } + + public static void recordCredentialManagerGetResult( + boolean success, @Nullable GetCredentialException error) { + int result = CredentialManagerAndroidGetResult.SUCCESS; + if (!success) { + if (error instanceof GetCredentialCancellationException) { + result = CredentialManagerAndroidGetResult.USER_CANCELED; + } else if (error instanceof GetCredentialCustomException) { + result = CredentialManagerAndroidGetResult.CUSTOM_ERROR; + } else if (error instanceof GetCredentialInterruptedException) { + result = CredentialManagerAndroidGetResult.INTERRUPTED; + } else if (error instanceof GetCredentialProviderConfigurationException) { + result = CredentialManagerAndroidGetResult.PROVIDER_CONFIGURATION_ERROR; + } else if (error instanceof GetCredentialUnknownException) { + result = CredentialManagerAndroidGetResult.UNKNOWN; + } else if (error instanceof GetCredentialUnsupportedException) { + result = CredentialManagerAndroidGetResult.UNSUPPORTED; + } else { + result = CredentialManagerAndroidGetResult.UNEXPECTED_ERROR; + } + } + RecordHistogram.recordEnumeratedHistogram( + GET_RESULT_HISTOGRAM_NAME, result, CredentialManagerAndroidGetResult.COUNT); + } }
diff --git a/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerMetricsRecorderTest.java b/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerMetricsRecorderTest.java index 4db4b8d..14e356a 100644 --- a/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerMetricsRecorderTest.java +++ b/components/credential_management/android/java/src/org/chromium/components/credential_management/ThirdPartyCredentialManagerMetricsRecorderTest.java
@@ -9,81 +9,187 @@ import androidx.credentials.exceptions.CreateCredentialInterruptedException; import androidx.credentials.exceptions.CreateCredentialNoCreateOptionException; import androidx.credentials.exceptions.CreateCredentialUnknownException; +import androidx.credentials.exceptions.GetCredentialCancellationException; +import androidx.credentials.exceptions.GetCredentialCustomException; +import androidx.credentials.exceptions.GetCredentialException; +import androidx.credentials.exceptions.GetCredentialInterruptedException; +import androidx.credentials.exceptions.GetCredentialProviderConfigurationException; +import androidx.credentials.exceptions.GetCredentialUnknownException; +import androidx.credentials.exceptions.GetCredentialUnsupportedException; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.ParameterizedRobolectricTestRunner; -import org.robolectric.ParameterizedRobolectricTestRunner.Parameters; +import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.HistogramWatcher; -import java.util.Arrays; -import java.util.Collection; - /** Tests for the ThirdPartyCredentialManagerMetricsRecorder. */ -@RunWith(ParameterizedRobolectricTestRunner.class) +@RunWith(BaseRobolectricTestRunner.class) @Batch(Batch.PER_CLASS) public class ThirdPartyCredentialManagerMetricsRecorderTest { private static class FakeCreateCredentialException extends CreateCredentialException { public FakeCreateCredentialException() { - super("FAKE_TYPE", "Fake type"); + super("FAKE_CREATE", "Fake create"); } } - @Parameters - public static Collection testCases() { - return Arrays.asList( - new Object[][] { - {true, null, CredentialManagerStoreResult.SUCCESS}, - { - false, - new CreateCredentialCancellationException(), - CredentialManagerStoreResult.USER_CANCELED - }, - { - false, - new CreateCredentialNoCreateOptionException(), - CredentialManagerStoreResult.NO_CREATE_OPTIONS - }, - { - false, - new CreateCredentialInterruptedException(), - CredentialManagerStoreResult.INTERRUPTED - }, - { - false, - new CreateCredentialUnknownException(), - CredentialManagerStoreResult.UNKNOWN - }, - { - false, - new FakeCreateCredentialException(), - CredentialManagerStoreResult.UNEXPECTED_ERROR - } - }); - } - - private final boolean mSuccess; - private final CreateCredentialException mError; - private final int mResult; - - public ThirdPartyCredentialManagerMetricsRecorderTest( - boolean success, CreateCredentialException error, int result) { - mSuccess = success; - mError = error; - mResult = result; + private static class FakeGetCredentialException extends GetCredentialException { + public FakeGetCredentialException() { + super("FAKE_GET", "Fake get"); + } } @Test - public void testRecordingCredentialManagerStoreResult() { + public void testRecordingCredentialManagerStoreResultSucceeds() { HistogramWatcher histogramWatcher = HistogramWatcher.newSingleRecordWatcher( ThirdPartyCredentialManagerMetricsRecorder.STORE_RESULT_HISTOGRAM_NAME, - mResult); + CredentialManagerStoreResult.SUCCESS); + ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerStoreResult(true, null); + histogramWatcher.assertExpected(); + } + + @Test + public void testRecordingCredentialManagerStoreResultFailsWhenUserCancels() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.STORE_RESULT_HISTOGRAM_NAME, + CredentialManagerStoreResult.USER_CANCELED); ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerStoreResult( - mSuccess, mError); + false, new CreateCredentialCancellationException()); + histogramWatcher.assertExpected(); + } + + @Test + public void testRecordingCredentialManagerStoreResultFailsWithoutCreateOptions() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.STORE_RESULT_HISTOGRAM_NAME, + CredentialManagerStoreResult.NO_CREATE_OPTIONS); + ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerStoreResult( + false, new CreateCredentialNoCreateOptionException()); + histogramWatcher.assertExpected(); + } + + @Test + public void testRecordingCredentialManagerStoreResultFailsWhenInterrupted() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.STORE_RESULT_HISTOGRAM_NAME, + CredentialManagerStoreResult.INTERRUPTED); + ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerStoreResult( + false, new CreateCredentialInterruptedException()); + histogramWatcher.assertExpected(); + } + + @Test + public void testRecordingCredentialManagerStoreResultFailsForUnknownReason() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.STORE_RESULT_HISTOGRAM_NAME, + CredentialManagerStoreResult.UNKNOWN); + ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerStoreResult( + false, new CreateCredentialUnknownException()); + histogramWatcher.assertExpected(); + } + + @Test + public void testRecordingCredentialManagerStoreResultFailsForUnexpectedError() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.STORE_RESULT_HISTOGRAM_NAME, + CredentialManagerStoreResult.UNEXPECTED_ERROR); + ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerStoreResult( + false, new FakeCreateCredentialException()); + histogramWatcher.assertExpected(); + } + + @Test + public void testRecordingCredentialManagerGetResultSucceeds() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.GET_RESULT_HISTOGRAM_NAME, + CredentialManagerAndroidGetResult.SUCCESS); + ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerGetResult(true, null); + histogramWatcher.assertExpected(); + } + + @Test + public void testRecordingCredentialManagerGetResultFailsWhenUserCancels() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.GET_RESULT_HISTOGRAM_NAME, + CredentialManagerAndroidGetResult.USER_CANCELED); + ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerGetResult( + false, new GetCredentialCancellationException()); + histogramWatcher.assertExpected(); + } + + @Test + public void testRecordingCredentialManagerGetResultSFailsWithCustomError() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.GET_RESULT_HISTOGRAM_NAME, + CredentialManagerAndroidGetResult.CUSTOM_ERROR); + ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerGetResult( + false, new GetCredentialCustomException("CUSTOM_TYPE", "Custom type")); + histogramWatcher.assertExpected(); + } + + @Test + public void testRecordingCredentialManagerGetResultFailsWhenInterrupted() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.GET_RESULT_HISTOGRAM_NAME, + CredentialManagerAndroidGetResult.INTERRUPTED); + ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerGetResult( + false, new GetCredentialInterruptedException()); + histogramWatcher.assertExpected(); + } + + @Test + public void testRecordingCredentialManagerGetResultFailsBecauseOfProviderConfig() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.GET_RESULT_HISTOGRAM_NAME, + CredentialManagerAndroidGetResult.PROVIDER_CONFIGURATION_ERROR); + ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerGetResult( + false, new GetCredentialProviderConfigurationException()); + histogramWatcher.assertExpected(); + } + + @Test + public void testRecordingCredentialManagerGetResultFailsWithUnknownError() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.GET_RESULT_HISTOGRAM_NAME, + CredentialManagerAndroidGetResult.UNKNOWN); + ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerGetResult( + false, new GetCredentialUnknownException()); + histogramWatcher.assertExpected(); + } + + @Test + public void testRecordingCredentialManagerGetResultFailsWithUnsupportedError() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.GET_RESULT_HISTOGRAM_NAME, + CredentialManagerAndroidGetResult.UNSUPPORTED); + ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerGetResult( + false, new GetCredentialUnsupportedException()); + histogramWatcher.assertExpected(); + } + + @Test + public void testRecordingCredentialManagerGetResultFailsWithUnexpectedError() { + HistogramWatcher histogramWatcher = + HistogramWatcher.newSingleRecordWatcher( + ThirdPartyCredentialManagerMetricsRecorder.GET_RESULT_HISTOGRAM_NAME, + CredentialManagerAndroidGetResult.UNEXPECTED_ERROR); + ThirdPartyCredentialManagerMetricsRecorder.recordCredentialManagerGetResult( + false, new FakeGetCredentialException()); histogramWatcher.assertExpected(); } }
diff --git a/components/credential_management/android/third_party_credential_manager_impl.cc b/components/credential_management/android/third_party_credential_manager_impl.cc index 4f1798f..1c8acb52 100644 --- a/components/credential_management/android/third_party_credential_manager_impl.cc +++ b/components/credential_management/android/third_party_credential_manager_impl.cc
@@ -11,16 +11,15 @@ namespace credential_management { ThirdPartyCredentialManagerImpl::ThirdPartyCredentialManagerImpl( - content::RenderFrameHost* render_frame_host) + content::WebContents* web_contents) : bridge_(std::make_unique<ThirdPartyCredentialManagerBridge>()), - render_frame_host_(CHECK_DEREF(render_frame_host)) {} + web_contents_(CHECK_DEREF(web_contents)) {} ThirdPartyCredentialManagerImpl::ThirdPartyCredentialManagerImpl( base::PassKey<class ThirdPartyCredentialManagerImplTest>, - content::RenderFrameHost* render_frame_host, + content::WebContents* web_contents, std::unique_ptr<CredentialManagerBridge> bridge) - : bridge_(std::move(bridge)), - render_frame_host_(CHECK_DEREF(render_frame_host)) {} + : bridge_(std::move(bridge)), web_contents_(CHECK_DEREF(web_contents)) {} ThirdPartyCredentialManagerImpl::~ThirdPartyCredentialManagerImpl() = default; @@ -30,7 +29,9 @@ std::u16string username = credential.id.value_or(u""); std::u16string password = credential.password.value_or(u""); bridge_->Store(username, password, - render_frame_host_->GetLastCommittedOrigin().Serialize(), + web_contents_->GetPrimaryMainFrame() + ->GetLastCommittedOrigin() + .Serialize(), std::move(callback)); } @@ -93,7 +94,9 @@ } bridge_->Get(ShouldAllowAutoSelect(mediation), include_passwords, federations, - render_frame_host_->GetLastCommittedOrigin().Serialize(), + web_contents_->GetPrimaryMainFrame() + ->GetLastCommittedOrigin() + .Serialize(), std::move(callback)); }
diff --git a/components/credential_management/android/third_party_credential_manager_impl.h b/components/credential_management/android/third_party_credential_manager_impl.h index 0ef7f39..97b4c31 100644 --- a/components/credential_management/android/third_party_credential_manager_impl.h +++ b/components/credential_management/android/third_party_credential_manager_impl.h
@@ -8,7 +8,7 @@ #include "base/memory/raw_ref.h" #include "components/credential_management/android/third_party_credential_manager_bridge.h" #include "components/credential_management/credential_manager_interface.h" -#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/web_contents.h" #include "third_party/blink/public/mojom/credentialmanagement/credential_manager.mojom.h" namespace credential_management { @@ -16,11 +16,10 @@ // Class implementing Credential Manager methods for Clank in 3P mode. class ThirdPartyCredentialManagerImpl : public CredentialManagerInterface { public: - explicit ThirdPartyCredentialManagerImpl( - content::RenderFrameHost* render_frame_host); + explicit ThirdPartyCredentialManagerImpl(content::WebContents* web_contents); ThirdPartyCredentialManagerImpl( base::PassKey<class ThirdPartyCredentialManagerImplTest>, - content::RenderFrameHost* render_frame_host, + content::WebContents* web_contents, std::unique_ptr<CredentialManagerBridge> bridge); ThirdPartyCredentialManagerImpl(const ThirdPartyCredentialManagerImpl&) = @@ -41,7 +40,7 @@ private: std::unique_ptr<CredentialManagerBridge> bridge_; - const raw_ref<content::RenderFrameHost> render_frame_host_; + const raw_ref<content::WebContents> web_contents_; }; } // namespace credential_management
diff --git a/components/credential_management/android/third_party_credential_manager_impl_unittest.cc b/components/credential_management/android/third_party_credential_manager_impl_unittest.cc index bfb29416..d6054fac 100644 --- a/components/credential_management/android/third_party_credential_manager_impl_unittest.cc +++ b/components/credential_management/android/third_party_credential_manager_impl_unittest.cc
@@ -60,8 +60,8 @@ mock_bridge_ = mock_bridge.get(); credential_manager_ = std::make_unique<ThirdPartyCredentialManagerImpl>( - base::PassKey<class ThirdPartyCredentialManagerImplTest>(), main_rfh(), - std::move(mock_bridge)); + base::PassKey<class ThirdPartyCredentialManagerImplTest>(), + web_contents(), std::move(mock_bridge)); } ThirdPartyCredentialManagerImpl* credential_manager() {
diff --git a/components/gcm_driver/gcm_driver.cc b/components/gcm_driver/gcm_driver.cc index deaac9d..63b1847 100644 --- a/components/gcm_driver/gcm_driver.cc +++ b/components/gcm_driver/gcm_driver.cc
@@ -23,7 +23,8 @@ namespace { -// Copied from components/invalidation/impl/fcm_invalidation_service_base.cc. +// Copied from +// https://source.chromium.org/chromium/chromium/src/+/main:components/invalidation/invalidation_listener.h;l=76;drc=16479132e8be0c0b5740b34ddfd62817ec490945. constexpr char kFcmInvalidationsApplicationName[] = "com.google.chrome.fcm.invalidations"; // Copied from components/sync/invalidations/sync_invalidations_service_impl.cc. @@ -38,7 +39,7 @@ if (app_id == kSyncInvalidationsApplicationName) { base::UmaHistogramBoolean("GCM.DeliveredToAppHandler.SyncInvalidations", has_app_handler); - } else if (app_id == kFcmInvalidationsApplicationName) { + } else if (app_id.starts_with(kFcmInvalidationsApplicationName)) { base::UmaHistogramBoolean("GCM.DeliveredToAppHandler.FcmInvalidations", has_app_handler); }
diff --git a/components/language/core/common/locale_util.cc b/components/language/core/common/locale_util.cc index 01e7d92..63f7cd7 100644 --- a/components/language/core/common/locale_util.cc +++ b/components/language/core/common/locale_util.cc
@@ -26,10 +26,14 @@ } bool ConvertToActualUILocale(std::string* input_locale) { - std::string original_locale; - input_locale->swap(original_locale); - return l10n_util::CheckAndResolveLocale(original_locale, input_locale, - /*perform_io=*/false); + if (std::optional<std::string> resolved_locale = + l10n_util::CheckAndResolveLocale( + *input_locale, + l10n_util::CheckLocaleMode::kUseKnownLocalesList)) { + input_locale->swap(*resolved_locale); + return true; + } + return false; } } // namespace language
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc index cc4bd78..5a33595 100644 --- a/components/omnibox/browser/autocomplete_controller.cc +++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -1752,7 +1752,26 @@ const std::u16string& keyword_text, const std::u16string& keyword) { // There shouldn't be duplicate keywords. - CHECK(!added_keywords.count(keyword)); + if (added_keywords.count(keyword)) { + std::string debug_string = base::StringPrintf( + "Input [%s]. Duplicate keyword attached, " + "([contents] [description] [provider] [keyword]) : " + "([%s] [%s] [%s] [%s]). " + "Existing matches and keywords are: ", + base::UTF16ToUTF8(input_.text()).c_str(), + base::UTF16ToUTF8(match.contents).c_str(), + base::UTF16ToUTF8(match.description).c_str(), + match.provider ? match.provider->GetName() : "null", + base::UTF16ToUTF8(keyword).c_str()); + for (const AutocompleteMatch& m : *result) { + debug_string += base::StringPrintf( + "([%s] [%s] [%s] [%s]), ", base::UTF16ToUTF8(m.contents).c_str(), + base::UTF16ToUTF8(m.description).c_str(), + m.provider ? m.provider->GetName() : "null", + base::UTF16ToUTF8(m.fill_into_edit).c_str()); + } + CHECK(!added_keywords.count(keyword)) << debug_string; + } added_keywords.insert(keyword); match.associated_keyword = std::make_unique<AutocompleteMatch>( keyword_provider_->CreateVerbatimMatch(keyword_text, keyword, input_));
diff --git a/components/omnibox/browser/autocomplete_match_classification.cc b/components/omnibox/browser/autocomplete_match_classification.cc index 9d8ed1b..41fbddb42 100644 --- a/components/omnibox/browser/autocomplete_match_classification.cc +++ b/components/omnibox/browser/autocomplete_match_classification.cc
@@ -4,9 +4,13 @@ #include "autocomplete_match_classification.h" +#include <string> +#include <string_view> + #include "base/i18n/case_conversion.h" #include "base/strings/string_util.h" -#include "base/strings/utf_string_conversions.h" +#include "components/omnibox/browser/autocomplete_match.h" +#include "components/omnibox/browser/in_memory_url_index_types.h" #include "components/omnibox/browser/scored_history_match.h" #include "in_memory_url_index_types.h" @@ -54,6 +58,20 @@ std::u16string find_text_str = clean(find_text); std::u16string text_str = clean(text); + // Some international characters become multiple characters when converting + // case. E.g. Armenian և is 1 character lowercase, but 2 characters Եվ + // uppercased. Turkish has examples of the opposite, where the lowercasing can + // increase length. If the string length changes when lowercased, term match + // indexes will be off when being used to style the original-cased `text`. + // This will cause either `DCHECK` crashes if the incorrect index is out of + // bounds; or incorrect styling if the incorrect index remains in bounds or + // `DCHECK`s are disabled. E.g. input 'ou' would bold 'Yo[uT]ube' if lower + // case 'Y' is 2 characters. + if (find_text_str.size() != find_text.size() || + text_str.size() != text.size()) { + return {}; + } + if (find_text_str.empty()) { return {}; }
diff --git a/components/password_manager/core/browser/credential_cache.cc b/components/password_manager/core/browser/credential_cache.cc index 9287687b..13f533c 100644 --- a/components/password_manager/core/browser/credential_cache.cc +++ b/components/password_manager/core/browser/credential_cache.cc
@@ -30,13 +30,13 @@ #if !BUILDFLAG(IS_ANDROID) return std::nullopt; #else - std::u16string backup_password = form.GetPasswordBackupNote(); - if (backup_password.empty() || + std::optional<std::u16string> backup_password = form.GetPasswordBackup(); + if (!backup_password || !base::FeatureList::IsEnabled(features::kFillRecoveryPassword)) { return std::nullopt; } PasswordForm backup_form = form; - backup_form.password_value = backup_password; + backup_form.password_value = backup_password.value(); UiCredential credential{backup_form, origin, IsBackupCredential(true)}; return credential; #endif // !BUILDFLAG(IS_ANDROID)
diff --git a/components/password_manager/core/browser/password_form.cc b/components/password_manager/core/browser/password_form.cc index 00501a8..ee4470a7 100644 --- a/components/password_manager/core/browser/password_form.cc +++ b/components/password_manager/core/browser/password_form.cc
@@ -5,6 +5,7 @@ #include "components/password_manager/core/browser/password_form.h" #include <algorithm> +#include <optional> #include <ostream> #include <sstream> #include <string> @@ -426,8 +427,10 @@ SetNote(notes, std::u16string(), new_note_value); } -std::u16string PasswordForm::GetPasswordBackupNote() const { - return GetNote(notes, PasswordNote::kPasswordChangeBackupNoteName); +std::optional<std::u16string> PasswordForm::GetPasswordBackup() const { + std::u16string note = + GetNote(notes, PasswordNote::kPasswordChangeBackupNoteName); + return note.empty() ? std::nullopt : std::make_optional(note); } void PasswordForm::SetPasswordBackupNote(const std::u16string& new_note_value) {
diff --git a/components/password_manager/core/browser/password_form.h b/components/password_manager/core/browser/password_form.h index f9635cc..ed83d90a8 100644 --- a/components/password_manager/core/browser/password_form.h +++ b/components/password_manager/core/browser/password_form.h
@@ -555,9 +555,8 @@ void SetNoteWithEmptyUniqueDisplayName(const std::u16string& new_note_value); // Returns the value of the note with a password change backup specific - // `unique_display_name`. - // returns an empty string if none exists. - std::u16string GetPasswordBackupNote() const; + // `unique_display_name` if it exists and is not empty. + std::optional<std::u16string> GetPasswordBackup() const; // Updates the note with a password change backup specific // `unique_display_name`.
diff --git a/components/password_manager/core/browser/password_form_manager_unittest.cc b/components/password_manager/core/browser/password_form_manager_unittest.cc index 2cddef3..e563d95 100644 --- a/components/password_manager/core/browser/password_form_manager_unittest.cc +++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
@@ -2102,8 +2102,7 @@ EXPECT_EQ(expected_form.username_value, saved_form.username_value); EXPECT_EQ(expected_form.password_value, saved_form.password_value); - EXPECT_EQ(expected_form.GetPasswordBackupNote(), - saved_form.GetPasswordBackupNote()); + EXPECT_EQ(expected_form.GetPasswordBackup(), saved_form.GetPasswordBackup()); EXPECT_EQ(expected_form.url, saved_form.url); EXPECT_EQ(expected_form.signon_realm, saved_form.signon_realm); }
diff --git a/components/password_manager/core/browser/password_form_unittest.cc b/components/password_manager/core/browser/password_form_unittest.cc index ea29278..b6ffb7b 100644 --- a/components/password_manager/core/browser/password_form_unittest.cc +++ b/components/password_manager/core/browser/password_form_unittest.cc
@@ -15,7 +15,15 @@ form.SetPasswordBackupNote(u"backuppassword"); EXPECT_EQ(form.notes[0].unique_display_name, PasswordNote::kPasswordChangeBackupNoteName); - EXPECT_EQ(form.GetPasswordBackupNote(), u"backuppassword"); + EXPECT_EQ(form.GetPasswordBackup(), u"backuppassword"); +} + +TEST(PasswordFormTest, EmptyPasswordBackupNote) { + PasswordForm form; + form.SetPasswordBackupNote(u""); + EXPECT_EQ(form.notes[0].unique_display_name, + PasswordNote::kPasswordChangeBackupNoteName); + EXPECT_FALSE(form.GetPasswordBackup().has_value()); } TEST(PasswordFormTest, RegularNote) { @@ -31,7 +39,7 @@ form.SetPasswordBackupNote(u"backuppassword"); EXPECT_EQ(form.GetNoteWithEmptyUniqueDisplayName(), u"test note"); - EXPECT_EQ(form.GetPasswordBackupNote(), u"backuppassword"); + EXPECT_EQ(form.GetPasswordBackup(), u"backuppassword"); } TEST(PasswordFormTest, UpdatesExistingNote) {
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc index 9209663a..5b250478 100644 --- a/components/password_manager/core/browser/password_manager_unittest.cc +++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -76,6 +76,7 @@ #include "net/cert/cert_status_flags.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_source_id.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/test/test_network_context.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/components/password_manager/core/browser/password_save_manager_impl.cc b/components/password_manager/core/browser/password_save_manager_impl.cc index ef07cad6..7c94c58 100644 --- a/components/password_manager/core/browser/password_save_manager_impl.cc +++ b/components/password_manager/core/browser/password_save_manager_impl.cc
@@ -671,10 +671,10 @@ pending_credentials.password_value = HasGeneratedPassword() ? generation_manager_->generated_password() : password_to_save.value; - const std::u16string backup_password = - parsed_submitted_form.GetPasswordBackupNote(); - if (!backup_password.empty()) { - pending_credentials.SetPasswordBackupNote(backup_password); + const std::optional<std::u16string> backup_password = + parsed_submitted_form.GetPasswordBackup(); + if (backup_password) { + pending_credentials.SetPasswordBackupNote(backup_password.value()); } pending_credentials.date_last_used = base::Time::Now(); pending_credentials.form_has_autofilled_value =
diff --git a/components/password_manager/core/browser/password_save_manager_impl_unittest.cc b/components/password_manager/core/browser/password_save_manager_impl_unittest.cc index e8eb280..9c717c2 100644 --- a/components/password_manager/core/browser/password_save_manager_impl_unittest.cc +++ b/components/password_manager/core/browser/password_save_manager_impl_unittest.cc
@@ -1687,7 +1687,7 @@ expected_profile_update_form.in_store = password_save_manager_impl()->GetPendingCredentials().in_store; expected_profile_update_form.SetPasswordBackupNote( - parsed_submitted_form_.GetPasswordBackupNote()); + parsed_submitted_form_.GetPasswordBackup().value()); expected_profile_update_form.notes[0].date_created = password_save_manager_impl() ->GetPendingCredentials() @@ -1701,7 +1701,7 @@ expected_account_update_form.in_store = password_save_manager_impl()->GetPendingCredentials().in_store; expected_account_update_form.SetPasswordBackupNote( - parsed_submitted_form_.GetPasswordBackupNote()); + parsed_submitted_form_.GetPasswordBackup().value()); expected_account_update_form.notes[0].date_created = password_save_manager_impl() ->GetPendingCredentials()
diff --git a/components/password_manager/core/browser/ui/credential_ui_entry.cc b/components/password_manager/core/browser/ui/credential_ui_entry.cc index cbc1d30..cb2e5af 100644 --- a/components/password_manager/core/browser/ui/credential_ui_entry.cc +++ b/components/password_manager/core/browser/ui/credential_ui_entry.cc
@@ -73,9 +73,9 @@ note(form.GetNoteWithEmptyUniqueDisplayName()), blocked_by_user(form.blocked_by_user), last_used_time(form.date_last_used) { - if (!form.GetPasswordBackupNote().empty() && + if (form.GetPasswordBackup() && base::FeatureList::IsEnabled(features::kShowRecoveryPassword)) { - backup_password = form.GetPasswordBackupNote(); + backup_password = form.GetPasswordBackup(); } CredentialFacet facet; facet.display_name = form.app_display_name; @@ -132,9 +132,9 @@ // TODO(crbug.com/407501259): instead of saving the last non-empty backup, // consider storing all backups in the credential UI entry and create a // separate card for each of them. - if (!form.GetPasswordBackupNote().empty() && + if (form.GetPasswordBackup() && base::FeatureList::IsEnabled(features::kShowRecoveryPassword)) { - backup_password = form.GetPasswordBackupNote(); + backup_password = form.GetPasswordBackup(); } } }
diff --git a/components/permissions/features.cc b/components/permissions/features.cc index e0769bb9..250d364 100644 --- a/components/permissions/features.cc +++ b/components/permissions/features.cc
@@ -49,10 +49,6 @@ "PermissionsAIv3", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kPermissionsAIv3Geolocation, - "PermissionsAIv3Geolocation", - base::FEATURE_DISABLED_BY_DEFAULT); - // Controls whether to trigger showing a HaTS survey, with the given // `probability` and `trigger_id`. The `probability` parameter is defined and // handled by the HatsService itself. If the parameter
diff --git a/components/permissions/features.h b/components/permissions/features.h index 933e45a..3b1717f 100644 --- a/components/permissions/features.h +++ b/components/permissions/features.h
@@ -37,9 +37,6 @@ BASE_DECLARE_FEATURE(kPermissionsAIv1); COMPONENT_EXPORT(PERMISSIONS_COMMON) -BASE_DECLARE_FEATURE(kPermissionsAIv3Geolocation); - -COMPONENT_EXPORT(PERMISSIONS_COMMON) BASE_DECLARE_FEATURE(kPermissionsAIv3); COMPONENT_EXPORT(PERMISSIONS_COMMON)
diff --git a/components/plus_addresses/plus_address_http_client_impl.h b/components/plus_addresses/plus_address_http_client_impl.h index 0c727a5..03ebd6b78 100644 --- a/components/plus_addresses/plus_address_http_client_impl.h +++ b/components/plus_addresses/plus_address_http_client_impl.h
@@ -22,6 +22,7 @@ class GoogleServiceAuthError; namespace network { +struct ResourceRequest; class SharedURLLoaderFactory; class SimpleURLLoader; } // namespace network
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 39e49f0..3c5eeb5 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -508,11 +508,6 @@ Ist die Richtlinie deaktiviert, können Nutzer im <ph name="PRODUCT_NAME" />-Druckdialogfeld nicht über <ph name="CLOUD_PRINT_NAME" /> drucken. Damit <ph name="CLOUD_PRINT_NAME" />-Ziele sichtbar sind, muss diese Richtlinie auf „Aktiviert“ gesetzt sein und „<ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" />“ darf nicht in der Richtlinie <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" /> stehen.</translation> -<translation id="1390901586107713894">Mit dieser Richtlinie kannst du festlegen, welche Erweiterungen Nutzer NICHT installieren dürfen. Bereits installierte Erweiterungen, die gesperrt sind, werden deaktiviert und Nutzer haben keine Möglichkeit, sie zu aktivieren. Sollte eine aufgrund der Sperrliste deaktivierte Erweiterung aus der Liste entfernt werden, wird sie automatisch wieder aktiviert. - - Der Wert "*" in der Sperrliste gibt an, dass alle Erweiterungen gesperrt sind, sofern sie nicht ausdrücklich auf die Zulassungsliste gesetzt wurden. - - Wenn diese Richtlinie nicht konfiguriert ist, kann der Nutzer jede Erweiterung in <ph name="PRODUCT_NAME" /> installieren.</translation> <translation id="1392703142209771447">Regulärer Ausdruck für die Suche nach der Drucker-ID.</translation> <translation id="1393485621820363363">Aktivierte, an Geräte gebundene Unternehmensdrucker</translation> <translation id="1395505489889158859">Senden von Nutzer- und Dateinamen an native Drucker aktivieren</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 7e279fcb..a6a2d74a 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -526,11 +526,6 @@ Si inhabilitas la política, los usuarios no podrán realizar impresiones en <ph name="CLOUD_PRINT_NAME" /> desde el diálogo de impresión de <ph name="PRODUCT_NAME" />. Para que se puedan detectar los destinos de <ph name="CLOUD_PRINT_NAME" />, debes habilitar esta política y no debe incluirse <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> en la política <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" />.</translation> -<translation id="1390901586107713894">Permite especificar las extensiones que los usuarios NO pueden instalar. Si se incluyen en la lista de elementos bloqueados extensiones que ya están instaladas, no funcionarán y el usuario no podrá habilitarlas. Si las quitas de esa lista, se volverán a habilitar automáticamente. - - Un valor de asterisco (*) en una lista de elementos bloqueados significa que todas las extensiones están incluidas en la lista de elementos bloqueados, a menos que se indique explícitamente que están en la lista de elementos permitidos. - - Si no estableces esta política, el usuario podrá instalar cualquier extensión de <ph name="PRODUCT_NAME" />.</translation> <translation id="1392703142209771447">La expresión regular que coincide con el ID de la impresora.</translation> <translation id="1393485621820363363">Impresoras empresariales habilitadas asociadas a dispositivos</translation> <translation id="1395505489889158859">Permitir el envío de nombres de usuario y nombres de archivo a impresoras nativas</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 1888f0d3..cab065b 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -508,11 +508,6 @@ Si se inhabilita la política, los usuarios no pueden imprimir en <ph name="CLOUD_PRINT_NAME" /> desde el cuadro de diálogo de impresión de <ph name="PRODUCT_NAME" />. Para que los destinos de <ph name="CLOUD_PRINT_NAME" /> sean visibles, se debe habilitar esta política y no se debe incluir <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> en la política <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" />.</translation> -<translation id="1390901586107713894">Permite especificar las extensiones que los usuarios no pueden instalar. Si se bloquea una extensión ya instalada, se inhabilitará y el usuario no podrá habilitarla. Si una extensión que se había inhabilitado porque estaba en la lista de bloqueados se quita de esa lista, volverá a habilitarse automáticamente. - - Si el valor de una lista de bloqueados es un asterisco (*), se bloquearán todas las extensiones excepto las que estén incluidas explícitamente en la lista de permitidos. - - Si no se asigna ningún valor a esta política, el usuario podrá instalar cualquier extensión en <ph name="PRODUCT_NAME" />.</translation> <translation id="1392703142209771447">Expresión regular con la que debe coincidir el ID de impresora.</translation> <translation id="1393485621820363363">Impresoras de dispositivos de empresa habilitadas</translation> <translation id="1395505489889158859">Habilitar el envío de nombres de usuario y de archivo a impresoras nativas</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 434d67e8..151dce3 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -508,11 +508,6 @@ Si vous désactivez cette règle, les utilisateurs ne peuvent pas imprimer sur <ph name="CLOUD_PRINT_NAME" /> à partir de la boîte de dialogue d'impression de <ph name="PRODUCT_NAME" />. Pour que les destinations <ph name="CLOUD_PRINT_NAME" /> restent visibles, cette règle doit être activée, et <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> ne doit pas être inclus dans la règle <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" />.</translation> -<translation id="1390901586107713894">Permet de déterminer quelles extensions les utilisateurs ne peuvent PAS installer. Les extensions déjà installées, mais qui sont bloquées, sont désactivées sans que l'utilisateur puisse les activer. Elles sont automatiquement réactivées dès que vous les retirez de la liste de blocage. - - Si vous saisissez la valeur "*" dans la liste de blocage, toutes les extensions sont bloquées, sauf si elles sont spécifiquement répertoriées dans la liste d'autorisation. - - Si cette règle n'est pas configurée, les utilisateurs peuvent installer n'importe quelle extension dans <ph name="PRODUCT_NAME" />.</translation> <translation id="1392703142209771447">Expression régulière correspondant à l'ID de l'imprimante.</translation> <translation id="1393485621820363363">Imprimantes d'appareils d'entreprise activées</translation> <translation id="1395505489889158859">Autorisez l'envoi du nom d'utilisateur et du nom de fichier aux imprimantes en natif</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index ccd2a31b..c08ffde 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -526,11 +526,6 @@ Jika kebijakan disetel ke Nonaktif, pengguna tidak akan dapat mencetak ke <ph name="CLOUD_PRINT_NAME" /> dari dialog pencetakan <ph name="PRODUCT_NAME" />. Agar tujuan <ph name="CLOUD_PRINT_NAME" /> tetap dapat ditemukan, kebijakan ini harus ditetapkan ke Aktif dan <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> tidak boleh dimasukkan ke kebijakan <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" />.</translation> -<translation id="1390901586107713894">Memungkinkan Anda menentukan ekstensi mana yang TIDAK dapat diinstal pengguna. Ekstensi yang sudah diinstal akan dinonaktifkan jika diblokir, tanpa memberikan opsi kepada pengguna untuk mengaktifkannya. Setelah ekstensi yang dinonaktifkan dihapus dari daftar yang tidak diizinkan, ekstensi akan kembali diaktifkan secara otomatis. - - Nilai '*' untuk daftar yang tidak diizinkan berarti semua ekstensi diblokir kecuali tercantum secara eksplisit dalam daftar yang diizinkan. - - Jika kebijakan ini tidak disetel, pengguna dapat menginstal ekstensi apa pun di <ph name="PRODUCT_NAME" />.</translation> <translation id="1392703142209771447">Ekspresi reguler untuk mencocokkan ID printer.</translation> <translation id="1393485621820363363">Mengaktifkan printer perangkat perusahaan</translation> <translation id="1395505489889158859">Aktifkan pengiriman nama pengguna dan nama file ke printer native</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 8f833acd..ba08bca 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -522,11 +522,6 @@ Se la policy viene impostata su Disattivata, gli utenti non possono stampare con <ph name="CLOUD_PRINT_NAME" /> dalla finestra di dialogo di stampa di <ph name="PRODUCT_NAME" />. Per mantenere rilevabili le destinazioni <ph name="CLOUD_PRINT_NAME" />, questa policy deve essere impostata su Attivata e il valore <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> non deve essere incluso nella policy <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" />.</translation> -<translation id="1390901586107713894">Consente di specificare le estensioni che gli utenti NON possono installare. Le estensioni già installate vengono disattivate, se bloccate, e l'utente non può attivarle. Un'estensione disattivata da una lista bloccata viene automaticamente riattivata nel caso venga rimossa dalla lista. - - Il valore "*" di una lista bloccata significa che tutte le estensioni sono bloccate, a meno che vengano elencate esplicitamente nella lista consentita. - - Se questa policy non viene configurata, l'utente può installare qualsiasi estensione in <ph name="PRODUCT_NAME" />.</translation> <translation id="1392703142209771447">Espressione regolare per trovare corrispondenze con l'ID stampante.</translation> <translation id="1393485621820363363">Stampanti aziendali associate ai dispositivi attive</translation> <translation id="1395505489889158859">Viene attivato l'invio di nome utente e nome file alle stampanti native</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 7275fb4..6a621a0 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -503,11 +503,6 @@ このポリシーを無効に設定した場合、ユーザーは <ph name="PRODUCT_NAME" /> の印刷ダイアログから <ph name="CLOUD_PRINT_NAME" /> で印刷できません。 <ph name="CLOUD_PRINT_NAME" /> を送信先として選択できるようにするには、このポリシーを有効に設定し、<ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" /> ポリシーで「<ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" />」を指定しないようにします。</translation> -<translation id="1390901586107713894">ユーザーがインストールできない拡張機能を指定できます。すでにインストールされている拡張機能をブロック設定した場合、その拡張機能は無効になり、ユーザーが有効にすることはできません。拒否リストに登録して無効になった拡張機能は、拒否リストから削除すると自動的に再度有効になります。 - - 拒否リストで値「*」を指定すると、すべての拡張機能がブロック対象になります(明示的に許可リストに登録している拡張機能は除外されます)。 - - このポリシーを未設定のままにした場合、ユーザーは <ph name="PRODUCT_NAME" /> にあらゆる拡張機能をインストールできます。</translation> <translation id="1392703142209771447">プリンタ ID の照合に使用する正規表現です。</translation> <translation id="1393485621820363363">有効な企業デバイス プリンタ</translation> <translation id="1395505489889158859">ネイティブ プリンタへのユーザー名とファイル名の送信を有効にする</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 5f5142a..0403f23 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -507,11 +507,6 @@ 정책을 사용 중지하면 사용자가 <ph name="PRODUCT_NAME" /> 인쇄 대화상자에서 <ph name="CLOUD_PRINT_NAME" />(으)로 인쇄할 수 없습니다. <ph name="CLOUD_PRINT_NAME" /> 대상을 검색 가능한 상태로 유지하려면 정책을 사용 설정하고 <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" />를 <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" /> 정책에 포함하지 않아야 합니다.</translation> -<translation id="1390901586107713894">사용자가 설치하지 못하는 확장 프로그램을 지정할 수 있습니다. 이미 설치된 확장 프로그램이 차단 목록에 포함된 경우 사용 중지되며, 사용자가 다시 사용할 수 있는 방법은 없습니다. 차단 목록에 포함되어 사용 중지되었던 확장 프로그램이 차단 목록에서 삭제되면 자동으로 다시 사용 설정됩니다. - - 차단 목록의 '*' 값은 모든 확장 프로그램이 명시적으로 허용 목록에 포함되지 않는 한 차단됨을 의미합니다. - - 이 정책을 설정하지 않으면 사용자는 <ph name="PRODUCT_NAME" />의 모든 확장 프로그램을 설치할 수 있습니다.</translation> <translation id="1392703142209771447">프린터 ID와 일치하는 정규 표현식입니다.</translation> <translation id="1393485621820363363">사용 설정된 엔터프라이즈 기기 프린터</translation> <translation id="1395505489889158859">사용자 이름 및 파일 이름을 기본 프린터로 보낼 수 있도록 허용</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 16265c46..63ea6944 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -507,11 +507,6 @@ Als je dit beleid niet toepast, kunnen gebruikers niet naar <ph name="CLOUD_PRINT_NAME" /> afdrukken vanaf het <ph name="PRODUCT_NAME" />-afdrukdialoogvenster. Je kunt ervoor zorgen dat <ph name="CLOUD_PRINT_NAME" />-bestemmingen vindbaar blijven door dit beleid toe te passen en <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> niet op te nemen in het beleid <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" />.</translation> -<translation id="1390901586107713894">Hiermee kun je aangeven welke extensies gebruikers NIET kunnen installeren. Extensies die al zijn geïnstalleerd, worden uitgezet als ze op de blokkeringslijst staan. De gebruiker kan ze niet weer aanzetten. Als een extensie die is uitgezet op basis van de blokkeringslijst, van die lijst wordt verwijderd, wordt de extensie automatisch weer aangezet. - - De waarde * op de blokkeringslijst betekent dat alle extensies worden geblokkeerd, tenzij ze expliciet worden vermeld op de toelatingslijst. - - Als je dit beleid niet instelt, kan de gebruiker elke extensie installeren in <ph name="PRODUCT_NAME" />.</translation> <translation id="1392703142209771447">Reguliere expressie die moet overeenkomen met de printer-ID.</translation> <translation id="1393485621820363363">Zakelijke apparaatprinters aangezet</translation> <translation id="1395505489889158859">Gebruikersnaam en bestandsnaam naar systeemeigen printers sturen aanzetten</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 386dfd9cb..2570487 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -522,11 +522,6 @@ Se a política for definida como "Desativada", os usuários não poderão imprimir no <ph name="CLOUD_PRINT_NAME" /> pela caixa de diálogo de impressão do <ph name="PRODUCT_NAME" />. Para que os destinos do <ph name="CLOUD_PRINT_NAME" /> continuem detectáveis, é necessário que esta política seja definida como "Ativada" e que <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> não seja incluída na política <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" />.</translation> -<translation id="1390901586107713894">Permite especificar quais extensões os usuários NÃO podem instalar. As extensões já instaladas serão desativadas se estiverem bloqueadas, sem a opção de o usuário ativá-las novamente. Quando uma extensão que tiver sido desativada devido à lista de bloqueios for removida da lista, ela será reativada automaticamente. - - Um valor "*" da lista de bloqueio significa que todas as extensões estão bloqueadas, exceto se estiverem explicitamente presentes na lista de permissões. - - Se esta política não for definida, o usuário poderá instalar qualquer extensão no <ph name="PRODUCT_NAME" />.</translation> <translation id="1392703142209771447">Expressão regular para correspondência do ID da impressora.</translation> <translation id="1393485621820363363">Impressoras empresariais ativadas</translation> <translation id="1395505489889158859">Ativar o envio do nome de usuário e do nome de arquivo para impressoras nativas</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index ea7df6b4..fbdfdaa 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -507,11 +507,6 @@ Если правило отключено, пользователи не могут выбирать <ph name="CLOUD_PRINT_NAME" /> в диалоговом окне печати <ph name="PRODUCT_NAME" />. Чтобы принтеры, подключенные к сервису "<ph name="CLOUD_PRINT_NAME" />", были доступны для печати, убедитесь, что это правило включено, а в правиле <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" /> нет параметра <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" />.</translation> -<translation id="1390901586107713894">Позволяет указать, какие расширения запрещено устанавливать пользователям. Установленные расширения будут отключены, если их внести в черный список. Пользователь не сможет включить их. Если расширение присутствовало в черном списке и было удалено из него, оно автоматически включится. - - Значение "*" в черном списке указывает на то, что в него внесены все расширения, которые не содержатся в белом списке. - - Если правило не настроено, пользователь может устанавливать в <ph name="PRODUCT_NAME" /> любые расширения.</translation> <translation id="1392703142209771447">Регулярное выражение для соответствия идентификатору принтера.</translation> <translation id="1393485621820363363">Принтеры, доступные на устройствах компании</translation> <translation id="1395505489889158859">Разрешить отправлять имя пользователя и название файла локальным принтерам</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 9c02c00..5dc996a 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -508,11 +508,6 @@ หากตั้งค่านโยบายเป็น "ปิดใช้" ผู้ใช้จะสั่งพิมพ์ไปยัง <ph name="CLOUD_PRINT_NAME" /> จากกล่องโต้ตอบการพิมพ์ <ph name="PRODUCT_NAME" /> ไม่ได้ หากต้องการให้ค้นพบปลายทาง <ph name="CLOUD_PRINT_NAME" /> ได้ จะต้องตั้งค่านโยบายนี้เป็น "เปิดใช้" และต้องไม่รวม <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> ไว้ในนโยบาย <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" /></translation> -<translation id="1390901586107713894">ให้คุณระบุว่าส่วนขยายใดบ้างที่ผู้ใช้ติดตั้งไม่ได้ ระบบจะปิดใช้ส่วนขยายที่ติดตั้งแล้วหากถูกบล็อกโดยไม่มีวิธีให้ผู้ใช้เปิดใช้ เมื่อนำส่วนขยายที่ปิดใช้เนื่องจากอยู่ในรายการที่บล็อกออกแล้ว ระบบจะเปิดใช้อีกครั้งโดยอัตโนมัติ - - ค่า "*" ในรายการที่บล็อกหมายความว่าส่วนขยายทั้งหมดถูกบล็อก เว้นแต่จะแสดงอยู่อย่างชัดแจ้งในรายการที่อนุญาต - - หากไม่ได้ตั้งค่านโยบายนี้ ผู้ใช้จะติดตั้งส่วนขยายใดก็ได้ใน <ph name="PRODUCT_NAME" /></translation> <translation id="1392703142209771447">นิพจน์ทั่วไปที่ตรงกับรหัสเครื่องพิมพ์</translation> <translation id="1393485621820363363">เครื่องพิมพ์สำหรับอุปกรณ์ขององค์กรที่มีการเปิดใช้</translation> <translation id="1395505489889158859">อนุญาตให้ส่งชื่อผู้ใช้และชื่อไฟล์ไปยังเครื่องพิมพ์ที่มาพร้อมระบบ</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index b255ba2..2ab92dfc 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -509,11 +509,6 @@ Politika, Devre Dışı değerine ayarlanırsa kullanıcılar, <ph name="PRODUCT_NAME" /> yazdırma iletişim kutusundan <ph name="CLOUD_PRINT_NAME" /> yazıcısına yazdırma işlemi yapamaz. <ph name="CLOUD_PRINT_NAME" /> hedeflerinin bulunabilir olmasını sağlamak için bu politikanın doğru değerine ayarlanması ve <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" /> politikasına <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> eklenmemesi gerekir.</translation> -<translation id="1390901586107713894">Kullanıcıların YÜKLEYEMEYECEĞİ uzantıları belirlemenize olanak tanır. Zaten yüklü olan uzantılar engellenirse devre dışı bırakılır ve kullanıcıya bunları etkinleştirmek için bir yol sunulmaz. Engellenenler listesi nedeniyle devre dışı bırakılan bir uzantı listeden çıkarıldıktan sonra otomatik olarak yeniden etkinleştirilir. - - Engellenenler listesi değerinin "*" olması, açıkça izin verilenler listesine eklenmediği sürece tüm uzantıların engelleneceği anlamına gelir. - - Bu politika ayarlanmadan bırakılırsa kullanıcı <ph name="PRODUCT_NAME" /> ürününde herhangi bir uzantıyı yükleyebilir.</translation> <translation id="1392703142209771447">Yazıcı kimliğiyle eşleşecek normal ifade.</translation> <translation id="1393485621820363363">Etkinleştirilmiş kurumsal cihaz yazıcıları</translation> <translation id="1395505489889158859">Kullanıcı adını ve dosya adını yerel yazıcılara göndermeyi etkinleştir</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 4ae5d664..3c5da89 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -509,11 +509,6 @@ Якщо вимкнути це правило, користувачі не зможуть друкувати через <ph name="CLOUD_PRINT_NAME" /> із вікна друку в <ph name="PRODUCT_NAME" />. Щоб принтери <ph name="CLOUD_PRINT_NAME" /> були доступні для друку, потрібно ввімкнути це правило, а в правилі <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" /> не вибирати параметр <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" />.</translation> -<translation id="1390901586107713894">Дає змогу вказати, які розширення користувачі НЕ можуть встановлювати. Якщо вже встановлені розширення є в чорному списку, їх буде вимкнено, а користувачі не зможуть увімкнути їх. Якщо вимкнене розширення вилучать із чорного списку, воно автоматично ввімкнеться. - - Значення "*" у чорному списку вказує на те, що всі розширення заборонені, якщо вони не є чітко прописаними в білому списку. - - Якщо це правило не налаштовано, користувачі можуть встановлювати в <ph name="PRODUCT_NAME" /> усі розширення.</translation> <translation id="1392703142209771447">Регулярний вираз, якому має відповідати ідентифікатор принтера.</translation> <translation id="1393485621820363363">Увімкнені принтери пристроїв підприємства</translation> <translation id="1395505489889158859">Увімкнути надсилання імені користувача та назви файлу власним принтерам</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index 8610f037..45752a2f 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -510,11 +510,6 @@ Nếu bạn đặt chính sách này thành Tắt, người dùng sẽ không thể in bằng <ph name="CLOUD_PRINT_NAME" /> từ hộp thoại in trên <ph name="PRODUCT_NAME" />. Để mọi người luôn tìm thấy các máy in đích <ph name="CLOUD_PRINT_NAME" />, bạn phải đặt chính sách này thành Bật và xóa <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" /> khỏi chính sách <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" />.</translation> -<translation id="1390901586107713894">Cho phép bạn chỉ định những tiện ích mà người dùng KHÔNG THỂ cài đặt. Những tiện ích đã cài đặt sẽ tắt nếu bị chặn. Người dùng không có cách nào để bật những tiện ích đó. Sau khi bạn xóa một tiện ích (bị tắt do thuộc danh sách chặn) khỏi danh sách chặn, thì tiện ích này sẽ tự động được bật lại. - - Giá trị danh sách chặn là "*" có nghĩa là tất cả tiện ích đều bị chặn trừ phi những tiện ích đó được liệt kê rõ ràng trong danh sách cho phép. - - Nếu bạn không đặt chính sách này, thì người dùng có thể cài đặt bất kỳ tiện ích nào trong <ph name="PRODUCT_NAME" />.</translation> <translation id="1392703142209771447">Biểu thức chính quy để so khớp với mã máy in.</translation> <translation id="1393485621820363363">Đã bật máy in kết nối với thiết bị dành cho doanh nghiệp</translation> <translation id="1395505489889158859">Cho phép gửi tên người dùng và tên tệp đến máy in gốc</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index ad90c17..806d7d7 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -506,11 +506,6 @@ 如果此政策已停用,用户将无法通过 <ph name="PRODUCT_NAME" /> 的打印对话框使用 <ph name="CLOUD_PRINT_NAME" />进行打印。 若要使 <ph name="CLOUD_PRINT_NAME" />目的地能被用户发现,则必须确保此政策已启用且 <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" /> 政策中不包含“<ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" />”。</translation> -<translation id="1390901586107713894">让您能够指定禁止用户安装的扩展程序。系统会停用被屏蔽的已安装扩展程序,而且用户无法以任何方式启用这些扩展程序。如果某个因被列入屏蔽名单而遭停用的扩展程序被从屏蔽名单中移除了,系统会自动重新启用该扩展程序。 - - 屏蔽名单值“*”表示所有扩展程序都已被屏蔽,除非是许可名单中明确列出的扩展程序。 - - 如果此政策未设置,用户便能在 <ph name="PRODUCT_NAME" /> 中安装任一款扩展程序。</translation> <translation id="1392703142209771447">用于匹配打印机 ID 的正则表达式。</translation> <translation id="1393485621820363363">已启用企业设备打印机</translation> <translation id="1395505489889158859">允许向原生打印机发送用户名和文件名</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 66c7616..c611880 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -498,11 +498,6 @@ 如果將這項政策設為停用,則使用者無法透過 <ph name="PRODUCT_NAME" /> 列印對話方塊把列印工作提交至 <ph name="CLOUD_PRINT_NAME" />。 如要讓系統搜尋到 <ph name="CLOUD_PRINT_NAME" />目的地,必須將這項政策設為啟用,且不得在 <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME" /> 政策中納入 <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD" />。</translation> -<translation id="1390901586107713894">這項政策可讓你指定禁止使用者安裝的擴充功能。如果封鎖了已安裝的擴充功能,系統會停用該擴充功能,且使用者無法以任何方式啟用。將因為列入封鎖清單而遭到停用的擴充功能從清單中移除後,系統將自動重新啟用該擴充功能。 - - 如果將封鎖清單的值設為「*」,系統會封鎖所有擴充功能 (許可清單中明確列出的擴充功能除外)。 - - 如果不設定這項政策,使用者將可在 <ph name="PRODUCT_NAME" /> 中安裝任何擴充功能。</translation> <translation id="1392703142209771447">用於比對印表機 ID 的規則運算式。</translation> <translation id="1393485621820363363">已啟用企業裝置印表機</translation> <translation id="1395505489889158859">允許將使用者名稱和檔案名稱傳送給原生印表機</translation>
diff --git a/components/privacy_sandbox/privacy_sandbox_features.cc b/components/privacy_sandbox/privacy_sandbox_features.cc index f9001aa..94fbdff 100644 --- a/components/privacy_sandbox/privacy_sandbox_features.cc +++ b/components/privacy_sandbox/privacy_sandbox_features.cc
@@ -87,9 +87,15 @@ "EnforcePrivacySandboxAttestations", base::FEATURE_ENABLED_BY_DEFAULT); +#if BUILDFLAG(IS_ANDROID) BASE_FEATURE(kDefaultAllowPrivacySandboxAttestations, "DefaultAllowPrivacySandboxAttestations", base::FEATURE_ENABLED_BY_DEFAULT); +#else +BASE_FEATURE(kDefaultAllowPrivacySandboxAttestations, + "DefaultAllowPrivacySandboxAttestations", + base::FEATURE_DISABLED_BY_DEFAULT); +#endif const char kPrivacySandboxEnrollmentOverrides[] = "privacy-sandbox-enrollment-overrides";
diff --git a/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEngineChoiceService.java b/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEngineChoiceService.java index 8d6f0af2..70d73acc 100644 --- a/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEngineChoiceService.java +++ b/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEngineChoiceService.java
@@ -255,7 +255,7 @@ ThreadUtils.checkUiThread(); assert mDelegate != null; - if (SearchEnginesFeatureUtils.isChoiceApisDebugEnabled()) { + if (SearchEnginesFeatureUtils.getInstance().isChoiceApisDebugEnabled()) { Log.i(TAG, "launchChoiceScreens()"); } mDelegate.launchDeviceChoiceScreens(); @@ -284,7 +284,7 @@ ThreadUtils.checkUiThread(); assert mDelegate != null; - if (SearchEnginesFeatureUtils.isChoiceApisDebugEnabled()) { + if (SearchEnginesFeatureUtils.getInstance().isChoiceApisDebugEnabled()) { Log.i(TAG, "notifyDeviceChoiceEvent(%d)", eventType); } mDelegate.notifyDeviceChoiceEvent(eventType);
diff --git a/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEnginesFeatureUtils.java b/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEnginesFeatureUtils.java index 9ae9074..79c258f 100644 --- a/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEnginesFeatureUtils.java +++ b/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEnginesFeatureUtils.java
@@ -54,7 +54,7 @@ * <p>This can be controlled by starting chrome with the <code>--enable-choice-apis-debug</code> * command line flag. */ - public static boolean isChoiceApisDebugEnabled() { + public boolean isChoiceApisDebugEnabled() { return CommandLine.getInstance().hasSwitch(ENABLE_CHOICE_APIS_DEBUG_SWITCH); }
diff --git a/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEnginesFeatureUtilsUnitTest.java b/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEnginesFeatureUtilsUnitTest.java index 9a41424..58f4fcd 100644 --- a/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEnginesFeatureUtilsUnitTest.java +++ b/components/search_engines/android/java/src/org/chromium/components/search_engines/SearchEnginesFeatureUtilsUnitTest.java
@@ -34,11 +34,11 @@ @Test public void testIsChoiceApisDebugEnabled() { - assertFalse(SearchEnginesFeatureUtils.isChoiceApisDebugEnabled()); + assertFalse(SearchEnginesFeatureUtils.getInstance().isChoiceApisDebugEnabled()); CommandLine.getInstance() .appendSwitch(SearchEnginesFeatureUtils.ENABLE_CHOICE_APIS_DEBUG_SWITCH); - assertTrue(SearchEnginesFeatureUtils.isChoiceApisDebugEnabled()); + assertTrue(SearchEnginesFeatureUtils.getInstance().isChoiceApisDebugEnabled()); } @Test
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index 7493ee6..fb13b97 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -3049,6 +3049,7 @@ <translation id="6177531123306197852">Koevert C2</translation> <translation id="6180316780098470077">Herprobeer-interval</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Soek oortjies</translation> <translation id="6184868291074982484">Chrome beperk outomaties derdepartywebkoekies</translation> <translation id="6190518157737269631">Stel sekere sleutels op jou sleutelbord tersyde, soos Esc</translation> <translation id="6194209731893739467">Sien al jou nagespoorde produkte hier</translation> @@ -3607,6 +3608,7 @@ <translation id="7130775116821607281">Oplaai is geblokkeer</translation> <translation id="7132939140423847331">Jou admin het verbied dat hierdie data gekopieer word.</translation> <translation id="7135130955892390533">Wys status</translation> +<translation id="7135814714616751706">Soek kortpaaie</translation> <translation id="7136009930065337683">Kom meer te wete oor Incognito</translation> <translation id="7138472120740807366">Afleweringmetode</translation> <translation id="7138678301420049075">Ander</translation> @@ -4179,6 +4181,7 @@ <translation id="8092254339843485299">6x8 dm.</translation> <translation id="8092774999298748321">Dieppers</translation> <translation id="8094917007353911263">Die netwerk wat jy gebruik, kan vereis dat jy <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> besoek.</translation> +<translation id="809543534949702122">Soekgeskiedenis</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Betaalmetode</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index f765381..e17adf01 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -3049,6 +3049,7 @@ <translation id="6177531123306197852">ሲ2 ፖስታ</translation> <translation id="6180316780098470077">የዳግም መሞከር ክፍተት</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ትሮችን ይፈልጉ</translation> <translation id="6184868291074982484">Chrome የሦስተኛ ወገን ኩኪዎችን በራስ-ሰር ይገድባል</translation> <translation id="6190518157737269631">እንደ Esc ያሉ አንዳንድ ቁልፎችን በቁልፍ ሰሌዳዎ ላይ ይሻሩ</translation> <translation id="6194209731893739467">ሁሉንም ክትትል የተደረገባቸው ምርቶችዎን እዚህ ይመልከቱ</translation> @@ -3607,6 +3608,7 @@ <translation id="7130775116821607281">መስቀል ታግዷል</translation> <translation id="7132939140423847331">የእርስዎ አስተዳዳሪ ይህ ውሂብ እንዳይቀዳ ከልክሏል።</translation> <translation id="7135130955892390533">ሁኔታን አሳይ</translation> +<translation id="7135814714616751706">የፍለጋ አቋራጮች</translation> <translation id="7136009930065337683">ማንነት ስለማያሳውቅ ሁነታ የበለጠ ይወቁ</translation> <translation id="7138472120740807366">የማድረሻ ስልት</translation> <translation id="7138678301420049075">ሌላ</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 x 8 ኢንች</translation> <translation id="8092774999298748321">ደማቅ ሐምራዊ</translation> <translation id="8094917007353911263">እየተጠቀሙበት ያለው አውታረ መረብ <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />ን እንዲጎበኙ ሊጠይቅዎት ይችላል።</translation> +<translation id="809543534949702122">ታሪክ ፈልግ</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">የክፍያ ስልት</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 8207d78e..7e4599e 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -3052,6 +3052,7 @@ <translation id="6177531123306197852">ظرف C2</translation> <translation id="6180316780098470077">الفاصل الزمني لإعادة المحاولة</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">البحث في علامات التبويب</translation> <translation id="6184868291074982484">يقيّد متصفّح Chrome تلقائيًا ملفات تعريف الارتباط التابعة لجهات خارجية</translation> <translation id="6190518157737269631">يمكنك تجاوُز بعض المفاتيح على لوحة مفاتيحك، مثل Esc</translation> <translation id="6194209731893739467">الاطّلاع هنا على جميع المنتجات التي يتمّ تتبّع أسعارها</translation> @@ -3610,6 +3611,7 @@ <translation id="7130775116821607281">تحميل الملفات محظور</translation> <translation id="7132939140423847331">حظر المشرف نسخ هذه البيانات.</translation> <translation id="7135130955892390533">عرض الحالة</translation> +<translation id="7135814714616751706">البحث في الاختصارات</translation> <translation id="7136009930065337683">مزيد من المعلومات حول وضع التصفُّح المتخفي</translation> <translation id="7138472120740807366">طريقة التسليم</translation> <translation id="7138678301420049075">أخرى</translation> @@ -4183,6 +4185,7 @@ <translation id="8092254339843485299">6 × 8 بوصة</translation> <translation id="8092774999298748321">أرجواني داكن</translation> <translation id="8094917007353911263">قد تتطلب الشبكة التي تستخدمها زيارة <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">سجلّ البحث</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">طريقة الدفع</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index 02d358a..79edea57 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -3045,6 +3045,7 @@ <translation id="6177531123306197852">এনভেল’প C2</translation> <translation id="6180316780098470077">পুনঃচেষ্টাৰ অন্তৰাল</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">সন্ধানৰ টেব</translation> <translation id="6184868291074982484">Chromeএ স্বয়ংক্ৰিয়ভাৱে তৃতীয় পক্ষৰ কুকিসমূহ সীমিত কৰে</translation> <translation id="6190518157737269631">আপোনাৰ কীব’ৰ্ডৰ কিছুমান কী অ’ভাৰৰাইড কৰক, যেনে, এস্কে’প</translation> <translation id="6194209731893739467">আপোনাৰ আটাইবোৰ ট্ৰেক কৰা প্ৰ’ডাক্ট ইয়াত চাওক</translation> @@ -3603,6 +3604,7 @@ <translation id="7130775116821607281">আপল’ড কৰাটো অৱৰোধ কৰা হৈছে</translation> <translation id="7132939140423847331">আপোনাৰ প্ৰশাসকে এইখিনি ডেটা প্ৰতিলিপি কৰাটো নিষিদ্ধ কৰি থৈছে।</translation> <translation id="7135130955892390533">স্থিতি দেখুৱাওক</translation> +<translation id="7135814714616751706">সন্ধানৰ শ্বৰ্টকাট</translation> <translation id="7136009930065337683">ইনক’গনিট’ ম’ডৰ বিষয়ে অধিক জানক</translation> <translation id="7138472120740807366">ডেলিভাৰীৰ পদ্ধতি</translation> <translation id="7138678301420049075">অন্য</translation> @@ -4175,6 +4177,7 @@ <translation id="8092254339843485299">৬ x ৮ ইঞ্চি</translation> <translation id="8092774999298748321">ডাঠ বেঙুনীয়া</translation> <translation id="8094917007353911263">আপুনি ব্যৱহাৰ কৰি থকা নেটৱর্কৰ বাবে আপুনি<ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> চাব লগা হ’ব পাৰে।</translation> +<translation id="809543534949702122">সন্ধানৰ ইতিহাস</translation> <translation id="8098855213644561659">A3 অতিৰিক্ত</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">পৰিশোধ পদ্ধতি</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index 3c9d55bc..326627c 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -3046,6 +3046,7 @@ <translation id="6177531123306197852">Zərf C2</translation> <translation id="6180316780098470077">Təkrar cəhd intervalı</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Tabları axtarın</translation> <translation id="6184868291074982484">Chrome üçüncü tərəf kukilərini avtomatik məhdudlaşdırır</translation> <translation id="6190518157737269631">Klaviaturanızda Esc kimi bəzi düymələri əvəzləyin</translation> <translation id="6194209731893739467">Bütün izlənən məhsulları burada görə bilərsiniz</translation> @@ -3604,6 +3605,7 @@ <translation id="7130775116821607281">Yükləmə bloklanıb</translation> <translation id="7132939140423847331">Admininiz bu məlumatın kopyalanmasını qadağan edib.</translation> <translation id="7135130955892390533">Statusu göstərin</translation> +<translation id="7135814714616751706">Qısayol axtarın</translation> <translation id="7136009930065337683">Anonim haqqında [ətraflı məlumat]</translation> <translation id="7138472120740807366">Çatdırılma üsulu</translation> <translation id="7138678301420049075">Digər</translation> @@ -4176,6 +4178,7 @@ <translation id="8092254339843485299">6 x 8 düym</translation> <translation id="8092774999298748321">Tünd-bənövşəyi</translation> <translation id="8094917007353911263">İşlətdiyiniz şəbəkə buraya girməyinizi tələb edə bilər: <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Axtarış Tarixçəsi</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Ödəniş Üsulu</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index dcdf034..51eaf80f 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -3049,6 +3049,7 @@ <translation id="6177531123306197852">Канверт C2</translation> <translation id="6180316780098470077">Інтэрвал паміж спробамі</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Пошук укладак</translation> <translation id="6184868291074982484">Chrome аўтаматычна абмяжоўвае выкарыстанне старонніх файлаў cookie</translation> <translation id="6190518157737269631">Перавызначаць некаторыя клавішы на клавіятуры, напрыклад Esc</translation> <translation id="6194209731893739467">Тут можна паглядзець усе прадукты, за якімі вы сочыце</translation> @@ -3607,6 +3608,7 @@ <translation id="7130775116821607281">Запампоўванне забаронена</translation> <translation id="7132939140423847331">Ваш адміністратар забараніў капіраванне гэтых даных.</translation> <translation id="7135130955892390533">Паказаць стан</translation> +<translation id="7135814714616751706">Пошук ярлыкоў</translation> <translation id="7136009930065337683">Даведацца больш пра рэжым інкогніта</translation> <translation id="7138472120740807366">Спосаб дастаўкі</translation> <translation id="7138678301420049075">Іншыя</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 x 8 цаляў</translation> <translation id="8092774999298748321">Насычаны ліловы</translation> <translation id="8094917007353911263">Сетка, якую вы выкарыстоўваеце, можа запатрабаваць ад вас наведаць <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Гісторыя пошуку</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Спосаб аплаты</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index 93e79cb..41f8083 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Плик C2</translation> <translation id="6180316780098470077">Интервал за повторен опит</translation> <translation id="6182972682129119950">A4 x 5</translation> +<translation id="6184099524311454384">Търсене на раздели</translation> <translation id="6184868291074982484">Chrome автоматично ограничава „бисквитките“ на трети страни</translation> <translation id="6190518157737269631">Замяна на някои клавиши на клавиатурата ви, като например Esc</translation> <translation id="6194209731893739467">Тук ще се показват всички проследявани от вас продукти</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Качването е блокирано</translation> <translation id="7132939140423847331">Администраторът ви е забранил копирането на тези данни.</translation> <translation id="7135130955892390533">Показване на състоянието</translation> +<translation id="7135814714616751706">Търсете комбинации</translation> <translation id="7136009930065337683">Научете повече за режима „инкогнито“</translation> <translation id="7138472120740807366">Начин на бърза доставка</translation> <translation id="7138678301420049075">Друго</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 инча</translation> <translation id="8092774999298748321">наситено лилаво</translation> <translation id="8094917007353911263">Използваната от вас мрежа може да изисква да посетите <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">История на търсенията</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Начин на плащане</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index b877faf3..5e5cfb91 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">এনভেলপ C2</translation> <translation id="6180316780098470077">কতক্ষণ পর আবার চেষ্টা করা যাবে</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ট্যাব খুঁজুন</translation> <translation id="6184868291074982484">Chrome থার্ড-পার্টি কুকির উপরে অটোমেটিক সীমাবদ্ধতা আরোপ করে</translation> <translation id="6190518157737269631">আপনার কীবোর্ডে কিছু কী ওভাররাইড করুন, যেমন Esc</translation> <translation id="6194209731893739467">এখানে আপনার সবকটি ট্র্যাক করা প্রোডাক্ট দেখুন</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">ব্লক করা আপলোড</translation> <translation id="7132939140423847331">আপনার অ্যাডমিন এই ডেটা কপি করার থেকে সীমাবদ্ধ করেছেন।</translation> <translation id="7135130955892390533">স্ট্যাটাস দেখুন</translation> +<translation id="7135814714616751706">শর্টকাট সার্চ করুন</translation> <translation id="7136009930065337683">'ছদ্মবেশী' মোড সম্পর্কে আরও জানুন</translation> <translation id="7138472120740807366">ডেলিভারির পদ্ধতি</translation> <translation id="7138678301420049075">অন্যান্য</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">৬ x ৮ ইঞ্চি</translation> <translation id="8092774999298748321">গাঢ় বেগুনি</translation> <translation id="8094917007353911263">আপনি যে নেটওয়ার্কটি ব্যবহার করছেন সেটির জন্য অপনাকে <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />-তে যেতে হতে পারে৷</translation> +<translation id="809543534949702122">সার্চ ইতিহাস</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">পেমেন্টের পদ্ধতি</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index da4e987..12539c7 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Koverta C2</translation> <translation id="6180316780098470077">Interval ponovnih pokušaja</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Pretražite kartice</translation> <translation id="6184868291074982484">Chrome automatski ograničava kolačiće trećih strana</translation> <translation id="6190518157737269631">nadjačati određene tipke na tastaturi, kao što je Esc</translation> <translation id="6194209731893739467">Ovdje pregledajte sve proizvode koje pratite</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Otpremanje je blokirano</translation> <translation id="7132939140423847331">Vaš administrator je zabranio kopiranje ovih podataka.</translation> <translation id="7135130955892390533">Prikaži status</translation> +<translation id="7135814714616751706">Pretražite prečice</translation> <translation id="7136009930065337683">Saznajte više o anonimnom načinu rada</translation> <translation id="7138472120740807366">Način dostave</translation> <translation id="7138678301420049075">Drugo</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 in</translation> <translation id="8092774999298748321">Zagasito ljubičasta</translation> <translation id="8094917007353911263">Mreža koju koristite od vas može zahtijevati da posjetite <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Pretražite historiju</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Način plaćanja</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 90c5bed..f22d386 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Sobre C2</translation> <translation id="6180316780098470077">Interval d'intents</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Cerca pestanyes</translation> <translation id="6184868291074982484">Chrome limita automàticament les galetes de tercers</translation> <translation id="6190518157737269631">Anul·lar algunes tecles del teclat, com ara Esc</translation> <translation id="6194209731893739467">Consulta aquí tots els productes que segueixes</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Pujada bloquejada</translation> <translation id="7132939140423847331">L'administrador ha prohibit copiar aquestes dades.</translation> <translation id="7135130955892390533">Mostra l'estat</translation> +<translation id="7135814714616751706">Cerca dreceres</translation> <translation id="7136009930065337683">Més informació sobre el mode d'incògnit</translation> <translation id="7138472120740807366">Mètode d'entrega</translation> <translation id="7138678301420049075">Altres</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 polzades</translation> <translation id="8092774999298748321">Porpra intens</translation> <translation id="8094917007353911263">És possible que la xarxa que esteu fent servir requereixi que visiteu <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Historial de cerques</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Mètode de pagament</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index cc52fb8..2bd1e829 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -3045,6 +3045,7 @@ <translation id="6177531123306197852">Obálka C2</translation> <translation id="6180316780098470077">Interval opakování</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Hledat karty</translation> <translation id="6184868291074982484">Chrome automaticky omezuje soubory cookie třetích stran</translation> <translation id="6190518157737269631">Přepsat některé klávesy na klávesnici, například Esc</translation> <translation id="6194209731893739467">Tady zobrazíte všechny sledované produkty</translation> @@ -3603,6 +3604,7 @@ <translation id="7130775116821607281">Nahrání je blokováno</translation> <translation id="7132939140423847331">Váš správce kopírování těchto dat zakázal.</translation> <translation id="7135130955892390533">Zobrazit stav</translation> +<translation id="7135814714616751706">Vyhledat zkratky</translation> <translation id="7136009930065337683">Další informace o anonymním režimu</translation> <translation id="7138472120740807366">Způsob doručení</translation> <translation id="7138678301420049075">Ostatní</translation> @@ -4175,6 +4177,7 @@ <translation id="8092254339843485299">6 × 8″</translation> <translation id="8092774999298748321">Tmavě nachová</translation> <translation id="8094917007353911263">Síť, kterou používáte, může vyžadovat, abyste navštívili stránku <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Historie vyhledávání</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Platební metoda</translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index cd7e7e8..48351ddf 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Amlen C2</translation> <translation id="6180316780098470077">Ysbaid rhoi cynnig arall arni</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Chwilio Tabiau</translation> <translation id="6184868291074982484">Mae Chrome yn cyfyngu ar gwcis trydydd parti yn awtomatig</translation> <translation id="6190518157737269631">Diystyru rhai bysellau ar eich bysellfwrdd, megis Esc</translation> <translation id="6194209731893739467">Gweld eich holl gynhyrchion sy'n cael eu holrhain yma</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Uwchlwytho wedi'i rwystro</translation> <translation id="7132939140423847331">Mae eich gweinyddwr wedi gwahardd y data hyn rhag cael eu copïo.</translation> <translation id="7135130955892390533">Dangos statws</translation> +<translation id="7135814714616751706">Chwilio llwybrau byr</translation> <translation id="7136009930065337683">Dysgu rhagor am y modd Anhysbys</translation> <translation id="7138472120740807366">Dull cyflwyno</translation> <translation id="7138678301420049075">Arall</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 x 8 modfedd</translation> <translation id="8092774999298748321">Porffor Tywyll</translation> <translation id="8094917007353911263">Mae'n bosib y bydd y rhwydwaith rydych yn ei ddefnyddio yn gofyn i chi fynd i <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Hanes Chwilio</translation> <translation id="8098855213644561659">A3 Ychwanegol</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Dull Talu</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 159eaf3..1dfd5ff7 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -2270,7 +2270,7 @@ <translation id="484671803914931257">Få rabat på <ph name="MERCHANT_NAME" /> og meget mere</translation> <translation id="484988093836683706">Brug enhedsoplåsning</translation> <translation id="4850669014075537160">Rulning</translation> -<translation id="4850886885716139402">Vis</translation> +<translation id="4850886885716139402">Se</translation> <translation id="4854853140771946034">Opret hurtigt en ny note i Google Keep</translation> <translation id="4855395119669662878">Din administrator starter uploaden af dine filer til <ph name="CLOUD_PROVIDER" /> <ph name="DATE_TIME" />. Sørg for, at din enhed er forbundet, indtil din filupload er fuldført. Under uploaden kan du kun læse lokale filer.</translation> <translation id="485902285759009870">Verificerer koden...</translation> @@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Konvolut C2</translation> <translation id="6180316780098470077">Interval for gentagelse af forsøg</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Søg i faner</translation> <translation id="6184868291074982484">Chrome begrænser automatisk tredjepartscookies</translation> <translation id="6190518157737269631">Tilsidesætter visse taster på dit tastatur, f.eks. Esc</translation> <translation id="6194209731893739467">Se alle de produkter, du holder øje med, her</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Blokeret upload</translation> <translation id="7132939140423847331">Din administrator tillader ikke kopiering af disse data.</translation> <translation id="7135130955892390533">Vis status</translation> +<translation id="7135814714616751706">Søg efter genveje</translation> <translation id="7136009930065337683">Få flere oplysninger om inkognitotilstand</translation> <translation id="7138472120740807366">Leveringsmetode</translation> <translation id="7138678301420049075">Andet</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 tommer</translation> <translation id="8092774999298748321">Mørkelilla</translation> <translation id="8094917007353911263">Det netværk, du bruger, kan kræve, at du går til <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Søgehistorik</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Betalingsmetode</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 1e8216f..06221c2 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -3048,6 +3048,7 @@ <translation id="6177531123306197852">Umschlag C2</translation> <translation id="6180316780098470077">Wiederholungsintervall</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Tabs suchen</translation> <translation id="6184868291074982484">Chrome schränkt Drittanbieter-Cookies automatisch ein</translation> <translation id="6190518157737269631">Einige Tasten auf der Tastatur überschreiben, z. B. Esc</translation> <translation id="6194209731893739467">Alle beobachteten Produkte hier ansehen</translation> @@ -3606,6 +3607,7 @@ <translation id="7130775116821607281">Hochladen blockiert</translation> <translation id="7132939140423847331">Dein Administrator hat das Kopieren dieser Daten untersagt.</translation> <translation id="7135130955892390533">Status anzeigen</translation> +<translation id="7135814714616751706">Tastenkombinationen suchen</translation> <translation id="7136009930065337683">Weitere Informationen zum Inkognitomodus</translation> <translation id="7138472120740807366">Lieferoption</translation> <translation id="7138678301420049075">Sonstiges</translation> @@ -4179,6 +4181,7 @@ <translation id="8092254339843485299">6 × 8 Zoll</translation> <translation id="8092774999298748321">Dunkelviolett</translation> <translation id="8094917007353911263">Unter Umständen erfordert das von dir verwendete Netzwerk, dass du <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> aufrufst.</translation> +<translation id="809543534949702122">Suchverlauf</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Zahlungsmethode</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index 136e4d36..632d8a95 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -3052,6 +3052,7 @@ <translation id="6177531123306197852">Φάκελος C2</translation> <translation id="6180316780098470077">Διάστημα επανάληψης</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Αναζήτηση στις καρτέλες</translation> <translation id="6184868291074982484">Το Chrome περιορίζει αυτόματα τα cookie τρίτου μέρους</translation> <translation id="6190518157737269631">Παρακάμψτε ορισμένα πλήκτρα στο πληκτρολόγιό σας, όπως το πλήκτρο Esc</translation> <translation id="6194209731893739467">Δείτε όλα τα προϊόντα παρακολούθησης εδώ</translation> @@ -3611,6 +3612,7 @@ <translation id="7130775116821607281">Αποκλεισμένη μεταφόρτωση</translation> <translation id="7132939140423847331">Ο διαχειριστής απαγορεύει την αντιγραφή αυτών των δεδομένων.</translation> <translation id="7135130955892390533">Εμφάνιση κατάστασης</translation> +<translation id="7135814714616751706">Αναζήτηση συντομεύσεων</translation> <translation id="7136009930065337683">Μάθετε περισσότερα σχετικά με την Ανώνυμη περιήγηση</translation> <translation id="7138472120740807366">Μέθοδος προβολής</translation> <translation id="7138678301420049075">Άλλο</translation> @@ -4184,6 +4186,7 @@ <translation id="8092254339843485299">6 x 8 ίντσες</translation> <translation id="8092774999298748321">Βαθύ μοβ</translation> <translation id="8094917007353911263">Το δίκτυο που χρησιμοποιείτε ενδέχεται να σας ζητήσει να επισκεφτείτε τη διεύθυνση <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Ιστορικό αναζήτησης</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Τρόπος πληρωμής</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index 15becd9..fad09b4f 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Envelope C2</translation> <translation id="6180316780098470077">Retry interval</translation> <translation id="6182972682129119950">A4 x 5</translation> +<translation id="6184099524311454384">Search tabs</translation> <translation id="6184868291074982484">Chrome automatically limits third-party cookies</translation> <translation id="6190518157737269631">Override some keys on your keyboard, like Esc</translation> <translation id="6194209731893739467">See all your tracked products here</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Blocked upload</translation> <translation id="7132939140423847331">Your admin has prohibited this data from being copied.</translation> <translation id="7135130955892390533">Show status</translation> +<translation id="7135814714616751706">Search shortcuts</translation> <translation id="7136009930065337683">Learn more about Incognito</translation> <translation id="7138472120740807366">Delivery method</translation> <translation id="7138678301420049075">Other</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 in x 8 in</translation> <translation id="8092774999298748321">Deep purple</translation> <translation id="8094917007353911263">The network that you are using may require you to visit <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Search history</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Payment Method</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 7af1861..d3b4a0a9 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -3051,6 +3051,7 @@ <translation id="6177531123306197852">Sobre C2</translation> <translation id="6180316780098470077">Intervalo entre reintentos</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Buscar pestañas</translation> <translation id="6184868291074982484">Chrome limita automáticamente las cookies de terceros</translation> <translation id="6190518157737269631">Anular algunas teclas del teclado, como Esc</translation> <translation id="6194209731893739467">Encuentra todos tus productos con seguimiento aquí</translation> @@ -3609,6 +3610,7 @@ <translation id="7130775116821607281">Carga bloqueada</translation> <translation id="7132939140423847331">Tu administrador prohíbe que se copien estos datos.</translation> <translation id="7135130955892390533">Mostrar estado</translation> +<translation id="7135814714616751706">Buscar accesos directos</translation> <translation id="7136009930065337683">Más información sobre el modo Incógnito</translation> <translation id="7138472120740807366">Método de entrega</translation> <translation id="7138678301420049075">Otros</translation> @@ -4182,6 +4184,7 @@ <translation id="8092254339843485299">15.2 × 20.3 cm (6 × 8 in)</translation> <translation id="8092774999298748321">Púrpura oscuro</translation> <translation id="8094917007353911263">Es posible que la red que estás usando requiera que accedas a <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Historial de búsqueda</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Forma de pago</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 8be5225..069c1d09 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Sobre C2</translation> <translation id="6180316780098470077">Intervalo de reintentos</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Buscar pestañas</translation> <translation id="6184868291074982484">Chrome limita automáticamente las cookies de terceros</translation> <translation id="6190518157737269631">Anular algunas teclas del teclado, como Esc</translation> <translation id="6194209731893739467">Consulta todos los productos que sigues aquí</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Subida bloqueada</translation> <translation id="7132939140423847331">Tu administrador ha prohibido que se copien estos datos.</translation> <translation id="7135130955892390533">Mostrar estado</translation> +<translation id="7135814714616751706">Buscar accesos directos</translation> <translation id="7136009930065337683">Más información sobre el modo Incógnito</translation> <translation id="7138472120740807366">Método de entrega</translation> <translation id="7138678301420049075">Otro</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6x8 pulgadas</translation> <translation id="8092774999298748321">Morado intenso</translation> <translation id="8094917007353911263">La red que estás utilizando puede requerir que accedas a la página <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Historial de búsqueda</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Método de pago</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index cd1405b..f55795b 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Ümbrik C2</translation> <translation id="6180316780098470077">Uuesti proovimise intervall</translation> <translation id="6182972682129119950">A4 × 5</translation> +<translation id="6184099524311454384">Otsige vahelehtedelt</translation> <translation id="6184868291074982484">Chrome piirab automaatselt kolmanda osapoole küpsisefaile</translation> <translation id="6190518157737269631">Saate alistada oma klaviatuuri teatud klahve, näiteks paoklahvi</translation> <translation id="6194209731893739467">Vaadake kõiki oma jälgitavaid tooteid siin</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Blokeeritud üleslaadimine</translation> <translation id="7132939140423847331">Teie administraator on keelanud nende andmete kopeerimise.</translation> <translation id="7135130955892390533">Kuva olek</translation> +<translation id="7135814714616751706">Otseteede otsing</translation> <translation id="7136009930065337683">Lisateave inkognito režiimi kohta</translation> <translation id="7138472120740807366">Kohaletoimetamisviis</translation> <translation id="7138678301420049075">Muu</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 × 8 tolli</translation> <translation id="8092774999298748321">Sügavlilla</translation> <translation id="8094917007353911263">Võrk, mida kasutate, võib nõuda veebilehe <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> külastamist.</translation> +<translation id="809543534949702122">Otsinguajalugu</translation> <translation id="8098855213644561659">A3 ekstra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Makseviis</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 0c84d3a..d5fd0f2 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -3042,6 +3042,7 @@ <translation id="6177531123306197852">C2 gutun-azala</translation> <translation id="6180316780098470077">Saiakeren arteko tartea</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Bilatu fitxak</translation> <translation id="6184868291074982484">Chrome-k automatikoki mugatzen ditu hirugarrenen cookieak.</translation> <translation id="6190518157737269631">Zure teklatuko tekla batzuk (adibidez, Ihes) ordeztu</translation> <translation id="6194209731893739467">Ikusi jarraipena egiten diezun produktu guztiak hemen</translation> @@ -3600,6 +3601,7 @@ <translation id="7130775116821607281">Kargatzeko aukera blokeatuta dago</translation> <translation id="7132939140423847331">Administratzaileak debekatu egin du datu hauek kopiatzea.</translation> <translation id="7135130955892390533">Erakutsi egoera</translation> +<translation id="7135814714616751706">Bilatu lasterbideak</translation> <translation id="7136009930065337683">Lortu ezkutuko moduari buruzko informazio gehiago</translation> <translation id="7138472120740807366">Entrega-metodoa</translation> <translation id="7138678301420049075">Beste bat</translation> @@ -4171,6 +4173,7 @@ <translation id="8092254339843485299">15,24 × 20,32 cm (6 × 8 in)</translation> <translation id="8092774999298748321">More bizia</translation> <translation id="8094917007353911263">Baliteke darabilzun sarearen <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> orrira joan behar izatea.</translation> +<translation id="809543534949702122">Bilaketa-historia</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Ordainketa-metodoa</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 39f7c21..c501de11e 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">پاکت سی۲</translation> <translation id="6180316780098470077">فاصله زمانی امتحان مجدد</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">جستجوی برگهها</translation> <translation id="6184868291074982484">Chrome کوکیهای طرف سوم را بهطور خودکار محدود میکند</translation> <translation id="6190518157737269631">برخیاز کلیدهای روی صفحهکلید ملغی میشود، مثلاً «کلید گریز»</translation> <translation id="6194209731893739467">همه محصولات پیگیریشدهتان را در اینجا ببینید</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">بارگذاری مسدود شد</translation> <translation id="7132939140423847331">سرپرست کپی شدن این دادهها را ممنوع کرده است.</translation> <translation id="7135130955892390533">نمایش وضعیت</translation> +<translation id="7135814714616751706">جستجوی میانبرها</translation> <translation id="7136009930065337683">درباره «حالت ناشناس» بیشتر بدانید</translation> <translation id="7138472120740807366">روش تحویل</translation> <translation id="7138678301420049075">دیگر</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">۸ × ۶ اینچ</translation> <translation id="8092774999298748321">بنفش پررنگ</translation> <translation id="8094917007353911263">شبکهای که از آن استفاده میکنید ممکن است از شما بخواهد که <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> را ببینید.</translation> +<translation id="809543534949702122">سابقه «جستجو»</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">روش پرداخت</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index 940c35e..a9270e4 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -3051,6 +3051,7 @@ <translation id="6177531123306197852">Kirjekuori C2</translation> <translation id="6180316780098470077">Uudelleenyritysten aikaväli</translation> <translation id="6182972682129119950">A4 x 5</translation> +<translation id="6184099524311454384">Hae välilehtiä</translation> <translation id="6184868291074982484">Chrome rajoittaa kolmannen osapuolen evästeet automaattisesti</translation> <translation id="6190518157737269631">Ohita joitakin näppäimistön näppäimiä (esim. Esc)</translation> <translation id="6194209731893739467">Katso kaikki seuratut tuotteet täältä</translation> @@ -3609,6 +3610,7 @@ <translation id="7130775116821607281">Estetty lataus</translation> <translation id="7132939140423847331">Järjestelmänvalvojasi on kieltänyt tämän datan kopioimisen.</translation> <translation id="7135130955892390533">Näytä tila</translation> +<translation id="7135814714616751706">Hae pikakomentoja</translation> <translation id="7136009930065337683">Lue lisää incognitosta</translation> <translation id="7138472120740807366">Toimitustapa</translation> <translation id="7138678301420049075">Muu</translation> @@ -4182,6 +4184,7 @@ <translation id="8092254339843485299">6 x 8 tuumaa</translation> <translation id="8092774999298748321">Tummanvioletti</translation> <translation id="8094917007353911263">Käyttämäsi verkko saattaa edellyttää vierailua osoitteessa <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Hae historiasta</translation> <translation id="8098855213644561659">A4-ekstra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Maksutapa</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 70f2ed8..5a7e564 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -868,6 +868,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">Mga peripheral na naka-attach sa device na ito habang naka-log in ka</translation> <translation id="2450019289047528273">Mga paraan ng pagbabayad at iba pang impormasyon mula sa Google Wallet</translation> +<translation id="2451201933352935301">Gustong pamahalaan ng <ph name="URL" /> ang mga window sa lahat ng iyong screen</translation> <translation id="2451607499823206582">Pagsubaybay</translation> <translation id="2452098632681057184">Ecology at Kapaligiran</translation> <translation id="2452837234288608067">Wala kaming maitutulong diyan. Subukan ulit.</translation> @@ -3050,6 +3051,7 @@ <translation id="6177531123306197852">Envelope C2</translation> <translation id="6180316780098470077">Interval ng pag-retry</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Maghanap sa Mga Tab</translation> <translation id="6184868291074982484">Awtomatikong nililimitahan ng Chrome ang third-party na cookies</translation> <translation id="6190518157737269631">Mag-override ng ilang key sa iyong keyboard, gaya ng Esc</translation> <translation id="6194209731893739467">Tingnan ang lahat ng iyong sinusubaybayang produkto rito</translation> @@ -3608,6 +3610,7 @@ <translation id="7130775116821607281">Na-block ang pag-upload</translation> <translation id="7132939140423847331">Ipinagbawal ng iyong admin ang pagkopya sa data na ito.</translation> <translation id="7135130955892390533">Ipakita ang status</translation> +<translation id="7135814714616751706">Maghanap ng mga shortcut</translation> <translation id="7136009930065337683">Matuto pa tungkol sa Incognito</translation> <translation id="7138472120740807366">Pamamaraan ng paghahatid</translation> <translation id="7138678301420049075">Iba pa</translation> @@ -4181,6 +4184,7 @@ <translation id="8092254339843485299">6 x 8 in</translation> <translation id="8092774999298748321">Deep Purple</translation> <translation id="8094917007353911263">Maaaring hilingin ng network na ginagamit mo na bisitahin mo ang <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">History ng Paghahanap</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Paraan ng Pagbabayad</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index 036cccc..22c61dc 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Enveloppe C2</translation> <translation id="6180316780098470077">Intervalle entre les nouveaux essais</translation> <translation id="6182972682129119950">A4 x 5</translation> +<translation id="6184099524311454384">Rechercher des onglets</translation> <translation id="6184868291074982484">Chrome limite automatiquement les témoins tiers</translation> <translation id="6190518157737269631">Remplacer certaines touches de votre clavier, comme Échap</translation> <translation id="6194209731893739467">Vous pouvez voir tous vos produits suivis en cliquant ici</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Téléversement bloqué</translation> <translation id="7132939140423847331">Votre administrateur a interdit la copie de ces données.</translation> <translation id="7135130955892390533">Afficher l’état</translation> +<translation id="7135814714616751706">Recherchez des raccourcis</translation> <translation id="7136009930065337683">En savoir plus à propos de la navigation privée</translation> <translation id="7138472120740807366">Mode de livraison rapide</translation> <translation id="7138678301420049075">Autre</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 po x 8 po</translation> <translation id="8092774999298748321">Mauve foncé</translation> <translation id="8094917007353911263">Le réseau que vous utilisez peut vous demander de visiter <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> .</translation> +<translation id="809543534949702122">Historique de recherche</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Mode de paiement</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index 0314bdf9..f90487f 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Enveloppe C2</translation> <translation id="6180316780098470077">Intervalle entre les tentatives</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Rechercher dans les onglets</translation> <translation id="6184868291074982484">Chrome limite automatiquement les cookies tiers</translation> <translation id="6190518157737269631">Remplacer certaines touches du clavier, comme Échap</translation> <translation id="6194209731893739467">Retrouvez tous vos produits suivis ici</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Importation bloquée</translation> <translation id="7132939140423847331">Votre administrateur a interdit la copie de ces données.</translation> <translation id="7135130955892390533">Afficher l'état</translation> +<translation id="7135814714616751706">Rechercher des raccourcis</translation> <translation id="7136009930065337683">En savoir plus sur la navigation privée</translation> <translation id="7138472120740807366">Mode de livraison</translation> <translation id="7138678301420049075">Autre</translation> @@ -4182,6 +4184,7 @@ <translation id="8092254339843485299">6 x 8 pouces</translation> <translation id="8092774999298748321">Violet foncé</translation> <translation id="8094917007353911263">Pour utiliser ce réseau, il est possible que deviez vous rendre sur la page <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Rechercher dans l'historique</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Mode de paiement</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 9d0b89f0..df378ffe 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Sobre C2</translation> <translation id="6180316780098470077">Intervalo de reintentos</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Realiza buscas nas pestanas</translation> <translation id="6184868291074982484">Chrome limita automaticamente as cookies de terceiros</translation> <translation id="6190518157737269631">Ignora algunhas teclas do teclado, como Escape</translation> <translation id="6194209731893739467">Aquí podes ver todos os produtos dos que fagas un seguimento</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Bloqueouse a carga</translation> <translation id="7132939140423847331">O teu administrador prohibiu que copiases estes datos.</translation> <translation id="7135130955892390533">Mostrar estado</translation> +<translation id="7135814714616751706">Busca atallos</translation> <translation id="7136009930065337683">Máis información sobre o modo de incógnito</translation> <translation id="7138472120740807366">Método de entrega</translation> <translation id="7138678301420049075">Outros</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 x 8 polgadas</translation> <translation id="8092774999298748321">Púrpura intenso</translation> <translation id="8094917007353911263">É posible que a rede que utilizas requira o acceso a <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Historial de busca</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Método de pago</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 60cd905..f29ab780 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">એન્વલપ C2</translation> <translation id="6180316780098470077">ફરી પ્રયાસ કરવા માટેનો અંતરાલ</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ટૅબ શોધો</translation> <translation id="6184868291074982484">Chrome ત્રીજા પક્ષની કુકીને ઑટોમૅટિક રીતે મર્યાદિત કરે છે</translation> <translation id="6190518157737269631">તમારા કીબોર્ડ પર અમુક કી ઓવરરાઇડ કરો, જેમ કે Esc</translation> <translation id="6194209731893739467">તમારી ટ્રૅક કરેલી બધી પ્રોડક્ટ અહીં જુઓ</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">અપલોડ કરવાનું બ્લૉક કરેલું છે</translation> <translation id="7132939140423847331">તમારા ઍડમિન દ્વારા આ ડેટાને કૉપિ કરવાથી પ્રતિબંધિત કરવામાં આવ્યો છે.</translation> <translation id="7135130955892390533">સ્ટેટસ બતાવો</translation> +<translation id="7135814714616751706">શૉર્ટકટ શોધો</translation> <translation id="7136009930065337683">છૂપા મોડ વિશે વધુ જાણો</translation> <translation id="7138472120740807366">વિતરણ પદ્ધતિ</translation> <translation id="7138678301420049075">અન્ય</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 ઇંચ</translation> <translation id="8092774999298748321">ઘાટો જાંબલી</translation> <translation id="8094917007353911263">તમે ઉપયોગ કરી રહ્યાં છો તે નેટવર્કને <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> ની મુલાકાત લેવાની જરૂર પડી શકે છે.</translation> +<translation id="809543534949702122">શોધ ઇતિહાસ</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">ચુકવણીની પદ્ધતિ</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index de19735b..1397028 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">C2 साइज़ का लिफ़ाफ़ा</translation> <translation id="6180316780098470077">बार-बार कोशिश किए जाने के बीच का समय</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">टैब खोजें</translation> <translation id="6184868291074982484">Chrome, तीसरे पक्ष की कुकी को अपने-आप सीमित कर देता है</translation> <translation id="6190518157737269631">अपने कीबोर्ड पर Esc जैसे कुछ बटनों के इनपुट को बदलने की अनुमति दें</translation> <translation id="6194209731893739467">ट्रैक किए गए अपने सभी प्रॉडक्ट यहां देखें</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">फ़ाइल को अपलोड करने की अनुमति नहीं है</translation> <translation id="7132939140423847331">आपके एडमिन ने इस डेटा को कॉपी किए जाने पर रोक लगाई है.</translation> <translation id="7135130955892390533">स्थिति दिखाएं</translation> +<translation id="7135814714616751706">शॉर्टकट खोजें</translation> <translation id="7136009930065337683">गुप्त मोड के बारे में ज़्यादा जानें</translation> <translation id="7138472120740807366">वितरण का तरीका</translation> <translation id="7138678301420049075">अन्य</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 इंच</translation> <translation id="8092774999298748321">गहरा बैंगनी</translation> <translation id="8094917007353911263">आप जिस नेटवर्क का उपयोग कर रहे हैं उसके लिए आपको <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> पर जाने की ज़रूरत पड़ सकती है.</translation> +<translation id="809543534949702122">खोज इतिहास</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">ए6</translation> <translation id="8103161714697287722">भुगतान का तरीका</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 1bd754d..5e9994b 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -3049,6 +3049,7 @@ <translation id="6177531123306197852">Omotnica C2</translation> <translation id="6180316780098470077">Interval između ponovnih pokušaja</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Pretraži kartice</translation> <translation id="6184868291074982484">Chrome automatski ograničava kolačiće trećih strana</translation> <translation id="6190518157737269631">Nadjačavanje nekih tipki na tipkovnici, kao što je Esc</translation> <translation id="6194209731893739467">Ovdje pogledajte sve svoje praćene proizvode</translation> @@ -3607,6 +3608,7 @@ <translation id="7130775116821607281">Blokirani prijenos</translation> <translation id="7132939140423847331">Vaš je administrator zabranio kopiranje tih podataka.</translation> <translation id="7135130955892390533">Prikaži status</translation> +<translation id="7135814714616751706">Pretražite prečace</translation> <translation id="7136009930065337683">Saznajte više o anonimnom načinu rada</translation> <translation id="7138472120740807366">Način isporuke</translation> <translation id="7138678301420049075">Ostalo</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 x 8 in</translation> <translation id="8092774999298748321">Tamnoljubičasta</translation> <translation id="8094917007353911263">Za mrežu koju upotrebljavate možda ćete morati posjetiti stranicu <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Povijest pretraživanja</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Način plaćanja</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index 0f081b9..a5051fcc 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -3046,6 +3046,7 @@ <translation id="6177531123306197852">C2 boríték</translation> <translation id="6180316780098470077">Újrapróbálkozások közötti idő</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Keresés a lapokon</translation> <translation id="6184868291074982484">A Chrome automatikusan korlátozza a harmadik féltől származó cookie-kat</translation> <translation id="6190518157737269631">Felülbírálni a billentyűzet egyes gombjait, például az Esc billentyűt</translation> <translation id="6194209731893739467">Itt lesz majd látható az összes nyomon követett termék</translation> @@ -3604,6 +3605,7 @@ <translation id="7130775116821607281">Feltöltés letiltva</translation> <translation id="7132939140423847331">A rendszergazda nem engedélyezi az adatok másolását.</translation> <translation id="7135130955892390533">Állapot megjelenítése</translation> +<translation id="7135814714616751706">Billentyűparancs keresése</translation> <translation id="7136009930065337683">További információ az inkognitó módról.</translation> <translation id="7138472120740807366">Kézbesítési mód</translation> <translation id="7138678301420049075">Egyéb</translation> @@ -4177,6 +4179,7 @@ <translation id="8092254339843485299">6 × 8 hüvelyk</translation> <translation id="8092774999298748321">Mélylila</translation> <translation id="8094917007353911263">Az Ön által használt hálózat megkövetelheti a(z) <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> felkeresését.</translation> +<translation id="809543534949702122">Keresési előzmények</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Fizetési mód</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index 8ed2a43..e4664b30 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -3059,6 +3059,7 @@ <translation id="6177531123306197852">Envelope C2</translation> <translation id="6180316780098470077">Կրկնության միջակայք</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Որոնեք ներդիրներ</translation> <translation id="6184868291074982484">Chrome-ն ավտոմատ սահմանափակում է երրորդ կողմի քուքիները</translation> <translation id="6190518157737269631">Ստեղնաշարի կամ որոշ ստեղների, օրինակ՝ Esc-ի, փոխարինում</translation> <translation id="6194209731893739467">Տեսեք բոլոր ապրանքները, որոնք հետագծում եք, այստեղ</translation> @@ -3617,6 +3618,7 @@ <translation id="7130775116821607281">Վերբեռնումն արգելափակված է</translation> <translation id="7132939140423847331">Ձեր ադմինիստրատորն արգելել է այս տվյալների պատճենումը։</translation> <translation id="7135130955892390533">Ցուցադրել կարգավիճակը</translation> +<translation id="7135814714616751706">Որոնեք դյուրանցումներ</translation> <translation id="7136009930065337683">Իմանալ ավելին ինկոգնիտո ռեժիմի մասին</translation> <translation id="7138472120740807366">Առաքման եղանակ</translation> <translation id="7138678301420049075">Այլ</translation> @@ -4189,6 +4191,7 @@ <translation id="8092254339843485299">6 x 8 դյույմ</translation> <translation id="8092774999298748321">Մուգ մանուշակագույն</translation> <translation id="8094917007353911263">Ցանցը, որից օգտվում եք, կարող է պահանջել, որպեսզի դուք այցելեք <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />:</translation> +<translation id="809543534949702122">Որոնում պատմության մեջ</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Վճարման եղանակ</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 29b5ba3..43428a9 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Envelope C2</translation> <translation id="6180316780098470077">Interval percobaan ulang</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Telusuri Tab</translation> <translation id="6184868291074982484">Chrome otomatis membatasi cookie pihak ketiga</translation> <translation id="6190518157737269631">Ganti beberapa tombol di keyboard, seperti Esc</translation> <translation id="6194209731893739467">Lihat semua produk yang dipantau di sini</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Upload yang diblokir</translation> <translation id="7132939140423847331">Admin Anda telah melarang data ini disalin.</translation> <translation id="7135130955892390533">Tampilkan status</translation> +<translation id="7135814714616751706">Telusuri pintasan</translation> <translation id="7136009930065337683">Pelajari mode Samaran lebih lanjut</translation> <translation id="7138472120740807366">Metode pengiriman</translation> <translation id="7138678301420049075">Lainnya</translation> @@ -4179,6 +4181,7 @@ <translation id="8092254339843485299">6 x 8 inci (15 x 20 cm)</translation> <translation id="8092774999298748321">Ungu Tua</translation> <translation id="8094917007353911263">Jaringan yang Anda gunakan mungkin mewajibkan Anda mengunjungi <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Histori Penelusuran</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Metode Pembayaran</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index d0111e6..b4e027f 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Umslag: C2</translation> <translation id="6180316780098470077">Tími milli tilrauna</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Leita í flipum</translation> <translation id="6184868291074982484">Chrome takmarkar fótspor þriðju aðila sjálfkrafa</translation> <translation id="6190518157737269631">Hnekktu tilteknum lyklum á lyklaborðinu þínu, t.d. Esc</translation> <translation id="6194209731893739467">Sjá allar vaktaðar vörur hér</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Lokað fyrir upphleðslu</translation> <translation id="7132939140423847331">Stjórnandi hefur bannað afritun þessara gagna.</translation> <translation id="7135130955892390533">Sýna stöðu</translation> +<translation id="7135814714616751706">Leita að flýtileiðum</translation> <translation id="7136009930065337683">Nánar um huliðsstillingu</translation> <translation id="7138472120740807366">Afhendingarmáti</translation> <translation id="7138678301420049075">Annað</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 x 8 to.</translation> <translation id="8092774999298748321">Djúpfjólublár</translation> <translation id="8094917007353911263">Netið sem þú notar kann að krefjast þess að þú farir á <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Leitarferill</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Greiðslumáti</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 21e5f09..39b1211a 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -3046,6 +3046,7 @@ <translation id="6177531123306197852">Busta C2</translation> <translation id="6180316780098470077">Intervallo tra tentativi</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Cerca tra le schede</translation> <translation id="6184868291074982484">Chrome limita automaticamente i cookie di terze parti</translation> <translation id="6190518157737269631">Esegui l'override di alcuni tasti della tastiera, ad esempio Esc</translation> <translation id="6194209731893739467">Visualizza tutti i tuoi prodotti monitorati qui</translation> @@ -3604,6 +3605,7 @@ <translation id="7130775116821607281">Caricamento bloccato</translation> <translation id="7132939140423847331">Il tuo amministratore ha impedito la copia di questi dati.</translation> <translation id="7135130955892390533">Mostra stato</translation> +<translation id="7135814714616751706">Cerca scorciatoie</translation> <translation id="7136009930065337683">Scopri di più sulla modalità di navigazione in incognito</translation> <translation id="7138472120740807366">Metodo di consegna</translation> <translation id="7138678301420049075">Altro</translation> @@ -4177,6 +4179,7 @@ <translation id="8092254339843485299">6 x 8 in</translation> <translation id="8092774999298748321">Viola scuro</translation> <translation id="8094917007353911263">La rete in uso potrebbe richiedere la visita della pagina <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Cerca nella cronologia</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Metodo di pagamento</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 0b457cf3..725fc4b8 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -3052,6 +3052,7 @@ <translation id="6177531123306197852">מעטפה – C2</translation> <translation id="6180316780098470077">מרווח בין ניסיונות חוזרים</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">חיפוש כרטיסיות</translation> <translation id="6184868291074982484">Chrome מגביל באופן אוטומטי קובצי cookie של צד שלישי</translation> <translation id="6190518157737269631">שינוי מברירת המחדל של חלק מהמקשים במקלדת, כמו מקש Esc</translation> <translation id="6194209731893739467">כאן יופיעו כל המוצרים שבמעקב</translation> @@ -3610,6 +3611,7 @@ <translation id="7130775116821607281">ההעלאה חסומה</translation> <translation id="7132939140423847331">מנהל המערכת שלך אסר על העתקת הנתונים האלה.</translation> <translation id="7135130955892390533">הצגת סטטוס</translation> +<translation id="7135814714616751706">חיפוש מקשי קיצור</translation> <translation id="7136009930065337683">מידע נוסף על המצב הפרטי</translation> <translation id="7138472120740807366">שיטת מסירה</translation> <translation id="7138678301420049075">אחר</translation> @@ -4182,6 +4184,7 @@ <translation id="8092254339843485299">6x8 אינץ'</translation> <translation id="8092774999298748321">סגול כהה</translation> <translation id="8094917007353911263">ייתכן שהרשת שנעשה בה תחייב כניסה ל-<ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">חיפוש בהיסטוריה</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">אמצעי תשלום</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 58fea506..e8eec4de 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">C2 封筒</translation> <translation id="6180316780098470077">再試行の間隔</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">タブを検索</translation> <translation id="6184868291074982484">Chrome でサードパーティ Cookie を自動的に制限します</translation> <translation id="6190518157737269631">キーボードの一部のキー(Esc キーなど)のオーバーライド</translation> <translation id="6194209731893739467">トラッキングしている商品がすべてここに表示されます</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">アップロードがブロックされました</translation> <translation id="7132939140423847331">このデータのコピーは管理者によって禁止されています。</translation> <translation id="7135130955892390533">ステータスを表示</translation> +<translation id="7135814714616751706">ショートカットの検索</translation> <translation id="7136009930065337683">シークレット モードの詳細</translation> <translation id="7138472120740807366">配達方法</translation> <translation id="7138678301420049075">その他</translation> @@ -4182,6 +4184,7 @@ <translation id="8092254339843485299">6x8 インチ</translation> <translation id="8092774999298748321">ディープ パープル</translation> <translation id="8094917007353911263">ご利用のネットワークでは、<ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> へのアクセスが必要な可能性があります。</translation> +<translation id="809543534949702122">履歴を検索</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">お支払い方法</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index 39a3a4e9..5729a43 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -868,6 +868,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">ამ მოწყობილობასთან მიერთებული პერიფერიული მოწყობილობები, როცა სისტემაში შესული ხართ</translation> <translation id="2450019289047528273">გადახდის მეთოდები და სხვა ინფორმაცია Google საფულიდან</translation> +<translation id="2451201933352935301"><ph name="URL" />-ს სურს თქვენს ყველა ეკრანზე ფანჯრების მართვა</translation> <translation id="2451607499823206582">მიმდინარეობს თვალის მიდევნება</translation> <translation id="2452098632681057184">ეკოლოგია და გარემოს დაცვა</translation> <translation id="2452837234288608067">ამ კუთხით ვერ დაგეხმარებით. ცადეთ ხელახლა.</translation> @@ -3050,6 +3051,7 @@ <translation id="6177531123306197852">კონვერტი C2</translation> <translation id="6180316780098470077">ხელახლა მცდელობის ინტერვალი</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">მოიძიეთ ჩანართებში</translation> <translation id="6184868291074982484">Chrome ავტომატურად ზღუდავს მესამე მხარის ქუქი-ჩანაწერებს</translation> <translation id="6190518157737269631">უგულებელყავით თქვენი კლავიატურის ზოგიერთი კლავიში, მაგალითად Esc</translation> <translation id="6194209731893739467">აქ შეგიძლიათ იხილოთ თქვენი ყველა თვალმიდევნებული პროდუქტი</translation> @@ -3608,6 +3610,7 @@ <translation id="7130775116821607281">ატვირთვა დაბლოკილია</translation> <translation id="7132939140423847331">თქვენი ადმინისტრატორი კრძალავს ამ მონაცემთა კოპირებას.</translation> <translation id="7135130955892390533">სტატუსის ჩვენება</translation> +<translation id="7135814714616751706">მალსახმობების ძიება</translation> <translation id="7136009930065337683">შეიტყვეთ მეტი ინკოგნიტო რეჟიმის შესახებ</translation> <translation id="7138472120740807366">მიწოდების მეთოდი</translation> <translation id="7138678301420049075">სხვა</translation> @@ -4180,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 დუიმი</translation> <translation id="8092774999298748321">მუქი მეწამული</translation> <translation id="8094917007353911263">ქსელმა, რომელსაც თქვენ იყენებთ შესაძლოა მოგთხოვოთ სწუმრობა: <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">ძიების ისტორია</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">გადახდის მეთოდი</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index 6ae1c34a..6545377d 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -3049,6 +3049,7 @@ <translation id="6177531123306197852">C2 хатқалтасы</translation> <translation id="6180316780098470077">Қайталау аралығы</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Қойындыларды іздеу</translation> <translation id="6184868291074982484">Chrome үшінші тарап cookie файлдарына автоматты түрде шектеу қояды.</translation> <translation id="6190518157737269631">Пернетақтадағы Esc сияқты кейбір пернелерді қайта анықтау</translation> <translation id="6194209731893739467">Бақылайтын барлық өнімді осы жерден көре аласыз.</translation> @@ -3607,6 +3608,7 @@ <translation id="7130775116821607281">Жүктеп салуға тыйым салды</translation> <translation id="7132939140423847331">Әкімші бұл деректің көшірілуіне тыйым салды.</translation> <translation id="7135130955892390533">Күйін көрсету</translation> +<translation id="7135814714616751706">Таңбашаларды іздеу</translation> <translation id="7136009930065337683">Инкогнито туралы толық ақпарат</translation> <translation id="7138472120740807366">Жеткізу әдісі</translation> <translation id="7138678301420049075">Басқа</translation> @@ -4179,6 +4181,7 @@ <translation id="8092254339843485299">6 x 8 дюйм</translation> <translation id="8092774999298748321">Қою күлгін</translation> <translation id="8094917007353911263">Пайдаланып жатқан желі <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> мекенжайына кіруді талап етуі мүмкін.</translation> +<translation id="809543534949702122">Тарихтан іздеу</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Төлеу әдісі</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index 1d9cd0d2..96e7f76 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -3054,6 +3054,7 @@ <translation id="6177531123306197852">ស្រោមសំបុត្រ C2</translation> <translation id="6180316780098470077">ចន្លោះពេលនៃការព្យាយាមម្ដងទៀត</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ស្វែងរកផ្ទាំង</translation> <translation id="6184868291074982484">Chrome ដាក់កំហិតខូគីភាគីទីបីដោយស្វ័យប្រវត្តិ</translation> <translation id="6190518157737269631">លុបពីលើគ្រាប់ចុចមួយចំនួនដូចជា Esc នៅលើក្ដារចុចរបស់អ្នក</translation> <translation id="6194209731893739467">មើលផលិតផលដែលបានតាមដានទាំងអស់របស់អ្នកនៅត្រង់នេះ</translation> @@ -3612,6 +3613,7 @@ <translation id="7130775116821607281">បានទប់ស្កាត់ការបង្ហោះ</translation> <translation id="7132939140423847331">អ្នកគ្រប់គ្រងរបស់អ្នកបានហាមឃាត់មិនឱ្យចម្លងទិន្នន័យនេះ។</translation> <translation id="7135130955892390533">បង្ហាញស្ថានភាព</translation> +<translation id="7135814714616751706">ស្វែងរកផ្លូវកាត់</translation> <translation id="7136009930065337683">ស្វែងយល់បន្ថែមអំពីមុខងារឯកជន</translation> <translation id="7138472120740807366">មធ្យោបាយដឹកជញ្ជូនផ្ទាល់</translation> <translation id="7138678301420049075">ផ្សេងទៀត</translation> @@ -4186,6 +4188,7 @@ <translation id="8092254339843485299">6 x 8 in</translation> <translation id="8092774999298748321">ស្វាយចាស់</translation> <translation id="8094917007353911263">បណ្តាញដែលអ្នកកំពុងប្រើអាចតម្រូវឲ្យអ្នកទៅកាន់ <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />។</translation> +<translation id="809543534949702122">ប្រវត្តិស្វែងរក</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">វិធីបង់ប្រាក់</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 483faeed..17172647 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -3046,6 +3046,7 @@ <translation id="6177531123306197852">ಎನ್ವಲಪ್ C2</translation> <translation id="6180316780098470077">ಮರುಪ್ರಯತ್ನದ ಮಧ್ಯಂತರ</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ಟ್ಯಾಬ್ಗಳನ್ನು ಹುಡುಕಿ</translation> <translation id="6184868291074982484">Chrome ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಥರ್ಡ್-ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ</translation> <translation id="6190518157737269631">ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ನಲ್ಲಿ Esc ನಂತಹ ಕೆಲವು ಕೀಗಳನ್ನು ಓವರ್ರೈಡ್ ಮಾಡಿ</translation> <translation id="6194209731893739467">ನೀವು ಟ್ರ್ಯಾಕ್ ಮಾಡಿದ ಎಲ್ಲಾ ಉತ್ಪನ್ನಗಳನ್ನು ಇಲ್ಲಿ ನೋಡಿ</translation> @@ -3605,6 +3606,7 @@ <translation id="7130775116821607281">ಅಪ್ಲೋಡ್ ಮಾಡುವುದನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="7132939140423847331">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಈ ಡೇಟಾವನ್ನು ನಕಲಿಸದಂತೆ ನಿಷೇಧಿಸಿದ್ದಾರೆ.</translation> <translation id="7135130955892390533">ಕಾರ್ಯನೀತಿ ಸ್ಥಿತಿಯನ್ನು ತೋರಿಸಿ</translation> +<translation id="7135814714616751706">ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಹುಡುಕಿ</translation> <translation id="7136009930065337683">ಅಜ್ಞಾತ ಮೋಡ್ ಕುರಿತು ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation> <translation id="7138472120740807366">ಡೆಲಿವರಿ ವಿಧಾನ</translation> <translation id="7138678301420049075">ಇತರೆ</translation> @@ -4177,6 +4179,7 @@ <translation id="8092254339843485299">6 x 8 ಇಂಚು</translation> <translation id="8092774999298748321">ಗಾಢ ನೇರಳೆ</translation> <translation id="8094917007353911263">ನೀವು ಬಳಸುತ್ತಿರುವ ನೆಟ್ವರ್ಕ್ಗೆ ನೀವು <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> ಅನ್ನು ಭೇಟಿ ನೀಡುವ ಅಗತ್ಯವಿದೆ.</translation> +<translation id="809543534949702122">ಹುಡುಕಾಟದ ಇತಿಹಾಸ</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">ಪಾವತಿ ವಿಧಾನ</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index b62cb90..3b758c8 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">봉투 C2</translation> <translation id="6180316780098470077">재시도 간격</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">탭 검색</translation> <translation id="6184868291074982484">Chrome에서 자동으로 서드 파티 쿠키를 제한합니다.</translation> <translation id="6190518157737269631">Esc 키 등 키보드 키 재정의</translation> <translation id="6194209731893739467">추적 중인 모든 제품을 여기에서 확인</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">업로드 차단됨</translation> <translation id="7132939140423847331">관리자가 복사를 금지한 데이터입니다.</translation> <translation id="7135130955892390533">상태 보기</translation> +<translation id="7135814714616751706">바로가기 검색</translation> <translation id="7136009930065337683">시크릿 모드 자세히 알아보기</translation> <translation id="7138472120740807366">배달 방법</translation> <translation id="7138678301420049075">기타</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6x8인치</translation> <translation id="8092774999298748321">짙은 보라색</translation> <translation id="8094917007353911263">사용 중인 네트워크에서 <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> 방문을 요청할 수 있습니다.</translation> +<translation id="809543534949702122">검색 기록</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">결제 수단</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index 8f967223..d325ae9 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -3049,6 +3049,7 @@ <translation id="6177531123306197852">Конверт C2</translation> <translation id="6180316780098470077">Кайталоолордун интервалы</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Издөө өтмөктөрү</translation> <translation id="6184868291074982484">Chrome үчүнчү тараптын cookie файлдарын автоматтык түрдө чектейт</translation> <translation id="6190518157737269631">Баскычтоптогу Esc сыяктуу айрым баскычтарды өзгөртүү</translation> <translation id="6194209731893739467">Көз салган товарларды бул жерде көрөсүз</translation> @@ -3607,6 +3608,7 @@ <translation id="7130775116821607281">Жүктөп берүү бөгөттөлгөн</translation> <translation id="7132939140423847331">Администратор бул маалыматты көчүрүүгө тыюу салды.</translation> <translation id="7135130955892390533">Абалын көрсөтүү</translation> +<translation id="7135814714616751706">Ыкчам баскычтарды издөө</translation> <translation id="7136009930065337683">Жашыруун режим жөнүндө кеңири маалымат</translation> <translation id="7138472120740807366">Жеткирүү ыкмасы</translation> <translation id="7138678301420049075">Башка</translation> @@ -4179,6 +4181,7 @@ <translation id="8092254339843485299">6 x 8 дюйм</translation> <translation id="8092774999298748321">Кочкул кызгылт көгүш</translation> <translation id="8094917007353911263">Сиз колдонуп жаткан тармак <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> дарегине өтүшүңүздү талап кылышы мүмкүн.</translation> +<translation id="809543534949702122">Издөө таржымалы</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Төлөм ыкмасы</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index 2177f73..be1595e4 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Envelope C2</translation> <translation id="6180316780098470077">ຊ່ວງຫ່າງລະຫວ່າງການລອງໃໝ່ແຕ່ລະຄັ້ງ</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ຊອກຫາແຖບ</translation> <translation id="6184868291074982484">Chrome ຈະຈຳກັດຄຸກກີ້ພາກສ່ວນທີສາມໂດຍອັດຕະໂນມັດ</translation> <translation id="6190518157737269631">ຍົກເລີກບາງປຸ່ມຢູ່ແປ້ນພິມຂອງທ່ານ, ເຊັ່ນ: Esc</translation> <translation id="6194209731893739467">ເບິ່ງສິນຄ້າທີ່ທ່ານຕິດຕາມທັງໝົດຢູ່ບ່ອນນີ້</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">ບອກການອັບໂຫຼດໄວ້ແລ້ວ</translation> <translation id="7132939140423847331">ຜູ້ເບິ່ງແຍງຂອງທ່ານຫ້າມບໍ່ໃຫ້ສຳເນົາຂໍ້ມູນນີ້.</translation> <translation id="7135130955892390533">ສະແດງສະຖານະ</translation> +<translation id="7135814714616751706">ຊອກຫາທາງລັດ</translation> <translation id="7136009930065337683">ສຶກສາເພີ່ມເຕີມກ່ຽວກັບໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ</translation> <translation id="7138472120740807366">ວິທີການສົ່ງ</translation> <translation id="7138678301420049075">ອື່ນໆ</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 x 8 ນິ້ວ</translation> <translation id="8092774999298748321">ສີມ່ວງເຂັ້ມ</translation> <translation id="8094917007353911263">ເຄືອຂ່າຍທີ່ທ່ານກຳລັງໃຊ້ຢູ່ອາດຈະຕ້ອງການໃຫ້ທ່ານເຂົ້າເບິ່ງ <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">ປະຫວັດການຊອກຫາ</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">ວິທີການຈ່າຍເງິນ</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index ec4f3c8..0aca757 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -3051,6 +3051,7 @@ <translation id="6177531123306197852">C2 vokas</translation> <translation id="6180316780098470077">Pakartotinio bandymo intervalas</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Ieškoti skirtukų</translation> <translation id="6184868291074982484">„Chrome“ automatiškai riboja trečiųjų šalių slapukus</translation> <translation id="6190518157737269631">Nepaisyti kai kurių klaviatūros klavišų, pvz., „Esc“</translation> <translation id="6194209731893739467">Peržiūrėkite visus stebimus produktus čia</translation> @@ -3609,6 +3610,7 @@ <translation id="7130775116821607281">Užblokuotas įkėlimas</translation> <translation id="7132939140423847331">Jūsų administratorius uždraudė kopijuoti šiuos duomenis.</translation> <translation id="7135130955892390533">Rodyti būseną</translation> +<translation id="7135814714616751706">Ieškoti sparčiųjų klavišų</translation> <translation id="7136009930065337683">Sužinokite daugiau apie inkognito režimą.</translation> <translation id="7138472120740807366">Pristatymo metodas</translation> <translation id="7138678301420049075">Kitas</translation> @@ -4182,6 +4184,7 @@ <translation id="8092254339843485299">6 x 8 col.</translation> <translation id="8092774999298748321">Sodri violetinė</translation> <translation id="8094917007353911263">Naudojant šį tinklą gali būti prašoma apsilankyti <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Paieškos istorija</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Mokėjimo metodas</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 6d4b0b24e..b37a374b 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -3048,6 +3048,7 @@ <translation id="6177531123306197852">Aploksne C2</translation> <translation id="6180316780098470077">Intervāls starp atkārtotiem mēģinājumiem</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Meklēt cilnēs</translation> <translation id="6184868291074982484">Pārlūkā Chrome tiek automātiski ierobežoti trešo pušu sīkfaili</translation> <translation id="6190518157737269631">Ignorēt noteiktus tastatūras taustiņus, piemēram, atsoļa taustiņu</translation> <translation id="6194209731893739467">Skatiet visus savus izsekotos produktus šeit</translation> @@ -3606,6 +3607,7 @@ <translation id="7130775116821607281">Bloķēta augšupielāde</translation> <translation id="7132939140423847331">Jūsu administrators ir aizliedzis šo datu kopēšanu.</translation> <translation id="7135130955892390533">Rādīt statusu</translation> +<translation id="7135814714616751706">Meklēt īsinājumtaustiņus</translation> <translation id="7136009930065337683">Uzzināt vairāk par inkognito režīmu</translation> <translation id="7138472120740807366">Piegādes veids</translation> <translation id="7138678301420049075">Cits</translation> @@ -4179,6 +4181,7 @@ <translation id="8092254339843485299">6 x 8 collas</translation> <translation id="8092774999298748321">Tumši violets</translation> <translation id="8094917007353911263">Iespējams, izmantotajā tīklā tiks pieprasīts apmeklēt vietni <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Meklēt vēsturē</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Maksājuma veids</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index 15a2419..12f5c5d 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -3047,6 +3047,7 @@ <translation id="6177531123306197852">Плик C2</translation> <translation id="6180316780098470077">Обиди се повторно со интервалот</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Пребарајте ги картичките</translation> <translation id="6184868291074982484">Chrome автоматски ги ограничува колачињата од трети страни</translation> <translation id="6190518157737269631">да отфрли некои копчиња на тастатурата, како Esc</translation> <translation id="6194209731893739467">Видете ги сите ваши следени производи тука</translation> @@ -3605,6 +3606,7 @@ <translation id="7130775116821607281">Блокирано прикачување</translation> <translation id="7132939140423847331">Администраторот забранил копирање на податоциве.</translation> <translation id="7135130955892390533">Прикажи го статусот</translation> +<translation id="7135814714616751706">Пребарувајте кратенки</translation> <translation id="7136009930065337683">Дознајте повеќе за „Инкогнито“</translation> <translation id="7138472120740807366">Метод на достава</translation> <translation id="7138678301420049075">Друго</translation> @@ -4176,6 +4178,7 @@ <translation id="8092254339843485299">6 x 8 инчи</translation> <translation id="8092774999298748321">Темнопурпурна</translation> <translation id="8094917007353911263">Мрежата што ја користите може да бара да ја посетите страницата <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Историја на пребарување</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Начин на плаќање</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 81d46b02..fcddb58 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -3049,6 +3049,7 @@ <translation id="6177531123306197852">Envelope C2</translation> <translation id="6180316780098470077">വീണ്ടും ശ്രമിക്കുന്നതിനുള്ള ഇടവേള</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ടാബുകൾ തിരയുക</translation> <translation id="6184868291074982484">മൂന്നാം കക്ഷി കുക്കികളെ Chrome സ്വയമേവ പരിമിതപ്പെടുത്തുന്നു</translation> <translation id="6190518157737269631">നിങ്ങളുടെ കീബോർഡിലെ Esc പോലുള്ള ചില കീകൾ അസാധുവാക്കുക</translation> <translation id="6194209731893739467">നിങ്ങൾ ട്രാക്ക് ചെയ്യുന്ന എല്ലാ ഉൽപ്പന്നങ്ങളും ഇവിടെ കാണാം</translation> @@ -3607,6 +3608,7 @@ <translation id="7130775116821607281">അപ്ലോഡ് ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു</translation> <translation id="7132939140423847331">ഈ ഡാറ്റ പകർത്തുന്നത് നിങ്ങളുടെ അഡ്മിൻ നിരോധിച്ചിരിക്കുന്നു.</translation> <translation id="7135130955892390533">സ്റ്റാറ്റസ് കാണിക്കുക</translation> +<translation id="7135814714616751706">Search കുറുക്കുവഴികൾ</translation> <translation id="7136009930065337683">അദൃശ്യ മോഡിനെ കുറിച്ച് കൂടുതലറിയുക</translation> <translation id="7138472120740807366">ഡെലിവറി രീതി</translation> <translation id="7138678301420049075">മറ്റുള്ളവ</translation> @@ -4178,6 +4180,7 @@ <translation id="8092254339843485299">6 x 8 ഇഞ്ച്</translation> <translation id="8092774999298748321">ഇരുണ്ട പർപ്പിൾ</translation> <translation id="8094917007353911263">നിങ്ങൾക്ക് ഉപയോഗിക്കുന്ന നെറ്റ്വർക്ക് <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> സന്ദർശിക്കാൻ നിങ്ങളോട് ആവശ്യപ്പെടാം.</translation> +<translation id="809543534949702122">തിരയൽ ചരിത്രം</translation> <translation id="8098855213644561659">A3 എക്സ്ട്രാ</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">പേയ്മെന്റ് രീതി</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index 5f3beaa8..964b6d3 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Дугтуй C2</translation> <translation id="6180316780098470077">Дахин оролдлого хоорондох интервал</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Табыг хайх</translation> <translation id="6184868291074982484">Chrome гуравдагч талын күүкинүүдийг автоматаар хязгаарлана</translation> <translation id="6190518157737269631">Esc зэрэг таны гарын зарим товчийг дарах</translation> <translation id="6194209731893739467">Хянаж буй бүх бүтээгдэхүүнээ эндээс харна уу</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Байршуулахыг блоклосон</translation> <translation id="7132939140423847331">Таны админ энэ өгөгдлийг хуулахыг хориглосон.</translation> <translation id="7135130955892390533">Төлөвийг харуулах</translation> +<translation id="7135814714616751706">Товчлолууд хайх</translation> <translation id="7136009930065337683">Нууцлалтай горимын талаар нэмэлт мэдээлэл авах</translation> <translation id="7138472120740807366">Хүргэлтийн арга</translation> <translation id="7138678301420049075">Бусад</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 x 8 инч</translation> <translation id="8092774999298748321">Гүн нил ягаан</translation> <translation id="8094917007353911263">Таны ашиглаж буй сүлжээ таныг <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />-д нэвтрэхийг шаардах магадлалтай.</translation> +<translation id="809543534949702122">Хайлтын түүх</translation> <translation id="8098855213644561659">A3 Нэмэлт</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Төлбөрийн хэрэгсэл</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index 3ad515a..6549868 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">एन्व्हलप सी२</translation> <translation id="6180316780098470077">दोन प्रयत्नांमधील मध्यांतर</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">टॅब शोधा</translation> <translation id="6184868291074982484">Chrome हे तृतीय पक्ष कुकीना आपोआप मर्यादित करते</translation> <translation id="6190518157737269631">तुमच्या कीबोर्डवरील Esc सारख्या काही की ओव्हरराइड करा</translation> <translation id="6194209731893739467">तुमची सर्व माग ठेवलेली उत्पादने येथे पहा</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">अपलोड करणे ब्लॉक केले आहे</translation> <translation id="7132939140423847331">तुमच्या ॲडमिनने हा डेटा कॉपी करण्यापासून प्रतिबंधित केले आहे.</translation> <translation id="7135130955892390533">स्थिती दाखवा</translation> +<translation id="7135814714616751706">शॉर्टकट शोधा</translation> <translation id="7136009930065337683">गुप्त मोडबद्दल अधिक जाणून घ्या</translation> <translation id="7138472120740807366">वितरण पद्धत</translation> <translation id="7138678301420049075">इतर</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">६ x ८ इं</translation> <translation id="8092774999298748321">गडद जांभळा</translation> <translation id="8094917007353911263">तुम्ही वापरत असलेल्या नेटवर्कला तुम्ही <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> ला भेट देण्याची आवश्यकता आहे.</translation> +<translation id="809543534949702122">शोध इतिहास</translation> <translation id="8098855213644561659">A3 अतिरिक्त</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">पेमेंट पद्धत</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index 46c9d01..277fc06 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -3051,6 +3051,7 @@ <translation id="6177531123306197852">Sampul C2</translation> <translation id="6180316780098470077">Selang cubaan semula</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Cari Tab</translation> <translation id="6184868291074982484">Chrome mengehadkan kuki pihak ketiga secara automatik</translation> <translation id="6190518157737269631">Ganti sesetengah kekunci pada papan kekunci anda, seperti Esc</translation> <translation id="6194209731893739467">Lihat semua produk yang dijejaki di sini</translation> @@ -3609,6 +3610,7 @@ <translation id="7130775116821607281">Pemuatan naik disekat</translation> <translation id="7132939140423847331">Pentadbir anda telah melarang data ini daripada disalin.</translation> <translation id="7135130955892390533">Tunjukkan status</translation> +<translation id="7135814714616751706">Pintasan carian</translation> <translation id="7136009930065337683">Ketahui lebih lanjut tentang Inkognito</translation> <translation id="7138472120740807366">Kaedah penghantaran</translation> <translation id="7138678301420049075">Lain-lain</translation> @@ -4182,6 +4184,7 @@ <translation id="8092254339843485299">6 x 8 in</translation> <translation id="8092774999298748321">Ungu Tua</translation> <translation id="8094917007353911263">Rangkaian yang anda gunakan mungkin memerlukan anda melawat <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Sejarah Carian</translation> <translation id="8098855213644561659">A3 Ekstra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Kaedah Pembayaran</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index 22a3cdf..c3a63151 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">C2 စာအိတ်</translation> <translation id="6180316780098470077">ပြန်စမ်းချိန် ကြားကာလ</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">တဘ်များတွင် ရှာရန်</translation> <translation id="6184868291074982484">Chrome က ပြင်ပကုမ္ပဏီ၏ကွတ်ကီးများကို အလိုအလျောက် ကန့်သတ်သည်</translation> <translation id="6190518157737269631">Esc ကဲ့သို့သော သင့်ကီးဘုတ်ရှိ ကီးအချို့ကို အစားထိုးရန်</translation> <translation id="6194209731893739467">စောင့်ကြည့်ထားသည့် ထုတ်ကုန်များကို ဤနေရာတွင် ကြည့်နိုင်သည်</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">အပ်လုဒ်လုပ်ခြင်း ပိတ်ထားသည်</translation> <translation id="7132939140423847331">ဤဒေတာကူးယူခြင်းကို သင့်စီမံခန့်ခွဲသူက တားမြစ်ထားသည်။</translation> <translation id="7135130955892390533">အခြေအနေ ပြရန်</translation> +<translation id="7135814714616751706">ဖြတ်လမ်းလင့်ခ်များ ရှာရန်</translation> <translation id="7136009930065337683">‘ရုပ်ဖျက်’ အကြောင်း ပိုမိုလေ့လာရန်</translation> <translation id="7138472120740807366">ပို့ရန် နည်းလမ်း</translation> <translation id="7138678301420049075">အခြား</translation> @@ -4182,6 +4184,7 @@ <translation id="8092254339843485299">၆ x ၈ လက်မ</translation> <translation id="8092774999298748321">ခရမ်းရင့်</translation> <translation id="8094917007353911263">သင်အသုံးပြုနေသော ကွန်ယက်သည် <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> သို့ သင်သွားရောက်ကြည့်ရှုရန် လိုအပ်စေလိမ့်မည်။</translation> +<translation id="809543534949702122">ရှာဖွေမှတ်တမ်း</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">ငွေပေးချေမှု နည်းလမ်း</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index e45262da..24f8232 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -3048,6 +3048,7 @@ <translation id="6177531123306197852">Envelope C2</translation> <translation id="6180316780098470077">पुन: प्रयास गर्न पाइने अन्तराल</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ट्याब खोज्नुहोस्</translation> <translation id="6184868291074982484">Chrome ले तेस्रो पक्षीय कुकीहरू स्वतः सीमित पार्छ</translation> <translation id="6190518157737269631">किबोर्डका Esc जस्ता केही कीहरू ओभरराइड गर्नुहोस्</translation> <translation id="6194209731893739467">तपाईंले ट्र्याक गरेका सबै उत्पादन यहाँ देखिन्छन्</translation> @@ -3606,6 +3607,7 @@ <translation id="7130775116821607281">फाइल अपलोड गर्न पाइँदैन</translation> <translation id="7132939140423847331">तपाईंका एड्मिनले लगाएको प्रतिबन्धका कारण यो डेटा कपी गर्न मिल्दैन।</translation> <translation id="7135130955892390533">स्थिति देखाउनुहोस्</translation> +<translation id="7135814714616751706">सर्टकटहरू खोज्नुहोस्</translation> <translation id="7136009930065337683">इन्कोग्निटो मोडका बारेमा थप जान्नुहोस्</translation> <translation id="7138472120740807366">डेलिभरीको विधि</translation> <translation id="7138678301420049075">अन्य</translation> @@ -4178,6 +4180,7 @@ <translation id="8092254339843485299">६ x ८ इन्च</translation> <translation id="8092774999298748321">गाढा बैजनी</translation> <translation id="8094917007353911263">तपाईँले प्रयोग गर्नुभएको सञ्जाललाई तपाईँले <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> भ्रमण गर्ने आवश्यकता हुन सक्छ।</translation> +<translation id="809543534949702122">सर्च हिस्ट्री</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">भुक्तानी विधि</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index 15d2347..4334837 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -3043,6 +3043,7 @@ <translation id="6177531123306197852">Envelop C2</translation> <translation id="6180316780098470077">Interval voor nieuwe poging</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Tabbladen doorzoeken</translation> <translation id="6184868291074982484">Chrome beperkt automatisch cookies van derden</translation> <translation id="6190518157737269631">Sommige toetsen op je toetsenbord overschrijven, zoals Esc</translation> <translation id="6194209731893739467">Bekijk hier al je gevolgde producten</translation> @@ -3601,6 +3602,7 @@ <translation id="7130775116821607281">Upload geblokkeerd</translation> <translation id="7132939140423847331">Je beheerder heeft voorkomen dat deze gegevens worden gekopieerd.</translation> <translation id="7135130955892390533">Status bekijken</translation> +<translation id="7135814714616751706">Sneltoetsen zoeken</translation> <translation id="7136009930065337683">Meer informatie over incognito</translation> <translation id="7138472120740807366">Bezorgingsmethode</translation> <translation id="7138678301420049075">Overige</translation> @@ -4174,6 +4176,7 @@ <translation id="8092254339843485299">6 x 8 inch</translation> <translation id="8092774999298748321">Dieppaars</translation> <translation id="8094917007353911263">Het is mogelijk dat je <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> moet bezoeken van het netwerk dat je gebruikt.</translation> +<translation id="809543534949702122">Zoekgeschiedenis</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Betaalmethode</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 7fed0f32..663206b 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">C2-konvolutt</translation> <translation id="6180316780098470077">Forsøksintervall</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Søk i faner</translation> <translation id="6184868291074982484">Chrome begrenser automatisk informasjonskapsler fra tredjeparter</translation> <translation id="6190518157737269631">overstyre enkelte taster på tastaturet, for eksempel Esc</translation> <translation id="6194209731893739467">Se alle produktene du sporer, her</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Blokkert opplasting</translation> <translation id="7132939140423847331">Administratoren din har forbudt kopiering av disse dataene.</translation> <translation id="7135130955892390533">Vis statusen</translation> +<translation id="7135814714616751706">Søkesnarveier</translation> <translation id="7136009930065337683">Finn ut mer om Inkognito</translation> <translation id="7138472120740807366">Leveringsmetode</translation> <translation id="7138678301420049075">Annet</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 x 8 tommer</translation> <translation id="8092774999298748321">Mørk fiolett</translation> <translation id="8094917007353911263">Det kan hende at nettverket du bruker, krever at du besøker <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Søkelogg</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Betalingsmåte</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 373c04a4f1..cda7c0cf 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -3046,6 +3046,7 @@ <translation id="6177531123306197852">ଏନଭେଲପ C2</translation> <translation id="6180316780098470077">ପୁଣି ଚେଷ୍ଟା କରିବା ଇଣ୍ଟରଭାଲ୍</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ଟାବଗୁଡ଼ିକୁ ସର୍ଚ୍ଚ କରନ୍ତୁ</translation> <translation id="6184868291074982484">Chrome ସ୍ୱତଃ ତୃତୀୟ-ପକ୍ଷ କୁକୀଗୁଡ଼ିକୁ ସୀମିତ କରେ</translation> <translation id="6190518157737269631">ଆପଣଙ୍କ କୀବୋର୍ଡରେ Esc ପରି କିଛି କୀ ଓଭରରାଇଡ କରନ୍ତୁ</translation> <translation id="6194209731893739467">ଆପଣଙ୍କ ସମସ୍ତ ଟ୍ରାକ କରାଯାଇଥିବା ପ୍ରଡକ୍ଟଗୁଡ଼ିକୁ ଏଠାରେ ଦେଖନ୍ତୁ</translation> @@ -3604,6 +3605,7 @@ <translation id="7130775116821607281">ଅପଲୋଡ କରିବା ବ୍ଲକ କରାଯାଇଛି</translation> <translation id="7132939140423847331">ଆପଣଙ୍କ ଆଡମିନ ଏହି ଡାଟାକୁ କପି କରିବାରୁ ପ୍ରତିବନ୍ଧିତ କରିଛନ୍ତି।</translation> <translation id="7135130955892390533">ସ୍ଥିତି ଦେଖାନ୍ତୁ</translation> +<translation id="7135814714616751706">ସର୍ଟକଟ ସର୍ଚ୍ଚ କରନ୍ତୁ</translation> <translation id="7136009930065337683">ଇନକଗ୍ନିଟୋ ବିଷୟରେ ଅଧିକ ଜାଣନ୍ତୁ</translation> <translation id="7138472120740807366">ଡେଲିଭରୀ ପଦ୍ଧତି</translation> <translation id="7138678301420049075">ଅନ୍ୟ</translation> @@ -4176,6 +4178,7 @@ <translation id="8092254339843485299">6 x 8 ଇଞ୍ଚ</translation> <translation id="8092774999298748321">ଗାଢ଼ ବାଇଗଣୀ</translation> <translation id="8094917007353911263">ଆପଣ ବ୍ୟବହାର କରୁଥିବା ନେଟ୍ୱର୍କ ପାଇଁ, ଆପଣଙ୍କୁ ହୁଏତ <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />କୁ ଯିବାର ଆବଶ୍ୟକତା ଅଛି।</translation> +<translation id="809543534949702122">ସର୍ଚ୍ଚ ଇତିହାସ</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">ପେମେଣ୍ଟ ପଦ୍ଧତି</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index 178fef9..6d92e5a 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -3046,6 +3046,7 @@ <translation id="6177531123306197852">C2 ਆਕਾਰ ਦਾ ਲਿਫ਼ਾਫ਼ਾ</translation> <translation id="6180316780098470077">ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਅੰਤਰਾਲ</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ਖੋਜ ਟੈਬਾਂ</translation> <translation id="6184868291074982484">Chrome ਤੀਜੀ-ਧਿਰ ਦੀਆਂ ਕੁਕੀਜ਼ ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਸੀਮਤ ਕਰਦਾ ਹੈ</translation> <translation id="6190518157737269631">ਆਪਣੇ ਕੀ-ਬੋਰਡ 'ਤੇ ਕੁਝ ਕੁੰਜੀਆਂ ਨੂੰ ਓਵਰਰਾਈਡ ਕਰੋ, ਜਿਵੇਂ ਕਿ Esc</translation> <translation id="6194209731893739467">ਆਪਣੇ ਸਾਰੇ ਟਰੈਕ ਕੀਤੇ ਉਤਪਾਦ ਇੱਥੇ ਦੇਖੋ</translation> @@ -3604,6 +3605,7 @@ <translation id="7130775116821607281">ਅੱਪਲੋਡ ਕਰਨ ਦੀ ਸੁਵਿਧਾ ਨੂੰ ਬਲਾਕ ਕੀਤਾ ਗਿਆ</translation> <translation id="7132939140423847331">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਇਸ ਡਾਟੇ ਨੂੰ ਕਾਪੀ ਕੀਤੇ ਜਾਣ ਤੋਂ ਪ੍ਰਤਿਬੰਧਿਤ ਕੀਤਾ ਹੈ।</translation> <translation id="7135130955892390533">ਸਥਿਤੀ ਦਿਖਾਓ</translation> +<translation id="7135814714616751706">ਸ਼ਾਰਟਕੱਟ ਖੋਜੋ</translation> <translation id="7136009930065337683">ਇਨਕੋਗਨਿਟੋ ਬਾਰੇ ਹੋਰ ਜਾਣੋ</translation> <translation id="7138472120740807366">ਅਦਾਇਗੀ ਵਿਧੀ</translation> <translation id="7138678301420049075">ਹੋਰ</translation> @@ -4176,6 +4178,7 @@ <translation id="8092254339843485299">6 x 8 ਇੰਚ</translation> <translation id="8092774999298748321">ਗੂੜ੍ਹਾ ਜਾਮਨੀ</translation> <translation id="8094917007353911263">ਜੋ ਨੈਟਵਰਕ ਤੁਸੀਂ ਵਰਤ ਰਹੇ ਹੋ, ਉਸ ਲਈ ਤੁਹਾਨੂੰ <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> ਤੇ ਵਿਜਿਟ ਕਰਨ ਦੀ ਲੋੜ ਹੋ ਸਕਦੀ ਹੈ।</translation> +<translation id="809543534949702122">ਖੋਜ ਇਤਹਾਸ</translation> <translation id="8098855213644561659">A3 ਵਾਧੂ</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">ਭੁਗਤਾਨ ਵਿਧੀ</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 697f446..efaa99e 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Koperta C2</translation> <translation id="6180316780098470077">Interwał ponawiania</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Wyszukaj karty</translation> <translation id="6184868291074982484">Chrome automatycznie ogranicza pliki cookie innych firm</translation> <translation id="6190518157737269631">Zastąpić funkcje niektórych klawiszy na klawiaturze, np. Esc</translation> <translation id="6194209731893739467">Tu zobaczysz wszystkie obserwowane produkty</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Przesyłanie jest zablokowane</translation> <translation id="7132939140423847331">Administrator nie zezwala na kopiowanie tych danych.</translation> <translation id="7135130955892390533">Wyświetlanie informacji o obecności</translation> +<translation id="7135814714616751706">Szukaj skrótów</translation> <translation id="7136009930065337683">Więcej informacji o trybie incognito</translation> <translation id="7138472120740807366">Metoda dostawy</translation> <translation id="7138678301420049075">Inne</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 cali</translation> <translation id="8092774999298748321">Mocno fioletowy</translation> <translation id="8094917007353911263">Sieć, której używasz, może wymagać otwarcia strony <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Historia wyszukiwania</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Forma płatności</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index c320ba0a..edf75d3 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Envelope C2</translation> <translation id="6180316780098470077">Intervalo entre novas tentativas</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Pesquisar guias</translation> <translation id="6184868291074982484">O Chrome limita automaticamente os cookies de terceiros</translation> <translation id="6190518157737269631">Substituir algumas teclas do teclado, como Esc</translation> <translation id="6194209731893739467">Veja todos os seus produtos monitorados aqui</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Upload bloqueado</translation> <translation id="7132939140423847331">O administrador bloqueou a cópia destes dados.</translation> <translation id="7135130955892390533">Mostrar status</translation> +<translation id="7135814714616751706">Pesquisar atalhos</translation> <translation id="7136009930065337683">Saiba mais sobre a navegação anônima</translation> <translation id="7138472120740807366">Método de entrega</translation> <translation id="7138678301420049075">Outro</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 pol.</translation> <translation id="8092774999298748321">Roxo intenso</translation> <translation id="8094917007353911263">A rede que você está usando pode exigir uma visita a <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Pesquisar no histórico</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Forma de Pagamento</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index d8ccb10..ce203fb 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Envelope C2</translation> <translation id="6180316780098470077">Intervalo entre tentativas</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Pesquisar separadores</translation> <translation id="6184868291074982484">O Chrome limita automaticamente os cookies de terceiros</translation> <translation id="6190518157737269631">Substituir algumas teclas do teclado, como a tecla Esc</translation> <translation id="6194209731893739467">Veja todos os produtos monitorizados aqui</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Carregamento bloqueado</translation> <translation id="7132939140423847331">O seu administrador proibiu a cópia destes dados.</translation> <translation id="7135130955892390533">Mostrar estado</translation> +<translation id="7135814714616751706">Pesquise atalhos</translation> <translation id="7136009930065337683">Saber mais sobre a Navegação anónima</translation> <translation id="7138472120740807366">Método de fornecimento</translation> <translation id="7138678301420049075">Outros</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 x 8 pol.</translation> <translation id="8092774999298748321">Roxo escuro</translation> <translation id="8094917007353911263">A rede que está a utilizar pode exigir que visite <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Histórico de pesquisas</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Método de pagamento</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 55caa942..13851ff 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Plic C2</translation> <translation id="6180316780098470077">Intervalul de reîncercare</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Caută în file</translation> <translation id="6184868291074982484">Chrome limitează automat cookie-urile terță parte</translation> <translation id="6190518157737269631">Înlocuiește unele taste de pe tastatură, cum ar fi Esc</translation> <translation id="6194209731893739467">Vezi toate produsele urmărite aici</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Încărcarea a fost blocată</translation> <translation id="7132939140423847331">Administratorul a interzis copierea acestor date.</translation> <translation id="7135130955892390533">Arată starea</translation> +<translation id="7135814714616751706">Caută comenzi rapide</translation> <translation id="7136009930065337683">Află mai multe despre modul incognito</translation> <translation id="7138472120740807366">Metodă de livrare</translation> <translation id="7138678301420049075">Altele</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 in</translation> <translation id="8092774999298748321">Mov intens</translation> <translation id="8094917007353911263">Rețeaua pe care o folosești poate solicita accesarea adresei <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Istoricul căutărilor</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Metodă de plată</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 7e76e55..952016b 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -3049,6 +3049,7 @@ <translation id="6177531123306197852">Конверт C2</translation> <translation id="6180316780098470077">Интервал повтора</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Поиск по вкладкам</translation> <translation id="6184868291074982484">Chrome автоматически ограничивает использование сторонних файлов cookie</translation> <translation id="6190518157737269631">Переопределение некоторых клавиш, например Esc.</translation> <translation id="6194209731893739467">Здесь вы найдете все отслеживаемые товары</translation> @@ -3607,6 +3608,7 @@ <translation id="7130775116821607281">Загрузка остановлена</translation> <translation id="7132939140423847331">Администратор запретил копирование этих данных.</translation> <translation id="7135130955892390533">Показать статус</translation> +<translation id="7135814714616751706">Быстрые клавиши для поиска</translation> <translation id="7136009930065337683">Подробнее о режиме инкогнито</translation> <translation id="7138472120740807366">Способ доставки</translation> <translation id="7138678301420049075">Другое</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 x 8 дюймов</translation> <translation id="8092774999298748321">Насыщенный фиолетовый</translation> <translation id="8094917007353911263">Возможно, вам нужно перейти на страницу <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> используемой сети.</translation> +<translation id="809543534949702122">Поиск в истории</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Способ оплаты</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index 051bd2e1..7bd4e157 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -3047,6 +3047,7 @@ <translation id="6177531123306197852">ලියුම් කවරය C2</translation> <translation id="6180316780098470077">යළි උත්සාහ කිරීමේ විරාමය</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ටැබ සොයන්න</translation> <translation id="6184868291074982484">Chrome ස්වයංක්රීයව තෙවන පාර්ශ්වීය කුකීස් සීමා කරයි</translation> <translation id="6190518157737269631">ඔබේ යතුරු පුවරුවෙහි Esc වැනි යතුරු කිහිපයක් අභිබවා යන්න</translation> <translation id="6194209731893739467">ඔබ නිරීක්ෂණය කළ නිෂ්පාදන සියල්ල මෙතැනින් බලන්න</translation> @@ -3605,6 +3606,7 @@ <translation id="7130775116821607281">උඩුගත කිරීම අවහිරයි</translation> <translation id="7132939140423847331">ඔබගේ පරිපාලක මෙම දත්ත පිටපත් කිරීම තහනම් කර ඇත.</translation> <translation id="7135130955892390533">තත්ත්වය පෙන්වන්න</translation> +<translation id="7135814714616751706">කෙටිමං සොයන්න</translation> <translation id="7136009930065337683">අප්රසිද්ධ පිළිබඳව තව දැන ගන්න</translation> <translation id="7138472120740807366">බෙදා හැරීමේ ක්රමය</translation> <translation id="7138678301420049075">වෙනත්</translation> @@ -4176,6 +4178,7 @@ <translation id="8092254339843485299">අඟ 6 x 8</translation> <translation id="8092774999298748321">තද දම්</translation> <translation id="8094917007353911263">ඔබ භාවිතා කරන ජාලය මගින් ඔබ <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> වෙත පිවිසීමට අවශ්ය විය හැක.</translation> +<translation id="809543534949702122">සෙවීම් ඉතිහාසය</translation> <translation id="8098855213644561659">A3 අමතර</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">ගෙවීමේ ක්රමය</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 88af51f6..c1fc0326 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -3045,6 +3045,7 @@ <translation id="6177531123306197852">Obálka C2</translation> <translation id="6180316780098470077">Interval opakovania pokusov</translation> <translation id="6182972682129119950">A4×5</translation> +<translation id="6184099524311454384">Vyhľadajte karty</translation> <translation id="6184868291074982484">Chrome automaticky obmedzuje súbory cookie tretích strán</translation> <translation id="6190518157737269631">Prepísať niektoré klávesy na klávesnici, napríklad Esc</translation> <translation id="6194209731893739467">Tu nájdete všetky svoje sledované výrobky</translation> @@ -3603,6 +3604,7 @@ <translation id="7130775116821607281">Blokované nahrávanie</translation> <translation id="7132939140423847331">Váš správca zakázal kopírovanie týchto údajov.</translation> <translation id="7135130955892390533">Zobraziť stav</translation> +<translation id="7135814714616751706">Hľadajte skratky</translation> <translation id="7136009930065337683">Ďalšie informácie o režime inkognito</translation> <translation id="7138472120740807366">Spôsob doručenia</translation> <translation id="7138678301420049075">Ostatné</translation> @@ -4176,6 +4178,7 @@ <translation id="8092254339843485299">6 × 8 palcov</translation> <translation id="8092774999298748321">Tmavopurpurová</translation> <translation id="8094917007353911263">Sieť, ktorú používate, môže vyžadovať, aby ste navštívili stránku <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /></translation> +<translation id="809543534949702122">Hľadať v histórii</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Spôsob platby</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 2e72369..3248417 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Kuverta C2</translation> <translation id="6180316780098470077">Interval vnovičnih poskusov</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Iskanje zavihkov</translation> <translation id="6184868291074982484">Chrome samodejno omejuje piškotke tretjih oseb</translation> <translation id="6190518157737269631">Preglasite nekatere tipke na tipkovnici, kot je Esc</translation> <translation id="6194209731893739467">Tukaj si lahko ogledate vse spremljane izdelke</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Blokirano nalaganje</translation> <translation id="7132939140423847331">Skrbnik je prepovedal kopiranje teh podatkov.</translation> <translation id="7135130955892390533">Prikaz stanja</translation> +<translation id="7135814714616751706">Iskanje bližnjic</translation> <translation id="7136009930065337683">Preberite več o anonimnem načinu</translation> <translation id="7138472120740807366">Način dostave</translation> <translation id="7138678301420049075">Drugo</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 palcev</translation> <translation id="8092774999298748321">Močna vijolična</translation> <translation id="8094917007353911263">Omrežje, ki ga uporabljate, morda zahteva, da obiščete <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Zgodovina iskanja</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Plačilno sredstvo</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index 4ed9bfc7..9983188 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -3049,6 +3049,7 @@ <translation id="6177531123306197852">Zarf C2</translation> <translation id="6180316780098470077">Intervali i ripërpjekjes</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Kërko skedat</translation> <translation id="6184868291074982484">Chrome i kufizon automatikisht kukit e palëve të treta</translation> <translation id="6190518157737269631">Zëvendëso disa teste në tastierën tënde, si p.sh. Esc</translation> <translation id="6194209731893739467">Shiko të gjitha produktet e tua të monitoruara këtu</translation> @@ -3607,6 +3608,7 @@ <translation id="7130775116821607281">Ngarkimi u bllokua</translation> <translation id="7132939140423847331">Administratori yt e ka ndaluar kopjimin e këtyre të dhënave.</translation> <translation id="7135130955892390533">Shfaq statusin</translation> +<translation id="7135814714616751706">Shkurtoret e kërkimit</translation> <translation id="7136009930065337683">Mëso më shumë rreth modalitetit "Të fshehtë"</translation> <translation id="7138472120740807366">Mënyra e dorëzimit</translation> <translation id="7138678301420049075">Tjetër</translation> @@ -4179,6 +4181,7 @@ <translation id="8092254339843485299">6 x 8 inç</translation> <translation id="8092774999298748321">Vjollcë e thellë</translation> <translation id="8094917007353911263">Rrjeti që po përdor mund të kërkojë që të vizitosh <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Historiku i kërkimeve</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Mënyra e pagesës</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 8d590e64..c30c2de 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -3049,6 +3049,7 @@ <translation id="6177531123306197852">Koverta C2</translation> <translation id="6180316780098470077">Interval između ponovnih pokušaja</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Pretražite kartice</translation> <translation id="6184868291074982484">Chrome automatski ograničava kolačiće treće strane</translation> <translation id="6190518157737269631">Zamena unosa nekih tastera na tastaturi, kao što je Esc</translation> <translation id="6194209731893739467">Pogledajte sve proizvode koje pratite ovde</translation> @@ -3607,6 +3608,7 @@ <translation id="7130775116821607281">Otpremanje je blokirano</translation> <translation id="7132939140423847331">Administrator je zabranio kopiranje ovih podataka.</translation> <translation id="7135130955892390533">Prikaži status</translation> +<translation id="7135814714616751706">Pretražite prečice</translation> <translation id="7136009930065337683">Saznajte više o režimu bez arhiviranja</translation> <translation id="7138472120740807366">Način isporuke</translation> <translation id="7138678301420049075">Drugo</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6×8 in</translation> <translation id="8092774999298748321">Tamnoljubičasta</translation> <translation id="8094917007353911263">Mreža koju koristite će možda zahtevati da posetite <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Istorija pretrage</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Način plaćanja</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index a87e655..c140af69 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -3049,6 +3049,7 @@ <translation id="6177531123306197852">Коверта C2</translation> <translation id="6180316780098470077">Интервал између поновних покушаја</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Претражите картице</translation> <translation id="6184868291074982484">Chrome аутоматски ограничава колачиће треће стране</translation> <translation id="6190518157737269631">Замена уноса неких тастера на тастатури, као што је Esc</translation> <translation id="6194209731893739467">Погледајте све производе које пратите овде</translation> @@ -3607,6 +3608,7 @@ <translation id="7130775116821607281">Отпремање је блокирано</translation> <translation id="7132939140423847331">Администратор је забранио копирање ових података.</translation> <translation id="7135130955892390533">Прикажи статус</translation> +<translation id="7135814714616751706">Претражите пречице</translation> <translation id="7136009930065337683">Сазнајте више о режиму без архивирања</translation> <translation id="7138472120740807366">Начин испоруке</translation> <translation id="7138678301420049075">Друго</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6×8 in</translation> <translation id="8092774999298748321">Тамнољубичаста</translation> <translation id="8094917007353911263">Мрежа коју користите ће можда захтевати да посетите <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Историја претраге</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Начин плаћања</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index b5dee66d..a83f833 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">C2-kuvert</translation> <translation id="6180316780098470077">Intervall för nytt försök</translation> <translation id="6182972682129119950">A4 x 5</translation> +<translation id="6184099524311454384">Sök bland flikar</translation> <translation id="6184868291074982484">Chrome begränsar automatiskt tredjepartscookies</translation> <translation id="6190518157737269631">Åsidosätt vissa tangenter på tangentbordet, till exempel Esc</translation> <translation id="6194209731893739467">Se alla bevakade produkter här</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Uppladdning blockeras</translation> <translation id="7132939140423847331">Administratören tillåter inte att denna data kopieras.</translation> <translation id="7135130955892390533">Visa status</translation> +<translation id="7135814714616751706">Sök efter kortkommando</translation> <translation id="7136009930065337683">Läs mer om inkognitoläget</translation> <translation id="7138472120740807366">Leveranssätt</translation> <translation id="7138678301420049075">Övrigt</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 tum</translation> <translation id="8092774999298748321">Mörklila</translation> <translation id="8094917007353911263">Nätverket du använder kanske kräver att du besöker <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Sök i historiken</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Betalningsmetod</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index ae6738c..68e6423e 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Bahasha ya ukubwa wa C2</translation> <translation id="6180316780098470077">Kipindi cha mara unazojaribu</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Tafuta Vichupo</translation> <translation id="6184868291074982484">Chrome hudhibiti vidakuzi vya washirika wengine kiotomatiki</translation> <translation id="6190518157737269631">Kubatilisha baadhi ya vitufe kwenye kibodi yako, kama vile Esc</translation> <translation id="6194209731893739467">Angalia bidhaa zako zote unazofuatilia hapa</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Upakiaji umezuiwa</translation> <translation id="7132939140423847331">Msimamizi wako amezuia data hii isinakiliwe.</translation> <translation id="7135130955892390533">Onyesha hali</translation> +<translation id="7135814714616751706">Tafuta njia za mkato</translation> <translation id="7136009930065337683">Pata maelezo zaidi kuhusu hali fiche</translation> <translation id="7138472120740807366">Njia ya kusafirisha</translation> <translation id="7138678301420049075">Nyingine</translation> @@ -4179,6 +4181,7 @@ <translation id="8092254339843485299">Inchi 6 x 8</translation> <translation id="8092774999298748321">Zambarau Iliyokolea</translation> <translation id="8094917007353911263">Mtandao unaotumia unaweza kukuhitaji kutembelea <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Historia ya Mambo Uliyotafuta</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Njia ya Kulipa</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index cd0bfed..56468e5a 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -3045,6 +3045,7 @@ <translation id="6177531123306197852">என்வெலப் C2</translation> <translation id="6180316780098470077">மீண்டும் முயல்வதற்கான இடைவெளி</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">தாவல்களைத் தேடுக</translation> <translation id="6184868291074982484">Chrome தானாகவே மூன்றாம் தரப்புக் குக்கீகளைக் கட்டுப்படுத்தும்</translation> <translation id="6190518157737269631">Esc போன்ற சில பட்டன்களை உங்கள் கீபோர்டில் மீறிச் செயல்படுதல்</translation> <translation id="6194209731893739467">நீங்கள் கண்காணிக்கும் தயாரிப்புகள் இங்கே காட்டப்படும்</translation> @@ -3603,6 +3604,7 @@ <translation id="7130775116821607281">பதிவேற்றம் தடுக்கப்பட்டுள்ளது</translation> <translation id="7132939140423847331">இந்தத் தரவை நகலெடுப்பதை உங்கள் நிர்வாகி தடுத்துள்ளார்.</translation> <translation id="7135130955892390533">நிலையைக் காட்டு</translation> +<translation id="7135814714616751706">ஷார்ட்கட்களைத் தேடுக</translation> <translation id="7136009930065337683">மறைநிலைப் பயன்முறை குறித்த கூடுதல் விவரங்கள்</translation> <translation id="7138472120740807366">டெலிவரி முறை</translation> <translation id="7138678301420049075">மற்றவை</translation> @@ -4176,6 +4178,7 @@ <translation id="8092254339843485299">6 x 8 இன்ச்</translation> <translation id="8092774999298748321">அடர் பர்பிள்</translation> <translation id="8094917007353911263">நீங்கள் பயன்படுத்திக் கொண்டிருக்கும் நெட்வொர்க், <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> ஐ நீங்கள் பார்க்கக் கோரலாம்.</translation> +<translation id="809543534949702122">இதுவரை தேடியவை</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">கட்டண முறை</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 925359d..bc3a3d92 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -3045,6 +3045,7 @@ <translation id="6177531123306197852">ఎన్వలప్ C2</translation> <translation id="6180316780098470077">పునఃప్రయత్నాల మధ్య విరామం</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ట్యాబ్లలో సెర్చ్ చేయండి</translation> <translation id="6184868291074982484">Chrome థర్డ్-పార్టీ కుక్కీలను ఆటోమేటిక్గా పరిమితం చేస్తుంది</translation> <translation id="6190518157737269631">మీ కీబోర్డ్లోని కొన్ని కీలను ఓవర్రైడ్ చేయండి, ఉదా., Esc</translation> <translation id="6194209731893739467">మీరు ట్రాక్ చేసిన అన్ని ప్రోడక్ట్లను ఇక్కడ చూడండి</translation> @@ -3603,6 +3604,7 @@ <translation id="7130775116821607281">అప్లోడ్ చేయకుండా బ్లాక్ చేయబడింది</translation> <translation id="7132939140423847331">మీ అడ్మిన్ ఈ డేటాను కాపీ చేయకుండా నిషేధించారు.</translation> <translation id="7135130955892390533">స్థితిని చూపు</translation> +<translation id="7135814714616751706">షార్ట్కట్ల కోసం సెర్చ్ చేయండి</translation> <translation id="7136009930065337683">అజ్ఞాత మోడ్ గురించి మరింత తెలుసుకోండి</translation> <translation id="7138472120740807366">డెలివరీ పద్ధతి</translation> <translation id="7138678301420049075">ఇతర</translation> @@ -4176,6 +4178,7 @@ <translation id="8092254339843485299">6 x 8 అంగుళాలు</translation> <translation id="8092774999298748321">ముదురు ఊదా రంగు</translation> <translation id="8094917007353911263">మీరు ఉపయోగిస్తున్న నెట్వర్క్కు మీరు <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />ను సందర్శించడం అవసరం.</translation> +<translation id="809543534949702122">సెర్చ్ హిస్టరీ</translation> <translation id="8098855213644561659">A3 అదనం</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">పేమెంట్ ఆప్షన్</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 94f6869..870e5354 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -3049,6 +3049,7 @@ <translation id="6177531123306197852">Envelope C2</translation> <translation id="6180316780098470077">ช่วงเว้นระหว่างการลองใหม่แต่ละครั้ง</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ค้นหาแท็บ</translation> <translation id="6184868291074982484">Chrome จำกัดคุกกี้ของบุคคลที่สามโดยอัตโนมัติ</translation> <translation id="6190518157737269631">ลบล้างแป้นพิมพ์บางแป้นบนแป้นพิมพ์ของคุณ เช่น Esc</translation> <translation id="6194209731893739467">ดูผลิตภัณฑ์ที่ติดตามทั้งหมดที่นี่</translation> @@ -3607,6 +3608,7 @@ <translation id="7130775116821607281">การอัปโหลดถูกบล็อก</translation> <translation id="7132939140423847331">ผู้ดูแลระบบของคุณห้ามไม่ให้คัดลอกข้อมูลนี้</translation> <translation id="7135130955892390533">แสดงสถานะ</translation> +<translation id="7135814714616751706">ค้นหาทางลัด</translation> <translation id="7136009930065337683">ดูข้อมูลเพิ่มเติมเกี่ยวกับโหมดไม่ระบุตัวตน</translation> <translation id="7138472120740807366">วิธีการนำส่งสินค้า</translation> <translation id="7138678301420049075">อื่นๆ</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 x 8 นิ้ว</translation> <translation id="8092774999298748321">ม่วงเข้ม</translation> <translation id="8094917007353911263">เครือข่ายที่คุณใช้อาจต้องการให้คุณไปที่ <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /></translation> +<translation id="809543534949702122">ประวัติการค้นหา</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">วิธีการชำระเงิน</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index aa78a20..f2c03b8 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Zarf C2</translation> <translation id="6180316780098470077">Deneme aralığı</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Sekme Ara</translation> <translation id="6184868291074982484">Chrome, üçüncü taraf çerezlerini otomatik olarak sınırlandırır</translation> <translation id="6190518157737269631">Klavyenizdeki Esc gibi bazı tuşları geçersiz kılma</translation> <translation id="6194209731893739467">Takip edilen ürünlerinizin tamamını burada görün</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Yükleme işlemi engellendi</translation> <translation id="7132939140423847331">Yöneticiniz bu verilerin kopyalanmasını engellemiş.</translation> <translation id="7135130955892390533">Durumu göster</translation> +<translation id="7135814714616751706">Kısayol araması yapın</translation> <translation id="7136009930065337683">Gizli mod hakkında daha fazla bilgi</translation> <translation id="7138472120740807366">Teslimat yöntemi</translation> <translation id="7138678301420049075">Diğer</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 inç</translation> <translation id="8092774999298748321">Koyu Mor</translation> <translation id="8094917007353911263">Kullandığınız ağ <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> adresini ziyaret etmenizi gerektiriyor olabilir.</translation> +<translation id="809543534949702122">Geçmişte arayın</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Ödeme Yöntemi</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index c959944..d792ff06 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Конверт C2</translation> <translation id="6180316780098470077">Інтервал між повторними спробами</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Шукати вкладки</translation> <translation id="6184868291074982484">Chrome автоматично обмежує сторонні файли cookie</translation> <translation id="6190518157737269631">перевизначити деякі клавіші на клавіатурі, наприклад Esc</translation> <translation id="6194209731893739467">Тут можна переглянути всі відстежувані товари</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Завантаження заборонено</translation> <translation id="7132939140423847331">Ваш адміністратор заборонив копіювати ці дані.</translation> <translation id="7135130955892390533">Показати статус</translation> +<translation id="7135814714616751706">Пошук комбінацій клавіш</translation> <translation id="7136009930065337683">Докладніше про анонімний режим</translation> <translation id="7138472120740807366">Спосіб доставки</translation> <translation id="7138678301420049075">Інше</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 дюйм.</translation> <translation id="8092774999298748321">Насичений пурпуровий</translation> <translation id="8094917007353911263">Можливо, щоб під’єднатися до цієї мережі, потрібно відвідати сторінку <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Історія пошуку</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Спосіб оплати</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index 9a488412..0500dfb 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -3052,6 +3052,7 @@ <translation id="6177531123306197852">C2 لفافہ</translation> <translation id="6180316780098470077">دوبارہ کوشش کرنے کا وقفہ</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">ٹیبز تلاش کریں</translation> <translation id="6184868291074982484">Chrome خودکار طور پر فریق ثالث کوکیز کو محدود کر دیتا ہے</translation> <translation id="6190518157737269631">اپنے کی بورڈ پر کچھ کلیدوں کو اوور رائیڈ کریں، جیسے Esc</translation> <translation id="6194209731893739467">اپنے تمام ٹریک کردہ پروڈکٹس یہاں دیکھیں</translation> @@ -3610,6 +3611,7 @@ <translation id="7130775116821607281">اپ لوڈ کرنا مسدود ہے</translation> <translation id="7132939140423847331">آپ کے منتظم نے اس ڈیٹا کے کاپی کیے جانے پر پابندی لگائی ہے۔</translation> <translation id="7135130955892390533">اسٹیٹس دکھائیں</translation> +<translation id="7135814714616751706">شارٹ کٹس تلاش کریں</translation> <translation id="7136009930065337683">پوشیدگی وضع کے بارے میں مزید جانیں</translation> <translation id="7138472120740807366">ڈیلیوری کا طریقہ</translation> <translation id="7138678301420049075">دوسرا</translation> @@ -4182,6 +4184,7 @@ <translation id="8092254339843485299">6 x 8 انچ</translation> <translation id="8092774999298748321">گہرا جامنی</translation> <translation id="8094917007353911263">آپ کے زیر استعمال نیٹ ورک آپ سے <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> ملاحظہ کرنے کا تقاضہ کر سکتا ہے۔</translation> +<translation id="809543534949702122">تلاش کی سرگزشت</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">ادائیگی کا طریقہ</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index 4a356f1..a4e66bf 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -867,6 +867,7 @@ <ph name="END_LIST" /></translation> <translation id="2448295565072560657">Tizimga kirganingizda bu qurilmaga tashqi qurilmalar taʼminoti biriktirilgan</translation> <translation id="2450019289047528273">Google Walletda saqlangan toʻlov usullari va boshqa maʼlumotlar</translation> +<translation id="2451201933352935301"><ph name="URL" /> barcha displeylaringizda oynalarni boshqarishga ruxsat olmoqchi</translation> <translation id="2451607499823206582">Kuzatuvda</translation> <translation id="2452098632681057184">Ekologiya va atrof-muhit</translation> <translation id="2452837234288608067">Xatolik yuz berdi. Qayta urining.</translation> @@ -3044,6 +3045,7 @@ <translation id="6177531123306197852">Envelope C2</translation> <translation id="6180316780098470077">Qayta urinishlar intervali</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Varaqlar ichidan qidirish</translation> <translation id="6184868291074982484">Chrome avtomatik tarzda tashqi cookie fayllarni cheklaydi</translation> <translation id="6190518157737269631">Esc kabi klaviaturadagi ayrim tugmalarni almashtirish</translation> <translation id="6194209731893739467">Barcha kuzatadigan mahsulotlaringiz shu yerda chiqadi</translation> @@ -3602,6 +3604,7 @@ <translation id="7130775116821607281">Yuklash bloklandi</translation> <translation id="7132939140423847331">Administrator bu maʼlumotlardan nusxa olishni taqiqlagan.</translation> <translation id="7135130955892390533">Holat axboroti</translation> +<translation id="7135814714616751706">Tezkor tugmalar qidiruvi</translation> <translation id="7136009930065337683">Inkognito haqida batafsil</translation> <translation id="7138472120740807366">Yetkazib berish usuli</translation> <translation id="7138678301420049075">Boshqa</translation> @@ -4174,6 +4177,7 @@ <translation id="8092254339843485299">6 x 8 in</translation> <translation id="8092774999298748321">Boyitilgan siyohrang</translation> <translation id="8094917007353911263">Siz ulangan tarmoq <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> sahifaga o‘tishingizni talab qilishi mumkin.</translation> +<translation id="809543534949702122">Qidiruv tarixi</translation> <translation id="8098855213644561659">A3 Ekstra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">To‘lov usuli</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 883ffee..676b07c 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -3050,6 +3050,7 @@ <translation id="6177531123306197852">Phong bì C2</translation> <translation id="6180316780098470077">Khoảng thời gian thử lại</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">Tìm kiếm thẻ</translation> <translation id="6184868291074982484">Chrome tự động hạn chế cookie của bên thứ ba</translation> <translation id="6190518157737269631">Ghi đè một số phím trên bàn phím, chẳng hạn như phím Esc</translation> <translation id="6194209731893739467">Xem tất cả sản phẩm bạn theo dõi tại đây</translation> @@ -3608,6 +3609,7 @@ <translation id="7130775116821607281">Tính năng tải lên bị chặn</translation> <translation id="7132939140423847331">Quản trị viên của bạn đã cấm sao chép dữ liệu này.</translation> <translation id="7135130955892390533">Hiển thị trạng thái</translation> +<translation id="7135814714616751706">Tìm lối tắt</translation> <translation id="7136009930065337683">Tìm hiểu thêm về chế độ Ẩn danh</translation> <translation id="7138472120740807366">Phương thức phân phối</translation> <translation id="7138678301420049075">Khác</translation> @@ -4181,6 +4183,7 @@ <translation id="8092254339843485299">6 x 8 inch</translation> <translation id="8092774999298748321">Tím đậm</translation> <translation id="8094917007353911263">Mạng mà bạn đang sử dụng có thể yêu cầu bạn phải truy cập <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Tìm trong nhật ký</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Phương thức thanh toán</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 7b267dc..197779f8 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -3045,6 +3045,7 @@ <translation id="6177531123306197852">C2 信封</translation> <translation id="6180316780098470077">重试间隔</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">搜索标签页</translation> <translation id="6184868291074982484">Chrome 会自动限制第三方 Cookie</translation> <translation id="6190518157737269631">替换键盘上的某些键(例如 Esc 键)</translation> <translation id="6194209731893739467">您跟踪的所有商品都会显示在此处</translation> @@ -3603,6 +3604,7 @@ <translation id="7130775116821607281">禁止上传</translation> <translation id="7132939140423847331">您的管理员已禁止复制此数据。</translation> <translation id="7135130955892390533">显示状态</translation> +<translation id="7135814714616751706">搜索快捷键</translation> <translation id="7136009930065337683">详细了解无痕模式</translation> <translation id="7138472120740807366">递送方式</translation> <translation id="7138678301420049075">其他</translation> @@ -4176,6 +4178,7 @@ <translation id="8092254339843485299">6 x 8 英寸</translation> <translation id="8092774999298748321">深紫色</translation> <translation id="8094917007353911263">您要使用的网络可能需要您访问 <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />。</translation> +<translation id="809543534949702122">在历史记录中搜索</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">付款方式</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index e87a1ed9..debdc91 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -3049,6 +3049,7 @@ <translation id="6177531123306197852">C2 信封</translation> <translation id="6180316780098470077">重試間隔</translation> <translation id="6182972682129119950">A4x5</translation> +<translation id="6184099524311454384">搜尋分頁</translation> <translation id="6184868291074982484">Chrome 會自動限制第三方 Cookie</translation> <translation id="6190518157737269631">取代鍵盤上的部分按鍵,例如 Esc</translation> <translation id="6194209731893739467">在此查看您追蹤的所有產品</translation> @@ -3607,6 +3608,7 @@ <translation id="7130775116821607281">已禁止上載</translation> <translation id="7132939140423847331">管理員已禁止複製此資料。</translation> <translation id="7135130955892390533">顯示狀態</translation> +<translation id="7135814714616751706">搜尋捷徑</translation> <translation id="7136009930065337683">進一步了解無痕模式</translation> <translation id="7138472120740807366">送貨方式</translation> <translation id="7138678301420049075">其他</translation> @@ -4180,6 +4182,7 @@ <translation id="8092254339843485299">6 x 8 吋</translation> <translation id="8092774999298748321">深紫色</translation> <translation id="8094917007353911263">目前使用的網絡可能要求您前往 <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />。</translation> +<translation id="809543534949702122">在記錄中搜尋</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">付款方法</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index d66de108..22de06f 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -3048,6 +3048,7 @@ <translation id="6177531123306197852">Envelope C2</translation> <translation id="6180316780098470077">重試間隔</translation> <translation id="6182972682129119950">A4 x 5</translation> +<translation id="6184099524311454384">搜尋分頁</translation> <translation id="6184868291074982484">Chrome 會自動限制第三方 Cookie</translation> <translation id="6190518157737269631">覆寫鍵盤上的按鍵,例如 Esc 鍵</translation> <translation id="6194209731893739467">在這裡查看所有追蹤的產品</translation> @@ -3606,6 +3607,7 @@ <translation id="7130775116821607281">禁止上傳</translation> <translation id="7132939140423847331">管理員已禁止複製這個資料。</translation> <translation id="7135130955892390533">顯示狀態</translation> +<translation id="7135814714616751706">搜尋捷徑</translation> <translation id="7136009930065337683">進一步瞭解無痕模式</translation> <translation id="7138472120740807366">快遞方式</translation> <translation id="7138678301420049075">其他</translation> @@ -4179,6 +4181,7 @@ <translation id="8092254339843485299">6 x 8 吋</translation> <translation id="8092774999298748321">深紫色</translation> <translation id="8094917007353911263">目前使用的網路可能會要求您造訪 <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />。</translation> +<translation id="809543534949702122">在歷史記錄中搜尋</translation> <translation id="8098855213644561659">A3 Extra</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">付款方式</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index e7e47d6c..82624e3 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -3047,6 +3047,7 @@ <translation id="6177531123306197852">Imvilophu ye-C2</translation> <translation id="6180316780098470077">Izikhawu zokuzama futhi</translation> <translation id="6182972682129119950">I-A4x5</translation> +<translation id="6184099524311454384">Amathebhu Wokusesha</translation> <translation id="6184868291074982484">I-Chrome ikhawulela ngokuzenzakalelayo amakhukhi ezinkampani zangaphandle</translation> <translation id="6190518157737269631">Khipha ezinye izinkinobho kukhibhodi yakho, njengethi Esc</translation> <translation id="6194209731893739467">Bona yonke imikhiqizo yakho elandelelwe lapha</translation> @@ -3605,6 +3606,7 @@ <translation id="7130775116821607281">Ukulayisha kuvinjiwe</translation> <translation id="7132939140423847331">Umphathi wakho uvimbele ukuthi le datha ikopishwe.</translation> <translation id="7135130955892390533">Bonisa isimo</translation> +<translation id="7135814714616751706">Sesha izinqamuleli</translation> <translation id="7136009930065337683">Funda kabanzi mayelana ne-Incognito</translation> <translation id="7138472120740807366">Indlela yokulethwa</translation> <translation id="7138678301420049075">Okunye</translation> @@ -4177,6 +4179,7 @@ <translation id="8092254339843485299">U-6 x 8 phakathi</translation> <translation id="8092774999298748321">Ubunsomi obujulile</translation> <translation id="8094917007353911263">Inethiwekhi oyisebenzisayo ingadinga ukuthi uvakashele ku-<ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation> +<translation id="809543534949702122">Umlando wosesho</translation> <translation id="8098855213644561659">I-A3 Engeziwe</translation> <translation id="809898108652741896">A6</translation> <translation id="8103161714697287722">Indlela yokukhokha</translation>
diff --git a/components/supervised_user/core/browser/supervised_user_url_filter.cc b/components/supervised_user/core/browser/supervised_user_url_filter.cc index 539c000..6e9e4f6 100644 --- a/components/supervised_user/core/browser/supervised_user_url_filter.cc +++ b/components/supervised_user/core/browser/supervised_user_url_filter.cc
@@ -162,9 +162,10 @@ context, transition_type); } -// Tells if url filtering is set at the correct level of pref store hierarchy -// for parental settings. -bool ConsistentParentalSetting(const PrefService& pref_service) { +// Tells if url filtering settings are configured by family link. See +// supervised_user::SupervisedUserPrefStore to understand how the prefs are +// organized. +bool IsConfiguredByFamilyLink(const PrefService& pref_service) { return IsSubjectToParentalControls(pref_service) && pref_service.FindPreference(prefs::kSupervisedUserSafeSites) ->IsManagedByCustodian() && @@ -173,9 +174,10 @@ ->IsManagedByCustodian(); } -// Tells if url filtering is set at the correct level of pref store hierarchy -// for user settings. -bool ConsistentUserSetting(const PrefService& pref_service) { +// Tells if url filtering settings are configured locally. See +// supervised_user::SupervisedUserService::SetUserSettingsActive to understand +// how the prefs are organized. +bool IsConfiguredLocally(const PrefService& pref_service) { return IsSubjectToUserControls(pref_service) && pref_service.FindPreference(prefs::kSupervisedUserSafeSites) ->HasUserSetting() && @@ -197,14 +199,12 @@ } // Returns true when the pref configuration suggests that filtering settings are -// unset. Validates if the filter configuration is consistent with user type: -// *) Users under parental controls have the prefs managed, -// *) Users under self-controls have the prefs set by themselves, -// *) Other users can either have all prefs default. +// unset. Validates whether the preferences configuration is consistent state: +// filter is either disabled, configured by family link or locally. bool FilterIsDisabled(const PrefService& pref_service) { bool is_disabled = AreUrlFilterPrefsDefault(pref_service); - CHECK_NE(is_disabled, ConsistentParentalSetting(pref_service) || - ConsistentUserSetting(pref_service)); + CHECK_NE(is_disabled, IsConfiguredByFamilyLink(pref_service) || + IsConfiguredLocally(pref_service)); return is_disabled; }
diff --git a/components/user_manager/user_manager_impl.cc b/components/user_manager/user_manager_impl.cc index f81fc04..8139cf2 100644 --- a/components/user_manager/user_manager_impl.cc +++ b/components/user_manager/user_manager_impl.cc
@@ -1759,10 +1759,7 @@ FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, base::BindOnce( [](const std::string& locale) { - std::string resolved_locale; - std::ignore = - l10n_util::CheckAndResolveLocale(locale, &resolved_locale); - return resolved_locale; + return l10n_util::CheckAndResolveLocale(locale).value_or(""); }, locale), base::BindOnce(&UserManagerImpl::DoUpdateAccountLocale,
diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc index bdbbee5..a588237 100644 --- a/content/browser/navigation_browsertest.cc +++ b/content/browser/navigation_browsertest.cc
@@ -1640,14 +1640,7 @@ // when history.pushState() and history.back() are called in a loop. // Failing to do so causes the browser to become unresponsive. // See https://crbug.com/882238 -// TODO(crbug.com/379844650): Disabled on Linux sanitizer bots due to flakiness. -#if BUILDFLAG(IS_LINUX) && defined(ADDRESS_SANITIZER) -#define MAYBE_IPCFlood_GoToEntryAtOffset DISABLED_IPCFlood_GoToEntryAtOffset -#else -#define MAYBE_IPCFlood_GoToEntryAtOffset IPCFlood_GoToEntryAtOffset -#endif -IN_PROC_BROWSER_TEST_F(NavigationBrowserTest, - MAYBE_IPCFlood_GoToEntryAtOffset) { +IN_PROC_BROWSER_TEST_F(NavigationBrowserTest, IPCFlood_GoToEntryAtOffset) { GURL url(embedded_test_server()->GetURL("/title1.html")); EXPECT_TRUE(NavigateToURL(shell(), url));
diff --git a/content/browser/webauth/authenticator_common_impl.cc b/content/browser/webauth/authenticator_common_impl.cc index 45e818b6..bd30369 100644 --- a/content/browser/webauth/authenticator_common_impl.cc +++ b/content/browser/webauth/authenticator_common_impl.cc
@@ -1398,6 +1398,8 @@ base::UserMetricsAction("WebAuthn.GetAssertion.Conditional.Start")); } else if (options->mediation == Mediation::MODAL) { base::RecordAction(base::UserMetricsAction("WebAuthn.GetAssertion.Start")); + } else if (options->mediation == Mediation::IMMEDIATE) { + base::RecordAction(base::UserMetricsAction("WebAuthn.GetCredential.Start")); } callback = base::BindOnce( &AuthenticatorCommonImpl::GetMetricsWrappedGetCredentialCallback, @@ -2072,8 +2074,13 @@ void AuthenticatorCommonImpl::GetMetricsWrappedGetCredentialCallback( blink::mojom::Authenticator::GetCredentialCallback callback, blink::mojom::GetCredentialResponsePtr response) { - if (response.is_null() || response->is_password_response()) { - // TODO(crbug.com/392549444): add metrics for passwords. + if (response.is_null()) { + std::move(callback).Run(std::move(response)); + return; + } + if (response->is_password_response()) { + base::RecordAction( + base::UserMetricsAction("WebAuthn.GetCredential.SuccessWithPassword")); std::move(callback).Run(std::move(response)); return; } @@ -2558,6 +2565,9 @@ void AuthenticatorCommonImpl::OnImmediateTimeout() { base::UmaHistogramBoolean(kImmediateTimeoutWhileWaitingForUi, true); + base::UmaHistogramEnumeration( + "WebAuthentication.GetAssertion.Immediate.RejectionReason", + ImmediateMediationRejectionReason::kTimeout); CancelRequestForImmediateMediation(); }
diff --git a/content/public/browser/authenticator_request_client_delegate.h b/content/public/browser/authenticator_request_client_delegate.h index 8b8ed1e..2f05706 100644 --- a/content/public/browser/authenticator_request_client_delegate.h +++ b/content/public/browser/authenticator_request_client_delegate.h
@@ -41,6 +41,24 @@ namespace content { +// LINT.IfChange +// Reasons why a WebAuthn get() request with `mediation: "immediate"` was +// rejected by the browser before showing any UI. +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class ImmediateMediationRejectionReason { + // The request was in an incognito/off-the-record profile. + kIncognito = 0, + // The request was rate-limited for the origin. + kRateLimited = 1, + // No credentials were found for the request. + kNoCredentials = 2, + // The request timed out before the UI could be shown. + kTimeout = 3, + kMaxValue = kTimeout, +}; +// LINT.ThenChange(//tools/metrics/histograms/metadata/webauthn/enums.xml) + // AuthenticatorRequestClientDelegate is an interface that lets embedders // customize the lifetime of a single WebAuthn API request in the //content // layer. In particular, the Authenticator mojo service uses
diff --git a/gpu/ipc/common/gpu_memory_buffer_impl_test_template.h b/gpu/ipc/common/gpu_memory_buffer_impl_test_template.h index 97c6ac74..960b949 100644 --- a/gpu/ipc/common/gpu_memory_buffer_impl_test_template.h +++ b/gpu/ipc/common/gpu_memory_buffer_impl_test_template.h
@@ -189,7 +189,7 @@ std::unique_ptr<GpuMemoryBufferImpl> buffer( TestFixture::gpu_memory_buffer_support() - ->CreateGpuMemoryBufferImplFromHandle( + ->CreateGpuMemoryBufferImplFromHandleForTesting( std::move(handle), kBufferSize, format, usage, std::move(destroy_callback))); ASSERT_TRUE(buffer); @@ -242,7 +242,7 @@ // Handle import should fail when the size is bigger than expected. std::unique_ptr<GpuMemoryBufferImpl> buffer( TestFixture::gpu_memory_buffer_support() - ->CreateGpuMemoryBufferImplFromHandle( + ->CreateGpuMemoryBufferImplFromHandleForTesting( std::move(handle), bogus_size, format, usage, std::move(destroy_callback))); @@ -280,7 +280,7 @@ std::unique_ptr<GpuMemoryBufferImpl> buffer( TestFixture::gpu_memory_buffer_support() - ->CreateGpuMemoryBufferImplFromHandle( + ->CreateGpuMemoryBufferImplFromHandleForTesting( std::move(handle), kBufferSize, format, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, std::move(destroy_callback))); @@ -346,7 +346,7 @@ std::unique_ptr<GpuMemoryBufferImpl> buffer( TestFixture::gpu_memory_buffer_support() - ->CreateGpuMemoryBufferImplFromHandle( + ->CreateGpuMemoryBufferImplFromHandleForTesting( std::move(handle), kBufferSize, format, gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, std::move(destroy_callback))); @@ -444,7 +444,7 @@ std::unique_ptr<GpuMemoryBufferImpl> buffer( TestFixture::gpu_memory_buffer_support() - ->CreateGpuMemoryBufferImplFromHandle( + ->CreateGpuMemoryBufferImplFromHandleForTesting( std::move(output_handle), kBufferSize, format, usage, std::move(destroy_callback))); ASSERT_TRUE(buffer);
diff --git a/gpu/ipc/common/gpu_memory_buffer_support.h b/gpu/ipc/common/gpu_memory_buffer_support.h index 2c39116f..a7de618 100644 --- a/gpu/ipc/common/gpu_memory_buffer_support.h +++ b/gpu/ipc/common/gpu_memory_buffer_support.h
@@ -10,6 +10,7 @@ #include "base/containers/span.h" #include "base/functional/callback.h" +#include "base/functional/callback_helpers.h" #include "base/hash/hash.h" #include "base/memory/scoped_refptr.h" #include "base/memory/unsafe_shared_memory_pool.h" @@ -43,7 +44,17 @@ }; } // namespace std +namespace arc { +class GpuArcVideoEncodeAccelerator; +} + +namespace media { +class VaapiJpegEncodeAccelerator; +class V4L2JpegEncodeAccelerator; +} // namespace media + namespace gpu { +class ClientSharedImage; class GpuMemoryBufferManager; // Provides a common factory for GPU memory buffer implementations. @@ -72,6 +83,43 @@ gfx::BufferFormat format, gfx::BufferUsage usage); + // Creates a GpuMemoryBufferImpl from the given |handle| for VideoFrames. + // |size| and |format| should match what was used to allocate the |handle|. + // NOTE: DO NOT ADD ANY USAGES OF THIS METHOD. + // TODO(crbug.com/40263579): Remove this method once all usages are + // eliminated. + std::unique_ptr<GpuMemoryBufferImpl> + CreateGpuMemoryBufferImplFromHandleForVideoFrame( + gfx::GpuMemoryBufferHandle handle, + const gfx::Size& size, + gfx::BufferFormat format, + gfx::BufferUsage usage) { + return CreateGpuMemoryBufferImplFromHandle(std::move(handle), size, format, + usage, base::NullCallback()); + } + + std::unique_ptr<GpuMemoryBufferImpl> + CreateGpuMemoryBufferImplFromHandleForTesting( + gfx::GpuMemoryBufferHandle handle, + const gfx::Size& size, + gfx::BufferFormat format, + gfx::BufferUsage usage, + GpuMemoryBufferImpl::DestructionCallback callback) { + return CreateGpuMemoryBufferImplFromHandle(std::move(handle), size, format, + usage, std::move(callback)); + } + + private: + // TODO(crbug.com/404905709): Eliminate these class' creation of GMBs and + // remove this friending. + friend class arc::GpuArcVideoEncodeAccelerator; + friend class media::VaapiJpegEncodeAccelerator; + friend class media::V4L2JpegEncodeAccelerator; + + // ClientSharedImage is the only entity that should be creating GMBs via + // GpuMemoryBufferSupport. + friend class ClientSharedImage; + // Creates a GpuMemoryBufferImpl from the given |handle|. |size| and |format| // should match what was used to allocate the |handle|. |callback|, if // non-null, is called when instance is deleted, which is not necessarily on @@ -89,7 +137,6 @@ scoped_refptr<base::UnsafeSharedMemoryPool> pool = nullptr, base::span<uint8_t> premapped_memory = base::span<uint8_t>()); - private: // Returns whether the provided buffer format is supported. static bool IsNativeGpuMemoryBufferConfigurationSupported( gfx::BufferFormat format,
diff --git a/internal b/internal index fc82705..1352cfb 160000 --- a/internal +++ b/internal
@@ -1 +1 @@ -Subproject commit fc8270585d35ff4b1d05c06fbc75fa5fb7d8d63e +Subproject commit 1352cfbc23726d06daa6dc8320c8eea7da7ce099
diff --git a/ios/build/bots/scripts/run.py b/ios/build/bots/scripts/run.py index c589fb8..13049fc 100755 --- a/ios/build/bots/scripts/run.py +++ b/ios/build/bots/scripts/run.py
@@ -109,6 +109,12 @@ is_legacy_xcode = True self.parse_args(args) + # If xcode already exists in /Applications, then use that instead of + # trying to cache another xcode in the work directory + if xcode.check_xcode_exists_in_apps(self.args.xcode_build_version.lower()): + self.args.xcode_path = (f"xcode_{self.args.xcode_build_version.lower()}" + ".app") + try: with measures.time_consumption('mac_toolchain', 'Download and Install', 'Xcode and Runtime'): @@ -243,7 +249,9 @@ # on exception to distinguish between a test failure, and a failure # to launch the test at all. exception_recorder.register(e) - if isinstance(e, test_runner_errors.XcodeInstallFailedError): + if isinstance(e, test_runner_errors.XcodeInstallFailedError + ) and not xcode.check_xcode_exists_in_apps( + self.args.xcode_build_version.lower()): self.should_delete_xcode_cache = True return 2 finally:
diff --git a/ios/build/bots/scripts/run_test.py b/ios/build/bots/scripts/run_test.py index f227ee65..7bdb3ba 100755 --- a/ios/build/bots/scripts/run_test.py +++ b/ios/build/bots/scripts/run_test.py
@@ -491,8 +491,10 @@ @mock.patch('xcode_util.construct_runtime_cache_folder', autospec=True) @mock.patch('xcode_util.install', autospec=True, return_value=True) @mock.patch('xcode_util.move_runtime', autospec=True) + @mock.patch('xcode_util.check_xcode_exists_in_apps', return_value=False) @mock.patch('mac_util.is_macos_13_or_higher', autospec=True) - def test_legacy_xcode(self, mock_macos_13_or_higher, mock_move_runtime, + def test_legacy_xcode(self, mock_macos_13_or_higher, + mock_check_xcode_exists_in_apps, mock_move_runtime, mock_install, mock_construct_runtime_cache_folder, mock_tr, _1, _2, _3, _4): mock_macos_13_or_higher.return_value = False @@ -525,11 +527,13 @@ @mock.patch('xcode_util.move_runtime', autospec=True) @mock.patch( 'xcode_util.is_runtime_builtin', autospec=True, return_value=False) + @mock.patch('xcode_util.check_xcode_exists_in_apps', return_value=False) @mock.patch('mac_util.is_macos_13_or_higher', autospec=True) def test_legacy_xcode_macos13_runtime_not_builtin( - self, mock_macos_13_or_higher, mock_is_runtime_builtin, mock_move_runtime, - mock_install_runtime_dmg, mock_install, - mock_construct_runtime_cache_folder, mock_tr, _1, _2, _3, _4): + self, mock_macos_13_or_higher, mock_check_xcode_exists_in_apps, + mock_is_runtime_builtin, mock_move_runtime, mock_install_runtime_dmg, + mock_install, mock_construct_runtime_cache_folder, mock_tr, _1, _2, _3, + _4): mock_macos_13_or_higher.return_value = True mock_construct_runtime_cache_folder.side_effect = lambda a, b: a + b test_runner = mock_tr.return_value @@ -562,13 +566,14 @@ @mock.patch('xcode_util.install_runtime_dmg') @mock.patch('xcode_util.move_runtime', autospec=True) @mock.patch('xcode_util.is_runtime_builtin', autospec=True, return_value=True) + @mock.patch('xcode_util.check_xcode_exists_in_apps', return_value=False) @mock.patch('mac_util.is_macos_13_or_higher', autospec=True) @mock.patch('iossim_util.delete_simulator_runtime_and_wait', autospec=True) def test_legacy_xcode_macos13_runtime_builtin( self, mock_delete_simulator_runtime_and_wait, mock_macos_13_or_higher, - mock_is_runtime_builtin, mock_move_runtime, mock_install_runtime_dmg, - mock_install, mock_construct_runtime_cache_folder, mock_tr, _1, _2, _3, - _4): + mock_check_xcode_exists_in_apps, mock_is_runtime_builtin, + mock_move_runtime, mock_install_runtime_dmg, mock_install, + mock_construct_runtime_cache_folder, mock_tr, _1, _2, _3, _4): mock_macos_13_or_higher.return_value = True mock_construct_runtime_cache_folder.side_effect = lambda a, b: a + b test_runner = mock_tr.return_value @@ -601,10 +606,12 @@ @mock.patch('xcode_util.install', autospec=True, return_value=False) @mock.patch('xcode_util.install_runtime_dmg') @mock.patch('xcode_util.move_runtime', autospec=True) + @mock.patch('xcode_util.check_xcode_exists_in_apps', return_value=False) @mock.patch('mac_util.is_macos_13_or_higher', autospec=True) @mock.patch('iossim_util.delete_simulator_runtime_and_wait', autospec=True) def test_not_legacy_xcode(self, mock_delete_simulator_runtime_and_wait, - mock_macos_13_or_higher, mock_move_runtime, + mock_macos_13_or_higher, + mock_check_xcode_exists_in_apps, mock_move_runtime, mock_install_runtime_dmg, mock_install, mock_construct_runtime_cache_folder, mock_tr, _1, _2, _3, _4): @@ -636,11 +643,47 @@ @mock.patch('os.path.exists', autospec=True, return_value=True) @mock.patch('xcodebuild_runner.SimulatorParallelTestRunner') @mock.patch('xcode_util.construct_runtime_cache_folder', autospec=True) + @mock.patch('xcode_util.install', autospec=True, return_value=True) + @mock.patch('xcode_util.move_runtime', autospec=True) + @mock.patch('xcode_util.check_xcode_exists_in_apps') + @mock.patch('mac_util.is_macos_13_or_higher', autospec=True) + def test_xcode_exists_in_apps(self, mock_macos_13_or_higher, + mock_check_xcode_exists_in_apps, + mock_move_runtime, mock_install, + mock_construct_runtime_cache_folder, mock_tr, + _1, _2, _3, _4): + mock_check_xcode_exists_in_apps = True + mock_macos_13_or_higher.return_value = False + mock_construct_runtime_cache_folder.side_effect = lambda a, b: a + b + test_runner = mock_tr.return_value + test_runner.launch.return_value = True + test_runner.logs = {} + + with mock.patch('run.open', mock.mock_open()): + self.runner.run(None) + + mock_install.assert_called_with( + 'mac_toolchain', + 'testXcodeVersion', + 'xcode_testxcodeversion.app', + runtime_cache_folder='test/runtime-ios-14.4', + ios_version='14.4') + mock_construct_runtime_cache_folder.assert_called_once_with( + 'test/runtime-ios-', '14.4') + self.assertFalse(mock_move_runtime.called) + + @mock.patch('test_runner.defaults_delete') + @mock.patch('json.dump') + @mock.patch('xcode_util.select', autospec=True) + @mock.patch('os.path.exists', autospec=True, return_value=True) + @mock.patch('xcodebuild_runner.SimulatorParallelTestRunner') + @mock.patch('xcode_util.construct_runtime_cache_folder', autospec=True) @mock.patch('xcode_util.install', autospec=True, return_value=False) @mock.patch('xcode_util.move_runtime', autospec=True) - def test_device_task(self, mock_move_runtime, mock_install, - mock_construct_runtime_cache_folder, mock_tr, _1, _2, _3, - _4): + @mock.patch('xcode_util.check_xcode_exists_in_apps', return_value=False) + def test_device_task(self, mock_check_xcode_exists_in_apps, mock_move_runtime, + mock_install, mock_construct_runtime_cache_folder, + mock_tr, _1, _2, _3, _4): """Check if Xcode is correctly installed for device tasks.""" self.runner.args.version = None test_runner = mock_tr.return_value @@ -669,9 +712,11 @@ @mock.patch( 'xcode_util.install_xcode', autospec=True, return_value=(False, True)) @mock.patch('xcode_util.move_runtime', autospec=True) + @mock.patch('xcode_util.check_xcode_exists_in_apps', return_value=False) @mock.patch('shutil.rmtree') - def test_report_extended_properties(self, mock_rmtree, mock_move_runtime, - mock_install, + def test_report_extended_properties(self, mock_rmtree, + mock_check_xcode_exists_in_apps, + mock_move_runtime, mock_install, mock_construct_runtime_cache_folder, mock_tr, _1, _2, _3, _4): self.runner.args.version = None
diff --git a/ios/build/bots/scripts/xcode_util.py b/ios/build/bots/scripts/xcode_util.py index e854dcc..63d0722 100644 --- a/ios/build/bots/scripts/xcode_util.py +++ b/ios/build/bots/scripts/xcode_util.py
@@ -232,10 +232,15 @@ '-s', xcode_app_path, ] - LOGGER.debug('Selecting Xcode with command %s and "xcrun simctl list".' % cmd) + LOGGER.debug('Selecting Xcode, runFirstLaunch and "xcrun simctl list"') output = subprocess.check_output( cmd, stderr=subprocess.STDOUT).decode('utf-8') + # After selecting xcode, ensure that the xcode is ready for launch + run_first_launch_cmd = ['sudo', '/usr/bin/xcodebuild', '-runFirstLaunch'] + output += subprocess.check_output( + run_first_launch_cmd, stderr=subprocess.STDOUT).decode('utf-8') + # This is to avoid issues caused by mixed usage of different Xcode versions on # one machine. xcrun_simctl_cmd = ['xcrun', 'simctl', 'list'] @@ -572,6 +577,32 @@ raise test_runner_errors.LocalRunRuntimeError(ios_version, runtime_build) +def ensure_xcode_ready_in_apps(): + """Finds Xcode apps with names like "xcode_*.app" in the /Applications + directory and ensure that they are all ready for launch. + This is to ensure that all existing Xcodes have completed installing the + necessary components. + Otherwise, it might cause issues on launching other xcode apps. + """ + + LOGGER.info('Checking if there are xcode apps exist in /Applications, ' + 'and ensuring their installations are finished.') + + # Use glob to find all directories ending with ".app" and starting with + # "xcode_" directly within the /Applications directory. + xcode_app_paths = glob.glob(os.path.join('/Applications', 'xcode_*.app')) + + if not xcode_app_paths: + LOGGER.info("No Xcode app bundles found matching 'xcode_*.app' " + "in /Applications'.") + return + + LOGGER.info(f"Found {len(xcode_app_paths)} Xcode app bundles " + "in /Applications:") + for app_path in xcode_app_paths: + select(app_path) + + def install_xcode(mac_toolchain_cmd, xcode_build_version, xcode_path, runtime_cache_prefix, ios_version): """Installs the requested Xcode build version. @@ -598,6 +629,10 @@ xcode_build_version, ios_version) return (True, False) + # crbug.com/406819704: this is necessary when multiple versions of + # xcodes exist in /Applications. + ensure_xcode_ready_in_apps() + try: if not mac_toolchain_cmd: raise test_runner_errors.MacToolchainNotFoundError(mac_toolchain_cmd) @@ -648,6 +683,22 @@ return True, is_legacy_xcode +def check_xcode_exists_in_apps(xcode_version): + """ + Checks if the specified Xcode version already exists in /Applications. + This is mainly used when xcodes are already installed in VM images + + Args: + xcode_version (str): The Xcode version string (e.g., "16f6"). + + Returns: + bool: True if the path exists, False otherwise. + """ + xcode_app_name = f"xcode_{xcode_version}.app" + xcode_path = os.path.join("/Applications", xcode_app_name) + return os.path.exists(xcode_path) + + def xctest_path(test_app_path: str) -> str: """Gets xctest-file from egtests/PlugIns folder.
diff --git a/ios/build/bots/scripts/xcode_util_test.py b/ios/build/bots/scripts/xcode_util_test.py index 850df0c..4ba10df 100755 --- a/ios/build/bots/scripts/xcode_util_test.py +++ b/ios/build/bots/scripts/xcode_util_test.py
@@ -374,6 +374,7 @@ mock_get_simulator_runtime_info_by_build.assert_called_once_with('20C52') mock__install_runtime_dmg.assert_not_called() + @mock.patch('xcode_util.ensure_xcode_ready_in_apps', return_value=None) @mock.patch('xcode_util.is_local_run', return_value=True) @mock.patch('xcode_util.version', return_value=('', 'TestXcodeVersion')) @mock.patch( @@ -381,7 +382,7 @@ @mock.patch('xcode_util.get_latest_runtime_build_cipd', return_value=object()) @mock.patch('xcode_util.install') def test_local_run(self, mock_install, mock_get_latest_runtime_build_cipd, _1, - _2, _3): + _2, _3, _4): ios_version = '14.4' install_success, is_legacy_xcode = xcode_util.install_xcode( self.mac_toolchain, self.xcode_build_version, self.xcode_app_path, '', @@ -392,6 +393,7 @@ self.xcode_build_version, ios_version) self.assertFalse(mock_install.called) + @mock.patch('xcode_util.ensure_xcode_ready_in_apps', return_value=None) @mock.patch('xcode_util.is_local_run', return_value=True) @mock.patch('xcode_util.version', return_value=('', 'TestXcodeVersion')) @mock.patch( @@ -400,7 +402,7 @@ @mock.patch('xcode_util.install') def test_local_run_no_cipd_runtime(self, mock_install, mock_get_latest_runtime_build_cipd, _1, _2, - _3): + _3, _4): ios_version = '14.4' install_success, is_legacy_xcode = xcode_util.install_xcode( self.mac_toolchain, self.xcode_build_version, self.xcode_app_path, '', @@ -576,6 +578,52 @@ result = xcode_util.get_latest_runtime_build_cipd('14c18', '15.0') self.assertIsNone(result) + @mock.patch('os.path.exists') + def test_check_xcode_exists_in_apps_exists(self, mock_exists): + mock_exists.return_value = True + result = xcode_util.check_xcode_exists_in_apps("16f6") + expected_path = "/Applications/xcode_16f6.app" + mock_exists.assert_called_once_with(expected_path) + self.assertTrue(result) + + @mock.patch('os.path.exists') + def test_check_xcode_exists_in_apps_not_exist(self, mock_exists): + mock_exists.return_value = False + result = xcode_util.check_xcode_exists_in_apps("15.0") + expected_path = "/Applications/xcode_15.0.app" + mock_exists.assert_called_once_with(expected_path) + self.assertFalse(result) + + @mock.patch('glob.glob') + @mock.patch('xcode_util.select') + def test_xcode_ready_no_xcode_apps_found(self, mock_select, mock_glob): + """Test case when no Xcode apps are found.""" + mock_glob.return_value = [] + + xcode_util.ensure_xcode_ready_in_apps() + + mock_glob.assert_called_once_with( + os.path.join("/Applications", "xcode_*.app")) + mock_select.assert_not_called() + + @mock.patch('glob.glob') + @mock.patch('xcode_util.select') + def test_xcode_ready_xcode_apps_found(self, mock_select, mock_glob): + """Test case when Xcode apps are found.""" + xcode_app_paths = [ + "/Applications/xcode_1.app", + "/Applications/xcode_2.app", + "/Applications/xcode_3.app", + ] + mock_glob.return_value = xcode_app_paths + + xcode_util.ensure_xcode_ready_in_apps() + + mock_glob.assert_called_once_with( + os.path.join("/Applications", "xcode_*.app")) + mock_select.assert_has_calls( + [mock.call(app_path) for app_path in xcode_app_paths]) + class MoveRuntimeTests(XcodeUtilTest): """Test class for xcode_util.move_runtime function."""
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index 7012793..893b5b74 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -545,6 +545,7 @@ <translation id="3227137524299004712">الميكروفون</translation> <translation id="3235063766008841141">تم إدخال كلمة المرور على موقع إلكتروني مخادع وتبيّن أنها مستخدَمة في عملية اختراق للبيانات.</translation> <translation id="3235242129752692527">عدِّل تفاصيل الحدث وانقر على "حفظ".</translation> +<translation id="323863549127671026">علامات التبويب ومجموعات علامات التبويب المفتوحة حاليًا</translation> <translation id="3240426699337459095">تم نسخ الرابط</translation> <translation id="3244271242291266297">الشهر</translation> <translation id="3245429137663807393">في حال شاركت أيضًا تقارير استخدام Chrome، ستتضمّن عناوين URL التي تنتقل إليها.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index d1efe7b..67b6ab1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -927,7 +927,7 @@ <translation id="483689884442613745">Gem…</translation> <translation id="4840495572919996524">Dine bogmærker, din historik, dine adgangskoder og meget andet synkroniseres ikke længere med din Google-konto.</translation> <translation id="484280513275854557">Du er blevet logget ud: Browserdataene er blevet slettet</translation> -<translation id="4850886885716139402">Vis</translation> +<translation id="4850886885716139402">Se</translation> <translation id="4860895144060829044">Ring op</translation> <translation id="4861953997778766866">Alle kan ændre dine delte fanegrupper</translation> <translation id="4865063548323785458">Gem og autofyld dine adgangskoder for nemt at logge ind på websites og i apps</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index 330f0ffc..cf77c3e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -545,6 +545,7 @@ <translation id="3227137524299004712">میکروفن</translation> <translation id="3235063766008841141">به سایت فریبدهندهای وارد شد و درمعرض نقض داده قرار گرفت</translation> <translation id="3235242129752692527">جزئیات رویداد را ویرایش کنید و روی «ذخیره» تکضرب بزنید.</translation> +<translation id="323863549127671026">زبانهها و گروههای زبانه باز فعلی</translation> <translation id="3240426699337459095">پیوند کپی شد</translation> <translation id="3244271242291266297">ماه</translation> <translation id="3245429137663807393">اگر گزارشهای استفاده از Chrome را نیز همرسانی کنید، این گزارشها نشانیهای وبی را که بازدید میکنید دربرمیگیرند.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index f2cd5048..3f7d2d0a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -18,6 +18,7 @@ <translation id="1054745118061919935">Sa pamamagitan ng pagpapatuloy, sumasang-ayon ka sa <ph name="BEGIN_LINK" />Mga Tuntunin ng Serbisyo<ph name="END_LINK" />.</translation> <translation id="10614374240317010">Hindi kailanman nag-save</translation> <translation id="1062138828266376352">Hindi napalitan ang iyong PIN. Tingnan ang iyong koneksyon sa internet at subukan ulit</translation> +<translation id="1063070031224282617">Piliin kung saan ise-save ang "<ph name="BEGIN_BOLD" /><ph name="FILENAME" /><ph name="END_BOLD" />" (<ph name="FILE_SIZE" />)</translation> <translation id="1072476005125066234">Mga review batay sa iyong mga interes</translation> <translation id="1074827084851510304">Ide-delete mo ang {password_count} (na) password at ang listahan ng mga site at app na pinili mong hinding-hindi magse-save ng impormasyon sa pag-sign in. Hindi made-delete ang anumang account na ginawa mo para sa mga site at app.</translation> <translation id="1076421457278169141">Na-scan na ang code</translation> @@ -592,6 +593,7 @@ <translation id="3476450923187944815">I-access ang iyong mga password sa iba pang app.</translation> <translation id="3488501490964659223">Isinara ang mga tab at na-delete ang data mula sa pag-browse. Na-sign out ka</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /> tungkol sa iminumungkahing content</translation> +<translation id="349446645805573740">Piliin kung saan ise-save ang "<ph name="BEGIN_BOLD" /><ph name="FILENAME" /><ph name="END_BOLD" />"</translation> <translation id="3504377992102007712">Mga Setting</translation> <translation id="35083190962747987">Buksan ang ${url}</translation> <translation id="3511519535430890904">Magdagdag ng proteksyon sa pag-browse</translation> @@ -691,6 +693,7 @@ <translation id="3922395466317605522">I-customize ang Menu</translation> <translation id="3929457972718048006">Mga Address</translation> <translation id="3931215329146376310">{count,plural, =1{Bagong password para sa site na ito}one{Mga bagong password para sa site na ito}other{Mga bagong password para sa site na ito}}</translation> +<translation id="3934905113567851655">I-pinch para i-resize</translation> <translation id="3940195383040445971">Subaybayan ang mga presyo sa mga tab</translation> <translation id="3941941395924123592">{COUNT,plural, =1{Isara ang {COUNT} tab}one{Isara ang {COUNT} tab}other{Isara ang {COUNT} na tab}}</translation> <translation id="3948600256434252210">Puwede kang mag-swipe pakanan para mag-browse sa Incognito.</translation> @@ -1698,6 +1701,7 @@ <translation id="7925108652071887026">Mag-autofill ng data</translation> <translation id="7926975587469166629">Nickname ng card</translation> <translation id="7927711904086083099">Hindi napili</translation> +<translation id="7927902634113905831">Piliin ang account na gusto mong gamitin para i-save ang "<ph name="BEGIN_BOLD" /><ph name="FILENAME" /><ph name="END_BOLD" />" - <ph name="FILESIZE" /></translation> <translation id="7930998711684428189">Binibigyan ka ng babala kung malalantad ang mga password sa paglabag sa data.</translation> <translation id="7933880123415105005">Maghanap sa <ph name="SEARCH_PROVIDER" /></translation> <translation id="7938254975914653459">FaceTime</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index b8bcf1d..8e8f3d23 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -203,7 +203,7 @@ <translation id="1819374301217551116">価格のトラッキングと分析情報</translation> <translation id="1820195936249950412">有効なアカウントでログインしてください</translation> <translation id="1820259098641718022">リーディング リストに追加しました</translation> -<translation id="1824490729233982311">他のデバイスからタブを受け取ったときに通知します。</translation> +<translation id="1824490729233982311">他のデバイスからタブを受け取ったときに通知。</translation> <translation id="1827529786398596735">ホーム画面を長押し</translation> <translation id="1832848789136765277">同期データに常にアクセスできるようにするには、本人確認を行ってください</translation> <translation id="1836891464494477513">{count,plural, =1{Google アカウント({email})にブックマークを保存しました}other{Google アカウント({email})にブックマークを保存しました}}</translation> @@ -983,7 +983,7 @@ <translation id="5067540696062462445">ダウンロード</translation> <translation id="507187271399539513">{count,plural, =1{{count} 件中 {position} 件目のお支払い方法}other{{count} 件中 {position} 件目のお支払い方法}}</translation> <translation id="5075939510584558547">暗号化せずに保存</translation> -<translation id="5076534614343816664">価格を追跡する</translation> +<translation id="5076534614343816664">価格の追跡</translation> <translation id="5078303485429639424">「<ph name="FEATURE_NAME" />」の通知をオンにする</translation> <translation id="5079950360618752063">提案されたパスワードを使用</translation> <translation id="5083464117946352670">ファイルサイズが不明です。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index 8bc4ca9..4b10ce3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -18,6 +18,7 @@ <translation id="1054745118061919935">გაგრძელებით თქვენ ეთანხმებით <ph name="BEGIN_LINK" />მომსახურების პირობებს<ph name="END_LINK" />.</translation> <translation id="10614374240317010">არასოდეს შენახული</translation> <translation id="1062138828266376352">თქვენი PIN-კოდი არ შეიცვალა. შეამოწმეთ ინტერნეტ-კავშირი და ცადეთ ხელახლა</translation> +<translation id="1063070031224282617">აირჩიეთ, სად შეინახოთ „<ph name="BEGIN_BOLD" /><ph name="FILENAME" /><ph name="END_BOLD" />“ (<ph name="FILE_SIZE" />)</translation> <translation id="1072476005125066234">მიმოხილვები თქვენი ინტერესების მიხედვით</translation> <translation id="1074827084851510304">თქვენ აპირებთ, წაშალოთ {password_count} პაროლი და იმ საიტებისა და აპების სია, რომლებშიც აირჩიეთ, რომ არასდროს შენახულიყო სისტემაში შესვლის ინფორმაცია. საიტებისთვის ან აპებისთვის შექმნილი არცერთი ანგარიში არ წაიშლება.</translation> <translation id="1076421457278169141">კოდი დასკანირდა</translation> @@ -593,6 +594,7 @@ <translation id="3476450923187944815">იქონიეთ წვდომა თქვენს პაროლებზე სხვა აპებიდან.</translation> <translation id="3488501490964659223">ჩანართები დაიხურა, ხოლო ვების დათვალიერების მონაცემები წაიშალა. სისტემიდან გახვედით</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /> შემოთავაზებული კონტენტის შესახებ</translation> +<translation id="349446645805573740">აირჩიეთ, სად შეინახოთ „<ph name="BEGIN_BOLD" /><ph name="FILENAME" /><ph name="END_BOLD" />“</translation> <translation id="3504377992102007712">პარამეტრები</translation> <translation id="35083190962747987">${url}-ის გახსნა</translation> <translation id="3511519535430890904">დაამატეთ ვების დათვალიერებისას დაცვა</translation> @@ -692,6 +694,7 @@ <translation id="3922395466317605522">მენიუს მორგება</translation> <translation id="3929457972718048006">მისამართები</translation> <translation id="3931215329146376310">{count,plural, =1{ახალი პაროლი ამ საიტისთვის}other{ახალი პაროლები ამ საიტისთვის}}</translation> +<translation id="3934905113567851655">ზომის შესაცვლელად გამოიყენეთ თითებით მასშტაბირება</translation> <translation id="3940195383040445971">ფასებისთვის თვალის მიდევნება ჩანართებზე</translation> <translation id="3941941395924123592">{COUNT,plural, =1{{COUNT} ჩანართის დახურვა}other{{COUNT} ჩანართის დახურვა}}</translation> <translation id="3948600256434252210">ვების ინკოგნიტო რეჟიმში დასათვალიერებლად შეგიძლიათ გადაფურცლოთ მარჯვნივ.</translation> @@ -1699,6 +1702,7 @@ <translation id="7925108652071887026">ავტომატური შევსების მონაცემები</translation> <translation id="7926975587469166629">ბარათის მეტსახელი</translation> <translation id="7927711904086083099">არ არის არჩეული</translation> +<translation id="7927902634113905831">აირჩიეთ ანგარიში, რომელიც გსურთ, გამოიყენოთ, რათა შეინახოთ „<ph name="BEGIN_BOLD" /><ph name="FILENAME" /><ph name="END_BOLD" />“ — <ph name="FILESIZE" /></translation> <translation id="7930998711684428189">გაგაფრთხილებთ მონაცემთა გაჟონვისას პაროლების გამოაშკარავების შემთხვევაში.</translation> <translation id="7933880123415105005"><ph name="SEARCH_PROVIDER" /> ძიება</translation> <translation id="7938254975914653459">FaceTime</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index 71c71ef..15c06ea64 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -545,6 +545,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3235063766008841141">Dimasukkan pada tapak penipuan dan ditemukan dalam pelanggaran data</translation> <translation id="3235242129752692527">Edit butiran peristiwa dan ketik “Simpan“.</translation> +<translation id="323863549127671026">Tab dan kumpulan tab yang dibuka pada masa ini</translation> <translation id="3240426699337459095">Pautan disalin</translation> <translation id="3244271242291266297">BB</translation> <translation id="3245429137663807393">Jika anda turut berkongsi laporan penggunaan Chrome, laporan tersebut menyertakan URL yang anda lawati</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb index 57dc219..896b3e7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_or.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -545,6 +545,7 @@ <translation id="3227137524299004712">ମାଇକ୍ରୋଫୋନ୍</translation> <translation id="3235063766008841141">ଏକ ପ୍ରତାରଣାମୂଳକ ସାଇଟରେ ଲେଖାଯାଇଥିଲା ଏବଂ ଏକ ଡାଟା ଉଲ୍ଲଙ୍ଘନ ସମୟରେ ମିଳିଥିଲା</translation> <translation id="3235242129752692527">ଇଭେଣ୍ଟ ବିବରଣୀ ଏଡିଟ କରି "ସେଭ କରନ୍ତୁ"ରେ ଟାପ କରନ୍ତୁ।</translation> +<translation id="323863549127671026">ବର୍ତ୍ତମାନ ଖୋଲା ଥିବା ଟାବ ଏବଂ ଟାବ ଗ୍ରୁପ</translation> <translation id="3240426699337459095">ଲିଙ୍କ୍ କପି ହୋଇଛି</translation> <translation id="3244271242291266297">ମାସ</translation> <translation id="3245429137663807393">ଯଦି ଆପଣ Chrome ବ୍ୟବହାର ରିପୋର୍ଟଗୁଡ଼ିକ ମଧ୍ୟ ସେୟାର କରନ୍ତି, ତେବେ ସେହି ରିପୋର୍ଟଗୁଡ଼ିକ ଆପଣ ଭିଜିଟ କରିଥିବା URLଗୁଡ଼ିକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରିବ</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 511a88c..405fdc3f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -545,6 +545,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3235063766008841141">Unesen je na obmanjujućem sajtu i pronađen pri upadu u podatke</translation> <translation id="3235242129752692527">Izmenite detalje događaja i dodirnite Sačuvaj.</translation> +<translation id="323863549127671026">Trenutno otvorene kartice i grupe kartica</translation> <translation id="3240426699337459095">Link je kopiran</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">Ako delite i Chrome izveštaje o korišćenju, ti izveštaji obuhvataju URL-ove koje posećujete</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index cf1930a3..fa549f5f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -545,6 +545,7 @@ <translation id="3227137524299004712">Микрофон</translation> <translation id="3235063766008841141">Унесен је на обмањујућем сајту и пронађен при упаду у податке</translation> <translation id="3235242129752692527">Измените детаље догађаја и додирните Сачувај.</translation> +<translation id="323863549127671026">Тренутно отворене картице и групе картица</translation> <translation id="3240426699337459095">Линк је копиран</translation> <translation id="3244271242291266297">ММ</translation> <translation id="3245429137663807393">Ако делите и Chrome извештаје о коришћењу, ти извештаји обухватају URL-ове које посећујете</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index ecccdab0..807d65e0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -18,6 +18,7 @@ <translation id="1054745118061919935">Davom etish orqali siz <ph name="BEGIN_LINK" />xizmat shartlariga<ph name="END_LINK" /> rozilik bildirasiz</translation> <translation id="10614374240317010">Parollar saqlanmaydigan saytlar</translation> <translation id="1062138828266376352">PIN kod oʻzgartirilmadi. Internet aloqasini tekshiring va qayta urining</translation> +<translation id="1063070031224282617">“<ph name="BEGIN_BOLD" /><ph name="FILENAME" /><ph name="END_BOLD" />” (<ph name="FILE_SIZE" />) faylini qayerga saqlashni tanlang</translation> <translation id="1072476005125066234">Qiziqishlaringiz asosidagi sharhlar</translation> <translation id="1074827084851510304">Quyidagilar oʻchiriladi: {password_count} ta parol va hisob maʼlumotlari hech qachon saqlanmasligi tanlangan sayt va ilovalar roʻyxati. Sayt va ilovalarda yaratilgan hisoblar oʻchirilmaydi.</translation> <translation id="1076421457278169141">Kod skanerlandi</translation> @@ -592,6 +593,7 @@ <translation id="3476450923187944815">Parollarni boshqa ilovalarda ishlatish.</translation> <translation id="3488501490964659223">Varaqlar yopiladi va brauzer tarixi tozalanadi. Hisobingizdan chiqasiz</translation> <translation id="3493531032208478708">Bildirgi takliflar haqida <ph name="BEGIN_LINK" />batafsil ma’lumot<ph name="END_LINK" /></translation> +<translation id="349446645805573740">“<ph name="BEGIN_BOLD" /><ph name="FILENAME" /><ph name="END_BOLD" />” faylini qayerga saqlashni tanlang</translation> <translation id="3504377992102007712">Sozlamalar</translation> <translation id="35083190962747987">${url} sahifasini ochish</translation> <translation id="3511519535430890904">Brauzer himoyasini qoʻshish</translation> @@ -691,6 +693,7 @@ <translation id="3922395466317605522">Menyuni sozlash</translation> <translation id="3929457972718048006">Manzillar</translation> <translation id="3931215329146376310">{count,plural, =1{Bu sayt uchun yangi parol}other{Bu sayt uchun yangi parol}}</translation> +<translation id="3934905113567851655">Hajmini oʻzgartirish uchun chimding</translation> <translation id="3940195383040445971">Narxlarni varaqlarda kuzatish</translation> <translation id="3941941395924123592">{COUNT,plural, =1{{COUNT} ta varaqni yopish}other{{COUNT} ta varaqni yopish}}</translation> <translation id="3948600256434252210">Inkognito rejimiga oʻtish uchun oʻngga suring.</translation> @@ -1698,6 +1701,7 @@ <translation id="7925108652071887026">Avtomatik to‘ldiriladigan ma’lumotlar</translation> <translation id="7926975587469166629">Karta nomi</translation> <translation id="7927711904086083099">Tanlanmagan</translation> +<translation id="7927902634113905831">“<ph name="BEGIN_BOLD" /><ph name="FILENAME" /><ph name="END_BOLD" />” (<ph name="FILESIZE" />) faylini saqlash uchun hisobni tanlang</translation> <translation id="7930998711684428189">Parolingiz oshkor etilganda xabar olasiz.</translation> <translation id="7933880123415105005"><ph name="SEARCH_PROVIDER" /> ichidan qidirish</translation> <translation id="7938254975914653459">FaceTime</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb index b171d168..ee2d77b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -545,6 +545,7 @@ <translation id="3227137524299004712">Imakrofoni</translation> <translation id="3235063766008841141">Kufakwe kusayithi elikhohlisayo futhi kwatholakala ekwephulweni kwesivumelwano sedatha</translation> <translation id="3235242129752692527">Hlela imininingwane yomcimbi bese ucindezela okuthi “Londoloza.”</translation> +<translation id="323863549127671026">Okwamanje vula amathebhu namaqembu amathebhu</translation> <translation id="3240426699337459095">Isixhumanisi sikopishiwe</translation> <translation id="3244271242291266297">MM</translation> <translation id="3245429137663807393">Uma futhi wabelana ngemibiko yokusetshenziswa kwe-Chrome, leyo mibiko ihlanganisa nama-URL owavakashelayo</translation>
diff --git a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_coordinator.mm b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_coordinator.mm index 817bfcae..7c4bc9c 100644 --- a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_coordinator.mm +++ b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_coordinator.mm
@@ -110,7 +110,6 @@ // The coordinator for the action sheet to sign out. SignoutActionSheetCoordinator* _signoutActionSheetCoordinator; raw_ptr<syncer::SyncService> _syncService; - SyncEncryptionTableViewController* _syncEncryptionTableViewController; SyncEncryptionPassphraseTableViewController* _syncEncryptionPassphraseTableViewController; raw_ptr<ChromeAccountManagerService> _accountManagerService; @@ -222,8 +221,6 @@ [self stopChildrenAndViewController]; [_syncEncryptionPassphraseTableViewController settingsWillBeDismissed]; _syncEncryptionPassphraseTableViewController = nil; - [_syncEncryptionTableViewController settingsWillBeDismissed]; - _syncEncryptionTableViewController = nil; // Sets to nil the account menu objects. [_mediator disconnect]; @@ -383,6 +380,8 @@ // simultaneous taps. See crbug.com/368310663. return; } + // In case of double tap, close the first view before opening a second one. + [_syncEncryptionPassphraseTableViewController settingsWillBeDismissed]; _syncEncryptionPassphraseTableViewController = [[SyncEncryptionPassphraseTableViewController alloc] initWithBrowser:self.browser]; @@ -398,6 +397,11 @@ } - (void)openTrustedVaultReauthForFetchKeys { + if (_trustedVaultReauthenticationCoordinator) { + // The user double-tapped the button. Don’t open the coordinator a second + // time. + return; + } trusted_vault::SecurityDomainId securityDomainID = trusted_vault::SecurityDomainId::kChromeSync; syncer::TrustedVaultUserActionTriggerForUMA trigger = @@ -417,6 +421,11 @@ } - (void)openTrustedVaultReauthForDegradedRecoverability { + if (_trustedVaultReauthenticationCoordinator) { + // The user double-tapped the button. Don’t open the coordinator a second + // time. + return; + } trusted_vault::SecurityDomainId securityDomainID = trusted_vault::SecurityDomainId::kChromeSync; syncer::TrustedVaultUserActionTriggerForUMA trigger = @@ -440,6 +449,11 @@ } - (void)openPrimaryAccountReauthDialog { + if (_addAccountSigninCoordinator) { + // The user double-tapped the button. Don’t open the coordinator a second + // time. + return; + } signin_metrics::AccessPoint accessPoint = signin_metrics::AccessPoint::kAccountMenu; signin_metrics::PromoAction promoAction =
diff --git a/ios/chrome/browser/authentication/ui_bundled/cells/central_account_view.mm b/ios/chrome/browser/authentication/ui_bundled/cells/central_account_view.mm index 5ca648a..7ffe62e 100644 --- a/ios/chrome/browser/authentication/ui_bundled/cells/central_account_view.mm +++ b/ios/chrome/browser/authentication/ui_bundled/cells/central_account_view.mm
@@ -212,6 +212,8 @@ return self; } +#pragma mark - UIAccessibility + - (NSString*)accessibilityLabel { NSMutableString* accessibilityLabel = [NSMutableString stringWithString:_name];
diff --git a/ios/chrome/browser/authentication/ui_bundled/cells/signin_promo_view.mm b/ios/chrome/browser/authentication/ui_bundled/cells/signin_promo_view.mm index dae4cce0..d97c08fa 100644 --- a/ios/chrome/browser/authentication/ui_bundled/cells/signin_promo_view.mm +++ b/ios/chrome/browser/authentication/ui_bundled/cells/signin_promo_view.mm
@@ -401,7 +401,7 @@ self.primaryButton.configuration = buttonConfiguration; } -#pragma mark - NSObject(Accessibility) +#pragma mark - UIAccessibility - (void)setAccessibilityLabel:(NSString*)accessibilityLabel { NOTREACHED(); @@ -419,6 +419,14 @@ NOTREACHED(); } +- (NSArray<NSString*>*)accessibilityUserInputLabels { + // The name for Voice Control includes only + // `self.primaryButton.titleLabel.text`. + return @[ [self primaryButtonTitle] ]; +} + +#pragma mark - UIAccessibilityAction + - (BOOL)accessibilityActivate { if (!self.primaryButton.enabled) { return NO; @@ -453,12 +461,6 @@ return actions; } -- (NSArray<NSString*>*)accessibilityUserInputLabels { - // The name for Voice Control includes only - // `self.primaryButton.titleLabel.text`. - return @[ [self primaryButtonTitle] ]; -} - #pragma mark - Setters // Sets promo style and updates layout accordingly.
diff --git a/ios/chrome/browser/authentication/ui_bundled/cells/table_view_account_item.mm b/ios/chrome/browser/authentication/ui_bundled/cells/table_view_account_item.mm index d4695f8..4f6e557 100644 --- a/ios/chrome/browser/authentication/ui_bundled/cells/table_view_account_item.mm +++ b/ios/chrome/browser/authentication/ui_bundled/cells/table_view_account_item.mm
@@ -333,7 +333,7 @@ [accessoryImage.tintColor colorWithAlphaComponent:1]; } -#pragma mark - NSObject(Accessibility) +#pragma mark - UIAccessibility - (NSString*)accessibilityLabel { // The accessibilityLabel property may have been set by the owner of this
diff --git a/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_authentication_continuation.mm b/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_authentication_continuation.mm index 84f8c8f..83f8fb0 100644 --- a/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_authentication_continuation.mm +++ b/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_authentication_continuation.mm
@@ -54,7 +54,8 @@ void SigninForContext(WidgetContext* context, NSSet<UIOpenURLContext*>* contexts, AuthenticationService* authentication_service, - SceneState* scene_state) { + SceneState* scene_state, + base::OnceClosure closure) { // Iterate over all identities on device because the newGaia could // be in a different profile. id<SystemIdentity> newIdentity; @@ -69,12 +70,14 @@ } // Don't perform sign-in if the new identity is not found. if (!newIdentity) { + std::move(closure).Run(); return; } authentication_service->SignIn(newIdentity, signin_metrics::AccessPoint::kWidget); scene_state.URLContextsToOpen = contexts; + std::move(closure).Run(); } // Implementation of the continuation that starts the sign-in or sign-out flow. @@ -101,12 +104,18 @@ } } else { if (!authentication_service->HasPrimaryIdentity( - signin::ConsentLevel::kSignin) || - authentication_service - ->GetPrimaryIdentity(signin::ConsentLevel::kSignin) - .gaiaID != context.gaiaID) { - SigninForContext(context, contexts, authentication_service, scene_state); - std::move(closure).Run(); + signin::ConsentLevel::kSignin)) { + SigninForContext(context, contexts, authentication_service, scene_state, + std::move(closure)); + } else if (authentication_service + ->GetPrimaryIdentity(signin::ConsentLevel::kSignin) + .gaiaID != context.gaiaID) { + base::OnceClosure completion = base::BindOnce( + &SigninForContext, context, contexts, authentication_service, + scene_state, std::move(closure)); + authentication_service->SignOut( + signin_metrics::ProfileSignout::kSignoutFromWidgets, + base::CallbackToBlock(std::move(completion))); } else { scene_state.URLContextsToOpen = contexts; std::move(closure).Run();
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_promo_signin_coordinator.mm b/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_promo_signin_coordinator.mm index 7eec5a0..f4a46fd 100644 --- a/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_promo_signin_coordinator.mm +++ b/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_promo_signin_coordinator.mm
@@ -350,6 +350,10 @@ // If `hasAccounts == NO`, the added account will be used to sign in to Chrome // directly after the AddAccountSigninCoordinator finishes. - (void)openAddAccountCoordinatorWithHasAccounts:(BOOL)hasAccounts { + if (self.addAccountCoordinator) { + // This can occur in case of double tap. + return; + } if (hasAccounts) { RecordConsistencyPromoUserAction( signin_metrics::AccountConsistencyPromoAction::ADD_ACCOUNT_STARTED, @@ -360,7 +364,6 @@ ADD_ACCOUNT_STARTED_WITH_NO_DEVICE_ACCOUNT, self.accessPoint); } - DCHECK(!self.addAccountCoordinator); self.addAccountCoordinator = [SigninCoordinator addAccountCoordinatorWithBaseViewController:self.navigationController browser:self.browser
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/cells/bookmark_parent_folder_item.mm b/ios/chrome/browser/bookmarks/ui_bundled/cells/bookmark_parent_folder_item.mm index 3847141..5d74e4cb 100644 --- a/ios/chrome/browser/bookmarks/ui_bundled/cells/bookmark_parent_folder_item.mm +++ b/ios/chrome/browser/bookmarks/ui_bundled/cells/bookmark_parent_folder_item.mm
@@ -140,20 +140,6 @@ self.cloudSlashedView.hidden = YES; } -- (NSString*)accessibilityLabel { - if (!self.cloudSlashedView.hidden) { - return l10n_util::GetNSStringF( - IDS_IOS_BOOKMARKS_FOLDER_NAME_WITH_CLOUD_SLASH_ICON_LABEL, - base::SysNSStringToUTF16(self.parentFolderNameLabel.text)); - } - return self.parentFolderNameLabel.text; -} - -- (NSString*)accessibilityHint { - return l10n_util::GetNSString( - IDS_IOS_BOOKMARK_EDIT_PARENT_FOLDER_BUTTON_HINT); -} - #if !defined(__IPHONE_17_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_17_0 - (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { [super traitCollectionDidChange:previousTraitCollection]; @@ -181,4 +167,20 @@ } } +#pragma mark - UIAccessibility + +- (NSString*)accessibilityLabel { + if (!self.cloudSlashedView.hidden) { + return l10n_util::GetNSStringF( + IDS_IOS_BOOKMARKS_FOLDER_NAME_WITH_CLOUD_SLASH_ICON_LABEL, + base::SysNSStringToUTF16(self.parentFolderNameLabel.text)); + } + return self.parentFolderNameLabel.text; +} + +- (NSString*)accessibilityHint { + return l10n_util::GetNSString( + IDS_IOS_BOOKMARK_EDIT_PARENT_FOLDER_BUTTON_HINT); +} + @end
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/cells/table_view_bookmarks_folder_item.mm b/ios/chrome/browser/bookmarks/ui_bundled/cells/table_view_bookmarks_folder_item.mm index 9a320a33..16ab6bf 100644 --- a/ios/chrome/browser/bookmarks/ui_bundled/cells/table_view_bookmarks_folder_item.mm +++ b/ios/chrome/browser/bookmarks/ui_bundled/cells/table_view_bookmarks_folder_item.mm
@@ -254,7 +254,7 @@ [self stopEdit]; } -#pragma mark Accessibility +#pragma mark - UIAccessibility - (NSString*)accessibilityLabel { if (!self.cloudSlashedView.hidden) {
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/editor/bookmarks_editor_view_controller.mm b/ios/chrome/browser/bookmarks/ui_bundled/editor/bookmarks_editor_view_controller.mm index f3fa29d9..63044591 100644 --- a/ios/chrome/browser/bookmarks/ui_bundled/editor/bookmarks_editor_view_controller.mm +++ b/ios/chrome/browser/bookmarks/ui_bundled/editor/bookmarks_editor_view_controller.mm
@@ -183,7 +183,7 @@ self.navigationController.toolbarHidden = NO; } -#pragma mark - Accessibility +#pragma mark - UIAccessibilityAction - (BOOL)accessibilityPerformEscape { [self cancel];
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/folder_chooser/bookmarks_folder_chooser_view_controller.mm b/ios/chrome/browser/bookmarks/ui_bundled/folder_chooser/bookmarks_folder_chooser_view_controller.mm index 5191824..a89093ec 100644 --- a/ios/chrome/browser/bookmarks/ui_bundled/folder_chooser/bookmarks_folder_chooser_view_controller.mm +++ b/ios/chrome/browser/bookmarks/ui_bundled/folder_chooser/bookmarks_folder_chooser_view_controller.mm
@@ -162,7 +162,7 @@ } } -#pragma mark - Accessibility +#pragma mark - UIAccessibilityAction - (BOOL)accessibilityPerformEscape { [self.delegate bookmarksFolderChooserViewControllerDidCancel:self];
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/folder_editor/bookmarks_folder_editor_view_controller.mm b/ios/chrome/browser/bookmarks/ui_bundled/folder_editor/bookmarks_folder_editor_view_controller.mm index 402f95f..245da4f 100644 --- a/ios/chrome/browser/bookmarks/ui_bundled/folder_editor/bookmarks_folder_editor_view_controller.mm +++ b/ios/chrome/browser/bookmarks/ui_bundled/folder_editor/bookmarks_folder_editor_view_controller.mm
@@ -256,7 +256,7 @@ } } -#pragma mark - Accessibility +#pragma mark - UIAccessibilityAction - (BOOL)accessibilityPerformEscape { [self dismiss];
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_view_controller.mm b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_view_controller.mm index a716fca..936c093 100644 --- a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_view_controller.mm +++ b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_view_controller.mm
@@ -1389,7 +1389,7 @@ // No-op } -#pragma mark - Accessibility +#pragma mark - UIAccessibilityAction - (BOOL)accessibilityPerformEscape { if ([self isDisplayingBookmarkRoot]) {
diff --git a/ios/chrome/browser/bring_android_tabs/ui_bundled/tab_list_from_android_table_view_item.mm b/ios/chrome/browser/bring_android_tabs/ui_bundled/tab_list_from_android_table_view_item.mm index d827568..78233fa 100644 --- a/ios/chrome/browser/bring_android_tabs/ui_bundled/tab_list_from_android_table_view_item.mm +++ b/ios/chrome/browser/bring_android_tabs/ui_bundled/tab_list_from_android_table_view_item.mm
@@ -95,7 +95,7 @@ [self createSubviews]; } -#pragma mark - Accessors +#pragma mark - UIAccessibility - (NSString*)accessibilityLabel { NSString* accessibilityLabel = self.titleLabel.text; @@ -112,6 +112,8 @@ return userInputLabels; } +#pragma mark - UIAccessibilityIdentification + - (NSString*)accessibilityIdentifier { return self.titleLabel.text; }
diff --git a/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm b/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm index 5257141..52254d1ee 100644 --- a/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm +++ b/ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.mm
@@ -818,7 +818,7 @@ _bookmarksCoordinator = nil; } -#pragma mark - NSObject +#pragma mark - UIAccessibilityAction - (BOOL)accessibilityPerformEscape { [self dismissPopups];
diff --git a/ios/chrome/browser/bubble/ui_bundled/bubble_view.mm b/ios/chrome/browser/bubble/ui_bundled/bubble_view.mm index 6f176576..861885c 100644 --- a/ios/chrome/browser/bubble/ui_bundled/bubble_view.mm +++ b/ios/chrome/browser/bubble/ui_bundled/bubble_view.mm
@@ -466,6 +466,8 @@ [self updateArrowAlignmentConstraint]; } +#pragma mark - UIAccessibility + - (NSString*)accessibilityLabel { return self.titleLabel.text; } @@ -474,6 +476,8 @@ return self.label.text; } +#pragma mark - UIAccessibilityAction + - (NSArray<UIAccessibilityCustomAction*>*)accessibilityCustomActions { NSMutableArray<UIAccessibilityCustomAction*>* accessibilityCustomActions = [NSMutableArray array];
diff --git a/ios/chrome/browser/commerce/ui_bundled/price_card/price_card_view.mm b/ios/chrome/browser/commerce/ui_bundled/price_card/price_card_view.mm index a29af721..9f40c5d 100644 --- a/ios/chrome/browser/commerce/ui_bundled/price_card/price_card_view.mm +++ b/ios/chrome/browser/commerce/ui_bundled/price_card/price_card_view.mm
@@ -104,6 +104,8 @@ self.hidden = FALSE; } +#pragma mark - UIAccessibility + - (BOOL)isAccessibilityElement { return YES; }
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/cells/icon_detail_view.mm b/ios/chrome/browser/content_suggestions/ui_bundled/cells/icon_detail_view.mm index 37abdbe..120575e 100644 --- a/ios/chrome/browser/content_suggestions/ui_bundled/cells/icon_detail_view.mm +++ b/ios/chrome/browser/content_suggestions/ui_bundled/cells/icon_detail_view.mm
@@ -473,6 +473,8 @@ [self createSubviews]; } +#pragma mark - UIAccessibility + - (NSString*)accessibilityLabel { return [NSString stringWithFormat:@"%@, %@", _title, _description]; }
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/set_up_list/set_up_list_item_view.mm b/ios/chrome/browser/content_suggestions/ui_bundled/set_up_list/set_up_list_item_view.mm index b3d42b41..fb28c034 100644 --- a/ios/chrome/browser/content_suggestions/ui_bundled/set_up_list/set_up_list_item_view.mm +++ b/ios/chrome/browser/content_suggestions/ui_bundled/set_up_list/set_up_list_item_view.mm
@@ -144,6 +144,8 @@ [self createSubviews]; } +#pragma mark - UIAccessibility + - (NSString*)accessibilityLabel { return [NSString stringWithFormat:@"%@, %@", [self titleText], [self descriptionText]];
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/set_up_list/set_up_list_show_more_item_view.mm b/ios/chrome/browser/content_suggestions/ui_bundled/set_up_list/set_up_list_show_more_item_view.mm index 9720146..e066132 100644 --- a/ios/chrome/browser/content_suggestions/ui_bundled/set_up_list/set_up_list_show_more_item_view.mm +++ b/ios/chrome/browser/content_suggestions/ui_bundled/set_up_list/set_up_list_show_more_item_view.mm
@@ -280,7 +280,7 @@ #endif -#pragma mark - UIAccessibility +#pragma mark - UIAccessibilityAction - (BOOL)accessibilityActivate { if (_data.complete) {
diff --git a/ios/chrome/browser/contextual_panel/ui/contextual_sheet_view_controller.mm b/ios/chrome/browser/contextual_panel/ui/contextual_sheet_view_controller.mm index 5162660..e0724227 100644 --- a/ios/chrome/browser/contextual_panel/ui/contextual_sheet_view_controller.mm +++ b/ios/chrome/browser/contextual_panel/ui/contextual_sheet_view_controller.mm
@@ -132,11 +132,6 @@ } #endif -- (BOOL)accessibilityPerformEscape { - [self closeSheet]; - return YES; -} - // Returns the calculated detent of the medium height sheet. If the content // height is less than the default medium detent, use that instead of the // default. @@ -262,6 +257,13 @@ [self.contextualSheetHandler closeContextualSheet]; } +#pragma mark - UIAccessibilityAction + +- (BOOL)accessibilityPerformEscape { + [self closeSheet]; + return YES; +} + #pragma mark - ContextualSheetDisplayController - (void)setContentHeight:(CGFloat)height {
diff --git a/ios/chrome/browser/first_run/ui_bundled/best_features/ui/best_features_cell.mm b/ios/chrome/browser/first_run/ui_bundled/best_features/ui/best_features_cell.mm index b32653c..cca9872 100644 --- a/ios/chrome/browser/first_run/ui_bundled/best_features/ui/best_features_cell.mm +++ b/ios/chrome/browser/first_run/ui_bundled/best_features/ui/best_features_cell.mm
@@ -151,7 +151,7 @@ _iconBackgroundView.backgroundColor = nil; } -#pragma mark - Private +#pragma mark - UIAccessibility - (NSString*)accessibilityLabel { return self.textLabel.text;
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 4868108..0f5d392 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -143,6 +143,29 @@ {"5000", signin::kWaitThresholdMillisecondsForCapabilitiesApi, "5000"}, }; +const FeatureEntry::FeatureParam + kNTPMIAEntrypointOmniboxContainedSingleButton[] = { + {kNTPMIAEntrypointParam, + kNTPMIAEntrypointParamOmniboxContainedSingleButton}}; +const FeatureEntry::FeatureParam kNTPMIAEntrypointOmniboxContainedInline[] = { + {kNTPMIAEntrypointParam, kNTPMIAEntrypointParamOmniboxContainedInline}}; +const FeatureEntry::FeatureParam + kNTPMIAEntrypointOmniboxContainedEnlargedFakebox[] = { + {kNTPMIAEntrypointParam, + kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox}}; + +const FeatureEntry::FeatureVariation kNTPMIAEntrypointVariations[] = { + {"A: Contained in Omnibox, single button", + kNTPMIAEntrypointOmniboxContainedSingleButton, + std::size(kNTPMIAEntrypointOmniboxContainedSingleButton), nullptr}, + {"B: Contained in Omnibox, inline with Voice and Lens", + kNTPMIAEntrypointOmniboxContainedInline, + std::size(kNTPMIAEntrypointOmniboxContainedInline), nullptr}, + {"C: Contained in Omnibox, enlarged fakebox", + kNTPMIAEntrypointOmniboxContainedEnlargedFakebox, + std::size(kNTPMIAEntrypointOmniboxContainedEnlargedFakebox), nullptr}, +}; + const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches3[] = { {OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "3"}}; const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches4[] = { @@ -2540,6 +2563,11 @@ flag_descriptions::kNotificationCollisionManagementName, flag_descriptions::kNotificationCollisionManagementDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kNotificationCollisionManagement)}, + {"ntp-mia-entrypoint", flag_descriptions::kNTPMIAEntrypointName, + flag_descriptions::kNTPMIAEntrypointDescription, flags_ui::kOsIos, + FEATURE_WITH_PARAMS_VALUE_TYPE(kNTPMIAEntrypoint, + kNTPMIAEntrypointVariations, + "kNTPMIAEntrypoint")}, {"ios-one-tap-mini-map-remove-section-breaks", flag_descriptions::kIOSOneTapMiniMapRemoveSectionBreaksName, flag_descriptions::kIOSOneTapMiniMapRemoveSectionBreaksDescription,
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index af13f81..c065b3c6 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -768,6 +768,10 @@ const char kNotificationCollisionManagementDescription[] = "Enables delays to notifications to space them out more"; +const char kNTPMIAEntrypointName[] = "Entrypoint for MIA in the new tab page"; +const char kNTPMIAEntrypointDescription[] = + "Selects which variant of the MIA entrypoint is used in the new tab page"; + const char kIOSSharedHighlightingColorChangeName[] = "IOS Shared Highlighting color change"; const char kIOSSharedHighlightingColorChangeDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 2010a52..d71a72f 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -440,6 +440,9 @@ extern const char kNotificationCollisionManagementName[]; extern const char kNotificationCollisionManagementDescription[]; +extern const char kNTPMIAEntrypointName[]; +extern const char kNTPMIAEntrypointDescription[]; + extern const char kIOSSharedHighlightingColorChangeName[]; extern const char kIOSSharedHighlightingColorChangeDescription[];
diff --git a/ios/chrome/browser/fullscreen/ui_bundled/fullscreen_egtest.mm b/ios/chrome/browser/fullscreen/ui_bundled/fullscreen_egtest.mm index c58fcee..66827c55 100644 --- a/ios/chrome/browser/fullscreen/ui_bundled/fullscreen_egtest.mm +++ b/ios/chrome/browser/fullscreen/ui_bundled/fullscreen_egtest.mm
@@ -63,9 +63,16 @@ } // A PDF itself can take a little longer to appear even after the page is -// loaded. Instead, do an additional wait for the internal PDF class to appear +// loaded. Instead, do an additional wait for the internal PDF class to appear // in the view hierarchy. void WaitforPDFExtensionView() { + // TODO(crbug.com/424744794): Code below was added as a speculative fix. That + // code is now skipped on iOS26, consider adding a long term fix in case + // tests become flaky without that logic. + if (@available(iOS 26, *)) { + [ChromeEarlGrey waitForPageToFinishLoading]; + return; + } ConditionBlock condition = ^{ NSError* error = nil; [[EarlGrey selectElementWithMatcher:grey_kindOfClass(NSClassFromString(
diff --git a/ios/chrome/browser/fullscreen/ui_bundled/fullscreen_model.mm b/ios/chrome/browser/fullscreen/ui_bundled/fullscreen_model.mm index 14e1c22..e19baf0 100644 --- a/ios/chrome/browser/fullscreen/ui_bundled/fullscreen_model.mm +++ b/ios/chrome/browser/fullscreen/ui_bundled/fullscreen_model.mm
@@ -630,6 +630,11 @@ bool FullscreenModel::ScrollThresholdExceeded() const { if (web::features::IsFullscreenScrollThresholdEnabled()) { + // When scrolled to the very top, the threshold should be ignored so that + // fullscreen can be smoothly exited. + if (y_content_offset_ <= 0.0) { + return true; + } return std::abs(y_content_offset_ - offset_at_start_of_drag_) > scroll_threshold_; }
diff --git a/ios/chrome/browser/history/ui_bundled/base_history_view_controller.mm b/ios/chrome/browser/history/ui_bundled/base_history_view_controller.mm index 7a81884..76c6bba 100644 --- a/ios/chrome/browser/history/ui_bundled/base_history_view_controller.mm +++ b/ios/chrome/browser/history/ui_bundled/base_history_view_controller.mm
@@ -978,7 +978,7 @@ }]; } -#pragma mark - Accessibility +#pragma mark - UIAccessibilityAction - (BOOL)accessibilityPerformEscape { [self.delegate dismissViewController:self];
diff --git a/ios/chrome/browser/incognito_reauth/ui_bundled/incognito_reauth_view.mm b/ios/chrome/browser/incognito_reauth/ui_bundled/incognito_reauth_view.mm index c9b34e8..400823d 100644 --- a/ios/chrome/browser/incognito_reauth/ui_bundled/incognito_reauth_view.mm +++ b/ios/chrome/browser/incognito_reauth/ui_bundled/incognito_reauth_view.mm
@@ -190,12 +190,14 @@ self.authenticateButton.accessibilityLabel = accessibilityLabel; } -#pragma mark - voiceover +#pragma mark - UIAccessibility - (BOOL)accessibilityViewIsModal { return YES; } +#pragma mark - UIAccessibilityAction + - (BOOL)accessibilityPerformMagicTap { [self.authenticateButton sendActionsForControlEvents:UIControlEventTouchUpInside];
diff --git a/ios/chrome/browser/infobars/ui_bundled/banners/infobar_banner_view_controller.mm b/ios/chrome/browser/infobars/ui_bundled/banners/infobar_banner_view_controller.mm index f9bbc7a..16e6c3d 100644 --- a/ios/chrome/browser/infobars/ui_bundled/banners/infobar_banner_view_controller.mm +++ b/ios/chrome/browser/infobars/ui_bundled/banners/infobar_banner_view_controller.mm
@@ -769,6 +769,8 @@ return NO; } +#pragma mark - UIAccessibility + - (NSString*)accessibilityLabel { if ([self.bannerAccessibilityLabel length]) { return self.bannerAccessibilityLabel;
diff --git a/ios/chrome/browser/intelligence/bwg/metrics/bwg_metrics.h b/ios/chrome/browser/intelligence/bwg/metrics/bwg_metrics.h index 92a4d18d..aebcc9c 100644 --- a/ios/chrome/browser/intelligence/bwg/metrics/bwg_metrics.h +++ b/ios/chrome/browser/intelligence/bwg/metrics/bwg_metrics.h
@@ -5,6 +5,7 @@ #ifndef IOS_CHROME_BROWSER_INTELLIGENCE_BWG_METRICS_BWG_METRICS_H_ #define IOS_CHROME_BROWSER_INTELLIGENCE_BWG_METRICS_BWG_METRICS_H_ -// No-op. +// UMA histogram key for IOS.BWG.Eligibility +extern const char kEligibilityHistogram[]; #endif // IOS_CHROME_BROWSER_INTELLIGENCE_BWG_METRICS_BWG_METRICS_H_
diff --git a/ios/chrome/browser/intelligence/bwg/metrics/bwg_metrics.mm b/ios/chrome/browser/intelligence/bwg/metrics/bwg_metrics.mm index 2b3ead9..dd149ae9 100644 --- a/ios/chrome/browser/intelligence/bwg/metrics/bwg_metrics.mm +++ b/ios/chrome/browser/intelligence/bwg/metrics/bwg_metrics.mm
@@ -3,3 +3,5 @@ // found in the LICENSE file. #import "ios/chrome/browser/intelligence/bwg/metrics/bwg_metrics.h" + +const char kEligibilityHistogram[] = "IOS.BWG.Eligibility";
diff --git a/ios/chrome/browser/intelligence/bwg/model/BUILD.gn b/ios/chrome/browser/intelligence/bwg/model/BUILD.gn index d437ff79..ad661bb9 100644 --- a/ios/chrome/browser/intelligence/bwg/model/BUILD.gn +++ b/ios/chrome/browser/intelligence/bwg/model/BUILD.gn
@@ -10,6 +10,7 @@ deps = [ "//components/keyed_service/core", "//components/signin/public/identity_manager", + "//ios/chrome/browser/intelligence/bwg/metrics", "//ios/chrome/browser/signin/model:authentication_service", "//ios/chrome/browser/signin/model:authentication_service_factory", "//ios/public/provider/chrome/browser/bwg:bwg_api", @@ -35,3 +36,29 @@ "//ios/public/provider/chrome/browser/bwg:bwg_api", ] } + +source_set("unit_tests") { + testonly = true + sources = [ "bwg_service_unittest.mm" ] + deps = [ + ":model", + "//base/test:test_support", + "//components/signin/public/identity_manager:test_support", + "//components/sync/base", + "//components/sync/service", + "//components/sync_preferences", + "//components/sync_preferences:test_support", + "//ios/chrome/browser/intelligence/bwg/metrics", + "//ios/chrome/browser/shared/model/application_context:application_context", + "//ios/chrome/browser/shared/model/profile", + "//ios/chrome/browser/shared/model/profile/test", + "//ios/chrome/browser/signin/model", + "//ios/chrome/browser/signin/model:authentication_service", + "//ios/chrome/browser/signin/model:authentication_service_factory", + "//ios/chrome/browser/signin/model:test_support", + "//ios/chrome/test:test_support", + "//ios/public/provider/chrome/browser/bwg:bwg_api", + "//ios/web/public/test", + "//testing/gtest", + ] +}
diff --git a/ios/chrome/browser/intelligence/bwg/model/bwg_service.mm b/ios/chrome/browser/intelligence/bwg/model/bwg_service.mm index f9f2ed1..dece3b6 100644 --- a/ios/chrome/browser/intelligence/bwg/model/bwg_service.mm +++ b/ios/chrome/browser/intelligence/bwg/model/bwg_service.mm
@@ -6,7 +6,9 @@ #import <memory> +#import "base/metrics/histogram_functions.h" #import "components/signin/public/identity_manager/identity_manager.h" +#import "ios/chrome/browser/intelligence/bwg/metrics/bwg_metrics.h" #import "ios/chrome/browser/signin/model/authentication_service.h" #import "ios/public/provider/chrome/browser/bwg/bwg_api.h" @@ -34,6 +36,10 @@ signin::ConsentLevel::kSignin)) .capabilities; - return capabilities.can_use_model_execution_features() == - signin::Tribool::kTrue; + bool is_eligible = + capabilities.can_use_model_execution_features() == signin::Tribool::kTrue; + + base::UmaHistogramBoolean(kEligibilityHistogram, is_eligible); + + return is_eligible; }
diff --git a/ios/chrome/browser/intelligence/bwg/model/bwg_service_unittest.mm b/ios/chrome/browser/intelligence/bwg/model/bwg_service_unittest.mm new file mode 100644 index 0000000..04f4002 --- /dev/null +++ b/ios/chrome/browser/intelligence/bwg/model/bwg_service_unittest.mm
@@ -0,0 +1,104 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/intelligence/bwg/model/bwg_service.h" + +#import <memory> + +#import "base/test/metrics/histogram_tester.h" +#import "components/signin/public/identity_manager/account_capabilities_test_mutator.h" +#import "components/signin/public/identity_manager/identity_test_environment.h" +#import "ios/chrome/browser/intelligence/bwg/metrics/bwg_metrics.h" +#import "ios/chrome/browser/shared/model/application_context/application_context.h" +#import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h" +#import "ios/chrome/browser/signin/model/authentication_service.h" +#import "ios/chrome/browser/signin/model/authentication_service_factory.h" +#import "ios/chrome/browser/signin/model/chrome_account_manager_service_factory.h" +#import "ios/chrome/browser/signin/model/fake_authentication_service_delegate.h" +#import "ios/chrome/browser/signin/model/identity_test_environment_browser_state_adaptor.h" +#import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" +#import "ios/public/provider/chrome/browser/bwg/bwg_api.h" +#import "ios/web/public/test/web_task_environment.h" +#import "testing/gtest/include/gtest/gtest.h" +#import "testing/platform_test.h" + +class BwgServiceTest : public PlatformTest { + protected: + void SetUp() override { + PlatformTest::SetUp(); + + TestProfileIOS::Builder builder; + builder.AddTestingFactory( + AuthenticationServiceFactory::GetInstance(), + AuthenticationServiceFactory::GetFactoryWithDelegate( + std::make_unique<FakeAuthenticationServiceDelegate>())); + profile_ = std::move(builder).Build(); + + auth_service_ = AuthenticationServiceFactory::GetForProfile(profile_.get()); + identity_manager_ = identity_test_env_.identity_manager(); + bwg_service_ = + std::make_unique<BwgService>(auth_service_, identity_manager_); + } + + // Signs in a user and sets their model execution capability. + void SignInAndSetCapability(bool capability) { + const std::string email = "test@example.com"; + + AccountInfo account_info = identity_test_env_.MakePrimaryAccountAvailable( + email, signin::ConsentLevel::kSignin); + + AccountCapabilitiesTestMutator mutator(&account_info.capabilities); + mutator.set_can_use_model_execution_features(capability); + + identity_test_env_.UpdateAccountInfoForAccount(account_info); + } + + // Environment objects are declared first, so they are destroyed last. + IOSChromeScopedTestingLocalState scoped_testing_local_state_; + web::WebTaskEnvironment task_environment_; + signin::IdentityTestEnvironment identity_test_env_; + + // Profile and services that depend on the environment are declared next. + std::unique_ptr<TestProfileIOS> profile_; + std::unique_ptr<BwgService> bwg_service_; + raw_ptr<AuthenticationService> auth_service_; + raw_ptr<signin::IdentityManager> identity_manager_; + + base::HistogramTester histogram_tester_; +}; + +// Tests that a user is considered eligible if they are signed in and their +// account has the `can_use_model_execution_features` capability. +TEST_F(BwgServiceTest, IsEligibleForBWG_WhenUserIsEligible) { + SignInAndSetCapability(true); + + EXPECT_TRUE(bwg_service_->IsEligibleForBWG()); + histogram_tester_.ExpectUniqueSample(kEligibilityHistogram, + /*sample=*/true, + /*expected_count=*/1); +} + +// Tests that a user is ineligible if they are signed in but their account +// capability is explicitly false. +TEST_F(BwgServiceTest, IsEligibleForBWG_IneligibleByCapability) { + SignInAndSetCapability(false); + + EXPECT_FALSE(bwg_service_->IsEligibleForBWG()); + histogram_tester_.ExpectUniqueSample(kEligibilityHistogram, + /*sample=*/false, + /*expected_count=*/1); +} + +// Tests that a user is ineligible if they are not signed in to a primary +// account. +TEST_F(BwgServiceTest, IsEligibleForBWG_IneligibleWhenSignedOut) { + // The default state is signed out. + EXPECT_FALSE( + identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin)); + + EXPECT_FALSE(bwg_service_->IsEligibleForBWG()); + histogram_tester_.ExpectUniqueSample(kEligibilityHistogram, + /*sample=*/false, + /*expected_count=*/1); +}
diff --git a/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.mm b/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.mm index 1382949..4ba0f5e 100644 --- a/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.mm +++ b/ios/chrome/browser/lens_overlay/ui/lens_overlay_container_view_controller.mm
@@ -390,7 +390,7 @@ [self.delegate lensOverlayContainerDidChangeSizeClass:self]; } -#pragma mark - Accessibility +#pragma mark - UIAccessibilityAction - (BOOL)accessibilityPerformEscape { [self closeOverlayRequested];
diff --git a/ios/chrome/browser/lens_overlay/ui/lens_overlay_progress_bar.mm b/ios/chrome/browser/lens_overlay/ui/lens_overlay_progress_bar.mm index 294ce5c1..cbddb2e 100644 --- a/ios/chrome/browser/lens_overlay/ui/lens_overlay_progress_bar.mm +++ b/ios/chrome/browser/lens_overlay/ui/lens_overlay_progress_bar.mm
@@ -19,11 +19,6 @@ @implementation LensOverlayProgressBar -- (NSString*)accessibilityValue { - return l10n_util::GetNSStringF(IDS_IOS_PROGRESS_BAR_ACCESSIBILITY, - [super accessibilityValue].cr_UTF16String); -} - - (void)setHidden:(BOOL)hidden animated:(BOOL)animated completion:(void (^)(BOOL finished))userCompletion { @@ -49,4 +44,12 @@ } }]; } + +#pragma mark - UIAccessibility + +- (NSString*)accessibilityValue { + return l10n_util::GetNSStringF(IDS_IOS_PROGRESS_BAR_ACCESSIBILITY, + [super accessibilityValue].cr_UTF16String); +} + @end
diff --git a/ios/chrome/browser/location_bar/ui_bundled/badges_container_view.mm b/ios/chrome/browser/location_bar/ui_bundled/badges_container_view.mm index 6d63da6..6d870d0 100644 --- a/ios/chrome/browser/location_bar/ui_bundled/badges_container_view.mm +++ b/ios/chrome/browser/location_bar/ui_bundled/badges_container_view.mm
@@ -34,6 +34,8 @@ return self; } +#pragma mark - UIAccessibilityContainer + - (NSArray*)accessibilityElements { NSMutableArray* accessibleElements = [[NSMutableArray alloc] init];
diff --git a/ios/chrome/browser/mini_map/model/mini_map_service_unittest.mm b/ios/chrome/browser/mini_map/model/mini_map_service_unittest.mm index d19d1a1..c5d3cd6 100644 --- a/ios/chrome/browser/mini_map/model/mini_map_service_unittest.mm +++ b/ios/chrome/browser/mini_map/model/mini_map_service_unittest.mm
@@ -19,6 +19,7 @@ #import "ios/web/public/test/web_task_environment.h" #import "testing/platform_test.h" #import "third_party/ocmock/OCMock/OCMock.h" +#import "third_party/ocmock/gtest_support.h" class MiniMapServiceTest : public PlatformTest { public: @@ -40,6 +41,7 @@ } void TearDown() override { + EXPECT_OCMOCK_VERIFY(application_); [application_ stopMocking]; PlatformTest::TearDown(); }
diff --git a/ios/chrome/browser/ntp/ui_bundled/BUILD.gn b/ios/chrome/browser/ntp/ui_bundled/BUILD.gn index 334cfbd..9eb4b52 100644 --- a/ios/chrome/browser/ntp/ui_bundled/BUILD.gn +++ b/ios/chrome/browser/ntp/ui_bundled/BUILD.gn
@@ -422,6 +422,7 @@ "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/prefs:pref_names", "//ios/chrome/browser/shared/public/features", + "//ui/base", ] public_deps = [ "//base" ] }
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.h b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.h index 61b48f0..d0c13b5 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.h +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.h
@@ -17,6 +17,20 @@ kAnimated, }; +// Represents the possible onboarding treatments of Lens Overlay. +enum class NTPMIAEntrypointVariation { + // The default experience. + kDisabled = 0, + // The entrypoint is shown in the omnibox as a single button. + kOmniboxContainedSingleButton = 1, + // The entrypoint is shown in the omnibox as a button inline with Lens and + // Voice. + kOmniboxContainedInline = 2, + // The entrypoint is shown inside the enlarged fake omnibox. + kOmniboxContainedEnlargedFakebox = 3, + kMaxValue = kOmniboxContainedEnlargedFakebox, +}; + #pragma mark - Feature declarations // Feature flag to enable static resource serving for the Discover feed. @@ -138,6 +152,9 @@ // Returns the enabled variation of feature kFeedSwipeInProductHelp. FeedSwipeIPHVariation GetFeedSwipeIPHVariation(); +// Returns the enabled variation of feature kNTPMIAEntrypoint; +NTPMIAEntrypointVariation GetNTPMIAEntrypointVariation(); + // YES if the feed visibility is handled by the eligibility service instead of // the new tab page mediator. bool UseFeedEligibilityService();
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.mm index 641adbe..417194d8 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.mm
@@ -12,6 +12,7 @@ #import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/prefs/pref_names.h" #import "ios/chrome/browser/shared/public/features/features.h" +#import "ui/base/device_form_factor.h" #pragma mark - Constants @@ -130,6 +131,11 @@ } bool ShouldEnlargeLogoAndFakebox() { + if (GetNTPMIAEntrypointVariation() == + NTPMIAEntrypointVariation::kOmniboxContainedEnlargedFakebox) { + return YES; + } + return ShouldDeprecateFeedHeader() && base::GetFieldTrialParamByFeatureAsBool( kDeprecateFeedHeader, @@ -168,3 +174,25 @@ bool UseFeedEligibilityService() { return base::FeatureList::IsEnabled(kUseFeedEligibilityService); } + +NTPMIAEntrypointVariation GetNTPMIAEntrypointVariation() { + // MIA entry point is currently enabled only for phone form factor. + bool phone_form_factor = + ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_PHONE; + if (!phone_form_factor) { + return NTPMIAEntrypointVariation::kDisabled; + } + + std::string feature_param = base::GetFieldTrialParamValueByFeature( + kNTPMIAEntrypoint, kNTPMIAEntrypointParam); + if (feature_param == kNTPMIAEntrypointParamOmniboxContainedSingleButton) { + return NTPMIAEntrypointVariation::kOmniboxContainedSingleButton; + } else if (feature_param == kNTPMIAEntrypointParamOmniboxContainedInline) { + return NTPMIAEntrypointVariation::kOmniboxContainedInline; + } else if (feature_param == + kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox) { + return NTPMIAEntrypointVariation::kOmniboxContainedEnlargedFakebox; + } else { + return NTPMIAEntrypointVariation::kDisabled; + } +}
diff --git a/ios/chrome/browser/omnibox/ui/popup/carousel/omnibox_popup_carousel_cell.mm b/ios/chrome/browser/omnibox/ui/popup/carousel/omnibox_popup_carousel_cell.mm index 55a3ce2b..84388d0 100644 --- a/ios/chrome/browser/omnibox/ui/popup/carousel/omnibox_popup_carousel_cell.mm +++ b/ios/chrome/browser/omnibox/ui/popup/carousel/omnibox_popup_carousel_cell.mm
@@ -135,7 +135,7 @@ return self.suggestionsStackView.arrangedSubviews.count; } -#pragma mark - Accessibility +#pragma mark - UIAccessibilityContainer - (NSArray*)accessibilityElements { return self.suggestionsStackView.arrangedSubviews;
diff --git a/ios/chrome/browser/omnibox/ui/popup/carousel/omnibox_popup_carousel_control.mm b/ios/chrome/browser/omnibox/ui/popup/carousel/omnibox_popup_carousel_control.mm index a741441..0e90493 100644 --- a/ios/chrome/browser/omnibox/ui/popup/carousel/omnibox_popup_carousel_control.mm +++ b/ios/chrome/browser/omnibox/ui/popup/carousel/omnibox_popup_carousel_control.mm
@@ -237,7 +237,7 @@ parameters:previewParameters]; } -#pragma mark - UIAccessibility +#pragma mark - UIAccessibilityFocus - (void)accessibilityElementDidBecomeFocused { // Element is focused by VoiceOver, informs its delegate so it can make it @@ -245,10 +245,14 @@ [self.delegate carouselControlDidBecomeFocused:self]; } +#pragma mark - UIAccessibility + - (UIAccessibilityTraits)accessibilityTraits { return UIAccessibilityTraitButton | [super accessibilityTraits]; } +#pragma mark - UIAccessibilityAction + /// Custom actions for a cell configured with this item. - (NSArray<UIAccessibilityCustomAction*>*)accessibilityCustomActions { return
diff --git a/ios/chrome/browser/omnibox/ui/popup/row/actions/omnibox_popup_actions_row_content_view.mm b/ios/chrome/browser/omnibox/ui/popup/row/actions/omnibox_popup_actions_row_content_view.mm index d1820c1..8fe8fb0 100644 --- a/ios/chrome/browser/omnibox/ui/popup/row/actions/omnibox_popup_actions_row_content_view.mm +++ b/ios/chrome/browser/omnibox/ui/popup/row/actions/omnibox_popup_actions_row_content_view.mm
@@ -288,6 +288,8 @@ _secondaryLabelTruncating.textAlignment = forcedTextAlignment; } +#pragma mark - UIAccessibility + - (NSString*)accessibilityLabel { return _primaryLabel.attributedText.string; }
diff --git a/ios/chrome/browser/omnibox/ui/popup/row/omnibox_popup_row_content_view.mm b/ios/chrome/browser/omnibox/ui/popup/row/omnibox_popup_row_content_view.mm index 362fbc07..91d867a4 100644 --- a/ios/chrome/browser/omnibox/ui/popup/row/omnibox_popup_row_content_view.mm +++ b/ios/chrome/browser/omnibox/ui/popup/row/omnibox_popup_row_content_view.mm
@@ -329,6 +329,8 @@ _secondaryLabelTruncating.textAlignment = forcedTextAlignment; } +#pragma mark - UIAccessibility + - (NSString*)accessibilityLabel { return _primaryLabel.attributedText.string; }
diff --git a/ios/chrome/browser/popup_menu/ui_bundled/cells/popup_menu_text_item.mm b/ios/chrome/browser/popup_menu/ui_bundled/cells/popup_menu_text_item.mm index a5a7f856..d8ce18c 100644 --- a/ios/chrome/browser/popup_menu/ui_bundled/cells/popup_menu_text_item.mm +++ b/ios/chrome/browser/popup_menu/ui_bundled/cells/popup_menu_text_item.mm
@@ -188,7 +188,7 @@ self.accessibilityTraits &= ~UIAccessibilityTraitNotEnabled; } -#pragma mark - Accessibility +#pragma mark - UIAccessibility - (NSString*)accessibilityLabel { return self.messageAttributedString.string;
diff --git a/ios/chrome/browser/popup_menu/ui_bundled/cells/popup_menu_tools_item.mm b/ios/chrome/browser/popup_menu/ui_bundled/cells/popup_menu_tools_item.mm index 0dc50a5e..ed27d4b 100644 --- a/ios/chrome/browser/popup_menu/ui_bundled/cells/popup_menu_tools_item.mm +++ b/ios/chrome/browser/popup_menu/ui_bundled/cells/popup_menu_tools_item.mm
@@ -305,7 +305,7 @@ } } -#pragma mark - Accessibility +#pragma mark - UIAccessibility - (NSString*)accessibilityLabel { if (self.additionalAccessibilityLabel) {
diff --git a/ios/chrome/browser/reading_list/ui_bundled/reading_list_table_view_controller.mm b/ios/chrome/browser/reading_list/ui_bundled/reading_list_table_view_controller.mm index d3e6042..ec98f08 100644 --- a/ios/chrome/browser/reading_list/ui_bundled/reading_list_table_view_controller.mm +++ b/ios/chrome/browser/reading_list/ui_bundled/reading_list_table_view_controller.mm
@@ -1167,7 +1167,7 @@ [self setEditing:NO animated:animated]; } -#pragma mark - Accessibility +#pragma mark - UIAccessibilityAction - (BOOL)accessibilityPerformEscape { if (!self.delegate.canDismiss) {
diff --git a/ios/chrome/browser/recent_tabs/ui_bundled/recent_tabs_table_view_controller.mm b/ios/chrome/browser/recent_tabs/ui_bundled/recent_tabs_table_view_controller.mm index daa5bb2b..6e4a91c 100644 --- a/ios/chrome/browser/recent_tabs/ui_bundled/recent_tabs_table_view_controller.mm +++ b/ios/chrome/browser/recent_tabs/ui_bundled/recent_tabs_table_view_controller.mm
@@ -1876,7 +1876,7 @@ [self.presentationDelegate showActiveRegularTabFromRecentTabs]; } -#pragma mark - Accessibility +#pragma mark - UIAccessibilityAction - (BOOL)accessibilityPerformEscape { [self.presentationDelegate showActiveRegularTabFromRecentTabs];
diff --git a/ios/chrome/browser/search_engine_choice/ui_bundled/snippet_search_engine_button.mm b/ios/chrome/browser/search_engine_choice/ui_bundled/snippet_search_engine_button.mm index 39d2b5eb..5749ddf 100644 --- a/ios/chrome/browser/search_engine_choice/ui_bundled/snippet_search_engine_button.mm +++ b/ios/chrome/browser/search_engine_choice/ui_bundled/snippet_search_engine_button.mm
@@ -497,7 +497,26 @@ _radioButtonImageView.image = circleImage; } -#pragma mark - Accessibility +- (void)updateChevronIdentifier { + switch (_snippetButtonState) { + case SnippetButtonState::kOneLine: + _chevronButton.accessibilityIdentifier = [NSString + stringWithFormat:@"%@%@", + kSnippetSearchEngineOneLineChevronIdentifierPrefix, + self.searchEngineName]; + break; + case SnippetButtonState::kExpanded: + base::RecordAction( + base::UserMetricsAction(kExpandSearchEngineDescriptionUserAction)); + _chevronButton.accessibilityIdentifier = [NSString + stringWithFormat:@"%@%@", + kSnippetSearchEngineExpandedChevronIdentifierPrefix, + self.searchEngineName]; + break; + } +} + +#pragma mark - UIAccessibility - (NSString*)accessibilityLabel { CHECK_NE(self.snippetText.length, 0ul) @@ -514,15 +533,19 @@ return @[ self.searchEngineName ]; } +- (BOOL)isAccessibilityElement { + return YES; +} + +#pragma mark - UIAccessibilityIdentification + - (NSString*)accessibilityIdentifier { return [NSString stringWithFormat:@"%@%@", kSnippetSearchEngineIdentifierPrefix, self.searchEngineName]; } -- (BOOL)isAccessibilityElement { - return YES; -} +#pragma mark - UIAccessibilityAction - (NSArray<UIAccessibilityCustomAction*>*)accessibilityCustomActions { if (!_isChevronButtonEnabled) { @@ -547,23 +570,4 @@ return actions; } -- (void)updateChevronIdentifier { - switch (_snippetButtonState) { - case SnippetButtonState::kOneLine: - _chevronButton.accessibilityIdentifier = [NSString - stringWithFormat:@"%@%@", - kSnippetSearchEngineOneLineChevronIdentifierPrefix, - self.searchEngineName]; - break; - case SnippetButtonState::kExpanded: - base::RecordAction( - base::UserMetricsAction(kExpandSearchEngineDescriptionUserAction)); - _chevronButton.accessibilityIdentifier = [NSString - stringWithFormat:@"%@%@", - kSnippetSearchEngineExpandedChevronIdentifierPrefix, - self.searchEngineName]; - break; - } -} - @end
diff --git a/ios/chrome/browser/settings/ui_bundled/cells/version_item.mm b/ios/chrome/browser/settings/ui_bundled/cells/version_item.mm index ef31177f..15317a95 100644 --- a/ios/chrome/browser/settings/ui_bundled/cells/version_item.mm +++ b/ios/chrome/browser/settings/ui_bundled/cells/version_item.mm
@@ -92,6 +92,8 @@ return self; } +#pragma mark - UIAccessibility + - (NSString*)accessibilityLabel { return self.textLabel.text; }
diff --git a/ios/chrome/browser/settings/ui_bundled/password/password_manager_view_controller_items.mm b/ios/chrome/browser/settings/ui_bundled/password/password_manager_view_controller_items.mm index a78ee48..6b72c18 100644 --- a/ios/chrome/browser/settings/ui_bundled/password/password_manager_view_controller_items.mm +++ b/ios/chrome/browser/settings/ui_bundled/password/password_manager_view_controller_items.mm
@@ -175,6 +175,8 @@ _faviconTypeForMetrics = faviconTypeForMetrics; } +#pragma mark - UIAccessibility + - (NSString*)accessibilityLabel { NSString* label = _titleLabel.text; if (_detailLabel.text.length) { @@ -189,6 +191,8 @@ return label; } +#pragma mark - UIAccessibilityIdentification + - (NSString*)accessibilityIdentifier { return _detailLabel.text.length ? [NSString stringWithFormat:@"%@, %@", _titleLabel.text, @@ -196,6 +200,8 @@ : _titleLabel.text; } +#pragma mark - UIAccessibility + - (BOOL)isAccessibilityElement { return YES; }
diff --git a/ios/chrome/browser/settings/ui_bundled/settings_navigation_controller.mm b/ios/chrome/browser/settings/ui_bundled/settings_navigation_controller.mm index 2fafb400a..bc0126e 100644 --- a/ios/chrome/browser/settings/ui_bundled/settings_navigation_controller.mm +++ b/ios/chrome/browser/settings/ui_bundled/settings_navigation_controller.mm
@@ -1036,7 +1036,7 @@ } } -#pragma mark - Accessibility +#pragma mark - UIAccessibilityAction - (BOOL)accessibilityPerformEscape { UIViewController* poppedController = [self popViewControllerAnimated:YES];
diff --git a/ios/chrome/browser/shared/public/features/features.h b/ios/chrome/browser/shared/public/features/features.h index cff523c..4ebe503 100644 --- a/ios/chrome/browser/shared/public/features/features.h +++ b/ios/chrome/browser/shared/public/features/features.h
@@ -327,6 +327,15 @@ // Feature flag to add lens overlay navigation to history. BASE_DECLARE_FEATURE(kLensOverlayNavigationHistory); +// Variations of MIA NTP entrypoint. +extern const char kNTPMIAEntrypointParam[]; +extern const char kNTPMIAEntrypointParamOmniboxContainedSingleButton[]; +extern const char kNTPMIAEntrypointParamOmniboxContainedInline[]; +extern const char kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox[]; + +// Feature flag to change the MIA entrypoint in NTP. +BASE_DECLARE_FEATURE(kNTPMIAEntrypoint); + // Feature flag to enable UITraitCollection workaround for fixing incorrect // trait propagation. BASE_DECLARE_FEATURE(kEnableTraitCollectionWorkAround);
diff --git a/ios/chrome/browser/shared/public/features/features.mm b/ios/chrome/browser/shared/public/features/features.mm index f6e2c871..967577c 100644 --- a/ios/chrome/browser/shared/public/features/features.mm +++ b/ios/chrome/browser/shared/public/features/features.mm
@@ -255,6 +255,20 @@ "LensOverlayNavigationHistory", base::FEATURE_DISABLED_BY_DEFAULT); +// Variations of MIA NTP entrypoint. +const char kNTPMIAEntrypointParam[] = "kNTPMIAEntrypointParam"; +const char kNTPMIAEntrypointParamOmniboxContainedSingleButton[] = + "kNTPMIAEntrypointParamOmniboxContainedSingleButton"; +const char kNTPMIAEntrypointParamOmniboxContainedInline[] = + "kNTPMIAEntrypointParamOmniboxContainedInline"; +const char kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox[] = + "kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox"; + +// Feature flag to change the MIA entrypoint in NTP. +BASE_FEATURE(kNTPMIAEntrypoint, + "kNTPMIAEntrypoint", + base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kEnableTraitCollectionWorkAround, "EnableTraitCollectionWorkAround", base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/password_manager_trusted_vault_widget_promo.imageset/password_manager_trusted_vault_widget_promo_dark.pdf b/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/password_manager_trusted_vault_widget_promo.imageset/password_manager_trusted_vault_widget_promo_dark.pdf index 21cc358..ff2bf5a 100644 --- a/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/password_manager_trusted_vault_widget_promo.imageset/password_manager_trusted_vault_widget_promo_dark.pdf +++ b/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/password_manager_trusted_vault_widget_promo.imageset/password_manager_trusted_vault_widget_promo_dark.pdf Binary files differ
diff --git a/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/password_manager_trusted_vault_widget_promo_disabled.imageset/password_manager_trusted_vault_widget_promo_disabled_dark.pdf b/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/password_manager_trusted_vault_widget_promo_disabled.imageset/password_manager_trusted_vault_widget_promo_disabled_dark.pdf index 86d4bc24..6bbbc8b 100644 --- a/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/password_manager_trusted_vault_widget_promo_disabled.imageset/password_manager_trusted_vault_widget_promo_disabled_dark.pdf +++ b/ios/chrome/browser/shared/ui/symbols/resources/Assets.xcassets/password_manager_trusted_vault_widget_promo_disabled.imageset/password_manager_trusted_vault_widget_promo_disabled_dark.pdf Binary files differ
diff --git a/ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.mm b/ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.mm index 079d063..bd75dbd 100644 --- a/ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.mm +++ b/ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.mm
@@ -571,6 +571,22 @@ _detailTextLabel.font = [UIFont preferredFontForTextStyle:preferredFont]; } +// Updates the cell's UI when device's content size category is an accessibility +// category. +- (void)updateUIOnTraitChange:(UITraitCollection*)previousTraitCollection { + BOOL isCurrentCategoryAccessibility = + UIContentSizeCategoryIsAccessibilityCategory( + self.traitCollection.preferredContentSizeCategory); + if (isCurrentCategoryAccessibility != + UIContentSizeCategoryIsAccessibilityCategory( + previousTraitCollection.preferredContentSizeCategory)) { + [self updateCellForAccessibilityContentSizeCategory: + isCurrentCategoryAccessibility]; + } +} + +#pragma mark - UIAccessibility + - (NSString*)accessibilityLabel { if (self.customAccessibilityLabel) { return self.customAccessibilityLabel; @@ -624,18 +640,4 @@ return @[ self.textLabel.text ]; } -// Updates the cell's UI when device's content size category is an accessibility -// category. -- (void)updateUIOnTraitChange:(UITraitCollection*)previousTraitCollection { - BOOL isCurrentCategoryAccessibility = - UIContentSizeCategoryIsAccessibilityCategory( - self.traitCollection.preferredContentSizeCategory); - if (isCurrentCategoryAccessibility != - UIContentSizeCategoryIsAccessibilityCategory( - previousTraitCollection.preferredContentSizeCategory)) { - [self updateCellForAccessibilityContentSizeCategory: - isCurrentCategoryAccessibility]; - } -} - @end
diff --git a/ios/chrome/browser/shared/ui/table_view/cells/table_view_disclosure_header_footer_item.mm b/ios/chrome/browser/shared/ui/table_view/cells/table_view_disclosure_header_footer_item.mm index 91a0076..5502906 100644 --- a/ios/chrome/browser/shared/ui/table_view/cells/table_view_disclosure_header_footer_item.mm +++ b/ios/chrome/browser/shared/ui/table_view/cells/table_view_disclosure_header_footer_item.mm
@@ -252,7 +252,7 @@ size:kUseDefaultFontSize]; } -#pragma mark - Accessibility +#pragma mark - UIAccessibility - (NSString*)accessibilityLabel { // If no subtitleLabel text has been set only use the titleLabel text.
diff --git a/ios/chrome/browser/shared/ui/table_view/cells/table_view_multi_detail_text_item.mm b/ios/chrome/browser/shared/ui/table_view/cells/table_view_multi_detail_text_item.mm index 65d3ef24..4186686d 100644 --- a/ios/chrome/browser/shared/ui/table_view/cells/table_view_multi_detail_text_item.mm +++ b/ios/chrome/browser/shared/ui/table_view/cells/table_view_multi_detail_text_item.mm
@@ -167,7 +167,7 @@ [self updateConstraintsForTrailingIconVisible:YES]; } -#pragma mark - NSObject(Accessibility) +#pragma mark - UIAccessibility - (NSString*)accessibilityLabel { NSString* accessibilityText = self.textLabel.text;
diff --git a/ios/chrome/browser/shared/ui/table_view/cells/table_view_multi_line_text_edit_item.mm b/ios/chrome/browser/shared/ui/table_view/cells/table_view_multi_line_text_edit_item.mm index fe43505..5d34ced 100644 --- a/ios/chrome/browser/shared/ui/table_view/cells/table_view_multi_line_text_edit_item.mm +++ b/ios/chrome/browser/shared/ui/table_view/cells/table_view_multi_line_text_edit_item.mm
@@ -168,7 +168,7 @@ self.textView.text = nil; } -#pragma mark - NSObject(Accessibility) +#pragma mark - UIAccessibility - (NSString*)accessibilityLabel { return [NSString
diff --git a/ios/chrome/browser/shared/ui/table_view/cells/table_view_text_edit_item.mm b/ios/chrome/browser/shared/ui/table_view/cells/table_view_text_edit_item.mm index e572a911..87f1f56 100644 --- a/ios/chrome/browser/shared/ui/table_view/cells/table_view_text_edit_item.mm +++ b/ios/chrome/browser/shared/ui/table_view/cells/table_view_text_edit_item.mm
@@ -415,7 +415,7 @@ forControlEvents:UIControlEventAllEvents]; } -#pragma mark Accessibility +#pragma mark - UIAccessibility - (NSString*)accessibilityLabel { if ([self.accessibilityLabelValue length]) {
diff --git a/ios/chrome/browser/shared/ui/table_view/cells/table_view_url_item.mm b/ios/chrome/browser/shared/ui/table_view/cells/table_view_url_item.mm index 6d32086..de344fde 100644 --- a/ios/chrome/browser/shared/ui/table_view/cells/table_view_url_item.mm +++ b/ios/chrome/browser/shared/ui/table_view/cells/table_view_url_item.mm
@@ -366,51 +366,6 @@ _faviconReplacementSymbolImageView = nil; } -- (void)setAccessibilityLabel:(NSString*)accessibilityLabel { - self.shouldGenerateAccessibilityLabel = !accessibilityLabel.length; - [super setAccessibilityLabel:accessibilityLabel]; -} - -- (NSString*)accessibilityLabel { - if (self.shouldGenerateAccessibilityLabel) { - NSString* accessibilityLabel = self.titleLabel.text; - if (self.URLLabel.text.length > 0) { - accessibilityLabel = [NSString - stringWithFormat:@"%@, %@", accessibilityLabel, self.URLLabel.text]; - } - if (self.thirdRowLabel.text.length > 0) { - accessibilityLabel = - [NSString stringWithFormat:@"%@, %@", accessibilityLabel, - self.thirdRowLabel.text]; - } - if (self.metadataLabel.text.length > 0) { - accessibilityLabel = - [NSString stringWithFormat:@"%@, %@", accessibilityLabel, - self.metadataLabel.text]; - } - return accessibilityLabel; - } else { - return [super accessibilityLabel]; - } -} - -- (NSArray<NSString*>*)accessibilityUserInputLabels { - NSMutableArray<NSString*>* userInputLabels = [[NSMutableArray alloc] init]; - if (self.titleLabel.text) { - [userInputLabels addObject:self.titleLabel.text]; - } - - return userInputLabels; -} - -- (NSString*)accessibilityIdentifier { - return self.titleLabel.text; -} - -- (BOOL)isAccessibilityElement { - return YES; -} - - (void)startAnimatingActivityIndicator { // It may be an edge case if the activity indicator is spinning when we don't // expect it. But it's okay to leave indicator spinning instead of crashing. @@ -467,4 +422,53 @@ _faviconReplacementSymbolImageView = symbolImageView; } +#pragma mark - UIAccessibilityIdentification + +- (NSString*)accessibilityIdentifier { + return self.titleLabel.text; +} + +#pragma mark - UIAccessibility + +- (BOOL)isAccessibilityElement { + return YES; +} + +- (void)setAccessibilityLabel:(NSString*)accessibilityLabel { + self.shouldGenerateAccessibilityLabel = !accessibilityLabel.length; + [super setAccessibilityLabel:accessibilityLabel]; +} + +- (NSString*)accessibilityLabel { + if (self.shouldGenerateAccessibilityLabel) { + NSString* accessibilityLabel = self.titleLabel.text; + if (self.URLLabel.text.length > 0) { + accessibilityLabel = [NSString + stringWithFormat:@"%@, %@", accessibilityLabel, self.URLLabel.text]; + } + if (self.thirdRowLabel.text.length > 0) { + accessibilityLabel = + [NSString stringWithFormat:@"%@, %@", accessibilityLabel, + self.thirdRowLabel.text]; + } + if (self.metadataLabel.text.length > 0) { + accessibilityLabel = + [NSString stringWithFormat:@"%@, %@", accessibilityLabel, + self.metadataLabel.text]; + } + return accessibilityLabel; + } else { + return [super accessibilityLabel]; + } +} + +- (NSArray<NSString*>*)accessibilityUserInputLabels { + NSMutableArray<NSString*>* userInputLabels = [[NSMutableArray alloc] init]; + if (self.titleLabel.text) { + [userInputLabels addObject:self.titleLabel.text]; + } + + return userInputLabels; +} + @end
diff --git a/ios/chrome/browser/shared/ui/util/accessibility_close_menu_button.mm b/ios/chrome/browser/shared/ui/util/accessibility_close_menu_button.mm index 041124f..76715be 100644 --- a/ios/chrome/browser/shared/ui/util/accessibility_close_menu_button.mm +++ b/ios/chrome/browser/shared/ui/util/accessibility_close_menu_button.mm
@@ -27,6 +27,8 @@ return self; } +#pragma mark - UIAccessibilityAction + // If accessibilityActivate isn't overriden, VoiceOver isn't able to close the // menu. // See crbbug.com/936850.
diff --git a/ios/chrome/browser/sharing/ui_bundled/activity_services/data/chrome_activity_url_source.mm b/ios/chrome/browser/sharing/ui_bundled/activity_services/data/chrome_activity_url_source.mm index 0d2fe7d..f7a98481 100644 --- a/ios/chrome/browser/sharing/ui_bundled/activity_services/data/chrome_activity_url_source.mm +++ b/ios/chrome/browser/sharing/ui_bundled/activity_services/data/chrome_activity_url_source.mm
@@ -8,8 +8,17 @@ #import <UniformTypeIdentifiers/UniformTypeIdentifiers.h> #import "base/check.h" +#import "base/feature_list.h" #import "ios/chrome/browser/sharing/ui_bundled/activity_services/data/chrome_activity_item_thumbnail_generator.h" +namespace { +// Feature flag to restore sharing just the data instead of an Extension Item. +// To be used as a kill switch. +BASE_FEATURE(kShareNSExtensionItemKillSwitch, + "ShareNSExtensionItemKillSwitch", + base::FEATURE_DISABLED_BY_DEFAULT); +} // namespace + @interface ChromeActivityURLSource () { NSString* _subject; } @@ -57,7 +66,34 @@ - (id)activityViewController:(UIActivityViewController*)activityViewController itemForActivityType:(NSString*)activityType { - return self.shareURL; + if (base::FeatureList::IsEnabled(kShareNSExtensionItemKillSwitch)) { + return _shareURL; + } + if ([activityType isEqualToString:UIActivityTypeMessage]) { + // Message does not seem to support NSItemProvider. + return _shareURL; + } + NSItemProvider* provider = + [[NSItemProvider alloc] initWithItem:_shareURL + typeIdentifier:UTTypeURL.identifier]; + __weak __typeof(self) weakSelf = self; + provider.previewImageHandler = ^( + NSItemProviderCompletionHandler completionHandler, + Class expectedValueClass, NSDictionary* options) { + CGSize preferredImageSize = [[options + objectForKey:NSItemProviderPreferredImageSizeKey] CGSizeValue]; + if (CGSizeEqualToSize(preferredImageSize, CGSizeZero)) { + preferredImageSize = CGSizeMake(256, 256); + } + completionHandler([weakSelf activityViewController:activityViewController + thumbnailImageForActivityType:activityType + suggestedSize:preferredImageSize], + nil); + }; + NSExtensionItem* item = [[NSExtensionItem alloc] init]; + item.attachments = @[ provider ]; + item.attributedTitle = [[NSAttributedString alloc] initWithString:_subject]; + return item; } - (NSString*)activityViewController:
diff --git a/ios/chrome/browser/sharing/ui_bundled/activity_services/data/share_to_data_builder.mm b/ios/chrome/browser/sharing/ui_bundled/activity_services/data/share_to_data_builder.mm index 9f33788..61901ef 100644 --- a/ios/chrome/browser/sharing/ui_bundled/activity_services/data/share_to_data_builder.mm +++ b/ios/chrome/browser/sharing/ui_bundled/activity_services/data/share_to_data_builder.mm
@@ -96,7 +96,7 @@ return [[ShareToData alloc] initWithShareURL:final_url_to_share visibleURL:web_state->GetVisibleURL() title:tab_title - additionalText:tab_title + additionalText:nil isOriginalTitle:is_original_title isPagePrintable:is_page_printable isPageSearchable:is_page_searchable
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/grid_cell.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/grid_cell.mm index 20c91c7..60bdecd5 100644 --- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/grid_cell.mm +++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/grid_cell.mm
@@ -250,6 +250,8 @@ return YES; } +#pragma mark - UIAccessibilityAction + - (NSArray*)accessibilityCustomActions { if (self.isInSelectionMode) { // If the cell is in tab grid selection mode, only allow toggling the
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/group_grid_cell.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/group_grid_cell.mm index c01adf90..092a1c8 100644 --- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/group_grid_cell.mm +++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/group_grid_cell.mm
@@ -214,6 +214,8 @@ return YES; } +#pragma mark - UIAccessibilityAction + - (NSArray*)accessibilityCustomActions { if ([self isInSelectionMode]) { // If the cell is in tab grid selection mode, only allow toggling the
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_grid_view_controller.mm index 333f0808..7ab3aaf0 100644 --- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_grid_view_controller.mm +++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_grid_view_controller.mm
@@ -364,7 +364,7 @@ } } -#pragma mark - Accessibility +#pragma mark - UIAccessibilityAction - (BOOL)accessibilityPerformEscape { [self.tabGridHandler exitTabGrid];
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/create_tab_group_view_controller.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/create_tab_group_view_controller.mm index 792c419b..612f714 100644 --- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/create_tab_group_view_controller.mm +++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/create_tab_group_view_controller.mm
@@ -879,7 +879,7 @@ _tabsCount = tabsCount; } -#pragma mark - Accessibility +#pragma mark - UIAccessibilityAction - (BOOL)accessibilityPerformEscape { [self dismissViewController];
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_cell.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_cell.mm index 265d43b31..83ef418 100644 --- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_cell.mm +++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_cell.mm
@@ -86,6 +86,8 @@ self.item = nil; } +#pragma mark - UIAccessibility + - (NSString*)accessibilityLabel { NSString* numberOfTabsString = l10n_util::GetPluralNSStringF( IDS_IOS_TAB_GROUP_TABS_NUMBER, _faviconsGrid.numberOfTabs);
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_notification_cell.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_notification_cell.mm index 0fa78abc..4f37d954 100644 --- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_notification_cell.mm +++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_groups_panel_notification_cell.mm
@@ -74,10 +74,6 @@ _notificationItem = nil; } -- (NSString*)accessibilityLabel { - return _textLabel.text; -} - - (void)setNotificationItem:(TabGroupsPanelItem*)notificationItem { CHECK_EQ(notificationItem.type, TabGroupsPanelItemType::kNotification); if ([notificationItem isEqual:_notificationItem]) { @@ -87,6 +83,12 @@ _textLabel.text = notificationItem.notificationText; } +#pragma mark - UIAccessibility + +- (NSString*)accessibilityLabel { + return _textLabel.text; +} + #pragma mark - Private // Returns a configured text label.
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/ui/tab_strip_group_cell.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/ui/tab_strip_group_cell.mm index 34888ee..f87213c1 100644 --- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/ui/tab_strip_group_cell.mm +++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/ui/tab_strip_group_cell.mm
@@ -208,7 +208,7 @@ return titleContainer; } -#pragma mark - UIAccessibility +#pragma mark - UIAccessibilityAction - (NSArray*)accessibilityCustomActions { int stringID = self.collapsed ? IDS_IOS_TAB_STRIP_TAB_GROUP_EXPAND @@ -219,13 +219,13 @@ selector:@selector(collapseOrExpandTapped:)] ]; } +#pragma mark - Private + // Selector registered to expand or collapse tab group. - (void)collapseOrExpandTapped:(id)sender { [self.delegate collapseOrExpandTappedForCell:self]; } -#pragma mark - Private - // Sets up constraints. - (void)setupConstraints { UIView* contentView = self.contentView;
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/ui/tab_strip_tab_cell.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/ui/tab_strip_tab_cell.mm index 4a1b4f0..11493307 100644 --- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/ui/tab_strip_tab_cell.mm +++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/ui/tab_strip_tab_cell.mm
@@ -511,7 +511,7 @@ } #endif -#pragma mark - UIAccessibility +#pragma mark - UIAccessibilityAction - (NSArray*)accessibilityCustomActions { return @[ [[UIAccessibilityCustomAction alloc]
diff --git a/ios/chrome/browser/toolbar/ui_bundled/buttons/toolbar_tab_grid_button.mm b/ios/chrome/browser/toolbar/ui_bundled/buttons/toolbar_tab_grid_button.mm index 51a4445..df022e8 100644 --- a/ios/chrome/browser/toolbar/ui_bundled/buttons/toolbar_tab_grid_button.mm +++ b/ios/chrome/browser/toolbar/ui_bundled/buttons/toolbar_tab_grid_button.mm
@@ -93,12 +93,14 @@ [self updateTabCountLabelTextColor]; } -#pragma mark - UIAccessibility +#pragma mark - UIAccessibilityIdentification - (NSString*)accessibilityIdentifier { return kToolbarStackButtonIdentifier; } +#pragma mark - UIAccessibility + - (NSString*)accessibilityLabel { switch (self.tabGroupState) { case ToolbarTabGroupState::kNormal:
diff --git a/ios/chrome/browser/toolbar/ui_bundled/toolbar_progress_bar.mm b/ios/chrome/browser/toolbar/ui_bundled/toolbar_progress_bar.mm index cc87dd24..6f9d8e6 100644 --- a/ios/chrome/browser/toolbar/ui_bundled/toolbar_progress_bar.mm +++ b/ios/chrome/browser/toolbar/ui_bundled/toolbar_progress_bar.mm
@@ -10,6 +10,8 @@ @implementation ToolbarProgressBar +#pragma mark - UIAccessibility + - (NSString*)accessibilityValue { return l10n_util::GetNSStringF( IDS_IOS_PROGRESS_BAR_ACCESSIBILITY,
diff --git a/ios/chrome/browser/whats_new/ui/cells/whats_new_table_view_item.mm b/ios/chrome/browser/whats_new/ui/cells/whats_new_table_view_item.mm index 5f12fd5..768478e 100644 --- a/ios/chrome/browser/whats_new/ui/cells/whats_new_table_view_item.mm +++ b/ios/chrome/browser/whats_new/ui/cells/whats_new_table_view_item.mm
@@ -221,7 +221,7 @@ self.iconWidthAnchorConstraint.constant = kIconSize; } -#pragma mark - Private +#pragma mark - UIAccessibility - (NSString*)accessibilityLabel { return self.textLabel.text;
diff --git a/ios/chrome/browser/whats_new/ui/cells/whats_new_table_view_subtitle_item.mm b/ios/chrome/browser/whats_new/ui/cells/whats_new_table_view_subtitle_item.mm index 6920c00..5913956 100644 --- a/ios/chrome/browser/whats_new/ui/cells/whats_new_table_view_subtitle_item.mm +++ b/ios/chrome/browser/whats_new/ui/cells/whats_new_table_view_subtitle_item.mm
@@ -58,7 +58,7 @@ _textLabel.text = nil; } -#pragma mark - Private +#pragma mark - UIAccessibility - (NSString*)accessibilityLabel { return _textLabel.text;
diff --git a/ios/chrome/share_extension/extended_share_view_controller.mm b/ios/chrome/share_extension/extended_share_view_controller.mm index 548368e..1470a85 100644 --- a/ios/chrome/share_extension/extended_share_view_controller.mm +++ b/ios/chrome/share_extension/extended_share_view_controller.mm
@@ -347,7 +347,10 @@ } self.shareItem = item; self.shareURL = URL; - self.shareTitle = [[item attributedContentText] string]; + self.shareTitle = [[item attributedTitle] string]; + if ([self.shareTitle length] == 0) { + self.shareTitle = [[item attributedContentText] string]; + } if ([self.shareTitle length] == 0) { self.shareTitle = [URL host]; }
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index c591183..95202595 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -320,6 +320,7 @@ "//ios/chrome/browser/infobars/ui_bundled/banners:unit_tests", "//ios/chrome/browser/infobars/ui_bundled/modals/autofill_address_profile:unit_tests", "//ios/chrome/browser/intelligence/bwg/coordinator:unit_tests", + "//ios/chrome/browser/intelligence/bwg/model:unit_tests", "//ios/chrome/browser/intents/model:unit_tests", "//ios/chrome/browser/itunes_urls/model:unit_tests", "//ios/chrome/browser/keyboard/ui_bundled:unit_tests",
diff --git a/ios_internal b/ios_internal index 3b581c6..b254cb4 160000 --- a/ios_internal +++ b/ios_internal
@@ -1 +1 @@ -Subproject commit 3b581c6c47e23717766c2c1922d6c7111db6cb4c +Subproject commit b254cb46f918229d29978dcd9685439f27798668
diff --git a/media/mojo/mojom/video_frame_mojom_traits.cc b/media/mojo/mojom/video_frame_mojom_traits.cc index 8347b2ad..ddf97ed 100644 --- a/media/mojo/mojom/video_frame_mojom_traits.cc +++ b/media/mojo/mojom/video_frame_mojom_traits.cc
@@ -374,9 +374,9 @@ gpu::GpuMemoryBufferSupport support; std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer = - support.CreateGpuMemoryBufferImplFromHandle( + support.CreateGpuMemoryBufferImplFromHandleForVideoFrame( std::move(gpu_memory_buffer_handle), coded_size, *buffer_format, - buffer_usage, base::NullCallback()); + buffer_usage); if (!gpu_memory_buffer) { return false; }
diff --git a/net/base/proxy_chain.cc b/net/base/proxy_chain.cc index fa3367d3..0dc4b6d 100644 --- a/net/base/proxy_chain.cc +++ b/net/base/proxy_chain.cc
@@ -106,7 +106,7 @@ DCHECK_NE(length(), 0u); ProxyChain new_chain = ProxyChain({proxy_server_list_->begin(), proxy_server_list_->end() - 1}, - ip_protection_chain_id_); + ip_protection_chain_id_, opaque_data_); return std::make_pair(new_chain, std::ref(proxy_server_list_->back())); } @@ -115,7 +115,7 @@ DCHECK_LE(len, length()); return ProxyChain( {proxy_server_list_->begin(), proxy_server_list_->begin() + len}, - ip_protection_chain_id_); + ip_protection_chain_id_, opaque_data_); } const ProxyServer& ProxyChain::First() const { @@ -149,13 +149,19 @@ debug_string += base::StringPrintf(" (IP Protection chain %d)", ip_protection_chain_id_); } + + if (opaque_data_.has_value()) { + debug_string += base::StringPrintf(" (Opaque data %d)", *opaque_data_); + } return debug_string; } ProxyChain::ProxyChain(std::vector<ProxyServer> proxy_server_list, - int ip_protection_chain_id) + int ip_protection_chain_id, + std::optional<int> opaque_data) : proxy_server_list_(std::move(proxy_server_list)), - ip_protection_chain_id_(ip_protection_chain_id) { + ip_protection_chain_id_(ip_protection_chain_id), + opaque_data_(opaque_data) { CHECK(IsValidInternal()); }
diff --git a/net/base/proxy_chain.h b/net/base/proxy_chain.h index 3bd2d8d0..dd1c219 100644 --- a/net/base/proxy_chain.h +++ b/net/base/proxy_chain.h
@@ -76,7 +76,17 @@ // chain_id defaults to 0 which corresponds to an un-identified chain. static ProxyChain ForIpProtection(std::vector<ProxyServer> proxy_server_list, int chain_id = 0) { - return ProxyChain(std::move(proxy_server_list), chain_id); + return ProxyChain(std::move(proxy_server_list), chain_id, + /*opaque_data=*/std::nullopt); + } + + // Creates a `ProxyChain` with `opaque_data` attached to it. This can be later + // on retrieved via `opaque_data()`. + static ProxyChain WithOpaqueData(std::vector<ProxyServer> proxy_server_list, + int opaque_data) { + return ProxyChain(std::move(proxy_server_list), + /*ip_protection_chain_id=*/kNotIpProtectionChainId, + opaque_data); } // Initialize from a pickle that contains data generated by a call to the @@ -183,6 +193,8 @@ } int ip_protection_chain_id() const { return ip_protection_chain_id_; } + std::optional<int> opaque_data() const { return opaque_data_; } + friend bool operator==(const ProxyChain&, const ProxyChain&) = default; friend auto operator<=>(const ProxyChain&, const ProxyChain&) = default; @@ -190,7 +202,8 @@ private: explicit ProxyChain(std::vector<ProxyServer> proxy_server_list, - int ip_protection_chain_id); + int ip_protection_chain_id, + std::optional<int> opaque_data); std::optional<std::vector<ProxyServer>> proxy_server_list_; @@ -198,6 +211,14 @@ // A negative value indicates this chain is not used for IP protection. int ip_protection_chain_id_ = kNotIpProtectionChainId; + // Owners of `ProxyChain` can use to store private information. For example, + // Cronet uses this to map each net::ProxyChain to a specific + // org.chromium.net.Proxy.Callback, when necessary. This does not get + // persisted during calls to the `Persist` method. + // Note: the value of this field does not affect the validity of this + // ProxyChain. + std::optional<int> opaque_data_; + // Returns true if this chain is valid. A chain is considered valid if // (1) it is a single valid proxy server, or // (2) it is a chain of servers, composed of zero or more SCHEME_QUIC servers
diff --git a/net/base/proxy_chain_unittest.cc b/net/base/proxy_chain_unittest.cc index 371899e1..8c49be2ea0 100644 --- a/net/base/proxy_chain_unittest.cc +++ b/net/base/proxy_chain_unittest.cc
@@ -96,6 +96,12 @@ ProxyUriToProxyServer("foo:555", ProxyServer::SCHEME_HTTPS)}); EXPECT_EQ(proxy_chain2.ToDebugString(), "[https://foo:444, https://foo:555]"); #endif // BUILDFLAG(ENABLE_BRACKETED_PROXY_URIS) + + ProxyChain proxy_chain_with_opaque_data = ProxyChain::WithOpaqueData( + {ProxyUriToProxyServer("foo:555", ProxyServer::SCHEME_HTTPS)}, + /*opaque_data=*/123); + EXPECT_EQ(proxy_chain_with_opaque_data.ToDebugString(), + "[https://foo:555] (Opaque data 123)"); } TEST(ProxyChainTest, FromSchemeHostAndPort) { @@ -363,6 +369,45 @@ EXPECT_EQ(chain_with_id.ip_protection_chain_id(), 3); } +TEST(ProxyChainTest, WithOpaqueData) { + auto regular_proxy_chain1 = ProxyChain::Direct(); + EXPECT_FALSE(regular_proxy_chain1.opaque_data().has_value()); + + auto regular_proxy_chain2 = + ProxyChain({ProxyUriToProxyServer("foo:555", ProxyServer::SCHEME_HTTPS), + ProxyUriToProxyServer("foo:666", ProxyServer::SCHEME_HTTPS)}); + EXPECT_FALSE(regular_proxy_chain2.opaque_data().has_value()); + + auto proxy_chain_with_opaque_data1 = + ProxyChain::WithOpaqueData(std::vector<ProxyServer>(), + /*opaque_data=*/123); + EXPECT_TRUE(proxy_chain_with_opaque_data1.opaque_data().has_value()); + EXPECT_EQ(*proxy_chain_with_opaque_data1.opaque_data(), 123); + EXPECT_TRUE( + proxy_chain_with_opaque_data1.proxy_servers_if_valid().has_value()); + EXPECT_TRUE(proxy_chain_with_opaque_data1.proxy_servers_if_valid()->empty()); + EXPECT_FALSE(proxy_chain_with_opaque_data1.is_for_ip_protection()); + + auto proxy_chain_copy = proxy_chain_with_opaque_data1; + EXPECT_TRUE(proxy_chain_copy.opaque_data().has_value()); + EXPECT_EQ(*proxy_chain_copy.opaque_data(), 123); + EXPECT_TRUE(proxy_chain_copy.proxy_servers_if_valid().has_value()); + EXPECT_FALSE(proxy_chain_copy.is_for_ip_protection()); + + const auto proxy_servers = std::vector<ProxyServer>( + {ProxyUriToProxyServer("foo:555", ProxyServer::SCHEME_HTTPS)}); + auto proxy_chain_with_opaque_data2 = + ProxyChain::WithOpaqueData(proxy_servers, + /*opaque_data=*/333); + EXPECT_TRUE(proxy_chain_with_opaque_data2.opaque_data().has_value()); + EXPECT_EQ(proxy_chain_with_opaque_data2.opaque_data(), 333); + EXPECT_TRUE( + proxy_chain_with_opaque_data2.proxy_servers_if_valid().has_value()); + EXPECT_EQ(*proxy_chain_with_opaque_data2.proxy_servers_if_valid(), + proxy_servers); + EXPECT_FALSE(proxy_chain_with_opaque_data2.is_for_ip_protection()); +} + TEST(ProxyChainTest, IsGetToProxyAllowed) { auto https_server1 = ProxyUriToProxyServer("foo:333", ProxyServer::SCHEME_HTTPS);
diff --git a/net/disk_cache/simple/simple_test_util.cc b/net/disk_cache/simple/simple_test_util.cc index 4ed62038..71f7bb4 100644 --- a/net/disk_cache/simple/simple_test_util.cc +++ b/net/disk_cache/simple/simple_test_util.cc
@@ -4,6 +4,7 @@ #include "net/disk_cache/simple/simple_test_util.h" +#include "base/containers/span.h" #include "base/files/file.h" #include "base/files/file_path.h" #include "net/base/hash_value.h" @@ -25,7 +26,7 @@ if (!entry_file.IsValid()) return false; - return UNSAFE_TODO(entry_file.Write(0, "dummy", 1)) == 1; + return entry_file.WriteAndCheck(0, base::byte_span_from_cstring("d")); } bool RemoveKeySHA256FromEntry(const std::string& key,
diff --git a/net/third_party/quiche/src b/net/third_party/quiche/src index 611b64f..446875b 160000 --- a/net/third_party/quiche/src +++ b/net/third_party/quiche/src
@@ -1 +1 @@ -Subproject commit 611b64ffd0f17e96d31ff1d3e52ff1df0c9219f8 +Subproject commit 446875b7172a09b60be78acf8eacb67de54815ec
diff --git a/net/tools/cachetool/cachetool.cc b/net/tools/cachetool/cachetool.cc index 9bd8e76..f1501dd8 100644 --- a/net/tools/cachetool/cachetool.cc +++ b/net/tools/cachetool/cachetool.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - #include <iostream> #include <memory> #include <string_view> @@ -51,10 +46,9 @@ constexpr int kResponseInfoIndex = 0; constexpr int kResponseContentIndex = 1; -const char* const kCommandNames[] = { - "stop", "get_size", "list_keys", "get_stream", - "delete_stream", "delete_key", "update_raw_headers", "list_dups", - "set_header"}; +auto kCommandNames = std::to_array( + {"stop", "get_size", "list_keys", "get_stream", "delete_stream", + "delete_key", "update_raw_headers", "list_dups", "set_header"}); // Prints the command line help. void PrintHelp() {
diff --git a/net/tools/crash_cache/crash_cache.cc b/net/tools/crash_cache/crash_cache.cc index d8dedfba..50fafce0 100644 --- a/net/tools/crash_cache/crash_cache.cc +++ b/net/tools/crash_cache/crash_cache.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - // This command-line program generates the set of files needed for the crash- // cache unit tests (DiskCacheTest,CacheBackend_Recover*). This program only // works properly on debug mode, because the crash functionality is not compiled @@ -17,6 +12,7 @@ #include "base/at_exit.h" #include "base/check.h" #include "base/command_line.h" +#include "base/compiler_specific.h" #include "base/files/file_util.h" #include "base/message_loop/message_pump_type.h" #include "base/path_service.h" @@ -97,31 +93,29 @@ // Creates the destinaton folder for this run, and returns it on full_path. bool CreateTargetFolder(const base::FilePath& path, RankCrashes action, base::FilePath* full_path) { - const char* const folders[] = { - "", - "insert_empty1", - "insert_empty2", - "insert_empty3", - "insert_one1", - "insert_one2", - "insert_one3", - "insert_load1", - "insert_load2", - "remove_one1", - "remove_one2", - "remove_one3", - "remove_one4", - "remove_head1", - "remove_head2", - "remove_head3", - "remove_head4", - "remove_tail1", - "remove_tail2", - "remove_tail3", - "remove_load1", - "remove_load2", - "remove_load3" - }; + auto folders = std::to_array({"", + "insert_empty1", + "insert_empty2", + "insert_empty3", + "insert_one1", + "insert_one2", + "insert_one3", + "insert_load1", + "insert_load2", + "remove_one1", + "remove_one2", + "remove_one3", + "remove_one4", + "remove_head1", + "remove_head2", + "remove_head3", + "remove_head4", + "remove_tail1", + "remove_tail2", + "remove_tail3", + "remove_load1", + "remove_load2", + "remove_load3"}); static_assert(std::size(folders) == disk_cache::MAX_CRASH, "sync folders"); DCHECK(action > disk_cache::NO_CRASH && action < disk_cache::MAX_CRASH); @@ -388,12 +382,14 @@ if (argc < 2) return MasterCode(); - char* end; - RankCrashes action = static_cast<RankCrashes>(strtol(argv[1], &end, 0)); - if (action <= disk_cache::NO_CRASH || action >= disk_cache::MAX_CRASH) { + int action_in = 0; + // SAFETY: We check that argc >= 2 above, so argv[1] is fine. + if (!base::StringToInt(UNSAFE_BUFFERS(argv[1]), &action_in) || + action_in <= disk_cache::NO_CRASH || action_in >= disk_cache::MAX_CRASH) { printf("Invalid action\n"); return INVALID_ARGUMENT; } + RankCrashes action = static_cast<RankCrashes>(action_in); base::FilePath path; base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &path);
diff --git a/net/tools/dump_cache/dump_files.cc b/net/tools/dump_cache/dump_files.cc index 2fcb9ef..290d01e 100644 --- a/net/tools/dump_cache/dump_files.cc +++ b/net/tools/dump_cache/dump_files.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - // Performs basic inspection of the disk cache files with minimal disruption // to the actual files (they still may change if an error is detected on the // files). @@ -15,6 +10,7 @@ #include <stdio.h> +#include <cstddef> #include <memory> #include <set> #include <string> @@ -22,6 +18,7 @@ #include "base/command_line.h" #include "base/compiler_specific.h" #include "base/containers/heap_array.h" +#include "base/containers/span.h" #include "base/files/file.h" #include "base/files/file_enumerator.h" #include "base/files/file_util.h" @@ -44,16 +41,15 @@ const base::FilePath::CharType kIndexName[] = FILE_PATH_LITERAL("index"); -// Reads the |header_size| bytes from the beginning of file |name|. -bool ReadHeader(const base::FilePath& name, char* header, int header_size) { +// Reads the `header.size()` bytes from the beginning of file `name`. +bool ReadHeader(const base::FilePath& name, base::span<uint8_t> header) { base::File file(name, base::File::FLAG_OPEN | base::File::FLAG_READ); if (!file.IsValid()) { printf("Unable to open file %s\n", name.MaybeAsASCII().c_str()); return false; } - int read = file.Read(0, header, header_size); - if (read != header_size) { + if (!file.ReadAndCheck(0, header)) { printf("Unable to read file %s\n", name.MaybeAsASCII().c_str()); return false; } @@ -62,8 +58,9 @@ int GetMajorVersionFromIndexFile(const base::FilePath& name) { disk_cache::IndexHeader header; - if (!ReadHeader(name, reinterpret_cast<char*>(&header), sizeof(header))) + if (!ReadHeader(name, base::byte_span_from_ref(header))) { return 0; + } if (header.magic != disk_cache::kIndexMagic) { return 0; } @@ -72,7 +69,7 @@ int GetMajorVersionFromBlockFile(const base::FilePath& name) { disk_cache::BlockFileHeader header; - if (!ReadHeader(name, reinterpret_cast<char*>(&header), sizeof(header))) { + if (!ReadHeader(name, base::byte_span_from_ref(header))) { return 0; } @@ -135,8 +132,9 @@ void DumpIndexHeader(const base::FilePath& name, disk_cache::CacheAddr* stats_addr) { disk_cache::IndexHeader header; - if (!ReadHeader(name, reinterpret_cast<char*>(&header), sizeof(header))) + if (!ReadHeader(name, base::byte_span_from_ref(header))) { return; + } printf("Index file:\n"); printf("magic: %x\n", header.magic); @@ -167,8 +165,9 @@ // Dumps the contents of a block-file header. void DumpBlockHeader(const base::FilePath& name) { disk_cache::BlockFileHeader header; - if (!ReadHeader(name, reinterpret_cast<char*>(&header), sizeof(header))) + if (!ReadHeader(name, base::byte_span_from_ref(header))) { return; + } printf("Block file: %s\n", name.BaseName().MaybeAsASCII().c_str()); printf("magic: %x\n", header.magic); @@ -262,13 +261,15 @@ for (int i = current_hash_; i < index_->header.table_len; i++) { // Yes, we'll crash if the table is shorter than expected, but only after // dumping every entry that we can find. - if (index_->table[i]) { + disk_cache::CacheAddr addr_i = UNSAFE_TODO(index_->table[i]); + if (addr_i) { current_hash_ = i; - *addr = index_->table[i]; - if (LoadEntry(index_->table[i], entry)) + *addr = addr_i; + if (LoadEntry(addr_i, entry)) { return true; + } - printf("Unable to load entry at address 0x%x\n", index_->table[i]); + printf("Unable to load entry at address 0x%x\n", addr_i); } } return false; @@ -285,7 +286,7 @@ if (!entry_block.Load()) return false; - memcpy(entry, entry_block.Data(), sizeof(*entry)); + *entry = *entry_block.Data(); if (!entry_block.VerifyHash()) printf("Self hash failed at 0x%x\n", addr); @@ -317,7 +318,8 @@ if (!rank_block.VerifyHash()) printf("Self hash failed at 0x%x\n", addr); - memcpy(rankings, rank_block.Data(), sizeof(*rankings)); + *rankings = *rank_block.Data(); + return true; } @@ -505,8 +507,9 @@ int DumpLists(const base::FilePath& input_path) { base::FilePath index_name(input_path.Append(kIndexName)); disk_cache::IndexHeader header; - if (!ReadHeader(index_name, reinterpret_cast<char*>(&header), sizeof(header))) + if (!ReadHeader(index_name, base::byte_span_from_ref(header))) { return -1; + } // We need a task executor, although we really don't run any task. base::SingleThreadTaskExecutor io_task_executor(base::MessagePumpType::IO); @@ -557,8 +560,9 @@ base::FilePath index_name(input_path.Append(kIndexName)); disk_cache::IndexHeader header; - if (!ReadHeader(index_name, reinterpret_cast<char*>(&header), sizeof(header))) + if (!ReadHeader(index_name, base::byte_span_from_ref(header))) { return -1; + } // We need a task executor, although we really don't run any task. base::SingleThreadTaskExecutor io_task_executor(base::MessagePumpType::IO); @@ -614,8 +618,9 @@ int DumpAllocation(const base::FilePath& file) { disk_cache::BlockFileHeader header; - if (!ReadHeader(file, reinterpret_cast<char*>(&header), sizeof(header))) + if (!ReadHeader(file, base::byte_span_from_ref(header))) { return -1; + } std::string out; DumpCacheHelper::HexDump(base::byte_span_from_ref(header.allocation_map),
diff --git a/net/tools/stress_cache/stress_cache.cc b/net/tools/stress_cache/stress_cache.cc index f4845d2..f3775348b 100644 --- a/net/tools/stress_cache/stress_cache.cc +++ b/net/tools/stress_cache/stress_cache.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/40284755): Remove this and spanify to fix the errors. -#pragma allow_unsafe_buffers -#endif - // This is a simple application that stress-tests the crash recovery of the disk // cache. The main application starts a copy of itself on a loop, checking the // exit code of the child process. When the child dies in an unexpected way, @@ -19,6 +14,7 @@ // To test that the disk cache doesn't generate critical errors with regular // application level crashes, edit stress_support.h. +#include <algorithm> #include <string> #include <string_view> #include <vector> @@ -38,9 +34,11 @@ #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/task/single_thread_task_executor.h" #include "base/task/single_thread_task_runner.h" +#include "base/task/thread_pool/thread_pool_instance.h" #include "base/threading/platform_thread.h" #include "base/threading/thread.h" #include "base/time/time.h" @@ -103,9 +101,9 @@ std::string GenerateStressKey() { char key[20 * 1024]; size_t size = 50 + rand() % 20000; - CacheTestFillBuffer(base::as_writable_byte_span(key).first(size), true); - - key[size - 1] = '\0'; + auto key_span = base::as_writable_byte_span(key); + CacheTestFillBuffer(key_span.first(size), true); + key_span[size - 1] = '\0'; return std::string(key); } @@ -132,7 +130,7 @@ public: EntryWrapper() { buffer_ = base::MakeRefCounted<net::IOBufferWithSize>(kBufferSize); - memset(buffer_->data(), 'k', kBufferSize); + std::ranges::fill(buffer_->span(), 'k'); } Operation state() const { return state_; } @@ -162,8 +160,8 @@ int writes = 0; // How many writes since this iteration started. int iteration = 0; // The iteration (number of crashes). disk_cache::BackendImpl* cache = nullptr; - std::string keys[kNumKeys]; - EntryWrapper entries[kNumEntries]; + std::array<std::string, kNumKeys> keys; + std::array<EntryWrapper, kNumEntries> entries; }; Data* g_data = nullptr; @@ -202,7 +200,7 @@ return DoWrite(); state_ = READ; - memset(buffer_->data(), 'k', kReadSize); + std::ranges::fill(buffer_->first(kReadSize), 'k'); int rv = entry_->ReadData( 0, 0, buffer_.get(), kReadSize, base::BindOnce(&EntryWrapper::OnReadDone, base::Unretained(this))); @@ -213,7 +211,7 @@ void EntryWrapper::OnReadDone(int result) { DCHECK_EQ(state_, READ); CHECK_EQ(result, kReadSize); - CHECK_EQ(0, memcmp(buffer_->data(), "Write: ", 7)); + CHECK(buffer_->first(7) == base::byte_span_from_cstring("Write: ")); DoWrite(); } @@ -221,9 +219,11 @@ bool truncate = (rand() % 2 == 0); int size = kBufferSize - (rand() % 20) * kBufferSize / 20; state_ = WRITE; - base::snprintf(buffer_->data(), kBufferSize, - "Write: %d iter: %d, size: %d, truncate: %d ", - g_data->writes, g_data->iteration, size, truncate ? 1 : 0); + std::string payload = base::StringPrintf( + "Write: %d iter: %d, size: %d, truncate: %d ", g_data->writes, + g_data->iteration, size, truncate ? 1 : 0); + buffer_->span().copy_prefix_from(base::as_byte_span(payload).first( + std::min(payload.size(), static_cast<size_t>(kBufferSize)))); int rv = entry_->WriteData( 0, 0, buffer_.get(), size, base::BindOnce(&EntryWrapper::OnWriteDone, base::Unretained(this), size), @@ -427,8 +427,11 @@ base::PlatformThread::Sleep(base::Seconds(3)); base::SingleThreadTaskExecutor io_task_executor(base::MessagePumpType::IO); - char* end; - long int iteration = strtol(argv[1], &end, 0); + base::ThreadPoolInstance::CreateAndStartWithDefaultParams("stress_cache"); + + int iteration = 0; + // SAFETY: We check that argc >= 2 above, so argv[1] is fine. + base::StringToInt(UNSAFE_BUFFERS(argv[1]), &iteration); if (!StartCrashThread()) { printf("failed to start thread\n");
diff --git a/skia/BUILD.gn b/skia/BUILD.gn index 70b155947..4db5172c 100644 --- a/skia/BUILD.gn +++ b/skia/BUILD.gn
@@ -185,13 +185,15 @@ "SK_CODEC_ENCODES_PNG_WITH_LIBPNG", ] + if (use_blink) { + defines += [ "SK_TYPEFACE_FACTORY_FONTATIONS" ] + } if (use_blink && !use_system_freetype) { defines += [ "SK_FREETYPE_MINIMUM_RUNTIME_VERSION_IS_BUILD_VERSION" ] } if (use_blink && enable_freetype) { defines += [ "SK_TYPEFACE_FACTORY_FREETYPE", - "SK_TYPEFACE_FACTORY_FONTATIONS", "SK_FONTMGR_FREETYPE_EMPTY_AVAILABLE", ] }
diff --git a/sql/database.cc b/sql/database.cc index 483d481..3275f810e 100644 --- a/sql/database.cc +++ b/sql/database.cc
@@ -219,6 +219,33 @@ reason); } +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +// LINT.IfChange(RazeDatabaseFailedReason) +enum class RazeDatabaseFailedReason { + kPoisoned = 0, + kPendingTransaction = 1, + kCantOpenInMemory = 2, + kAutoVacuumFailed = 3, + kSchemaFailed = 4, + kLocked = 5, + kTruncateFailed = 6, + kBackupFailed = 7, + kPageSizeFailed = 8, + kUnknownError = 9, + kCheckpointFailed = 10, + kMaxValue = kCheckpointFailed +}; + +// LINT.ThenChange(//tools/metrics/histograms/metadata/sql/enums.xml) +// Reports the reason for a failure in Database::Raze(...). +void RecordRazeDatabaseFailureReason(const std::string& histogram_tag, + RazeDatabaseFailedReason reason) { + base::UmaHistogramEnumeration( + base::StrCat({"Sql.Database.Raze.FailureReason.", histogram_tag}), + reason); +} + } // namespace DatabaseOptions::DatabaseOptions() = default; @@ -1091,9 +1118,7 @@ // Create an in-memory database with the existing database's page // size, then backup that database over the existing database. -bool Database::Raze() { - TRACE_EVENT0("sql", "Database::Raze"); - +bool Database::RazeInternal() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::optional<base::ScopedBlockingCall> scoped_blocking_call; @@ -1101,12 +1126,16 @@ if (!db_) { DCHECK(poisoned_) << "Cannot raze null db"; + RecordRazeDatabaseFailureReason(histogram_tag_, + RazeDatabaseFailedReason::kPoisoned); return false; } DCHECK_GE(transaction_nesting_, 0); if (transaction_nesting_ > 0) { DLOG(FATAL) << "Cannot raze within a transaction"; + RecordRazeDatabaseFailureReason( + histogram_tag_, RazeDatabaseFailedReason::kPendingTransaction); return false; } @@ -1118,6 +1147,8 @@ "RazeNullDB"); if (!null_db.OpenInMemory()) { DLOG(FATAL) << "Unable to open in-memory database."; + RecordRazeDatabaseFailureReason( + histogram_tag_, RazeDatabaseFailedReason::kCantOpenInMemory); return false; } @@ -1129,6 +1160,8 @@ // would be to create an actual filesystem database, which is // unfortunate. if (!null_db.Execute("PRAGMA auto_vacuum = 1")) { + RecordRazeDatabaseFailureReason( + histogram_tag_, RazeDatabaseFailedReason::kAutoVacuumFailed); return false; } #endif @@ -1141,6 +1174,8 @@ // database to the new version of the database, incremented by one // so that other readers see the schema change and act accordingly. if (!null_db.Execute("PRAGMA schema_version = 1")) { + RecordRazeDatabaseFailureReason(histogram_tag_, + RazeDatabaseFailedReason::kSchemaFailed); return false; } @@ -1168,6 +1203,8 @@ // The destination database was locked. if (sqlite_result_code == SqliteResultCode::kBusy) { + RecordRazeDatabaseFailureReason(histogram_tag_, + RazeDatabaseFailedReason::kLocked); return false; } @@ -1182,11 +1219,15 @@ sqlite3_file* file = GetSqliteVfsFile(); if (!file || file->pMethods->xTruncate(file, 0) != SQLITE_OK) { DLOG(FATAL) << "Failed to truncate file."; + RecordRazeDatabaseFailureReason( + histogram_tag_, RazeDatabaseFailedReason::kTruncateFailed); return false; } sqlite_result_code = BackupDatabaseForRaze(null_db.db_, db_); if (sqlite_result_code != SqliteResultCode::kDone) { + RecordRazeDatabaseFailureReason(histogram_tag_, + RazeDatabaseFailedReason::kBackupFailed); return false; } } @@ -1200,6 +1241,8 @@ const std::string page_size_sql = base::StrCat( {"PRAGMA page_size=", base::NumberToString(options_.page_size_)}); if (!Execute(page_size_sql)) { + RecordRazeDatabaseFailureReason( + histogram_tag_, RazeDatabaseFailedReason::kPageSizeFailed); return false; } // Page size isn't changed until the database is vacuumed. @@ -1211,6 +1254,9 @@ sqlite_result_code = BackupDatabaseForRaze(null_db.db_, db_); if (sqlite_result_code != SqliteResultCode::kDone) { + RecordRazeDatabaseFailureReason(histogram_tag_, + RazeDatabaseFailedReason::kBackupFailed); + return false; } } @@ -1218,6 +1264,8 @@ if (sqlite_result_code != SqliteResultCode::kDone) { NOTIMPLEMENTED() << "Unhandled sqlite3_backup_step() error: " << sqlite_result_code; + RecordRazeDatabaseFailureReason(histogram_tag_, + RazeDatabaseFailedReason::kUnknownError); return false; } @@ -1225,7 +1273,23 @@ // file. // The database can still contain old data if the Checkpoint fails so fail the // Raze. - return CheckpointDatabase(); + if (!CheckpointDatabase()) { + RecordRazeDatabaseFailureReason( + histogram_tag_, RazeDatabaseFailedReason::kCheckpointFailed); + return false; + } + + return true; +} + +bool Database::Raze() { + TRACE_EVENT0("sql", "Database::Raze"); + + base::ElapsedTimer raze_timer; + bool result = RazeInternal(); + RecordTimingHistogram("Sql.Database.RazeTime.", raze_timer.Elapsed()); + + return result; } bool Database::RazeAndPoison() { @@ -2356,11 +2420,21 @@ void Database::OnSqliteError(SqliteErrorCode sqlite_error_code, sql::Statement* statement, const char* sql_statement) { - TRACE_EVENT0("sql", "Database::OnSqliteError"); + TRACE_EVENT1("sql", "Database::OnSqliteError", "sqlite_error_code", + sqlite_error_code); DCHECK_NE(statement != nullptr, sql_statement != nullptr) << __func__ << " should either get a Statement or a raw SQL string"; + // Use `base::UmaHistogramSparse` because sqlite result codes aren't + // sequential. The large integers they represent make it so that the + // non-sparse histograms end up with too many buckets. + if (!histogram_tag().empty()) { + base::UmaHistogramSparse( + base::StrCat({"Sql.Database.Statement.Error.", histogram_tag()}), + static_cast<int>(sqlite_error_code)); + } + // Log errors for developers. // // This block is wrapped around a DCHECK_IS_ON() check so we don't waste CPU
diff --git a/sql/database.h b/sql/database.h index 651ac4d..d4b8f0a 100644 --- a/sql/database.h +++ b/sql/database.h
@@ -1006,6 +1006,10 @@ Statement* statement, const char* sql_statement); + // Raze the database to the ground. This is the internal version called by + // Raze(...). + bool RazeInternal(); + // Like Execute(), but returns a SQLite result code. // // This method returns SqliteResultCode::kOk or a SQLite error code. In other
diff --git a/sql/database_unittest.cc b/sql/database_unittest.cc index 84091c38..9f1d898 100644 --- a/sql/database_unittest.cc +++ b/sql/database_unittest.cc
@@ -1009,6 +1009,15 @@ } } +TEST_P(SQLDatabaseTest, RazeFailedOnPoisoned) { + // Poison the database. + db_->Poison(); + + base::HistogramTester tester; + EXPECT_FALSE(db_->Raze()); + tester.ExpectTotalCount("Sql.Database.Raze.FailureReason.Test", 1); +} + TEST_P(SQLDatabaseTest, RazeDuringSelect) { ASSERT_TRUE( db_->Execute("CREATE TABLE rows(id INTEGER PRIMARY KEY NOT NULL)")); @@ -1270,9 +1279,13 @@ // callback will call RazeAndPoison(). Open() will then fail and be // retried. The second Open() on the empty database will succeed // cleanly. - ASSERT_TRUE(db_->Open(db_path_)); - ASSERT_TRUE(db_->Execute("PRAGMA auto_vacuum")); - EXPECT_EQ(0, SqliteSchemaCount(db_.get())); + { + base::HistogramTester tester; + ASSERT_TRUE(db_->Open(db_path_)); + tester.ExpectTotalCount("Sql.Database.RazeTime.Test", 1); + ASSERT_TRUE(db_->Execute("PRAGMA auto_vacuum")); + EXPECT_EQ(0, SqliteSchemaCount(db_.get())); + } } TEST_P(SQLDatabaseTest, RazeAndPoison_DeletesData) { @@ -2562,6 +2575,20 @@ } } +TEST_P(SQLDatabaseTest, StatementErrorHistogram) { + static constexpr char kCreateSql[] = "CREATE TABLE foo (id INTEGER UNIQUE)"; + ASSERT_TRUE(db_->Execute(kCreateSql)); + + sql::test::ScopedErrorExpecter expecter; + expecter.ExpectError(SQLITE_ERROR); + + base::HistogramTester tester; + EXPECT_FALSE(db_->Execute("SELECT invalid_column from foo")); + tester.ExpectUniqueSample("Sql.Database.Statement.Error.Test", + SqliteResultCode::kError, 1); + EXPECT_TRUE(expecter.SawExpectedErrors()); +} + TEST(SQLEmptyPathDatabaseTest, EmptyPathTest) { Database db(test::kTestTag); EXPECT_TRUE(db.OpenInMemory());
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn index f67079de..db606952 100644 --- a/testing/buildbot/filters/BUILD.gn +++ b/testing/buildbot/filters/BUILD.gn
@@ -176,6 +176,15 @@ "{{source_root_relative_dir}}/{{source_file_part}}" ] } +bundle_data("components_browsertests_use_blink_filters_bundle_data") { + testonly = true + sources = [ + "//testing/buildbot/filters/ios.use_blink.components_browsertests.filter", + ] + outputs = [ "{{bundle_resources_dir}}/" + + "{{source_root_relative_dir}}/{{source_file_part}}" ] +} + bundle_data("components_unittests_use_blink_filters_bundle_data") { testonly = true sources =
diff --git a/testing/buildbot/filters/ios.ui_base_unittests.filter b/testing/buildbot/filters/ios.ui_base_unittests.filter index d3c0695..4a67fe7 100644 --- a/testing/buildbot/filters/ios.ui_base_unittests.filter +++ b/testing/buildbot/filters/ios.ui_base_unittests.filter
@@ -4,7 +4,7 @@ -ClipboardTest/PlatformClipboardTest.BitmapWriteAndPngRead_N32_Premul_2x7 # TODO(crbug.com/40276835): A timeout happens on these tests since -# https://ci.chromium.org/ui/p/chromium/builders/ci/ios-blink-rel-fyi/25367/overview +# https://ci.chromium.org/ui/p/chromium/builders/ci/ios-blink-dbg-fyi/25367/overview -ClipboardTest/PlatformClipboardTest.HTMLTest -ClipboardTest/PlatformClipboardTest.MultiFormatTest -ClipboardTest/PlatformClipboardTest.TrickyHTMLTest
diff --git a/testing/buildbot/filters/ios.use_blink.components_browsertests.filter b/testing/buildbot/filters/ios.use_blink.components_browsertests.filter index 69e054a1..003300b 100644 --- a/testing/buildbot/filters/ios.use_blink.components_browsertests.filter +++ b/testing/buildbot/filters/ios.use_blink.components_browsertests.filter
@@ -13,4 +13,14 @@ -DistillerPageWebContentsTest.UsingCurrentWebContentsWrongUrl -DistillerPageWebContentsTest.VisibilityDetection -DomDistillerDistillablePageUtilsTest.TestIsDistillablePage +-DomDistillerDistillablePageUtilsTest.TestIsNotDistillablePage -DomDistillerJsTest.RunJsTests + +# These tests are hitting a NOTREACHED() in WebContentsImpl::GetSize(). +-All/PageContentProtoProviderBrowserTestMultiProcess.* +-All/PageContentProtoProviderBrowserTestSiteIsolation.* +-PageContentProtoProviderBrowserTest.* +-PageContentProtoProviderBrowserTestActionableElements.AIPageContent +-PageContentProtoProviderBrowserTestFencedFrame.AIPageContentFencedFrame +-PageContentProtoProviderBrowserTestPaidContentDisabled.PaidContentDisabled +-ScaledPageContentProtoProviderBrowserTest.ScaleSizes
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 11ffb311..9ff2cb8 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -16919,7 +16919,7 @@ "PartitionAllocSchedulerLoopQuarantineBrowserUICapacity": "1048576", "enabled-processes": "browser-only" }, - "disable_features": [ + "enable_features": [ "PartitionAllocSchedulerLoopQuarantine", "PartitionAllocWithAdvancedChecks", "PartitionAllocZappingByFreeFlags"
diff --git a/third_party/androidx/build.gradle b/third_party/androidx/build.gradle index 619f324..9963ea6 100644 --- a/third_party/androidx/build.gradle +++ b/third_party/androidx/build.gradle
@@ -307,7 +307,7 @@ google() maven { // This URL is generated by the fetch_all_androidx.py script. - url 'https://androidx.dev/snapshots/builds/13649072/artifacts/repository' + url 'https://androidx.dev/snapshots/builds/13650533/artifacts/repository' } mavenCentral() }
diff --git a/third_party/angle b/third_party/angle index 79ec8b3..94ee620 160000 --- a/third_party/angle +++ b/third_party/angle
@@ -1 +1 @@ -Subproject commit 79ec8b3400ceeafc3e69b9bec29fa39a0e1a9a16 +Subproject commit 94ee620d2e2f771d350e14ca90804bf1457834d3
diff --git a/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom b/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom index 70f55b9a..4f446fbb 100644 --- a/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom +++ b/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom
@@ -920,6 +920,10 @@ kCornerRightShape = 861, kCornerBottomShape = 862, kCornerLeftShape = 863, + kCornerBlockStartShape = 864, + kCornerBlockEndShape = 865, + kCornerInlineStartShape = 866, + kCornerInlineEndShape = 867, // 1. Add new features above this line (don't change the assigned numbers of // the existing items).
diff --git a/third_party/blink/renderer/core/css/css_math_expression_node.cc b/third_party/blink/renderer/core/css/css_math_expression_node.cc index dd4c7b3..0630552f 100644 --- a/third_party/blink/renderer/core/css/css_math_expression_node.cc +++ b/third_party/blink/renderer/core/css/css_math_expression_node.cc
@@ -2684,7 +2684,64 @@ return CalculationOperator::kSubtract; case CSSMathOperator::kMultiply: return CalculationOperator::kMultiply; - default: + case CSSMathOperator::kInvert: + return CalculationOperator::kInvert; + case CSSMathOperator::kMin: + return CalculationOperator::kMin; + case CSSMathOperator::kMax: + return CalculationOperator::kMax; + case CSSMathOperator::kClamp: + return CalculationOperator::kClamp; + case CSSMathOperator::kRoundNearest: + return CalculationOperator::kRoundNearest; + case CSSMathOperator::kRoundUp: + return CalculationOperator::kRoundUp; + case CSSMathOperator::kRoundDown: + return CalculationOperator::kRoundDown; + case CSSMathOperator::kRoundToZero: + return CalculationOperator::kRoundToZero; + case CSSMathOperator::kMod: + return CalculationOperator::kMod; + case CSSMathOperator::kRem: + return CalculationOperator::kRem; + case CSSMathOperator::kLog: + return CalculationOperator::kLog; + case CSSMathOperator::kExp: + return CalculationOperator::kExp; + case CSSMathOperator::kSqrt: + return CalculationOperator::kSqrt; + case CSSMathOperator::kHypot: + return CalculationOperator::kHypot; + case CSSMathOperator::kAbs: + return CalculationOperator::kAbs; + case CSSMathOperator::kSign: + return CalculationOperator::kSign; + case CSSMathOperator::kProgress: + return CalculationOperator::kProgress; + case CSSMathOperator::kMediaProgress: + return CalculationOperator::kMediaProgress; + case CSSMathOperator::kContainerProgress: + return CalculationOperator::kContainerProgress; + case CSSMathOperator::kCalcSize: + return CalculationOperator::kCalcSize; + case CSSMathOperator::kSin: + return CalculationOperator::kSin; + case CSSMathOperator::kCos: + return CalculationOperator::kCos; + case CSSMathOperator::kTan: + return CalculationOperator::kTan; + case CSSMathOperator::kAsin: + return CalculationOperator::kAsin; + case CSSMathOperator::kAcos: + return CalculationOperator::kAcos; + case CSSMathOperator::kAtan: + return CalculationOperator::kAtan; + case CSSMathOperator::kAtan2: + return CalculationOperator::kAtan2; + case CSSMathOperator::kPow: + return CalculationOperator::kPow; + case CSSMathOperator::kDivide: + case CSSMathOperator::kInvalid: NOTREACHED(); } } @@ -2694,156 +2751,19 @@ const CalculationExpressionNode* CSSMathExpressionOperation::ToCalculationExpression( const CSSLengthResolver& length_resolver) const { + CalculationOperator op = ConvertOperator(operator_); + HeapVector<Member<const CalculationExpressionNode>> operands; + operands.reserve(operands_.size()); + for (const CSSMathExpressionNode* operand : operands_) { + operands.push_back(operand->ToCalculationExpression(length_resolver)); + } if (IsArithmeticOperation() && !ArithmeticOperationIsAllowedToBeSimplified(*this)) { - if (operator_ == CSSMathOperator::kInvert) { - return MakeGarbageCollected<CalculationExpressionOperationNode>( - CalculationExpressionOperationNode::Children( - {operands_[0]->ToCalculationExpression(length_resolver)}), - CalculationOperator::kInvert); - } - CalculationOperator op = ConvertOperator(operator_); return MakeGarbageCollected<CalculationExpressionOperationNode>( - CalculationExpressionOperationNode::Children( - {operands_[0]->ToCalculationExpression(length_resolver), - operands_[1]->ToCalculationExpression(length_resolver)}), - op); + std::move(operands), op); } - switch (operator_) { - case CSSMathOperator::kAdd: - DCHECK_EQ(operands_.size(), 2u); - return CalculationExpressionOperationNode::CreateSimplified( - CalculationExpressionOperationNode::Children( - {operands_[0]->ToCalculationExpression(length_resolver), - operands_[1]->ToCalculationExpression(length_resolver)}), - CalculationOperator::kAdd); - case CSSMathOperator::kSubtract: - DCHECK_EQ(operands_.size(), 2u); - return CalculationExpressionOperationNode::CreateSimplified( - CalculationExpressionOperationNode::Children( - {operands_[0]->ToCalculationExpression(length_resolver), - operands_[1]->ToCalculationExpression(length_resolver)}), - CalculationOperator::kSubtract); - case CSSMathOperator::kMultiply: - DCHECK_EQ(operands_.size(), 2u); - return CalculationExpressionOperationNode::CreateSimplified( - {operands_.front()->ToCalculationExpression(length_resolver), - operands_.back()->ToCalculationExpression(length_resolver)}, - CalculationOperator::kMultiply); - case CSSMathOperator::kInvert: - DCHECK_EQ(operands_.size(), 1u); - return CalculationExpressionOperationNode::CreateSimplified( - {operands_[0]->ToCalculationExpression(length_resolver)}, - CalculationOperator::kInvert); - case CSSMathOperator::kMin: - case CSSMathOperator::kMax: { - HeapVector<Member<const CalculationExpressionNode>> operands; - operands.reserve(operands_.size()); - for (const CSSMathExpressionNode* operand : operands_) { - operands.push_back(operand->ToCalculationExpression(length_resolver)); - } - auto expression_operator = operator_ == CSSMathOperator::kMin - ? CalculationOperator::kMin - : CalculationOperator::kMax; - return CalculationExpressionOperationNode::CreateSimplified( - std::move(operands), expression_operator); - } - case CSSMathOperator::kClamp: { - HeapVector<Member<const CalculationExpressionNode>> operands; - operands.reserve(operands_.size()); - for (const CSSMathExpressionNode* operand : operands_) { - operands.push_back(operand->ToCalculationExpression(length_resolver)); - } - return CalculationExpressionOperationNode::CreateSimplified( - std::move(operands), CalculationOperator::kClamp); - } - case CSSMathOperator::kRoundNearest: - case CSSMathOperator::kRoundUp: - case CSSMathOperator::kRoundDown: - case CSSMathOperator::kRoundToZero: - case CSSMathOperator::kMod: - case CSSMathOperator::kRem: - case CSSMathOperator::kLog: - case CSSMathOperator::kExp: - case CSSMathOperator::kSqrt: - case CSSMathOperator::kHypot: - case CSSMathOperator::kAbs: - case CSSMathOperator::kSign: - case CSSMathOperator::kProgress: - case CSSMathOperator::kMediaProgress: - case CSSMathOperator::kContainerProgress: - case CSSMathOperator::kCalcSize: - case CSSMathOperator::kSin: - case CSSMathOperator::kCos: - case CSSMathOperator::kTan: - case CSSMathOperator::kAsin: - case CSSMathOperator::kAcos: - case CSSMathOperator::kAtan: - case CSSMathOperator::kAtan2: - case CSSMathOperator::kPow: { - HeapVector<Member<const CalculationExpressionNode>> operands; - operands.reserve(operands_.size()); - for (const CSSMathExpressionNode* operand : operands_) { - operands.push_back(operand->ToCalculationExpression(length_resolver)); - } - CalculationOperator op; - if (operator_ == CSSMathOperator::kRoundNearest) { - op = CalculationOperator::kRoundNearest; - } else if (operator_ == CSSMathOperator::kRoundUp) { - op = CalculationOperator::kRoundUp; - } else if (operator_ == CSSMathOperator::kRoundDown) { - op = CalculationOperator::kRoundDown; - } else if (operator_ == CSSMathOperator::kRoundToZero) { - op = CalculationOperator::kRoundToZero; - } else if (operator_ == CSSMathOperator::kMod) { - op = CalculationOperator::kMod; - } else if (operator_ == CSSMathOperator::kRem) { - op = CalculationOperator::kRem; - } else if (operator_ == CSSMathOperator::kLog) { - op = CalculationOperator::kLog; - } else if (operator_ == CSSMathOperator::kExp) { - op = CalculationOperator::kExp; - } else if (operator_ == CSSMathOperator::kSqrt) { - op = CalculationOperator::kSqrt; - } else if (operator_ == CSSMathOperator::kHypot) { - op = CalculationOperator::kHypot; - } else if (operator_ == CSSMathOperator::kAbs) { - op = CalculationOperator::kAbs; - } else if (operator_ == CSSMathOperator::kSign) { - op = CalculationOperator::kSign; - } else if (operator_ == CSSMathOperator::kProgress) { - op = CalculationOperator::kProgress; - } else if (operator_ == CSSMathOperator::kMediaProgress) { - op = CalculationOperator::kMediaProgress; - } else if (operator_ == CSSMathOperator::kContainerProgress) { - op = CalculationOperator::kContainerProgress; - } else if (operator_ == CSSMathOperator::kPow) { - op = CalculationOperator::kPow; - } else if (operator_ == CSSMathOperator::kSin) { - op = CalculationOperator::kSin; - } else if (operator_ == CSSMathOperator::kCos) { - op = CalculationOperator::kCos; - } else if (operator_ == CSSMathOperator::kTan) { - op = CalculationOperator::kTan; - } else if (operator_ == CSSMathOperator::kAsin) { - op = CalculationOperator::kAsin; - } else if (operator_ == CSSMathOperator::kAcos) { - op = CalculationOperator::kAcos; - } else if (operator_ == CSSMathOperator::kAtan) { - op = CalculationOperator::kAtan; - } else if (operator_ == CSSMathOperator::kAtan2) { - op = CalculationOperator::kAtan2; - } else { - CHECK(operator_ == CSSMathOperator::kCalcSize); - op = CalculationOperator::kCalcSize; - } - return CalculationExpressionOperationNode::CreateSimplified( - std::move(operands), op); - } - case CSSMathOperator::kDivide: - case CSSMathOperator::kInvalid: - NOTREACHED(); - } + return CalculationExpressionOperationNode::CreateSimplified( + std::move(operands), op); } double CSSMathExpressionOperation::DoubleValue() const {
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5 index 9d44c4bd..31e4756 100644 --- a/third_party/blink/renderer/core/css/css_properties.json5 +++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -8494,6 +8494,38 @@ valid_for_page_context: true, }, { + name: "corner-block-start-shape", + property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"], + longhands: ["corner-start-start-shape", "corner-start-end-shape"], + runtime_flag: "CSSCornerShape", + valid_for_permission_element: true, + valid_for_page_context: true, + }, + { + name: "corner-block-end-shape", + property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"], + longhands: ["corner-end-start-shape", "corner-end-end-shape"], + runtime_flag: "CSSCornerShape", + valid_for_permission_element: true, + valid_for_page_context: true, + }, + { + name: "corner-inline-start-shape", + property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"], + longhands: ["corner-start-start-shape", "corner-end-start-shape"], + runtime_flag: "CSSCornerShape", + valid_for_permission_element: true, + valid_for_page_context: true, + }, + { + name: "corner-inline-end-shape", + property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"], + longhands: ["corner-start-end-shape", "corner-end-end-shape"], + runtime_flag: "CSSCornerShape", + valid_for_permission_element: true, + valid_for_page_context: true, + }, + { name: "corner-shape", longhands: [ "corner-top-left-shape", "corner-top-right-shape",
diff --git a/third_party/blink/renderer/core/css/css_property_equality.cc b/third_party/blink/renderer/core/css/css_property_equality.cc index ec4ca7a4..6a4fd37 100644 --- a/third_party/blink/renderer/core/css/css_property_equality.cc +++ b/third_party/blink/renderer/core/css/css_property_equality.cc
@@ -1265,6 +1265,10 @@ case CSSPropertyID::kCornerRightShape: case CSSPropertyID::kCornerBottomShape: case CSSPropertyID::kCornerLeftShape: + case CSSPropertyID::kCornerInlineStartShape: + case CSSPropertyID::kCornerInlineEndShape: + case CSSPropertyID::kCornerBlockStartShape: + case CSSPropertyID::kCornerBlockEndShape: case CSSPropertyID::kInset: case CSSPropertyID::kInterestTargetDelay: case CSSPropertyID::kFlex:
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc index 8b25a06..f0bcdf5 100644 --- a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc +++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
@@ -2700,7 +2700,8 @@ } CSSValue* ComputedStyleUtils::ValueForAnimationTimeline( - const StyleTimeline& timeline) { + const StyleTimeline& timeline, + const ComputedStyle& style) { if (timeline.IsKeyword()) { DCHECK(timeline.GetKeyword() == CSSValueID::kAuto || timeline.GetKeyword() == CSSValueID::kNone); @@ -2722,13 +2723,14 @@ CSSValue* axis = view_data.HasDefaultAxis() ? nullptr : CSSIdentifierValue::Create(view_data.GetAxis()); - auto* inset = - view_data.HasDefaultInset() - ? nullptr - : MakeGarbageCollected<CSSValuePair>( - CSSValue::Create(view_data.GetInset().GetStart(), 1), - CSSValue::Create(view_data.GetInset().GetEnd(), 1), - CSSValuePair::kDropIdenticalValues); + auto* inset = view_data.HasDefaultInset() + ? nullptr + : MakeGarbageCollected<CSSValuePair>( + CSSValue::Create(view_data.GetInset().GetStart(), + style.EffectiveZoom()), + CSSValue::Create(view_data.GetInset().GetEnd(), + style.EffectiveZoom()), + CSSValuePair::kDropIdenticalValues); return MakeGarbageCollected<cssvalue::CSSViewValue>(axis, inset); } DCHECK(timeline.IsScroll()); @@ -2745,12 +2747,13 @@ } CSSValue* ComputedStyleUtils::ValueForAnimationTimelineList( - const CSSAnimationData* animation_data) { + const CSSAnimationData* animation_data, + const ComputedStyle& style) { return CreateAnimationValueList( animation_data ? animation_data->TimelineList() : Vector<StyleTimeline>{CSSAnimationData::InitialTimeline()}, - &ValueForAnimationTimeline); + &ValueForAnimationTimeline, style); } CSSValue* ComputedStyleUtils::ValueForTimelineInset( @@ -2796,12 +2799,13 @@ } CSSValue* ComputedStyleUtils::ValueForAnimationTriggerTimelineList( - const CSSAnimationData* animation_data) { + const CSSAnimationData* animation_data, + const ComputedStyle& style) { return CreateAnimationValueList( animation_data ? animation_data->TriggerTimelineList() : Vector<StyleTimeline>{CSSAnimationData::InitialTriggerTimeline()}, - &ValueForAnimationTimeline); + &ValueForAnimationTimeline, style); } CSSValueList* ComputedStyleUtils::ValuesForBorderRadiusCorner( @@ -2884,12 +2888,15 @@ } CSSValueList* ComputedStyleUtils::ValueForCornerShapeEdgeShorthand( - Superellipse a, - Superellipse b) { + const StylePropertyShorthand& shorthand, + const ComputedStyle& style) { CSSValueList* list = CSSValueList::CreateSpaceSeparated(); - list->Append(*ValueForCornerShape(a)); - if (a != b) { - list->Append(*ValueForCornerShape(b)); + const CSSValue* a = ComputedPropertyValue(*shorthand.properties()[0], style); + const CSSValue* b = + ComputedPropertyValue(*(shorthand.properties()[1]), style); + list->Append(*a); + if (*a != *b) { + list->Append(*b); } return list; }
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.h b/third_party/blink/renderer/core/css/properties/computed_style_utils.h index ea51c46a..1869f49 100644 --- a/third_party/blink/renderer/core/css/properties/computed_style_utils.h +++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.h
@@ -190,7 +190,8 @@ const Length& default_offset); static CSSValue* ValueForAnimationTimingFunction( const scoped_refptr<TimingFunction>&); - static CSSValue* ValueForAnimationTimeline(const StyleTimeline&); + static CSSValue* ValueForAnimationTimeline(const StyleTimeline&, + const ComputedStyle&); static CSSValue* ValueForAnimationDelayList(const CSSTimingData*); static CSSValue* ValueForAnimationDirectionList(const CSSAnimationData*); @@ -209,7 +210,8 @@ static CSSValue* ValueForAnimationRangeEndList(const CSSAnimationData*, const ComputedStyle&); static CSSValue* ValueForAnimationTimingFunctionList(const CSSTimingData*); - static CSSValue* ValueForAnimationTimelineList(const CSSAnimationData*); + static CSSValue* ValueForAnimationTimelineList(const CSSAnimationData*, + const ComputedStyle&); static CSSValue* ValueForTimelineInset(const TimelineInset&, const ComputedStyle&); @@ -240,15 +242,16 @@ const ComputedStyle& style); static CSSValue* ValueForAnimationTriggerType(const EAnimationTriggerType); static CSSValue* ValueForAnimationTriggerTypeList(const CSSAnimationData*); - static CSSValue* ValueForAnimationTriggerTimelineList( - const CSSAnimationData*); + static CSSValue* ValueForAnimationTriggerTimelineList(const CSSAnimationData*, + const ComputedStyle&); static CSSValueList* ValuesForBorderRadiusCorner(const LengthSize&, const ComputedStyle&); static CSSValue* ValueForBorderRadiusCorner(const LengthSize&, const ComputedStyle&); static CSSValue* ValueForCornerShape(const Superellipse&); - static CSSValueList* ValueForCornerShapeEdgeShorthand(Superellipse a, - Superellipse b); + static CSSValueList* ValueForCornerShapeEdgeShorthand( + const StylePropertyShorthand&, + const ComputedStyle&); // Serializes a gfx::Transform into a matrix() or matrix3d() transform // function value. If force_matrix3d is true, it will always give a matrix3d
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc index d1c323b41..d8cac23 100644 --- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc +++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -7991,46 +7991,6 @@ return true; } -bool ConsumeCornerShapes(std::array<CSSValue*, 4>& shapes, - CSSParserTokenStream& stream, - const CSSParserContext& context) { - for (unsigned value_count = 0; value_count < 4; ++value_count) { - shapes[value_count] = ConsumeCornerShape(stream, context); - if (!shapes[value_count]) { - if (!value_count) { - return false; - } - break; - } - } - - Complete4Sides(shapes); - return true; -} - -bool ConsumeEdgeCornerShapes(bool important, - CSSParserTokenStream& stream, - const CSSParserContext& context, - const StylePropertyShorthand& shorthand, - HeapVector<CSSPropertyValue, 64>& properties) { - CSSValue* first_shape = ConsumeCornerShape(stream, context); - if (!first_shape) { - return false; - } - - CSSValue* second_shape = ConsumeCornerShape(stream, context); - css_parsing_utils::AddProperty( - shorthand.properties()[0]->PropertyID(), shorthand.id(), *first_shape, - important, css_parsing_utils::IsImplicitProperty::kNotImplicit, - properties); - css_parsing_utils::AddProperty( - shorthand.properties()[1]->PropertyID(), shorthand.id(), - *(second_shape ? second_shape : first_shape), important, - css_parsing_utils::IsImplicitProperty::kNotImplicit, properties); - - return true; -} - CSSValue* ConsumeBasicShape(CSSParserTokenStream& stream, const CSSParserContext& context, AllowPathValue allow_path,
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.h b/third_party/blink/renderer/core/css/properties/css_parsing_utils.h index 84ad209..2ee447ea 100644 --- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.h +++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.h
@@ -608,14 +608,6 @@ CSSParserTokenStream& stream, const CSSParserContext& context, bool use_legacy_parsing); -bool ConsumeCornerShapes(std::array<CSSValue*, 4>& shapes, - CSSParserTokenStream& stream, - const CSSParserContext& context); -bool ConsumeEdgeCornerShapes(bool important, - CSSParserTokenStream& stream, - const CSSParserContext& context, - const StylePropertyShorthand&, - HeapVector<CSSPropertyValue, 64>& properties); CSSValue* ConsumeTextDecorationLine(CSSParserTokenStream&); CSSValue* ConsumeTextBoxEdge(CSSParserTokenStream&);
diff --git a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc index d2f466f..70443bd 100644 --- a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc +++ b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
@@ -604,7 +604,8 @@ const LayoutObject*, bool allow_visited_style, CSSValuePhase value_phase) const { - return ComputedStyleUtils::ValueForAnimationTimelineList(style.Animations()); + return ComputedStyleUtils::ValueForAnimationTimelineList(style.Animations(), + style); } const CSSValue* AnimationTimeline::InitialValue() const { @@ -760,7 +761,7 @@ bool allow_visited_style, CSSValuePhase value_phase) const { return ComputedStyleUtils::ValueForAnimationTriggerTimelineList( - style.Animations()); + style.Animations(), style); } const CSSValue* AnimationTriggerTimeline::InitialValue() const {
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc index 7392607..3fde650 100644 --- a/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc +++ b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
@@ -427,7 +427,7 @@ for (wtf_size_t i = 0; i < animation_data->NameList().size(); ++i) { CSSValueList* list = CSSValueList::CreateSpaceSeparated(); list->Append(*ComputedStyleUtils::ValueForAnimationTimeline( - animation_data->TriggerTimelineList().at(i))); + animation_data->TriggerTimelineList().at(i), style)); list->Append(*ComputedStyleUtils::ValueForAnimationTriggerType( animation_data->TriggerTypeList().at(i))); list->Append(*ComputedStyleUtils::ValueForAnimationRange( @@ -449,7 +449,7 @@ CSSValueList* list = CSSValueList::CreateSpaceSeparated(); list->Append(*ComputedStyleUtils::ValueForAnimationTimeline( - CSSAnimationData::InitialTriggerTimeline())); + CSSAnimationData::InitialTriggerTimeline(), style)); list->Append(*ComputedStyleUtils::ValueForAnimationTriggerType( CSSAnimationData::InitialTriggerType())); list->Append(*ComputedStyleUtils::ValueForAnimationRange( @@ -1385,29 +1385,8 @@ const CSSParserContext& context, const CSSParserLocalContext& local_context, HeapVector<CSSPropertyValue, 64>& properties) const { - std::array<CSSValue*, 4> shapes = {nullptr}; - - if (!css_parsing_utils::ConsumeCornerShapes(shapes, stream, context)) { - return false; - } - - css_parsing_utils::AddProperty( - CSSPropertyID::kCornerTopLeftShape, CSSPropertyID::kCornerShape, - *shapes[0], important, - css_parsing_utils::IsImplicitProperty::kNotImplicit, properties); - css_parsing_utils::AddProperty( - CSSPropertyID::kCornerTopRightShape, CSSPropertyID::kCornerShape, - *shapes[1], important, - css_parsing_utils::IsImplicitProperty::kNotImplicit, properties); - css_parsing_utils::AddProperty( - CSSPropertyID::kCornerBottomRightShape, CSSPropertyID::kCornerShape, - *shapes[2], important, - css_parsing_utils::IsImplicitProperty::kNotImplicit, properties); - css_parsing_utils::AddProperty( - CSSPropertyID::kCornerBottomLeftShape, CSSPropertyID::kCornerShape, - *shapes[3], important, - css_parsing_utils::IsImplicitProperty::kNotImplicit, properties); - return true; + return css_parsing_utils::ConsumeShorthandVia4Longhands( + cornerShapeShorthand(), important, context, stream, properties); } const CSSValue* CornerShape::CSSValueFromComputedStyleInternal( @@ -1424,8 +1403,8 @@ const CSSParserContext& context, const CSSParserLocalContext& local_context, HeapVector<CSSPropertyValue, 64>& properties) const { - return css_parsing_utils::ConsumeEdgeCornerShapes( - important, stream, context, cornerTopShapeShorthand(), properties); + return css_parsing_utils::ConsumeShorthandVia2Longhands( + cornerTopShapeShorthand(), important, context, stream, properties); } bool CornerRightShape::ParseShorthand( @@ -1434,8 +1413,8 @@ const CSSParserContext& context, const CSSParserLocalContext& local_context, HeapVector<CSSPropertyValue, 64>& properties) const { - return css_parsing_utils::ConsumeEdgeCornerShapes( - important, stream, context, cornerRightShapeShorthand(), properties); + return css_parsing_utils::ConsumeShorthandVia2Longhands( + cornerRightShapeShorthand(), important, context, stream, properties); } bool CornerLeftShape::ParseShorthand( @@ -1444,8 +1423,8 @@ const CSSParserContext& context, const CSSParserLocalContext& local_context, HeapVector<CSSPropertyValue, 64>& properties) const { - return css_parsing_utils::ConsumeEdgeCornerShapes( - important, stream, context, cornerLeftShapeShorthand(), properties); + return css_parsing_utils::ConsumeShorthandVia2Longhands( + cornerLeftShapeShorthand(), important, context, stream, properties); } bool CornerBottomShape::ParseShorthand( @@ -1454,8 +1433,49 @@ const CSSParserContext& context, const CSSParserLocalContext& local_context, HeapVector<CSSPropertyValue, 64>& properties) const { - return css_parsing_utils::ConsumeEdgeCornerShapes( - important, stream, context, cornerBottomShapeShorthand(), properties); + return css_parsing_utils::ConsumeShorthandVia2Longhands( + cornerBottomShapeShorthand(), important, context, stream, properties); +} + +bool CornerBlockStartShape::ParseShorthand( + bool important, + CSSParserTokenStream& stream, + const CSSParserContext& context, + const CSSParserLocalContext& local_context, + HeapVector<CSSPropertyValue, 64>& properties) const { + return css_parsing_utils::ConsumeShorthandVia2Longhands( + cornerBlockStartShapeShorthand(), important, context, stream, properties); +} + +bool CornerBlockEndShape::ParseShorthand( + bool important, + CSSParserTokenStream& stream, + const CSSParserContext& context, + const CSSParserLocalContext& local_context, + HeapVector<CSSPropertyValue, 64>& properties) const { + return css_parsing_utils::ConsumeShorthandVia2Longhands( + cornerBlockEndShapeShorthand(), important, context, stream, properties); +} + +bool CornerInlineStartShape::ParseShorthand( + bool important, + CSSParserTokenStream& stream, + const CSSParserContext& context, + const CSSParserLocalContext& local_context, + HeapVector<CSSPropertyValue, 64>& properties) const { + return css_parsing_utils::ConsumeShorthandVia2Longhands( + cornerInlineStartShapeShorthand(), important, context, stream, + properties); +} + +bool CornerInlineEndShape::ParseShorthand( + bool important, + CSSParserTokenStream& stream, + const CSSParserContext& context, + const CSSParserLocalContext& local_context, + HeapVector<CSSPropertyValue, 64>& properties) const { + return css_parsing_utils::ConsumeShorthandVia2Longhands( + cornerInlineEndShapeShorthand(), important, context, stream, properties); } const CSSValue* CornerTopShape::CSSValueFromComputedStyleInternal( @@ -1464,7 +1484,7 @@ bool allow_visited_style, CSSValuePhase value_phase) const { return ComputedStyleUtils::ValueForCornerShapeEdgeShorthand( - style.CornerTopLeftShape(), style.CornerTopRightShape()); + cornerTopShapeShorthand(), style); } const CSSValue* CornerRightShape::CSSValueFromComputedStyleInternal( @@ -1473,7 +1493,7 @@ bool allow_visited_style, CSSValuePhase value_phase) const { return ComputedStyleUtils::ValueForCornerShapeEdgeShorthand( - style.CornerTopRightShape(), style.CornerBottomRightShape()); + cornerRightShapeShorthand(), style); } const CSSValue* CornerBottomShape::CSSValueFromComputedStyleInternal( @@ -1482,7 +1502,7 @@ bool allow_visited_style, CSSValuePhase value_phase) const { return ComputedStyleUtils::ValueForCornerShapeEdgeShorthand( - style.CornerBottomLeftShape(), style.CornerBottomRightShape()); + cornerBottomShapeShorthand(), style); } const CSSValue* CornerLeftShape::CSSValueFromComputedStyleInternal( @@ -1491,7 +1511,43 @@ bool allow_visited_style, CSSValuePhase value_phase) const { return ComputedStyleUtils::ValueForCornerShapeEdgeShorthand( - style.CornerTopLeftShape(), style.CornerBottomLeftShape()); + cornerLeftShapeShorthand(), style); +} + +const CSSValue* CornerBlockStartShape::CSSValueFromComputedStyleInternal( + const ComputedStyle& style, + const LayoutObject*, + bool allow_visited_style, + CSSValuePhase value_phase) const { + return ComputedStyleUtils::ValueForCornerShapeEdgeShorthand( + cornerBlockStartShapeShorthand(), style); +} + +const CSSValue* CornerBlockEndShape::CSSValueFromComputedStyleInternal( + const ComputedStyle& style, + const LayoutObject*, + bool allow_visited_style, + CSSValuePhase value_phase) const { + return ComputedStyleUtils::ValueForCornerShapeEdgeShorthand( + cornerBlockEndShapeShorthand(), style); +} + +const CSSValue* CornerInlineStartShape::CSSValueFromComputedStyleInternal( + const ComputedStyle& style, + const LayoutObject*, + bool allow_visited_style, + CSSValuePhase value_phase) const { + return ComputedStyleUtils::ValueForCornerShapeEdgeShorthand( + cornerInlineStartShapeShorthand(), style); +} + +const CSSValue* CornerInlineEndShape::CSSValueFromComputedStyleInternal( + const ComputedStyle& style, + const LayoutObject*, + bool allow_visited_style, + CSSValuePhase value_phase) const { + return ComputedStyleUtils::ValueForCornerShapeEdgeShorthand( + cornerInlineEndShapeShorthand(), style); } bool Flex::ParseShorthand(bool important,
diff --git a/third_party/blink/renderer/core/css/rule_set.cc b/third_party/blink/renderer/core/css/rule_set.cc index 5221dd6a..d4d97c8 100644 --- a/third_party/blink/renderer/core/css/rule_set.cc +++ b/third_party/blink/renderer/core/css/rule_set.cc
@@ -574,6 +574,34 @@ picker_name, pseudo_type); // Prefer rule sets in order of most likely to apply infrequently. + + // NOTE: For ::part:focus and similar, we need to go into the ::part bucket + // (see below). This isn't a problem for #id::part and similar, since there is + // a hidden combinator that stops ExtractBestSelectorValues() before it finds + // the #id. + if (part_name.empty()) { + if (pseudo_type == CSSSelector::kPseudoFocus) { + if (bucket_coverage == BucketCoverage::kCompute) { + MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) { + return selector.Match() == CSSSelector::kPseudoClass && + selector.GetPseudoType() == CSSSelector::kPseudoFocus; + }); + } + AddToRuleSet(focus_pseudo_class_rules_, rule_data); + return; + } + if (pseudo_type == CSSSelector::kPseudoFocusVisible) { + if (bucket_coverage == BucketCoverage::kCompute) { + MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) { + return selector.Match() == CSSSelector::kPseudoClass && + selector.GetPseudoType() == CSSSelector::kPseudoFocusVisible; + }); + } + AddToRuleSet(focus_visible_pseudo_class_rules_, rule_data); + return; + } + } + if (!id.empty()) { if (bucket_coverage == BucketCoverage::kCompute) { MarkAsCoveredByBucketing(component, [&id](const CSSSelector& selector) { @@ -714,26 +742,13 @@ AddToRuleSet(link_pseudo_class_rules_, rule_data); return; case CSSSelector::kPseudoFocus: - if (bucket_coverage == BucketCoverage::kCompute) { - MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) { - return selector.Match() == CSSSelector::kPseudoClass && - selector.GetPseudoType() == CSSSelector::kPseudoFocus; - }); - } - AddToRuleSet(focus_pseudo_class_rules_, rule_data); + case CSSSelector::kPseudoFocusVisible: + // Was handled above. + NOTREACHED(); return; case CSSSelector::kPseudoSelectorFragmentAnchor: AddToRuleSet(selector_fragment_anchor_rules_, rule_data); return; - case CSSSelector::kPseudoFocusVisible: - if (bucket_coverage == BucketCoverage::kCompute) { - MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) { - return selector.Match() == CSSSelector::kPseudoClass && - selector.GetPseudoType() == CSSSelector::kPseudoFocusVisible; - }); - } - AddToRuleSet(focus_visible_pseudo_class_rules_, rule_data); - return; case CSSSelector::kPseudoHost: case CSSSelector::kPseudoHostContext: AddToRuleSet(shadow_host_rules_, rule_data);
diff --git a/third_party/blink/renderer/core/css/rule_set_test.cc b/third_party/blink/renderer/core/css/rule_set_test.cc index e275dbb..da0af73 100644 --- a/third_party/blink/renderer/core/css/rule_set_test.cc +++ b/third_party/blink/renderer/core/css/rule_set_test.cc
@@ -264,8 +264,8 @@ sheet.AddCSSRules(":focus { }"); sheet.AddCSSRules("[attr]:focus { }"); RuleSet& rule_set = sheet.GetRuleSet(); - ASSERT_EQ(1u, rule_set.FocusPseudoClassRules().size()); - ASSERT_EQ(1u, rule_set.AttrRules(AtomicString("attr")).size()); + ASSERT_EQ(2u, rule_set.FocusPseudoClassRules().size()); + ASSERT_EQ(0u, rule_set.AttrRules(AtomicString("attr")).size()); } TEST(RuleSetTest, findBestRuleSetAndAdd_LinkVisited) { @@ -312,7 +312,7 @@ test::TaskEnvironment task_environment; css_test_helpers::TestStyleSheet sheet; - sheet.AddCSSRules("::part(dummy):focus, #id::part(dummy) { }"); + sheet.AddCSSRules("::part(dummy):disabled, #id::part(dummy) { }"); RuleSet& rule_set = sheet.GetRuleSet(); const base::span<const RuleData> rules = rule_set.PartPseudoRules(); ASSERT_EQ(2u, rules.size());
diff --git a/third_party/blink/renderer/core/css/style_property_serializer.cc b/third_party/blink/renderer/core/css/style_property_serializer.cc index 67a12273..1743765 100644 --- a/third_party/blink/renderer/core/css/style_property_serializer.cc +++ b/third_party/blink/renderer/core/css/style_property_serializer.cc
@@ -710,6 +710,14 @@ return Get2Values(cornerBottomShapeShorthand()); case CSSPropertyID::kCornerLeftShape: return Get2Values(cornerLeftShapeShorthand()); + case CSSPropertyID::kCornerBlockStartShape: + return Get2Values(cornerBlockStartShapeShorthand()); + case CSSPropertyID::kCornerBlockEndShape: + return Get2Values(cornerBlockEndShapeShorthand()); + case CSSPropertyID::kCornerInlineStartShape: + return Get2Values(cornerInlineStartShapeShorthand()); + case CSSPropertyID::kCornerInlineEndShape: + return Get2Values(cornerInlineEndShapeShorthand()); case CSSPropertyID::kScrollPadding: return Get4Values(scrollPaddingShorthand()); case CSSPropertyID::kScrollPaddingBlock:
diff --git a/third_party/blink/renderer/core/editing/text_offset_mapping.cc b/third_party/blink/renderer/core/editing/text_offset_mapping.cc index c450df8..b6ef095 100644 --- a/third_party/blink/renderer/core/editing/text_offset_mapping.cc +++ b/third_party/blink/renderer/core/editing/text_offset_mapping.cc
@@ -240,9 +240,7 @@ // If the node is inside a User agent Shadow root and the block_flow // is anonymous and outside the shadow root we should pass // node as Shadow host and get the layout object from that. - if (RuntimeEnabledFeatures:: - NodeInUAShadowRootUnderAnonymousBlockFlowEnabled() && - node.IsInUserAgentShadowRoot() && block_flow->IsAnonymous()) { + if (node.IsInUserAgentShadowRoot() && block_flow->IsAnonymous()) { return CreateInlineContentsFromBlockFlow( *block_flow, *(node.OwnerShadowHost()->GetLayoutObject())); }
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_performance_monitor.cc b/third_party/blink/renderer/core/html/canvas/canvas_performance_monitor.cc index 0bd8525..ca47a117 100644 --- a/third_party/blink/renderer/core/html/canvas/canvas_performance_monitor.cc +++ b/third_party/blink/renderer/core/html/canvas/canvas_performance_monitor.cc
@@ -54,7 +54,9 @@ explicit RenderingContextDescriptionCodec(const uint32_t& key); bool IsOffscreen() const { return key_.get<IsOffscreenField>(); } - bool IsAccelerated() const { return key_.get<IsAcceleratedField>(); } + bool IsAcceleratedCanvas2D() const { + return key_.get<IsAcceleratedCanvas2DField>(); + } CanvasRenderingContext::CanvasRenderingAPI GetRenderingAPI() const; uint32_t GetKey() const { return key_.bits(); } bool IsValid() const { return is_valid_; } @@ -65,8 +67,9 @@ private: using Key = WTF::SingleThreadedBitField<uint32_t>; using IsOffscreenField = Key::DefineFirstValue<bool, 1>; - using IsAcceleratedField = IsOffscreenField::DefineNextValue<bool, 1>; - using RenderingAPIField = IsAcceleratedField::DefineNextValue<uint32_t, 8>; + using IsAcceleratedCanvas2DField = IsOffscreenField::DefineNextValue<bool, 1>; + using RenderingAPIField = + IsAcceleratedCanvas2DField::DefineNextValue<uint32_t, 8>; using PaddingField = RenderingAPIField::DefineNextValue<bool, 1>; Key key_; @@ -80,8 +83,11 @@ return; key_.set<IsOffscreenField>(context->Host()->IsOffscreenCanvas()); - key_.set<IsAcceleratedField>(context->Host()->GetRasterMode() == - blink::RasterMode::kGPU); + if (context->GetRenderingAPI() == + CanvasRenderingContext::CanvasRenderingAPI::k2D) { + key_.set<IsAcceleratedCanvas2DField>(context->Host()->GetRasterMode() == + blink::RasterMode::kGPU); + } key_.set<RenderingAPIField>( static_cast<uint32_t>(context->GetRenderingAPI())); // The padding field ensures at least one bit is set in the key in order @@ -106,8 +112,8 @@ const char* RenderingContextDescriptionCodec::GetRenderingAPIName() const { switch (GetRenderingAPI()) { case CanvasRenderingContext::CanvasRenderingAPI::k2D: - return IsAccelerated() ? kRenderingAPIName_2D_Accelerated - : kRenderingAPIName_2D_Unaccelerated; + return IsAcceleratedCanvas2D() ? kRenderingAPIName_2D_Accelerated + : kRenderingAPIName_2D_Unaccelerated; case CanvasRenderingContext::CanvasRenderingAPI::kWebgl: return kRenderingAPIName_WebGL; case CanvasRenderingContext::CanvasRenderingAPI::kWebgl2:
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.h b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.h index de196c4..491ef06 100644 --- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.h +++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.h
@@ -139,15 +139,15 @@ CanvasResourceProvider* GetResourceProviderForWebGL() const { CHECK(IsWebGL()); - return ResourceProviderDEPRECATED(); + return GetResourceProviderWithoutContextCheck(); } CanvasResourceProvider* GetResourceProviderForWebGPU() const { CHECK(IsWebGPU()); - return ResourceProviderDEPRECATED(); + return GetResourceProviderWithoutContextCheck(); } CanvasResourceProvider* GetResourceProviderForCanvas2D() const override { CHECK(IsRenderingContext2D()); - return ResourceProviderDEPRECATED(); + return GetResourceProviderWithoutContextCheck(); } void FlushRecordingForCanvas2D(FlushReason reason);
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 e0395e6..b4a4957c 100644 --- a/third_party/blink/renderer/core/layout/layout_block_flow.cc +++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -342,17 +342,6 @@ prev = sibling; } } - } else if (!prev && next && IsA<LayoutBlockFlow>(next) && - GetDocument().GetStyleEngine().UsesFirstLineRules() && - Style() != FirstLineStyle() && - To<LayoutBlockFlow>(next)->HasInlineNodeDataWithoutFirstLine()) { - // The `::first-line` applies to the "first in-flow block-level child". When - // such child is removed and the next child is inline, the next child needs - // to run `PrepareLayout` again to create `InlineItem`s for the first-line. - // https://drafts.csswg.org/css-pseudo-4/#first-text-line - next->SetNeedsLayoutAndFullPaintInvalidation( - layout_invalidation_reason::kRemovedFromLayout); - next->SetNeedsCollectInlines(); } LayoutBlock::RemoveChild(old_child);
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.h b/third_party/blink/renderer/core/layout/layout_block_flow.h index 86761661..ed4dd81 100644 --- a/third_party/blink/renderer/core/layout/layout_block_flow.h +++ b/third_party/blink/renderer/core/layout/layout_block_flow.h
@@ -126,14 +126,6 @@ NOT_DESTROYED(); return inline_node_data_.Get(); } - - // True if `this` has an `InlineNodeData` that does not have the - // `InlineItemsData` for the first-line. - bool HasInlineNodeDataWithoutFirstLine() const { - NOT_DESTROYED(); - return inline_node_data_ && !inline_node_data_->HasFirstLineItems(); - } - // Same as `GetInlineNodeData` and then `ClearInlineNodeData`. InlineNodeData* TakeInlineNodeData() { NOT_DESTROYED();
diff --git a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h index d247312..6009ed8 100644 --- a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h +++ b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h
@@ -209,7 +209,7 @@ CanvasResourceProvider* GetResourceProviderForImageBitmap() { CHECK(IsImageBitmapRenderingContext()); - return ResourceProviderDEPRECATED(); + return GetResourceProviderWithoutContextCheck(); } class ScopedInsideWorkerRAF {
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_features.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_features.cc index 05349b2..980deef 100644 --- a/third_party/blink/renderer/modules/peerconnection/peer_connection_features.cc +++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_features.cc
@@ -32,4 +32,10 @@ "WebRtcRtpScriptTransformerFrameRestrictions", base::FEATURE_ENABLED_BY_DEFAULT); +// Rollout killswitch for unumuting a track when a packet arrives instead of +// after setRemoteDescription. +BASE_FEATURE(kWebRtcUnmuteTracksWhenPacketArrives, + "WebRtcUnmuteTracksWhenPacketArrives", + base::FEATURE_ENABLED_BY_DEFAULT); + } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_features.h b/third_party/blink/renderer/modules/peerconnection/peer_connection_features.h index 027e69d..1ebc48f 100644 --- a/third_party/blink/renderer/modules/peerconnection/peer_connection_features.h +++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_features.h
@@ -11,5 +11,6 @@ MODULES_EXPORT BASE_DECLARE_FEATURE(kWebRtcEncryptedRtpHeaderExtensions); MODULES_EXPORT BASE_DECLARE_FEATURE( kWebRtcRtpScriptTransformerFrameRestrictions); +MODULES_EXPORT BASE_DECLARE_FEATURE(kWebRtcUnmuteTracksWhenPacketArrives); } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_PEER_CONNECTION_FEATURES_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 7c5915b..c928f02 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -95,6 +95,7 @@ #include "third_party/blink/renderer/modules/mediastream/media_stream_event.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_track_impl.h" #include "third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h" +#include "third_party/blink/renderer/modules/peerconnection/peer_connection_features.h" #include "third_party/blink/renderer/modules/peerconnection/rtc_certificate.h" #include "third_party/blink/renderer/modules/peerconnection/rtc_certificate_generator.h" #include "third_party/blink/renderer/modules/peerconnection/rtc_data_channel.h" @@ -2547,12 +2548,12 @@ MaybeDispatchEvent(track_event); } - // Unmute "pc.ontrack" tracks. Fires "track.onunmute" synchronously. - // TODO(https://crbug.com/889487): The correct thing to do is to unmute in - // response to receiving RTP packets. - for (auto& transceiver : track_events) { - transceiver->receiver()->track()->Component()->Source()->SetReadyState( - MediaStreamSource::kReadyStateLive); + // TODO(https://crbug.com/40821064): Remove killswitch after rollout. + if (!base::FeatureList::IsEnabled(kWebRtcUnmuteTracksWhenPacketArrives)) { + for (auto& transceiver : track_events) { + transceiver->receiver()->track()->Component()->Source()->SetReadyState( + MediaStreamSource::kReadyStateLive); + } } // Transceiver modifications can cause changes in the set of ICE
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver_impl.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver_impl.cc index 142803a..5b0f0f8 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver_impl.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver_impl.cc
@@ -9,6 +9,7 @@ #include "base/functional/bind.h" #include "base/notreached.h" #include "base/task/single_thread_task_runner.h" +#include "third_party/blink/renderer/modules/peerconnection/peer_connection_features.h" #include "third_party/blink/renderer/platform/peerconnection/rtc_encoded_audio_stream_transformer.h" #include "third_party/blink/renderer/platform/peerconnection/rtc_encoded_video_stream_transformer.h" #include "third_party/blink/renderer/platform/peerconnection/rtc_rtp_sender_platform.h" @@ -139,7 +140,8 @@ class RTCRtpReceiverImpl::RTCRtpReceiverInternal : public WTF::ThreadSafeRefCounted< RTCRtpReceiverImpl::RTCRtpReceiverInternal, - RTCRtpReceiverImpl::RTCRtpReceiverInternalTraits> { + RTCRtpReceiverImpl::RTCRtpReceiverInternalTraits>, + public webrtc::RtpReceiverObserverInterface { public: RTCRtpReceiverInternal(webrtc::scoped_refptr<webrtc::PeerConnectionInterface> native_peer_connection, @@ -170,6 +172,11 @@ encoded_video_transformer_->Delegate()); } DCHECK(!encoded_audio_transformer_ || !encoded_video_transformer_); + // TODO(https://crbug.com/40821064): Remove killswitch after rollout. + if (base::FeatureList::IsEnabled(kWebRtcUnmuteTracksWhenPacketArrives)) { + CHECK(webrtc_receiver_); + webrtc_receiver_->SetObserver(this); + } } const RtpReceiverState& state() const { @@ -222,13 +229,34 @@ return encoded_video_transformer_.get(); } + // RtpReceiverObserverInterface implementation. + // Note: unregistering from the event is not necessary. + void OnFirstPacketReceived(webrtc::MediaType media_type) override { + DCHECK(webrtc_receiver_); + if (!main_task_runner_->BelongsToCurrentThread()) { + main_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&RTCRtpReceiverImpl::RTCRtpReceiverInternal:: + OnFirstPacketReceived, + this, media_type)); + return; + } + state_.track_ref()->track()->Source()->SetReadyState( + MediaStreamSource::kReadyStateLive); + } + private: friend class WTF::ThreadSafeRefCounted<RTCRtpReceiverInternal, RTCRtpReceiverInternalTraits>; friend struct RTCRtpReceiverImpl::RTCRtpReceiverInternalTraits; - ~RTCRtpReceiverInternal() { + ~RTCRtpReceiverInternal() override { DCHECK(main_task_runner_->BelongsToCurrentThread()); + // TODO(https://crbug.com/40821064): Remove killswitch after rollout. + if (webrtc_receiver_ && + base::FeatureList::IsEnabled(kWebRtcUnmuteTracksWhenPacketArrives)) { + webrtc_receiver_->SetObserver(nullptr); + } } void GetStatsOnSignalingThread(RTCStatsReportCallback callback) {
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_host.h b/third_party/blink/renderer/platform/graphics/canvas_resource_host.h index 5eb716f4..5938df9 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_host.h +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_host.h
@@ -65,12 +65,6 @@ virtual CanvasResourceProvider* GetResourceProviderForCanvas2D() const = 0; - // TODO(crbug.com/352263194): Transition all usages of this method to - // context-specific variants and eliminate the method. - CanvasResourceProvider* ResourceProviderDEPRECATED() const { - return resource_provider_.get(); - } - std::unique_ptr<CanvasResourceProvider> ReplaceResourceProvider( std::unique_ptr<CanvasResourceProvider>); @@ -97,6 +91,15 @@ virtual void SetTransferToGPUTextureWasInvoked() {} virtual bool TransferToGPUTextureWasInvoked() { return false; } + protected: + // Should be called only from within subclasses' + // GetResourceProviderFor<ContextType> methods. + // TODO(crbug.com/352263194): Explode `resource_provider_` into one ivar for + // each context type. + CanvasResourceProvider* GetResourceProviderWithoutContextCheck() const { + return resource_provider_.get(); + } + private: std::unique_ptr<CanvasResourceProvider> resource_provider_; RasterModeHint preferred_2d_raster_mode_ = RasterModeHint::kPreferCPU;
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test.cc b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test.cc index d30b6e2..924cc8a 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test.cc
@@ -398,8 +398,7 @@ gfx::Size alternate_size(kInitialWidth, kAlternateHeight); // There should be currently one back buffer and therefore one SharedImage. - gpu::Mailbox mailbox1; - mailbox1.SetName(gl_->last_imported_shared_image()->name); + gpu::Mailbox mailbox1 = gl_->last_imported_shared_image(); EXPECT_EQ(1u, sii->shared_image_count()); EXPECT_TRUE(sii->CheckSharedImageExists(mailbox1)); @@ -414,8 +413,7 @@ EXPECT_EQ(initial_size, resource.size); testing::Mock::VerifyAndClearExpectations(gl_); VerifyStateWasRestored(); - gpu::Mailbox mailbox2; - mailbox2.SetName(gl_->last_imported_shared_image()->name); + gpu::Mailbox mailbox2 = gl_->last_imported_shared_image(); EXPECT_EQ(2u, sii->shared_image_count()); EXPECT_TRUE(sii->CheckSharedImageExists(mailbox1)); EXPECT_TRUE(sii->CheckSharedImageExists(mailbox2)); @@ -426,8 +424,7 @@ EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1); drawing_buffer_->Resize(alternate_size); VerifyStateWasRestored(); - gpu::Mailbox mailbox3; - mailbox3.SetName(gl_->last_imported_shared_image()->name); + gpu::Mailbox mailbox3 = gl_->last_imported_shared_image(); EXPECT_EQ(2u, sii->shared_image_count()); EXPECT_FALSE(sii->CheckSharedImageExists(mailbox1)); EXPECT_TRUE(sii->CheckSharedImageExists(mailbox2)); @@ -450,8 +447,7 @@ EXPECT_EQ(alternate_size, sii->MostRecentSize()); EXPECT_TRUE(resource.is_overlay_candidate); EXPECT_EQ(alternate_size, resource.size); - gpu::Mailbox mailbox4; - mailbox4.SetName(gl_->last_imported_shared_image()->name); + gpu::Mailbox mailbox4 = gl_->last_imported_shared_image(); EXPECT_EQ(2u, sii->shared_image_count()); EXPECT_TRUE(sii->CheckSharedImageExists(mailbox3)); EXPECT_TRUE(sii->CheckSharedImageExists(mailbox4)); @@ -464,8 +460,7 @@ EXPECT_CALL(*gl_, CreateAndTexStorage2DSharedImageCHROMIUMMock(_)).Times(1); drawing_buffer_->Resize(initial_size); VerifyStateWasRestored(); - gpu::Mailbox mailbox5; - mailbox5.SetName(gl_->last_imported_shared_image()->name); + gpu::Mailbox mailbox5 = gl_->last_imported_shared_image(); EXPECT_EQ(2u, sii->shared_image_count()); EXPECT_FALSE(sii->CheckSharedImageExists(mailbox3)); EXPECT_TRUE(sii->CheckSharedImageExists(mailbox4)); @@ -489,8 +484,7 @@ EXPECT_TRUE(resource.is_overlay_candidate); EXPECT_EQ(initial_size, resource.size); testing::Mock::VerifyAndClearExpectations(gl_); - gpu::Mailbox mailbox6; - mailbox6.SetName(gl_->last_imported_shared_image()->name); + gpu::Mailbox mailbox6 = gl_->last_imported_shared_image(); EXPECT_EQ(2u, sii->shared_image_count()); EXPECT_TRUE(sii->CheckSharedImageExists(mailbox5)); EXPECT_TRUE(sii->CheckSharedImageExists(mailbox6));
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test_helpers.h b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test_helpers.h index 91889076..83f2b06 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test_helpers.h +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test_helpers.h
@@ -362,8 +362,8 @@ saved_state_.pixel_pack_buffer_binding); } - gpu::Mailbox* last_imported_shared_image() { - return &last_imported_shared_image_; + const gpu::Mailbox& last_imported_shared_image() { + return last_imported_shared_image_; } private:
diff --git a/third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h b/third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h index dcfbcb2..2e6be0fd 100644 --- a/third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h +++ b/third_party/blink/renderer/platform/graphics/test/fake_canvas_resource_host.h
@@ -36,7 +36,7 @@ } CanvasResourceProvider* GetResourceProviderForCanvas2D() const override { - return ResourceProviderDEPRECATED(); + return GetResourceProviderWithoutContextCheck(); } size_t GetMemoryUsage() const override { return 0; }
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 7ce65e0..a39877b 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -3256,11 +3256,6 @@ status: "stable", }, { - // crbug.com/380107555 - name: "NodeInUAShadowRootUnderAnonymousBlockFlow", - status: "stable", - }, - { // This turns off all font antialiasing for tests unless it is // explicitly required and enabled using the // "--enable-font-antialiasing" flag like in the case of
diff --git a/third_party/blink/renderer/platform/wtf/text/encoding_tables.cc b/third_party/blink/renderer/platform/wtf/text/encoding_tables.cc index 5bbd8bd..da172e7 100644 --- a/third_party/blink/renderer/platform/wtf/text/encoding_tables.cc +++ b/third_party/blink/renderer/platform/wtf/text/encoding_tables.cc
@@ -42,7 +42,7 @@ #include "third_party/blink/renderer/platform/wtf/text/character_names.h" #include "third_party/blink/renderer/platform/wtf/text/text_codec_icu.h" -namespace WTF { +namespace blink { // These are values from https://encoding.spec.whatwg.org/index-jis0208.txt that // are not in ICU. @@ -380,4 +380,4 @@ return *table; } -} // namespace WTF +} // namespace blink
diff --git a/third_party/blink/renderer/platform/wtf/text/encoding_tables.h b/third_party/blink/renderer/platform/wtf/text/encoding_tables.h index ea3804f..14f4226 100644 --- a/third_party/blink/renderer/platform/wtf/text/encoding_tables.h +++ b/third_party/blink/renderer/platform/wtf/text/encoding_tables.h
@@ -39,9 +39,9 @@ #include "third_party/blink/renderer/platform/wtf/text/wtf_uchar.h" #include "third_party/blink/renderer/platform/wtf/wtf_export.h" -namespace WTF { +namespace blink { -// Following functions are helpers for TextCodecCJK, and not intended to be used +// Following functions are helpers for TextCodecCjk, and not intended to be used // by others. constexpr size_t kJis0208EncodeIndexSize = 7724; using Jis0208EncodeIndex = @@ -145,6 +145,6 @@ MakeFirstAdapter(key), CompareFirst{}); } -} // namespace WTF +} // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_ENCODING_TABLES_H_
diff --git a/third_party/blink/renderer/platform/wtf/text/encoding_tables_test.cc b/third_party/blink/renderer/platform/wtf/text/encoding_tables_test.cc index db4d00c..237bfa4 100644 --- a/third_party/blink/renderer/platform/wtf/text/encoding_tables_test.cc +++ b/third_party/blink/renderer/platform/wtf/text/encoding_tables_test.cc
@@ -27,7 +27,7 @@ #include "testing/gtest/include/gtest/gtest.h" -namespace WTF { +namespace blink { namespace { @@ -10474,4 +10474,4 @@ } } // namespace -} // namespace WTF +} // namespace blink
diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_ascii_fast_path.h b/third_party/blink/renderer/platform/wtf/text/text_codec_ascii_fast_path.h index 3491a3c3..d7b3c6d7 100644 --- a/third_party/blink/renderer/platform/wtf/text/text_codec_ascii_fast_path.h +++ b/third_party/blink/renderer/platform/wtf/text/text_codec_ascii_fast_path.h
@@ -34,10 +34,11 @@ #include "third_party/blink/renderer/platform/wtf/text/ascii_fast_path.h" -namespace WTF { +namespace blink { template <size_t size> struct UCharByteFiller; + template <> struct UCharByteFiller<4> { static void Copy(LChar* destination, const uint8_t* source) { @@ -51,6 +52,7 @@ destination[3] = source[3]; } }; + template <> struct UCharByteFiller<8> { static void Copy(LChar* destination, const uint8_t* source) { @@ -69,19 +71,14 @@ } }; -inline void CopyASCIIMachineWord(LChar* destination, const uint8_t* source) { +inline void CopyAsciiMachineWord(LChar* destination, const uint8_t* source) { UCharByteFiller<sizeof(WTF::MachineWord)>::Copy(destination, source); } -inline void CopyASCIIMachineWord(UChar* destination, const uint8_t* source) { +inline void CopyAsciiMachineWord(UChar* destination, const uint8_t* source) { UCharByteFiller<sizeof(WTF::MachineWord)>::Copy(destination, source); } -} // namespace WTF - -// TODO(crbug.com/422768753): Remove these `using` directives. -namespace blink { -using WTF::CopyASCIIMachineWord; -} +} // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_TEXT_CODEC_ASCII_FAST_PATH_H_
diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_cjk.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_cjk.cc index 756503cd..e554ddf 100644 --- a/third_party/blink/renderer/platform/wtf/text/text_codec_cjk.cc +++ b/third_party/blink/renderer/platform/wtf/text/text_codec_cjk.cc
@@ -37,9 +37,9 @@ #include "third_party/blink/renderer/platform/wtf/text/text_encoding.h" #include "third_party/blink/renderer/platform/wtf/vector.h" -namespace WTF { +namespace blink { -class TextCodecCJK::Decoder { +class TextCodecCjk::Decoder { public: virtual ~Decoder() = default; virtual String Decode(base::span<const uint8_t> bytes, @@ -531,7 +531,7 @@ } // https://encoding.spec.whatwg.org/#euc-jp-decoder -class EucJpDecoder : public TextCodecCJK::Decoder { +class EucJpDecoder : public TextCodecCjk::Decoder { public: EucJpDecoder() = default; @@ -576,7 +576,7 @@ }; // https://encoding.spec.whatwg.org/#iso-2022-jp-decoder -class Iso2022JpDecoder : public TextCodecCJK::Decoder { +class Iso2022JpDecoder : public TextCodecCjk::Decoder { public: Iso2022JpDecoder() = default; @@ -803,7 +803,7 @@ }; // https://encoding.spec.whatwg.org/#shift_jis-decoder -class ShiftJisDecoder : public TextCodecCJK::Decoder { +class ShiftJisDecoder : public TextCodecCjk::Decoder { public: ShiftJisDecoder() = default; @@ -844,7 +844,7 @@ }; // https://encoding.spec.whatwg.org/#euc-kr-decoder -class EucKrDecoder : public TextCodecCJK::Decoder { +class EucKrDecoder : public TextCodecCjk::Decoder { public: EucKrDecoder() = default; @@ -878,7 +878,7 @@ // https://encoding.spec.whatwg.org/#gb18030-decoder // https://encoding.spec.whatwg.org/#gbk-decoder // Note that the same decoder is used for GB18030 and GBK. -class Gb18030Decoder : public TextCodecCJK::Decoder { +class Gb18030Decoder : public TextCodecCjk::Decoder { public: Gb18030Decoder() = default; @@ -888,7 +888,7 @@ bool& saw_error) override { saw_error_ = &saw_error; String result = - TextCodecCJK::Decoder::Decode(bytes, flush, stop_on_error, saw_error); + TextCodecCjk::Decoder::Decode(bytes, flush, stop_on_error, saw_error); // Ensures that `saw_error_` won't be used for the next run. saw_error_ = nullptr; return result; @@ -987,17 +987,17 @@ uint8_t second_ = 0x00; uint8_t third_ = 0x00; - // To share a reference to `saw_error` with `TextCodecCJK::Decoder::Decode` + // To share a reference to `saw_error` with `TextCodecCjk::Decoder::Decode` // we should keep a pointer to `saw_error`, and use it in `ParseByte` and - // `Finalize`. Since `saw_error` is given as `TextCodecCJK::Decode` argument, + // `Finalize`. Since `saw_error` is given as `TextCodecCjk::Decode` argument, // I do not think it is safe to keep the reference after - // `TextCodecCJK::Decode` finishes. + // `TextCodecCjk::Decode` finishes. bool* saw_error_; }; } // namespace -enum class TextCodecCJK::Encoding : uint8_t { +enum class TextCodecCjk::Encoding : uint8_t { kEucJp, kIso2022Jp, kShiftJis, @@ -1006,9 +1006,9 @@ kGb18030, }; -TextCodecCJK::TextCodecCJK(Encoding encoding) : encoding_(encoding) {} +TextCodecCjk::TextCodecCjk(Encoding encoding) : encoding_(encoding) {} -void TextCodecCJK::RegisterEncodingNames(EncodingNameRegistrar registrar) { +void TextCodecCjk::RegisterEncodingNames(EncodingNameRegistrar registrar) { // https://encoding.spec.whatwg.org/#names-and-labels auto registerAliases = [&](std::initializer_list<const char*> list) { for (auto* alias : list) @@ -1041,41 +1041,42 @@ registerAliases({kCanonicalNameGb18030}); } -void TextCodecCJK::RegisterCodecs(TextCodecRegistrar registrar) { +void TextCodecCjk::RegisterCodecs(TextCodecRegistrar registrar) { for (auto* name : kSupportedCanonicalNames) { registrar(name, Create, nullptr); } } -std::unique_ptr<TextCodec> TextCodecCJK::Create(const TextEncoding& encoding, - const void*) { +std::unique_ptr<TextCodec> TextCodecCjk::Create( + const WTF::TextEncoding& encoding, + const void*) { const AtomicString& name = encoding.GetName(); - // To keep the `TextCodecCJK` constructor private, we intend to `new` + // To keep the `TextCodecCjk` constructor private, we intend to `new` // it and use `base::WrapUnique`. Note that we cannot use `std::make_unique` // for a private constructor. if (name == kCanonicalNameEucJp) { - return base::WrapUnique(new TextCodecCJK(Encoding::kEucJp)); + return base::WrapUnique(new TextCodecCjk(Encoding::kEucJp)); } if (name == kCanonicalNameShiftJis) { - return base::WrapUnique(new TextCodecCJK(Encoding::kShiftJis)); + return base::WrapUnique(new TextCodecCjk(Encoding::kShiftJis)); } if (name == kCanonicalNameEucKr) { - return base::WrapUnique(new TextCodecCJK(Encoding::kEucKr)); + return base::WrapUnique(new TextCodecCjk(Encoding::kEucKr)); } if (name == kCanonicalNameIso2022Jp) { - return base::WrapUnique(new TextCodecCJK(Encoding::kIso2022Jp)); + return base::WrapUnique(new TextCodecCjk(Encoding::kIso2022Jp)); } if (name == kCanonicalNameGbk) { - return base::WrapUnique(new TextCodecCJK(Encoding::kGbk)); + return base::WrapUnique(new TextCodecCjk(Encoding::kGbk)); } if (name == kCanonicalNameGb18030) { - return base::WrapUnique(new TextCodecCJK(Encoding::kGb18030)); + return base::WrapUnique(new TextCodecCjk(Encoding::kGb18030)); } NOTREACHED(); } -String TextCodecCJK::Decoder::Decode(base::span<const uint8_t> bytes, +String TextCodecCjk::Decoder::Decode(base::span<const uint8_t> bytes, bool flush, bool stop_on_error, bool& saw_error) { @@ -1123,7 +1124,7 @@ return result.ToString(); } -String TextCodecCJK::Decode(base::span<const uint8_t> data, +String TextCodecCjk::Decode(base::span<const uint8_t> data, FlushBehavior flush_behavior, bool stop_on_error, bool& saw_error) { @@ -1153,7 +1154,7 @@ return decoder_->Decode(data, flush, stop_on_error, saw_error); } -Vector<uint8_t> TextCodecCJK::EncodeCommon(StringView string, +Vector<uint8_t> TextCodecCjk::EncodeCommon(StringView string, UnencodableHandling handling) const { switch (encoding_) { case Encoding::kEucJp: @@ -1172,20 +1173,20 @@ NOTREACHED(); } -std::string TextCodecCJK::Encode(base::span<const UChar> characters, +std::string TextCodecCjk::Encode(base::span<const UChar> characters, UnencodableHandling handling) { Vector<uint8_t> v = EncodeCommon(StringView(characters), handling); return std::string(v.begin(), v.end()); } -std::string TextCodecCJK::Encode(base::span<const LChar> characters, +std::string TextCodecCjk::Encode(base::span<const LChar> characters, UnencodableHandling handling) { Vector<uint8_t> v = EncodeCommon(StringView(characters), handling); return std::string(v.begin(), v.end()); } // static -bool TextCodecCJK::IsSupported(StringView name) { +bool TextCodecCjk::IsSupported(StringView name) { for (auto* e : kSupportedCanonicalNames) { if (e == name) { return true; @@ -1194,4 +1195,4 @@ return false; } -} // namespace WTF +} // namespace blink
diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_cjk.h b/third_party/blink/renderer/platform/wtf/text/text_codec_cjk.h index eb7fbf1..09b4594d 100644 --- a/third_party/blink/renderer/platform/wtf/text/text_codec_cjk.h +++ b/third_party/blink/renderer/platform/wtf/text/text_codec_cjk.h
@@ -35,9 +35,9 @@ #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/blink/renderer/platform/wtf/wtf_export.h" -namespace WTF { +namespace blink { -// TextCodecCJK supports following encodings: +// TextCodecCjk supports following encodings: // * Japanese characters (EUC-JP, ISO-2022-JP, ShiftJIS) // * Korean characters (EUC-KR) // * Simplified Chinese characters (GB18030, GBK) @@ -48,7 +48,7 @@ // ICU4C behaves much different from the WHATWG specification // (https://encoding.spec.whatwg.org/). It was difficult to fulfill the // specification by using TextCodecICU. -class TextCodecCJK final : public TextCodec { +class TextCodecCjk final : public TextCodec { public: class Decoder; static void RegisterEncodingNames(EncodingNameRegistrar); @@ -58,8 +58,8 @@ private: enum class Encoding : uint8_t; - explicit TextCodecCJK(Encoding); - WTF_EXPORT static std::unique_ptr<TextCodec> Create(const TextEncoding&, + explicit TextCodecCjk(Encoding); + WTF_EXPORT static std::unique_ptr<TextCodec> Create(const WTF::TextEncoding&, const void*); String Decode(base::span<const uint8_t> data, FlushBehavior, @@ -74,6 +74,6 @@ std::unique_ptr<Decoder> decoder_; }; -} // namespace WTF +} // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_TEXT_CODEC_CJK_H_
diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_cjk_test.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_cjk_test.cc index 1e3b5692..9d07788 100644 --- a/third_party/blink/renderer/platform/wtf/text/text_codec_cjk_test.cc +++ b/third_party/blink/renderer/platform/wtf/text/text_codec_cjk_test.cc
@@ -6,18 +6,18 @@ #include "testing/gtest/include/gtest/gtest.h" -namespace WTF { +namespace blink { namespace { -TEST(TextCodecCJK, IsSupported) { - EXPECT_TRUE(TextCodecCJK::IsSupported("EUC-JP")); - EXPECT_TRUE(TextCodecCJK::IsSupported("Shift_JIS")); - EXPECT_TRUE(TextCodecCJK::IsSupported("EUC-KR")); - EXPECT_TRUE(TextCodecCJK::IsSupported("ISO-2022-JP")); - EXPECT_TRUE(TextCodecCJK::IsSupported("GBK")); - EXPECT_TRUE(TextCodecCJK::IsSupported("gb18030")); - EXPECT_FALSE(TextCodecCJK::IsSupported("non-exist-encoding")); +TEST(TextCodecCjk, IsSupported) { + EXPECT_TRUE(TextCodecCjk::IsSupported("EUC-JP")); + EXPECT_TRUE(TextCodecCjk::IsSupported("Shift_JIS")); + EXPECT_TRUE(TextCodecCjk::IsSupported("EUC-KR")); + EXPECT_TRUE(TextCodecCjk::IsSupported("ISO-2022-JP")); + EXPECT_TRUE(TextCodecCjk::IsSupported("GBK")); + EXPECT_TRUE(TextCodecCjk::IsSupported("gb18030")); + EXPECT_FALSE(TextCodecCjk::IsSupported("non-exist-encoding")); } } // namespace -} // namespace WTF +} // namespace blink
diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc index 5cb77de9..34926ae 100644 --- a/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc +++ b/third_party/blink/renderer/platform/wtf/text/text_codec_icu.cc
@@ -120,8 +120,8 @@ continue; } #endif - // Avoid codecs supported by `TextCodecCJK`. - if (WTF::TextCodecCJK::IsSupported(standard_name)) { + // Avoid codecs supported by `TextCodecCjk`. + if (TextCodecCjk::IsSupported(standard_name)) { continue; } @@ -153,8 +153,8 @@ #endif // Avoid registering codecs registered by - // `TextCodecCJK::RegisterEncodingNames`. - if (!WTF::TextCodecCJK::IsSupported(standard_name)) { + // `TextCodecCjk::RegisterEncodingNames`. + if (!TextCodecCjk::IsSupported(standard_name)) { registrar(standard_name, standard_name); } @@ -295,8 +295,8 @@ continue; } #endif - // Avoid codecs supported by `TextCodecCJK`. - if (WTF::TextCodecCJK::IsSupported(standard_name)) { + // Avoid codecs supported by `TextCodecCjk`. + if (TextCodecCjk::IsSupported(standard_name)) { continue; } registrar(standard_name, Create, nullptr);
diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_latin1.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_latin1.cc index ea12e8a..2e926f2 100644 --- a/third_party/blink/renderer/platform/wtf/text/text_codec_latin1.cc +++ b/third_party/blink/renderer/platform/wtf/text/text_codec_latin1.cc
@@ -137,7 +137,7 @@ if (!IsAllASCII<LChar>(chunk)) goto useLookupTable; - CopyASCIIMachineWord(destination, source); + CopyAsciiMachineWord(destination, source); source += sizeof(MachineWord); destination += sizeof(MachineWord); } @@ -189,7 +189,7 @@ if (!IsAllASCII<LChar>(chunk)) goto useLookupTable16; - CopyASCIIMachineWord(destination16, source); + CopyAsciiMachineWord(destination16, source); source += sizeof(MachineWord); destination16 += sizeof(MachineWord); }
diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_utf8.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_utf8.cc index 16462b8d..cf08c6c4 100644 --- a/third_party/blink/renderer/platform/wtf/text/text_codec_utf8.cc +++ b/third_party/blink/renderer/platform/wtf/text/text_codec_utf8.cc
@@ -390,7 +390,7 @@ *reinterpret_cast_ptr<const MachineWord*>(source); if (!IsAllASCII<LChar>(chunk)) break; - CopyASCIIMachineWord(destination, source); + CopyAsciiMachineWord(destination, source); source += sizeof(MachineWord); destination += sizeof(MachineWord); } @@ -471,7 +471,7 @@ *reinterpret_cast_ptr<const MachineWord*>(source); if (!IsAllASCII<LChar>(chunk)) break; - CopyASCIIMachineWord(destination16, source); + CopyAsciiMachineWord(destination16, source); source += sizeof(MachineWord); destination16 += sizeof(MachineWord); }
diff --git a/third_party/blink/renderer/platform/wtf/text/text_encoding_registry.cc b/third_party/blink/renderer/platform/wtf/text/text_encoding_registry.cc index aa9dee4..c0b2bac 100644 --- a/third_party/blink/renderer/platform/wtf/text/text_encoding_registry.cc +++ b/third_party/blink/renderer/platform/wtf/text/text_encoding_registry.cc
@@ -178,8 +178,8 @@ blink::TextCodecReplacement::RegisterEncodingNames(AddToTextEncodingNameMap); blink::TextCodecReplacement::RegisterCodecs(AddToTextCodecMap); - TextCodecCJK::RegisterEncodingNames(AddToTextEncodingNameMap); - TextCodecCJK::RegisterCodecs(AddToTextCodecMap); + blink::TextCodecCjk::RegisterEncodingNames(AddToTextEncodingNameMap); + blink::TextCodecCjk::RegisterCodecs(AddToTextCodecMap); blink::TextCodecIcu::RegisterEncodingNames(AddToTextEncodingNameMap); blink::TextCodecIcu::RegisterCodecs(AddToTextCodecMap);
diff --git a/third_party/blink/web_tests/FlagExpectations/highdpi b/third_party/blink/web_tests/FlagExpectations/highdpi index 566a12c4..98be5b6 100644 --- a/third_party/blink/web_tests/FlagExpectations/highdpi +++ b/third_party/blink/web_tests/FlagExpectations/highdpi
@@ -112,7 +112,6 @@ crbug.com/424472927 external/wpt/scroll-animations/animation-trigger/animation-trigger-addAnimation.tentative.html [ Timeout ] crbug.com/424472927 external/wpt/scroll-animations/animation-trigger/animation-trigger-multiple-animations.tentative.html [ Timeout ] crbug.com/424472927 external/wpt/scroll-animations/animation-trigger/animation-trigger-multiple-triggers.tentative.html [ Timeout ] -crbug.com/424474332 external/wpt/scroll-animations/css/animation-timeline-computed.html [ Failure ] crbug.com/424473138 external/wpt/scroll-animations/css/progress-based-animation-animation-longhand-properties.tentative.html [ Failure ] crbug.com/424473138 external/wpt/scroll-animations/css/scroll-timeline-axis-writing-mode.html [ Failure ] crbug.com/424473138 external/wpt/scroll-animations/css/scroll-timeline-frame-size-changed.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 36659968..768be04 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -2763,8 +2763,6 @@ crbug.com/413411328 external/wpt/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrerpolicy-same-origin.sub.html [ Failure ] # ====== New tests from wpt-importer added here ====== -crbug.com/425041677 [ Mac ] external/wpt/svg/text/reftests/text-context-fill.svg [ Failure ] -crbug.com/425041677 [ Win ] external/wpt/svg/text/reftests/text-context-fill.svg [ Failure ] crbug.com/425056982 [ Mac14 ] virtual/threaded-prefer-compositing/external/wpt/css/cssom-view/devicePixelRatio-undisplayed-iframe.tentative.html [ Crash ] crbug.com/425118323 [ Mac14 ] virtual/threaded-preload-scanner/external/wpt/html/semantics/scripting-1/the-script-element/async_001.htm [ Timeout ] crbug.com/425118323 [ Mac14 ] virtual/threaded-preload-scanner/external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/002.html [ Timeout ] @@ -3260,7 +3258,6 @@ crbug.com/379779792 [ Mac15 ] external/wpt/webrtc/RTCTrackEvent-fire.html [ Timeout ] crbug.com/379805760 [ Mac15 ] external/wpt/webrtc/protocol/rtp-headerextensions.html [ Timeout ] crbug.com/379779783 [ Mac15 ] external/wpt/fetch/api/response/response-clone.any.serviceworker.html [ Timeout ] -crbug.com/379768246 [ Mac15 ] external/wpt/webrtc-stats/rtp-stats-creation.html [ Timeout ] crbug.com/379779806 [ Mac14 ] external/wpt/webcodecs/videoFrame-createImageBitmap.https.any.worker.html [ Timeout ] crbug.com/379779806 [ Mac15 ] external/wpt/webcodecs/videoFrame-createImageBitmap.https.any.worker.html [ Timeout ] crbug.com/379779778 [ Win10.20h2 ] external/wpt/html/webappapis/system-state-and-capabilities/the-navigator-object/plugins-and-mimetypes.html [ Crash Timeout ] @@ -3377,6 +3374,10 @@ crbug.com/370032367 virtual/media-foundation-for-clear-dcomp/external/wpt/media-source/last-frame-dimensions.html [ Timeout ] crbug.com/369652659 [ Mac15-arm64 ] external/wpt/webrtc/RTCPeerConnection-getStats-timestamp.https.html [ Skip Timeout ] crbug.com/369652659 [ Mac15 ] external/wpt/webrtc/RTCPeerConnection-getStats-timestamp.https.html [ Skip Timeout ] +crbug.com/369652659 [ Mac15-arm64 ] external/wpt/webrtc/RTCPeerConnection-getStats.https.html [ Skip Timeout ] +crbug.com/369652659 [ Mac15 ] external/wpt/webrtc/RTCPeerConnection-getStats.https.html [ Skip Timeout ] +crbug.com/369652659 [ Mac15-arm64 ] external/wpt/webrtc-stats/rtp-stats-creation.html [ Skip Timeout ] +crbug.com/369652659 [ Mac15 ] external/wpt/webrtc-stats/rtp-stats-creation.html [ Skip Timeout ] crbug.com/369956891 [ Mac12 ] virtual/threaded/external/wpt/css/css-backgrounds/background-size/vector/tall--auto--percent-width-nonpercent-height.html [ Failure ] crbug.com/369956891 [ Mac14 ] virtual/threaded/external/wpt/css/css-backgrounds/background-size/vector/tall--auto--percent-width-nonpercent-height.html [ Failure ] crbug.com/369956891 [ Mac14 ] virtual/threaded/external/wpt/css/css-backgrounds/background-size/vector/tall--cover--height.html [ Failure ] @@ -8602,10 +8603,6 @@ # Subtest with middle mouse drag occasionally flakes. crbug.com/423841918 [ Linux ] virtual/threaded-prefer-compositing/fast/scrolling/scrollbars/scrollbar-mousedown-move-mouseup.html [ Failure Pass ] -# Temporarily disabled to unblock https://crrev.com/c/6157257 -crbug.com/388445687 http/tests/devtools/console/console-copy-treeoutline.js [ Failure Pass ] -crbug.com/388445687 http/tests/devtools/console/console-viewport-selection.js [ Failure Pass ] - # Gardener 2024-06-28 crbug.com/349938120 [ Linux ] wpt_internal/webmidi/requestmidiaccess-basic.https.html [ Failure Pass ] @@ -9181,4 +9178,5 @@ crbug.com/422636456 [ Mac ] http/tests/inspector-protocol/network/navigate-iframe-out2in.js [ Pass Timeout ] # Gardener 2025-06-16 -crbug.com/424918655 [ Mac ] external/wpt/soft-navigation-heuristics/lcp/tentative/contracted-image.html [ Failure Pass ] \ No newline at end of file +crbug.com/424918655 [ Mac ] external/wpt/soft-navigation-heuristics/lcp/tentative/contracted-image.html [ Failure Pass ] +crbug.com/420596996 [ Win ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/parallel-dispatch.https.any.serviceworker.html?gpu [ Failure Pass ] \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-borders/tentative/parsing/corner-shape-computed.html b/third_party/blink/web_tests/external/wpt/css/css-borders/tentative/parsing/corner-shape-computed.html index e48fda86..7ba3f08 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-borders/tentative/parsing/corner-shape-computed.html +++ b/third_party/blink/web_tests/external/wpt/css/css-borders/tentative/parsing/corner-shape-computed.html
@@ -43,5 +43,11 @@ test_computed_value("corner-right-shape", "superellipse(-1.5) superellipse(3)"); test_computed_value("corner-right-shape", "superellipse(-1) superellipse(2)", "scoop squircle"); test_computed_value("corner-bottom-shape", "scoop scoop", "scoop"); +test_computed_value("corner-inline-start-shape", "round scoop"); +test_computed_value("corner-block-start-shape", "round scoop"); +test_computed_value("corner-block-end-shape", "superellipse(4)"); +test_computed_value("corner-inline-end-shape", "superellipse(-1.5) superellipse(3)"); +test_computed_value("corner-inline-start-shape", "superellipse(-1) superellipse(2)", "scoop squircle"); +test_computed_value("corner-block-end-shape", "scoop scoop", "scoop"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-borders/tentative/parsing/corner-shape-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-borders/tentative/parsing/corner-shape-invalid.html index 5426a5ec..d65ef99 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-borders/tentative/parsing/corner-shape-invalid.html +++ b/third_party/blink/web_tests/external/wpt/css/css-borders/tentative/parsing/corner-shape-invalid.html
@@ -25,7 +25,7 @@ test_invalid_value("corner-shape", "superellipse(1) / superellipse(3)"); test_invalid_value("corner-shape", "superellipse(1), superellipse(3)"); -for (const edge of ["left", "right", "top", "bottom"]) { +for (const edge of ["left", "right", "top", "bottom", "inline-start", "inline-end", "block-start", "block-end"]) { const prop = `corner-${edge}-shape`; test_invalid_value(prop, "auto"); test_invalid_value(prop, "none");
diff --git a/third_party/blink/web_tests/external/wpt/css/css-borders/tentative/parsing/corner-shape-valid.html b/third_party/blink/web_tests/external/wpt/css/css-borders/tentative/parsing/corner-shape-valid.html index c9c4421..6c230ab 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-borders/tentative/parsing/corner-shape-valid.html +++ b/third_party/blink/web_tests/external/wpt/css/css-borders/tentative/parsing/corner-shape-valid.html
@@ -61,4 +61,8 @@ test_corner_shape_shorthand('corner-right-shape', 'corner-top-right-shape', 'corner-bottom-right-shape'); test_corner_shape_shorthand('corner-bottom-shape', 'corner-bottom-left-shape', 'corner-bottom-right-shape'); test_corner_shape_shorthand('corner-left-shape', 'corner-top-left-shape', 'corner-bottom-left-shape'); + test_corner_shape_shorthand('corner-inline-start-shape', 'corner-start-start-shape', 'corner-end-start-shape'); + test_corner_shape_shorthand('corner-inline-end-shape', 'corner-start-end-shape', 'corner-end-end-shape'); + test_corner_shape_shorthand('corner-block-start-shape', 'corner-start-start-shape', 'corner-start-end-shape'); + test_corner_shape_shorthand('corner-block-end-shape', 'corner-end-start-shape', 'corner-end-end-shape'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-child-display-none-dynamic.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-child-display-none-dynamic.html deleted file mode 100644 index 35fdf0a..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-child-display-none-dynamic.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#first-text-line"> -<link rel="match" href="first-line-child-display-none-ref.html"> -<style> -#container { color: red; } -#container::first-line { color:green; } -</style> -<p>The text below should be green.</p> -<div id="container"> - <div id="hideme"></div> - <div> - Here's a line of text. - </div> -</div> -<script> -document.body.offsetTop; -hideme.style.display = "none"; -</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-child-display-none-ref.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-child-display-none-ref.html deleted file mode 100644 index 6808b87..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-child-display-none-ref.html +++ /dev/null
@@ -1,8 +0,0 @@ -<!DOCTYPE html> -<style> -#container { color: green; } -</style> -<p>The text below should be green.</p> -<div id="container"> - Here's a line of text. -</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-child-display-none.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-child-display-none.html deleted file mode 100644 index 3ec50d5..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/first-line-child-display-none.html +++ /dev/null
@@ -1,15 +0,0 @@ -<!DOCTYPE html> -<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#first-text-line"> -<link rel="match" href="first-line-child-display-none-ref.html"> -<style> -#container { color: red; } -#container::first-line { color:green; } -#hideme { display: none; } -</style> -<p>The text below should be green.</p> -<div id="container"> - <div id="hideme"></div> - <div> - Here's a line of text. - </div> -</div>
diff --git a/third_party/blink/web_tests/external/wpt/svg/text/reftests/text-context-fill-ref.svg b/third_party/blink/web_tests/external/wpt/svg/text/reftests/text-context-fill-ref.svg index a8fbd196..30f771d 100644 --- a/third_party/blink/web_tests/external/wpt/svg/text/reftests/text-context-fill-ref.svg +++ b/third_party/blink/web_tests/external/wpt/svg/text/reftests/text-context-fill-ref.svg
@@ -1,4 +1,5 @@ -<svg xmlns="http://www.w3.org/2000/svg" width="150" height="100"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:h="http://www.w3.org/1999/xhtml" width="150" height="100"> + <h:link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> <style> text { font-family: Ahem;
diff --git a/third_party/blink/web_tests/svg/dom/svganimatedangle-initial-values.html b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedAngle-initial-values.html similarity index 65% rename from third_party/blink/web_tests/svg/dom/svganimatedangle-initial-values.html rename to third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedAngle-initial-values.html index 90e8786..7e59c46 100644 --- a/third_party/blink/web_tests/svg/dom/svganimatedangle-initial-values.html +++ b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedAngle-initial-values.html
@@ -1,8 +1,8 @@ <!DOCTYPE html> <title>SVGAnimatedAngle, initial values</title> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script src="resources/initial-value-helper.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/initial-value-helper.js"></script> <script> assert_initial_values([ { interface: 'SVGMarkerElement', attributes: [ 'orientAngle' ],
diff --git a/third_party/blink/web_tests/svg/dom/svganimatedenumeration-initial-values.html b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedEnumeration-initial-values.html similarity index 95% rename from third_party/blink/web_tests/svg/dom/svganimatedenumeration-initial-values.html rename to third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedEnumeration-initial-values.html index bb4a73f..e577aa3 100644 --- a/third_party/blink/web_tests/svg/dom/svganimatedenumeration-initial-values.html +++ b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedEnumeration-initial-values.html
@@ -1,8 +1,8 @@ <!DOCTYPE html> <title>SVGAnimatedEnumeration, initial values</title> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script src="resources/initial-value-helper.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/initial-value-helper.js"></script> <script> assert_initial_values([ { interface: 'SVGClipPathElement', attributes: [ 'clipPathUnits' ],
diff --git a/third_party/blink/web_tests/svg/dom/svganimatedinteger-initial-values.html b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedInteger-initial-values.html similarity index 75% rename from third_party/blink/web_tests/svg/dom/svganimatedinteger-initial-values.html rename to third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedInteger-initial-values.html index b9d99071..05aefaa 100644 --- a/third_party/blink/web_tests/svg/dom/svganimatedinteger-initial-values.html +++ b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedInteger-initial-values.html
@@ -1,8 +1,8 @@ <!DOCTYPE html> <title>SVGAnimatedInteger, initial values</title> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script src="resources/initial-value-helper.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/initial-value-helper.js"></script> <script> const propertyToContentAttribute = { orderX: 'order',
diff --git a/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedLength-initial-values.html b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedLength-initial-values.html index 3c82087..c7f77edf 100644 --- a/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedLength-initial-values.html +++ b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedLength-initial-values.html
@@ -2,79 +2,7 @@ <title>SVGAnimatedLength, initial values</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> -<script> -const objects = { - SVGCircleElement: 'circle', - SVGClipPathElement: 'clipPath', - SVGComponentTransferFunctionElement: 'feFuncA', - SVGEllipseElement: 'ellipse', - SVGFEBlendElement: 'feBlend', - SVGFEColorMatrixElement: 'feColorMatrix', - SVGFECompositeElement: 'feComposite', - SVGFEConvolveMatrixElement: 'feConvolveMatrix', - SVGFEDiffuseLightingElement: 'feDiffuseLighting', - SVGFEDisplacementMapElement: 'feDisplacementMap', - SVGFEDistantLightElement: 'feDistantLight', - SVGFEDropShadowElement: 'feDropShadow', - SVGFEGaussianBlurElement: 'feGaussianBlur', - SVGFEMorphologyElement: 'feMorphology', - SVGFEOffsetElement: 'feOffset', - SVGFEPointLightElement: 'fePointLight', - SVGFESpecularLightingElement: 'feSpecularLighting', - SVGFESpotLightElement: 'feSpotLight', - SVGFETurbulenceElement: 'feTurbulence', - SVGFilterElement: 'filter', - SVGFilterPrimitiveStandardAttributes: 'feBlend', - SVGForeignObjectElement: 'foreignObject', - SVGGeometryElement: 'rect', - SVGGradientElement: 'linearGradient', - SVGImageElement: 'image', - SVGLineElement: 'line', - SVGLinearGradientElement: 'linearGradient', - SVGMarkerElement: 'marker', - SVGMaskElement: 'mask', - SVGPatternElement: 'pattern', - SVGRadialGradientElement: 'radialGradient', - SVGRectElement: 'rect', - SVGSVGElement: 'svg', - SVGStopElement: 'stop', - SVGTextContentElement: 'text', - SVGTextPathElement: 'textPath', - SVGUseElement: 'use', -}; - -function assert_initial_values(attribute_map, config) { - if (typeof config == 'undefined') - config = {}; - let getValue = config.getValue || function(value) { return value; }; - for (let info of attribute_map) { - for (let attribute of info.attributes) { - let content_attribute = config.mapProperty && config.mapProperty[attribute] || attribute; - test(function() { - let e = document.createElementNS('http://www.w3.org/2000/svg', objects[info.interface]); - let initial = info[attribute] && info[attribute].initial || config.initial; - let valid = info[attribute] && info[attribute].valid || config.valid; - assert_equals(getValue(e[attribute].baseVal), initial, 'initial before'); - e.setAttribute(content_attribute, valid); - assert_not_equals(getValue(e[attribute].baseVal), initial, 'new value'); - e.removeAttribute(content_attribute); - assert_equals(getValue(e[attribute].baseVal), initial, 'initial after'); - }, document.title + ', ' + info.interface + '.prototype.' + attribute + ' (remove)'); - - test(function() { - let e = document.createElementNS('http://www.w3.org/2000/svg', objects[info.interface]); - let initial = info[attribute] && info[attribute].initial || config.initial; - let valid = info[attribute] && info[attribute].valid || config.valid; - assert_equals(getValue(e[attribute].baseVal), initial, 'initial before'); - e.setAttribute(content_attribute, valid); - assert_not_equals(getValue(e[attribute].baseVal), initial, 'new value'); - e.setAttribute(content_attribute, 'foobar'); - assert_equals(getValue(e[attribute].baseVal), initial, 'initial after'); - }, document.title + ', ' + info.interface + '.prototype.' + attribute + ' (invalid value)'); - } - } -} -</script> +<script src="support/initial-value-helper.js"></script> <script> // Initial values of '0' need not be specified. assert_initial_values([
diff --git a/third_party/blink/web_tests/svg/dom/svganimatednumber-initial-values.html b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedNumber-initial-values.html similarity index 93% rename from third_party/blink/web_tests/svg/dom/svganimatednumber-initial-values.html rename to third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedNumber-initial-values.html index 45625e2..ac52575 100644 --- a/third_party/blink/web_tests/svg/dom/svganimatednumber-initial-values.html +++ b/third_party/blink/web_tests/external/wpt/svg/types/scripted/SVGAnimatedNumber-initial-values.html
@@ -1,8 +1,8 @@ <!DOCTYPE html> <title>SVGAnimatedNumber, initial values</title> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script src="resources/initial-value-helper.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/initial-value-helper.js"></script> <script> // Map from IDL attribute to content attribute: const propertyToAttributeMap = {
diff --git a/third_party/blink/web_tests/svg/dom/resources/initial-value-helper.js b/third_party/blink/web_tests/external/wpt/svg/types/scripted/support/initial-value-helper.js similarity index 100% rename from third_party/blink/web_tests/svg/dom/resources/initial-value-helper.js rename to third_party/blink/web_tests/external/wpt/svg/types/scripted/support/initial-value-helper.js
diff --git a/third_party/blink/web_tests/external/wpt/webrtc-stats/outbound-rtp.https-expected.txt b/third_party/blink/web_tests/external/wpt/webrtc-stats/outbound-rtp.https-expected.txt deleted file mode 100644 index fb37033..0000000 --- a/third_party/blink/web_tests/external/wpt/webrtc-stats/outbound-rtp.https-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -[FAIL] setting an encoding to false is reflected in outbound-rtp stats - assert_true: expected true got undefined -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/webrtc-stats/outbound-rtp.https.html b/third_party/blink/web_tests/external/wpt/webrtc-stats/outbound-rtp.https.html index ff87d542..196e8fd 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc-stats/outbound-rtp.https.html +++ b/third_party/blink/web_tests/external/wpt/webrtc-stats/outbound-rtp.https.html
@@ -6,14 +6,21 @@ <script src="/resources/testharnessreport.js"></script> <script src="../webrtc/RTCPeerConnection-helper.js"></script> <script> -function extractOutboundRtpStats(stats) { - const wantedStats = []; - stats.forEach(report => { - if (report.type === 'outbound-rtp') { - wantedStats.push(report); +async function extractOutboundRtpStats(pc, expected) { + // If remote stats are never reported, return after 5 seconds. + const startTime = performance.now(); + let stats; + while (true) { + const report = await pc.getStats(); + stats = [...report.values()].filter(({type}) => type === 'outbound-rtp'); + if (stats.length && stats.every(({active}) => active == expected)) { + break; } - }); - return wantedStats; + if (performance.now() > startTime + 5000) { + break; + } + } + return stats; } promise_test(async (test) => { @@ -26,9 +33,8 @@ stream.getTracks().forEach(t => pc1.addTrack(t, stream)); exchangeIceCandidates(pc1, pc2); exchangeOfferAnswer(pc1, pc2); - const {track} = await new Promise(r => pc2.ontrack = r); - await new Promise(r => track.onunmute = r); - let outboundStats = extractOutboundRtpStats(await pc1.getStats()); + await waitForRtpAndRtcpStats(pc1); + let outboundStats = await extractOutboundRtpStats(pc1, true); assert_equals(outboundStats.length, 2); assert_true(outboundStats[0].active); assert_true(outboundStats[1].active); @@ -41,7 +47,7 @@ // Avoid any stats caching. await (new Promise(r => test.step_timeout(r, 100))); - outboundStats = extractOutboundRtpStats(await pc1.getStats()); + outboundStats = await extractOutboundRtpStats(pc1, false); assert_equals(outboundStats.length, 2); assert_false(outboundStats[0].active); assert_false(outboundStats[1].active);
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver.https-expected.txt b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver.https-expected.txt index 7a07190c..3661b1e2 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver.https-expected.txt +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver.https-expected.txt
@@ -1,7 +1,5 @@ This is a testharness.js-based test. [FAIL] checkRemoveTrackNegotiation assert_equals: pc2.setRemoteDescription(offer) should've added 2 tracks to receive stream expected 2 but got 0 -[FAIL] checkMute - assert_true: expected true got false Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver.https.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver.https.html index 943550d..54af97a 100644 --- a/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver.https.html +++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCRtpTransceiver.https.html
@@ -1055,141 +1055,6 @@ ]); }; - const checkMute = async t => { - const pc1 = new RTCPeerConnection(); - t.add_cleanup(() => pc1.close()); - const stream1 = await getNoiseStream({audio: true, video: true}); - t.add_cleanup(() => stopTracks(stream1)); - const audio1 = stream1.getAudioTracks()[0]; - pc1.addTrack(audio1, stream1); - const countMuteAudio1 = countEvents(pc1.getTransceivers()[0].receiver.track, "mute"); - const countUnmuteAudio1 = countEvents(pc1.getTransceivers()[0].receiver.track, "unmute"); - - const video1 = stream1.getVideoTracks()[0]; - pc1.addTrack(video1, stream1); - const countMuteVideo1 = countEvents(pc1.getTransceivers()[1].receiver.track, "mute"); - const countUnmuteVideo1 = countEvents(pc1.getTransceivers()[1].receiver.track, "unmute"); - - const pc2 = new RTCPeerConnection(); - t.add_cleanup(() => pc2.close()); - const stream2 = await getNoiseStream({audio: true, video: true}); - t.add_cleanup(() => stopTracks(stream2)); - const audio2 = stream2.getAudioTracks()[0]; - pc2.addTrack(audio2, stream2); - const countMuteAudio2 = countEvents(pc2.getTransceivers()[0].receiver.track, "mute"); - const countUnmuteAudio2 = countEvents(pc2.getTransceivers()[0].receiver.track, "unmute"); - - const video2 = stream2.getVideoTracks()[0]; - pc2.addTrack(video2, stream2); - const countMuteVideo2 = countEvents(pc2.getTransceivers()[1].receiver.track, "mute"); - const countUnmuteVideo2 = countEvents(pc2.getTransceivers()[1].receiver.track, "unmute"); - - - // Check that receive tracks start muted - hasProps(pc1.getTransceivers(), - [ - {receiver: {track: {kind: "audio", muted: true}}}, - {receiver: {track: {kind: "video", muted: true}}} - ]); - - hasProps(pc1.getTransceivers(), - [ - {receiver: {track: {kind: "audio", muted: true}}}, - {receiver: {track: {kind: "video", muted: true}}} - ]); - - let offer = await pc1.createOffer(); - await pc2.setRemoteDescription(offer); - trickle(t, pc1, pc2); - await pc1.setLocalDescription(offer); - let answer = await pc2.createAnswer(); - await pc1.setRemoteDescription(answer); - trickle(t, pc2, pc1); - await pc2.setLocalDescription(answer); - - let gotUnmuteAudio1 = gotUnmuteEvent(pc1.getTransceivers()[0].receiver.track); - let gotUnmuteVideo1 = gotUnmuteEvent(pc1.getTransceivers()[1].receiver.track); - - let gotUnmuteAudio2 = gotUnmuteEvent(pc2.getTransceivers()[0].receiver.track); - let gotUnmuteVideo2 = gotUnmuteEvent(pc2.getTransceivers()[1].receiver.track); - // Jump out before waiting if a track is unmuted before RTP starts flowing. - assert_true(pc1.getTransceivers()[0].receiver.track.muted); - assert_true(pc1.getTransceivers()[1].receiver.track.muted); - assert_true(pc2.getTransceivers()[0].receiver.track.muted); - assert_true(pc2.getTransceivers()[1].receiver.track.muted); - - await iceConnected(pc1); - await iceConnected(pc2); - - - // Check that receive tracks are unmuted when RTP starts flowing - await gotUnmuteAudio1; - await gotUnmuteVideo1; - await gotUnmuteAudio2; - await gotUnmuteVideo2; - - // Check whether disabling recv locally causes onmute - pc1.getTransceivers()[0].direction = "sendonly"; - pc1.getTransceivers()[1].direction = "sendonly"; - offer = await pc1.createOffer(); - await pc2.setRemoteDescription(offer); - await pc1.setLocalDescription(offer); - answer = await pc2.createAnswer(); - const gotMuteAudio1 = gotMuteEvent(pc1.getTransceivers()[0].receiver.track); - const gotMuteVideo1 = gotMuteEvent(pc1.getTransceivers()[1].receiver.track); - await pc1.setRemoteDescription(answer); - await pc2.setLocalDescription(answer); - await gotMuteAudio1; - await gotMuteVideo1; - - // Check whether disabling on remote causes onmute - pc1.getTransceivers()[0].direction = "inactive"; - pc1.getTransceivers()[1].direction = "inactive"; - offer = await pc1.createOffer(); - const gotMuteAudio2 = gotMuteEvent(pc2.getTransceivers()[0].receiver.track); - const gotMuteVideo2 = gotMuteEvent(pc2.getTransceivers()[1].receiver.track); - await pc2.setRemoteDescription(offer); - await gotMuteAudio2; - await gotMuteVideo2; - await pc1.setLocalDescription(offer); - answer = await pc2.createAnswer(); - await pc1.setRemoteDescription(answer); - await pc2.setLocalDescription(answer); - - // Check whether onunmute fires when we turn everything on again - pc1.getTransceivers()[0].direction = "sendrecv"; - pc1.getTransceivers()[1].direction = "sendrecv"; - offer = await pc1.createOffer(); - await pc2.setRemoteDescription(offer); - // Set these up before sLD, since that sets [[Receptive]] to true, which - // could allow an unmute to occur from a packet that was sent before we - // negotiated inactive! - gotUnmuteAudio1 = gotUnmuteEvent(pc1.getTransceivers()[0].receiver.track); - gotUnmuteVideo1 = gotUnmuteEvent(pc1.getTransceivers()[1].receiver.track); - await pc1.setLocalDescription(offer); - answer = await pc2.createAnswer(); - gotUnmuteAudio2 = gotUnmuteEvent(pc2.getTransceivers()[0].receiver.track); - gotUnmuteVideo2 = gotUnmuteEvent(pc2.getTransceivers()[1].receiver.track); - await pc1.setRemoteDescription(answer); - await pc2.setLocalDescription(answer); - await gotUnmuteAudio1; - await gotUnmuteVideo1; - await gotUnmuteAudio2; - await gotUnmuteVideo2; - - // Wait a little, just in case some stray events fire - await new Promise(r => t.step_timeout(r, 100)); - - assert_equals(1, countMuteAudio1.count, "Got 1 mute event for pc1's audio track"); - assert_equals(1, countMuteVideo1.count, "Got 1 mute event for pc1's video track"); - assert_equals(1, countMuteAudio2.count, "Got 1 mute event for pc2's audio track"); - assert_equals(1, countMuteVideo2.count, "Got 1 mute event for pc2's video track"); - assert_equals(2, countUnmuteAudio1.count, "Got 2 unmute events for pc1's audio track"); - assert_equals(2, countUnmuteVideo1.count, "Got 2 unmute events for pc1's video track"); - assert_equals(2, countUnmuteAudio2.count, "Got 2 unmute events for pc2's audio track"); - assert_equals(2, countUnmuteVideo2.count, "Got 2 unmute events for pc2's video track"); - }; - const checkStop = async t => { const pc1 = new RTCPeerConnection(); t.add_cleanup(() => pc1.close()); @@ -2277,7 +2142,6 @@ checkRemoveAndReadd, checkAddTrackExistingTransceiverThenRemove, checkRemoveTrackNegotiation, - checkMute, checkStop, checkStopAfterCreateOffer, checkStopAfterSetLocalOffer, @@ -2294,4 +2158,73 @@ checkBundleTagRejected ].forEach(test => promise_test(test, test.name)); +['audio', 'video'].forEach(kind => { + const waitUntilTrackEventWithTimeout = (obj, name, t, timeout = 500/*ms*/) => { + return new Promise((resolve) => { + obj.addEventListener(name, resolve, {once: true}); + t.step_timeout(resolve, timeout) + }); + } + + promise_test(async t => { + const pc1 = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + t.add_cleanup(() => pc2.close()); + + pc1.addTransceiver(kind); + pc2.ontrack = t.step_func(async e => { + assert_true(e.track.muted, `track is muted in ontrack`); + }); + const offer = await pc1.createOffer(); + await pc2.setRemoteDescription(offer); + assert_true(pc2.getReceivers()[0].track.muted, `track is muted after SRD`); + }, `track with ${kind} is muted after SRD`); + + promise_test(async t => { + const pc1 = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + t.add_cleanup(() => pc2.close()); + + const stream = await navigator.mediaDevices.getUserMedia({[kind]: true}); + t.add_cleanup(() => stream.getTracks().forEach(t => t.stop())); + + pc1.addTrack(stream.getTracks()[0], stream); + pc2.ontrack = t.step_func(async e => { + assert_true(e.track.muted, `track is muted in ontrack`); + }); + + await exchangeIceCandidates(pc1, pc2); + await exchangeOfferAnswer(pc1, pc2); + await waitUntilTrackEventWithTimeout(pc2.getReceivers()[0].track, 'unmute', t); + assert_false(pc2.getReceivers()[0].track.muted, `track is unmuted`); + }, `track with ${kind} gets unmuted when packets flow.`); + + promise_test(async t => { + const pc1 = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + t.add_cleanup(() => pc2.close()); + + const stream = await navigator.mediaDevices.getUserMedia({[kind]: true}); + t.add_cleanup(() => stream.getTracks().forEach(t => t.stop())); + + pc1.addTrack(stream.getTracks()[0], stream); + pc2.ontrack = t.step_func(async e => { + assert_true(e.track.muted); + }); + + await exchangeIceCandidates(pc1, pc2); + await exchangeOfferAnswer(pc1, pc2); + await waitUntilTrackEventWithTimeout(pc2.getReceivers()[0].track, 'unmute', t); + assert_false(pc2.getReceivers()[0].track.muted); + + pc1.getTransceivers()[0].direction = 'inactive'; + await exchangeOfferAnswer(pc1, pc2); + await waitUntilTrackEventWithTimeout(pc2.getReceivers()[0].track, 'mute', t); + assert_true(pc2.getReceivers()[0].track.muted, `track is muted`); + }, `track with ${kind} gets muted when setting the transceiver direction in 'inactive'`); +}); + </script>
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-copy-treeoutline-expected.txt b/third_party/blink/web_tests/http/tests/devtools/console/console-copy-treeoutline-expected.txt deleted file mode 100644 index d6e7a1a..0000000 --- a/third_party/blink/web_tests/http/tests/devtools/console/console-copy-treeoutline-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -Tests that console copies tree outline messages properly. - - -Running: testSelectAll -Selected text: console-copy-treeoutline.js:20 {foo: 1, bar: 'string'} -
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-copy-treeoutline.js b/third_party/blink/web_tests/http/tests/devtools/console/console-copy-treeoutline.js deleted file mode 100644 index 71e3e10..0000000 --- a/third_party/blink/web_tests/http/tests/devtools/console/console-copy-treeoutline.js +++ /dev/null
@@ -1,43 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {TestRunner} from 'test_runner'; -import {ConsoleTestRunner} from 'console_test_runner'; - -import * as Console from 'devtools/panels/console/console.js'; - -(async function() { - TestRunner.addResult(`Tests that console copies tree outline messages properly.\n`); - - await TestRunner.showPanel('console'); - - await TestRunner.evaluateInPagePromise(` - var anObject = { - foo: 1, - bar: "string" - }; - console.log(anObject); - `); - - ConsoleTestRunner.fixConsoleViewportDimensions(600, 200); - var consoleView = Console.ConsoleView.ConsoleView.instance(); - var viewport = consoleView.viewport; - - TestRunner.runTestSuite([async function testSelectAll(next) { - viewport.forceScrollItemToBeFirst(0); - - // Set some initial selection in console. - var base = consoleView.itemElement(0).element(); - // Console messages contain live locations. - await TestRunner.waitForPendingLiveLocationUpdates(); - window.getSelection().setBaseAndExtent(base, 0, base, 1); - - // Try to select all messages. - document.execCommand('selectAll'); - - var text = viewport.selectedText(); - TestRunner.addResult('Selected text: ' + text); - next(); - }]); -})();
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-viewport-selection-expected.txt b/third_party/blink/web_tests/http/tests/devtools/console/console-viewport-selection-expected.txt index 321b6457..15c5dd2 100644 --- a/third_party/blink/web_tests/http/tests/devtools/console/console-viewport-selection-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/console/console-viewport-selection-expected.txt
@@ -54,9 +54,6 @@ Running: testZeroOffsetSelection Selected text: world -Running: testSelectAll -Selected all 150 messages. - Running: testSelectWithNonTextNodeContainer Selected text: console-viewport-selection.js:18 Message #1
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-viewport-selection.js b/third_party/blink/web_tests/http/tests/devtools/console/console-viewport-selection.js index 60c85cc..3c21489 100644 --- a/third_party/blink/web_tests/http/tests/devtools/console/console-viewport-selection.js +++ b/third_party/blink/web_tests/http/tests/devtools/console/console-viewport-selection.js
@@ -132,25 +132,6 @@ next(); }, - function testSelectAll(next) { - viewport.forceScrollItemToBeFirst(0); - - // Set some initial selection in console. - var base = consoleView.itemElement(messagesCount - 2).element(); - var extent = consoleView.itemElement(messagesCount - 1).element(); - window.getSelection().setBaseAndExtent(base, 0, extent, 0); - - // Try to select all messages. - document.execCommand('selectAll'); - - var text = viewport.selectedText(); - var count = text ? text.split('\n').length : 0; - TestRunner.addResult( - count === messagesCount ? 'Selected all ' + count + ' messages.' : - 'Selected ' + count + ' messages instead of ' + messagesCount); - next(); - }, - function testSelectWithNonTextNodeContainer(next) { viewport.forceScrollItemToBeFirst(0);
diff --git a/third_party/blink/web_tests/svg/dom/svganimatedlength-initial-values.html b/third_party/blink/web_tests/svg/dom/svganimatedlength-initial-values.html deleted file mode 100644 index fa22e5c5..0000000 --- a/third_party/blink/web_tests/svg/dom/svganimatedlength-initial-values.html +++ /dev/null
@@ -1,35 +0,0 @@ -<!DOCTYPE html> -<title>SVGAnimatedLength, initial values</title> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script src="resources/initial-value-helper.js"></script> -<script> -// Initial values of '0' need not be specified. -assert_initial_values([ - { interface: 'SVGCircleElement', attributes: [ 'cx', 'cy', 'r' ] }, - { interface: 'SVGEllipseElement', attributes: [ 'cx', 'cy', 'rx', 'ry' ] }, - { interface: 'SVGFilterElement', attributes: [ 'x', 'y', 'width', 'height' ], - x: { initial: '-10%' }, y: { initial: '-10%' }, width: { initial: '120%' }, height: { initial: '120%' } }, - { interface: 'SVGFilterPrimitiveStandardAttributes', attributes: [ 'x', 'y', 'width', 'height' ], - x: { initial: '0%' }, y: { initial: '0%' }, width: { initial: '100%' }, height: { initial: '100%' } }, - { interface: 'SVGForeignObjectElement', attributes: [ 'x', 'y', 'width', 'height' ] }, - { interface: 'SVGImageElement', attributes: [ 'x', 'y', 'width', 'height' ] }, - { interface: 'SVGLineElement', attributes: [ 'x1', 'y1', 'x2', 'y2' ] }, - { interface: 'SVGLinearGradientElement', attributes: [ 'x1', 'y1', 'x2', 'y2' ], - x1: { initial: '0%' }, y1: { initial: '0%' }, x2: { initial: '100%' }, y2: { initial: '0%' } }, - { interface: 'SVGMarkerElement', attributes: [ 'refX', 'refY', 'markerWidth', 'markerHeight' ], - markerWidth: { initial: '3' }, markerHeight: { initial: '3' } }, - { interface: 'SVGMaskElement', attributes: [ 'x', 'y', 'width', 'height' ], - x: { initial: '-10%' }, y: { initial: '-10%' }, width: { initial: '120%' }, height: { initial: '120%' } }, - { interface: 'SVGPatternElement', attributes: [ 'x', 'y', 'width', 'height' ] }, - { interface: 'SVGRadialGradientElement', attributes: [ 'cx', 'cy', 'r', 'fx', 'fy', 'fr' ], - cx: { initial: '50%' }, cy: { initial: '50%' }, r: { initial: '50%' }, - fx: { initial: '50%' }, fy: { initial: '50%' }, fr: { initial: '0%' } }, - { interface: 'SVGRectElement', attributes: [ 'x', 'y', 'width', 'height', 'rx', 'ry' ] }, - { interface: 'SVGSVGElement', attributes: [ 'x', 'y', 'width', 'height' ], - width: { initial: '100%' }, height: { initial: '100%' } }, - { interface: 'SVGTextContentElement', attributes: [ 'textLength' ] }, - { interface: 'SVGTextPathElement', attributes: [ 'startOffset' ] }, - { interface: 'SVGUseElement', attributes: [ 'x', 'y', 'width', 'height' ] }, -], { initial: '0', valid: '42', getValue: function(value) { return value.valueAsString } }); -</script>
diff --git a/third_party/blink/web_tests/webexposed/css-properties-as-js-properties-expected.txt b/third_party/blink/web_tests/webexposed/css-properties-as-js-properties-expected.txt index 1a8fdd0c..b624b3c 100644 --- a/third_party/blink/web_tests/webexposed/css-properties-as-js-properties-expected.txt +++ b/third_party/blink/web_tests/webexposed/css-properties-as-js-properties-expected.txt
@@ -162,11 +162,15 @@ containerType content contentVisibility +cornerBlockEndShape +cornerBlockStartShape cornerBottomLeftShape cornerBottomRightShape cornerBottomShape cornerEndEndShape cornerEndStartShape +cornerInlineEndShape +cornerInlineStartShape cornerLeftShape cornerRightShape cornerShape
diff --git a/third_party/blink/web_tests/webexposed/css-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/css-property-listing-expected.txt index be3eea4..68d5ac1f 100644 --- a/third_party/blink/web_tests/webexposed/css-property-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/css-property-listing-expected.txt
@@ -661,9 +661,21 @@ container container-name container-type + corner-block-end-shape + corner-end-end-shape + corner-end-start-shape + corner-block-start-shape + corner-start-end-shape + corner-start-start-shape corner-bottom-shape corner-bottom-left-shape corner-bottom-right-shape + corner-inline-end-shape + corner-end-end-shape + corner-start-end-shape + corner-inline-start-shape + corner-end-start-shape + corner-start-start-shape corner-left-shape corner-bottom-left-shape corner-top-left-shape
diff --git a/third_party/crossbench b/third_party/crossbench index 1de2eca..e80b653 160000 --- a/third_party/crossbench +++ b/third_party/crossbench
@@ -1 +1 @@ -Subproject commit 1de2eca3495784b797d977b40b7291a4a7cd06c1 +Subproject commit e80b653acb5d31fa6de5079b47e61b8aaa2f83fa
diff --git a/third_party/dawn b/third_party/dawn index fd27657..f526741 160000 --- a/third_party/dawn +++ b/third_party/dawn
@@ -1 +1 @@ -Subproject commit fd276573ab859ea73c18581c018a773e4e3b8902 +Subproject commit f5267414465b15f31e7cf9d930c0c0ba50579560
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index 7ad25e2..668292f 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit 7ad25e25037043f7a75e7a838a651c110b918d48 +Subproject commit 668292f6e38a78c16e1877c6e9919716bd7da04d
diff --git a/third_party/libaom/README.chromium b/third_party/libaom/README.chromium index 28773e3..651f4128 100644 --- a/third_party/libaom/README.chromium +++ b/third_party/libaom/README.chromium
@@ -2,7 +2,7 @@ Short Name: libaom URL: https://aomedia.googlesource.com/aom/ Version: N/A -Revision: 6c4010bde34318fd6c1f0d10196f27ac9908eeb8 +Revision: 3304ee478e7e8e41da2d9f96e5c5fc9b1e5bb043 CPEPrefix: cpe:/a:aomedia:aomedia:3.12.1 License: BSD-2-Clause, Patent License Android Compatible: yes
diff --git a/third_party/libaom/source/config/config/aom_version.h b/third_party/libaom/source/config/config/aom_version.h index 1225abc6..63c6e7c5 100644 --- a/third_party/libaom/source/config/config/aom_version.h +++ b/third_party/libaom/source/config/config/aom_version.h
@@ -14,9 +14,9 @@ #define VERSION_MAJOR 3 #define VERSION_MINOR 12 #define VERSION_PATCH 1 -#define VERSION_EXTRA "182-g6c4010bde3" +#define VERSION_EXTRA "179-g3304ee478e" #define VERSION_PACKED \ ((VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | (VERSION_PATCH)) -#define VERSION_STRING_NOSP "3.12.1-182-g6c4010bde3" -#define VERSION_STRING " 3.12.1-182-g6c4010bde3" +#define VERSION_STRING_NOSP "3.12.1-179-g3304ee478e" +#define VERSION_STRING " 3.12.1-179-g3304ee478e" #endif // AOM_VERSION_H_
diff --git a/third_party/libaom/source/libaom b/third_party/libaom/source/libaom index 6c4010b..3304ee4 160000 --- a/third_party/libaom/source/libaom +++ b/third_party/libaom/source/libaom
@@ -1 +1 @@ -Subproject commit 6c4010bde34318fd6c1f0d10196f27ac9908eeb8 +Subproject commit 3304ee478e7e8e41da2d9f96e5c5fc9b1e5bb043
diff --git a/third_party/perfetto b/third_party/perfetto index 15b79e4..167e1f0 160000 --- a/third_party/perfetto +++ b/third_party/perfetto
@@ -1 +1 @@ -Subproject commit 15b79e4bc067016a592fac0b9875eb0322ea9a1a +Subproject commit 167e1f0dab2691a4b2a911e001317353405d83d9
diff --git a/third_party/skia b/third_party/skia index f8cd9fe..dc1958e 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit f8cd9fe75f21d3be759cbf9491ddc582efcf1e2a +Subproject commit dc1958e7118c351cef5adae548337f7f11746b95
diff --git a/third_party/webrtc b/third_party/webrtc index 4c619d7..2f61be1 160000 --- a/third_party/webrtc +++ b/third_party/webrtc
@@ -1 +1 @@ -Subproject commit 4c619d7b0f2020e1b54fc62aaafc24fc34af78f8 +Subproject commit 2f61be11629916ec0d3f083ef16b85113ee1db54
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index 339ebe62..316567b 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py
@@ -39,7 +39,7 @@ # These fields are written by //tools/clang/scripts/upload_revision.py, and # should not be changed manually. # They are also read by build/config/compiler/BUILD.gn. -CLANG_REVISION = 'llvmorg-21-init-15009-g841a7f08' +CLANG_REVISION = 'llvmorg-21-init-11777-gfd3fecfc' CLANG_SUB_REVISION = 1 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION)
diff --git a/tools/clang/spanify/Spanifier.cpp b/tools/clang/spanify/Spanifier.cpp index a7242e0..43bf71c 100644 --- a/tools/clang/spanify/Spanifier.cpp +++ b/tools/clang/spanify/Spanifier.cpp
@@ -932,6 +932,38 @@ ")", source_manager)); } +// Closes an open `base::span(` if present. +// Returns a `.subspan(` opener. +// Opens a `base::checked_cast(` if necessary. +static std::string CreateSubspanOpener( + const clang::ArrayTypeLoc* rhs_array_type, + const SubspanExprReplacement* subspan_expr_replacement) { + std::string_view maybe_base_span_closer = rhs_array_type ? ")" : ""; + std::string_view maybe_checked_cast_opener = ""; + if (const auto* replacement = + std::get_if<CheckedCastReplacement>(subspan_expr_replacement)) { + maybe_checked_cast_opener = replacement->opener.text; + } + return llvm::formatv("{0}.subspan({1}", maybe_base_span_closer, + maybe_checked_cast_opener); +} + +// Returns a `.subspan(` closer. +// Closes an open `base::checked_cast(` if necessary, +// or appends a `u` to the integer literal expression. +static std::string CreateSubspanCloser( + const SubspanExprReplacement* subspan_expr_replacement) { + std::string_view maybe_closer = ""; + if (const auto* replacement = + std::get_if<RangedReplacement>(subspan_expr_replacement)) { + maybe_closer = replacement->text; + } else if (const auto* replacement = std::get_if<CheckedCastReplacement>( + subspan_expr_replacement)) { + maybe_closer = replacement->closer.text; + } + return llvm::formatv("{0})", maybe_closer); +} + static void AdaptBinaryOperation(const MatchFinder::MatchResult& result) { const clang::SourceManager& source_manager = *result.SourceManager; const auto* binary_operation = @@ -984,24 +1016,29 @@ // becomes // // a .subspan( b + const auto* binary_op_RHS = + GetNodeOrCrash<clang::Expr>(result, "binary_op_rhs", __FUNCTION__); + const auto subspan_expr_replacement = + GetSubspanExprReplacement(binary_op_RHS, result, key); + + std::string subspan_opener = + CreateSubspanOpener(rhs_array_type, &subspan_expr_replacement); + const clang::SourceLocation binary_operator_begin = GetBinaryOperationOperatorLoc(binary_operation, result); EmitReplacement( key, GetReplacementDirective( {binary_operator_begin, binary_operator_begin.getLocWithOffset(1)}, - llvm::formatv("{0}.subspan(", rhs_array_type ? ")" : ""), - source_manager, -kAdaptBinaryOperationPrecedence)); + subspan_opener, source_manager, -kAdaptBinaryOperationPrecedence)); - const auto* binary_op_RHS = - GetNodeOrCrash<clang::Expr>(result, "binary_op_rhs", __FUNCTION__); const clang::SourceRange operator_rhs_range = getExprRange( binary_op_RHS, source_manager, result.Context->getLangOpts()); - // Insert the closing right parenthesis. + std::string subspan_closer = CreateSubspanCloser(&subspan_expr_replacement); EmitReplacement(key, GetReplacementDirective( - operator_rhs_range.getEnd(), ")", source_manager, - -kAdaptBinaryOperationPrecedence)); + operator_rhs_range.getEnd(), subspan_closer, + source_manager, -kAdaptBinaryOperationPrecedence)); // It's possible we emitted a rewrite that creates a temporary but // unnamed `base::span` (issue 408018846). This could end up being
diff --git a/tools/clang/spanify/tests/basics-expected.cc b/tools/clang/spanify/tests/basics-expected.cc index 97d66d5..1a70414 100644 --- a/tools/clang/spanify/tests/basics-expected.cc +++ b/tools/clang/spanify/tests/basics-expected.cc
@@ -10,6 +10,7 @@ #include "base/containers/span.h" #include "base/memory/raw_ptr.h" +#include "base/numerics/safe_conversions.h" class A { public: @@ -82,40 +83,54 @@ // temp = (++expected_data).data(); temp = (++expected_data).data(); // Expected rewrite: - // temp = expected_data.subspan(1).data(); - temp = expected_data.subspan(1).data(); + // temp = expected_data.subspan(1u).data(); + temp = expected_data.subspan(1u).data(); // Expected rewrite: - // temp = expected_data.subspan(index).data(); - temp = expected_data.subspan(index).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(index)).data(); + temp = expected_data.subspan(base::checked_cast<size_t>(index)).data(); // Expected rewrite: - // temp = expected_data.subspan(offset()).data(); - temp = expected_data.subspan(offset()).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(offset())).data(); + temp = expected_data.subspan(base::checked_cast<size_t>(offset())).data(); // Expected rewrite: - // temp = expected_data.subspan(offset(2)).data(); - temp = expected_data.subspan(offset(2)).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(offset(2))).data(); + temp = expected_data.subspan(base::checked_cast<size_t>(offset(2))).data(); // Expected rewrite: - // temp = expected_data.subspan(offset(index)).data(); - temp = expected_data.subspan(offset(index)).data(); + // temp = + // expected_data.subspan(base::checked_cast<size_t>(offset(index))).data(); + temp = + expected_data.subspan(base::checked_cast<size_t>(offset(index))).data(); // Expected rewrite: - // temp = expected_data.subspan(1 + index + offset(index)).data(); - temp = expected_data.subspan(1 + index + offset(index)).data(); + // temp = expected_data + // .subspan(base::checked_cast<size_t>(1 + index + offset(index))) + // .data(); + temp = expected_data + .subspan(base::checked_cast<size_t>(1 + index + offset(index))) + .data(); // Expected rewrite: - // temp = expected_data.subspan(1 + index - 3 + offset(index)).data(); - temp = expected_data.subspan(1 + index - 3 + offset(index)).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(1 + index - 3 + + // offset(index))).data(); + temp = expected_data + .subspan(base::checked_cast<size_t>(1 + index - 3 + offset(index))) + .data(); // Expected rewrite: - // temp = expected_data.subspan(index * 2).data(); - temp = expected_data.subspan(index * 2).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(index * 2)).data(); + temp = expected_data.subspan(base::checked_cast<size_t>(index * 2)).data(); // Expected rewrite: - // temp = expected_data.subspan(index + 2 * 2).data(); - temp = expected_data.subspan(index + 2 * 2).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(index + 2 * + // 2)).data(); + temp = + expected_data.subspan(base::checked_cast<size_t>(index + 2 * 2)).data(); // Expected rewrite: - // temp = expected_data.subspan(index + 2 * 2 + offset()).data(); - temp = expected_data.subspan(index + 2 * 2 + offset()).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(index + 2 * 2 + + // offset())).data(); + temp = expected_data + .subspan(base::checked_cast<size_t>(index + 2 * 2 + offset())) + .data(); // Expected rewrite: // base::span<char> ptr = buf; @@ -231,16 +246,18 @@ int index = 11; // Expected rewrite: - // memcpy(buf2.subspan(1).data(), buf.subspan(index).data(), 10); - memcpy(buf2.subspan(1).data(), buf.subspan(index).data(), 10); + // memcpy(buf2.subspan(1u).data(), + // buf.subspan(base::checked_cast<size_t>(index)).data(), 10); + memcpy(buf2.subspan(1u).data(), + buf.subspan(base::checked_cast<size_t>(index)).data(), 10); // Expected rewrite: // int i = (buf++)[0]; int i = (buf++)[0]; // i = (++buf)[0] i = (++buf)[0]; - // i = (buf.subspan(index)[0]) - i = (buf.subspan(index)[0]); + // i = (buf.subspan(base::checked_cast<size_t>(index))[0]); + i = (buf.subspan(base::checked_cast<size_t>(index))[0]); // i = buf[0]; i = buf[0]; }
diff --git a/tools/clang/spanify/tests/basics-original.cc b/tools/clang/spanify/tests/basics-original.cc index 6f5207d..19cd8620 100644 --- a/tools/clang/spanify/tests/basics-original.cc +++ b/tools/clang/spanify/tests/basics-original.cc
@@ -80,39 +80,45 @@ // temp = (++expected_data).data(); temp = ++expected_data; // Expected rewrite: - // temp = expected_data.subspan(1).data(); + // temp = expected_data.subspan(1u).data(); temp = expected_data + 1; // Expected rewrite: - // temp = expected_data.subspan(index).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(index)).data(); temp = expected_data + index; // Expected rewrite: - // temp = expected_data.subspan(offset()).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(offset())).data(); temp = expected_data + offset(); // Expected rewrite: - // temp = expected_data.subspan(offset(2)).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(offset(2))).data(); temp = expected_data + offset(2); // Expected rewrite: - // temp = expected_data.subspan(offset(index)).data(); + // temp = + // expected_data.subspan(base::checked_cast<size_t>(offset(index))).data(); temp = expected_data + offset(index); // Expected rewrite: - // temp = expected_data.subspan(1 + index + offset(index)).data(); + // temp = expected_data + // .subspan(base::checked_cast<size_t>(1 + index + offset(index))) + // .data(); temp = expected_data + 1 + index + offset(index); // Expected rewrite: - // temp = expected_data.subspan(1 + index - 3 + offset(index)).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(1 + index - 3 + + // offset(index))).data(); temp = expected_data + 1 + index - 3 + offset(index); // Expected rewrite: - // temp = expected_data.subspan(index * 2).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(index * 2)).data(); temp = expected_data + index * 2; // Expected rewrite: - // temp = expected_data.subspan(index + 2 * 2).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(index + 2 * + // 2)).data(); temp = expected_data + index + 2 * 2; // Expected rewrite: - // temp = expected_data.subspan(index + 2 * 2 + offset()).data(); + // temp = expected_data.subspan(base::checked_cast<size_t>(index + 2 * 2 + + // offset())).data(); temp = expected_data + index + 2 * 2 + offset(); // Expected rewrite: @@ -229,7 +235,8 @@ int index = 11; // Expected rewrite: - // memcpy(buf2.subspan(1).data(), buf.subspan(index).data(), 10); + // memcpy(buf2.subspan(1u).data(), + // buf.subspan(base::checked_cast<size_t>(index)).data(), 10); memcpy(buf2 + 1, buf + index, 10); // Expected rewrite: @@ -237,7 +244,7 @@ int i = *buf++; // i = (++buf)[0] i = *++buf; - // i = (buf.subspan(index)[0]) + // i = (buf.subspan(base::checked_cast<size_t>(index))[0]); i = *(buf + index); // i = buf[0]; i = *buf;
diff --git a/tools/clang/spanify/tests/return-stmts-expected.cc b/tools/clang/spanify/tests/return-stmts-expected.cc index d19a1eb7..6df5b56 100644 --- a/tools/clang/spanify/tests/return-stmts-expected.cc +++ b/tools/clang/spanify/tests/return-stmts-expected.cc
@@ -1,9 +1,11 @@ // Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <cstdint> #include <vector> #include "base/containers/span.h" +#include "base/numerics/safe_conversions.h" // Expected rewrite: // base::span<int> fct1() @@ -55,7 +57,9 @@ // base::span<int> var1 = new int[1024]; base::span<int> var1 = new int[1024]; int offset = 1; - return var1.subspan(offset); + // Expected rewrite: + // return var1.subspan(base::checked_cast<size_t>(offset)); + return var1.subspan(base::checked_cast<size_t>(offset)); } // Expected rewrite: @@ -67,8 +71,10 @@ base::span<int> var1 = new int[1024]; int offset = 1; // Expected rewrite: - // return base::as_writable_byte_span(var1.subspan(offset)); - return base::as_writable_byte_span(var1.subspan(offset)); + // return + // base::as_writable_byte_span(var1.subspan(base::checked_cast<size_t>(offset))); + return base::as_writable_byte_span( + var1.subspan(base::checked_cast<size_t>(offset))); } // Function return type not rewritten since not used. @@ -79,8 +85,8 @@ base::span<int> var1 = new int[1024]; int offset = 1; // Expected rewrite: - // return var1.subspan(offset).data(); - return var1.subspan(offset).data(); + // return var1.subspan(base::checked_cast<size_t>(offset)).data(); + return var1.subspan(base::checked_cast<size_t>(offset)).data(); } // Function return type not rewritten since not used. @@ -91,10 +97,13 @@ base::span<int> var1 = new int[1024]; int offset = 1; // Expected rewrite: - // return reinterpret_cast<char*>(var1).subspan(offset).data(); + // return + // reinterpret_cast<char*>(var1).subspan(base::checked_cast<size_t>(offset)).data(); // As-is, this code doesn't compile because we don't yet handle // adapting these reinterpret_cast expressions for spans. - return reinterpret_cast<char*>(var1).subspan(offset).data(); + return reinterpret_cast<char*>(var1) + .subspan(base::checked_cast<size_t>(offset)) + .data(); } void usage() {
diff --git a/tools/clang/spanify/tests/return-stmts-original.cc b/tools/clang/spanify/tests/return-stmts-original.cc index 8be0738..123d6f0 100644 --- a/tools/clang/spanify/tests/return-stmts-original.cc +++ b/tools/clang/spanify/tests/return-stmts-original.cc
@@ -53,6 +53,8 @@ // base::span<int> var1 = new int[1024]; int* var1 = new int[1024]; int offset = 1; + // Expected rewrite: + // return var1.subspan(base::checked_cast<size_t>(offset)); return var1 + offset; } @@ -65,7 +67,8 @@ int* var1 = new int[1024]; int offset = 1; // Expected rewrite: - // return base::as_writable_byte_span(var1.subspan(offset)); + // return + // base::as_writable_byte_span(var1.subspan(base::checked_cast<size_t>(offset))); return reinterpret_cast<char*>(var1 + offset); } @@ -77,7 +80,7 @@ int* var1 = new int[1024]; int offset = 1; // Expected rewrite: - // return var1.subspan(offset).data(); + // return var1.subspan(base::checked_cast<size_t>(offset)).data(); return var1 + offset; } @@ -89,7 +92,8 @@ int* var1 = new int[1024]; int offset = 1; // Expected rewrite: - // return reinterpret_cast<char*>(var1).subspan(offset).data(); + // return + // reinterpret_cast<char*>(var1).subspan(base::checked_cast<size_t>(offset)).data(); // As-is, this code doesn't compile because we don't yet handle // adapting these reinterpret_cast expressions for spans. return reinterpret_cast<char*>(var1) + offset;
diff --git a/tools/clang/spanify/tests/span-from-array-issue-400861276-expected.cc b/tools/clang/spanify/tests/span-from-array-issue-400861276-expected.cc index 2df1f71..7695b58 100644 --- a/tools/clang/spanify/tests/span-from-array-issue-400861276-expected.cc +++ b/tools/clang/spanify/tests/span-from-array-issue-400861276-expected.cc
@@ -24,6 +24,6 @@ UseBufferUnsafely(int_array); // Expected rewrite: - // UseBufferUnsafely(base::span<int>(int_array).subspan(1)); - UseBufferUnsafely(base::span<int>(int_array).subspan(1)); + // UseBufferUnsafely(base::span<int>(int_array).subspan(1u)); + UseBufferUnsafely(base::span<int>(int_array).subspan(1u)); }
diff --git a/tools/clang/spanify/tests/span-from-array-issue-400861276-original.cc b/tools/clang/spanify/tests/span-from-array-issue-400861276-original.cc index d5fb3f6..77ca55a 100644 --- a/tools/clang/spanify/tests/span-from-array-issue-400861276-original.cc +++ b/tools/clang/spanify/tests/span-from-array-issue-400861276-original.cc
@@ -20,6 +20,6 @@ UseBufferUnsafely(int_array); // Expected rewrite: - // UseBufferUnsafely(base::span<int>(int_array).subspan(1)); + // UseBufferUnsafely(base::span<int>(int_array).subspan(1u)); UseBufferUnsafely(int_array + 1); }
diff --git a/tools/clang/spanify/tests/treat-ignored-paths-as-frontiers-expected.cc b/tools/clang/spanify/tests/treat-ignored-paths-as-frontiers-expected.cc index 4f103d85..cd08eea4 100644 --- a/tools/clang/spanify/tests/treat-ignored-paths-as-frontiers-expected.cc +++ b/tools/clang/spanify/tests/treat-ignored-paths-as-frontiers-expected.cc
@@ -16,6 +16,6 @@ // TODO(crbug.com/419598098): figure out why this doesn't work. // // Expected rewrite: - // return GetUnsafeChar(arg.subspan(1u).data()); - return GetUnsafeChar(arg.subspan(1)); + // return GetUnsafeChar(arg.subspan(1u)); + return GetUnsafeChar(arg.subspan(1u)); }
diff --git a/tools/clang/spanify/tests/treat-ignored-paths-as-frontiers-original.cc b/tools/clang/spanify/tests/treat-ignored-paths-as-frontiers-original.cc index 42ca2c8e9..8fd1cd0 100644 --- a/tools/clang/spanify/tests/treat-ignored-paths-as-frontiers-original.cc +++ b/tools/clang/spanify/tests/treat-ignored-paths-as-frontiers-original.cc
@@ -14,6 +14,6 @@ // TODO(crbug.com/419598098): figure out why this doesn't work. // // Expected rewrite: - // return GetUnsafeChar(arg.subspan(1u).data()); + // return GetUnsafeChar(arg.subspan(1u)); return GetUnsafeChar(arg + 1); }
diff --git a/tools/clang/spanify/tests/var-construction-expected.cc b/tools/clang/spanify/tests/var-construction-expected.cc index 07588df5..2795976 100644 --- a/tools/clang/spanify/tests/var-construction-expected.cc +++ b/tools/clang/spanify/tests/var-construction-expected.cc
@@ -2,11 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include <array> +#include <cstdint> #include <vector> #include "base/containers/span.h" #include "base/memory/raw_ptr.h" #include "base/memory/raw_span.h" +#include "base/numerics/safe_conversions.h" // Expected rewrite: // base::span<T> get() @@ -123,7 +125,7 @@ // Expected rewrite: // base::raw_span<char> buf5 = buf4; base::raw_span<char> buf5 = buf4; - buf5 = buf5.subspan(1); + buf5 = buf5.subspan(1u); // Expected rewrite: // base::raw_span<char> buf6 = buf5; @@ -136,7 +138,8 @@ int index = 1; // Expected rewrite: - // raw_ptr<char> buf7 = buf6.subspan(index).data(); - raw_ptr<char> buf7 = buf6.subspan(index).data(); + // raw_ptr<char> buf7 = + // buf6.subspan(base::checked_cast<size_t>(index)).data(); + raw_ptr<char> buf7 = buf6.subspan(base::checked_cast<size_t>(index)).data(); (void)buf7; }
diff --git a/tools/clang/spanify/tests/var-construction-original.cc b/tools/clang/spanify/tests/var-construction-original.cc index d34d053..8390d62 100644 --- a/tools/clang/spanify/tests/var-construction-original.cc +++ b/tools/clang/spanify/tests/var-construction-original.cc
@@ -134,7 +134,8 @@ int index = 1; // Expected rewrite: - // raw_ptr<char> buf7 = buf6.subspan(index).data(); + // raw_ptr<char> buf7 = + // buf6.subspan(base::checked_cast<size_t>(index)).data(); raw_ptr<char> buf7 = buf6 + index; (void)buf7; }
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index e457ee8e..946f7100 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -4491,6 +4491,16 @@ </description> </action> +<action + name="Autofill.PaymentMethodsSettingsPage.ManagePaymentMethodsLinkClicked"> + <owner>smcgruer@chromium.org</owner> + <owner>chrome-payments-eng@google.com</owner> + <description> + Recorded when the user clicks the link on the payment methods settings page + to manage Google Pay payment methods. + </description> +</action> + <action name="Autofill.PaymentMethodsSettingsPage.ScanCardClicked"> <owner>darwinyang@google.com</owner> <owner>chrome-payments-eng@google.com</owner> @@ -47298,6 +47308,14 @@ </description> </action> +<action name="WebAuthn.Dialog.UserSelected.PasswordOnly"> + <owner>derinel@google.com</owner> + <owner>chrome-webauthn@google.com</owner> + <description> + User selected a password option in the WebAuthn combined selector dialog. + </description> +</action> + <action name="WebAuthn.Dialog.UserSelected.ProfileOnly"> <owner>derinel@google.com</owner> <owner>chrome-webauthn@google.com</owner> @@ -47342,6 +47360,18 @@ </description> </action> +<action name="WebAuthn.GetAssertion.CombinedSelectorShown" + not_user_triggered="true"> + <owner>derinel@google.com</owner> + <owner>chrome-webauthn@google.com</owner> + <description> + Recorded when the user is displayed the combined selector sheet, which is a + dialog that lists available passkeys or passwords from different sources. + This UI is used for navigator.credentials.get() requests with mediation: + "immediate" + </description> +</action> + <action name="WebAuthn.GetAssertion.Conditional.Start" not_user_triggered="true"> <owner>derinel@google.com</owner> @@ -47664,6 +47694,25 @@ </description> </action> +<action name="WebAuthn.GetCredential.Start" not_user_triggered="true"> + <owner>derinel@google.com</owner> + <owner>chrome-webauthn@google.com</owner> + <description> + Recorded when a GetCredential request with mediation = "immediate" + is started. + </description> +</action> + +<action name="WebAuthn.GetCredential.SuccessWithPassword" + not_user_triggered="true"> + <owner>derinel@google.com</owner> + <owner>chrome-webauthn@google.com</owner> + <description> + Recorded when the user selected a password credential in the immediate + mediation selection dialog. + </description> +</action> + <action name="WebAuthn.Gpm.Failure" not_user_triggered="true"> <owner>derinel@google.com</owner> <owner>chrome-webauthn@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/blink/enums.xml b/tools/metrics/histograms/metadata/blink/enums.xml index f3aabc6..fc544071 100644 --- a/tools/metrics/histograms/metadata/blink/enums.xml +++ b/tools/metrics/histograms/metadata/blink/enums.xml
@@ -7814,6 +7814,10 @@ <int value="861" label="corner-right-shape"/> <int value="862" label="corner-bottom-shape"/> <int value="863" label="corner-left-shape"/> + <int value="864" label="corner-block-start-shape"/> + <int value="865" label="corner-block-end-shape"/> + <int value="866" label="corner-inline-start-shape"/> + <int value="867" label="corner-inline-end-shape"/> </enum> <!-- LINT.ThenChange(//third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom:CSSSampleId) -->
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml index caae373..fc75863a 100644 --- a/tools/metrics/histograms/metadata/ios/histograms.xml +++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -376,6 +376,15 @@ </summary> </histogram> +<histogram name="IOS.BWG.Eligibility" enum="Boolean" expires_after="2026-02-01"> + <owner>sebsg@chromium.org</owner> + <owner>bling-alchemy@google.com</owner> + <summary> + Records whether the user is eligible for BWG. Logged when eligibility is + checked prior to showing entry points, promos, etc. + </summary> +</histogram> + <histogram name="IOS.CaptivePortal.SecureConnectionFailed" enum="CaptivePortalStatus" expires_after="2023-09-07"> <owner>michaeldo@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/password/enums.xml b/tools/metrics/histograms/metadata/password/enums.xml index 1a9fe58..a4029930 100644 --- a/tools/metrics/histograms/metadata/password/enums.xml +++ b/tools/metrics/histograms/metadata/password/enums.xml
@@ -277,6 +277,21 @@ <int value="7" label="Edit username and password and save"/> </enum> +<!-- LINT.IfChange(CredentialManagerAndroidGetResult) --> + +<enum name="CredentialManagerAndroidGetResult"> + <int value="0" label="New type of error, unhandled in Chrome"/> + <int value="1" label="The operation succeeded"/> + <int value="2" label="The user intentionally canceled the flow"/> + <int value="3" label="Custom error by the third-party SDK"/> + <int value="4" label="Failed due to a transient internal API interruption"/> + <int value="5" label="Configurations are mismatched for the provider"/> + <int value="6" label="Failed with no detailed information"/> + <int value="7" label="Credential manager is unsupported"/> +</enum> + +<!-- LINT.ThenChange(//components/credential_management/android/java/src/org/chromium/components/credential_management/CredentialManagerAndroidGetResult.java:CredentialManagerAndroidGetResult) --> + <enum name="CredentialManagerAPIError"> <summary> Numeric values correspond to CredentialManagerStatusCodes class.
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml index e6fc5c03..d9781a30 100644 --- a/tools/metrics/histograms/metadata/password/histograms.xml +++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -1386,6 +1386,17 @@ <token key="ProfileType" variants="ProfileType"/> </histogram> +<histogram name="PasswordManager.CredentialRequest.ThirdParty.Get" + enum="CredentialManagerAndroidGetResult" expires_after="2025-12-11"> + <owner>izuzic@google.com</owner> + <owner>anki-team@google.com</owner> + <summary> + Log the result of the call to the Credential Manager API on Android when + getting a credential. Logged only on Android when Chrome uses platform + Autofill. + </summary> +</histogram> + <histogram name="PasswordManager.CredentialRequest.ThirdParty.Store" enum="CredentialManagerStoreResult" expires_after="2025-12-11"> <owner>izuzic@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/sql/enums.xml b/tools/metrics/histograms/metadata/sql/enums.xml index dc97e47..49d859b 100644 --- a/tools/metrics/histograms/metadata/sql/enums.xml +++ b/tools/metrics/histograms/metadata/sql/enums.xml
@@ -46,6 +46,25 @@ <!-- LINT.ThenChange(//sql/database.cc) --> +<!-- LINT.IfChange(RazeDatabaseFailedReason) --> + +<enum name="RazeDatabaseFailedReason"> + <summary>The reason the call to Database::Raze(...) failed.</summary> + <int value="0" label="kPoisoned"/> + <int value="1" label="kPendingTransaction"/> + <int value="2" label="kCantOpenInMemory"/> + <int value="3" label="kAutoVacuumFailed"/> + <int value="4" label="kSchemaFailed"/> + <int value="5" label="kLocked"/> + <int value="6" label="kTruncateFailed"/> + <int value="7" label="kBackupFailed"/> + <int value="8" label="kPageSizeFailed"/> + <int value="9" label="kUnknownError"/> + <int value="10" label="kCheckpointFailed"/> +</enum> + +<!-- LINT.ThenChange(//sql/database.cc) --> + </enums> </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/sql/histograms.xml b/tools/metrics/histograms/metadata/sql/histograms.xml index da0fc2ae..5b0a008 100644 --- a/tools/metrics/histograms/metadata/sql/histograms.xml +++ b/tools/metrics/histograms/metadata/sql/histograms.xml
@@ -116,6 +116,41 @@ <token key="DatabaseTag" variants="DatabaseTag"/> </histogram> +<histogram name="Sql.Database.Raze.FailureReason.{DatabaseTag}" + enum="RazeDatabaseFailedReason" expires_after="2026-06-01"> + <owner>etienneb@chromium.org</owner> + <owner>grt@chromium.org</owner> + <summary> + Reports the fine-grained reason for a failure in Database::Raze. Recorded + once per failure to raze the {DatabaseTag} database. + </summary> + <token key="DatabaseTag" variants="DatabaseTag"/> +</histogram> + +<histogram name="Sql.Database.RazeTime.{DatabaseTag}" units="microseconds" + expires_after="2026-06-01"> + <owner>etienneb@chromium.org</owner> + <owner>grt@chromium.org</owner> + <summary> + Reports the time spent in Raze, in microseconds. This typically executed + after an unrecoverable errors on {DatabaseTag} database. + + Only reported for clients with high-resolution clocks. + </summary> + <token key="DatabaseTag" variants="DatabaseTag"/> +</histogram> + +<histogram name="Sql.Database.Statement.Error.{DatabaseTag}" + enum="SqliteErrorCode" expires_after="2026-06-01"> + <owner>etienneb@chromium.org</owner> + <owner>grt@chromium.org</owner> + <summary> + Reports sqlite errors triggered during execution of statements on the + {DatabaseTag} database. + </summary> + <token key="DatabaseTag" variants="DatabaseTag"/> +</histogram> + <histogram name="Sql.Database.Success.OpenInternalTime.{DatabaseTag}" units="microseconds" expires_after="2025-11-15"> <owner>anthonyvd@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/webauthn/enums.xml b/tools/metrics/histograms/metadata/webauthn/enums.xml index 0477925..08a88e89 100644 --- a/tools/metrics/histograms/metadata/webauthn/enums.xml +++ b/tools/metrics/histograms/metadata/webauthn/enums.xml
@@ -289,6 +289,17 @@ <int value="14" label="Other Failure"/> </enum> +<!-- LINT.IfChange(WebAuthenticationImmediateMediationRejectionReason) --> + +<enum name="WebAuthenticationImmediateMediationRejectionReason"> + <int value="0" label="Incognito"/> + <int value="1" label="RateLimited"/> + <int value="2" label="NoCredentials"/> + <int value="3" label="Timeout"/> +</enum> + +<!-- LINT.ThenChange(//content/public/browser/authenticator_request_client_delegate.h:ImmediateMediationRejectionReason) --> + <!-- LINT.IfChange(WebAuthenticationIOSContentAreaEvent) --> <enum name="WebAuthenticationIOSContentAreaEvent">
diff --git a/tools/metrics/histograms/metadata/webauthn/histograms.xml b/tools/metrics/histograms/metadata/webauthn/histograms.xml index a966f09a..a372d66f 100644 --- a/tools/metrics/histograms/metadata/webauthn/histograms.xml +++ b/tools/metrics/histograms/metadata/webauthn/histograms.xml
@@ -342,7 +342,7 @@ </histogram> <histogram name="WebAuthentication.GetAssertion.Immediate.EnclaveReady" - enum="Boolean" expires_after="2025-11-26"> + enum="Boolean" expires_after="2025-11-30"> <owner>derinel@google.com</owner> <owner>chrome-webauthn@google.com</owner> <summary> @@ -352,9 +352,20 @@ </summary> </histogram> +<histogram name="WebAuthentication.GetAssertion.Immediate.RejectionReason" + enum="WebAuthenticationImmediateMediationRejectionReason" + expires_after="2025-11-30"> + <owner>derinel@google.com</owner> + <owner>chrome-webauthn@google.com</owner> + <summary> + Records the reason why a WebAuthn get() request with immediate mediation was + rejected by the browser before showing any UI. + </summary> +</histogram> + <histogram name="WebAuthentication.GetAssertion.Immediate.TimeoutWhileWaitingForUi" - enum="Boolean" expires_after="2025-11-09"> + enum="Boolean" expires_after="2025-11-30"> <owner>derinel@google.com</owner> <owner>chrome-webauthn@google.com</owner> <summary>
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index 34278c0..df9a4e6 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -364,21 +364,21 @@ # Speedometer: -def _crossbench_speedometer2_0(estimated_runtime=60, arguments=None): +def _speedometer2_0_crossbench(estimated_runtime=60, arguments=None): return CrossbenchConfig('speedometer2.0.crossbench', 'speedometer_2.0', estimated_runtime=estimated_runtime, arguments=arguments) -def _crossbench_speedometer2_1(estimated_runtime=60, arguments=None): +def _speedometer2_1_crossbench(estimated_runtime=60, arguments=None): return CrossbenchConfig('speedometer2.1.crossbench', 'speedometer_2.1', estimated_runtime=estimated_runtime, arguments=arguments) -def _crossbench_speedometer2(estimated_runtime=60, arguments=None): +def _speedometer2_crossbench(estimated_runtime=60, arguments=None): """Alias for the latest Speedometer 2.X version.""" return CrossbenchConfig('speedometer2.crossbench', 'speedometer_2', @@ -386,21 +386,21 @@ arguments=arguments) -def _crossbench_speedometer3_0(estimated_runtime=60, arguments=None): +def _speedometer3_0_crossbench(estimated_runtime=60, arguments=None): return CrossbenchConfig('speedometer3.0.crossbench', 'speedometer_3.0', estimated_runtime=estimated_runtime, arguments=arguments) -def _crossbench_speedometer3_1(estimated_runtime=60, arguments=None): +def _speedometer3_1_crossbench(estimated_runtime=60, arguments=None): return CrossbenchConfig('speedometer3.1.crossbench', 'speedometer_3.1', estimated_runtime=estimated_runtime, arguments=arguments) -def _crossbench_speedometer3(estimated_runtime=60, arguments=None): +def _speedometer3_crossbench(estimated_runtime=60, arguments=None): """Alias for the latest Speedometer 3.X version.""" return CrossbenchConfig('speedometer3.crossbench', 'speedometer_3', @@ -408,7 +408,7 @@ arguments=arguments) -def _crossbench_speedometer_main(estimated_runtime=60, arguments=None): +def _speedometer_main_crossbench(estimated_runtime=60, arguments=None): return CrossbenchConfig('speedometer_main.crossbench', 'speedometer_main', estimated_runtime=estimated_runtime, @@ -416,25 +416,25 @@ # MotionMark: -def _crossbench_motionmark1_2(estimated_runtime=360): +def _motionmark1_2_crossbench(estimated_runtime=360): return CrossbenchConfig('motionmark1.2.crossbench', 'motionmark_1.2', estimated_runtime=estimated_runtime) -def _crossbench_motionmark1_3_0(estimated_runtime=360): +def _motionmark1_3_0_crossbench(estimated_runtime=360): return CrossbenchConfig('motionmark1.3.0.crossbench', 'motionmark_1.3.0', estimated_runtime=estimated_runtime) -def _crossbench_motionmark1_3_1(estimated_runtime=360): +def _motionmark1_3_1_crossbench(estimated_runtime=360): return CrossbenchConfig('motionmark1.3.1.crossbench', 'motionmark_1.3.1', estimated_runtime=estimated_runtime) -def _crossbench_motionmark1_3(estimated_runtime=360, arguments=None): +def _motionmark1_3_crossbench(estimated_runtime=360, arguments=None): """Alias for the latest MotionMark 1.3.X version.""" return CrossbenchConfig('motionmark1.3.crossbench', 'motionmark_1.3', @@ -442,32 +442,32 @@ arguments=arguments) -def _crossbench_motionmark_main(estimated_runtime=360): +def _motionmark_main_crossbench(estimated_runtime=360): return CrossbenchConfig('motionmark_main.crossbench', 'motionmark_main', estimated_runtime=estimated_runtime) # JetStream: -def _crossbench_jetstream2_0(estimated_runtime=180): +def _jetstream2_0_crossbench(estimated_runtime=180): return CrossbenchConfig('jetstream2.0.crossbench', 'jetstream_2.0', estimated_runtime=estimated_runtime) -def _crossbench_jetstream2_1(estimated_runtime=180): +def _jetstream2_1_crossbench(estimated_runtime=180): return CrossbenchConfig('jetstream2.1.crossbench', 'jetstream_2.1', estimated_runtime=estimated_runtime) -def _crossbench_jetstream2_2(estimated_runtime=180): +def _jetstream2_2_crossbench(estimated_runtime=180): return CrossbenchConfig('jetstream2.2.crossbench', 'jetstream_2.2', estimated_runtime=estimated_runtime) -def _crossbench_jetstream2(estimated_runtime=180, arguments=None): +def _jetstream2_crossbench(estimated_runtime=180, arguments=None): """Alias of the latest JetStream 2.X version.""" return CrossbenchConfig('jetstream2.crossbench', 'jetstream_2', @@ -475,21 +475,21 @@ arguments=arguments) -def _crossbench_jetstream_main(estimated_runtime=180): +def _jetstream_main_crossbench(estimated_runtime=180): return CrossbenchConfig('jetstream_main.crossbench', 'jetstream_main', estimated_runtime=estimated_runtime) # LoadLine: -def _crossbench_loadline_phone(estimated_runtime=7000, arguments=None): +def _loadline_phone_crossbench(estimated_runtime=7000, arguments=None): return CrossbenchConfig('loadline_phone.crossbench', 'loadline-phone-fast', estimated_runtime=estimated_runtime, arguments=arguments) -def _crossbench_loadline_tablet(estimated_runtime=3600, arguments=None): +def _loadline_tablet_crossbench(estimated_runtime=3600, arguments=None): return CrossbenchConfig('loadline_tablet.crossbench', 'loadline-tablet-fast', estimated_runtime=estimated_runtime, @@ -505,27 +505,27 @@ _CROSSBENCH_JETSTREAM_SPEEDOMETER = frozenset([ - _crossbench_jetstream2(), - _crossbench_speedometer3(), + _jetstream2_crossbench(), + _speedometer3_crossbench(), ]) _CROSSBENCH_MOTIONMARK_SPEEDOMETER = frozenset([ - _crossbench_motionmark1_3(), - _crossbench_speedometer3(), + _motionmark1_3_crossbench(), + _speedometer3_crossbench(), ]) _CROSSBENCH_BENCHMARKS_ALL = frozenset([ - _crossbench_speedometer2(), - _crossbench_speedometer3(), - _crossbench_motionmark1_3(), - _crossbench_jetstream2(), + _speedometer2_crossbench(), + _speedometer3_crossbench(), + _motionmark1_3_crossbench(), + _jetstream2_crossbench(), ]) # TODO(crbug.com/338630584): Remove it when other benchmarks can be run on # Android. _CROSSBENCH_ANDROID = frozenset([ - _crossbench_speedometer3(arguments=['--fileserver']), - _crossbench_loadline_phone(arguments=[ + _speedometer3_crossbench(arguments=['--fileserver']), + _loadline_phone_crossbench(arguments=[ '--cool-down-threshold=moderate', '--no-splash', ]), @@ -534,10 +534,10 @@ # TODO(crbug.com/409326154): Enable crossbench variant when supported. # TODO(crbug.com/409571674): Remove --debug flag. _CROSSBENCH_PIXEL9 = frozenset([ - # _crossbench_jetstream2(arguments=['--fileserver', '--debug']), - _crossbench_motionmark1_3(arguments=['--fileserver', '--debug']), - _crossbench_speedometer3(arguments=['--fileserver', '--debug']), - _crossbench_loadline_phone(arguments=[ + # _jetstream2_crossbench(arguments=['--fileserver', '--debug']), + _motionmark1_3_crossbench(arguments=['--fileserver', '--debug']), + _speedometer3_crossbench(arguments=['--fileserver', '--debug']), + _loadline_phone_crossbench(arguments=[ '--cool-down-threshold=moderate', '--no-splash', '--debug', @@ -545,11 +545,11 @@ ]) _CROSSBENCH_ANDROID_AL = frozenset([ - _crossbench_speedometer3(arguments=['--fileserver', '--debug']), + _speedometer3_crossbench(arguments=['--fileserver', '--debug']), ]) _CROSSBENCH_TANGOR = frozenset([ - _crossbench_loadline_tablet(arguments=[ + _loadline_tablet_crossbench(arguments=[ '--cool-down-threshold=moderate', '--no-splash', ]), @@ -775,14 +775,12 @@ _ANDROID_PIXEL9_BENCHMARK_CONFIGS = PerfSuite([ _GetBenchmarkConfig('jetstream2'), ]) -# Pixel fold _ANDROID_PIXEL_FOLD_BENCHMARK_CONFIGS = PerfSuite( OFFICIAL_BENCHMARK_CONFIGS).Add([ _GetBenchmarkConfig('jetstream2-minorms'), _GetBenchmarkConfig('speedometer2-minorms'), _GetBenchmarkConfig('speedometer3-minorms'), ]) -# Pixel Tangor _ANDROID_PIXEL_TANGOR_BENCHMARK_CONFIGS = PerfSuite( OFFICIAL_BENCHMARK_CONFIGS).Add([ _GetBenchmarkConfig('jetstream2-minorms'),
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 5b9326679..b131e2b 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -6,7 +6,7 @@ }, "win": { "hash": "ca5569771bdaf64998daa87da60550e4351b79b8", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/15b79e4bc067016a592fac0b9875eb0322ea9a1a/trace_processor_shell.exe" + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/167e1f0dab2691a4b2a911e001317353405d83d9/trace_processor_shell.exe" }, "linux_arm": { "hash": "99f971ca131f6d11c73f4b918099d434bdd8093c", @@ -22,7 +22,7 @@ }, "linux": { "hash": "873b0054b9679de17bf8de3ba8bbc665cb00e8f1", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/15b79e4bc067016a592fac0b9875eb0322ea9a1a/trace_processor_shell" + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/167e1f0dab2691a4b2a911e001317353405d83d9/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/rust/update_rust.py b/tools/rust/update_rust.py index 381a807..805a9c6e 100755 --- a/tools/rust/update_rust.py +++ b/tools/rust/update_rust.py
@@ -32,7 +32,7 @@ # These fields are written by //tools/clang/scripts/upload_revision.py, and # should not be changed manually. # They are also read by build/config/compiler/BUILD.gn. -RUST_REVISION = '0b65d0db5f77c44bf37b4a25489562d68c14aecf' +RUST_REVISION = '4a0969e06dbeaaa43914d2d00b2e843d49aa3886' RUST_SUB_REVISION = 1 # The revision of Crubit to use from https://github.com/google/crubit @@ -47,7 +47,7 @@ # Hash of src/stage0.json, which itself contains the stage0 toolchain hashes. # We trust the Rust build system checks, but to ensure it is not tampered with # itself check the hash. -STAGE0_JSON_SHA256 = 'f16e14ffdc41c439ce3d802c25add79cdb20d624e83a555e3835bd6eba71c833' +STAGE0_JSON_SHA256 = '981bcaeac1c5f7035166cd59941e4a8e2070c9eb977bc9ef881e656b60c79055' THIS_DIR = os.path.abspath(os.path.dirname(__file__)) CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..'))
diff --git a/ui/base/l10n/l10n_util.cc b/ui/base/l10n/l10n_util.cc index c14be6e..ede9a628 100644 --- a/ui/base/l10n/l10n_util.cc +++ b/ui/base/l10n/l10n_util.cc
@@ -259,7 +259,7 @@ }); // The list of locales that expected on the current platform, generated from the -// |locales| variable in GN (defined in build/config/locales.gni). This is +// `locales` variable in GN (defined in build/config/locales.gni). This is // equivalently the list of locales that we expect to have translation strings // for on the current platform. Guaranteed to be in sorted order and guaranteed // to have no duplicates. @@ -268,9 +268,9 @@ // - On Android, locale files are dynamically shipped in app bundles which are // only downloaded when needed - so the |locales| variable does not accurately // reflect the UI strings that are currently available on disk. -// See the comment at the top of |LoadLocaleResources| in +// See the comment at the top of `LoadLocaleResources` in // ui/base/resource/resource_bundle_android.cc for more information. -// - On iOS, some locales aren't shipped (|ios_unsupported_locales|) as they are +// - On iOS, some locales aren't shipped (`ios_unsupported_locales`) as they are // not supported by the operating system. These locales are included in this // variable. // @@ -326,8 +326,8 @@ // positives on Android and iOS. See the `kPlatformLocales` documentation for // more information. bool HasStringsForLocale(std::string_view locale, - const bool perform_io = true) { - if (!perform_io) { + l10n_util::CheckLocaleMode mode) { + if (mode == l10n_util::CheckLocaleMode::kUseKnownLocalesList) { return kPlatformLocales.contains(locale); } // If locale has any illegal characters in it, we don't want to try to @@ -410,29 +410,27 @@ // TODO(jshin): revamp this function completely to use a more systematic // and generic locale fallback based on ICU/CLDR. -bool CheckAndResolveLocale(const std::string& locale, - std::string* resolved_locale, - const bool perform_io) { - if (HasStringsForLocale(locale, perform_io)) { - *resolved_locale = locale; - return true; +std::optional<std::string> CheckAndResolveLocale(std::string_view locale, + CheckLocaleMode mode) { + if (HasStringsForLocale(locale, mode)) { + return std::optional<std::string>(locale); } // If there's a variant, skip over it so we can try without the region // code. For example, ca_ES@valencia should cause us to try ca@valencia // before ca. - std::string::size_type variant_pos = locale.find('@'); - if (variant_pos != std::string::npos) - return false; + if (locale.find('@') != std::string::npos) { + return std::nullopt; + } // If the locale matches language but not country, use that instead. // TODO(jungshik) : Nothing is done about languages that Chrome // does not support but available on Windows. We fall // back to en-US in GetApplicationLocale so that it's a not critical, // but we can do better. - const std::string lang(GetLanguage(locale)); + const std::string_view lang = GetLanguage(locale); if (lang.size() < locale.size()) { - std::string region(locale, lang.size() + 1); + const std::string_view region = locale.substr(lang.size() + 1); std::string tmp_locale(lang); // Map es-RR other than es-ES to es-419 (Chrome's Latin American // Spanish locale). @@ -470,9 +468,8 @@ tmp_locale.append("-GB"); } } - if (HasStringsForLocale(tmp_locale, perform_io)) { - resolved_locale->swap(tmp_locale); - return true; + if (HasStringsForLocale(tmp_locale, mode)) { + return tmp_locale; } } @@ -487,20 +484,13 @@ }; for (const auto& alias : kAliasMap) { if (base::EqualsCaseInsensitiveASCII(lang, alias.source)) { - std::string tmp_locale(alias.dest); - if (HasStringsForLocale(tmp_locale, perform_io)) { - resolved_locale->swap(tmp_locale); - return true; + if (HasStringsForLocale(alias.dest, mode)) { + return std::optional<std::string>(alias.dest); } } } - return false; -} - -bool CheckAndResolveLocale(const std::string& locale, - std::string* resolved_locale) { - return CheckAndResolveLocale(locale, resolved_locale, /*perform_io=*/true); + return std::nullopt; } #if BUILDFLAG(IS_APPLE) @@ -522,7 +512,6 @@ #if !BUILDFLAG(IS_APPLE) std::string GetApplicationLocaleInternalNonMac(const std::string& pref_locale) { - std::string resolved_locale; std::vector<std::string> candidates; // We only use --lang and the app pref on Windows. On Linux, we only @@ -574,15 +563,18 @@ std::vector<std::string>::const_iterator i = candidates.begin(); for (; i != candidates.end(); ++i) { - if (CheckAndResolveLocale(*i, &resolved_locale)) { - return resolved_locale; + if (std::optional<std::string> resolved_locale = + CheckAndResolveLocale(*i)) { + return *resolved_locale; } } // Fallback on en-US. const std::string fallback_locale("en-US"); - if (HasStringsForLocale(fallback_locale)) + if (HasStringsForLocale(fallback_locale, + CheckLocaleMode::kVerifyLocalizationDataExists)) { return fallback_locale; + } return std::string(); } @@ -977,12 +969,13 @@ } bool IsUserFacingUILocale(const std::string& locale) { - std::string resolved_locale; // As there are many callers of IsUserFacingUILocale and // GetUserFacingUILocaleList from threads where I/O is prohibited, do not // perform I/O here. - if (!l10n_util::CheckAndResolveLocale(locale, &resolved_locale, - /*perform_io=*/false)) { + const std::optional<std::string> resolved_locale = + l10n_util::CheckAndResolveLocale(locale, + CheckLocaleMode::kUseKnownLocalesList); + if (!resolved_locale) { return false; }
diff --git a/ui/base/l10n/l10n_util.h b/ui/base/l10n/l10n_util.h index ceb1afb..06fd22c 100644 --- a/ui/base/l10n/l10n_util.h +++ b/ui/base/l10n/l10n_util.h
@@ -31,20 +31,23 @@ // Takes normalized locale as `locale`. Returns country part (after '-'). COMPONENT_EXPORT(UI_BASE) std::string_view GetCountry(std::string_view locale); -// This method translates a generic locale name to one of the locally defined -// ones. This method returns true if it succeeds. -// If |perform_io| is false, this will not perform any I/O but may return false -// positives on Android and iOS. See the |kPlatformLocales| documentation in -// l10n_util.cc for more information. -COMPONENT_EXPORT(UI_BASE) -bool CheckAndResolveLocale(const std::string& locale, - std::string* resolved_locale, - const bool perform_io); +enum class CheckLocaleMode { + // Checks that the localization data is present on disk. It is the default, + // but potentially costly. + kVerifyLocalizationDataExists, + // Checks that the locale is in the list of known locales. It may lead to + // false positives on platforms where localization is downloaded on-demand + // - i.e., Android and iOS. See the `kPlatformLocales` documentation in + // l10n_util.cc for more information. + kUseKnownLocalesList, +}; -// Convenience wrapper for the above (with |perform_io| set to true). +// Translates a generic locale name to one of the locally defined ones or +// `std::nullopt` if the resolution is unsuccessful. COMPONENT_EXPORT(UI_BASE) -bool CheckAndResolveLocale(const std::string& locale, - std::string* resolved_locale); +std::optional<std::string> CheckAndResolveLocale( + std::string_view locale, + CheckLocaleMode mode = CheckLocaleMode::kVerifyLocalizationDataExists); // This method is responsible for determining the locale as defined below. In // nearly all cases you shouldn't call this, rather use GetApplicationLocale
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb index df0c482..716a1ea5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -483,7 +483,7 @@ <translation id="4805966553127040832"><ph name="COUNT" /> elementer gendannes</translation> <translation id="4826849268470072925">Tamil ITRANS</translation> <translation id="4843566743023903107">Chromebases</translation> -<translation id="4850886885716139402">Vis</translation> +<translation id="4850886885716139402">Se</translation> <translation id="485316830061041779">Tysk</translation> <translation id="4862885579661885411">Indstillinger for Filer</translation> <translation id="4867079195717347957">Klik for at sortere kolonnen i faldende rækkefølge.</translation>