diff --git a/BUILD.gn b/BUILD.gn index a7a198d..17a10ee 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -832,8 +832,8 @@ "//third_party/dawn/src/dawn/fuzzers:fuzzers", "//third_party/dawn/src/dawn/tests:dawn_end2end_tests", "//third_party/dawn/src/dawn/tests:dawn_unittests", + "//third_party/dawn/src/tint:tint_unittests", "//third_party/dawn/src/tint/fuzzers", - "//third_party/dawn/test/tint:tint_unittests", ] }
diff --git a/DEPS b/DEPS index 697e794..f808cc21 100644 --- a/DEPS +++ b/DEPS
@@ -284,11 +284,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. - 'v8_revision': 'bb98180f2e266ff63bde6c97f753250a66b58803', + 'v8_revision': 'f60ba50f1dd6f1117e2760e433268f446e0dc6e2', # 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': '9ea490f54e18898f73417023be3ed5403ddf7833', + 'angle_revision': '21c89c14831c0997742ed7c71e467ac90b180d2c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -351,7 +351,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': 'b83d69ffe9f3785ceef6f4e0e918ec71ddc14bfb', + 'catapult_revision': '4ea19a6a7078a6ad6b5e859bc0f7620769a38eb1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -359,7 +359,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': '2f1812ea77f0cb9120c38f341506559cd7ba9ef3', + 'devtools_frontend_revision': '931f9af8150a258ab3b68446f4c44402b970f307', # 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. @@ -395,7 +395,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '04f12142bd5de7ed48555978012df4577305e4ce', + 'dawn_revision': '159e78f50bf1e6812ca67376d0c2c47d643d17be', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -443,7 +443,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libunwind_revision': '1644d070bf374182739543c3a12df88dfec0b88a', + 'libunwind_revision': 'b387062642f045b19adbf6a80757293caaf64e8b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -466,7 +466,7 @@ 'libcxx_revision': 'b1269813eaf5b8ac78e35e45a0f7cc320bd3e7d6', # GN CIPD package version. - 'gn_version': 'git_revision:e62d4e1938a45babc9afb6db543f388cd1802a52', + 'gn_version': 'git_revision:fcda46cf40422284f2e74b770da8b22f7f5d7006', } # Only these hosts are allowed for dependencies in this DEPS file. @@ -850,7 +850,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'VZH2_bmGzOPjpsD3ypJiG-Csl8LTdFucbzd7WkWCxoQC', + 'version': 'ZC3kqpoDAwfKJRomJp-VLoZpHAg2T-zaeP2tl845aK8C', }, ], 'dep_type': 'cipd', @@ -861,7 +861,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': '7bOzBl-ab3c0qW3XCHRtfm6mdN8s1uOsgXW6YdEmy8oC', + 'version': 'DTjo1uX71TXKzh1PkkynRjOoT7oLyq1xScSwqbnxBo8C', }, ], 'dep_type': 'cipd', @@ -872,7 +872,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': 'vG1HrIrlj1KWm56pbvxfl-bNDcLL6C9CdWsG6ZBqAV4C', + 'version': 'KZTmv4YwstRZQKROdB3NB7qoYiYMRQOyKVTFQAQ8ROcC', }, ], 'dep_type': 'cipd', @@ -1122,7 +1122,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '97aae01b2c8169ac9dc3172693214ae1d0c4985e', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '138813d186eb3836de2db4978cb4e8a229cb1f88', 'condition': 'checkout_chromeos', }, @@ -1542,7 +1542,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'faa478c7878b2b0dae9d2dad346cbaee6712a628', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'b983faf1bf12b3c7a9b23ab845aec30024da795a', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1666,7 +1666,7 @@ 'packages': [ { 'package': 'chromium/third_party/turbine', - 'version': 'A5bkaoLBc1JYa6Xv31jYUCK5TnXYCbxRrA4FBPXXcWgC', + 'version': 'RxaW8ZVJZ7rF3dbAGbL1OV6f9ZELjVeiiQbpkDsuxA4C', }, ], 'condition': 'checkout_android', @@ -1712,7 +1712,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'f8000b0ea82de00b3cc7d337e7521d1e94fed587', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '03b38c18d5f1eb8e455df171d7e76b2627200dd0', + Var('webrtc_git') + '/src.git' + '@' + '0413fc969c058ccf40c7caef77ca21eeab50a32f', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1785,7 +1785,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@5a4c51ce8b4f96dcdb45d499e4d74e10c589e3bc', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@aee18bfe14e137d43ab50e3b50dffb4237eeeb9c', 'condition': 'checkout_src_internal', }, @@ -1815,7 +1815,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'F-jhf3w44edPf-oA4thoqcYc8eBBUgQZCi-sbkIW2_YC', + 'version': 'fwkIAE88f7UHiGVjACvfUwo-MWl7eQYwEwJ_x1Of8gMC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1826,7 +1826,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'P8C47VFSVeVJYHd5WVdo2N67ghYo6whNCbWMV25TsUIC', + 'version': 'KI3SsVX28-gopSf-SYwZpYxFhkIy_dakHV0gG2o30REC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1837,7 +1837,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': 'JMLziORFoDSa42doOE83ipOwY1lfTT3kXLZDC9NGJv4C', + 'version': '4sFgdFdoykTNSb13E-bijeKmgWbkO3Gweg5ViCGEKnYC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/services/chromebox_for_meetings/public/cpp/BUILD.gn b/ash/services/chromebox_for_meetings/public/cpp/BUILD.gn index e55634cb..4a2d126 100644 --- a/ash/services/chromebox_for_meetings/public/cpp/BUILD.gn +++ b/ash/services/chromebox_for_meetings/public/cpp/BUILD.gn
@@ -2,8 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//build/config/chromeos/ui_mode.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") assert(is_chromeos_ash, "Non-ChromeOS builds cannot depend on //ash") @@ -22,10 +22,6 @@ "service_connection.h", ] deps += [ "//chromeos/ash/components/dbus/chromebox_for_meetings" ] - public_deps = [ - "//chromeos/components/chromebox_for_meetings/buildflags", - "//chromeos/components/chromebox_for_meetings/features", - ] } }
diff --git a/ash/services/chromebox_for_meetings/public/mojom/BUILD.gn b/ash/services/chromebox_for_meetings/public/mojom/BUILD.gn index 6d8c58e..72d99565 100644 --- a/ash/services/chromebox_for_meetings/public/mojom/BUILD.gn +++ b/ash/services/chromebox_for_meetings/public/mojom/BUILD.gn
@@ -2,8 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//build/config/chromeos/ui_mode.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//mojo/public/tools/bindings/mojom.gni") assert(is_chromeos_ash, "Non-ChromeOS builds cannot depend on //ash")
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_no.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_no.xtb index 1a3ec42..7b808240a 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_no.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_no.xtb
@@ -192,7 +192,7 @@ <translation id="7730490981846175479"><ph name="SHIFT" /><ph name="SEPARATOR1" /><ph name="ALT" /><ph name="SEPARATOR2" /><ph name="L" /> og så <ph name="SPACE" /> eller <ph name="ENTER" /></translation> <translation id="7787242579016742662">Åpne en fil i nettleseren</translation> <translation id="7952165122793773711">Gå til fane 1–8</translation> -<translation id="8026334261755873520">Slett nettleserdata</translation> +<translation id="8026334261755873520">Slett nettlesingsdata</translation> <translation id="8130528849632411619">Gå til begynnelsen av dokumentet</translation> <translation id="8147954207400281792"><ph name="CTRL" /><ph name="SEPARATOR" /><ph name="K" /> eller <ph name="E" /></translation> <translation id="8234414138295101081">Rotér skjermen 90 grader</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index 3ac4da7..6e94ed8 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -103,6 +103,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />، انقر على مفتاح Enter لفتح "تقويم Google".</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540">تم استبدال <ph name="FIRST_ITEM_TITLE" /> بالعنصر <ph name="SECOND_ITEM_TITLE" />.</translation> +<translation id="1500926532737552529">عرض كل الاقتراحات</translation> <translation id="1503394326855300303">يجب أن يكون حساب المالك هذا أول حساب يتم تسجيل الدخول إليه في جلسة تسجيل دخول متعدد.</translation> <translation id="1510238584712386396">مشغِّل التطبيقات</translation> <translation id="1516740043221086139">وضع "عدم الإزعاج" مُفعَّل.</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index d8a0d39..a35a6d4b 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, কেলেণ্ডাৰ ভিউটো খুলিবলৈ এণ্টাৰ কীটো টিপক</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" />ক <ph name="SECOND_ITEM_TITLE" />ৰ সৈতে সলনাসলনি কৰা হৈছে</translation> +<translation id="1500926532737552529">আটাইবোৰ পৰামর্শ দেখুৱাওক</translation> <translation id="1503394326855300303">গৰাকীৰ এই একাউণ্টটো একাধিকবাৰ ছাইন ইন কৰা কোনো ছেশ্বনত প্ৰথমতে ছাইন ইন কৰা একাউণ্ট হ’ব লাগিব।</translation> <translation id="1510238584712386396">লঞ্চাৰ</translation> <translation id="1516740043221086139">অসুবিধা নিদিব ম’ড অন হৈ আছে।</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index 8189354a..35e9e91 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, Təqvim görünüşünü açmaq üçün Enter düyməsini basın</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> <ph name="SECOND_ITEM_TITLE" /> ilə dəyişdirildi</translation> +<translation id="1500926532737552529">Bütün təklifləri göstərin</translation> <translation id="1503394326855300303">Bu sahib hesabı çoxsaylı giriş sessiyasında ilk girilmiş hesab olmalıdır.</translation> <translation id="1510238584712386396">Başladıcı</translation> <translation id="1516740043221086139">Narahat etməyin rejimi aktivdir</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index 2ebf067..b1eca41 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />. Натиснете клавиша Enter, за да отворите календарния изглед</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> се замени от <ph name="SECOND_ITEM_TITLE" /></translation> +<translation id="1500926532737552529">Показване на всички предложения</translation> <translation id="1503394326855300303">Този профил на собственик трябва да е първият, в който да се влезе, при сесия с централизиран вход.</translation> <translation id="1510238584712386396">Стартов панел</translation> <translation id="1516740043221086139">Режимът „Не безпокойте“ е включен.</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 915f2f1..0504135 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, prem tecla de retorn per obrir la visualització del calendari</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> s'ha intercanviat amb <ph name="SECOND_ITEM_TITLE" /></translation> +<translation id="1500926532737552529">Mostra tots els suggeriments</translation> <translation id="1503394326855300303">Aquest compte de propietari ha de ser el primer compte amb la sessió iniciada en un inici de sessió múltiple.</translation> <translation id="1510238584712386396">Menú d'aplicacions</translation> <translation id="1516740043221086139">El mode No molestis està activat.</translation>
diff --git a/ash/strings/ash_strings_cy.xtb b/ash/strings/ash_strings_cy.xtb index f3a470f..55e3cc3c 100644 --- a/ash/strings/ash_strings_cy.xtb +++ b/ash/strings/ash_strings_cy.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, Pwyswch yr allwedd Enter i agor y wedd Calendar</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540">Cyfnewidiwyd <ph name="FIRST_ITEM_TITLE" /> â <ph name="SECOND_ITEM_TITLE" /></translation> +<translation id="1500926532737552529">Dangos yr holl awgrymiadau</translation> <translation id="1503394326855300303">Rhaid i'r cyfrif perchennog hwn fod y cyfrif mewngofnodi cyntaf mewn sesiwn mewngofnodi o sawl cyfrif.</translation> <translation id="1510238584712386396">Lansiwr</translation> <translation id="1516740043221086139">Mae Peidiwch ag Aflonyddu wedi'i droi ymlaen.</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index b536928..88a95f5b 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, vajutage sisestusklahvi, et avada kalendrivaade</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> vahetati üksuse <ph name="SECOND_ITEM_TITLE" /> vastu</translation> +<translation id="1500926532737552529">Kuva kõik soovitused</translation> <translation id="1503394326855300303">See omaniku konto peab olema esimene sisselogitud konto mitmele kontole sisselogimise seansil.</translation> <translation id="1510238584712386396">Käivitaja</translation> <translation id="1516740043221086139">Režiim Mitte segada on sees.</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index 66ec702..75b19eb0 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, appuyez sur Entrée pour ouvrir la vue Agenda</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540">Élément <ph name="FIRST_ITEM_TITLE" /> remplacé par <ph name="SECOND_ITEM_TITLE" /></translation> +<translation id="1500926532737552529">Afficher toutes les suggestions</translation> <translation id="1503394326855300303">Ce compte de propriétaire doit être le premier compte à être connecté lors de sessions de connexion multicompte.</translation> <translation id="1510238584712386396">Lanceur d'applications</translation> <translation id="1516740043221086139">Le mode Ne pas déranger est activé.</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index a13e5b2..da588ffd 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />. Preme a tecla Introducir para abrir a vista de Calendar</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> cambiouse con <ph name="SECOND_ITEM_TITLE" /></translation> +<translation id="1500926532737552529">Mostrar todas as suxestións</translation> <translation id="1503394326855300303">Esta conta de propietario debe ser a primeira en que se inicie sesión cando se realice un inicio de sesión múltiple.</translation> <translation id="1510238584712386396">Menú de aplicacións</translation> <translation id="1516740043221086139">Está activado o modo Non molestar.</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index 7c74387c..47fea94e 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, Tekan tombol Enter untuk membuka tampilan Kalender</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> ditukar dengan <ph name="SECOND_ITEM_TITLE" /></translation> +<translation id="1500926532737552529">Tampilkan semua saran</translation> <translation id="1503394326855300303">Akun pemilik ini harus akun yang masuk pertama dalam sesi fitur masuk banyak akun.</translation> <translation id="1510238584712386396">Peluncur</translation> <translation id="1516740043221086139">Mode Jangan Ganggu aktif.</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index 0e58f3e7..e759d7d 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" /> – ýttu á Enter til að opna Dagatalsyfirlit</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> skipt út fyrir <ph name="SECOND_ITEM_TITLE" /></translation> +<translation id="1500926532737552529">Sýna allar tillögur</translation> <translation id="1503394326855300303">Þessi eigandareikningur verður að vera fyrsti innskráði reikningurinn í lotu fyrir margar innskráningar.</translation> <translation id="1510238584712386396">Ræsiforrit</translation> <translation id="1516740043221086139">Kveikt er á „Ónáðið ekki“.</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index 841e0fa..68ee534e 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, אפשר לפתוח את תצוגת היומן בלחיצה על Enter</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540">הפריט <ph name="SECOND_ITEM_TITLE" /> החליף את <ph name="FIRST_ITEM_TITLE" /></translation> +<translation id="1500926532737552529">הצגת כל ההצעות</translation> <translation id="1503394326855300303">החשבון של בעלים זה צריך להיות החשבון הראשון שאליו נכנסים בעת כניסה לפעילות באתר מחשבונות מרובים.</translation> <translation id="1510238584712386396">מרכז האפליקציות</translation> <translation id="1516740043221086139">מצב 'נא לא להפריע' מופעל.</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index 0f9070e..0cb36e3 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />、カレンダー表示を開くには Enter キーを押してください</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" />(HDMI / DP)</translation> <translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> と <ph name="SECOND_ITEM_TITLE" /> が置き換わりました</translation> +<translation id="1500926532737552529">提案をすべて表示</translation> <translation id="1503394326855300303">この所有者アカウントは、マルチログイン セッションで最初にログインするアカウントである必要があります。</translation> <translation id="1510238584712386396">ランチャー</translation> <translation id="1516740043221086139">サイレント モードはオンです。</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index f14de0d..79fe95f 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, Enter 키를 눌러 캘린더 보기를 여세요.</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" />(HDMI/DP)</translation> <translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> 항목과 <ph name="SECOND_ITEM_TITLE" /> 항목의 위치를 서로 바꿈</translation> +<translation id="1500926532737552529">모든 추천 표시</translation> <translation id="1503394326855300303">이 소유자 계정이 멀티 로그인 세션에서 처음으로 로그인하는 계정이 되어야 합니다.</translation> <translation id="1510238584712386396">런처</translation> <translation id="1516740043221086139">방해 금지 모드가 사용 설정되어 있습니다.</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index e19e738f..d0bb255 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, Aby otworzyć widok kalendarza, naciśnij klawisz Enter</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540">Element <ph name="FIRST_ITEM_TITLE" /> został zastąpiony elementem <ph name="SECOND_ITEM_TITLE" /></translation> +<translation id="1500926532737552529">Pokaż wszystkie sugestie</translation> <translation id="1503394326855300303">W sesji wielokrotnego logowania trzeba w pierwszej kolejności zalogować się na konto tego właściciela.</translation> <translation id="1510238584712386396">Menu z aplikacjami</translation> <translation id="1516740043221086139">Tryb Nie przeszkadzać jest włączony.</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index cdfa846..5ad5b1d 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, pritisnite tipko Enter, da odprete pogled koledarja.</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540">Element <ph name="FIRST_ITEM_TITLE" /> je zamenjan z elementom <ph name="SECOND_ITEM_TITLE" /></translation> +<translation id="1500926532737552529">Pokaži vse predloge</translation> <translation id="1503394326855300303">V seji prijave z več računi mora biti ta račun lastnika prvi prijavljeni račun.</translation> <translation id="1510238584712386396">Zaganjalnik</translation> <translation id="1516740043221086139">Način »ne moti« je vklopljen.</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index 672d1cd..272eeb4 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, Calendar వీక్షణను తెరవడానికి enter కీని నొక్కండి</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" />, <ph name="SECOND_ITEM_TITLE" />గా మార్చబడింది</translation> +<translation id="1500926532737552529">అన్ని సూచనలను చూడండి</translation> <translation id="1503394326855300303">ఈ యజమాని ఖాతానే బహుళ సైన్-ఇన్ సెషన్లో మొదటిగా సైన్-ఇన్ చేయాల్సిన ఖాతా.</translation> <translation id="1510238584712386396">లాంచర్</translation> <translation id="1516740043221086139">'అంతరాయం కలిగించవద్దు' మోడ్ ఆన్లో ఉంది.</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index 007d9d4..b739d71 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, Takvim görünümünü açmak için Enter tuşuna basın</translation> <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" />, <ph name="SECOND_ITEM_TITLE" /> ile değiştirildi</translation> +<translation id="1500926532737552529">Tüm önerileri göster</translation> <translation id="1503394326855300303">Bu sahip hesabının bir çoklu oturumda ilk oturum açan hesap olması gerekir.</translation> <translation id="1510238584712386396">Başlatıcı</translation> <translation id="1516740043221086139">Rahatsız Etmeyin modu açık.</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index fd087e42..6b8b3cda 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -102,6 +102,7 @@ <translation id="1480845547124508962"><ph name="CURRENT_TIME" />, Chofoza ukhiye we-enter ukuze uvule ukubuka Kwekhalenda</translation> <translation id="1484102317210609525">I-<ph name="DEVICE_NAME" /> (HDMI/DP)</translation> <translation id="1487931858675166540">I-<ph name="FIRST_ITEM_TITLE" /> ishintshisane ne-<ph name="SECOND_ITEM_TITLE" /></translation> +<translation id="1500926532737552529">Bonisa zonke iziphakamiso</translation> <translation id="1503394326855300303">Le akhawunti yomnikazi kumele kube i-akhawunti yokuqala yokungena ngemvume kwiseshini yokungena ngemvume okuningi.</translation> <translation id="1510238584712386396">Isiqalisi</translation> <translation id="1516740043221086139">Ukungaphazamisi kuvuliwe.</translation>
diff --git a/build/config/chromebox_for_meetings/BUILD.gn b/build/config/chromebox_for_meetings/BUILD.gn new file mode 100644 index 0000000..c8eb7d0 --- /dev/null +++ b/build/config/chromebox_for_meetings/BUILD.gn
@@ -0,0 +1,11 @@ +# Copyright 2020 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/buildflag_header.gni") +import("//build/config/chromebox_for_meetings/buildflags.gni") + +buildflag_header("buildflags") { + header = "buildflags.h" + flags = [ "PLATFORM_CFM=$is_cfm" ] +}
diff --git a/chromeos/components/chromebox_for_meetings/buildflags/README.md b/build/config/chromebox_for_meetings/README.md similarity index 81% rename from chromeos/components/chromebox_for_meetings/buildflags/README.md rename to build/config/chromebox_for_meetings/README.md index 1758d1e..ddbe3c9 100644 --- a/chromeos/components/chromebox_for_meetings/buildflags/README.md +++ b/build/config/chromebox_for_meetings/README.md
@@ -4,7 +4,7 @@ You can get a comprehensive list of all arguments supported by gn by running the command gn args --list out/some-directory (the directory passed to gn args is - required as gn args will invokes gn gen to generate the build.ninja files). +required as gn args will invokes gn gen to generate the build.ninja files). ## is_cfm (BUILDFLAG(PLATFORM_CFM)) @@ -12,9 +12,10 @@ ### Query Flag ```bash -$ gn args out_<cfm_overlay>/{Release||Debug} --list-is_cfm +$ gn args out_<cfm_overlay>/{Release||Debug} --list=is_cfm ``` -### Enagle Flag + +### Enable Flag ```bash $ gn args out_<cfm_overlay>/{Release||Debug} $ Editor will open add is_cfm=true save and exit
diff --git a/chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni b/build/config/chromebox_for_meetings/buildflags.gni similarity index 100% rename from chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni rename to build/config/chromebox_for_meetings/buildflags.gni
diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni index 4070cf74..7aece04 100644 --- a/build/config/compiler/compiler.gni +++ b/build/config/compiler/compiler.gni
@@ -36,10 +36,9 @@ declare_args() { # Set to true to use lld, the LLVM linker. # In late bring-up on macOS (see docs/mac_lld.md). - # Tentatively used on iOS, except in cronet builds (cronet still supports - # 32-bit builds, which lld doesn't support). + # Tentatively used on iOS. # The default linker everywhere else. - use_lld = is_clang && current_os != "zos" && !(is_ios && is_cronet_build) + use_lld = is_clang && current_os != "zos" } declare_args() {
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index 8f76839d..5e37f4a 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -8.20220620.0.1 +8.20220620.1.1
diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc index 315ad87..30fc1651 100644 --- a/cc/metrics/compositor_frame_reporter.cc +++ b/cc/metrics/compositor_frame_reporter.cc
@@ -358,6 +358,8 @@ FrameSequenceTrackerType::kSETMainThreadAnimation)) || active_trackers_.test(static_cast<size_t>( FrameSequenceTrackerType::kMainThreadAnimation))); + is_forked_ = false; + is_backfill_ = false; } // static @@ -509,6 +511,7 @@ StageType::kBeginImplFrameToSendBeginMainFrame; new_reporter->current_stage_.start_time = stage_history_.front().start_time; new_reporter->set_tick_clock(tick_clock_); + new_reporter->set_is_forked(true); // Set up the new reporter so that it depends on |this| for partial update // information. @@ -1079,6 +1082,12 @@ reporter->set_has_high_latency( (frame_termination_time_ - args_.frame_time) > kHighLatencyMin); + if (is_forked_) { + reporter->set_frame_type(ChromeFrameReporter::FORKED); + } else if (is_backfill_) { + reporter->set_frame_type(ChromeFrameReporter::BACKFILL); + } + // TODO(crbug.com/1086974): Set 'drop reason' if applicable. });
diff --git a/cc/metrics/compositor_frame_reporter.h b/cc/metrics/compositor_frame_reporter.h index ad0b1084..33f2264 100644 --- a/cc/metrics/compositor_frame_reporter.h +++ b/cc/metrics/compositor_frame_reporter.h
@@ -330,6 +330,13 @@ is_accompanied_by_main_thread_update; } + void set_is_forked(bool is_forked) { + is_forked_ = is_forked; + } + void set_is_backfill(bool is_backfill) { + is_backfill_ = is_backfill; + } + const viz::BeginFrameId& frame_id() const { return args_.frame_id; } // Adopts |cloned_reporter|, i.e. keeps |cloned_reporter| alive until after @@ -458,6 +465,14 @@ // with checkerboarding). bool has_missing_content_ = false; + // Indicates whether the frame is forked (i.e. a PipelineReporter event starts + // at the same frame sequence as another PipelineReporter). + bool is_forked_ = false; + + // Indicates whether the frame is backfill (i.e. dropped frames when there are + // no partial compositor updates). + bool is_backfill_ = false; + // For a reporter A, if the main-thread takes a long time to respond // to a begin-main-frame, then all reporters created (and terminated) until // the main-thread responds depends on this reporter to decide whether those
diff --git a/cc/metrics/compositor_frame_reporting_controller.cc b/cc/metrics/compositor_frame_reporting_controller.cc index c40ffce..b7d8e9c2 100644 --- a/cc/metrics/compositor_frame_reporting_controller.cc +++ b/cc/metrics/compositor_frame_reporting_controller.cc
@@ -743,6 +743,7 @@ timestamp); reporter->TerminateFrame(FrameTerminationStatus::kDidNotPresentFrame, args.deadline); + reporter->set_is_backfill(true); } }
diff --git a/cc/tiles/image_controller_unittest.cc b/cc/tiles/image_controller_unittest.cc index 6b75dae..42bb926a 100644 --- a/cc/tiles/image_controller_unittest.cc +++ b/cc/tiles/image_controller_unittest.cc
@@ -11,11 +11,13 @@ #include "base/callback_helpers.h" #include "base/run_loop.h" #include "base/synchronization/condition_variable.h" -#include "base/test/test_simple_task_runner.h" +#include "base/task/thread_pool.h" #include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/simple_thread.h" #include "base/threading/thread_checker_impl.h" +#include "base/threading/thread_restrictions.h" #include "cc/paint/paint_image_builder.h" +#include "cc/test/cc_test_suite.h" #include "cc/test/skia_common.h" #include "cc/test/stub_decode_cache.h" #include "cc/test/test_paint_worklet_input.h" @@ -26,78 +28,6 @@ namespace cc { namespace { -class TestWorkerThread : public base::SimpleThread { - public: - TestWorkerThread() - : base::SimpleThread("test_worker_thread"), condition_(&lock_) {} - - void Run() override { - for (;;) { - base::OnceClosure task; - { - base::AutoLock hold(lock_); - if (shutdown_) - break; - - if (queue_.empty()) { - condition_.Wait(); - continue; - } - - task = std::move(queue_.front()); - queue_.erase(queue_.begin()); - } - std::move(task).Run(); - } - } - - void Shutdown() { - base::AutoLock hold(lock_); - shutdown_ = true; - condition_.Signal(); - } - - void PostTask(base::OnceClosure task) { - base::AutoLock hold(lock_); - queue_.push_back(std::move(task)); - condition_.Signal(); - } - - private: - base::Lock lock_; - base::ConditionVariable condition_; - std::vector<base::OnceClosure> queue_; - bool shutdown_ = false; -}; - -class WorkerTaskRunner : public base::SequencedTaskRunner { - public: - WorkerTaskRunner() { thread_.Start(); } - - bool PostNonNestableDelayedTask(const base::Location& from_here, - base::OnceClosure task, - base::TimeDelta delay) override { - return PostDelayedTask(from_here, std::move(task), delay); - } - - bool PostDelayedTask(const base::Location& from_here, - base::OnceClosure task, - base::TimeDelta delay) override { - thread_.PostTask(std::move(task)); - return true; - } - - bool RunsTasksInCurrentSequence() const override { return false; } - - protected: - ~WorkerTaskRunner() override { - thread_.Shutdown(); - thread_.Join(); - } - - TestWorkerThread thread_; -}; - // Image decode cache with introspection! class TestableCache : public StubDecodeCache { public: @@ -209,6 +139,7 @@ EXPECT_FALSE(HasCompleted()); EXPECT_FALSE(thread_checker_.CalledOnValidThread()); base::AutoLock hold(lock_); + base::ScopedAllowBaseSyncPrimitivesForTesting allow_base_sync_primitives; while (!can_run_) run_cv_.Wait(); has_run_ = true; @@ -263,16 +194,16 @@ ~ImageControllerTest() override = default; void SetUp() override { - worker_task_runner_ = base::MakeRefCounted<WorkerTaskRunner>(); - controller_ = std::make_unique<ImageController>(task_runner_.get(), - worker_task_runner_); + controller_ = std::make_unique<ImageController>( + task_runner_, + base::ThreadPool::CreateSequencedTaskRunner(base::TaskTraits())); cache_ = TestableCache(); controller_->SetImageDecodeCache(&cache_); } void TearDown() override { controller_.reset(); - worker_task_runner_ = nullptr; + CCTestSuite::RunUntilIdle(); weak_ptr_factory_.InvalidateWeakPtrs(); } @@ -319,7 +250,6 @@ private: scoped_refptr<base::SequencedTaskRunner> task_runner_; - scoped_refptr<WorkerTaskRunner> worker_task_runner_; TestableCache cache_; std::unique_ptr<ImageController> controller_; DrawImage image_;
diff --git a/chrome/VERSION b/chrome/VERSION index 0f9acfb..ba78ded 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=105 MINOR=0 -BUILD=5132 +BUILD=5133 PATCH=0
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni index 6913524..2f9dddef 100644 --- a/chrome/android/chrome_junit_test_java_sources.gni +++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -143,6 +143,7 @@ "junit/src/org/chromium/chrome/browser/instantapps/InstantAppsMessageDelegateTest.java", "junit/src/org/chromium/chrome/browser/invalidation/ResumableDelayedTaskRunnerTest.java", "junit/src/org/chromium/chrome/browser/invalidation/SessionsInvalidationManagerTest.java", + "junit/src/org/chromium/chrome/browser/javascript/WebContextFetcherTest.java", "junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationActionsUpdatedTest.java", "junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationFaviconTest.java", "junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerNotificationTest.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index 326c6fa..e298479 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -244,7 +244,6 @@ "javatests/src/org/chromium/chrome/browser/instantapps/InstantAppsHandlerTest.java", "javatests/src/org/chromium/chrome/browser/interstitials/LookalikeInterstitialTest.java", "javatests/src/org/chromium/chrome/browser/javascript/CloseWatcherTest.java", - "javatests/src/org/chromium/chrome/browser/javascript/WebContextFetcherTest.java", "javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java", "javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptTabModalDialogTest.java", "javatests/src/org/chromium/chrome/browser/locale/LocaleManagerReferralTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java index 8210ef26..7a396d0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java
@@ -128,7 +128,7 @@ private static final int ARTICLE_SECTION_HEADER_POSITION = 1; private static final int SIGNIN_PROMO_POSITION = 2; - private static final int RENDER_TEST_REVISION = 3; + private static final int RENDER_TEST_REVISION = 4; @Rule public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); @@ -227,6 +227,8 @@ scrimCoordinator.disableAnimationForTesting(false); } + // TODO(crbug.com/1334912): This sync promos tests should be removed, since we have a similar tests in + // SigninPromoControllerRenderTest. @Test @SmallTest @Feature({"NewTabPage", "FeedNewTabPage", "RenderTest"})
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java index c5cb926..65bce11 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java
@@ -111,7 +111,7 @@ public class MainSettingsFragmentTest { private static final String SEARCH_ENGINE_SHORT_NAME = "Google"; - private static final int RENDER_TEST_REVISION = 7; + private static final int RENDER_TEST_REVISION = 8; private final HomepageTestRule mHomepageTestRule = new HomepageTestRule();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/javascript/WebContextFetcherTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/javascript/WebContextFetcherTest.java similarity index 93% rename from chrome/android/javatests/src/org/chromium/chrome/browser/javascript/WebContextFetcherTest.java rename to chrome/android/junit/src/org/chromium/chrome/browser/javascript/WebContextFetcherTest.java index bf7099e..a426c81e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/javascript/WebContextFetcherTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/javascript/WebContextFetcherTest.java
@@ -4,25 +4,24 @@ package org.chromium.chrome.browser.javascript; -import androidx.test.filters.SmallTest; - import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; +import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.browser.javascript.WebContextFetcher.WebContextFetchResponse; -import org.chromium.chrome.test.ChromeJUnit4ClassRunner; /** * Unit tests for web context fetching java code. */ -@RunWith(ChromeJUnit4ClassRunner.class) +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) public class WebContextFetcherTest { /** * Test that converting map to json results in the correct output in various scenarios. */ @Test - @SmallTest public void testConvertJsonToResponse_Successful() { WebContextFetchResponse emptyResponse = WebContextFetcher.convertJsonToResponse("{}"); Assert.assertTrue("Empty json dictionary does not return empty map.", @@ -37,7 +36,6 @@ } @Test - @SmallTest public void testConvertJsonToResponse_AssertionErrorMalformed() { WebContextFetchResponse response = WebContextFetcher.convertJsonToResponse("14324asdfasc132434"); @@ -49,7 +47,6 @@ } @Test - @SmallTest public void testConvertJsonToResponse_AssertionErrorNestedObject() { WebContextFetchResponse response = WebContextFetcher.convertJsonToResponse( "{\"nestedObject\": {\"nestedKey\": \"nestedVal\"}}"); @@ -60,7 +57,6 @@ } @Test - @SmallTest public void testConvertJsonToResponse_AssertionErrorNonStringVal() { WebContextFetchResponse response = WebContextFetcher.convertJsonToResponse("{\"integer\": 123}"); @@ -71,7 +67,6 @@ } @Test - @SmallTest public void testConvertJsonToResponse_AssertionErrorArray() { WebContextFetchResponse response = WebContextFetcher.convertJsonToResponse( "{\"nestedArray\":[\"arrayVal1\", \"arrayVal2\"]}");
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn index 04e4ae0..f2ae95a6 100644 --- a/chrome/app/BUILD.gn +++ b/chrome/app/BUILD.gn
@@ -3,11 +3,11 @@ # found in the LICENSE file. import("//build/config/chrome_build.gni") +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/locales.gni") import("//build/config/ui.gni") import("//chrome/common/features.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//components/gwp_asan/buildflags/buildflags.gni") import("//components/nacl/features.gni") import("//crypto/features.gni")
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb index c69107be..4a56e04 100644 --- a/chrome/app/resources/chromium_strings_no.xtb +++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -356,7 +356,7 @@ <translation id="9089354809943900324">Chromium er utdatert</translation> <translation id="9093206154853821181">{0,plural, =1{Chromium startes på nytt om en time}other{Chromium startes på nytt om # timer}}</translation> <translation id="91086099826398415">Åpne linken i en ny &fane i Chromium</translation> -<translation id="911206726377975832">Vil du slette all nettleserdata også?</translation> +<translation id="911206726377975832">Vil du slette all nettlesingsdata også?</translation> <translation id="9144490074902256427">Underveis i prøveprosjektene kan du se og fjerne interesseemnene som nettsteder bruker for å vise deg annonser. Chromium anslår interessene dine basert på den nylige nettleserloggen din.</translation> <translation id="9158494823179993217">Systemadministratoren din har konfigurert Chromium til å åpne en annen nettleser når du går til <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="9185526690718004400">Start på nytt for å oppdatere &Chromium</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 102e8cd..7522f8f 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -1923,6 +1923,7 @@ <translation id="2775858145769350417">{NUM_APPS,plural, =1{Verwyder 1 ongesteunde program}other{Verwyder # ongesteunde programme}}</translation> <translation id="2776560192867872731">Verander toestelnaam vir <ph name="DEVICE_NAME" /></translation> <translation id="2777251078198759550">Vee hierdie houer uit</translation> +<translation id="2778471504622896352">Voeg afstandprogramme by die Chrome-bedryfstelsellanseerder</translation> <translation id="2781692009645368755">Google Pay</translation> <translation id="2782104745158847185">Kon nie Linux-program installeer nie</translation> <translation id="2783298271312924866">Afgelaai</translation> @@ -3558,6 +3559,7 @@ <translation id="4390396490617716185"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /> en nog <ph name="NUMBER_OF_OTHER_SWITCHES" /> skakelaars</translation> <translation id="439266289085815679">Bluetooth-opstelling word beheer deur <ph name="USER_EMAIL" />.</translation> <translation id="4392896746540753732">Wysig die opstellinglêer</translation> +<translation id="4393713825278446281">Kitsbind-toestelle wat in <ph name="PRIMARY_EMAIL" /> gestoor is</translation> <translation id="4394049700291259645">Deaktiveer</translation> <translation id="4396956294839002702">{COUNT,plural, =0{Maak almal &oop}=1{Maak boekmerk &oop}other{Maak almal ({COUNT}) &oop}}</translation> <translation id="4397372003838952832">Jy hoef nie hierdie wagwoord te onthou nie. Dit sal in <ph name="GOOGLE_PASSWORD_MANAGER" /> gestoor word vir <ph name="EMAIL" /></translation> @@ -3788,6 +3790,7 @@ <translation id="4615586811063744755">geen webkoekie is gekies nie</translation> <translation id="461661862154729886">Energiebron</translation> <translation id="4617001782309103936">Te kort</translation> +<translation id="4617019240346358451">Herlaai die bladsy om "<ph name="EXTENSION_NAME" />" te gebruik</translation> <translation id="4617270414136722281">Uitbreidingopsies</translation> <translation id="4617880081511131945">Kan nie verbinding vestig nie</translation> <translation id="4619564267100705184">Verifieer dis jy</translation> @@ -4003,6 +4006,7 @@ <translation id="4833683849865011483">Het 1 drukker op die drukbediener gekry</translation> <translation id="4836504898754963407">Bestuur vingerafdrukke</translation> <translation id="4837128290434901661">Verander terug na Google Search?</translation> +<translation id="4837165100461973682">Herlaai die bladsy om jou veranderinge toe te pas</translation> <translation id="4837926214103741331">Jy is nie gemagtig om hierdie toestel te gebruik nie. Kontak asseblief die toesteleienaar vir toestemming om aan te meld.</translation> <translation id="4837952862063191349">Voer asseblief jou ou <ph name="DEVICE_TYPE" />-wagwoord in om jou plaaslike data te ontsluit en te herwin.</translation> <translation id="4838170306476614339">Bekyk jou foon se foto's, media en kennisgewings</translation> @@ -4312,6 +4316,7 @@ <translation id="5150254825601720210">Netscape-sertifikaat se SSL-bedienernaam</translation> <translation id="5151354047782775295">Maak skyfspasie beskikbaar, anders kan sekere data outomaties uitgevee word</translation> <translation id="5153234146675181447">Vergeet foon</translation> +<translation id="5153907427821264830"><ph name="STATUS" /> • <ph name="MESSAGE" /></translation> <translation id="5154108062446123722">Gevorderde instellings vir <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Onderwerp</translation> <translation id="5155327081870541046">Voer die kortpad vir die werf wat jy wil deursoek, soos "@boekmerke", by die adresbalk in. Druk dan jou voorkeurkortpadsleutel en voer jou soekterm in.</translation> @@ -5948,6 +5953,7 @@ <translation id="6790497603648687708"><ph name="EXTENSION_NAME" /> is oor 'n afstand bygevoeg</translation> <translation id="6790820461102226165">Voeg persoon by …</translation> <translation id="6793604637258913070">Lig die tekskaret uit wanneer dit verskyn of beweeg</translation> +<translation id="6793879402816827484">↓ <ph name="STATUS" /></translation> <translation id="6795371939514004514">Outoskandeer maak dit vir jou moontlik om outomaties deur items op die skerm te beweeg. Druk “Kies” om 'n item te aktiveer wanneer dit gemerk is.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Oeps, iets het verkeerd geloop.</translation> @@ -7820,6 +7826,7 @@ <translation id="8642947597466641025">Maak teks groter</translation> <translation id="8643443571868262066"><ph name="FILE_NAME" /> kan gevaarlik wees. Stuur dit na Google Gevorderde Beskerming om te skandeer?</translation> <translation id="8644047503904673749">{COUNT,plural, =0{Geen webkoekies nie}=1{1 webkoekie word geblokkeer}other{# webkoekies word geblokkeer}}</translation> +<translation id="864423554496711319">Toestelle wat in jou rekening gestoor is</translation> <translation id="8644655801811752511">Kan nie hierdie sekuriteitsleutel terugstel nie. Probeer om die sleutel onmiddellik terug te stel nadat jy dit ingesit het.</translation> <translation id="8645354835496065562">Hou aan om sentortoegang toe te laat</translation> <translation id="8645920082661222035">Voorspel en waarsku jou teen gevaarlike gevalle voordat hulle plaasvind</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index c8006df2..258bc0be 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -3923,6 +3923,7 @@ <translation id="4768332406694066911">لديك شهادات تحدد هويتك من هذه المؤسسات</translation> <translation id="4770119228883592393">تم طلب الإذن، اضغط على ⌘ + Option + السهم المتجه للأسفل للاستجابة للطلب</translation> <translation id="4773112038801431077">ترقية نظام التشغيل Linux</translation> +<translation id="4774337692467964393">في حال تفعيل مجموعة ميزات Smart Lock، لن تحتاج إلى إدخال رقم تعريف شخصي أو كلمة مرور.</translation> <translation id="4775142426314270551">يمكنك المساهمة في تحسين ميزات وأداء متصفّح Chrome ونظام التشغيل Chrome من خلال إرسال تقارير الأعطال وبيانات التشخيص والاستخدام إلى Google تلقائيًا. تساعد أيضًا بعض البيانات المجمّعة في تحسين تطبيقات Android ومنتجات شركاء Google. في حال تفعيل الإعداد "النشاط على الويب وفي التطبيقات" لحساب طفلك في Google، قد يتم حفظ بيانات طفلك على Android في حساب Google الخاص به.</translation> <translation id="477647109558161443">إنشاء اختصار على سطح المكتب</translation> <translation id="4776594120007763294">لإضافة صفحة وقراءتها لاحقًا، انقر على الزر.</translation> @@ -3972,6 +3973,7 @@ <translation id="4820236583224459650">ضبط كتذكرة نشطة</translation> <translation id="4821935166599369261">&التوصيف مفعّل</translation> <translation id="4823484602432206655">قراءة إعدادات المستخدم والجهاز وتغييرها</translation> +<translation id="4823894915586516138">يوفّر رقم التعريف الشخصي أو كلمة المرور حماية لبياناتك على جهاز <ph name="DEVICE_TYPE" /> هذا، بما في ذلك أي معلومات تصل إليها من هاتفك.</translation> <translation id="4824037980212326045">النسخ الاحتياطي واستعادة البيانات من نظام التشغيل Linux</translation> <translation id="4824958205181053313">هل تريد إلغاء المزامنة؟</translation> <translation id="4827675678516992122">تعذّر الاتصال</translation> @@ -5629,6 +5631,7 @@ <translation id="648927581764831596">ليست هناك وسائط متوفرة</translation> <translation id="6490471652906364588">جهاز USB-C (المنفذ الأيمن)</translation> <translation id="6491376743066338510">تعذّر التفويض</translation> +<translation id="6492396476180293140">تم إيقاف الكاميرا الداخلية باستخدام مفتاح التشغيل/الإيقاف في الجهاز.</translation> <translation id="6494327278868541139">عرض تفاصيل الحماية المُحسَّنة</translation> <translation id="6494445798847293442">ليست مرجعًا مصدقًا</translation> <translation id="6494974875566443634">إعدادات التخصيص</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 46fbaf0..8bb42fe 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -3933,6 +3933,7 @@ <translation id="4768332406694066911">আপোনাক চিনি পোৱা এই প্ৰতিষ্ঠানবোৰে প্ৰদান কৰা প্ৰমাণপত্ৰ আছে</translation> <translation id="4770119228883592393">অনুমতিৰ বাবে অনুৰোধ জনোৱা হৈছে, সঁহাৰি জনাবলৈ ⌘ + অপশ্বন + ডাউন এৰ’ত টিপক</translation> <translation id="4773112038801431077">Linux আপগ্ৰে’ড কৰক</translation> +<translation id="4774337692467964393">যদি Smart Lock অন কৰা হয়, তেতিয়া আপুনি কোনো পিন অথবা পাছৱর্ড দিন নালাগে</translation> <translation id="4775142426314270551">Googleলৈ স্বয়ংক্ৰিয়ভাৱে ক্ৰেশ্ব ৰিপ’ৰ্টৰ লগতে ডায়েগন’ষ্টিক আৰু ব্যৱহাৰৰ ডেটা পঠিয়াই Chrome আৰু ChromeOSৰ সুবিধাসমূহ আৰু কাৰ্যক্ষমতা উন্নত কৰাত সহায় কৰক। কিছু একত্ৰিত ডেটায়ো Android এপ্আৰু Googleৰ অংশীদাৰসমূহক সহায় কৰিব। আপোনাৰ শিশুৰ Google একাউণ্টৰ বাবে ৱেব আৰু এপৰ কাৰ্যকলাপৰ ছেটিং অন হৈ থাকিলে আপোনাৰ শিশুৰ Android ডেটা আপোনাৰ শিশুৰ Google একাউণ্টত ছেভ কৰা হ’ব পাৰে।</translation> <translation id="477647109558161443">ডেস্কটপৰ শ্বৰ্টকাট সৃষ্টি কৰক</translation> <translation id="4776594120007763294">পাছত পঢ়িবৰ বাবে কোনো পৃষ্ঠা যোগ দিবলৈ বুটামটোত ক্লিক কৰক</translation> @@ -3982,6 +3983,7 @@ <translation id="4820236583224459650">সক্ৰিয় টিকেট হিচাপে ছেট কৰক</translation> <translation id="4821935166599369261">&প্ৰ’ফাইলিং সক্ষম কৰা হৈছে</translation> <translation id="4823484602432206655">ব্যৱহাৰকাৰী আৰু ডিভাইচৰ ছেটিংসমূহ পঢ়ক আৰু সলনি কৰক</translation> +<translation id="4823894915586516138">এইটো <ph name="DEVICE_TYPE" />ত এই পিন অথবা পাছৱর্ডটোৱে আপুনি নিজৰ ফ'নত এক্সেছ কৰা যিকোনো তথ্যকে ধৰি আপোনাৰ ডেটা সুৰক্ষিত কৰে</translation> <translation id="4824037980212326045">Linuxৰ বেকআপ আৰু পুনঃস্থাপন</translation> <translation id="4824958205181053313">ছিংক বাতিল কৰিবনে?</translation> <translation id="4827675678516992122">সংযোগ কৰিব পৰা নগ’ল</translation> @@ -5639,6 +5641,7 @@ <translation id="648927581764831596">উপলব্ধ নহয়</translation> <translation id="6490471652906364588">USB-C ডিভাইচ (সোঁফালৰ পর্ট)</translation> <translation id="6491376743066338510">বিশ্বাসযোগ্যতাৰ প্ৰমাণীকৰণ কৰিব পৰা নগ’ল</translation> +<translation id="6492396476180293140">হাৰ্ডৱেৰৰ ছুইচে অভ্যন্তৰীণ কেমেৰা অক্ষম কৰিছে</translation> <translation id="6494327278868541139">বৰ্ধিত সুৰক্ষাৰ সবিশেষ দেখুৱাওক</translation> <translation id="6494445798847293442">কোনো প্ৰমাণপত্ৰ প্ৰদানকাৰী কৰ্তৃপক্ষ নহয়</translation> <translation id="6494974875566443634">কাষ্টমাইজেশ্বন</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index efb6b63..582ec7c 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -3917,6 +3917,7 @@ <translation id="4768332406694066911">Bu təşkilatlardan Sizi tanıdacaq sertifikatlarınız var</translation> <translation id="4770119228883592393">İcazə tələb edilib, cavablandırmaq üçün ⌘ + Seçim + Aşağı ox düyməsini basın</translation> <translation id="4773112038801431077">Linux'u təkmilləşdirin</translation> +<translation id="4774337692467964393">Smart Lock aktiv olduqda PIN və ya parol daxil etməyinizə ehtiyac olmayacaq</translation> <translation id="4775142426314270551">Xəta hesabatları, eləcə də diaqnostika və istifadə datasını avtomatik Google'a göndərməklə Chrome və ChromeOS funksiyalarını və performansını təkmilləşdirməyə yardım edin. Bəzi birləşdirilmiş data Android tətbiqləri və Google partnyorlarına da kömək edəcək. Veb və Tətbiq Fəaliyyəti ayarı övladınızın Google Hesabı üçün aktiv edilərsə, övladınızın Android datası onun Google Hesabında yadda saxlanıla bilər.</translation> <translation id="477647109558161443">Masaüstü qısayol yaradın</translation> <translation id="4776594120007763294">Daha sonra oxumaq məqsədilə bir səhifə əlavə etmək üçün düyməni basın</translation> @@ -3966,6 +3967,7 @@ <translation id="4820236583224459650">Aktiv bilet kimi yadda saxlayın</translation> <translation id="4821935166599369261">Profilləşdirmə aktivdir</translation> <translation id="4823484602432206655">İstifadəçi və cihaz ayarlarını oxuyun və dəyişin</translation> +<translation id="4823894915586516138">Bu PIN və ya parol telefonunuzdan giriş etdiyiniz hər hansı məzmun daxil olmaqla, bu <ph name="DEVICE_TYPE" /> cihazındakı məlumatlarınızı qoruyur</translation> <translation id="4824037980212326045">Linux yedəkləmə və bərpası</translation> <translation id="4824958205181053313">Sinxronizasiya ləğv edilsin?</translation> <translation id="4827675678516992122">Qoşulmaq mümkün deyil</translation> @@ -5621,6 +5623,7 @@ <translation id="648927581764831596">Heç biri mövcud deyil</translation> <translation id="6490471652906364588">USB-C cihazı (sağ port)</translation> <translation id="6491376743066338510">Doğrulama uğursuz oldu</translation> +<translation id="6492396476180293140">Daxili kamera avadanlıq açarı ilə deaktiv edilib</translation> <translation id="6494327278868541139">Geniş qoruma detallarını göstərin</translation> <translation id="6494445798847293442">Sertifikatlaşdırma Təşkilatı deyil</translation> <translation id="6494974875566443634">Fərdiləşdirmə</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 3036334..5c98ef4 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -3934,6 +3934,7 @@ <translation id="4768332406694066911">Имате идентифициращи ви сертификати от тези организации</translation> <translation id="4770119228883592393">Изисква се разрешение. Натиснете ⌘ + Option + стрелката за надолу, за да отговорите</translation> <translation id="4773112038801431077">Надстройване на Linux</translation> +<translation id="4774337692467964393">Ако функцията Smart Lock е включена, няма да е необходимо да въвеждате ПИН код или парола.</translation> <translation id="4775142426314270551">Помогнете за подобряването на функциите и ефективността на Chrome и Chrome OS, като автоматично изпращате до Google сигнали за сривове, както и диагностична информация и данни за използването. Някои обобщени данни също така ще подпомогнат приложенията за Android и партньорите на Google. Ако настройката „Активност в мрежата и приложенията“ е включена за профила в Google на детето ви, данните му от Android може да се запазват в профила му в Google.</translation> <translation id="477647109558161443">Създаване на пряк път на работния плот</translation> <translation id="4776594120007763294">За да добавите страница за четене по-късно, кликнете върху бутона</translation> @@ -3983,6 +3984,7 @@ <translation id="4820236583224459650">Задаване като активен пропуск</translation> <translation id="4821935166599369261">&Профилирането е активирано</translation> <translation id="4823484602432206655">Четене и промяна на настройките на потребителите и устройството</translation> +<translation id="4823894915586516138">ПИН кодът или паролата защитават данните ви на това устройство <ph name="DEVICE_TYPE" />, включително информацията, до която осъществявате достъп от телефона си</translation> <translation id="4824037980212326045">Резервни копия и възстановяване на Linux</translation> <translation id="4824958205181053313">Да се анулира ли синхронизирането?</translation> <translation id="4827675678516992122">Не можа да се установи връзка</translation> @@ -5641,6 +5643,7 @@ <translation id="648927581764831596">Няма</translation> <translation id="6490471652906364588">USB-C устройство (десният порт)</translation> <translation id="6491376743066338510">Упълномощаването не бе успешно</translation> +<translation id="6492396476180293140">Вътрешната камера е деактивирана чрез хардуерния превключвател</translation> <translation id="6494327278868541139">Показване на подробности за подобрената защита</translation> <translation id="6494445798847293442">Не е сертифициращ орган</translation> <translation id="6494974875566443634">Персонализиране</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 4b3f3f6..d05f915 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -1921,6 +1921,7 @@ <translation id="2775858145769350417">{NUM_APPS,plural, =1{Uklonite 1 nepodržanu aplikaciju}one{Uklonite # nepodržanu aplikaciju}few{Uklonite # nepodržane aplikacije}other{Uklonite # nepodržanih aplikacija}}</translation> <translation id="2776560192867872731">Promijenite naziv uređaja <ph name="DEVICE_NAME" /></translation> <translation id="2777251078198759550">Obriši ovaj spremnik</translation> +<translation id="2778471504622896352">Dodavanje udaljenih aplikacija u pokretač OS-a Chrome</translation> <translation id="2781692009645368755">Google Pay</translation> <translation id="2782104745158847185">Greška prilikom instalacije Linux aplikacije</translation> <translation id="2783298271312924866">Preuzeto</translation> @@ -2236,6 +2237,7 @@ <translation id="3067198360141518313">Pokreni ovaj dodatak</translation> <translation id="3071624960923923138">Možete kliknuti ovdje da otvorite novu karticu</translation> <translation id="3072775339180057696">Dozvoliti web lokaciji da pregleda fajl <ph name="FILE_NAME" />?</translation> +<translation id="3074499504015191586">Prevedi cijelu stranicu</translation> <translation id="3075874217500066906">Za započinjanje Powerwash procesa je potrebno ponovno pokretanje uređaja. Nakon ponovnog pokretanja trebate potvrditi da želite nastaviti.</translation> <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation> <translation id="3076966043108928831">Sačuvaj samo na ovom uređaju</translation> @@ -3556,6 +3558,7 @@ <translation id="4390396490617716185"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /> i još sljedeći broj prekidača: <ph name="NUMBER_OF_OTHER_SWITCHES" /></translation> <translation id="439266289085815679">Konfiguriranje Bluetootha kontrolira <ph name="USER_EMAIL" />.</translation> <translation id="4392896746540753732">Uredite fajl za konfiguraciju</translation> +<translation id="4393713825278446281">Uređaji za Brzo uparivanje spremljeni su na <ph name="PRIMARY_EMAIL" /></translation> <translation id="4394049700291259645">Onemogući</translation> <translation id="4396956294839002702">{COUNT,plural, =0{&Otvori sve}=1{&Otvori oznaku}one{&Otvori sve ({COUNT})}few{&Otvori sve ({COUNT})}other{&Otvori sve ({COUNT})}}</translation> <translation id="4397372003838952832">Nećete morati zapamtiti ovu lozinku. Sačuvat će se u aplikaciji <ph name="GOOGLE_PASSWORD_MANAGER" /> za račun <ph name="EMAIL" />.</translation> @@ -3786,6 +3789,7 @@ <translation id="4615586811063744755">nije izabran kolačić</translation> <translation id="461661862154729886">Izvor energije</translation> <translation id="4617001782309103936">Prekratak</translation> +<translation id="4617019240346358451">Ponovno učitajte stranicu da biste koristili proširenje <ph name="EXTENSION_NAME" /></translation> <translation id="4617270414136722281">Opcije ekstenzija</translation> <translation id="4617880081511131945">Nije moguće uspostaviti vezu</translation> <translation id="4619564267100705184">Potvrdite identitet</translation> @@ -4001,6 +4005,7 @@ <translation id="4833683849865011483">Pronađen je 1 štampač na serveru za štampanje</translation> <translation id="4836504898754963407">Upravljajte otiscima prstiju</translation> <translation id="4837128290434901661">Vratiti na Google Pretraživanje?</translation> +<translation id="4837165100461973682">Ponovno učitajte stranicu da biste primijenili izmjene</translation> <translation id="4837926214103741331">Nemate odobrenje za korištenje ovog uređaja. Kontaktirajte vlasnika uređaja zbog odobrenja za prijavu.</translation> <translation id="4837952862063191349">Za otključavanje i vraćanje svojih lokalnih podataka, unesite svoju staru lozinku za uređaj <ph name="DEVICE_TYPE" />.</translation> <translation id="4838170306476614339">Pregledajte fotografije, medijski sadržaj i obavještenja telefona</translation> @@ -4310,6 +4315,7 @@ <translation id="5150254825601720210">Naziv SSL servera za Netscape potvrde</translation> <translation id="5151354047782775295">Oslobodite prostor na disku ili će se određeni podaci automatski izbrisati</translation> <translation id="5153234146675181447">Zaboravi telefon</translation> +<translation id="5153907427821264830"><ph name="STATUS" /> • <ph name="MESSAGE" /></translation> <translation id="5154108062446123722">Napredne postavke za <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Naslov</translation> <translation id="5155327081870541046">Na traci za adresu unesite prečicu za web lokaciju koju želite pretraživati, kao što je "@oznake". Zatim pritisnite željenu prečicu na tastaturi i unesite pojam za pretraživanje.</translation> @@ -5085,6 +5091,7 @@ <translation id="5933522550144185133"><ph name="APP_NAME" /> koristi vašu kameru i mikrofon.</translation> <translation id="5935158534896975820">Priprema zahtjeva za potpisivanje certifikata (čeka se server)</translation> <translation id="5935656526031444304">Upravljanje Sigurnim pregledanjem</translation> +<translation id="5936065461722368675">Prevedi cijelu stranicu</translation> <translation id="5938002010494270685">Dostupno je sigurnosno ažuriranje</translation> <translation id="5939518447894949180">Ponovno postavi</translation> <translation id="5939719276406088041">Nije moguće kreirati prečicu</translation> @@ -5949,6 +5956,7 @@ <translation id="6790497603648687708">Ekstenzija <ph name="EXTENSION_NAME" /> je dodana daljinskim putem</translation> <translation id="6790820461102226165">Dodaj osobu...</translation> <translation id="6793604637258913070">Istakni znak za umetanje kada se pojavi ili pomakne</translation> +<translation id="6793879402816827484">↓ <ph name="STATUS" /></translation> <translation id="6795371939514004514">Automatsko skeniranje vam omogućava da se automatski krećete kroz stavke na ekranu. Kada je stavka istaknuta, pritisnite "Odaberi" da je aktivirate.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Nešto nije uredu.</translation> @@ -7822,6 +7830,7 @@ <translation id="8642947597466641025">Uvećavanje teksta</translation> <translation id="8643443571868262066">Fajl <ph name="FILE_NAME" /> može biti opasan. Poslati Googleovoj Naprednoj zaštiti radi skeniranja?</translation> <translation id="8644047503904673749">{COUNT,plural, =0{Nema kolačića}=1{1 kolačić je blokiran}one{# kolačić je blokiran}few{# kolačića su blokirana}other{# kolačića je blokirano}}</translation> +<translation id="864423554496711319">Uređaji spremljeni na vaš račun</translation> <translation id="8644655801811752511">Nije moguće poništiti ovaj sigurnosni ključ. Pokušajte poništiti ključ odmah nakon umetanja.</translation> <translation id="8645354835496065562">Nastavi dozvoljavati pristup senzorima</translation> <translation id="8645920082661222035">Predviđa opasne događaje i upozorava vas na njih prije nego što nastupe</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 3ce55ca..1906a13e 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -3920,6 +3920,7 @@ <translation id="4768332406694066911">Tens certificats d'aquestes organitzacions que t'identifiquen</translation> <translation id="4770119228883592393">S'ha sol·licitat permís, prem ⌘+Opció+fletxa avall per respondre</translation> <translation id="4773112038801431077">Actualitza Linux</translation> +<translation id="4774337692467964393">Si Smart Lock està activat, no caldrà que introdueixis cap PIN ni contrasenya</translation> <translation id="4775142426314270551">Ajuda a millorar les funcions i el rendiment de Chrome i Chrome OS enviant automàticament informes d'error i dades de diagnòstic i d'ús a Google. Una part de les dades agregades també serà útil per a les aplicacions i per als partners de Google. Si l'opció Activitat al web i en aplicacions està activada per al Compte de Google del teu fill o filla, és possible que les seves dades d'Android es desin al seu Compte de Google.</translation> <translation id="477647109558161443">Crea una drecera de l'escriptori</translation> <translation id="4776594120007763294">Si vols afegir una pàgina per llegir-la més tard, fes clic al botó</translation> @@ -3969,6 +3970,7 @@ <translation id="4820236583224459650">Estableix com a tiquet actiu</translation> <translation id="4821935166599369261">Creació de &perfils activada</translation> <translation id="4823484602432206655">Llegir i canviar la configuració d'usuari i del dispositiu</translation> +<translation id="4823894915586516138">Aquest PIN o contrasenya protegeix les teves dades en aquest <ph name="DEVICE_TYPE" />, inclosa la informació a què accedeixis des del telèfon</translation> <translation id="4824037980212326045">Còpia de seguretat i restauració de Linux</translation> <translation id="4824958205181053313">Vols cancel·lar la sincronització?</translation> <translation id="4827675678516992122">No s'ha pogut connectar</translation> @@ -5625,6 +5627,7 @@ <translation id="648927581764831596">No n'hi ha cap de disponible</translation> <translation id="6490471652906364588">Dispositiu USB-C (port dret)</translation> <translation id="6491376743066338510">No s'ha pogut completar l'autorització</translation> +<translation id="6492396476180293140">Càmera interna desactivada per l'interruptor de maquinari</translation> <translation id="6494327278868541139">Mostra els detalls de la protecció millorada</translation> <translation id="6494445798847293442">No és una entitat emissora de certificats</translation> <translation id="6494974875566443634">Personalització</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index f0322ba..292cb2a 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -3940,6 +3940,7 @@ <translation id="4768332406694066911">Mae gennych dystysgrifau gan y sefydliadau hyn sy'n eich adnabod chi</translation> <translation id="4770119228883592393">Gofynnwyd am ganiatâd, pwyswch ⌘ + Option + Saeth i lawr i ymateb</translation> <translation id="4773112038801431077">Uwchraddio Linux</translation> +<translation id="4774337692467964393">Os mae Smart Lock ymlaen, ni fydd angen i chi roi PIN na chyfrinair</translation> <translation id="4775142426314270551">Helpu i wella nodweddion a pherfformiad Chrome a ChromeOS drwy anfon adroddiadau toriadau yn awtomatig ynghyd â data diagnostig a defnydd at Google. Bydd rhywfaint o ddata cyfanredol hefyd yn helpu apiau Android a phartneriaid Google. Os yw'r gosodiad Gweithgarwch ar y We ac Apiau wedi'i droi ymlaen ar gyfer Cyfrif Google eich plentyn, gellir cadw data Android eich plentyn i Gyfrif Google eich plentyn.</translation> <translation id="477647109558161443">Creu llwybr byr bwrdd gwaith</translation> <translation id="4776594120007763294">I ychwanegu tudalen i'w darllen yn nes ymlaen, cliciwch y botwm</translation> @@ -3989,6 +3990,7 @@ <translation id="4820236583224459650">Gosod fel tocyn gweithredol</translation> <translation id="4821935166599369261">&Proffilio wedi'i Alluogi</translation> <translation id="4823484602432206655">Darllen a newid gosodiadau defnyddiwr a dyfais</translation> +<translation id="4823894915586516138">Mae'r PIN neu'r cyfrinair hwn yn amddiffyn eich data ar y ddyfais <ph name="DEVICE_TYPE" /> hon, gan gynnwys unrhyw wybodaeth rydych yn cyrchu o'ch ffôn</translation> <translation id="4824037980212326045">Gwneud copi wrth gefn ac adfer Linux</translation> <translation id="4824958205181053313">Canslo cysoni?</translation> <translation id="4827675678516992122">Methu â chysylltu</translation> @@ -5646,6 +5648,7 @@ <translation id="648927581764831596">Dim ar gael</translation> <translation id="6490471652906364588">Dyfais USB-C (porth de)</translation> <translation id="6491376743066338510">Methodd yr awdurdodiad</translation> +<translation id="6492396476180293140">Cafodd y camera mewnol ei ddadweithredu gan switsh caledwedd</translation> <translation id="6494327278868541139">Dangos manylion gwell amddiffyniad</translation> <translation id="6494445798847293442">Nid yw'n Awdurdod Ardystio</translation> <translation id="6494974875566443634">Personoleiddio</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index ea5643d..43a8f10f 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1544,6 +1544,7 @@ <translation id="2433836460518180625">Solo bloquear dispositivo</translation> <translation id="2434449159125086437">No se ha podido configurar la impresora. Comprueba la configuración e inténtalo de nuevo.</translation> <translation id="2434758125294431199">Selecciona quién puede compartir archivos contigo</translation> +<translation id="2434915728183570229">Ya puedes consultar las aplicaciones de tu teléfono</translation> <translation id="2435137177546457207">Términos Adicionales de Google Chrome y ChromeOS Flex</translation> <translation id="2435248616906486374">Red desconectada</translation> <translation id="2435457462613246316">Mostrar contraseña</translation> @@ -4221,6 +4222,7 @@ <translation id="5072900412896857127">Los Términos del Servicio de Google Play no se pueden cargar. Comprueba tu conexión de red y vuelve a intentarlo.</translation> <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" /> y <ph name="FILE2" />}other{<ph name="FILE1" />, <ph name="FILE2" /> y # más}}</translation> <translation id="5074318175948309511">Es posible que debas actualizar la página para que se aplique la nueva configuración.</translation> +<translation id="5074761966806028321">Se sigue necesitando permiso para completar la configuración</translation> <translation id="5075910247684008552">El contenido no seguro se bloquea de forma predeterminada en los sitios seguros</translation> <translation id="5078638979202084724">Añadir todas las pestañas a marcadores</translation> <translation id="5078796286268621944">PIN incorrecto</translation> @@ -4583,6 +4585,7 @@ <translation id="5449551289610225147">La contraseña no es válida</translation> <translation id="5449588825071916739">Añadir todas las pestañas a marcadores...</translation> <translation id="5449716055534515760">Cerrar &ventana</translation> +<translation id="5452446625764825792">Ahora puedes consultar las fotos, el contenido multimedia y las aplicaciones recientes de tu teléfono</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (funciona sin conexión)</translation> <translation id="5454166040603940656">con <ph name="PROVIDER" /></translation> <translation id="545484289444831485">Ver más resultados de búsqueda</translation> @@ -4643,6 +4646,7 @@ <translation id="5499211612787418966">Este cuadro de diálogo no está seleccionado actualmente. Pulsa Alt + Mayús + A para seleccionarlo.</translation> <translation id="5499313591153584299">Este archivo puede ser dañino para tu ordenador.</translation> <translation id="5499453227627332024">Hay una actualización disponible para tu contenedor de Linux. También puedes actualizarlo más tarde en la aplicación Ajustes.</translation> +<translation id="5499476581866658341">Ahora puedes consultar el contenido multimedia y las fotos recientes de tu teléfono</translation> <translation id="549957179819296104">Icono nuevo</translation> <translation id="5500168250243071806">Es posible que el <ph name="BEGIN_LINK_SEARCH" />historial de búsqueda<ph name="END_LINK_SEARCH" /> y <ph name="BEGIN_LINK_GOOGLE" />otras formas de actividad<ph name="END_LINK_GOOGLE" /> se guarden en tu cuenta de Google si has iniciado sesión. Puedes eliminarlos cuando quieras.</translation> <translation id="5500709606820808700">La comprobación de seguridad se ha ejecutado hoy</translation> @@ -6306,6 +6310,7 @@ <translation id="7152478047064750137">Esta extensión no requiere permisos especiales</translation> <translation id="7154130902455071009">Cambiar página de inicio por: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Foto de la cámara o archivo</translation> +<translation id="7160182524506337403">Ya puedes consultar las notificaciones de tu teléfono</translation> <translation id="7163202347044721291">Verificando código de activación...</translation> <translation id="716640248772308851">"<ph name="EXTENSION" />" puede leer archivos de sonido, vídeo e imágenes en las ubicaciones seleccionadas.</translation> <translation id="7167486101654761064">&Abrir siempre archivos de este tipo</translation> @@ -7321,6 +7326,7 @@ <translation id="8138997515734480534">Estado de <ph name="VM_NAME" /></translation> <translation id="8139447493436036221">Archivos de Google Drive</translation> <translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation> +<translation id="8141418916163800697">Puedes configurar más funciones en los ajustes de Mi teléfono</translation> <translation id="8141584439523427891">Abriendo en un navegador alternativo</translation> <translation id="8141725884565838206">Administra tus contraseñas</translation> <translation id="814204052173971714">{COUNT,plural, =1{un vídeo}other{# vídeos}}</translation> @@ -7528,6 +7534,7 @@ <translation id="833986336429795709">Para abrir este enlace, elige una aplicación</translation> <translation id="8342221978608739536">No lo he intentado</translation> <translation id="8342861492835240085">Seleccionar una colección</translation> +<translation id="8345848587667658367">Ahora puedes consultar las fotos, el contenido multimedia, las notificaciones y las aplicaciones recientes de tu teléfono</translation> <translation id="8347227221149377169">Trabajos de impresión</translation> <translation id="834785183489258869">Mientras estás en modo Incógnito, los sitios no pueden usar las cookies para ver tu actividad de navegación en otros sitios con el objetivo de, por ejemplo, personalizar tus anuncios. Es posible que las funciones de algunos sitios no funcionen.</translation> <translation id="8350789879725387295">Herramientas del lápiz óptico en el Dock</translation> @@ -8132,6 +8139,7 @@ <translation id="8957757410289731985">Personalizar perfil</translation> <translation id="895944840846194039">Memoria de JavaScript</translation> <translation id="8960208913905765425">Conversiones de unidades de Respuestas rápidas</translation> +<translation id="8960638196855923532">Ahora puedes consultar las notificaciones y aplicaciones de tu teléfono</translation> <translation id="8962051932294470566">Solo puedes compartir un archivo a la vez. Vuelve a intentarlo cuando se haya completado la transferencia actual.</translation> <translation id="8962083179518285172">Ocultar detalles</translation> <translation id="8962918469425892674">Este sitio web está usando los sensores de luz o movimiento.</translation> @@ -8283,6 +8291,7 @@ <translation id="9103868373786083162">Pulsa para ir hacia atrás y acceder al menú contextual para ver el historial</translation> <translation id="9108035152087032312">Asignar nombre a &ventana...</translation> <translation id="9108072915170399168">La configuración actual de uso de datos es Sin Internet</translation> +<translation id="9108294543511800041">Ahora puedes consultar las fotos, el contenido multimedia y las notificaciones recientes de tu teléfono</translation> <translation id="9108674852930645435">Descubre las novedades de tu <ph name="DEVICE_TYPE" /></translation> <translation id="9108808586816295166">Es posible que no haya un DNS seguro disponible de forma ininterrumpida</translation> <translation id="9109122242323516435">Para liberar espacio, elimina archivos del almacenamiento del dispositivo.</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index dc4f282..ad38ae7 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -3927,6 +3927,7 @@ <translation id="4768332406694066911">Teil on nende organisatsioonide sertifikaadid, mis teid tuvastavad</translation> <translation id="4770119228883592393">Taotleti luba, vastamiseks vajutage klahvikombinatsiooni ⌘ + Option + allanool</translation> <translation id="4773112038801431077">Üleminek Linuxi uuemale versioonile</translation> +<translation id="4774337692467964393">Kui sisse on lülitatud Smart Lock, ei pea te PIN-koodi ega parooli sisestama</translation> <translation id="4775142426314270551">Aidake Chrome'i ja Chrome OS-i funktsioone ning toimivust täiustada, saates Google'ile automaatselt krahhiaruandeid ning ka diagnostika- ja kasutusandmeid. Mõningaid koondandmeid kasutatakse ka Androidi rakenduste ja Google'i partnerite aitamiseks. Kui veebi- ja rakendustegevuste seade on teie lapse Google'i kontol sisse lülitatud, võidakse teie lapse Androidi andmed salvestada tema Google'i kontole.</translation> <translation id="477647109558161443">Loo töölaua otsetee</translation> <translation id="4776594120007763294">Lehe lisamiseks hiljem lugemiseks klõpsake nupul</translation> @@ -3976,6 +3977,7 @@ <translation id="4820236583224459650">Määra aktiivseks piletiks</translation> <translation id="4821935166599369261">&Profileerimine lubatud</translation> <translation id="4823484602432206655">Loe ja muuda kasutaja ja seadme seadeid</translation> +<translation id="4823894915586516138">See PIN-kood või parool kaitseb teie andmeid seadmes <ph name="DEVICE_TYPE" />, sealhulgas teavet, millele telefoni kaudu juurde pääsete</translation> <translation id="4824037980212326045">Linuxi varundamine ja taastamine</translation> <translation id="4824958205181053313">Kas tühistada sünkroonimine?</translation> <translation id="4827675678516992122">Ühendamine ebaõnnestus</translation> @@ -5633,6 +5635,7 @@ <translation id="648927581764831596">Pole saadaval</translation> <translation id="6490471652906364588">C-tüüpi USB-seade (parempoolne port)</translation> <translation id="6491376743066338510">Volitamine ebaõnnestus</translation> +<translation id="6492396476180293140">Riistvara lüliti inaktiveeris sisekaamera</translation> <translation id="6494327278868541139">Kuva täiustatud kaitse üksikasjad</translation> <translation id="6494445798847293442">Pole sertifitseerimisorgan</translation> <translation id="6494974875566443634">Kohandamine</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 543c74c..6c2d4bf 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1559,6 +1559,7 @@ <translation id="2433836460518180625">I-unlock lang ang device</translation> <translation id="2434449159125086437">Hindi na-set up ang printer. Pakisuri ang configuration at subukan ulit.</translation> <translation id="2434758125294431199">Piliin kung sino ang puwedeng magbahagi sa iyo</translation> +<translation id="2434915728183570229">Puwede mo nang tingnan ang mga app ng iyong telepono</translation> <translation id="2435137177546457207">Mga Karagdagang Tuntunin ng Google Chrome at ChromeOS Flex</translation> <translation id="2435248616906486374">Nadiskonekta ang network</translation> <translation id="2435457462613246316">Ipakita ang password</translation> @@ -4243,6 +4244,7 @@ <translation id="5072900412896857127">Hindi ma-load ang Mga Tuntunin ng Serbisyo ng Google Play. Pakisuri ang iyong koneksyon sa network at subukan ulit.</translation> <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" />, <ph name="FILE2" />}one{<ph name="FILE1" />, <ph name="FILE2" />, at # pa}other{<ph name="FILE1" />, <ph name="FILE2" />, at # pa}}</translation> <translation id="5074318175948309511">Maaaring kailangan na muling i-load ang page na ito bago gumana ang mga bagong setting.</translation> +<translation id="5074761966806028321">Kinakailangan pa rin ang pahintulot para tapusin ang pag-set up</translation> <translation id="5075910247684008552">Bina-block ang hindi secure na content bilang default sa mga secure na site</translation> <translation id="5078638979202084724">I-bookmark ang lahat ng mga tab</translation> <translation id="5078796286268621944">Maling PIN</translation> @@ -4606,6 +4608,7 @@ <translation id="5449551289610225147">Di-wastong password</translation> <translation id="5449588825071916739">I-bookmark ang Lahat ng Tab</translation> <translation id="5449716055534515760">Isara ang Win&dow</translation> +<translation id="5452446625764825792">Puwede mo nang tingnan ang mga pinakabagong larawan, media, at app ng iyong telepono</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (gumagana offline)</translation> <translation id="5454166040603940656">sa <ph name="PROVIDER" /></translation> <translation id="545484289444831485">Makakita ng higit pang resulta ng paghahanap</translation> @@ -4666,6 +4669,7 @@ <translation id="5499211612787418966">Kasalukuyang hindi naka-focus ang dialog na ito. Pindutin ang Alt-Shift A para i-focus ang dialog na ito.</translation> <translation id="5499313591153584299">Maaaring nakakapinsala ang file na ito para sa iyong computer.</translation> <translation id="5499453227627332024">May available na pag-upgrade para sa iyong Linux Container. Puwede ka ring mag-upgrade sa ibang pagkakataon mula sa app na Mga Setting.</translation> +<translation id="5499476581866658341">Puwede mo nang tingnan ang mga pinakabagong larawan at media ng iyong telepono</translation> <translation id="549957179819296104">Bagong icon</translation> <translation id="5500168250243071806">Posibleng ma-save ang <ph name="BEGIN_LINK_SEARCH" />history ng paghahanap<ph name="END_LINK_SEARCH" /> at <ph name="BEGIN_LINK_GOOGLE" />iba pang anyo ng aktibidad<ph name="END_LINK_GOOGLE" /> sa iyong Google Account kapag naka-sign in ka. Puwede mong i-delete ang mga ito anumang oras.</translation> <translation id="5500709606820808700">Nagpatakbo ng pag-check sa kaligtasan ngayong araw</translation> @@ -6332,6 +6336,7 @@ <translation id="7152478047064750137">Hindi nangangailangan ang extension na ito ng mga espesyal na pahintulot</translation> <translation id="7154130902455071009">Gawing ito ang iyong panimulang pahina: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Kasalukuyang larawan mula sa camera o file</translation> +<translation id="7160182524506337403">Puwede mo nang tingnan ang mga notificataion ng iyong telepono</translation> <translation id="7163202347044721291">Vine-verify ang code sa pag-activate...</translation> <translation id="716640248772308851">Ang "<ph name="EXTENSION" />" ay nakakabasa ng mga larawan, video, at file ng tunog sa mga may check na lokasyon.</translation> <translation id="7167486101654761064">&Laging buksan ang uri ng mga file na ito</translation> @@ -7347,6 +7352,7 @@ <translation id="8138997515734480534">Status ng <ph name="VM_NAME" /></translation> <translation id="8139447493436036221">Mga file sa Google Drive</translation> <translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation> +<translation id="8141418916163800697">Puwede kang mag-set up ng higit pang feature sa mga setting ng Phone Hub</translation> <translation id="8141584439523427891">Binubuksan ngayon sa alternatibong browser</translation> <translation id="8141725884565838206">Pamahalaan ang iyong mga password</translation> <translation id="814204052173971714">{COUNT,plural, =1{isang video}one{# video}other{# na video}}</translation> @@ -7554,6 +7560,7 @@ <translation id="833986336429795709">Para buksan ang link na ito, pumili ng app</translation> <translation id="8342221978608739536">Hindi sinubukan</translation> <translation id="8342861492835240085">Pumili ng koleksyon</translation> +<translation id="8345848587667658367">Puwede mo nang tingnan ang mga pinakabagong larawan, media, notification, at app ng iyong telepono</translation> <translation id="8347227221149377169">Mga pag-print</translation> <translation id="834785183489258869">Habang nasa Incognito, hindi magagamit ng mga site ang cookies mo para makita ang iyong aktibidad sa pag-browse sa iba't ibang site, halimbawa, para mag-personalize ng mga ad. Posibleng hindi gumana ang mga feature sa ilang site.</translation> <translation id="8350789879725387295">Mga tool ng stylus sa dock</translation> @@ -8162,6 +8169,7 @@ <translation id="8957757410289731985">I-customize ang profile</translation> <translation id="895944840846194039">Memory ng JavaScript</translation> <translation id="8960208913905765425">Pag-convert ng unit ng Instant na Impormasyon</translation> +<translation id="8960638196855923532">Puwede mo nang tingnan ang mga notification at app ng iyong telepono</translation> <translation id="8962051932294470566">Puwede ka lang magbahagi ng isang file sa bawat pagkakataon. Subukan ulit kapag tapos na ang kasalukuyang paglilipat.</translation> <translation id="8962083179518285172">Itago ang Mga Detalye</translation> <translation id="8962918469425892674">Gumagamit ang site na ito ng sensor ng paggalaw o liwanag.</translation> @@ -8313,6 +8321,7 @@ <translation id="9103868373786083162">Pindutin upang bumalik, gamitin ang menu ng konteksto upang makita ang history</translation> <translation id="9108035152087032312">Pangalanan ang &window...</translation> <translation id="9108072915170399168">Walang internet ang kasalukuyang setting ng paggamit ng data</translation> +<translation id="9108294543511800041">Puwede mo nang tingnan ang mga pinakabagong larawan, media, at notification ng iyong telepono</translation> <translation id="9108674852930645435">I-explore kung ano'ng bago sa iyong <ph name="DEVICE_TYPE" /></translation> <translation id="9108808586816295166">Posibleng hindi available sa lahat ng oras ang secure na DNS</translation> <translation id="9109122242323516435">Upang magbakante ng espasyo, mag-delete ng mga file mula sa storage ng device.</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 9a9226f..61999c70 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -3922,6 +3922,7 @@ <translation id="4768332406694066911">Certains certificats provenant de ces organisations vous identifient.</translation> <translation id="4770119228883592393">Autorisation demandée, appuyez sur ⌘+Option+Flèche vers le bas pour répondre</translation> <translation id="4773112038801431077">Mettre à niveau Linux</translation> +<translation id="4774337692467964393">Si Smart Lock est activé, vous n'aurez pas besoin de saisir de code ni de mot de passe</translation> <translation id="4775142426314270551">Contribuez à améliorer les fonctionnalités et performances de Chrome et Chrome OS en envoyant automatiquement à Google les rapports d'erreur, ainsi que les données d'utilisation et de diagnostic. Certaines données globales seront aussi utiles aux partenaires Google et développeurs d'applis Android. Si le paramètre "Activité sur le Web et les applications" est activé pour le compte Google de votre enfant, ses données Android peuvent être enregistrées dans son compte Google.</translation> <translation id="477647109558161443">Créer un raccourci sur le bureau</translation> <translation id="4776594120007763294">Pour ajouter une page à lire plus tard, cliquez sur le bouton</translation> @@ -3971,6 +3972,7 @@ <translation id="4820236583224459650">Définir comme ticket actif</translation> <translation id="4821935166599369261">&Profilage activé</translation> <translation id="4823484602432206655">Consulter et modifier les paramètres d'utilisateur et d'appareil</translation> +<translation id="4823894915586516138">Ce code ou mot de passe protège vos données sur ce <ph name="DEVICE_TYPE" />, y compris les informations auxquelles vous accédez depuis votre téléphone</translation> <translation id="4824037980212326045">Sauvegarde et restauration Linux</translation> <translation id="4824958205181053313">Annuler la synchronisation ?</translation> <translation id="4827675678516992122">Impossible de se connecter</translation> @@ -5629,6 +5631,7 @@ <translation id="648927581764831596">Aucun média disponible</translation> <translation id="6490471652906364588">Appareil USB de type C (port situé sur la droite de l'appareil)</translation> <translation id="6491376743066338510">Échec de l'autorisation</translation> +<translation id="6492396476180293140">Caméra interne désactivée par le contacteur matériel</translation> <translation id="6494327278868541139">Afficher les détails de la protection renforcée</translation> <translation id="6494445798847293442">N'est pas une autorité de certification</translation> <translation id="6494974875566443634">Personnalisation</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 57a3e44..b525a0e 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -3919,6 +3919,7 @@ <translation id="4768332406694066911">Tes certificados destas organizacións que te identifican</translation> <translation id="4770119228883592393">Permiso solicitado; preme ⌘ + Option (Opción) + Down arrow (Frecha abaixo) para responder</translation> <translation id="4773112038801431077">Actualizar Linux</translation> +<translation id="4774337692467964393">Se activas Smart Lock, non terás que meter ningún PIN nin contrasinal</translation> <translation id="4775142426314270551">Se queres axudar a mellorar as funcións e o rendemento de Chrome e de ChromeOS, permite que se lle envíen a Google de forma automática os informes de fallos, así como os datos de uso e de diagnóstico. Algúns datos agregados tamén serán útiles para os socios de Google e as aplicacións Android. Se está activada a opción Actividade web e das aplicacións na Conta de Google da túa filla ou fillo, pódense gardar nela os seus datos de Android.</translation> <translation id="477647109558161443">Crear acceso directo do escritorio</translation> <translation id="4776594120007763294">Se queres engadir unha páxina para ler máis adiante, fai clic no botón</translation> @@ -3968,6 +3969,7 @@ <translation id="4820236583224459650">Definir como tícket activo</translation> <translation id="4821935166599369261">&Perfís activados</translation> <translation id="4823484602432206655">Ler e cambiar a configuración do usuario e o dispositivo</translation> +<translation id="4823894915586516138">Este PIN ou contrasinal protexe os datos que tes neste dispositivo (<ph name="DEVICE_TYPE" />), ademais da información á que accedas desde o teléfono</translation> <translation id="4824037980212326045">Copia de seguranza e restauración de Linux</translation> <translation id="4824958205181053313">Queres cancelar a sincronización?</translation> <translation id="4827675678516992122">Non se puido establecer conexión</translation> @@ -5622,6 +5624,7 @@ <translation id="648927581764831596">Nada dispoñible</translation> <translation id="6490471652906364588">Dispositivo USB‑C (porto dereito)</translation> <translation id="6491376743066338510">Produciuse un erro na autorización</translation> +<translation id="6492396476180293140">A cámara interna desactivouse ao premer o interruptor de hardware</translation> <translation id="6494327278868541139">Mostrar detalles de protección mellorada</translation> <translation id="6494445798847293442">Non é unha autoridade de certificación</translation> <translation id="6494974875566443634">Personalización</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index c609848..616fd1a 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1911,6 +1911,7 @@ <translation id="2775858145769350417">{NUM_APPS,plural, =1{Uklanjanje jedne nepodržane aplikacije}one{Uklanjanje # nepodržane aplikacije}few{Uklanjanje # nepodržane aplikacije}other{Uklanjanje # nepodržanih aplikacija}}</translation> <translation id="2776560192867872731">Promijenite naziv uređaja za <ph name="DEVICE_NAME" /></translation> <translation id="2777251078198759550">Izbriši ovaj spremnik</translation> +<translation id="2778471504622896352">Dodavanje udaljenih aplikacija u pokretač OS-a Chrome</translation> <translation id="2781692009645368755">Google Pay</translation> <translation id="2782104745158847185">Pogreška pri instaliranju Linux aplikacije</translation> <translation id="2783298271312924866">Preuzeto</translation> @@ -2226,6 +2227,7 @@ <translation id="3067198360141518313">Pokrenite ovaj dodatak</translation> <translation id="3071624960923923138">Ovdje možete kliknuti za otvaranje nove kartice</translation> <translation id="3072775339180057696">Dopustiti web-lokaciji da pregleda <ph name="FILE_NAME" />?</translation> +<translation id="3074499504015191586">Prevedi cijelu stranicu</translation> <translation id="3075874217500066906">Za pokretanje postupka Powerwash potrebno je ponovo pokrenuti uređaj. Nakon ponovnog pokretanja morat ćete potvrditi da želite nastaviti.</translation> <translation id="3076909148546628648"><ph name="DOWNLOAD_RECEIVED" />/<ph name="DOWNLOAD_TOTAL" /></translation> <translation id="3076966043108928831">Spremi samo na ovom uređaju</translation> @@ -3546,6 +3548,7 @@ <translation id="4390396490617716185"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /> i još ovoliko prekidača: <ph name="NUMBER_OF_OTHER_SWITCHES" /></translation> <translation id="439266289085815679">Konfiguracijom Bluetootha upravlja <ph name="USER_EMAIL" />.</translation> <translation id="4392896746540753732">Uredite konfiguracijsku datoteku</translation> +<translation id="4393713825278446281">Uređaji za Brzo uparivanje spremljeni su na <ph name="PRIMARY_EMAIL" /></translation> <translation id="4394049700291259645">Onemogući</translation> <translation id="4396956294839002702">{COUNT,plural, =0{&Otvori sve}=1{&Otvori oznaku}one{&Otvori sve ({COUNT})}few{&Otvori sve ({COUNT})}other{&Otvori sve ({COUNT})}}</translation> <translation id="4397372003838952832">Nećete morati pamtiti tu zaporku. Spremit će se u <ph name="GOOGLE_PASSWORD_MANAGER" /> za <ph name="EMAIL" />.</translation> @@ -3775,6 +3778,7 @@ <translation id="4615586811063744755">nije odabran nijedan kolačić</translation> <translation id="461661862154729886">Izvor energije</translation> <translation id="4617001782309103936">Prekratko</translation> +<translation id="4617019240346358451">Ponovno učitajte stranicu da biste koristili proširenje <ph name="EXTENSION_NAME" /></translation> <translation id="4617270414136722281">Opcije proširenja</translation> <translation id="4617880081511131945">Uspostavljanje veze nije uspjelo</translation> <translation id="4619564267100705184">Potvrđivanje identiteta</translation> @@ -3990,6 +3994,7 @@ <translation id="4833683849865011483">Pronađen je jedan pisač s poslužitelja za ispis</translation> <translation id="4836504898754963407">Upravljanje otiscima prstiju</translation> <translation id="4837128290434901661">Želite li se vratiti na Google pretraživanje?</translation> +<translation id="4837165100461973682">Ponovno učitajte stranicu da biste primijenili izmjene</translation> <translation id="4837926214103741331">Niste ovlašteni za upotrebu ovog uređaja. Zamolite vlasnika da vam dopusti prijavu.</translation> <translation id="4837952862063191349">Da biste otključali i pohranili lokalne podatke, unesite staru zaporku za uređaj <ph name="DEVICE_TYPE" />.</translation> <translation id="4838170306476614339">Pregled fotografija, medija i obavijesti s vašeg telefona</translation> @@ -4299,6 +4304,7 @@ <translation id="5150254825601720210">Naziv certifikata SSL poslužitelja za Netscape</translation> <translation id="5151354047782775295">Oslobodite prostor na disku ili će se određeni podaci automatski izbrisati.</translation> <translation id="5153234146675181447">Zaboravljanje telefona</translation> +<translation id="5153907427821264830"><ph name="STATUS" /> • <ph name="MESSAGE" /></translation> <translation id="5154108062446123722">Napredne postavke za <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Naslov</translation> <translation id="5155327081870541046">U adresnu traku unesite prečac za web-lokaciju koju želite pretražiti, na primjer @bookmarks. Zatim pritisnite svoj preferirani tipkovni prečac i unesite pojam za pretraživanje.</translation> @@ -5072,6 +5078,7 @@ <translation id="5933522550144185133">Aplikacija <ph name="APP_NAME" /> upotrebljava vaš fotoaparat i mikrofon</translation> <translation id="5935158534896975820">Priprema zahtjeva za potpisivanje certifikata (čeka se poslužitelj)</translation> <translation id="5935656526031444304">Upravljajte Sigurnim pregledavanjem</translation> +<translation id="5936065461722368675">Prevedi cijelu stranicu</translation> <translation id="5938002010494270685">Dostupna je sigurnosna nadogradnja</translation> <translation id="5939518447894949180">Ponovno postavi</translation> <translation id="5939719276406088041">Nije moguće izraditi prečac</translation> @@ -5935,6 +5942,7 @@ <translation id="6790497603648687708">Proširenje <ph name="EXTENSION_NAME" /> dodano je daljinski</translation> <translation id="6790820461102226165">Dodavanje osobe...</translation> <translation id="6793604637258913070">Istakni znak za umetanje teksta kada se pojavi ili kreće</translation> +<translation id="6793879402816827484">↓ <ph name="STATUS" /></translation> <translation id="6795371939514004514">Automatsko skeniranje omogućuje vam da se automatski krećete po stavkama na zaslonu. Kad se stavka istakne, pritisnite Odaberi da biste je aktivirali.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Ups, nešto je pošlo po krivu.</translation> @@ -7807,6 +7815,7 @@ <translation id="8642947597466641025">Uvećaj tekst</translation> <translation id="8643443571868262066">Datoteka <ph name="FILE_NAME" /> možda je opasna. Želite li upotrijebiti Googleovu naprednu zaštitu za pregled datoteke?</translation> <translation id="8644047503904673749">{COUNT,plural, =0{Nema kolačića}=1{Blokiran je jedan kolačić}one{Blokiran je # kolačić}few{Blokirana su # kolačića}other{Blokirano je # kolačića}}</translation> +<translation id="864423554496711319">Uređaji spremljeni na vaš račun</translation> <translation id="8644655801811752511">Taj se sigurnosni ključ ne može vratiti na zadano. Pokušajte vratiti ključ na zadano odmah nakon što ga umetnete.</translation> <translation id="8645354835496065562">Nastavi dopuštati pristup senzorima</translation> <translation id="8645920082661222035">Predviđa opasne događaje i upozorava vas na njih prije nego što se dogode</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index db0d982..c839e17 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -3937,6 +3937,7 @@ <translation id="4768332406694066911">Anda memiliki sertifikat dari organisasi ini yang mengenali Anda</translation> <translation id="4770119228883592393">Izin diminta, tekan ⌘ + Option + Panah bawah untuk merespons</translation> <translation id="4773112038801431077">Upgrade Linux</translation> +<translation id="4774337692467964393">Jika Smart Lock diaktifkan, Anda tidak perlu memasukkan PIN atau sandi</translation> <translation id="4775142426314270551">Bantu tingkatkan fitur dan performa Chrome dan ChromeOS dengan mengirimkan laporan kerusakan serta diagnostik dan data penggunaan secara otomatis ke Google. Beberapa data gabungan juga akan membantu aplikasi Android dan partner Google. Jika setelan Aktivitas Web & Aplikasi diaktifkan untuk Akun Google anak Anda, data Android anak Anda mungkin akan disimpan ke Akun Google miliknya.</translation> <translation id="477647109558161443">Buat pintasan desktop</translation> <translation id="4776594120007763294">Klik tombol guna menambahkan halaman untuk dibaca nanti</translation> @@ -3986,6 +3987,7 @@ <translation id="4820236583224459650">Setel sebagai tiket aktif</translation> <translation id="4821935166599369261">&Penyidikan Diaktifkan</translation> <translation id="4823484602432206655">Membaca dan mengubah setelan perangkat dan pengguna</translation> +<translation id="4823894915586516138">PIN atau sandi ini melindungi data Anda pada <ph name="DEVICE_TYPE" /> ini, termasuk informasi yang Anda akses dari ponsel</translation> <translation id="4824037980212326045">Pencadangan dan pemulihan Linux</translation> <translation id="4824958205181053313">Batalkan sinkronisasi?</translation> <translation id="4827675678516992122">Tidak dapat terhubung</translation> @@ -5643,6 +5645,7 @@ <translation id="648927581764831596">Tidak ada yang tersedia</translation> <translation id="6490471652906364588">Perangkat USB-C (port sebelah kanan)</translation> <translation id="6491376743066338510">Otorisasi gagal</translation> +<translation id="6492396476180293140">Kamera internal dinonaktifkan oleh tombol hardware</translation> <translation id="6494327278868541139">Tampilkan detail perlindungan yang ditingkatkan</translation> <translation id="6494445798847293442">Bukan Otoritas Sertifikasi</translation> <translation id="6494974875566443634">Penyesuaian</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index adcf9c03..0e6c71b 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -3937,6 +3937,7 @@ <translation id="4768332406694066911">Þú ert með vottorð frá þessum notendaskipunum sem auðkenna þig</translation> <translation id="4770119228883592393">Heimildar óskað, ýttu á ⌘ + Option + ör niður til að svara</translation> <translation id="4773112038801431077">Uppfæra Linux</translation> +<translation id="4774337692467964393">Ef kveikt er á Smart Lock þarftu ekki að slá inn PIN-númer eða aðgangsorð</translation> <translation id="4775142426314270551">Hjálpaðu til við að bæta eiginleika og afköst Chrome og ChromeOS með því að senda hrunskýrslur ásamt greiningar- og notkunargögnum sjálfkrafa til Google. Einnig kunna tiltekin samantekin gögn að gagnast Android forritum og samstarfsaðilum Google. Ef kveikt er á vef- og forritavirkni á Google reikningi barnsins verða Android gögn barnsins hugsanlega vistuð á Google reikningi þess.</translation> <translation id="477647109558161443">Búa til flýtileið</translation> <translation id="4776594120007763294">Smelltu á hnappinn til að bæta við síðu til að lesa síðar</translation> @@ -3986,6 +3987,7 @@ <translation id="4820236583224459650">Gera að virkum miða</translation> <translation id="4821935166599369261">Kveikt á hegðunarskráningu</translation> <translation id="4823484602432206655">Lesa og breyta stillingum notanda og tækis</translation> +<translation id="4823894915586516138">Þetta PIN-númer eða aðgangsorð verndar gögnin þín í þessari <ph name="DEVICE_TYPE" />, þ.m.t. upplýsingar sem þú nálgast úr símanum.</translation> <translation id="4824037980212326045">Afritun og endurheimt í Linux</translation> <translation id="4824958205181053313">Hætta við samstillingu?</translation> <translation id="4827675678516992122">Tenging mistókst</translation> @@ -5643,6 +5645,7 @@ <translation id="648927581764831596">Ekki í boði</translation> <translation id="6490471652906364588">USB-C-tæki (hægra tengi)</translation> <translation id="6491376743066338510">Auðkenning mistókst</translation> +<translation id="6492396476180293140">Innbyggð myndavél gerð óvirk með vélbúnaðarrofa</translation> <translation id="6494327278868541139">Sýna upplýsingar um aukna vernd</translation> <translation id="6494445798847293442">Ekki vottunarstöð</translation> <translation id="6494974875566443634">Sérsnið</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index e57f059b..0f98cf74 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1543,6 +1543,7 @@ <translation id="2433836460518180625">Sblocca solo il dispositivo</translation> <translation id="2434449159125086437">Impossibile configurare la stampante. Verifica la configurazione e riprova.</translation> <translation id="2434758125294431199">Seleziona chi può condividere file con te</translation> +<translation id="2434915728183570229">Ora puoi visualizzare le app del tuo telefono</translation> <translation id="2435137177546457207">Termini aggiuntivi di Google Chrome e Chrome OS Flex</translation> <translation id="2435248616906486374">Rete scollegata</translation> <translation id="2435457462613246316">Mostra password</translation> @@ -4222,6 +4223,7 @@ <translation id="5072900412896857127">Impossibile caricare i Termini di servizio di Google Play. Controlla la connessione di rete e riprova.</translation> <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" />, <ph name="FILE2" />}other{<ph name="FILE1" />, <ph name="FILE2" /> e altri #}}</translation> <translation id="5074318175948309511">Potrebbe essere necessario ricaricare la pagina per applicare le nuove impostazioni.</translation> +<translation id="5074761966806028321">Autorizzazione ancora necessaria per completare la configurazione</translation> <translation id="5075910247684008552">I contenuti non sicuri vengono bloccati per impostazione predefinita sui siti protetti</translation> <translation id="5078638979202084724">Aggiungi tutte le schede ai Preferiti</translation> <translation id="5078796286268621944">PIN errato</translation> @@ -4531,7 +4533,7 @@ <translation id="5392192690789334093">Possono inviare notifiche</translation> <translation id="5393761864111565424">{COUNT,plural, =1{Link}other{# link}}</translation> <translation id="5396325212236512832">Accedi automaticamente ai siti e alle app usando le credenziali memorizzate. Se la funzionalità è disattivata, ti verrà chiesta una conferma ogni volta che vuoi accedere a un sito o a un'app.</translation> -<translation id="5397378439569041789">Registra dispositivi kiosk o insegna</translation> +<translation id="5397378439569041789">Registra dispositivi kiosk o segnaletica</translation> <translation id="5397794290049113714">Tu</translation> <translation id="5398497406011404839">Preferiti nascosti</translation> <translation id="5398572795982417028">Riferimento pagina oltre i limiti. Il limite è <ph name="MAXIMUM_PAGE" /></translation> @@ -4584,6 +4586,7 @@ <translation id="5449551289610225147">Password non valida</translation> <translation id="5449588825071916739">Aggiungi tutte le schede ai Preferiti</translation> <translation id="5449716055534515760">Chiu&di finestra</translation> +<translation id="5452446625764825792">Ora puoi visualizzare le foto recenti, i contenuti multimediali e le app del tuo telefono</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (funziona offline)</translation> <translation id="5454166040603940656">con <ph name="PROVIDER" /></translation> <translation id="545484289444831485">Mostra altri risultati di ricerca</translation> @@ -4644,6 +4647,7 @@ <translation id="5499211612787418966">Questa finestra di dialogo non è attualmente attiva. Premi Alt+Maiusc+A per attivarla.</translation> <translation id="5499313591153584299">Questo file potrebbe essere dannoso per il computer.</translation> <translation id="5499453227627332024">È disponibile un upgrade per il tuo contenitore Linux. Puoi anche eseguire l'upgrade in un secondo momento dall'app Impostazioni.</translation> +<translation id="5499476581866658341">Ora puoi visualizzare le foto recenti e i contenuti multimediali del tuo telefono</translation> <translation id="549957179819296104">Nuova icona</translation> <translation id="5500168250243071806">La <ph name="BEGIN_LINK_SEARCH" />cronologia delle ricerche<ph name="END_LINK_SEARCH" /> e <ph name="BEGIN_LINK_GOOGLE" />altri tipi di attività<ph name="END_LINK_GOOGLE" /> potrebbero essere salvati nel tuo Account Google se hai eseguito l'accesso. Puoi eliminarli in qualsiasi momento.</translation> <translation id="5500709606820808700">Il controllo di sicurezza è stato eseguito oggi</translation> @@ -6304,6 +6308,7 @@ <translation id="7152478047064750137">Questa estensione non richiede autorizzazioni speciali</translation> <translation id="7154130902455071009">Cambio della pagina iniziale con: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Foto esistente da fotocamera o file</translation> +<translation id="7160182524506337403">Ora puoi visualizzare le notifiche del tuo telefono</translation> <translation id="7163202347044721291">Verifica del codice di attivazione in corso…</translation> <translation id="716640248772308851">L'estensione "<ph name="EXTENSION" />" può leggere file di immagini, video e audio nelle posizioni selezionate.</translation> <translation id="7167486101654761064">&Apri sempre file di questo tipo</translation> @@ -7319,6 +7324,7 @@ <translation id="8138997515734480534">Stato <ph name="VM_NAME" /></translation> <translation id="8139447493436036221">File di Google Drive</translation> <translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation> +<translation id="8141418916163800697">Puoi configurare altre funzionalità nelle impostazioni di Phone Hub</translation> <translation id="8141584439523427891">Apertura browser alternativo</translation> <translation id="8141725884565838206">Gestisci le tue password</translation> <translation id="814204052173971714">{COUNT,plural, =1{un video}other{# video}}</translation> @@ -7526,6 +7532,7 @@ <translation id="833986336429795709">Scegli un'app per aprire il link</translation> <translation id="8342221978608739536">Non ho provato</translation> <translation id="8342861492835240085">Seleziona una raccolta</translation> +<translation id="8345848587667658367">Ora puoi visualizzare le foto recenti, i contenuti multimediali, le notifiche e le app del tuo telefono</translation> <translation id="8347227221149377169">Processi di stampa</translation> <translation id="834785183489258869">In modalità di navigazione in incognito, i siti non possono utilizzare i cookie per conoscere la tua attività di navigazione su diversi siti, ad esempio per personalizzare gli annunci. Le funzionalità su alcuni siti potrebbero non essere disponibili.</translation> <translation id="8350789879725387295">Strumenti stilo nel dock</translation> @@ -8130,6 +8137,7 @@ <translation id="8957757410289731985">Personalizza il profilo</translation> <translation id="895944840846194039">Memoria JavaScript</translation> <translation id="8960208913905765425">Conversione di unità Risposte rapide</translation> +<translation id="8960638196855923532">Ora puoi visualizzare le notifiche e le app del tuo telefono</translation> <translation id="8962051932294470566">Puoi condividere un solo file alla volta. Riprova al termine dell'attuale trasferimento.</translation> <translation id="8962083179518285172">Nascondi dettagli</translation> <translation id="8962918469425892674">Questo sito usa sensori di movimento o della luce.</translation> @@ -8281,6 +8289,7 @@ <translation id="9103868373786083162">Premi per tornare indietro, menu contestuale per visualizzare la cronologia</translation> <translation id="9108035152087032312">Assegna nome alla &finestra…</translation> <translation id="9108072915170399168">Impostazione di utilizzo dei dati corrente: Senza Internet</translation> +<translation id="9108294543511800041">Ora puoi visualizzare le foto recenti, i contenuti multimediali e le notifiche del tuo telefono</translation> <translation id="9108674852930645435">Esplora le novità di <ph name="DEVICE_TYPE" /></translation> <translation id="9108808586816295166">Il sistema DNS sicuro potrebbe non essere sempre disponibile</translation> <translation id="9109122242323516435">Per liberare spazio, elimina i file dallo spazio di archiviazione del dispositivo.</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index ff12c21d..7650323 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1071,7 +1071,7 @@ <translation id="1994173015038366702">כתובת אתר</translation> <translation id="1995916364271252349">בדף הזה אפשר לשלוט על המידע שאתרים יכולים להשתמש בו ולהציג אותו (מיקום, מצלמה, חלונות קופצים ועוד)</translation> <translation id="1997616988432401742">האישורים שלך</translation> -<translation id="1999115740519098545">בעת ההפעלה</translation> +<translation id="1999115740519098545">כשפותחים את הדפדפן</translation> <translation id="2000419248597011803">שליחה של חלק מקובצי ה-Cookie והחיפושים משורת כתובת האתר ומתיבת החיפוש אל מנוע החיפוש שהוגדר כברירת מחדל</translation> <translation id="2002109485265116295">זמן אמת</translation> <translation id="2003130567827682533">כדי להפעיל נתונים של '<ph name="NAME" />', יש להתחבר תחילה לרשת Wi-Fi</translation> @@ -2332,7 +2332,7 @@ <translation id="3164329792803560526">המערכת משתפת את הכרטיסייה הזו עם <ph name="APP_NAME" /></translation> <translation id="3165390001037658081">ייתכן שספקים מסוימים חוסמים את התכונה הזו.</translation> <translation id="3170072451822350649">ניתן גם לדלג על הכניסה ו<ph name="LINK_START" />לגלוש כאורח<ph name="LINK_END" />.</translation> -<translation id="31774765611822736">כרטיסייה חדשה מצד ימין</translation> +<translation id="31774765611822736">כרטיסייה חדשה מצד שמאל</translation> <translation id="3177909033752230686">שפת הדף:</translation> <translation id="3179982752812949580">גופן הטקסט</translation> <translation id="3181954750937456830">גלישה בטוחה (מגנה עליך ועל המכשיר מפני אתרים מסוכנים)</translation> @@ -3937,6 +3937,7 @@ <translation id="4768332406694066911">יש לך אישורים מארגונים אלה שמזהים אותך</translation> <translation id="4770119228883592393">נשלחה בקשה להרשאה, יש ללחוץ על ⌘ + אפשרות + חץ למטה כדי להשיב</translation> <translation id="4773112038801431077">שדרוג Linux</translation> +<translation id="4774337692467964393">אם Smart Lock מופעל, אין צורך להזין קוד אימות או סיסמה</translation> <translation id="4775142426314270551">שליחה אוטומטית של דוחות קריסה ושל נתוני אבחון ונתוני שימוש במכשיר אל Google תעזור לשפר את התכונות ואת הביצועים של Chrome ושל ChromeOS. חלק מהנתונים הנצברים יעזרו גם לאפליקציות של Android ולשותפים של Google אם ההגדרה 'פעילות באינטרנט ובאפליקציות' הופעלה בחשבון Google של הילד או הילדה שלך, יכול להיות שנתוני Android שלהם יישמרו בחשבון Google שלהם.</translation> <translation id="477647109558161443">יצירת קיצור דרך בשולחן העבודה</translation> <translation id="4776594120007763294">כדי להוסיף דף לקריאה במועד מאוחר יותר, לוחצים על הלחצן</translation> @@ -3986,6 +3987,7 @@ <translation id="4820236583224459650">הגדרה ככרטיס פעיל</translation> <translation id="4821935166599369261">&יצירת פרופילים מופעלת</translation> <translation id="4823484602432206655">קריאה ושינוי של הגדרות המשתמש והמכשיר</translation> +<translation id="4823894915586516138">קוד האימות או הסיסמה מגינים על הנתונים שלך ב-<ph name="DEVICE_TYPE" /> הזה, כולל כל מידע שיש לך גישה אליו מהטלפון.</translation> <translation id="4824037980212326045">גיבוי ושחזור ב-Linux</translation> <translation id="4824958205181053313">לבטל את הסנכרון?</translation> <translation id="4827675678516992122">לא ניתן להתחבר</translation> @@ -5643,6 +5645,7 @@ <translation id="648927581764831596">אין אפליקציות זמינות</translation> <translation id="6490471652906364588">מכשיר עם יציאת USB-C (יציאה ימנית)</translation> <translation id="6491376743066338510">ההרשאה נכשלה</translation> +<translation id="6492396476180293140">המצלמה הפנימית הושבתה על ידי מתג החומרה</translation> <translation id="6494327278868541139">הצגה של פרטי האבטחה המשופרת</translation> <translation id="6494445798847293442">לא רשות אישורים</translation> <translation id="6494974875566443634">התאמה אישית</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 0b8204c..577533327 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -3909,6 +3909,7 @@ <translation id="4768332406694066911">次の機関から発行された、あなたを識別する証明書があります</translation> <translation id="4770119228883592393">権限がリクエストされました。対応するには、⌘+option+下矢印キーを押してください</translation> <translation id="4773112038801431077">Linux のアップグレード</translation> +<translation id="4774337692467964393">Smart Lock がオンになっている場合、PIN やパスワードを入力する必要はありません</translation> <translation id="4775142426314270551">Chrome および Chrome OS の機能とパフォーマンスを改善できるよう、クラッシュ レポートと診断データ、使用状況データの自動送信にご協力ください。集約されるデータは、Android アプリと Google パートナーにとっても役立ちます。お子様の Google アカウントで [ウェブとアプリのアクティビティ] 設定がオンになっている場合は、お子様の Android データをお子様の Google アカウントに保存できます。</translation> <translation id="477647109558161443">デスクトップ ショートカットを作成</translation> <translation id="4776594120007763294">ページを追加して後で読むには、ボタンをクリックしてください</translation> @@ -3958,6 +3959,7 @@ <translation id="4820236583224459650">有効なチケットとして設定</translation> <translation id="4821935166599369261">プロファイル記録の開始(&P)</translation> <translation id="4823484602432206655">ユーザー設定とデバイス設定の読み取りと変更</translation> +<translation id="4823894915586516138">PIN またはパスワードで、この <ph name="DEVICE_TYPE" /> のデータ(スマートフォンからアクセスする情報を含む)を保護します</translation> <translation id="4824037980212326045">Linux のバックアップと復元</translation> <translation id="4824958205181053313">同期をキャンセルしますか?</translation> <translation id="4827675678516992122">接続エラー</translation> @@ -5610,6 +5612,7 @@ <translation id="648927581764831596">使用できるものはありません</translation> <translation id="6490471652906364588">USB-C デバイス(右側面のポート)</translation> <translation id="6491376743066338510">認証できませんでした</translation> +<translation id="6492396476180293140">ハードウェア スイッチにより内部カメラが無効になりました</translation> <translation id="6494327278868541139">保護強化機能の詳細を表示</translation> <translation id="6494445798847293442">認証局ではありません</translation> <translation id="6494974875566443634">カスタマイズ</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index ccf3bbde..5ffd857 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -1543,6 +1543,7 @@ <translation id="2433836460518180625">მხოლოდ მოწყობილობის განბლოკვა</translation> <translation id="2434449159125086437">პრინტერის დაყენება ვერ მოხერხდა. შეამოწმეთ კონფიგურაცია და ცადეთ ხელახლა.</translation> <translation id="2434758125294431199">აირჩიეთ, ვის შეუძლია თქვენთან გაზიარება</translation> +<translation id="2434915728183570229">ამიერიდან შეგიძლიათ ნახოთ თქვენი ტელეფონის აპები</translation> <translation id="2435137177546457207">Google Chrome-ისა და ChromeOS Flex-ის დამატებითი პირობები</translation> <translation id="2435248616906486374">ქსელი გათიშულია</translation> <translation id="2435457462613246316">პაროლის ჩვენება</translation> @@ -4226,6 +4227,7 @@ <translation id="5072900412896857127">Google Play-ს მომსახურების პირობები ვერ ჩაიტვირთა. შეამოწმეთ კავშირი ქსელთან და ცადეთ ხელახლა.</translation> <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" />, <ph name="FILE2" />}other{<ph name="FILE1" />, <ph name="FILE2" /> და # სხვა}}</translation> <translation id="5074318175948309511">ცვლილებების გააქტიურებისთვის, შესაძლოა, საჭირო გახდეს ამ გვერდის ხელახლა ჩატვირთვა.</translation> +<translation id="5074761966806028321">დაყენებისთვის კვლავ საჭიროა ნებართვა</translation> <translation id="5075910247684008552">დაუცველი კონტენტი ნაგულისხმევად დაბლოკილია დაცულ საიტებზე</translation> <translation id="5078638979202084724">ყველა ჩანართის სანიშნეებში ჩამატება</translation> <translation id="5078796286268621944">არასწორი პინი</translation> @@ -4589,6 +4591,7 @@ <translation id="5449551289610225147">პაროლი არასწორია</translation> <translation id="5449588825071916739">ყველა ჩანართის სანიშნეებში დამატება</translation> <translation id="5449716055534515760">ფან&ჯრის დახურვა</translation> +<translation id="5452446625764825792">ამიერიდან შეგიძლიათ ნახოთ თქვენი ტელეფონის ბოლოდროინდელი ფოტოები, მედიაფაილები და აპები</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (მუშაობს ხაზგარეშე)</translation> <translation id="5454166040603940656"><ph name="PROVIDER" />-ით</translation> <translation id="545484289444831485">ძიების მეტი შედეგის ნახვა</translation> @@ -4649,6 +4652,7 @@ <translation id="5499211612787418966">ეს დიალოგი ამჟამად არ არის მოქცეული ფოკუსში. ამ დიალოგის ფოკუსში მოსაქცევად დააჭირეთ კლავიშთა კომბინაციას Alt+Shift+A.</translation> <translation id="5499313591153584299">ეს ფაილი შეიძლება მავნე იყოს თქვენი კომპიუტერისთვის.</translation> <translation id="5499453227627332024">ხელმისაწვდომია თქვენი Linux კონტეინერის ვერსიის განახლება. ვერსიის მოგვიანების განახლება შეგიძლიათ პარამეტრების აპიდან.</translation> +<translation id="5499476581866658341">ამიერიდან შეგიძლიათ ნახოთ თქვენი ტელეფონის ბოლოდროინდელი ფოტოები და მედიაფაილები</translation> <translation id="549957179819296104">ახალი ხატულა</translation> <translation id="5500168250243071806">თქვენს Google ანგარიშში შეიძლება ინახებოდეს <ph name="BEGIN_LINK_SEARCH" />ძიების ისტორია<ph name="END_LINK_SEARCH" /> და <ph name="BEGIN_LINK_GOOGLE" />სხვა ტიპის აქტივობა<ph name="END_LINK_GOOGLE" />, როცა შესული ხართ სისტემაში. აღნიშნულის წაშლა ნებისმიერ დროს შეგიძლიათ.</translation> <translation id="5500709606820808700">უსაფრთხოების შემოწმება შესრულდა დღეს</translation> @@ -6313,6 +6317,7 @@ <translation id="7152478047064750137">ეს გაფართოება არ საჭიროებს სპეციალურ ნებართვებს</translation> <translation id="7154130902455071009">საწყისი გვერდის შეცვლა ამით: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">არსებული ფოტო კამერიდან ან ფაილიდან</translation> +<translation id="7160182524506337403">ამიერიდან შეგიძლიათ ნახოთ თქვენი ტელეფონის შეტყობინებები</translation> <translation id="7163202347044721291">მიმდინარეობს გააქტიურების კოდის დადასტურება…</translation> <translation id="716640248772308851">„<ph name="EXTENSION" />“-ს შეუძლია გამოსახულებების, ვიდეოს და ხმოვანი ფაილების წაკითხვა დაფიქსირებულ ადგილებში.</translation> <translation id="7167486101654761064">&ყოველთვის გაიხსნას ამ ტიპის ფაილები</translation> @@ -7326,6 +7331,7 @@ <translation id="8138997515734480534"><ph name="VM_NAME" />-ის სტატუსი</translation> <translation id="8139447493436036221">Google Drive ფაილები</translation> <translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation> +<translation id="8141418916163800697">ტელეფონის ცენტრის პარამეტრებიდან სხვა ფუნქციების დაყენება შეგიძლიათ</translation> <translation id="8141584439523427891">ახლა მიმდინარეობს ალტერნატიულ ბრაუზერში გახსნა</translation> <translation id="8141725884565838206">მართეთ თქვენი პაროლები</translation> <translation id="814204052173971714">{COUNT,plural, =1{ვიდეო}other{# ვიდეო}}</translation> @@ -7533,6 +7539,7 @@ <translation id="833986336429795709">აირჩიეთ აპი ამ ბმულის გასახსნელად</translation> <translation id="8342221978608739536">არ მიცდია</translation> <translation id="8342861492835240085">აირჩიეთ კოლექცია</translation> +<translation id="8345848587667658367">ამიერიდან შეგიძლიათ ნახოთ თქვენი ტელეფონის ბოლოდროინდელი ფოტოები, მედიაფაილები, შეტყობინებები და აპები</translation> <translation id="8347227221149377169">ბეჭდვის დავალებები</translation> <translation id="834785183489258869">ინკოგნიტო რეჟიმში საიტები ვერ გამოიყენებს თქვენს ქუქი-ჩანაწერებს სხვადასხვა ვებსაიტის დათვალიერების აქტივობაზე წვდომისთვის, მაგალითად, რეკლამის პერსონალიზების მიზნით. ფუნქციებმა, შესაძლოა, არ იმუშაოს ზოგიერთ საიტზე.</translation> <translation id="8350789879725387295">სტილუსის ხელსაწყოები სამაგრში</translation> @@ -8138,6 +8145,7 @@ <translation id="8957757410289731985">პროფილის მორგება</translation> <translation id="895944840846194039">JavaScript მეხსიერება</translation> <translation id="8960208913905765425">სწრაფი პასუხები — საზომი ერთეულების გადაყვანა</translation> +<translation id="8960638196855923532">ამიერიდან შეგიძლიათ ნახოთ თქვენი ტელეფონის შეტყობინებები და აპები</translation> <translation id="8962051932294470566">ერთდროულად მხოლოდ ერთი ფაილის გაზიარება შეგიძლიათ. ცადეთ ხელახლა, როცა მიმდინარე გადაცემა დასრულდება.</translation> <translation id="8962083179518285172">დეტალების დამალვა</translation> <translation id="8962918469425892674">ეს საიტი იყენებს მოძრაობისა თუ განათების სენსორებს.</translation> @@ -8289,6 +8297,7 @@ <translation id="9103868373786083162">დააჭირეთ უკან გასასვლელად, კონტექსტურ მენიუს ისტორიის სანახავად.</translation> <translation id="9108035152087032312">&ფანჯრის დასათაურება...</translation> <translation id="9108072915170399168">მონაცემთა გადაცემისთვის ამჟამად არჩეული გაქვთ „ინტერნეტის გარეშე“</translation> +<translation id="9108294543511800041">ამიერიდან შეგიძლიათ ნახოთ თქვენი ტელეფონის ბოლოდროინდელი ფოტოები, მედიაფაილები და შეტყობინებები</translation> <translation id="9108674852930645435">შეიტყვეთ, რა არის ახალი თქვენს <ph name="DEVICE_TYPE" />-ში</translation> <translation id="9108808586816295166">დაცული DNS შეიძლება ზოგჯერ მიუწვდომელი იყოს</translation> <translation id="9109122242323516435">მეხსიერების გამოთავისუფლება მოწყობილობიდან ფაილების წაშლით შეგიძლიათ.</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 45272533..8889dcb 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -1551,6 +1551,7 @@ <translation id="2433836460518180625">'ಸಾಧನ ಮಾತ್ರ' ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಿ</translation> <translation id="2434449159125086437">ಪ್ರಿಂಟರ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ. ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="2434758125294431199">ನಿಮ್ಮ ಜೊತೆಗೆ ಯಾರು ಹಂಚಿಕೊಳ್ಳಬಹುದು ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> +<translation id="2434915728183570229">ನೀವು ಈಗ ನಿಮ್ಮ ಫೋನ್ನ ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು</translation> <translation id="2435137177546457207">Google Chrome ಹಾಗೂ ChromeOS Flex ನ ಹೆಚ್ಚುವರಿ ನಿಯಮಗಳು</translation> <translation id="2435248616906486374">ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ</translation> <translation id="2435457462613246316">ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ತೋರಿಸಿ</translation> @@ -1915,6 +1916,7 @@ <translation id="2775858145769350417">{NUM_APPS,plural, =1{ಬೆಂಬಲಿಸದ 1 ಆ್ಯಪ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ}one{ಬೆಂಬಲಿಸದ # ಆ್ಯಪ್ಗಳನ್ನು ತೆಗೆದುಹಾಕಿ}other{ಬೆಂಬಲಿಸದ # ಆ್ಯಪ್ಗಳನ್ನು ತೆಗೆದುಹಾಕಿ}}</translation> <translation id="2776560192867872731"><ph name="DEVICE_NAME" /> ನ ಸಾಧನದ ಹೆಸರನ್ನು ಬದಲಿಸಿ</translation> <translation id="2777251078198759550">ಈ ಕಂಟೇನರ್ ಅಳಿಸಿ</translation> +<translation id="2778471504622896352">ChromeOS ಲಾಂಚರ್ಗೆ ರಿಮೋಟ್ ಆ್ಯಪ್ಗಳನ್ನು ಸೇರಿಸಿ</translation> <translation id="2781692009645368755">Google Pay</translation> <translation id="2782104745158847185">Linux ಅಪ್ಲಿಕೇಶನ್ ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ</translation> <translation id="2783298271312924866">ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗಿದೆ</translation> @@ -3551,6 +3553,7 @@ <translation id="4390396490617716185"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /> ಮತ್ತು ಇನ್ನೂ <ph name="NUMBER_OF_OTHER_SWITCHES" /> ಸ್ವಿಚ್ಗಳು</translation> <translation id="439266289085815679"><ph name="USER_EMAIL" /> ಮೂಲಕ ಬ್ಲೂಟೂತ್ ಕಾನ್ಫಿಗರೇಶನ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಲಾಗುತ್ತಿದೆ.</translation> <translation id="4392896746540753732">ಕಾನ್ಫಿಗರೇಶನ್ ಫೈಲ್ ಎಡಿಟ್ ಮಾಡಿ</translation> +<translation id="4393713825278446281">ಶೀಘ್ರ ಜೋಡಿಗೋಳಿಸುವಿಕೆ ಸಾಧನಗಳನ್ನು <ph name="PRIMARY_EMAIL" /> ಗೆ ಉಳಿಸಲಾಗಿದೆ</translation> <translation id="4394049700291259645">ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="4396956294839002702">{COUNT,plural, =0{ಎಲ್ಲವನ್ನೂ &ತೆರೆಯಿರಿ}=1{ಬುಕ್ಮಾರ್ಕ್ &ತರೆಯಿರಿ}one{ಎಲ್ಲಾ ({COUNT}) ಗಳನ್ನು &ತೆರೆಯಿರಿ}other{ಎಲ್ಲಾ ({COUNT}) ಗಳನ್ನು &ತೆರೆಯಿರಿ}}</translation> <translation id="4397372003838952832">ನೀವು ಈ ಪಾಸ್ವರ್ಡ್ ನೆನಪಿಟ್ಟುಕೊಳ್ಳುವ ಅಗತ್ಯವಿಲ್ಲ. ಇದನ್ನು <ph name="EMAIL" /> ಗಾಗಿ <ph name="GOOGLE_PASSWORD_MANAGER" /> ನಲ್ಲಿ ಉಳಿಸಲಾಗುತ್ತದೆ.</translation> @@ -3780,6 +3783,7 @@ <translation id="4615586811063744755">ಯಾವುದೇ ಕುಕೀ ಆಯ್ಕೆ ಮಾಡಲಾಗಿಲ್ಲ</translation> <translation id="461661862154729886">ಶಕ್ತಿಯ ಮೂಲ</translation> <translation id="4617001782309103936">ತೀರಾ ಚಿಕ್ಕದು</translation> +<translation id="4617019240346358451">"<ph name="EXTENSION_NAME" />" ಅನ್ನು ಬಳಸಲು ಪುಟವನ್ನು ಪುನಃ ಲೋಡ್ ಮಾಡಿ</translation> <translation id="4617270414136722281">ವಿಸ್ತರಣೆ ಆಯ್ಕೆಗಳು</translation> <translation id="4617880081511131945">ಸಂಪರ್ಕವನ್ನು ಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="4619564267100705184">ಇದು ನೀವೇ ಎಂಬುದನ್ನು ದೃಢೀಕರಿಸಿ</translation> @@ -3996,6 +4000,7 @@ <translation id="4833683849865011483">ಪ್ರಿಂಟ್ ಸರ್ವರ್ನ 1 ಪ್ರಿಂಟರ್ ಕಂಡುಬಂದಿದೆ</translation> <translation id="4836504898754963407">ಫಿಂಗರ್ಪ್ರಿಂಟ್ಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="4837128290434901661">Google Search ಗೆ ಹಿಂತಿರುಗಿ ಬದಲಿಸುವುದೇ?</translation> +<translation id="4837165100461973682">ನಿಮ್ಮ ಬದಲಾವಣೆಗಳನ್ನು ಅನ್ವಯಿಸಲು ಪುಟವನ್ನು ಮರುಲೋಡ್ ಮಾಡಿ</translation> <translation id="4837926214103741331">ನೀವು ಈ ಸಾಧನವನ್ನು ಬಳಸಲು ಪ್ರಮಾಣಿತರಾಗಿಲ್ಲ. ಸೈನ್-ಇನ್ ಅನುಮತಿಗಾಗಿ ಸಾಧನ ಮಾಲೀಕನನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation> <translation id="4837952862063191349">ನಿಮ್ಮ ಸ್ಥಳೀಯ ಡೇಟಾವನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ಮತ್ತು ಮರುಸ್ಥಾಪಿಸಲು, ದಯವಿಟ್ಟು ನಿಮ್ಮ ಹಳೆಯ <ph name="DEVICE_TYPE" /> ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿ.</translation> <translation id="4838170306476614339">ನಿಮ್ಮ ಫೋನ್ನ ಫೋಟೋಗಳು, ಮೀಡಿಯಾ ಮತ್ತು ಅಧಿಸೂಚನೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ</translation> @@ -4231,6 +4236,7 @@ <translation id="5072900412896857127">Google Play ಸೇವೆಯ ನಿಯಮಗಳನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಕನೆಕ್ಷನ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" />, <ph name="FILE2" />}one{<ph name="FILE1" />, <ph name="FILE2" />, ಮತ್ತು ಇನ್ನೂ #}other{<ph name="FILE1" />, <ph name="FILE2" />, ಮತ್ತು ಇನ್ನೂ #}}</translation> <translation id="5074318175948309511">ಹೊಸ ಸೆಟ್ಟಿಂಗ್ಗಳು ಪರಿಣಾಮಕಾರಿಯಾಗುವುದಕ್ಕೆ ಮೊದಲು ಈ ಪುಟವನ್ನು ರಿಲೋಡ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.</translation> +<translation id="5074761966806028321">ಸೆಟಪ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ಈಗಲೂ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ</translation> <translation id="5075910247684008552">ಭದ್ರತೆ ಸೈಟ್ಗಳಲ್ಲಿ ಅಸುರಕ್ಷಿತ ವಿಷಯವನ್ನು ಡೀಫಾಲ್ಟ್ ಆಗಿ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="5078638979202084724">ಎಲ್ಲಾ ಟ್ಯಾಬ್ಗಳನ್ನು ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಿ</translation> <translation id="5078796286268621944">ತಪ್ಪಾದ PIN</translation> @@ -4305,6 +4311,7 @@ <translation id="5150254825601720210">Netscape ಪ್ರಮಾಣಪತ್ರ SSL ಸರ್ವರ್ ಹೆಸರು</translation> <translation id="5151354047782775295">ಡಿಸ್ಕ್ ಸ್ಥಳಾವಕಾಶವನ್ನು ಮುಕ್ತಗೊಳಿಸಿ ಅಥವಾ ಆಯ್ಕೆಮಾಡಲಾದ ಡೇಟಾವನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ</translation> <translation id="5153234146675181447">ಫೋನ್ ಅನ್ನು ಮರೆತುಬಿಡಿ</translation> +<translation id="5153907427821264830"><ph name="STATUS" /> • <ph name="MESSAGE" /></translation> <translation id="5154108062446123722"><ph name="PRINTING_DESTINATION" /> ಗಾಗಿ ಸುಧಾರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="5154702632169343078">ವಿಷಯವಸ್ತು</translation> <translation id="5155327081870541046">ವಿಳಾಸ ಪಟ್ಟಿಯಲ್ಲಿ, "@bookmarks" ನಂತಹ ನೀವು ಹುಡುಕಲು ಬಯಸುವ ಸೈಟ್ನ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ನಮೂದಿಸಿ. ನಂತರ, ನಿಮ್ಮ ಆದ್ಯತೆಯ ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ ಒತ್ತಿರಿ ಮತ್ತು ನಿಮ್ಮ ಹುಡುಕಾಟ ಪದವನ್ನು ನಮೂದಿಸಿ.</translation> @@ -4593,6 +4600,7 @@ <translation id="5449551289610225147">ಅಮಾನ್ಯ ಪಾಸ್ವರ್ಡ್</translation> <translation id="5449588825071916739">ಎಲ್ಲಾ ಟ್ಯಾಬ್ಗಳನ್ನು ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಿ</translation> <translation id="5449716055534515760">&ವಿಂಡೋ ಮುಚ್ಚಿರಿ</translation> +<translation id="5452446625764825792">ನೀವು ಈಗ ನಿಮ್ಮ ಫೋನ್ನ ಇತ್ತೀಚಿನ ಫೋಟೋಗಳು, ಮೀಡಿಯಾ ಮತ್ತು ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (ಆಫ್ಲೈನ್ನಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ)</translation> <translation id="5454166040603940656"><ph name="PROVIDER" /> ಜೊತೆಗೆ</translation> <translation id="545484289444831485">ಇನ್ನಷ್ಟು ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳನ್ನು ನೋಡಿ</translation> @@ -4653,6 +4661,7 @@ <translation id="5499211612787418966">ಈ ಡೈಲಾಗ್ ಅನ್ನು ಪ್ರಸ್ತುತ ಫೋಕಸ್ ಮಾಡಲಾಗಿಲ್ಲ. ಈ ಡೈಲಾಗ್ ಅನ್ನು ಫೋಕಸ್ ಮಾಡಲು Alt-Shift A ಒತ್ತಿ.</translation> <translation id="5499313591153584299">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ಗೆ ಈ ಫೈಲ್ ಅಪಾಯಕಾರಿ ಆಗಿರಬಹುದು.</translation> <translation id="5499453227627332024">ನಿಮ್ಮ Linux ಕಂಟೇನರ್ಗೆ ಅಪ್ಗ್ರೇಡ್ ಲಭ್ಯವಿದೆ. ಸೆಟ್ಟಿಂಗ್ಗಳ ಆ್ಯಪ್ ಸಹಾಯದಿಂದಲೂ ನೀವು ನಂತರದಲ್ಲಿ ಅಪ್ಗ್ರೇಡ್ ಮಾಡಬಹುದು.</translation> +<translation id="5499476581866658341">ನೀವು ಈಗ ನಿಮ್ಮ ಫೋನ್ನ ಇತ್ತೀಚಿನ ಫೋಟೋಗಳು ಮತ್ತು ಮೀಡಿಯಾವನ್ನು ವೀಕ್ಷಿಸಬಹುದು</translation> <translation id="549957179819296104">ಹೊಸ ಐಕಾನ್</translation> <translation id="5500168250243071806">ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿರುವಾಗ, ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ <ph name="BEGIN_LINK_SEARCH" />ಹುಡುಕಾಟದ ಇತಿಹಾಸ<ph name="END_LINK_SEARCH" /> ಮತ್ತು <ph name="BEGIN_LINK_GOOGLE" />ಚಟುವಟಿಕೆಯ ಇತರ ವಿಧಾನಗಳನ್ನು<ph name="END_LINK_GOOGLE" /> ಉಳಿಸಬಹುದು. ನೀವು ಅವುಗಳನ್ನು ಯಾವಾಗ ಬೇಕಾದರೂ ಅಳಿಸಬಹುದು.</translation> <translation id="5500709606820808700">ಸುರಕ್ಷತಾ ಪರಿಶೀಲನೆಯನ್ನು ಈ ದಿನ ನಡೆಸಲಾಗಿದೆ</translation> @@ -5943,6 +5952,7 @@ <translation id="6790497603648687708"><ph name="EXTENSION_NAME" /> ಅನ್ನು ದೂರದಿಂದಲೇ ಸೇರಿಸಲಾಗಿದೆ</translation> <translation id="6790820461102226165">ವ್ಯಕ್ತಿಯನ್ನು ಸೇರಿಸಿ...</translation> <translation id="6793604637258913070">ಪಠ್ಯ ಕೆರೆಡ್ ಕಂಡುಬಂದಾಗ ಅಥವಾ ಸರಿಸಿದಾಗ ಅದನ್ನು ಹೈಲೈಟ್ ಮಾಡಿ</translation> +<translation id="6793879402816827484">↓ <ph name="STATUS" /></translation> <translation id="6795371939514004514">ಸ್ಕ್ರೀನ್ ಮೇಲಿರುವ ಐಟಂಗಳ ನಡುವೆ ಸರಿಸಲು, ಸ್ವಯಂ-ಸ್ಕ್ಯಾನ್ ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಐಟಂ ಅನ್ನು ಹೈಲೈಟ್ ಮಾಡಿದಾಗ, ಸಕ್ರಿಯಗೊಳಿಸಲು “ಆಯ್ಕೆಯನ್ನು” ಒತ್ತಿ.</translation> <translation id="6795884519221689054">ಪಾಂಡಾ</translation> <translation id="6797493596609571643">ಓಹ್, ಏನೋ ತಪ್ಪಾಗಿದೆ.</translation> @@ -6320,6 +6330,7 @@ <translation id="7152478047064750137">ಈ ವಿಸ್ತರಣೆಗೆ ಯಾವುದೇ ವಿಶೇಷ ಅನುಮತಿಗಳ ಅಗತ್ಯವಿಲ್ಲ</translation> <translation id="7154130902455071009">ನಿಮ್ಮ ಪ್ರಾರಂಭ ಪುಟವನ್ನು ಇದಕ್ಕೆ ಬದಲಾಯಿಸಿ: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">ಕ್ಯಾಮರಾ ಅಥವಾ ಫೈಲ್ನಿಂದ ಪ್ರಸ್ತುತ ಫೋಟೋ</translation> +<translation id="7160182524506337403">ನೀವು ಈಗ ನಿಮ್ಮ ಫೋನ್ನ ಅಧಿಸೂಚನೆಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು</translation> <translation id="7163202347044721291">ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ ಕೋಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="716640248772308851">ಗುರುತಿಸಿದ ಸ್ಥಳಗಳಲ್ಲಿ "<ph name="EXTENSION" />" ಚಿತ್ರಗಳು, ವಿಡಿಯೋ, ಮತ್ತು ಧ್ವನಿ ಫೈಲ್ಗಳನ್ನು ಓದಬಹುದು.</translation> <translation id="7167486101654761064">&ಯಾವಾಗಲೂ ಈ ಪ್ರಕಾರದ ಫೈಲ್ ಅನ್ನು ತೆರೆಯಿರಿ</translation> @@ -7331,6 +7342,7 @@ <translation id="8138997515734480534"><ph name="VM_NAME" /> ಸ್ಥಿತಿ</translation> <translation id="8139447493436036221">Google Drive ಫೈಲ್ಗಳು</translation> <translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation> +<translation id="8141418916163800697">ಫೋನ್ ಹಬ್ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ನೀವು ಇನ್ನಷ್ಟು ಫೀಚರ್ಗಳನ್ನು ಸೆಟಪ್ ಮಾಡಬಹುದು</translation> <translation id="8141584439523427891">ಇದೀಗ ಪರ್ಯಾಯ ಬ್ರೌಸರ್ನಲ್ಲಿ ತೆರೆಯಲಾಗುತ್ತಿದೆ</translation> <translation id="8141725884565838206">ನಿನ್ನ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="814204052173971714">{COUNT,plural, =1{ಒಂದು ವೀಡಿಯೊ}one{# ವೀಡಿಯೊಗಳು}other{# ವೀಡಿಯೊಗಳು}}</translation> @@ -7538,6 +7550,7 @@ <translation id="833986336429795709">ಈ ಲಿಂಕ್ ತೆರೆಯಲು, ಅಪ್ಲಿಕೇಶನ್ ಆಯ್ಕೆ ಮಾಡಿ</translation> <translation id="8342221978608739536">ಪ್ರಯತ್ನಿಸಿಲ್ಲ</translation> <translation id="8342861492835240085">ಸಂಗ್ರಹವನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> +<translation id="8345848587667658367">ನೀವು ಈಗ ನಿಮ್ಮ ಫೋನ್ನ ಇತ್ತೀಚಿನ ಫೋಟೋಗಳು, ಮೀಡಿಯಾ, ಅಧಿಸೂಚನೆಗಳು ಮತ್ತು ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು</translation> <translation id="8347227221149377169">ಮುದ್ರಣ ಕಾರ್ಯಗಳು</translation> <translation id="834785183489258869">ಅಜ್ಞಾತ ಮೋಡ್ನಲ್ಲಿ ಇರುವಾಗ, ವಿವಿಧ ಸೈಟ್ಗಳಾದ್ಯಂತ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನೋಡಲು, ಉದಾಹರಣೆಗೆ, ಜಾಹೀರಾತುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸುವುದಕ್ಕಾಗಿ ನಿಮ್ಮ ಕುಕೀಗಳನ್ನು ಬಳಸಲು ಸೈಟ್ಗಳಿಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಫೀಚರ್ಗಳು ಕೆಲವು ಸೈಟ್ಗಳಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು.</translation> <translation id="8350789879725387295">ಡಾಕ್ನಲ್ಲಿರುವ ಸ್ಟೈಲಸ್ ಪರಿಕರಗಳು</translation> @@ -7813,6 +7826,7 @@ <translation id="8642947597466641025">ಪಠ್ಯವನ್ನು ದೊಡ್ಡದಾಗಿ ಮಾಡಿಕೊಳ್ಳಿ</translation> <translation id="8643443571868262066"><ph name="FILE_NAME" />, ಅಪಾಯಕಾರಿ ಫೈಲ್ ಆಗಿರಬಹುದು. ಸ್ಕ್ಯಾನ್ ಮಾಡಲು Google ಸುಧಾರಿತ ರಕ್ಷಣೆಗೆ ಕಳಿಸುವುದೇ?</translation> <translation id="8644047503904673749">{COUNT,plural, =0{ಯಾವುದೇ ಕುಕೀಗಳಿಲ್ಲ}=1{1 ಕುಕೀಯನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}one{# ಕುಕೀಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}other{# ಕುಕೀಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}}</translation> +<translation id="864423554496711319">ನಿಮ್ಮ ಖಾತೆಗೆ ಸಾಧನಗಳನ್ನು ಉಳಿಸಲಾಗಿದೆ</translation> <translation id="8644655801811752511">ಈ ಭದ್ರತೆ ಕೀ ಅನ್ನು ಮರುಹೊಂದಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಕೀ ಅನ್ನು ಮರುಸೇರ್ಪಡಿಸಿದ ನಂತರ, ಅದನ್ನು ಕೂಡಲೇ ಮರುಹೊಂದಿಸಲು ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="8645354835496065562">ಸೆನ್ಸರ್ ಪ್ರವೇಶದ ಅನುಮತಿಯನ್ನು ಮುಂದುವರೆಸಿ</translation> <translation id="8645920082661222035">ಅಪಾಯಕಾರಿ ಘಟನೆಗಳು ಸಂಭವಿಸುವ ಮೊದಲೇ, ಅವುಗಳನ್ನು ಪತ್ತೆಹಚ್ಚುತ್ತದೆ ಮತ್ತು ನಿಮಗೆ ಎಚ್ಚರಿಕೆ ನೀಡುತ್ತದೆ</translation> @@ -8143,6 +8157,7 @@ <translation id="8957757410289731985">ಪ್ರೊಫೈಲ್ ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ</translation> <translation id="895944840846194039">JavaScript ಸ್ಮರಣೆ</translation> <translation id="8960208913905765425">ತ್ವರಿತ ಉತ್ತರಗಳ ಯೂನಿಟ್ ಪರಿವರ್ತನೆ</translation> +<translation id="8960638196855923532">ನೀವು ಈಗ ನಿಮ್ಮ ಫೋನ್ನ ಅಧಿಸೂಚನೆಗಳು ಮತ್ತು ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು</translation> <translation id="8962051932294470566">ನೀವು ಒಂದು ಬಾರಿಗೆ ಒಂದು ಫೈಲ್ ಅನ್ನು ಮಾತ್ರ ಹಂಚಿಕೊಳ್ಳಬಹುದು. ಪ್ರಸ್ತುತ ವರ್ಗಾವಣೆ ಪೂರ್ಣಗೊಂಡಾಗ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="8962083179518285172">ವಿವರಗಳನ್ನು ಮರೆಮಾಡಿ</translation> <translation id="8962918469425892674">ಈ ಸೈಟ್ ಚಲನೆ ಅಥವಾ ಲೈಟ್ ಸೆನ್ಸರ್ಗಳನ್ನು ಬಳಸುತ್ತಿದೆ.</translation> @@ -8294,6 +8309,7 @@ <translation id="9103868373786083162">ಇತಿಹಾಸವನ್ನು ವೀಕ್ಷಿಸಲು ಹಿಂದೆ, ಸಂದರ್ಭದ ಮೆನುಗೆ ಹೋಗಲು ಒತ್ತಿ</translation> <translation id="9108035152087032312">ಹೆಸರಿನ &ವಿಂಡೋ...</translation> <translation id="9108072915170399168">ಪ್ರಸ್ತುತ ಡೇಟಾ ಬಳಕೆಯ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಇಂಟರ್ನೆಟ್ ಇಲ್ಲದೆಯೇ ಎಂಬುದಕ್ಕೆ ಹೊಂದಿಸಲಾಗಿದೆ</translation> +<translation id="9108294543511800041">ನೀವು ಈಗ ನಿಮ್ಮ ಫೋನ್ನ ಇತ್ತೀಚಿನ ಫೋಟೋಗಳು, ಮೀಡಿಯಾ ಮತ್ತು ಅಧಿಸೂಚನೆಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು</translation> <translation id="9108674852930645435"><ph name="DEVICE_TYPE" /> ನಲ್ಲಿ ಹೊಸದೇನಿದೆ ಎಂದು ಎಕ್ಸ್ಪ್ಲೋರ್ ಮಾಡಿ</translation> <translation id="9108808586816295166">ಸುರಕ್ಷಿತ DNS ಎಲ್ಲಾ ಸಮಯದಲ್ಲೂ ಲಭ್ಯವಿಲ್ಲದಿರಬಹುದು.</translation> <translation id="9109122242323516435">ಸ್ಥಳಾವಕಾಶವನ್ನು ಮುಕ್ತಗೊಳಿಸಲು, ಸಾಧನ ಸಂಗ್ರಹಣೆಯಿಂದ ಫೈಲ್ಗಳನ್ನು ಅಳಿಸಿ.</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index a1f173e..bd50e68 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -3936,6 +3936,7 @@ <translation id="4768332406694066911">다음 기관에 사용자의 신원을 확인하는 인증서가 있습니다.</translation> <translation id="4770119228883592393">권한 요청됨, ⌘ 키와 Option 키와 아래쪽 화살표 키를 눌러 응답</translation> <translation id="4773112038801431077">Linux 업그레이드</translation> +<translation id="4774337692467964393">Smart Lock을 사용 설정하면 PIN이나 비밀번호를 입력할 필요가 없습니다.</translation> <translation id="4775142426314270551">진단 및 사용 데이터와 함께 비정상 종료 보고서를 Google에 자동으로 전송하여 Chrome 및 ChromeOS의 기능과 성능 개선에 참여합니다. 일부 합산 데이터도 Android 앱 및 Google 파트너에게 도움이 됩니다. 자녀의 Google 계정에 웹 및 앱 활동이 사용 설정되어 있다면 관련된 Android 데이터가 자녀의 Google 계정에 저장될 수 있습니다.</translation> <translation id="477647109558161443">바탕화면 바로가기 만들기</translation> <translation id="4776594120007763294">나중에 읽을 페이지를 추가하려면 버튼을 클릭하세요</translation> @@ -3985,6 +3986,7 @@ <translation id="4820236583224459650">활성 티켓으로 설정</translation> <translation id="4821935166599369261">프로파일링 사용(&P)</translation> <translation id="4823484602432206655">사용자와 기기 설정 확인 및 변경</translation> +<translation id="4823894915586516138">이 PIN 또는 비밀번호는 휴대전화에서 액세스하는 모든 정보를 포함하여 이 <ph name="DEVICE_TYPE" />의 데이터를 보호합니다</translation> <translation id="4824037980212326045">Linux 백업 및 복원</translation> <translation id="4824958205181053313">동기화를 취소하시겠습니까?</translation> <translation id="4827675678516992122">연결할 수 없음</translation> @@ -5642,6 +5644,7 @@ <translation id="648927581764831596">사용할 수 없음</translation> <translation id="6490471652906364588">USB-C 기기(오른쪽 포트)</translation> <translation id="6491376743066338510">승인에 실패했습니다.</translation> +<translation id="6492396476180293140">하드웨어 스위치로 인해 내장 카메라가 비활성화됨</translation> <translation id="6494327278868541139">향상된 보안 세부정보 표시</translation> <translation id="6494445798847293442">인증 기관이 아닙니다.</translation> <translation id="6494974875566443634">맞춤설정</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 6f29dc86..d568ea4 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1554,6 +1554,7 @@ <translation id="2433836460518180625">Зөвхөн төхөөрөмжийн түгжээг тайлах</translation> <translation id="2434449159125086437">Хэвлэгчийг тохируулах боломжгүй байна. Тохируулгыг шалгаад дахин оролдоно уу.</translation> <translation id="2434758125294431199">Хэн тантай хуваалцах боломжтойг сонгох</translation> +<translation id="2434915728183570229">Та одоо утасныхаа аппуудыг харах боломжтой</translation> <translation id="2435137177546457207">Google Chrome болон ChromeOS Flex-н нэмэлт нөхцөл</translation> <translation id="2435248616906486374">Сүлжээ тасарсан байна</translation> <translation id="2435457462613246316">Нууц үг харуулах</translation> @@ -1919,6 +1920,7 @@ <translation id="2775858145769350417">{NUM_APPS,plural, =1{1 дэмжигдээгүй аппыг устгах}other{# дэмжигдээгүй аппыг устгах}}</translation> <translation id="2776560192867872731"><ph name="DEVICE_NAME" />-н төхөөрөмжийн нэрийг өөрчилнө үү</translation> <translation id="2777251078198759550">Энэ контейнерыг устгах</translation> +<translation id="2778471504622896352">ChromeOS эхлүүлэгч рүү алсын удирдлагын аппуудыг нэмнэ үү</translation> <translation id="2781692009645368755">Google Pay</translation> <translation id="2782104745158847185">Linux аппыг суулгахад алдаа гарлаа</translation> <translation id="2783298271312924866">Татаж авсан</translation> @@ -3553,6 +3555,7 @@ <translation id="4390396490617716185"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /> болон өөр <ph name="NUMBER_OF_OTHER_SWITCHES" /> сэлгүүр</translation> <translation id="439266289085815679">Bluetooth тохиргоог <ph name="USER_EMAIL" /> хянадаг.</translation> <translation id="4392896746540753732">Тохиргооны файл засах</translation> +<translation id="4393713825278446281">Хурдан холбох төхөөрөмжүүдийг <ph name="PRIMARY_EMAIL" />-д хадгалсан</translation> <translation id="4394049700291259645">Идэвхгүй болгох</translation> <translation id="4396956294839002702">{COUNT,plural, =0{&Бүгдийг нээх}=1{&Хавчуургыг нээх}other{&Бүгдийг нээх ({COUNT})}}</translation> <translation id="4397372003838952832">Та энэ нууц үгийг санах шаардлагагүй. Үүнийг <ph name="EMAIL" />-д зориулж <ph name="GOOGLE_PASSWORD_MANAGER" />-д хадгална.</translation> @@ -3783,6 +3786,7 @@ <translation id="4615586811063744755">сонгосон күүки алга</translation> <translation id="461661862154729886">Эрчим хүчний эх үүсвэр</translation> <translation id="4617001782309103936">Хэт богино</translation> +<translation id="4617019240346358451">"<ph name="EXTENSION_NAME" />"-г ашиглахын тулд хуудсыг дахин ачаална уу</translation> <translation id="4617270414136722281">Өргөтгөлийн сонголт</translation> <translation id="4617880081511131945">Холболт тогтоож чадсангүй</translation> <translation id="4619564267100705184">Өөрийгөө мөн болохыг бататгах</translation> @@ -3998,6 +4002,7 @@ <translation id="4833683849865011483">Хэвлэх серверээс 1 хэвлэгч олдлоо</translation> <translation id="4836504898754963407">Хурууны хээг удирдах</translation> <translation id="4837128290434901661">Google Хайлт руу буцааж өөрчлөх үү?</translation> +<translation id="4837165100461973682">Өөрчлөлтүүдийг хэрэгжүүлэхийн тулд хуудсыг дахин ачаална уу</translation> <translation id="4837926214103741331">Та энэ төхөөрөмжийг ашиглах эрхгүй байна. Нэвтрэх зөвшөөрөл авахын тулд төхөөрөмжийн эзэмшигчтэй холбогдоно уу.</translation> <translation id="4837952862063191349">Суурин өгөгдлийн түгжээг тайлж сэргээхийн тулд хуучин <ph name="DEVICE_TYPE" /> нууц үгээ оруулна уу.</translation> <translation id="4838170306476614339">Утасныхаа зураг, медиа болон мэдэгдлүүдийг хараарай</translation> @@ -4233,6 +4238,7 @@ <translation id="5072900412896857127">Google Play-н үйлчилгээний нөхцөлийг ачаалах боломжгүй. Сүлжээний холболтоо шалгаад, дахин оролдоно уу.</translation> <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" />, <ph name="FILE2" />}other{<ph name="FILE1" />, <ph name="FILE2" />, болон бусад #}}</translation> <translation id="5074318175948309511">Шинэ тохиргоог хүчин төгөлдөр болгохын тулд энэ хуудсыг дахин нээх хэрэгтэй байх.</translation> +<translation id="5074761966806028321">Тохируулгыг дуусгахын тулд зөвшөөрөл шаардлагатай хэвээр байна</translation> <translation id="5075910247684008552">Аюулгүй сайт дээрх аюултай контентыг өгөгдмөл тохиргоогоор блоклосон байна</translation> <translation id="5078638979202084724">Бүх цонхнуудыг жагсааж хадгалах</translation> <translation id="5078796286268621944">ПИН код буруу байна</translation> @@ -4307,6 +4313,7 @@ <translation id="5150254825601720210">Netscape Certificate SSL Серверийн нэр</translation> <translation id="5151354047782775295">Дискний багтаамжийг нэмэгдүүлнэ үү. Ингээгүй тохиолдолд сонгох өгөгдөл автоматаар устах болно</translation> <translation id="5153234146675181447">Утсыг мартах</translation> +<translation id="5153907427821264830"><ph name="STATUS" /> • <ph name="MESSAGE" /></translation> <translation id="5154108062446123722"><ph name="PRINTING_DESTINATION" />-д зориулсан нэмэлт тохиргоо</translation> <translation id="5154702632169343078">Гарчиг</translation> <translation id="5155327081870541046">Та хаяг оруулах хэсэгт хайхыг хүсэж буй сайтынхаа "@хавчуурга" гэх мэт товчлолыг оруулна уу. Дараа нь сонгосон товчлуурын шууд холбоосыг дарж, хайлтын үгээ оруулна уу.</translation> @@ -4595,6 +4602,7 @@ <translation id="5449551289610225147">Буруу нууц үг</translation> <translation id="5449588825071916739">Бүх цонхнуудыг хадгалах</translation> <translation id="5449716055534515760">Цонхыг хаах</translation> +<translation id="5452446625764825792">Та одоо утасныхаа саяны зургууд, медиа болон аппуудыг харах боломжтой</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (офлайн үед ажиллана)</translation> <translation id="5454166040603940656"><ph name="PROVIDER" />-тэй</translation> <translation id="545484289444831485">Бусад хайлтын илэрцийг харах</translation> @@ -4655,6 +4663,7 @@ <translation id="5499211612787418966">Энэ харилцаг яриаг одоогоор сонгоогүй байна. Энэ харилцан яриаг сонгохын тулд Alt-Shift дээр дарна уу.</translation> <translation id="5499313591153584299">Энэ файл нь таны компьютерт хор хөнөөлтэй байж болно.</translation> <translation id="5499453227627332024">Таны Linux контейнерт сайжруулалт боломжтой байна. Та дараа нь мөн Тохиргоо аппаас сайжруулах боломжтой.</translation> +<translation id="5499476581866658341">Та одоо утасныхаа саяхны зургууд болон медиаг харах боломжтой</translation> <translation id="549957179819296104">Шинэ дүрс тэмдэг</translation> <translation id="5500168250243071806">Таныг нэвтэрсэн үед <ph name="BEGIN_LINK_SEARCH" />хайлтын түүх<ph name="END_LINK_SEARCH" /> болон <ph name="BEGIN_LINK_GOOGLE" />бусад төрлийн үйл ажиллагааг<ph name="END_LINK_GOOGLE" /> Google Бүртгэлд тань хадгалж магадгүй. Та тэдгээрийг хүссэн үедээ устгах боломжтой.</translation> <translation id="5500709606820808700">Аюулгүй байдлын шалгалтыг өнөөдөр хийсэн</translation> @@ -5942,6 +5951,7 @@ <translation id="6790497603648687708"><ph name="EXTENSION_NAME" />-г алсаас нэмсэн</translation> <translation id="6790820461102226165">Хүн нэм...</translation> <translation id="6793604637258913070">Текст бичих тэмдгийг харагдах, эсвэл хөдлөх үед нь тодруулна уу</translation> +<translation id="6793879402816827484">↓ <ph name="STATUS" /></translation> <translation id="6795371939514004514">Автоматаар скан хийх онцлог нь танд дэлгэц дээрх зүйлс хооронд автоматаар шилжих боломжийг олгоно. Зүйлийг тодруулсан үед нь идэвхжүүлэхийн тулд “Сонгох” дээр дарна уу.</translation> <translation id="6795884519221689054">Хулсны баавгай</translation> <translation id="6797493596609571643">Өө, ямар нэг зүйл ажиллахаа больсон байна.</translation> @@ -6318,6 +6328,7 @@ <translation id="7152478047064750137">Энэ өргөтгөл ямар нэгэн тусгай зөвшөөрөл шаарддаггүй</translation> <translation id="7154130902455071009">Өөрийн эхлэх хуудсыг :<ph name="START_PAGE" /> болгож өөрчлөх</translation> <translation id="7155171745945906037">Камер эсвэл файлд байгаа зураг</translation> +<translation id="7160182524506337403">Та одоо утасныхаа мэдэгдлүүдийг харах боломжтой</translation> <translation id="7163202347044721291">Идэвхжүүлэх кодыг бататгаж байна...</translation> <translation id="716640248772308851">"<ph name="EXTENSION" />" нь шалгасан байрлал дахь зураг, видео бичлэг болон дууны файлуудыг уншиж чадна.</translation> <translation id="7167486101654761064">& Үргэлж энэ төрлийн файлыг нээх</translation> @@ -7330,6 +7341,7 @@ <translation id="8138997515734480534"><ph name="VM_NAME" />-н төлөв</translation> <translation id="8139447493436036221">Google Драйвын файлууд</translation> <translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation> +<translation id="8141418916163800697">Та бусад онцлогийг Phone Hub-н тохиргоонд тохируулах боломжтой</translation> <translation id="8141584439523427891">Одоо өөр хөтчид нээж байна</translation> <translation id="8141725884565838206">Нууц үгээ удирдана уу</translation> <translation id="814204052173971714">{COUNT,plural, =1{1 видео}other{# видео}}</translation> @@ -7537,6 +7549,7 @@ <translation id="833986336429795709">Энэ холбоосыг нээхийн тулд апп сонгоно уу</translation> <translation id="8342221978608739536">Оролдож үзээгүй</translation> <translation id="8342861492835240085">Цуглуулга сонгох</translation> +<translation id="8345848587667658367">Та одоо утасныхаа саяхны зургууд, медиа, мэдэгдлүүд болон аппуудыг харах боломжтой</translation> <translation id="8347227221149377169">Хэвлэх ажлууд</translation> <translation id="834785183489258869">Сайтууд нь Нууцлалтай байх үедээ, жишээлбэл зарыг хувийн болгохын тулд өөр сайт дээрх таны хөтчийн үйл ажиллагааг харах зорилгоор таны күүкиг ашиглах боломжгүй. Зарим сайтын онцлогууд ажиллахгүй байж болзошгүй.</translation> <translation id="8350789879725387295">Холбогч дахь мэдрэгч үзгийн хэрэгсэл</translation> @@ -7812,6 +7825,7 @@ <translation id="8642947597466641025">Текстийг илүү томруулах</translation> <translation id="8643443571868262066"><ph name="FILE_NAME" /> нь аюултай байж болзошгүй. Скан хийлгэхээр Google-н Дэвшилтэт хамгаалалт руу илгээх үү?</translation> <translation id="8644047503904673749">{COUNT,plural, =0{Күүки байхгүй}=1{1 күүкиг блоклосон}other{# күүкиг блоклосон}}</translation> +<translation id="864423554496711319">Төхөөрөмжүүдийг таны бүртгэлд хадгалсан</translation> <translation id="8644655801811752511">Энэ аюулгүй байдлын түлхүүрийг шинэчлэх боломжгүй байна. Түлхүүрийг залгасны дараа нэн даруй шинэчлэхээр оролдоно уу.</translation> <translation id="8645354835496065562">Мэдрэгчийн хандалтыг үргэлжлүүлэн зөвшөөрөх</translation> <translation id="8645920082661222035">Аюултай үйл явдлын тухай урьдчилан таамаглаж, тохиолдохоос нь өмнө танд анхааруулга өгдөг</translation> @@ -8139,6 +8153,7 @@ <translation id="8957757410289731985">Профайлыг өөрчлөх</translation> <translation id="895944840846194039">JavaScript санах ой</translation> <translation id="8960208913905765425">Шуурхай хариултын нэгж хөрвүүлэлт</translation> +<translation id="8960638196855923532">Та одоо утасныхаа мэдэгдлүүд болон аппуудыг харах боломжтой</translation> <translation id="8962051932294470566">Та нэг удаад зөвхөн нэг файл хуваалцах боломжтой. Одоогийн шилжүүлэг дууссаны дараа дахин оролдоно уу.</translation> <translation id="8962083179518285172">Дэлгэрэнгүй мэдээллийг нуух</translation> <translation id="8962918469425892674">Энэ сайт хөдөлгөөн болон гэрлийн мэдрэгч ашиглаж байна.</translation> @@ -8290,6 +8305,7 @@ <translation id="9103868373786083162">Буцах бол back, түүх харах бол хулганын баруун товчлуурыг дарна уу</translation> <translation id="9108035152087032312">Цонхыг &нэрлэх...</translation> <translation id="9108072915170399168">Дата ашиглах одоогийн тохиргоо нь Интернэтгүй үед байна</translation> +<translation id="9108294543511800041">Та одоо утасныхаа саяны зургууд, медиа болон мэдэгдлүүдийг харах боломжтой</translation> <translation id="9108674852930645435"><ph name="DEVICE_TYPE" /> дээрээ шинэ зүйл юу байгааг судлаарай</translation> <translation id="9108808586816295166">Аюулгүй DNS нь үргэлж боломжтой биш байж болзошгүй</translation> <translation id="9109122242323516435">Багтаамж нэмэгдүүлэхийн тулд төхөөрөмжийн сангаас файл устгана уу.</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index b93fc5d..e4172cdd 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -1556,6 +1556,7 @@ <translation id="2433836460518180625">စက်ပစ္စည်းကိုသာ လော့ခ်ဖွင့်ရန်</translation> <translation id="2434449159125086437">ပရင်တာကို စနစ်ထည့်သွင်း၍မရပါ။ စီစဉ်သတ်မှတ်ချက်ကို စစ်ဆေးပြီး ထပ်စမ်းကြည့်ပါ။</translation> <translation id="2434758125294431199">သင့်အားမျှဝေနိုင်သူကို ရွေးပါ</translation> +<translation id="2434915728183570229">သင့်ဖုန်းအက်ပ်များကို ယခု ကြည့်နိုင်ပြီ</translation> <translation id="2435137177546457207">Google Chrome နှင့် ChromeOS Flex ထပ်တိုး စည်းမျဉ်းများ</translation> <translation id="2435248616906486374">ကွန်ရက် ချိတ်ဆက်မှုပျက်တောက်</translation> <translation id="2435457462613246316">စကားဝှက်ကို ပြပါ</translation> @@ -4239,6 +4240,7 @@ <translation id="5072900412896857127">‘Google Play ဝန်ဆောင်မှုစည်းမျဉ်းများ’ ကို ဖွင့်၍မရပါ။ သင်၏ ကွန်ရက်ချိတ်ဆက်မှုကို စစ်ဆေးပြီး ထပ်စမ်းကြည့်ပါ။</translation> <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" />၊ <ph name="FILE2" />}other{<ph name="FILE1" />၊ <ph name="FILE2" /> နှင့် နောက်ထပ် # ခု}}</translation> <translation id="5074318175948309511">ဆက်တင်အသစ်များ အလုပ်မလုပ်ခင် ဤစာမျက်နှာအား ပြန်လည်ရယူရန် လိုသည်။</translation> +<translation id="5074761966806028321">စနစ်ထည့်သွင်းမှု အပြီးသတ်ရန် ခွင့်ပြုချက် လိုအပ်သည်</translation> <translation id="5075910247684008552">လုံခြုံသောဝဘ်ဆိုက်များတွင် မူရင်းသတ်မှတ်ချက် အနေနှင့် လုံခြုံမှုမရှိသော အကြောင်းအရာများကို ပိတ်ပေးသည်</translation> <translation id="5078638979202084724">တဲပ်များအားလုံး ဘွတ်မတ်လုပ်ရန်</translation> <translation id="5078796286268621944">မမှန်ကန်သည့် ပင်ကုဒ်</translation> @@ -4602,6 +4604,7 @@ <translation id="5449551289610225147">စကားဝှက် မမှန်ကန်ပါ</translation> <translation id="5449588825071916739">တဲဘ်များ အားလုံးကို စာညှပ် ထည့်ပေးရန်</translation> <translation id="5449716055534515760">Win&dowကို ပိတ်ပါ</translation> +<translation id="5452446625764825792">သင့်ဖုန်း၏ လတ်တလောဓာတ်ပုံ၊ မီဒီယာနှင့် အက်ပ်များကို ယခု ကြည့်နိုင်ပြီ</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (အော့ဖ်လိုင်း သုံးနိုင်သည်)</translation> <translation id="5454166040603940656"><ph name="PROVIDER" /> ဖြင့်</translation> <translation id="545484289444831485">နောက်ထပ် ရှာဖွေမှုရလဒ်များကို ကြည့်ပါ</translation> @@ -4662,6 +4665,7 @@ <translation id="5499211612787418966">ဤဒိုင်ယာလော့ကို ယခု အထူးမပြသထားပါဘူး။ ဤဒိုင်ယာလော့ကို အထူးပြသရန် Alt-Shift A ကို နှိပ်ပါ။</translation> <translation id="5499313591153584299">ဒီဖိုင်မှာ သင်၏ ကွန်ပျူတာအတွက် အန္တရာယ် ရှိနိုင်သည်။</translation> <translation id="5499453227627332024">သင်၏ Linux ကွန်တိန်နာအတွက် အဆင့်မြှင့်မှုတစ်ခု ရရှိပါပြီ။ နောက်ပိုင်းတွင် ၎င်းကို 'ဆက်တင်များ' အက်ပ်၌ အချိန်မရွေး အဆင့်မြှင့်နိုင်သည်။</translation> +<translation id="5499476581866658341">သင့်ဖုန်း၏ လတ်တလောဓာတ်ပုံနှင့် မီဒီယာများကို ယခု ကြည့်နိုင်ပြီ</translation> <translation id="549957179819296104">သင်္ကေတ အသစ်</translation> <translation id="5500168250243071806">သင်လက်မှတ်ထိုးဝင်သောအခါ <ph name="BEGIN_LINK_SEARCH" />ရှာဖွေမှတ်တမ်း<ph name="END_LINK_SEARCH" /> နှင့် <ph name="BEGIN_LINK_GOOGLE" />အခြားပုံစံသော လုပ်ဆောင်ချက်<ph name="END_LINK_GOOGLE" /> တို့ကို သင်၏ Google Account တွင် သိမ်းထားနိုင်သည်။ ၎င်းတို့ကို အချိန်မရွေး ဖျက်နိုင်သည်။</translation> <translation id="5500709606820808700">ယနေ့ လုံခြုံရေး စစ်ဆေးထားသည်</translation> @@ -6324,6 +6328,7 @@ <translation id="7152478047064750137">ဤနောက်ဆက်တွဲသည် အထူးခွင့်ပြုချက်များ မလိုအပ်ပါ</translation> <translation id="7154130902455071009">သင်၏ စတင်မှု စာမျက်နှာကို ...<ph name="START_PAGE" />သို့ ပြောင်းပါ</translation> <translation id="7155171745945906037">ကင်မရာ သို့မဟုတ် ဖိုင်မှ လက်ရှိပုံ</translation> +<translation id="7160182524506337403">သင့်ဖုန်းအကြောင်းကြားချက်များကို ယခု ကြည့်နိုင်ပြီ</translation> <translation id="7163202347044721291">စသုံးရန်ကုဒ် စိစစ်နေသည်...</translation> <translation id="716640248772308851">"<ph name="EXTENSION" />" သည် ပုံများ၊ ဗီဒီယို၊ နှင့်အသံဖိုင်များကို အမှန်ခြစ်ထားသည့် တည်နေရာများတွင် ဖတ်နိုင်သည်။</translation> <translation id="7167486101654761064">&ဒီပုံစံ ဖိုင်များကို အမြဲတမ်း ဖွင့်ရန်</translation> @@ -7338,6 +7343,7 @@ <translation id="8138997515734480534"><ph name="VM_NAME" /> အခြေအနေ</translation> <translation id="8139447493436036221">Google Drive ဖိုင်များ</translation> <translation id="8140070492745508800"><ph name="FIRST_DEVICE" />၊ <ph name="SECOND_DEVICE" /></translation> +<translation id="8141418916163800697">‘ဖုန်းစင်တာ’ ဆက်တင်များတွင် နောက်ထပ်အင်္ဂါရပ်များကို စနစ်ထည့်သွင်းနိုင်သည်</translation> <translation id="8141584439523427891">အရန် ဘရောင်ဇာတွင် ယခုဖွင့်နေသည်</translation> <translation id="8141725884565838206">သင့်လျှို့ဝှက်စကားလုံးများကို စီမံမည်</translation> <translation id="814204052173971714">{COUNT,plural, =1{ဗီဒီယိုတစ်ကား}other{ဗီဒီယို # ကား}}</translation> @@ -7545,6 +7551,7 @@ <translation id="833986336429795709">ဤလင့်ခ်ကို ဖွင့်ရန် အက်ပ်တစ်ခုကို ရွေးပါ</translation> <translation id="8342221978608739536">စမ်းမထားပါ</translation> <translation id="8342861492835240085">သိမ်းဆည်းထားသည်များကို ရွေးရန်</translation> +<translation id="8345848587667658367">သင့်ဖုန်း၏ လတ်တလော ဓာတ်ပုံ၊ မီဒီယာ၊ အကြောင်းကြားချက်နှင့် အက်ပ်များကို ယခု ကြည့်နိုင်ပြီ</translation> <translation id="8347227221149377169">ပရင့်ထုတ်ရန် ဖိုင်များ</translation> <translation id="834785183489258869">ရုပ်ဖျက်မုဒ်သုံးနေစဉ် ဥပမာ- ကြော်ငြာများကို ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ရန်အတွက် မတူညီသည့် ဝဘ်ဆိုက်များတစ်လျှောက်ရှိ သင့်ကြည့်ရှုခြင်းများကို မြင်ရရန် ဝဘ်ဆိုက်များက သင်၏ကွတ်ကီးများကို မသုံးနိုင်ပါ။ ဝဘ်ဆိုက်အချို့ရှိ ဝန်ဆောင်မှုများ အလုပ်မလုပ်နိုင်လောက်ပါ။</translation> <translation id="8350789879725387295">စတိုင်လပ်စ်တူးလ်များ နေရာချရန်</translation> @@ -8150,6 +8157,7 @@ <translation id="8957757410289731985">ပရိုဖိုင်ကို စိတ်ကြိုက်လုပ်ရန်</translation> <translation id="895944840846194039">JavaScript မှတ်ဉာဏ်</translation> <translation id="8960208913905765425">‘အမြန်အဖြေများ’ ယူနစ်ပြောင်းလဲခြင်း</translation> +<translation id="8960638196855923532">သင့်ဖုန်း၏ အကြောင်းကြားချက်နှင့် အက်ပ်များကို ယခု ကြည့်နိုင်ပြီ</translation> <translation id="8962051932294470566">တစ်ကြိမ်တွင် ဖိုင်တစ်ခုသာ မျှဝေနိုင်သည်။ လက်ရှိပြောင်းရွှေ့မှု ပြီးသည့်အခါ ထပ်စမ်းကြည့်ပါ။</translation> <translation id="8962083179518285172">အသေးစိတ်များ ဝှက်ထားရန်</translation> <translation id="8962918469425892674">ဤဝဘ်ဆိုက်သည် လှုပ်ရှားမှု သို့မဟုတ် အလင်းရောင် အာရုံခံကိရိယာကို အသုံးပြုနေသည်။</translation> @@ -8301,6 +8309,7 @@ <translation id="9103868373786083162">မှတ်တမ်းကို ကြည့်ရန် နောက်ကိုသွား၊ ဆက်စပ် မီနူးကို နှိပ်ပါ</translation> <translation id="9108035152087032312">ဝင်းဒိုး အမည်ပေးရန်...</translation> <translation id="9108072915170399168">လက်ရှိဒေတာသုံးစွဲမှုဆက်တင်သည် အင်တာနက်မရှိဘဲသုံးရန်ဖြစ်သည်</translation> +<translation id="9108294543511800041">သင့်ဖုန်း၏ လတ်တလော ဓာတ်ပုံ၊ မီဒီယာနှင့် အကြောင်းကြားချက်များကို ယခု ကြည့်နိုင်ပြီ</translation> <translation id="9108674852930645435"><ph name="DEVICE_TYPE" /> ရှိ အသစ်ပါဝင်မှုများကို ကြည့်လိုက်ပါ</translation> <translation id="9108808586816295166">လုံခြုံသော DNS ကို အမြဲမရနိုင်ပါ</translation> <translation id="9109122242323516435">နေရာလွတ်ပြုလုပ်ရန် စက်ပစ္စည်းသိုလှောင်ခန်းမှ ဖိုင်များကို ဖျက်ပါ။</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index f96a1873..243306e 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1543,6 +1543,7 @@ <translation id="2433836460518180625">Alleen apparaat ontgrendelen</translation> <translation id="2434449159125086437">Kan de printer niet instellen. Controleer de configuratie en probeer het opnieuw.</translation> <translation id="2434758125294431199">Selecteer wie content met jou kan delen</translation> +<translation id="2434915728183570229">Je kunt nu de apps van je telefoon bekijken</translation> <translation id="2435137177546457207">Aanvullende voorwaarden van Google Chrome en Chrome OS Flex</translation> <translation id="2435248616906486374">Geen verbinding met netwerk</translation> <translation id="2435457462613246316">Wachtwoord bekijken</translation> @@ -1907,6 +1908,7 @@ <translation id="2775858145769350417">{NUM_APPS,plural, =1{1 niet-ondersteunde app verwijderen}other{# niet-ondersteunde apps verwijderen}}</translation> <translation id="2776560192867872731">Apparaatnaam wijzigen voor <ph name="DEVICE_NAME" /></translation> <translation id="2777251078198759550">Deze container verwijderen</translation> +<translation id="2778471504622896352">Externe apps toevoegen aan de ChromeOS Launcher</translation> <translation id="2781692009645368755">Google Pay</translation> <translation id="2782104745158847185">Fout bij het installeren van de Linux-app</translation> <translation id="2783298271312924866">Gedownload</translation> @@ -3541,6 +3543,7 @@ <translation id="4390396490617716185"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /> en nog <ph name="NUMBER_OF_OTHER_SWITCHES" /> andere schakelaars</translation> <translation id="439266289085815679">Bluetooth-configuratie wordt beheerd door <ph name="USER_EMAIL" />.</translation> <translation id="4392896746540753732">Het configuratiebestand bewerken</translation> +<translation id="4393713825278446281">Apparaten met Snel koppelen opgeslagen in <ph name="PRIMARY_EMAIL" /></translation> <translation id="4394049700291259645">Uitzetten</translation> <translation id="4396956294839002702">{COUNT,plural, =0{Alles &openen}=1{Bookmark &openen}other{Alles &openen ({COUNT})}}</translation> <translation id="4397372003838952832">Je hoeft dit wachtwoord niet te onthouden. Het wordt opgeslagen in <ph name="GOOGLE_PASSWORD_MANAGER" /> voor <ph name="EMAIL" />.</translation> @@ -3770,6 +3773,7 @@ <translation id="4615586811063744755">geen cookie geselecteerd</translation> <translation id="461661862154729886">Energiebron</translation> <translation id="4617001782309103936">Te kort</translation> +<translation id="4617019240346358451">Laad de pagina opnieuw om <ph name="EXTENSION_NAME" /> te gebruiken</translation> <translation id="4617270414136722281">Opties voor extensies</translation> <translation id="4617880081511131945">Kan geen verbinding maken</translation> <translation id="4619564267100705184">Bevestigen dat jij het bent</translation> @@ -3984,6 +3988,7 @@ <translation id="4833683849865011483">Er is één printer gevonden op de printerserver</translation> <translation id="4836504898754963407">Vingerafdrukken beheren</translation> <translation id="4837128290434901661">Teruggaan naar Google Zoeken?</translation> +<translation id="4837165100461973682">Laad de pagina opnieuw om je wijzigingen toe te passen</translation> <translation id="4837926214103741331">Je beschikt niet over de rechten om dit apparaat te gebruiken. Neem contact op met de eigenaar van het apparaat voor toestemming om in te loggen.</translation> <translation id="4837952862063191349">Geef het oude wachtwoord van je <ph name="DEVICE_TYPE" /> op om te ontgrendelen en je lokale gegevens te herstellen.</translation> <translation id="4838170306476614339">Foto's, media en meldingen van je telefoon bekijken</translation> @@ -4219,6 +4224,7 @@ <translation id="5072900412896857127">De Servicevoorwaarden van Google Play kunnen niet worden geladen. Check de netwerkverbinding en probeer het opnieuw.</translation> <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" />, <ph name="FILE2" />}other{<ph name="FILE1" />, <ph name="FILE2" /> en nog #}}</translation> <translation id="5074318175948309511">Deze pagina moet eventueel opnieuw worden geladen voordat de nieuwe instellingen van kracht zijn.</translation> +<translation id="5074761966806028321">Er zijn nog steeds rechten nodig om het instellen af te ronden</translation> <translation id="5075910247684008552">Onveilige content wordt standaard geblokkeerd op beveiligde sites</translation> <translation id="5078638979202084724">Bookmark toevoegen aan alle tabbladen</translation> <translation id="5078796286268621944">Onjuiste pincode</translation> @@ -4293,6 +4299,7 @@ <translation id="5150254825601720210">SSL-servernaam van Netscape-certificaat</translation> <translation id="5151354047782775295">Maak schijfruimte vrij of bepaalde gegevens kunnen automatisch worden verwijderd</translation> <translation id="5153234146675181447">Telefoon vergeten</translation> +<translation id="5153907427821264830"><ph name="STATUS" /> • <ph name="MESSAGE" /></translation> <translation id="5154108062446123722">Geavanceerde instellingen voor <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Onderwerp</translation> <translation id="5155327081870541046">Geef in de adresbalk de snelkoppeling op voor de website die je wilt doorzoeken, zoals '@bookmarks'. Druk op de gewenste sneltoets en geef de zoekterm op.</translation> @@ -4581,6 +4588,7 @@ <translation id="5449551289610225147">Ongeldig wachtwoord</translation> <translation id="5449588825071916739">Bookmark toevoegen aan alle tabbladen</translation> <translation id="5449716055534515760">Ve&nster sluiten</translation> +<translation id="5452446625764825792">Je kunt nu de recente foto's, media en apps van je telefoon bekijken</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (werkt offline)</translation> <translation id="5454166040603940656">met <ph name="PROVIDER" /></translation> <translation id="545484289444831485">Meer zoekresultaten bekijken</translation> @@ -4641,6 +4649,7 @@ <translation id="5499211612787418966">De focus staat momenteel niet op dit dialoogvenster. Druk op Alt-Shift-A om de focus op dit dialoogvenster te zetten.</translation> <translation id="5499313591153584299">Dit bestand is mogelijk schadelijk voor je computer.</translation> <translation id="5499453227627332024">Er is een upgrade beschikbaar voor je Linux-container. Je kunt ook later upgraden via de app Instellingen.</translation> +<translation id="5499476581866658341">Je kunt nu de recente foto's en media van je telefoon bekijken</translation> <translation id="549957179819296104">Nieuw icoon</translation> <translation id="5500168250243071806"><ph name="BEGIN_LINK_SEARCH" />Zoekgeschiedenis<ph name="END_LINK_SEARCH" /> en <ph name="BEGIN_LINK_GOOGLE" />andere vormen van activiteit<ph name="END_LINK_GOOGLE" /> kunnen worden opgeslagen op je Google-account als je bent ingelogd. Je kunt ze wanneer je wilt verwijderen.</translation> <translation id="5500709606820808700">Veiligheidscheck is vandaag uitgevoerd</translation> @@ -5924,6 +5933,7 @@ <translation id="6790497603648687708"><ph name="EXTENSION_NAME" /> is op afstand toegevoegd</translation> <translation id="6790820461102226165">Persoon toevoegen...</translation> <translation id="6793604637258913070">Markeer het tekstinvoerpunt wanneer het wordt weergegeven of verplaatst</translation> +<translation id="6793879402816827484">↓ <ph name="STATUS" /></translation> <translation id="6795371939514004514">Met Automatische scan kun je automatisch door items op het scherm navigeren. Als een item is gemarkeerd, druk je op Selecteren om dit te activeren.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Er is een fout opgetreden.</translation> @@ -6300,6 +6310,7 @@ <translation id="7152478047064750137">De extensie vereist geen speciale rechten</translation> <translation id="7154130902455071009">Je homepage wijzigen in: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Bestaande foto van camera of uit bestand</translation> +<translation id="7160182524506337403">Je kunt nu de meldingen van je telefoon bekijken</translation> <translation id="7163202347044721291">Activeringscode verifiëren...</translation> <translation id="716640248772308851">'<ph name="EXTENSION" />' kan afbeeldingen, video- en geluidsbestanden lezen op de gecontroleerde locaties.</translation> <translation id="7167486101654761064">&Altijd bestanden van dit type openen</translation> @@ -7312,6 +7323,7 @@ <translation id="8138997515734480534"><ph name="VM_NAME" />-status</translation> <translation id="8139447493436036221">Google Drive-bestanden</translation> <translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation> +<translation id="8141418916163800697">Je kunt meer functies instellen in de Telefoonhub-instellingen</translation> <translation id="8141584439523427891">Wordt nu geopend in een alternatieve browser</translation> <translation id="8141725884565838206">Je wachtwoorden beheren</translation> <translation id="814204052173971714">{COUNT,plural, =1{een video}other{# video's}}</translation> @@ -7519,6 +7531,7 @@ <translation id="833986336429795709">Kies een app om deze link te openen</translation> <translation id="8342221978608739536">Niet geprobeerd</translation> <translation id="8342861492835240085">Een verzameling selecteren</translation> +<translation id="8345848587667658367">Je kunt nu de recente foto's, media, meldingen en apps van je telefoon bekijken</translation> <translation id="8347227221149377169">Afdruktaken</translation> <translation id="834785183489258869">Als je de incognitomodus gebruikt, kunnen sites je cookies niet gebruiken om je browse-activiteit op verschillende sites te bekijken, bijvoorbeeld om advertenties te personaliseren. Functies op bepaalde sites werken misschien niet.</translation> <translation id="8350789879725387295">Stylustools in dock</translation> @@ -7794,6 +7807,7 @@ <translation id="8642947597466641025">De tekst groter maken</translation> <translation id="8643443571868262066"><ph name="FILE_NAME" /> is misschien gevaarlijk. Wil je het bestand naar 'Geavanceerde beveiliging' van Google sturen zodat het kan worden gescand?</translation> <translation id="8644047503904673749">{COUNT,plural, =0{Geen cookies}=1{1 cookie wordt geblokkeerd}other{# cookies worden geblokkeerd}}</translation> +<translation id="864423554496711319">Apparaten opgeslagen in je account</translation> <translation id="8644655801811752511">Kan deze beveiligingssleutel niet resetten. Probeer de sleutel onmiddellijk te resetten nadat je deze hebt geplaatst.</translation> <translation id="8645354835496065562">Toegang tot sensoren blijven toestaan</translation> <translation id="8645920082661222035">Voorspelt en waarschuwt je over gevaarlijke gebeurtenissen voordat deze plaatsvinden</translation> @@ -8124,6 +8138,7 @@ <translation id="8957757410289731985">Profiel aanpassen</translation> <translation id="895944840846194039">JavaScript-geheugen</translation> <translation id="8960208913905765425">Eenheidsconversie van Snelle antwoorden</translation> +<translation id="8960638196855923532">Je kunt nu de meldingen en apps van je telefoon bekijken</translation> <translation id="8962051932294470566">Je kunt slechts één bestand tegelijk delen. Probeer het opnieuw als de huidige overdracht is afgerond.</translation> <translation id="8962083179518285172">Details verbergen</translation> <translation id="8962918469425892674">Deze site gebruikt bewegings- of lichtsensoren.</translation> @@ -8275,6 +8290,7 @@ <translation id="9103868373786083162">Druk op Terug > contextmenu om de geschiedenis te bekijken</translation> <translation id="9108035152087032312">&Venster een naam geven...</translation> <translation id="9108072915170399168">De huidige instelling voor datagebruik is 'Zonder internet'</translation> +<translation id="9108294543511800041">Je kunt nu de recente foto's, media en meldingen van je telefoon bekijken</translation> <translation id="9108674852930645435">Bekijk wat er nieuw is op je <ph name="DEVICE_TYPE" /></translation> <translation id="9108808586816295166">Beveiligde DNS is mogelijk niet altijd beschikbaar</translation> <translation id="9109122242323516435">Verwijder bestanden uit de opslag van je apparaat om ruimte vrij te maken.</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index fe562924..8698858e 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -191,7 +191,7 @@ <translation id="1174073918202301297">Snarveien er lagt til</translation> <translation id="1174366174291287894">Tilkoblingen din er alltid sikker så lenge Chrome ikke forteller deg noe annet</translation> <translation id="1174391930667737831">Personvernsenter</translation> -<translation id="117445914942805388">For å slette nettleserdata på alle synkroniserte enheter og Google-kontoen din <ph name="BEGIN_LINK" />går du til innstillingene for synkronisering<ph name="END_LINK" />.</translation> +<translation id="117445914942805388">For å slette nettlesingsdata på alle synkroniserte enheter og Google-kontoen din <ph name="BEGIN_LINK" />går du til innstillingene for synkronisering<ph name="END_LINK" />.</translation> <translation id="1175364870820465910">&Skriv ut...</translation> <translation id="1176471985365269981">Nettsteder som ikke har lov til å redigere filer eller mapper på enheten</translation> <translation id="1177863135347784049">Tilpasset</translation> @@ -204,7 +204,7 @@ <translation id="1187722533808055681">Inaktive oppvåkninger</translation> <translation id="1188807932851744811">Loggen er ikke lastet opp.</translation> <translation id="11901918071949011">{NUM_FILES,plural, =1{Tilgang til en fil som er lagret på datamaskinen din}other{Tilgang til # filer som er lagret på datamaskinen din}}</translation> -<translation id="119092896208640858">For å slette nettleserdata på kun denne enheten, men beholde dataene på Google-kontoen, må du <ph name="BEGIN_LINK" />logge ut<ph name="END_LINK" />.</translation> +<translation id="119092896208640858">For å slette nettlesingsdata på kun denne enheten, men beholde dataene på Google-kontoen, må du <ph name="BEGIN_LINK" />logge ut<ph name="END_LINK" />.</translation> <translation id="1191353342579061195">Velg temaet som passer til behovene dine. For å endre tema, bakgrunn, skjermsparer med mer, bare høyreklikk på skrivebordet.</translation> <translation id="1192706927100816598">{0,plural, =1{Du blir logget av automatisk om # sekund. <ph name="DOMAIN" /> krever at smartkortet blir stående i.}other{Du blir logget av automatisk om # sekunder. @@ -1552,6 +1552,7 @@ <translation id="2433836460518180625">Lås kun opp enheten</translation> <translation id="2434449159125086437">Kunne ikke konfigurere skriveren. Kontrollér konfigurasjonen og prøv på nytt.</translation> <translation id="2434758125294431199">Velg hvem som kan dele med deg</translation> +<translation id="2434915728183570229">Nå kan du se appene på telefonen din</translation> <translation id="2435137177546457207">Tilleggsvilkår for Google Chrome og ChromeOS Flex</translation> <translation id="2435248616906486374">Nettverket mistet tilkoblingen</translation> <translation id="2435457462613246316">Vis passord</translation> @@ -1608,7 +1609,7 @@ <translation id="2480868415629598489">endre data du kopierer og limer inn</translation> <translation id="2482878487686419369">Varsler</translation> <translation id="2482895651873876648">Fanen er flyttet til gruppen <ph name="GROUP_NAME" /> – <ph name="GROUP_CONTENTS" /></translation> -<translation id="2484959914739448251">For å slette nettleserdata på alle synkroniserte enheter og Google-kontoen din må du <ph name="BEGIN_LINK" />skrive inn passordfrasen din<ph name="END_LINK" />.</translation> +<translation id="2484959914739448251">For å slette nettlesingsdata på alle synkroniserte enheter og Google-kontoen din må du <ph name="BEGIN_LINK" />skrive inn passordfrasen din<ph name="END_LINK" />.</translation> <translation id="2485394160472549611">Toppvalg for deg</translation> <translation id="2485422356828889247">Avinstaller</translation> <translation id="2485681265915754872">Vilkår for bruk av Google Play</translation> @@ -4145,7 +4146,7 @@ <translation id="4977882548591990850"><ph name="CHARACTER_COUNT" />/<ph name="CHARACTER_LIMIT" /></translation> <translation id="4977942889532008999">Bekreft tilgangen</translation> <translation id="4980805016576257426">Denne utvidelsen inneholder skadelig programvare.</translation> -<translation id="4981449534399733132">For å slette nettleserdata på alle synkroniserte enheter og Google-kontoen din må du <ph name="BEGIN_LINK" />logge på<ph name="END_LINK" />.</translation> +<translation id="4981449534399733132">For å slette nettlesingsdata på alle synkroniserte enheter og Google-kontoen din må du <ph name="BEGIN_LINK" />logge på<ph name="END_LINK" />.</translation> <translation id="4982236238228587209">Enhetsprogramvare</translation> <translation id="4986728572522335985">Dette fører til at alle dataene på sikkerhetsnøkkelen, inkludert PIN-koden, blir slettet</translation> <translation id="4988526792673242964">Sider</translation> @@ -4229,6 +4230,7 @@ <translation id="5072900412896857127">Vilkårene for bruk av Google Play kan ikke lastes inn. Kontrollér nettverkstilkoblingen, og prøv på nytt.</translation> <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" /> og <ph name="FILE2" />}other{<ph name="FILE1" />, <ph name="FILE2" /> og # til}}</translation> <translation id="5074318175948309511">Du må kanskje laste inn denne siden på nytt for at innstillingene skal bli gjeldende.</translation> +<translation id="5074761966806028321">Tillatelse kreves fortsatt for å fullføre konfigureringen</translation> <translation id="5075910247684008552">Som standard blokkeres usikkert innhold på sikre nettsteder</translation> <translation id="5078638979202084724">Legg inn alle faner som bokmerke</translation> <translation id="5078796286268621944">Feil personlig kode</translation> @@ -4590,6 +4592,7 @@ <translation id="5449551289610225147">Ugyldig passord</translation> <translation id="5449588825071916739">Angi bokmerker for alle faner</translation> <translation id="5449716055534515760">Lukk vin&du</translation> +<translation id="5452446625764825792">Nå kan du se telefonens nylige bilder, medier og apper</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (fungerer uten nett)</translation> <translation id="5454166040603940656">med <ph name="PROVIDER" /></translation> <translation id="545484289444831485">Se flere søkeresultater</translation> @@ -4650,6 +4653,7 @@ <translation id="5499211612787418966">Denne dialogboksen er ikke fokusert for øyeblikket. Trykk på Alt + Shift + A for å fokusere på denne dialogboksen.</translation> <translation id="5499313591153584299">Denne filen kan være skadelig for datamaskinen din.</translation> <translation id="5499453227627332024">En oppgradering er tilgjengelig for Linux-beholderen din. Du kan også oppgradere senere i Innstillinger-appen.</translation> +<translation id="5499476581866658341">Nå kan du se telefonens nylige bilder og medier</translation> <translation id="549957179819296104">Nytt ikon</translation> <translation id="5500168250243071806"><ph name="BEGIN_LINK_SEARCH" />Søkeloggen<ph name="END_LINK_SEARCH" /> og <ph name="BEGIN_LINK_GOOGLE" />andre typer aktivitet<ph name="END_LINK_GOOGLE" /> kan bli lagret i Google-kontoen din når du er pålogget. Du kan slette dem når som helst.</translation> <translation id="5500709606820808700">Sikkerhetssjekken ble kjørt i dag</translation> @@ -6313,6 +6317,7 @@ <translation id="7152478047064750137">Denne utvidelsen krever ingen spesielle tillatelser</translation> <translation id="7154130902455071009">endre startsiden din til: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">Eksisterende bilde fra kamera eller fil</translation> +<translation id="7160182524506337403">Nå kan du se varsler på telefonen</translation> <translation id="7163202347044721291">Bekrefter aktiveringskoden …</translation> <translation id="716640248772308851">«<ph name="EXTENSION" />» kan lese bilder, videofiler og lydfiler i mappene som står oppført.</translation> <translation id="7167486101654761064">Åpne &alltid filer av denne typen</translation> @@ -7200,7 +7205,7 @@ <translation id="8023133589013344428">Administrer språk i ChromeOS Flex-innstillingene</translation> <translation id="8023801379949507775">Oppdater utvidelser nå</translation> <translation id="8025151549289123443">Låseskjerm og pålogging</translation> -<translation id="8026334261755873520">Slett nettleserdata</translation> +<translation id="8026334261755873520">Slett nettlesingsdata</translation> <translation id="8028060951694135607">Microsoft nøkkelgjenoppretting</translation> <translation id="8028803902702117856">Laster ned <ph name="SIZE" />, <ph name="FILE_NAME" /></translation> <translation id="8028993641010258682">Størrelse</translation> @@ -7327,6 +7332,7 @@ <translation id="8138997515734480534">Status for <ph name="VM_NAME" /></translation> <translation id="8139447493436036221">Google Disk-filer</translation> <translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation> +<translation id="8141418916163800697">Du kan konfigurere flere funksjoner i Telefonstyring-innstillingene</translation> <translation id="8141584439523427891">Åpnes i alternativ nettleser nå</translation> <translation id="8141725884565838206">Administrer passordene dine</translation> <translation id="814204052173971714">{COUNT,plural, =1{en video}other{# videoer}}</translation> @@ -7534,6 +7540,7 @@ <translation id="833986336429795709">For å åpne denne linken, velg en app</translation> <translation id="8342221978608739536">Prøvde ikke</translation> <translation id="8342861492835240085">Velg en samling</translation> +<translation id="8345848587667658367">Nå kan du se telefonens nylige bilder, medier, varsler og apper</translation> <translation id="8347227221149377169">Utskriftsjobber</translation> <translation id="834785183489258869">Når du er i Inkognitomodus, kan ikke nettsteder bruke informasjonskapsler til å se nettleseraktiviteten din på andre nettsteder, for eksempel for å vise deg personlig tilpassede annonser. Det kan hende at funksjoner på noen nettsteder ikke fungerer.</translation> <translation id="8350789879725387295">Pekepennverktøy i Dock</translation> @@ -8138,6 +8145,7 @@ <translation id="8957757410289731985">Tilpass profil</translation> <translation id="895944840846194039">JavaScript-minne</translation> <translation id="8960208913905765425">Hurtiginfo-enhetskonvertering</translation> +<translation id="8960638196855923532">Nå kan du se varsler og apper på telefonen</translation> <translation id="8962051932294470566">Du kan kun dele én fil om gangen. Prøv på nytt når den nåværende overføringen er fullført.</translation> <translation id="8962083179518285172">Skjul detaljer</translation> <translation id="8962918469425892674">Dette nettstedet bruker bevegelses- eller lyssensorer.</translation> @@ -8289,6 +8297,7 @@ <translation id="9103868373786083162">Trykk for å gå tilbake, eller trykk på kontekstmenyen for å se loggen</translation> <translation id="9108035152087032312">Gi navn til &vinduet …</translation> <translation id="9108072915170399168">Gjeldende innstilling for databruk er Uten internett</translation> +<translation id="9108294543511800041">Nå kan du se telefonens nylige bilder, medier og varsler</translation> <translation id="9108674852930645435">Utforsk hva som er nytt på <ph name="DEVICE_TYPE" /></translation> <translation id="9108808586816295166">Sikker DNS er kanskje ikke tilgjengelig hele tiden</translation> <translation id="9109122242323516435">For å frigjøre plass, slett filer fra enhetslagringen.</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index d5afef9..65a8392 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1894,6 +1894,7 @@ <translation id="2775858145769350417">{NUM_APPS,plural, =1{Usuń 1 nieobsługiwaną aplikację}few{Usuń # nieobsługiwane aplikacje}many{Usuń # nieobsługiwanych aplikacji}other{Usuń # nieobsługiwanej aplikacji}}</translation> <translation id="2776560192867872731">Zmień nazwę urządzenia <ph name="DEVICE_NAME" /></translation> <translation id="2777251078198759550">Usuń ten kontener</translation> +<translation id="2778471504622896352">Dodaj aplikacje zdalne do Menu z aplikacjami w ChromeOS</translation> <translation id="2781692009645368755">Google Pay</translation> <translation id="2782104745158847185">Błąd podczas instalowania aplikacji na Linuksa</translation> <translation id="2783298271312924866">Pobrane</translation> @@ -3529,6 +3530,7 @@ <translation id="4390396490617716185"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /> i jeszcze <ph name="NUMBER_OF_OTHER_SWITCHES" /></translation> <translation id="439266289085815679">Konfiguracją Bluetooth zarządza <ph name="USER_EMAIL" />.</translation> <translation id="4392896746540753732">Edytuj plik konfiguracji</translation> +<translation id="4393713825278446281">Urządzenia obsługujące szybkie parowanie zostały zapisane na koncie <ph name="PRIMARY_EMAIL" /></translation> <translation id="4394049700291259645">Wyłącz</translation> <translation id="4396956294839002702">{COUNT,plural, =0{&Otwórz wszystkie}=1{&Otwórz zakładkę}few{&Otwórz wszystkie ({COUNT})}many{&Otwórz wszystkie ({COUNT})}other{&Otwórz wszystkie ({COUNT})}}</translation> <translation id="4397372003838952832">Nie musisz pamiętać tego hasła. Zostanie ono zapisane w usłudze <ph name="GOOGLE_PASSWORD_MANAGER" /> na koncie <ph name="EMAIL" />.</translation> @@ -3758,6 +3760,7 @@ <translation id="4615586811063744755">nie wybrano plików cookie</translation> <translation id="461661862154729886">Źródło energii</translation> <translation id="4617001782309103936">Za krótki</translation> +<translation id="4617019240346358451">Aby użyć rozszerzenia „<ph name="EXTENSION_NAME" />”, odśwież stronę</translation> <translation id="4617270414136722281">Opcje rozszerzeń</translation> <translation id="4617880081511131945">Nie można nawiązać połączenia</translation> <translation id="4619564267100705184">Potwierdź, że to Ty</translation> @@ -3907,6 +3910,7 @@ <translation id="4768332406694066911">Masz certyfikaty od tych organizacji potwierdzające Twoją tożsamość</translation> <translation id="4770119228883592393">Zgłoszono prośbę o uprawnienia. Aby odpowiedzieć, naciśnij ⌘ + Option + strzałka w dół.</translation> <translation id="4773112038801431077">Uaktualnij Linuksa</translation> +<translation id="4774337692467964393">Jeśli funkcja Smart Lock jest włączona, nie musisz podawać kodu PIN ani hasła</translation> <translation id="4775142426314270551">Pomóż ulepszać funkcje i działanie Chrome OS, automatycznie wysyłając do Google raporty o awariach, dane diagnostyczne i dane o korzystaniu. Niektóre dane zbiorcze pomagają również w opracowywaniu lepszych aplikacji na Androida i usług partnerów Google. Jeśli na koncie Google dziecka włączysz ustawienie Aktywność w internecie i aplikacjach, dane Androida z urządzenia dziecka mogą być zapisywane na jego koncie.</translation> <translation id="477647109558161443">Utwórz skrót na pulpicie</translation> <translation id="4776594120007763294">Aby dodać stronę, którą chcesz przeczytać później, kliknij ten przycisk</translation> @@ -3956,6 +3960,7 @@ <translation id="4820236583224459650">Ustaw jako zgłoszenie aktywne</translation> <translation id="4821935166599369261">&Profilowanie włączone</translation> <translation id="4823484602432206655">Odczyt i zmiana ustawień użytkownika oraz urządzenia</translation> +<translation id="4823894915586516138">Kod PIN lub hasło chronią dane znajdujące się na urządzeniu <ph name="DEVICE_TYPE" />, w tym wszystkie informacje, do których uzyskujesz dostęp z telefonu</translation> <translation id="4824037980212326045">Tworzenie i przywracanie kopii zapasowej Linuksa</translation> <translation id="4824958205181053313">Anulować synchronizację?</translation> <translation id="4827675678516992122">Nie udało się połączyć</translation> @@ -3971,6 +3976,7 @@ <translation id="4833683849865011483">Znaleziono jedną drukarkę na serwerze druku</translation> <translation id="4836504898754963407">Zarządzaj odciskami palców</translation> <translation id="4837128290434901661">Zmienić z powrotem na wyszukiwarkę Google?</translation> +<translation id="4837165100461973682">Aby zastosować zmiany, odśwież stronę</translation> <translation id="4837926214103741331">Nie masz uprawnień do korzystania z tego urządzenia. Aby uzyskać pozwolenie na logowanie się, skontaktuj się z jego właścicielem.</translation> <translation id="4837952862063191349">Aby odblokować i przywrócić dane lokalne, podaj swoje stare hasło do urządzenia <ph name="DEVICE_TYPE" />.</translation> <translation id="4838170306476614339">Wyświetlaj zdjęcia, pliki multimedialne i powiadomienia z telefonu</translation> @@ -4280,6 +4286,7 @@ <translation id="5150254825601720210">Nazwa serwera SSL certyfikatu firmy Netscape</translation> <translation id="5151354047782775295">Zwolnij miejsce na dysku albo wybierz dane, które mogą być usuwane automatycznie</translation> <translation id="5153234146675181447">Zapomnij telefon</translation> +<translation id="5153907427821264830"><ph name="STATUS" /> • <ph name="MESSAGE" /></translation> <translation id="5154108062446123722">Ustawienia zaawansowane dla <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Temat</translation> <translation id="5155327081870541046">Na pasku adresu wpisz skrót obszaru, w którym chcesz coś wyszukać, na przykład „@bookmarks”. Następnie naciśnij preferowany skrót klawiszowy i wpisz wyszukiwane słowa.</translation> @@ -5612,6 +5619,7 @@ <translation id="648927581764831596">Brak dostępnych</translation> <translation id="6490471652906364588">Urządzenie USB-C (prawy port)</translation> <translation id="6491376743066338510">Nieudana autoryzacja</translation> +<translation id="6492396476180293140">Kamerę wewnętrzną wyłączono przełącznikiem sprzętowym</translation> <translation id="6494327278868541139">Pokaż szczegóły silniejszej ochrony</translation> <translation id="6494445798847293442">To nie jest urząd certyfikacji</translation> <translation id="6494974875566443634">Dostosowywanie</translation> @@ -5917,6 +5925,7 @@ <translation id="6790497603648687708">Dodano zdalnie: <ph name="EXTENSION_NAME" /></translation> <translation id="6790820461102226165">Dodaj osobę...</translation> <translation id="6793604637258913070">Podświetlaj kursor tekstu, gdy się wyświetla lub porusza.</translation> +<translation id="6793879402816827484">↓ <ph name="STATUS" /></translation> <translation id="6795371939514004514">Automatyczne skanowanie pozwala przechodzić między elementami na ekranie automatycznie. Gdy element zostanie podświetlony, kliknij „Wybierz”, aby go aktywować.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Ups, coś poszło nie tak.</translation> @@ -7790,6 +7799,7 @@ <translation id="8642947597466641025">Powiększ tekst</translation> <translation id="8643443571868262066">Plik <ph name="FILE_NAME" /> może być niebezpieczny. Wysłać go do przeskanowania przez Ochronę zaawansowaną Google?</translation> <translation id="8644047503904673749">{COUNT,plural, =0{Nie ma plików cookie}=1{Zablokowano 1 plik cookie}few{Zablokowano # pliki cookie}many{Zablokowano # plików cookie}other{Zablokowano # pliku cookie}}</translation> +<translation id="864423554496711319">Urządzenia zapisane na Twoim koncie</translation> <translation id="8644655801811752511">Nie udało się zresetować tego klucza bezpieczeństwa. Spróbuj go zresetować zaraz po włożeniu.</translation> <translation id="8645354835496065562">Nadal zezwalaj na dostęp do czujników</translation> <translation id="8645920082661222035">Przewiduje niebezpieczne zdarzenia i ostrzega Cię przed nimi, zanim nastąpią</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 72345a3..1ef57881 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -3940,6 +3940,7 @@ <translation id="4768332406694066911">Imate potrdila teh organizacij, ki vas identificirajo</translation> <translation id="4770119228883592393">Zahtevano je dovoljenje; pritisnite ⌘ + Option + puščico dol, če se želite odzvati.</translation> <translation id="4773112038801431077">Nadgradnja Linuxa</translation> +<translation id="4774337692467964393">Če je funkcija Smart Lock vklopljena, vam ni treba vnesti kode PIN ali gesla.</translation> <translation id="4775142426314270551">Pomagajte izboljšati funkcije Chroma in sistema Chrome OS ter njuno delovanje s samodejnim pošiljanjem poročil o zrušitvah, diagnostičnih podatkov in podatkov o uporabi Googlu. Nekateri združeni podatki bodo prav tako v pomoč aplikacijam za Android in Googlovim partnerjem. Če ste za otrokov račun Google vklopili beleženje dejavnosti v spletu in aplikacijah, bodo podatki otrokove naprave Android morda shranjeni v njegovem računu Google.</translation> <translation id="477647109558161443">Ustvari bližnjico na namizju</translation> <translation id="4776594120007763294">Če želite dodati stran za poznejše branje, kliknite gumb.</translation> @@ -3989,6 +3990,7 @@ <translation id="4820236583224459650">Nastavi kot aktiven kartonček</translation> <translation id="4821935166599369261">&Profiliranje je omogočeno</translation> <translation id="4823484602432206655">Branje in spreminjanje nastavitev funkcij za ljudi s posebnimi potrebami</translation> +<translation id="4823894915586516138">Ta koda PIN ali geslo ščiti vaše podatke v napravi <ph name="DEVICE_TYPE" />, vključno z vsemi podatki, do katerih dostopate v telefonu.</translation> <translation id="4824037980212326045">Varnostno kopiranje in obnova v Linuxu</translation> <translation id="4824958205181053313">Želite preklicati sinhronizacijo?</translation> <translation id="4827675678516992122">Povezava ni mogoča</translation> @@ -5648,6 +5650,7 @@ <translation id="648927581764831596">Ni na voljo</translation> <translation id="6490471652906364588">Naprava USB-C (desna vrata)</translation> <translation id="6491376743066338510">Odobritev ni uspela</translation> +<translation id="6492396476180293140">Notranjo kamero je onemogočilo strojno stikalo.</translation> <translation id="6494327278868541139">Prikaz podatkov o izboljšani zaščiti</translation> <translation id="6494445798847293442">Ni overitelj potrdil</translation> <translation id="6494974875566443634">Prilagajanje</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index e42eed8a..566a45c6 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -1907,6 +1907,7 @@ <translation id="2775858145769350417">{NUM_APPS,plural, =1{Ukloni 1 nepodržanu aplikaciju}one{Ukloni # nepodržanu aplikaciju}few{Ukloni # nepodržane aplikacije}other{Ukloni # nepodržanih aplikacija}}</translation> <translation id="2776560192867872731">Promenite naziv uređaja <ph name="DEVICE_NAME" /></translation> <translation id="2777251078198759550">Izbriši ovaj kontejner</translation> +<translation id="2778471504622896352">Dodavanje daljinskih aplikacija u Chrome OS pokretač</translation> <translation id="2781692009645368755">Google Pay</translation> <translation id="2782104745158847185">Greška pri instaliranju Linux aplikacije</translation> <translation id="2783298271312924866">Preuzeto</translation> @@ -3542,6 +3543,7 @@ <translation id="4390396490617716185"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /> i još <ph name="NUMBER_OF_OTHER_SWITCHES" /> prekidača</translation> <translation id="439266289085815679">Konfiguraciju Bluetooth-a kontroliše <ph name="USER_EMAIL" />.</translation> <translation id="4392896746540753732">Izmenite datoteku konfiguracije</translation> +<translation id="4393713825278446281">Uređaji za brzo uparivanje su sačuvani na <ph name="PRIMARY_EMAIL" /></translation> <translation id="4394049700291259645">Onemogući</translation> <translation id="4396956294839002702">{COUNT,plural, =0{&Otvori sve}=1{&Otvori obeleživač}one{&Otvori sve ({COUNT})}few{&Otvori sve ({COUNT})}other{&Otvori sve ({COUNT})}}</translation> <translation id="4397372003838952832">Ne morate da zapamtite ovu lozinku. Biće sačuvana u alatki <ph name="GOOGLE_PASSWORD_MANAGER" /> za <ph name="EMAIL" />.</translation> @@ -3771,6 +3773,7 @@ <translation id="4615586811063744755">nijedan kolačić nije izabran</translation> <translation id="461661862154729886">Izvor energije</translation> <translation id="4617001782309103936">Prekratko</translation> +<translation id="4617019240346358451">Ponovo učitajte stranicu da biste koristili „<ph name="EXTENSION_NAME" />“</translation> <translation id="4617270414136722281">Opcije dodataka</translation> <translation id="4617880081511131945">Uspostavljanje veze nije uspelo</translation> <translation id="4619564267100705184">Potvrdite svoj identitet</translation> @@ -3986,6 +3989,7 @@ <translation id="4833683849865011483">Pronađen je 1 štampač sa servera za štampanje</translation> <translation id="4836504898754963407">Upravljajte otiscima prstiju</translation> <translation id="4837128290434901661">Želite li da se vratite na Google pretragu?</translation> +<translation id="4837165100461973682">Ponovo učitajte stranicu da biste primenili promene</translation> <translation id="4837926214103741331">Nemate ovlašćenje za korišćenje ovog uređaja. Kontaktirajte vlasnika uređaja da biste dobili dozvolu za prijavljivanje.</translation> <translation id="4837952862063191349">Da biste otključali pristup lokalnim podacima i vratili ih, unesite staru lozinku za uređaj <ph name="DEVICE_TYPE" />.</translation> <translation id="4838170306476614339">Pregledajte slike, medijski sadržaj i obaveštenja sa telefona</translation> @@ -4295,6 +4299,7 @@ <translation id="5150254825601720210">Naziv SSL servera Netscape sertifikata</translation> <translation id="5151354047782775295">Oslobodite prostor na disku ili će određeni podaci možda automatski biti izbrisani</translation> <translation id="5153234146675181447">Zaboravljanje telefona</translation> +<translation id="5153907427821264830"><ph name="STATUS" /> • <ph name="MESSAGE" /></translation> <translation id="5154108062446123722">Napredna podešavanja za <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Tema</translation> <translation id="5155327081870541046">U traci za adresu unesite prečicu za sajt koji želite da pretražite, na primer, „@bookmarks“. Zatim pritisnite željenu tastersku prečicu i unesite termin za pretragu.</translation> @@ -5934,6 +5939,7 @@ <translation id="6790497603648687708">Dodatak <ph name="EXTENSION_NAME" /> je dodat daljinski</translation> <translation id="6790820461102226165">Dodaj osobu...</translation> <translation id="6793604637258913070">Ističi kursor za tekst kada se pojavi ili kreće</translation> +<translation id="6793879402816827484">↓ <ph name="STATUS" /></translation> <translation id="6795371939514004514">Automatsko skeniranje vam omogućava da se automatski krećete kroz stavke na ekranu. Kada je stavka istaknuta, pritisnite Izaberi da biste je aktivirali.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Ups, nešto nije u redu.</translation> @@ -7806,6 +7812,7 @@ <translation id="8642947597466641025">Uvećaj tekst</translation> <translation id="8643443571868262066">Datoteka <ph name="FILE_NAME" /> je možda opasna. Želite li da je pošaljete u Google naprednu zaštitu radi skeniranja?</translation> <translation id="8644047503904673749">{COUNT,plural, =0{Bez kolačića}=1{1 kolačić je blokiran}one{# kolačić je blokiran}few{# kolačića su blokirana}other{# kolačića je blokirano}}</translation> +<translation id="864423554496711319">Uređaji sačuvani na nalogu</translation> <translation id="8644655801811752511">Resetovanje ovog bezbednosnog ključa nije uspelo. Resetujte ključ čim ga umetnete.</translation> <translation id="8645354835496065562">Nastavi da dozvoljavaš pristup senzorima</translation> <translation id="8645920082661222035">Otkriva opasne događaje pre nego što se dogode i upozorava vas na njih</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index cbe854d1..36a90f2 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1907,6 +1907,7 @@ <translation id="2775858145769350417">{NUM_APPS,plural, =1{Уклони 1 неподржану апликацију}one{Уклони # неподржану апликацију}few{Уклони # неподржане апликације}other{Уклони # неподржаних апликација}}</translation> <translation id="2776560192867872731">Промените назив уређаја <ph name="DEVICE_NAME" /></translation> <translation id="2777251078198759550">Избриши овај контејнер</translation> +<translation id="2778471504622896352">Додавање даљинских апликација у Chrome ОС покретач</translation> <translation id="2781692009645368755">Google Pay</translation> <translation id="2782104745158847185">Грешка при инсталирању Linux апликације</translation> <translation id="2783298271312924866">Преузето</translation> @@ -3542,6 +3543,7 @@ <translation id="4390396490617716185"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /> и још <ph name="NUMBER_OF_OTHER_SWITCHES" /> прекидача</translation> <translation id="439266289085815679">Конфигурацију Bluetooth-а контролише <ph name="USER_EMAIL" />.</translation> <translation id="4392896746540753732">Измените датотеку конфигурације</translation> +<translation id="4393713825278446281">Уређаји за брзо упаривање су сачувани на <ph name="PRIMARY_EMAIL" /></translation> <translation id="4394049700291259645">Онемогући</translation> <translation id="4396956294839002702">{COUNT,plural, =0{&Отвори све}=1{&Отвори обележивач}one{&Отвори све ({COUNT})}few{&Отвори све ({COUNT})}other{&Отвори све ({COUNT})}}</translation> <translation id="4397372003838952832">Не морате да запамтите ову лозинку. Биће сачувана у алатки <ph name="GOOGLE_PASSWORD_MANAGER" /> за <ph name="EMAIL" />.</translation> @@ -3771,6 +3773,7 @@ <translation id="4615586811063744755">ниједан колачић није изабран</translation> <translation id="461661862154729886">Извор енергије</translation> <translation id="4617001782309103936">Прекратко</translation> +<translation id="4617019240346358451">Поново учитајте страницу да бисте користили „<ph name="EXTENSION_NAME" />“</translation> <translation id="4617270414136722281">Опције додатака</translation> <translation id="4617880081511131945">Успостављање везе није успело</translation> <translation id="4619564267100705184">Потврдите свој идентитет</translation> @@ -3986,6 +3989,7 @@ <translation id="4833683849865011483">Пронађен је 1 штампач са сервера за штампање</translation> <translation id="4836504898754963407">Управљајте отисцима прстију</translation> <translation id="4837128290434901661">Желите ли да се вратите на Google претрагу?</translation> +<translation id="4837165100461973682">Поново учитајте страницу да бисте применили промене</translation> <translation id="4837926214103741331">Немате овлашћење за коришћење овог уређаја. Контактирајте власника уређаја да бисте добили дозволу за пријављивање.</translation> <translation id="4837952862063191349">Да бисте откључали приступ локалним подацима и вратили их, унесите стару лозинку за уређај <ph name="DEVICE_TYPE" />.</translation> <translation id="4838170306476614339">Прегледајте слике, медијски садржај и обавештења са телефона</translation> @@ -4295,6 +4299,7 @@ <translation id="5150254825601720210">Назив SSL сервера Netscape сертификата</translation> <translation id="5151354047782775295">Ослободите простор на диску или ће одређени подаци можда аутоматски бити избрисани</translation> <translation id="5153234146675181447">Заборављање телефона</translation> +<translation id="5153907427821264830"><ph name="STATUS" /> • <ph name="MESSAGE" /></translation> <translation id="5154108062446123722">Напредна подешавања за <ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Тема</translation> <translation id="5155327081870541046">У траци за адресу унесите пречицу за сајт који желите да претражите, на пример, „@bookmarks“. Затим притисните жељену тастерску пречицу и унесите термин за претрагу.</translation> @@ -5934,6 +5939,7 @@ <translation id="6790497603648687708">Додатак <ph name="EXTENSION_NAME" /> је додат даљински</translation> <translation id="6790820461102226165">Додај особу...</translation> <translation id="6793604637258913070">Истичи курсор за текст када се појави или креће</translation> +<translation id="6793879402816827484">↓ <ph name="STATUS" /></translation> <translation id="6795371939514004514">Аутоматско скенирање вам омогућава да се аутоматски крећете кроз ставке на екрану. Када је ставка истакнута, притисните Изабери да бисте је активирали.</translation> <translation id="6795884519221689054">Панда</translation> <translation id="6797493596609571643">Упс, нешто није у реду.</translation> @@ -7806,6 +7812,7 @@ <translation id="8642947597466641025">Увећај текст</translation> <translation id="8643443571868262066">Датотека <ph name="FILE_NAME" /> је можда опасна. Желите ли да је пошаљете у Google напредну заштиту ради скенирања?</translation> <translation id="8644047503904673749">{COUNT,plural, =0{Без колачића}=1{1 колачић је блокиран}one{# колачић је блокиран}few{# колачића су блокирана}other{# колачића је блокирано}}</translation> +<translation id="864423554496711319">Уређаји сачувани на налогу</translation> <translation id="8644655801811752511">Ресетовање овог безбедносног кључа није успело. Ресетујте кључ чим га уметнете.</translation> <translation id="8645354835496065562">Настави да дозвољаваш приступ сензорима</translation> <translation id="8645920082661222035">Открива опасне догађаје пре него што се догоде и упозорава вас на њих</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index e9a31b7..18dc893 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -3936,6 +3936,7 @@ <translation id="4768332406694066911">మిమ్మల్ని గుర్తించే ఈ సంస్థల నుండి మీకు ప్రమాణపత్రాలు ఉన్నాయి</translation> <translation id="4770119228883592393">అనుమతి కోసం రిక్వెస్ట్ చేశారు, ప్రతిస్పందించడానికి ⌘ + ఆప్షన్ + కింది వైపు బాణం గుర్తును నొక్కండి</translation> <translation id="4773112038801431077">Linuxను అప్గ్రేడ్ చేయండి</translation> +<translation id="4774337692467964393">Smart Lock ఆన్ చేసి ఉంటే, మీరు PIN లేదా పాస్వర్డ్ను ఎంటర్ చేయవలసిన అవసరం లేదు</translation> <translation id="4775142426314270551">క్రాష్ రిపోర్ట్లు, సమస్య విశ్లేషణలు, వినియోగ డేటాను ఆటోమేటిక్గా Googleకు పంపడం ద్వారా Chrome, అలాగే ChromeOS ఫీచర్ల పనితీరును మెరుగుపరచడంలో సహాయపడండి. కొంత సమగ్ర డేటా, Android యాప్లు, Google పార్ట్నర్లకు కూడా సహాయపడుతుంది. మీ చిన్నారి Google ఖాతాకు అదనపు వెబ్ & యాప్ యాక్టివిటీ సెట్టింగ్ను ఆన్ చేసినట్లయితే, మీ చిన్నారి Android డేటా మీ చిన్నారి Google ఖాతాలో సేవ్ చేయబడవచ్చు.</translation> <translation id="477647109558161443">డెస్క్టాప్ షార్ట్కట్ను క్రియేట్ చేయండి</translation> <translation id="4776594120007763294">'తర్వాత చదవండి' మెనూకు పేజీని జోడించడానికి, బటన్ను క్లిక్ చేయండి</translation> @@ -3985,6 +3986,7 @@ <translation id="4820236583224459650">యాక్టివ్ టిక్కెట్గా సెట్ చేయి</translation> <translation id="4821935166599369261">&ప్రొఫైలింగ్ అనుమతించబడింది</translation> <translation id="4823484602432206655">వినియోగదారు మరియు పరికర సెట్టింగ్లను చదవడానికి మరియు మార్చడానికి అనుమతి</translation> +<translation id="4823894915586516138">మీరు మీ ఫోన్ నుండి యాక్సెస్ చేసే ఏదైనా సమాచారంతో పాటు, ఈ <ph name="DEVICE_TYPE" />లో ఉన్న డేటాను ఈ PIN లేదా పాస్వర్డ్ రక్షిస్తుంది</translation> <translation id="4824037980212326045">Linux బ్యాకప్ చేసి, పునరుద్ధరించడం</translation> <translation id="4824958205181053313">సింక్ను రద్దు చేయాలా?</translation> <translation id="4827675678516992122">కనెక్ట్ చేయడం సాధ్యపడలేదు</translation> @@ -5642,6 +5644,7 @@ <translation id="648927581764831596">ఏవీ అందుబాటులో లేవు</translation> <translation id="6490471652906364588">USB-C పరికరం (కుడి పోర్ట్)</translation> <translation id="6491376743066338510">ప్రామాణీకరణ విఫలమైంది</translation> +<translation id="6492396476180293140">హార్డ్వేర్ స్విచ్ ద్వారా అంతర్గత కెమెరా డీయాక్టివేట్ చేయబడింది</translation> <translation id="6494327278868541139">మెరుగైన భద్రతా వివరాలను చూపించు</translation> <translation id="6494445798847293442">ప్రమాణపత్రాలను మంజూరు చేసే అధికార సంస్థ కాదు</translation> <translation id="6494974875566443634">అనుకూలీకరణ</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index aae8eb5e..82b81978 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -3918,6 +3918,7 @@ <translation id="4768332406694066911">Sizi tanımlayan şu kuruluşlardan sertifikalarınız var</translation> <translation id="4770119228883592393">İzin istendi, yanıtlamak için ⌘ + Option + Aşağı ok tuşlarına basın</translation> <translation id="4773112038801431077">Linux'u yeni sürüme geçirin</translation> +<translation id="4774337692467964393">Smart Lock açıksa PIN veya şifre girmeniz gerekmez</translation> <translation id="4775142426314270551">Kilitlenme raporlarının yanı sıra teşhis ve kullanım verilerini Google'a otomatik olarak göndererek Chrome ve ChromeOS özellikleri ile performansını iyileştirmeye yardımcı olun. Bazı birleştirilmiş veriler, Android uygulamalarına ve Google iş ortaklarına da yardımcı olur. Çocuğunuzun Google Hesabında Web ve Uygulama Etkinliği ayarı açıksa çocuğunuzun Android verileri Google Hesabına kaydedilebilir.</translation> <translation id="477647109558161443">Masaüstü kısayolu oluştur</translation> <translation id="4776594120007763294">Daha sonra okunacak bir sayfa eklemek için düğmeyi tıklayın</translation> @@ -3967,6 +3968,7 @@ <translation id="4820236583224459650">Aktif bilet olarak ayarla</translation> <translation id="4821935166599369261">&Profil Oluşturma Etkin</translation> <translation id="4823484602432206655">Kullanıcı ve cihaz ayarlarını okuma ve değiştirme</translation> +<translation id="4823894915586516138">Bu PIN veya şifre, telefonunuzdan eriştiğiniz bilgiler de dahil olmak üzere <ph name="DEVICE_TYPE" /> cihazındaki verilerinizi korur</translation> <translation id="4824037980212326045">Linux yedekleme ve geri yükleme</translation> <translation id="4824958205181053313">Senkronizasyon iptal edilsin mi?</translation> <translation id="4827675678516992122">Bağlanılamadı</translation> @@ -5625,6 +5627,7 @@ <translation id="648927581764831596">Hiçbiri mevcut değil</translation> <translation id="6490471652906364588">USB-C cihaz (sağ bağlantı noktası)</translation> <translation id="6491376743066338510">Yetkilendirme başarısız oldu</translation> +<translation id="6492396476180293140">Dahili kamera, donanım anahtarı tarafından devre dışı bırakıldı</translation> <translation id="6494327278868541139">Gelişmiş koruma ayrıntılarını göster</translation> <translation id="6494445798847293442">Sertifika Yetkilisi değil</translation> <translation id="6494974875566443634">Özelleştirme</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 9c004a8..95e5f0d 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -1545,6 +1545,7 @@ <translation id="2433836460518180625">صرف آلہ غیر مقفل کریں</translation> <translation id="2434449159125086437">پرنٹر سیٹ اپ نہیں ہو سکتا۔ براہ کرم کنفیگریشن چیک کریں اور دوبارہ کوشش کریں۔</translation> <translation id="2434758125294431199">منتخب کریں کہ کون آپ کے ساتھ اشتراک کرسکتا ہے</translation> +<translation id="2434915728183570229">اب آپ اپنے فون کی ایپس دیکھ سکتے ہیں</translation> <translation id="2435137177546457207">Google Chrome اور ChromeOS Flex کی اضافی شرائط</translation> <translation id="2435248616906486374">نیٹ ورک منقطع ہوگیا</translation> <translation id="2435457462613246316">پاس ورڈ دکھائیں</translation> @@ -4223,6 +4224,7 @@ <translation id="5072900412896857127">Google Play سروس کی شرائط کو لوڈ نہیں کیا جا سکتا ہے۔ براہ کرم اپنا نیٹ ورک کنکشن چیک کریں اور دوبارہ کوشش کریں۔</translation> <translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" />،<ph name="FILE2" />}other{<ph name="FILE1" />،<ph name="FILE2" />، اور # مزید}}</translation> <translation id="5074318175948309511">نئی ترتیبات مؤثر ہونے سے پہلے اس صفحہ کو دوبارہ لوڈ کرنے کی ضرورت پڑ سکتی ہے۔</translation> +<translation id="5074761966806028321">سیٹ اپ مکمل کرنے کے لیے ابھی بھی اجازت درکار ہے</translation> <translation id="5075910247684008552">محفوظ سائٹس پر غیر محفوظ مواد بذریعہ ڈیفالٹ مسدود ہوتا ہے</translation> <translation id="5078638979202084724">سبھی ٹیبز کو بُک مارک کریں</translation> <translation id="5078796286268621944">غلط PIN</translation> @@ -4584,6 +4586,7 @@ <translation id="5449551289610225147">غلط پاس ورڈ</translation> <translation id="5449588825071916739">سبھی ٹیبز کا بُک مارک بنائیں</translation> <translation id="5449716055534515760">&ونڈو بند کردیں</translation> +<translation id="5452446625764825792">اب آپ اپنے فون کی حالیہ تصاویر، میڈیا اور ایپس دیکھ سکتے ہیں</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (آف لائن کام کرتی ہے)</translation> <translation id="5454166040603940656"><ph name="PROVIDER" /> کے ساتھ</translation> <translation id="545484289444831485">تلاش کے مزید نتائج دیکھیں</translation> @@ -4644,6 +4647,7 @@ <translation id="5499211612787418966">فی الحال اس ڈائیلاگ پر فوکس نہیں کیا گیا۔ اس ڈائیلاگ پر فوکس کرنے کے لیے Alt-Shift A دبائیں۔</translation> <translation id="5499313591153584299">یہ فائل آپ کے کمپیوٹر کیلئے نقصاندہ ہو سکتی ہے۔</translation> <translation id="5499453227627332024">آپ کے Linux Container کیلئے ایک اپ گریڈ دستیاب ہے۔ آپ بعد میں ترتیبات ایپ سے بھی اپ گریڈ کر سکتے ہیں۔</translation> +<translation id="5499476581866658341">اب آپ اپنے فون کی حالیہ تصاویر اور میڈیا دیکھ سکتے ہیں</translation> <translation id="549957179819296104">نیا آئیکن</translation> <translation id="5500168250243071806">سائن ان ہونے پر آپ کے Google اکاؤنٹ میں <ph name="BEGIN_LINK_SEARCH" />تلاش کی سرگزشت<ph name="END_LINK_SEARCH" /> اور <ph name="BEGIN_LINK_GOOGLE" />دیگر اقسام کی سرگرمی<ph name="END_LINK_GOOGLE" /> محفوظ ہو سکتی ہے۔ آپ انہیں کسی بھی وقت حذف کر سکتے ہیں۔</translation> <translation id="5500709606820808700">سیفٹی چیک آج کیا گیا</translation> @@ -6307,6 +6311,7 @@ <translation id="7152478047064750137">اس ایکسٹینشن کو کوئی خاص اجازتیں درکار نہیں ہیں</translation> <translation id="7154130902455071009">اپنے شروعاتی صفحہ کو اس پر تبدیل کریں: <ph name="START_PAGE" /></translation> <translation id="7155171745945906037">کیمرے یا فائل سے موجودہ تصویر</translation> +<translation id="7160182524506337403">اب آپ اپنے فون کی اطلاعات دیکھ سکتے ہیں</translation> <translation id="7163202347044721291">فعالیت کے کوڈ کی توثیق کی جا رہی ہے...</translation> <translation id="716640248772308851">"<ph name="EXTENSION" />" نشان زد مقامات میں تصاویر، ویڈیوز اور آواز والی فائلیں پڑھ سکتا ہے۔</translation> <translation id="7167486101654761064">اس قسم کی فائلیں &ہمیشہ کھولیں</translation> @@ -7320,6 +7325,7 @@ <translation id="8138997515734480534"><ph name="VM_NAME" /> کا اسٹیٹس</translation> <translation id="8139447493436036221">Google Drive فائلز</translation> <translation id="8140070492745508800"><ph name="FIRST_DEVICE" />، <ph name="SECOND_DEVICE" /></translation> +<translation id="8141418916163800697">آپ فون ہب کی ترتیبات میں مزید خصوصیات سیٹ اپ کر سکتے ہیں</translation> <translation id="8141584439523427891">اب متبادل براؤزر میں کھل رہا ہے</translation> <translation id="8141725884565838206">اپنے پاس ورڈز کا نظم کریں</translation> <translation id="814204052173971714">{COUNT,plural, =1{ایک ویڈیو}other{# ویڈیوز}}</translation> @@ -7527,6 +7533,7 @@ <translation id="833986336429795709">یہ لنک کھولنے کیلئے، ایک ایپ منتخب کریں</translation> <translation id="8342221978608739536">کوشش نہیں کی</translation> <translation id="8342861492835240085">ایک مجموعہ منتخب کریں</translation> +<translation id="8345848587667658367">اب آپ اپنے فون کی حالیہ تصاویر، میڈیا، اطلاعات اور ایپس دیکھ سکتے ہیں</translation> <translation id="8347227221149377169">پرنٹ جابز</translation> <translation id="834785183489258869">پوشیدگی موڈ میں ہونے پر سائٹس مختلف سائٹس میں آپ کی براؤزنگ سرگرمی کو دیکھنے کے لیے آپ کی کوکیز کا استعمال نہیں کر سکتیں، مثال کے طور پر اشتہارات کو ذاتی نوعیت کا بنانا۔ ہو سکتا ہے کہ کچھ سائٹس پر خصوصیات کام نہ کریں۔</translation> <translation id="8350789879725387295">ڈاک میں اسٹائلس ٹولز</translation> @@ -8131,6 +8138,7 @@ <translation id="8957757410289731985">پروفائل حسب ضرورت بنائیں</translation> <translation id="895944840846194039">JavaScript میموری</translation> <translation id="8960208913905765425">فوری جوابات یونٹ کی تبدیلی</translation> +<translation id="8960638196855923532">اب آپ اپنے فون کی اطلاعات اور ایپس دیکھ سکتے ہیں</translation> <translation id="8962051932294470566">آپ ایک وقت میں صرف ایک فائل کا اشتراک کر سکتے ہیں۔ موجودہ منتقلی مکمل ہونے پر دوبارہ کوشش کریں۔</translation> <translation id="8962083179518285172">تفصیلات چھپائیں</translation> <translation id="8962918469425892674">یہ سائٹ موشن یا لائٹ سینسرز کا استعمال کر رہی ہے۔</translation> @@ -8282,6 +8290,7 @@ <translation id="9103868373786083162">پیچھے جانے کیلئے دبائیں، سرگزشت دیکھنے کیلئے سیاق وسباق کا مینو</translation> <translation id="9108035152087032312">ونڈو کا نام رکھیں...</translation> <translation id="9108072915170399168">موجودہ ڈیٹا استعمال کی ترتیب بغیر انٹرنیٹ کے ہے</translation> +<translation id="9108294543511800041">اب آپ اپنے فون کی حالیہ تصاویر، میڈیا اور اطلاعات دیکھ سکتے ہیں</translation> <translation id="9108674852930645435">دیکھیں کہ آپ کے <ph name="DEVICE_TYPE" /> پر نیا کیا ہے</translation> <translation id="9108808586816295166">ممکن ہے کہ محفوظ DNS ہر وقت دستیاب نہ ہو</translation> <translation id="9109122242323516435">جگہ خالی کرنے کیلئے، آلہ کے اسٹوریج سے فائلیں حذف کریں۔</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 75f99f28..9ddce10 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -1910,6 +1910,7 @@ <translation id="2775858145769350417">{NUM_APPS,plural, =1{1 ta mos kelmaydigan iovani olib tashlang}other{# ta mos kelmaydigan iovani olib tashlang}}</translation> <translation id="2776560192867872731"><ph name="DEVICE_NAME" /> uchun qurilma nomini oʻzgartirish</translation> <translation id="2777251078198759550">Bu konteynerni oʻchirish</translation> +<translation id="2778471504622896352">Ilovalarni masofadan ChromeOS ishga tushirgichiga qoʻshish</translation> <translation id="2781692009645368755">Google Pay</translation> <translation id="2782104745158847185">Linux ilovasini o‘rnatishda xatolik yuz berdi</translation> <translation id="2783298271312924866">Yuklab olingan</translation> @@ -3545,6 +3546,7 @@ <translation id="4390396490617716185"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" /> va yana <ph name="NUMBER_OF_OTHER_SWITCHES" /> ta kalit tugma</translation> <translation id="439266289085815679">Tarmoq sozlamalari <ph name="USER_EMAIL" /> tomonidan boshqariladi.</translation> <translation id="4392896746540753732">Konfiguratsiya faylini tahrirlash</translation> +<translation id="4393713825278446281">Tezkor ulanadigan qurilmalarga <ph name="PRIMARY_EMAIL" /> hisobingizga saqlandi</translation> <translation id="4394049700291259645">Faolsizlantirish</translation> <translation id="4396956294839002702">{COUNT,plural, =0{Barchasini &ochish}=1{Bukmarkni &ochish}other{Barchasini ({COUNT}) &ochish}}</translation> <translation id="4397372003838952832">Bu parolni eslab qolishingiz shart emas. <ph name="EMAIL" /> hisobining paroli <ph name="GOOGLE_PASSWORD_MANAGER" />ga saqlanadi</translation> @@ -3775,6 +3777,7 @@ <translation id="4615586811063744755">cookie fayllari tanlanmadi</translation> <translation id="461661862154729886">Energiya manbai</translation> <translation id="4617001782309103936">Juda qisqa</translation> +<translation id="4617019240346358451">“<ph name="EXTENSION_NAME" />” ishlatish uchun sahifani yangilang</translation> <translation id="4617270414136722281">Kengaytma parametrlari</translation> <translation id="4617880081511131945">Aloqa oʻrnatilmadi</translation> <translation id="4619564267100705184">Bu siz ekaningizni isbotlang</translation> @@ -3990,6 +3993,7 @@ <translation id="4833683849865011483">Bosma serverda 1 ta printer topildi</translation> <translation id="4836504898754963407">Barmoq izlari</translation> <translation id="4837128290434901661">Google Qidiruviga qaytarilsinmi?</translation> +<translation id="4837165100461973682">Oʻzgarishlar amalga oshishi uchun sahifani yangilang</translation> <translation id="4837926214103741331">Ushbu qurilmaga ruxsatingiz yo‘q. Qurilma egasi bilan bog‘laning.</translation> <translation id="4837952862063191349">Qulfdan chiqarish va ma’lumotlarni tiklash uchun <ph name="DEVICE_TYPE" /> qurilmasining eski parolini kiriting.</translation> <translation id="4838170306476614339">Telefondagi suratlar, media fayllar va bildirishnomalarni ochish</translation> @@ -4299,6 +4303,7 @@ <translation id="5150254825601720210">Netscape SSL sertifikat serveri nomi</translation> <translation id="5151354047782775295">Diskdan joy bo‘shating yoki avtomatik o‘chirilishi mumkin bo‘lgan ma’lumotlarni tanlang</translation> <translation id="5153234146675181447">Telefonni unutish</translation> +<translation id="5153907427821264830"><ph name="STATUS" /> • <ph name="MESSAGE" /></translation> <translation id="5154108062446123722"><ph name="PRINTING_DESTINATION" /> – kengaytirilgan sozlamalar</translation> <translation id="5154702632169343078">Subyekt</translation> <translation id="5155327081870541046">Manzil qatorida qidiriladigan sayt uchun “@bookmarks” kabi buyruqni kiriting. Keyin oldindan belgilangan tezkor tugmani bosib, qidiruv iborasini kiriting.</translation> @@ -5934,6 +5939,7 @@ <translation id="6790497603648687708"><ph name="EXTENSION_NAME" /> kengaytmasi masofadan qo‘shildi</translation> <translation id="6790820461102226165">Foydalanuvchini qo‘shish...</translation> <translation id="6793604637258913070">Matnni kiritish nuqtasi paydo bo‘lganda yoki siljiganda ajratib ko‘rsatilsin.</translation> +<translation id="6793879402816827484">↓ <ph name="STATUS" /></translation> <translation id="6795371939514004514">Avto-skanerlash yordamida ekrandagi narsalar avtomatik varaqlanadi. Kerakli narsa belgilanganda, uni faollashtirish uchun “Tanlash” tugmasini bosing.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Xatolik sodir bo‘ldi.</translation> @@ -7805,6 +7811,7 @@ <translation id="8642947597466641025">Matnni yiriklashtirish</translation> <translation id="8643443571868262066"><ph name="FILE_NAME" /> fayli xavfli boʻlishi mumkin. Tekshirish uchun Google kengaytirilgan himoya tizimiga yuborilsinmi?</translation> <translation id="8644047503904673749">{COUNT,plural, =0{Cookie fayllar yoʻq}=1{1 ta cookie fayl bloklandi}other{# ta cookie fayl bloklandi}}</translation> +<translation id="864423554496711319">Qurilmalar hisobingizga saqlandi</translation> <translation id="8644655801811752511">Bu elektron kalit sozlamalari qayta tiklanmaydi Elektron kalit ulanishi bilan, uning sozlamalarini qayta tiklash mumkin</translation> <translation id="8645354835496065562">Sensordan foydalanishga ruxsat berilsin</translation> <translation id="8645920082661222035">Xavfli tahdidlarni aniqlaydi va sizni ulardan himoya qiladi</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index c8c43e0..253d88f 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -1924,6 +1924,7 @@ <translation id="2775858145769350417">{NUM_APPS,plural, =1{Susa i-app e-1 engasasekelwa}one{Susa ama-app angu-# angasasekelwa}other{Susa ama-app angu-# angasasekelwa}}</translation> <translation id="2776560192867872731">Sesha igama ledivayisi le-<ph name="DEVICE_NAME" /></translation> <translation id="2777251078198759550">Sula lesi siqukathi</translation> +<translation id="2778471504622896352">Engeza ama-app akude kwisiqalisi se-ChromeOS</translation> <translation id="2781692009645368755">I-Google Pay</translation> <translation id="2782104745158847185">Iphutha ukufaka uhlelo lokusebenza le-Linux</translation> <translation id="2783298271312924866">Landiwe</translation> @@ -3558,6 +3559,7 @@ <translation id="4390396490617716185"><ph name="FIRST_SWITCH" />, <ph name="SECOND_SWITCH" />, <ph name="THIRD_SWITCH" />, kanye namaswishi angu-<ph name="NUMBER_OF_OTHER_SWITCHES" /> ngaphezulu</translation> <translation id="439266289085815679">Ukulungiswa kwe-Bluetooth kulawula ngu-<ph name="USER_EMAIL" />.</translation> <translation id="4392896746540753732">Hlela ifayela lokulungiselelwa</translation> +<translation id="4393713825278446281">Amadivayisi Wokuhlanganisa okusheshayo alondolozwe ku-<ph name="PRIMARY_EMAIL" /></translation> <translation id="4394049700291259645">Khubaza</translation> <translation id="4396956294839002702">{COUNT,plural, =0{&Vula konke}=1{&Vula ibhukhimakhi}one{&Vula konke ({COUNT})}other{&Vula konke ({COUNT})}}</translation> <translation id="4397372003838952832">Ngeke kudingeke ukuthi ukhumbule le phasiwedi. Izolondolozwa ku-<ph name="GOOGLE_PASSWORD_MANAGER" /> ye-<ph name="EMAIL" />.</translation> @@ -3788,6 +3790,7 @@ <translation id="4615586811063744755">awekho amakhukhi akhethiwe</translation> <translation id="461661862154729886">Umthombo wamandla</translation> <translation id="4617001782309103936">Mfushane kakhulu</translation> +<translation id="4617019240346358451">Layisha kabusha ikhasi ukuze usebenzise i-"<ph name="EXTENSION_NAME" />"</translation> <translation id="4617270414136722281">Izinketho zesandiso</translation> <translation id="4617880081511131945">Ayikwazi ukusungula uxhumano</translation> <translation id="4619564267100705184">Qinisekisa ukuthi nguwe</translation> @@ -3937,6 +3940,7 @@ <translation id="4768332406694066911">Unezitifiketi ezivela kulezi zinhlangano ezikukhombayo</translation> <translation id="4770119228883592393">Imvume iceliwe, cindezela u-⌘ + Option + Umcibisholo waphansi ukuze uphendule</translation> <translation id="4773112038801431077">Thuthukisa i-Linux</translation> +<translation id="4774337692467964393">Uma i-Smart Lock ivuliwe, ngeke udinge ukufaka i-PIN noma iphasiwedi</translation> <translation id="4775142426314270551">Siza ukuthuthukisa izakhi nokusebenza kwe-Chrome ne-ChromeOS ngokuthumela ngokuzenzakalelayo imibiko yokusaphazeka kanye nedatha yokuxilonga neyokusetshenziswa ku-Google. Enye idatha ehlanganisiwe izosiza nama-app we-Android nozakwethu be-Google. Uma isethingi Lomsebenzi Wewebhu newe-App livuliwe ku-Google Account yengane yakho, idatha ye-Android yengane yakho ingase ilondolozwe ku-Google Account yengane yakho.</translation> <translation id="477647109558161443">Dala isinqamuleli sedeskithophu</translation> <translation id="4776594120007763294">Ukwengeza ikhasi ukuze ulifunde ngemuva kwesikhathi, chofoza inkinobho</translation> @@ -3986,6 +3990,7 @@ <translation id="4820236583224459650">Setha njengethikithi elisebenzayo</translation> <translation id="4821935166599369261">Ukwenza iphrofayela kunikwe amandla</translation> <translation id="4823484602432206655">Funda uphinde uguqule izilungiselelo zomsebenzisi nedivayisi</translation> +<translation id="4823894915586516138">Le phinikhodi noma iphasiwedi ivikela idatha yakho kule <ph name="DEVICE_TYPE" />, kufaka phakathi noma uluphi ulwazi olufinyelelayo kusuka efonini yakho</translation> <translation id="4824037980212326045">Yenza ikhophi yasenqolobaneni futhi ubuyisele i-Linux</translation> <translation id="4824958205181053313">Khansela ukuvumelanisa?</translation> <translation id="4827675678516992122">Ayikwazanga ukuxhuma</translation> @@ -4001,6 +4006,7 @@ <translation id="4833683849865011483">Kutholakele iphrinti engu-1 kusuka kuseva yokuphrinta</translation> <translation id="4836504898754963407">Phatha izigxivizo zeminwe</translation> <translation id="4837128290434901661">Ushintshela emuva Ekusesheni ku-Google?</translation> +<translation id="4837165100461973682">Layisha kabusha ikhasi ukuze wenze izinguquko zakho zisebenze</translation> <translation id="4837926214103741331">Awugunyaziwe ukuze usebenzise le divayisi. Sicela uxhumane nomnikazi wedivayisi ngemvume yokubhalisa.</translation> <translation id="4837952862063191349">Ukuze uvule futhi ulondoloze idatha yendawo, sicela ufake iphasiwedi yakudala ye-<ph name="DEVICE_TYPE" />.</translation> <translation id="4838170306476614339">Buka izithombe zefoni yakho, imidiya, nezaziso</translation> @@ -4310,6 +4316,7 @@ <translation id="5150254825601720210">Igama leseva ye-SSL yesitifiketi se-Netscape</translation> <translation id="5151354047782775295">Ukukhulula isikhala sediski noma idatha ekhethiwe ingasuswa ngokuzenzakalela</translation> <translation id="5153234146675181447">Khohlwa ifoni</translation> +<translation id="5153907427821264830"><ph name="STATUS" /> • <ph name="MESSAGE" /></translation> <translation id="5154108062446123722">Izilungiselelo ezithuthukile ze-<ph name="PRINTING_DESTINATION" /></translation> <translation id="5154702632169343078">Isihloko</translation> <translation id="5155327081870541046">Kwibha yekheli, faka isinqamuleli sesayithi ofuna ukulisesha, njenge-"@bookmarks". Bese, cindezela isinqamuleli sekhibhodi, futhi ufake itemu yakho yosesho.</translation> @@ -5646,6 +5653,7 @@ <translation id="648927581764831596">Lutho olutholakalayo</translation> <translation id="6490471652906364588">Idivayisi ye-USB-C (imbobo engakwesokudla)</translation> <translation id="6491376743066338510">Ukugunyazwa kuhlulekile</translation> +<translation id="6492396476180293140">Ikhamera yangaphakathi iyekiswe ukusebenza ngeswishi yehadiwe</translation> <translation id="6494327278868541139">Bonisa imininingwane yokuvikeleka okuthuthukisiwe</translation> <translation id="6494445798847293442">Akulona Igunya Lokuqinisekisa</translation> <translation id="6494974875566443634">Ukwenza ngokwezifiso</translation> @@ -5949,6 +5957,7 @@ <translation id="6790497603648687708">U-<ph name="EXTENSION_NAME" /> ungezwe kude</translation> <translation id="6790820461102226165">Engeza umuntu...</translation> <translation id="6793604637258913070">Gqamisa ikharethi yombhalo uma ivela noma ihamba</translation> +<translation id="6793879402816827484">↓ <ph name="STATUS" /></translation> <translation id="6795371939514004514">Ukuskena okuzenzakalelayo kukuvumela ukuthi udlule ezintweni ezisesikrinini ngokuzenzakalelayo. Uma into igqanyisiwe, cindezela “Khetha” ukuze uyisebenzise.</translation> <translation id="6795884519221689054">I-Panda</translation> <translation id="6797493596609571643">Eshu, kukhona into engahambanga kahle.</translation> @@ -7820,6 +7829,7 @@ <translation id="8642947597466641025">Yenza umbhalo ube mkhulu</translation> <translation id="8643443571868262066">I-<ph name="FILE_NAME" /> ingaba yingozi. Thumela Ekuvikelweni Okuthuthukile kwe-Google ukuze kuskenwe?</translation> <translation id="8644047503904673749">{COUNT,plural, =0{Awekhho amakhukhi}=1{ikhukhi e-1 ivinjelwe}one{amakhukhi angu-# avinjelwe}other{amakhukhi angu-# avinjelwe}}</translation> +<translation id="864423554496711319">Amadivayisi alondolozwe ku-akhawunti yakho</translation> <translation id="8644655801811752511">Ayikwazi ukusetha kabusha lo khiye wokuqinisekisa ubunikazi. Zama ukusetha kabusha ukhiye ngokushesha ngemuva kokuwufaka.</translation> <translation id="8645354835496065562">Qhubeka uvumele ukufinyelela kwenzwa</translation> <translation id="8645920082661222035">Ibikezela futhi ikuxwayisa ngemicimbi eyingozi ngaphambi kokuthi yenzeke</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb index 3d7dfc4c..3f5ac2d 100644 --- a/chrome/app/resources/google_chrome_strings_no.xtb +++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -363,7 +363,7 @@ <translation id="8999208279178790196">{0,plural, =0{En Chrome-oppdatering er tilgjengelig}=1{En Chrome-oppdatering er tilgjengelig}other{En Chrome-oppdatering har vært tilgjengelig i # dager}}</translation> <translation id="9053892488859122171">ChromeOS Flex-system</translation> <translation id="9067395829937117663">Google Chrome krever Windows 7 eller nyere.</translation> -<translation id="911206726377975832">Vil du slette all nettleserdata også?</translation> +<translation id="911206726377975832">Vil du slette all nettlesingsdata også?</translation> <translation id="9138603949443464873">For å bruke endringene dine må du starte Chrome på nytt</translation> <translation id="9195993889682885387">Chrome kan anslå interessene dine basert på nettleserloggen din fra de siste ukene. Denne informasjonen blir værende på enheten din.</translation> <translation id="919706545465235479">Oppdater Chrome for å starte synkroniseringen</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 2c668fc..524cb9a0 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1943,6 +1943,7 @@ "//base/allocator:buildflags", "//build:branding_buildflags", "//build:chromeos_buildflags", + "//build/config/chromebox_for_meetings:buildflags", "//build/config/compiler:compiler_buildflags", "//cc", "//chrome:extra_resources", @@ -2025,7 +2026,6 @@ "//chrome/common/notifications", "//chrome/installer/util:with_no_strings", "//chrome/services/speech/buildflags", - "//chromeos/components/chromebox_for_meetings/buildflags", "//components/assist_ranker", "//components/autofill/content/browser", "//components/autofill/core/browser", @@ -5096,7 +5096,6 @@ "//chromeos/ash/components/dbus/concierge", "//chromeos/ash/components/dbus/session_manager", "//chromeos/ash/components/memory", - "//chromeos/components/chromebox_for_meetings/buildflags", "//chromeos/components/feature_usage", "//chromeos/components/local_search_service", "//chromeos/components/local_search_service/public/cpp:cpp", @@ -5247,6 +5246,8 @@ "chrome_browser_main_parts_lacros.h", "chromeos/app_mode/app_session.cc", "chromeos/app_mode/app_session.h", + "chromeos/app_mode/app_session_browser_window_handler.cc", + "chromeos/app_mode/app_session_browser_window_handler.h", "chromeos/app_mode/chrome_kiosk_app_installer.cc", "chromeos/app_mode/chrome_kiosk_app_installer.h", "chromeos/app_mode/chrome_kiosk_app_launcher.cc",
diff --git a/chrome/browser/android/preferences/autofill/autofill_profile_bridge.cc b/chrome/browser/android/preferences/autofill/autofill_profile_bridge.cc index 26322128..d4941e9 100644 --- a/chrome/browser/android/preferences/autofill/autofill_profile_bridge.cc +++ b/chrome/browser/android/preferences/autofill/autofill_profile_bridge.cc
@@ -11,6 +11,7 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/android/chrome_jni_headers/AutofillProfileBridge_jni.h" #include "chrome/browser/browser_process.h" +#include "components/autofill/core/browser/autofill_address_util.h" #include "components/autofill/core/browser/geo/autofill_country.h" #include "content/public/browser/web_contents.h" #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_field.h" @@ -117,6 +118,8 @@ std::string country_code = ConvertJavaStringToUTF8(env, j_country_code); std::vector<AddressUiComponent> ui_components = BuildComponents( country_code, localization, language_code, &best_language_tag); + ExtendAddressComponents(ui_components, country_code, localization, + /*include_literals=*/false); for (const auto& ui_component : ui_components) { component_labels.push_back(ui_component.name);
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index de865fb..a1a128a 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn
@@ -2,10 +2,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/ozone.gni") import("//chromeos/ash/components/hibernate/buildflags.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//extensions/buildflags/buildflags.gni") assert(enable_extensions, "Ash Chrome has to be built with extensions") @@ -2203,6 +2203,7 @@ "//ash/webui/shimless_rma", "//base:i18n", "//build:branding_buildflags", + "//build/config/chromebox_for_meetings:buildflags", "//cc/base", "//chrome/app:chromium_strings", "//chrome/app:command_ids", @@ -2257,7 +2258,6 @@ "//chromeos/ash/components/hibernate:buildflags", "//chromeos/ash/components/oobe_quick_start", "//chromeos/components/cdm_factory_daemon:cdm_factory_daemon_browser", - "//chromeos/components/chromebox_for_meetings/buildflags", "//chromeos/components/disks:prefs", "//chromeos/components/local_search_service/public/cpp", "//chromeos/components/mojo_bootstrap", @@ -2292,8 +2292,8 @@ "//chromeos/dbus/virtual_file_provider", "//chromeos/dbus/vm_plugin_dispatcher", "//chromeos/ime:gencode", - "//chromeos/services/bluetooth_config:in_process_bluetooth_config", "//chromeos/services/assistant/public/cpp", + "//chromeos/services/bluetooth_config:in_process_bluetooth_config", "//chromeos/services/cros_healthd/private/cpp", "//chromeos/services/cros_healthd/public/cpp", "//chromeos/services/machine_learning/public/cpp",
diff --git a/chrome/browser/ash/chrome_browser_main_parts_ash.cc b/chrome/browser/ash/chrome_browser_main_parts_ash.cc index fba8b11f..916559f 100644 --- a/chrome/browser/ash/chrome_browser_main_parts_ash.cc +++ b/chrome/browser/ash/chrome_browser_main_parts_ash.cc
@@ -57,6 +57,7 @@ #include "base/task/thread_pool.h" #include "base/task/thread_pool/thread_pool_instance.h" #include "build/branding_buildflags.h" +#include "build/config/chromebox_for_meetings/buildflags.h" // PLATFORM_CFM #include "chrome/browser/ash/accessibility/accessibility_event_rewriter_delegate_impl.h" #include "chrome/browser/ash/accessibility/accessibility_manager.h" #include "chrome/browser/ash/accessibility/magnification_manager.h" @@ -201,7 +202,6 @@ #include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h" #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h" #include "chromeos/ash/components/network/portal_detector/network_portal_detector_stub.h" -#include "chromeos/components/chromebox_for_meetings/buildflags/buildflags.h" // PLATFORM_CFM #include "chromeos/components/local_search_service/public/cpp/local_search_service_proxy_factory.h" #include "chromeos/components/sensors/ash/sensor_hal_dispatcher.h" #include "chromeos/dbus/constants/cryptohome_key_delegate_constants.h"
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn index 68341f97..ca3386c 100644 --- a/chrome/browser/ash/crosapi/BUILD.gn +++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -220,6 +220,7 @@ "//ash/constants", "//ash/webui/help_app_ui", "//base", + "//build/config/chromebox_for_meetings:buildflags", "//chrome/browser:browser_process", "//chrome/browser/ash/system_web_apps/types:types", "//chrome/browser/chromeos:print_job_info_proto",
diff --git a/chrome/browser/ash/crosapi/extension_info_private_ash.cc b/chrome/browser/ash/crosapi/extension_info_private_ash.cc index 0641493..4fcbd45 100644 --- a/chrome/browser/ash/crosapi/extension_info_private_ash.cc +++ b/chrome/browser/ash/crosapi/extension_info_private_ash.cc
@@ -13,6 +13,7 @@ #include "base/strings/stringprintf.h" #include "base/system/sys_info.h" #include "base/values.h" +#include "build/config/chromebox_for_meetings/buildflags.h" #include "chrome/browser/app_mode/app_mode_utils.h" #include "chrome/browser/ash/arc/arc_util.h" #include "chrome/browser/ash/login/startup_utils.h" @@ -25,7 +26,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/common/pref_names.h" -#include "chromeos/components/chromebox_for_meetings/buildflags/buildflags.h" #include "chromeos/constants/devicetype.h" #include "chromeos/network/device_state.h" #include "chromeos/network/network_handler.h"
diff --git a/chrome/browser/ash/dbus/ash_dbus_helper.cc b/chrome/browser/ash/dbus/ash_dbus_helper.cc index b9375f5..b3d2d29f7 100644 --- a/chrome/browser/ash/dbus/ash_dbus_helper.cc +++ b/chrome/browser/ash/dbus/ash_dbus_helper.cc
@@ -12,6 +12,7 @@ #include "base/files/file_path.h" #include "base/path_service.h" #include "base/system/sys_info.h" +#include "build/config/chromebox_for_meetings/buildflags.h" // PLATFORM_CFM #include "chrome/browser/ash/settings/device_settings_service.h" #include "chrome/browser/ash/wilco_dtc_supportd/wilco_dtc_supportd_client.h" #include "chrome/common/chrome_paths.h" @@ -38,7 +39,6 @@ #include "chromeos/ash/components/dbus/typecd/typecd_client.h" #include "chromeos/ash/components/dbus/upstart/upstart_client.h" #include "chromeos/ash/components/hibernate/buildflags.h" // ENABLE_HIBERNATE -#include "chromeos/components/chromebox_for_meetings/buildflags/buildflags.h" // PLATFORM_CFM #include "chromeos/dbus/anomaly_detector/anomaly_detector_client.h" #include "chromeos/dbus/arc/arc_appfuse_provider_client.h" #include "chromeos/dbus/arc/arc_camera_client.h"
diff --git a/chrome/browser/ash/login/auth/cryptohome_authenticator_unittest.cc b/chrome/browser/ash/login/auth/cryptohome_authenticator_unittest.cc index 784069c..92a353c 100644 --- a/chrome/browser/ash/login/auth/cryptohome_authenticator_unittest.cc +++ b/chrome/browser/ash/login/auth/cryptohome_authenticator_unittest.cc
@@ -65,9 +65,6 @@ // A fake sanitized username used for testing. constexpr char kFakeSanitizedUsername[] = "01234567890ABC"; -// Salt used by pre-hashed key. -const char kSalt[] = "SALT $$"; - // An owner key in PKCS#8 PrivateKeyInfo for testing owner checks. const uint8_t kOwnerPrivateKey[] = { 0x30, 0x82, 0x01, 0x53, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, @@ -837,40 +834,4 @@ RunResolve(auth_.get()); } -TEST_F(CryptohomeAuthenticatorTest, DriveLoginWithPreHashedPassword) { - CreateTransformedKey(Key::KEY_TYPE_SALTED_SHA256, kSalt); - - UserContext expected_user_context(user_context_with_transformed_key_); - expected_user_context.SetUserIDHash(kFakeSanitizedUsername); - ExpectLoginSuccess(expected_user_context); - FailOnLoginFailure(); - - // Set up mock homedir methods to respond with key metadata indicating that a - // pre-hashed key was used to create the cryptohome and allow a successful - // mount when this pre-hashed key is used. - - ExpectGetKeyDataExCall(std::make_unique<int64_t>(Key::KEY_TYPE_SALTED_SHA256), - std::make_unique<std::string>(kSalt)); - ExpectMountExCall(false /* expect_create_attempt */); - - auth_->AuthenticateToLogin(std::make_unique<UserContext>(user_context_)); - run_loop_.Run(); -} - -TEST_F(CryptohomeAuthenticatorTest, FailLoginWithMissingSalt) { - CreateTransformedKey(Key::KEY_TYPE_SALTED_SHA256, kSalt); - - FailOnLoginSuccess(); - ExpectLoginFailure(AuthFailure(AuthFailure::COULD_NOT_MOUNT_CRYPTOHOME)); - - // Set up mock homedir methods to respond with key metadata indicating that a - // pre-hashed key was used to create the cryptohome but without the required - // salt. - ExpectGetKeyDataExCall(std::make_unique<int64_t>(Key::KEY_TYPE_SALTED_SHA256), - std::unique_ptr<std::string>()); - - auth_->AuthenticateToLogin(std::make_unique<UserContext>(user_context_)); - run_loop_.Run(); -} - } // namespace ash
diff --git a/chrome/browser/ash/login/oobe_screen.cc b/chrome/browser/ash/login/oobe_screen.cc index 9156015..1211d577 100644 --- a/chrome/browser/ash/login/oobe_screen.cc +++ b/chrome/browser/ash/login/oobe_screen.cc
@@ -10,6 +10,10 @@ OobeScreenId::OobeScreenId(const std::string& name) : name(name) {} +OobeScreenId::OobeScreenId(const std::string& name, + const std::string& api_prefix) + : name(name), external_api_prefix(api_prefix) {} + OobeScreenId::OobeScreenId(const StaticOobeScreenId& id) : name(id.name) { if (id.external_api_prefix)
diff --git a/chrome/browser/ash/login/oobe_screen.h b/chrome/browser/ash/login/oobe_screen.h index c1a737d..7e0d0520 100644 --- a/chrome/browser/ash/login/oobe_screen.h +++ b/chrome/browser/ash/login/oobe_screen.h
@@ -30,10 +30,13 @@ // Create an identifier from a string. // TODO(https://crbug.com/1312880): Remove this. explicit OobeScreenId(const std::string& id); + // Create an identifier from a statically created identifier. This is implicit // to make StaticOobeScreenId act more like OobeScreenId. OobeScreenId(const StaticOobeScreenId& id); + OobeScreenId(const std::string& id, const std::string& api_prefix); + std::string name; std::string external_api_prefix;
diff --git a/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc b/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc index 64691e8..5a2eb85 100644 --- a/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc +++ b/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc
@@ -156,8 +156,6 @@ ->mutable_data() ->mutable_policy() ->set_low_entropy_credential(true); - request.mutable_key()->mutable_data()->mutable_policy()->set_auth_locked( - true); *request.mutable_account_id() = cryptohome::CreateAccountIdentifierFromAccountId(test_account_id_); // Ensure that has_authorization_request() would return true. @@ -170,7 +168,11 @@ std::move(closure).Run(); }, run_loop.QuitClosure())); + run_loop.Run(); + FakeUserDataAuthClient::TestApi::Get()->SetPinLocked( + cryptohome::CreateAccountIdentifierFromAccountId(test_account_id_), + kCryptohomePinLabel, true); } bool RemovePin(const std::string& pin) const {
diff --git a/chrome/browser/ash/login/screen_manager.cc b/chrome/browser/ash/login/screen_manager.cc index 6189942..cb5b6617 100644 --- a/chrome/browser/ash/login/screen_manager.cc +++ b/chrome/browser/ash/login/screen_manager.cc
@@ -29,6 +29,13 @@ return iter->second.get(); } +OobeScreenId ScreenManager::GetScreenByName(const std::string& screen_name) { + OobeScreenId screen = OobeScreenId(screen_name); + auto iter = screens_.find(screen); + CHECK(iter != screens_.end()) << "Failed to find screen " << screen; + return iter->first; +} + bool ScreenManager::HasScreen(OobeScreenId screen) { return screens_.count(screen) > 0; }
diff --git a/chrome/browser/ash/login/screen_manager.h b/chrome/browser/ash/login/screen_manager.h index 71302b9..68d9367 100644 --- a/chrome/browser/ash/login/screen_manager.h +++ b/chrome/browser/ash/login/screen_manager.h
@@ -34,6 +34,10 @@ // Getter for screen. Does not create the screen. BaseScreen* GetScreen(OobeScreenId screen); + // Getter OobescreenId with both name and external_api_prefix + // after fixing this https://crbug.com/1312879 . + OobeScreenId GetScreenByName(const std::string& screen_name); + bool HasScreen(OobeScreenId screen); void SetScreenForTesting(std::unique_ptr<BaseScreen> value);
diff --git a/chrome/browser/ash/login/screens/error_screen.cc b/chrome/browser/ash/login/screens/error_screen.cc index c98993f..79eb002 100644 --- a/chrome/browser/ash/login/screens/error_screen.cc +++ b/chrome/browser/ash/login/screens/error_screen.cc
@@ -83,6 +83,7 @@ constexpr const char kUserActionReloadGaia[] = "reload-gaia"; constexpr const char kUserActionCancelReset[] = "cancel-reset"; constexpr const char kUserActionCancel[] = "cancel"; +constexpr const char kUserActionOfflineLogin[] = "offline-login"; ErrorScreen::ErrorScreen(ErrorScreenView* view) : BaseScreen(ErrorScreenView::kScreenId, OobeScreenPriority::DEFAULT), @@ -110,6 +111,15 @@ view_->SetOfflineSigninAllowed(show); } +void ErrorScreen::OnOfflineLoginClicked() { + // Reset hide callback as we advance to OfflineLoginScreen. Exit from this + // screen is handled by WizardController. + // TODO(https://crbug.com/1199816, dkuzmin): Use exit_callback_ once available + on_hide_callback_ = base::OnceClosure(); + Hide(); + LoginDisplayHost::default_host()->StartWizard(OfflineLoginView::kScreenId); +} + void ErrorScreen::AllowOfflineLogin(bool allowed) { g_offline_login_allowed_ = allowed; } @@ -269,7 +279,7 @@ } void ErrorScreen::HideImpl() { - if (view_) + if (view_ && !is_hidden()) view_->Hide(); } @@ -296,6 +306,8 @@ } else if (action_id == kUserActionNetworkConnected || action_id == kUserActionCancelReset) { Hide(); + } else if (action_id == kUserActionOfflineLogin) { + OnOfflineLoginClicked(); } else { BaseScreen::OnUserActionDeprecated(action_id); }
diff --git a/chrome/browser/ash/login/screens/error_screen.h b/chrome/browser/ash/login/screens/error_screen.h index bd17d8b..afbfe7b 100644 --- a/chrome/browser/ash/login/screens/error_screen.h +++ b/chrome/browser/ash/login/screens/error_screen.h
@@ -154,6 +154,9 @@ // If show is true offline login flow is enabled from the error screen. void ShowOfflineLoginOption(bool show); + // Handle user action to login in offline mode. + void OnOfflineLoginClicked(); + // Handles the response of an ownership check and starts the guest session if // applicable. void StartGuestSessionAfterOwnershipCheck(
diff --git a/chrome/browser/ash/login/screens/offline_login_screen.cc b/chrome/browser/ash/login/screens/offline_login_screen.cc index 61cfaeb..5956290e 100644 --- a/chrome/browser/ash/login/screens/offline_login_screen.cc +++ b/chrome/browser/ash/login/screens/offline_login_screen.cc
@@ -91,11 +91,23 @@ void OfflineLoginScreen::ShowImpl() { if (!view_) return; + scoped_observer_ = std::make_unique<base::ScopedObservation< NetworkStateInformer, NetworkStateInformerObserver>>(this); scoped_observer_->Observe(network_state_informer_.get()); StartIdleDetection(); - view_->Show(); + + base::Value::Dict params; + const std::string enterprise_domain_manager(GetEnterpriseDomainManager()); + if (!enterprise_domain_manager.empty()) + params.Set("enterpriseDomainManager", enterprise_domain_manager); + std::string email_domain; + if (CrosSettings::Get()->GetString(kAccountsPrefLoginScreenDomainAutoComplete, + &email_domain) && + !email_domain.empty()) { + params.Set("emailDomain", email_domain); + } + view_->Show(std::move(params)); } void OfflineLoginScreen::HideImpl() { @@ -105,22 +117,6 @@ view_->Hide(); } -void OfflineLoginScreen::LoadOffline() { - base::DictionaryValue params; - - const std::string enterprise_domain_manager(GetEnterpriseDomainManager()); - if (!enterprise_domain_manager.empty()) - params.SetStringKey("enterpriseDomainManager", enterprise_domain_manager); - std::string email_domain; - if (CrosSettings::Get()->GetString(kAccountsPrefLoginScreenDomainAutoComplete, - &email_domain) && - !email_domain.empty()) { - params.SetStringKey("emailDomain", email_domain); - } - if (view_) - view_->LoadParams(std::move(params)); -} - void OfflineLoginScreen::OnUserActionDeprecated(const std::string& action_id) { if (action_id == kUserActionCancel) { exit_callback_.Run(Result::BACK);
diff --git a/chrome/browser/ash/login/screens/offline_login_screen.h b/chrome/browser/ash/login/screens/offline_login_screen.h index c7f7b2e0..3962fd3 100644 --- a/chrome/browser/ash/login/screens/offline_login_screen.h +++ b/chrome/browser/ash/login/screens/offline_login_screen.h
@@ -41,8 +41,6 @@ // Unbind() on the associated View if this class is destroyed before that. void OnViewDestroyed(OfflineLoginView* view); - void LoadOffline(); - void HandleCompleteAuth(const std::string& username, const std::string& password);
diff --git a/chrome/browser/ash/login/screens/welcome_screen.cc b/chrome/browser/ash/login/screens/welcome_screen.cc index 52570a4..292c143 100644 --- a/chrome/browser/ash/login/screens/welcome_screen.cc +++ b/chrome/browser/ash/login/screens/welcome_screen.cc
@@ -16,6 +16,7 @@ #include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/time/default_tick_clock.h" +#include "build/config/chromebox_for_meetings/buildflags.h" #include "chrome/browser/ash/accessibility/accessibility_manager.h" #include "chrome/browser/ash/accessibility/magnification_manager.h" #include "chrome/browser/ash/base/locale_util.h" @@ -37,7 +38,6 @@ #include "chrome/common/pref_names.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" -#include "chromeos/components/chromebox_for_meetings/buildflags/buildflags.h" #include "chromeos/dbus/constants/dbus_switches.h" #include "components/language/core/browser/pref_names.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc index 1e36ba1..6893591 100644 --- a/chrome/browser/ash/login/wizard_controller.cc +++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -524,6 +524,13 @@ return screen_manager_->GetScreen(screen_id); } +OobeScreenId WizardController::GetScreenByName(const std::string& screen_name) { + if (screen_name == ErrorScreenView::kScreenId.name) { + return ErrorScreenView::kScreenId; + } + return screen_manager_->GetScreenByName(screen_name); +} + void WizardController::SetCurrentScreenForTesting(BaseScreen* screen) { current_screen_ = screen; }
diff --git a/chrome/browser/ash/login/wizard_controller.h b/chrome/browser/ash/login/wizard_controller.h index b65a48166..cab026a 100644 --- a/chrome/browser/ash/login/wizard_controller.h +++ b/chrome/browser/ash/login/wizard_controller.h
@@ -198,6 +198,9 @@ // Returns a given screen. Creates it lazily. BaseScreen* GetScreen(OobeScreenId screen_id); + // Returns a given OobescreenId with both name and external_api_prefix. + OobeScreenId GetScreenByName(const std::string& screen_name); + // Returns the current ScreenManager instance. ScreenManager* screen_manager() const { return screen_manager_.get(); }
diff --git a/chrome/browser/autofill/autofill_context_menu_manager.cc b/chrome/browser/autofill/autofill_context_menu_manager.cc index f70a8ce..25f541a 100644 --- a/chrome/browser/autofill/autofill_context_menu_manager.cc +++ b/chrome/browser/autofill/autofill_context_menu_manager.cc
@@ -125,12 +125,14 @@ // Field Renderer id should be present because the context menu is triggered // on a input field. Otherwise, Autofill context menu models would not have // been added to the context menu. - if (params.field_renderer_id) + if (!params.field_renderer_id) return; + driver->RendererShouldFillFieldWithValue( {LocalFrameToken(render_frame_host->GetFrameToken().value()), FieldRendererId(params.field_renderer_id.value())}, it->second.fill_value); + // TODO(crbug.com/1325811): Use `it->second.sub_menu_type` to record the usage // of the context menu based on the type. }
diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc index 2988f7cb..9b1e75f 100644 --- a/chrome/browser/autofill/autofill_interactive_uitest.cc +++ b/chrome/browser/autofill/autofill_interactive_uitest.cc
@@ -2911,8 +2911,14 @@ // 3) The AutofillAgent recognizes that it failed to fill 09/2999 and fills // 09 / 99 instead. // 4) The promise waits to see 09 / 99 and resolved. +// Flaky on Win https://crbug.com/1337757. +#if BUILDFLAG(IS_WIN) +#define MAYBE_FillCardOnReformatingForm DISABLED_FillCardOnReformatingForm +#else +#define MAYBE_FillCardOnReformatingForm FillCardOnReformatingForm +#endif IN_PROC_BROWSER_TEST_F(AutofillInteractiveTestCreditCard, - FillCardOnReformatingForm) { + MAYBE_FillCardOnReformatingForm) { CreateTestCreditCart(); GURL url = https_server()->GetURL( "a.com", "/autofill/autofill_creditcard_form_with_date_formatter.html");
diff --git a/chrome/browser/autofill_assistant/password_change/apc_client_impl.cc b/chrome/browser/autofill_assistant/password_change/apc_client_impl.cc index 076a3a3..ca626d9d 100644 --- a/chrome/browser/autofill_assistant/password_change/apc_client_impl.cc +++ b/chrome/browser/autofill_assistant/password_change/apc_client_impl.cc
@@ -18,7 +18,7 @@ #include "chrome/browser/ui/ui_features.h" #include "chrome/common/channel_info.h" #include "components/autofill_assistant/browser/public/autofill_assistant_factory.h" -#include "components/autofill_assistant/browser/public/external_script_controller.h" +#include "components/autofill_assistant/browser/public/headless_script_controller.h" #include "content/public/browser/web_contents.h" #include "url/gurl.h" @@ -59,6 +59,8 @@ return false; is_running_ = true; + GetRuntimeManager()->SetUIState(autofill_assistant::UIState::kShown); + url_ = url; username_ = username; skip_login_ = skip_login; @@ -73,6 +75,7 @@ } void ApcClientImpl::Stop() { + GetRuntimeManager()->SetUIState(autofill_assistant::UIState::kNotShown); onboarding_coordinator_.reset(); external_script_controller_.reset(); is_running_ = false; @@ -106,14 +109,14 @@ skip_login_ ? base::NumberToString(kSourcePasswordChangeLeakWarning) : base::NumberToString(kSourcePasswordChangeSettings); - external_script_controller_ = CreateExternalScriptController(); + external_script_controller_ = CreateHeadlessScriptController(); external_script_controller_->StartScript( params_map, base::BindOnce(&ApcClientImpl::OnRunComplete, base::Unretained(this))); } void ApcClientImpl::OnRunComplete( - autofill_assistant::ExternalScriptController::ScriptResult result) { + autofill_assistant::HeadlessScriptController::ScriptResult result) { // TODO(crbug.com/1324089): Handle failed result. Stop(); } @@ -137,8 +140,8 @@ return AssistantSidePanelCoordinator::Create(&GetWebContents()); } -std::unique_ptr<autofill_assistant::ExternalScriptController> -ApcClientImpl::CreateExternalScriptController() { +std::unique_ptr<autofill_assistant::HeadlessScriptController> +ApcClientImpl::CreateHeadlessScriptController() { apc_external_action_delegate_ = std::make_unique<ApcExternalActionDelegate>( side_panel_coordinator_.get()); apc_external_action_delegate_->SetupDisplay(); @@ -148,8 +151,13 @@ autofill_assistant::AutofillAssistantFactory::CreateForBrowserContext( GetWebContents().GetBrowserContext(), std::make_unique<autofill_assistant::CommonDependenciesChrome>()); - return autofill_assistant->CreateExternalScriptController( + return autofill_assistant->CreateHeadlessScriptController( &GetWebContents(), apc_external_action_delegate_.get()); } +autofill_assistant::RuntimeManager* ApcClientImpl::GetRuntimeManager() { + return autofill_assistant::RuntimeManager::GetOrCreateForWebContents( + &GetWebContents()); +} + WEB_CONTENTS_USER_DATA_KEY_IMPL(ApcClientImpl);
diff --git a/chrome/browser/autofill_assistant/password_change/apc_client_impl.h b/chrome/browser/autofill_assistant/password_change/apc_client_impl.h index 40b25e9..654a5ba 100644 --- a/chrome/browser/autofill_assistant/password_change/apc_client_impl.h +++ b/chrome/browser/autofill_assistant/password_change/apc_client_impl.h
@@ -13,7 +13,8 @@ #include "base/memory/raw_ptr.h" #include "chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator.h" #include "chrome/browser/ui/autofill_assistant/password_change/assistant_side_panel_coordinator.h" -#include "components/autofill_assistant/browser/public/external_script_controller.h" +#include "components/autofill_assistant/browser/public/headless_script_controller.h" +#include "components/autofill_assistant/browser/public/runtime_manager.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_user_data.h" #include "url/gurl.h" @@ -53,8 +54,13 @@ virtual std::unique_ptr<AssistantSidePanelCoordinator> CreateSidePanel(); // Creates an external script controller. - virtual std::unique_ptr<autofill_assistant::ExternalScriptController> - CreateExternalScriptController(); + virtual std::unique_ptr<autofill_assistant::HeadlessScriptController> + CreateHeadlessScriptController(); + + // Gets the RunTimeManager used to disable dialogs and prompts, such as + // password manager, translation dialogs and permissions. Protected to allow + // for overrides by test classes. + virtual autofill_assistant::RuntimeManager* GetRuntimeManager(); explicit ApcClientImpl(content::WebContents* web_contents); @@ -67,7 +73,7 @@ // Registers when a run is complete. Used in callbacks. void OnRunComplete( - autofill_assistant::ExternalScriptController::ScriptResult result); + autofill_assistant::HeadlessScriptController::ScriptResult result); // AssistantSidePanelCoordinator::Observer: void OnHidden() override; @@ -79,7 +85,7 @@ // Controls a script run triggered by the headless API. This class is // responsible for handling the forwarding of action to // `apc_external_action_delegate_` and managing the run lifetime. - std::unique_ptr<autofill_assistant::ExternalScriptController> + std::unique_ptr<autofill_assistant::HeadlessScriptController> external_script_controller_; // The username for which `Start()` was triggered.
diff --git a/chrome/browser/autofill_assistant/password_change/apc_client_impl_unittest.cc b/chrome/browser/autofill_assistant/password_change/apc_client_impl_unittest.cc index bf29fe2b..15a0f19 100644 --- a/chrome/browser/autofill_assistant/password_change/apc_client_impl_unittest.cc +++ b/chrome/browser/autofill_assistant/password_change/apc_client_impl_unittest.cc
@@ -12,7 +12,8 @@ #include "chrome/browser/ui/autofill_assistant/password_change/mock_assistant_side_panel_coordinator.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" -#include "components/autofill_assistant/browser/public/mock_external_script_controller.h" +#include "components/autofill_assistant/browser/public/mock_headless_script_controller.h" +#include "components/autofill_assistant/browser/public/mock_runtime_manager.h" #include "content/public/browser/web_contents.h" #include "content/public/test/test_renderer_host.h" #include "testing/gmock/include/gmock/gmock.h" @@ -51,11 +52,15 @@ return std::move(side_panel_); } - std::unique_ptr<autofill_assistant::ExternalScriptController> - CreateExternalScriptController() override { + std::unique_ptr<autofill_assistant::HeadlessScriptController> + CreateHeadlessScriptController() override { return std::move(external_script_controller_); } + autofill_assistant::RuntimeManager* GetRuntimeManager() override { + return runtime_manager_; + } + // Allows setting an onboarding coordinator that is returned by the factory // function. Must be called at least once before every expected call to // `CreateOnboardingCoordinator()`. @@ -69,19 +74,26 @@ side_panel_ = std::move(side_panel); } - // Allows setting an ExternalScriptController. Must be called at least once - // before every expected call to `CreateExternalScriptController()`. - void InjectExternalScriptControllerForTesting( - std::unique_ptr<autofill_assistant::ExternalScriptController> + // Allows setting an HeadlessScriptController. Must be called at least once + // before every expected call to `CreateHeadlessScriptController()`. + void InjectHeadlessScriptControllerForTesting( + std::unique_ptr<autofill_assistant::HeadlessScriptController> external_script_controller) { external_script_controller_ = std::move(external_script_controller); } + // Allows setting an RunTimeManager. + void InjectRunTimeManagerForTesting( + autofill_assistant::RuntimeManager* runtime_manager) { + runtime_manager_ = runtime_manager; + } + private: std::unique_ptr<ApcOnboardingCoordinator> coordinator_; std::unique_ptr<AssistantSidePanelCoordinator> side_panel_; - std::unique_ptr<autofill_assistant::ExternalScriptController> + std::unique_ptr<autofill_assistant::HeadlessScriptController> external_script_controller_; + autofill_assistant::RuntimeManager* runtime_manager_; }; // static @@ -120,12 +132,16 @@ ON_CALL(*side_panel_ref_, AddObserver) .WillByDefault(SaveArg<0>(&side_panel_observer_)); - // Prepare the ExternalScriptController. + // Prepare the HeadlessScriptController. auto external_script_controller = - std::make_unique<autofill_assistant::MockExternalScriptController>(); + std::make_unique<autofill_assistant::MockHeadlessScriptController>(); external_script_controller_ref_ = external_script_controller.get(); - test_apc_client_->InjectExternalScriptControllerForTesting( + test_apc_client_->InjectHeadlessScriptControllerForTesting( std::move(external_script_controller)); + + // Prepare the RunTimeManager. + test_apc_client_->InjectRunTimeManagerForTesting( + mock_runtime_manager_.get()); } TestApcClientImpl* apc_client() { return test_apc_client_; } @@ -134,10 +150,13 @@ AssistantSidePanelCoordinator::Observer* side_panel_observer() { return side_panel_observer_; } - autofill_assistant::MockExternalScriptController* + autofill_assistant::MockHeadlessScriptController* external_script_controller() { return external_script_controller_ref_; } + autofill_assistant::MockRuntimeManager* runtime_manager() { + return mock_runtime_manager_.get(); + } private: // Necessary to turn on the unified sidepanel. @@ -146,7 +165,7 @@ // Pointers to mocked components that are injected into the `ApcClientImpl`. raw_ptr<MockApcOnboardingCoordinator> coordinator_ref_ = nullptr; raw_ptr<MockAssistantSidePanelCoordinator> side_panel_ref_ = nullptr; - raw_ptr<autofill_assistant::MockExternalScriptController> + raw_ptr<autofill_assistant::MockHeadlessScriptController> external_script_controller_ref_ = nullptr; // The last registered side panel observer - may be null or dangling. @@ -155,6 +174,9 @@ // The object that is tested. raw_ptr<TestApcClientImpl> test_apc_client_ = nullptr; + std::unique_ptr<autofill_assistant::MockRuntimeManager> + mock_runtime_manager_ = + std::make_unique<autofill_assistant::MockRuntimeManager>(); }; TEST_F(ApcClientImplTest, CreateAndStartApcFlow_Success) { @@ -171,7 +193,8 @@ ApcOnboardingCoordinator::Callback coordinator_callback; EXPECT_CALL(*coordinator(), PerformOnboarding) .WillOnce(MoveArg<0>(&coordinator_callback)); - + EXPECT_CALL(*runtime_manager(), + SetUIState(autofill_assistant::UIState::kShown)); EXPECT_TRUE(client->Start(GURL(kUrl1), kUsername1, /*skip_login=*/false)); EXPECT_TRUE(client->IsRunning()); @@ -180,7 +203,7 @@ // Prepare to extract the callback to the external script controller. base::OnceCallback<void( - autofill_assistant::ExternalScriptController::ScriptResult)> + autofill_assistant::HeadlessScriptController::ScriptResult)> external_script_controller_callback; EXPECT_CALL(*external_script_controller(), StartScript) .Times(1) @@ -190,8 +213,10 @@ std::move(coordinator_callback).Run(true); EXPECT_TRUE(client->IsRunning()); - autofill_assistant::ExternalScriptController::ScriptResult script_result = { + autofill_assistant::HeadlessScriptController::ScriptResult script_result = { /* success= */ true}; + EXPECT_CALL(*runtime_manager(), + SetUIState(autofill_assistant::UIState::kNotShown)); std::move(external_script_controller_callback).Run(script_result); EXPECT_FALSE(client->IsRunning()); } @@ -272,6 +297,10 @@ // The `ApcClient` is paused. EXPECT_FALSE(client->IsRunning()); + EXPECT_CALL(*runtime_manager(), + SetUIState(autofill_assistant::UIState::kShown)) + .Times(0); + // Starting it does not work. EXPECT_FALSE(client->Start(GURL(kUrl1), kUsername1, /*skip_login=*/true)); EXPECT_FALSE(client->IsRunning()); @@ -285,7 +314,8 @@ EXPECT_CALL(*coordinator(), PerformOnboarding) .Times(1) .WillOnce(MoveArg<0>(&coordinator_callback)); - + EXPECT_CALL(*runtime_manager(), + SetUIState(autofill_assistant::UIState::kShown)); EXPECT_TRUE( apc_client()->Start(GURL(kUrl1), kUsername1, /*skip_login=*/true)); std::move(coordinator_callback).Run(true); @@ -294,6 +324,8 @@ // The `ApcClientImpl` is registered as an observer to the side panel. ASSERT_EQ(side_panel_observer(), apc_client()); + EXPECT_CALL(*runtime_manager(), + SetUIState(autofill_assistant::UIState::kNotShown)); // Simulate hiding the side panel. side_panel_observer()->OnHidden();
diff --git a/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate.h b/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate.h index 06ed3aad..62fbcde3 100644 --- a/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate.h +++ b/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate.h
@@ -16,7 +16,7 @@ class PasswordChangeRunDisplay; class AssistantDisplayDelegate; -// Receives actions from the `ExternalScriptController` and passes them on an +// Receives actions from the `HeadlessScriptController` and passes them on an // implementation of a `PasswordChangeRunDisplay`. // Currently `ApcExternalActionDelegate` implements two interfaces. If the // class becomes too complex, we may later separate out the
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc index b7be18f..941b801d 100644 --- a/chrome/browser/chrome_browser_interface_binders.cc +++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -9,6 +9,7 @@ #include "ash/constants/ash_features.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "build/config/chromebox_for_meetings/buildflags.h" #include "chrome/browser/accessibility/accessibility_labels_service.h" #include "chrome/browser/accessibility/accessibility_labels_service_factory.h" #include "chrome/browser/browser_process.h" @@ -48,7 +49,6 @@ #include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chrome/services/speech/buildflags/buildflags.h" -#include "chromeos/components/chromebox_for_meetings/buildflags/buildflags.h" #include "components/browsing_topics/mojom/browsing_topics_internals.mojom.h" #include "components/dom_distiller/content/browser/distillability_driver.h" #include "components/dom_distiller/content/browser/distiller_javascript_service_impl.h"
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index f3127cd2..5556679 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -2,11 +2,11 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/features.gni") import("//build/config/ui.gni") import("//chromeos/ash/components/hibernate/buildflags.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//chromeos/components/sensors/buildflags.gni") import("//extensions/buildflags/buildflags.gni") import("//media/media_options.gni") @@ -195,6 +195,7 @@ "//base", "//build:branding_buildflags", "//build:chromeos_buildflags", + "//build/config/chromebox_for_meetings:buildflags", "//chrome/app:command_ids", "//chrome/app/vector_icons", "//chrome/browser:browser_process", @@ -280,7 +281,6 @@ "//chromeos/ash/components/scanning", "//chromeos/ash/services/assistant:lib", "//chromeos/components/cdm_factory_daemon:cdm_factory_daemon_browser", - "//chromeos/components/chromebox_for_meetings/buildflags", "//chromeos/components/disks:prefs", "//chromeos/components/feature_usage", "//chromeos/components/local_search_service/public/cpp:cpp", @@ -1604,6 +1604,8 @@ "../ash/window_throttle_observer_base.h", "app_mode/app_session.cc", "app_mode/app_session.h", + "app_mode/app_session_browser_window_handler.cc", + "app_mode/app_session_browser_window_handler.h", "app_mode/chrome_kiosk_app_installer.cc", "app_mode/chrome_kiosk_app_installer.h", "app_mode/chrome_kiosk_app_launcher.cc",
diff --git a/chrome/browser/chromeos/app_mode/app_session.cc b/chrome/browser/chromeos/app_mode/app_session.cc index 2e27fd6..3f5e628 100644 --- a/chrome/browser/chromeos/app_mode/app_session.cc +++ b/chrome/browser/chromeos/app_mode/app_session.cc
@@ -8,6 +8,7 @@ #include <signal.h> #include "base/bind.h" +#include "base/callback_forward.h" #include "base/json/values_util.h" #include "base/lazy_instance.h" #include "base/location.h" @@ -17,19 +18,13 @@ #include "base/time/time.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/chromeos/app_mode/app_session_browser_window_handler.h" #include "chrome/browser/chromeos/app_mode/kiosk_session_plugin_handler.h" -#include "chrome/browser/chromeos/app_mode/kiosk_settings_navigation_throttle.h" #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_list.h" -#include "chrome/browser/ui/browser_list_observer.h" -#include "chrome/browser/ui/browser_navigator.h" -#include "chrome/browser/ui/browser_window.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" -#include "components/user_manager/user_manager.h" #include "content/public/browser/browser_child_process_host_iterator.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -354,90 +349,6 @@ bool app_window_created_ = false; }; -class AppSession::BrowserWindowHandler : public BrowserListObserver { - public: - BrowserWindowHandler(AppSession* app_session, Browser* browser) - : app_session_(app_session), browser_(browser) { - BrowserList::AddObserver(this); - } - BrowserWindowHandler(const BrowserWindowHandler&) = delete; - BrowserWindowHandler& operator=(const BrowserWindowHandler&) = delete; - ~BrowserWindowHandler() override { BrowserList::RemoveObserver(this); } - - private: - void HandleBrowser(Browser* browser) { - content::WebContents* active_tab = - browser->tab_strip_model()->GetActiveWebContents(); - std::string url_string = - active_tab ? active_tab->GetURL().spec() : std::string(); - - if (KioskSettingsNavigationThrottle::IsSettingsPage(url_string)) { - bool app_browser = browser->is_type_app() || - browser->is_type_app_popup() || - browser->is_type_popup(); - // If this browser is not an app browser or another settings browser - // exists, close this one and navigate to |url_string| in the old browser - // or create a new app browser if none yet exists. - if (!app_browser || app_session_->settings_browser_) { - browser->window()->Close(); - if (!app_session_->settings_browser_) { - // Create a new app browser. - NavigateParams nav_params( - app_session_->profile_, GURL(url_string), - ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL); - nav_params.disposition = WindowOpenDisposition::NEW_POPUP; - Navigate(&nav_params); - } else { - // Navigate in the existing browser. - NavigateParams nav_params( - app_session_->settings_browser_, GURL(url_string), - ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL); - - Navigate(&nav_params); - } - } else { - app_session_->settings_browser_ = browser; - // We have to first call Restore() because the window was created as a - // fullscreen window, having no prior bounds. - // TODO(crbug.com/1015383): Figure out how to do it more cleanly. - browser->window()->Restore(); - browser->window()->Maximize(); - } - } else { - LOG(WARNING) << "Browser opened in kiosk session" - << ", url=" << url_string; - browser->window()->Close(); - } - // Call the callback to notify tests that browser was handled. - if (app_session_->on_handle_browser_callback_) - app_session_->on_handle_browser_callback_.Run(); - } - - // BrowserListObserver overrides: - void OnBrowserAdded(Browser* browser) override { - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(&BrowserWindowHandler::HandleBrowser, - base::Unretained(this), // LazyInstance, always valid - browser)); - } - - // Called when a Browser is removed from the list. - void OnBrowserRemoved(Browser* browser) override { - // The app browser was removed. - if (browser == browser_) { - app_session_->OnLastAppWindowClosed(); - } - - if (browser == app_session_->settings_browser_) { - app_session_->settings_browser_ = nullptr; - } - } - - AppSession* const app_session_; - Browser* const browser_; -}; - AppSession::AppSession() : attempt_user_exit_(base::BindOnce(chrome::AttemptUserExit)), metrics_service_(std::make_unique<AppSessionMetricsService>( @@ -485,8 +396,17 @@ } void AppSession::CreateBrowserWindowHandler(Browser* browser) { - browser_window_handler_ = - std::make_unique<BrowserWindowHandler>(this, browser); + browser_window_handler_ = std::make_unique<AppSessionBrowserWindowHandler>( + profile_, browser, + base::BindRepeating(&AppSession::OnHandledNewBrowserWindow, + weak_ptr_factory_.GetWeakPtr()), + base::BindRepeating(&AppSession::OnLastAppWindowClosed, + weak_ptr_factory_.GetWeakPtr())); +} + +void AppSession::OnHandledNewBrowserWindow() { + if (on_handle_browser_callback_) + on_handle_browser_callback_.Run(); } void AppSession::OnAppWindowAdded(AppWindow* app_window) { @@ -543,4 +463,11 @@ DumpPluginProcess(hung_plugins); } +Browser* AppSession::GetSettingsBrowserForTesting() { + if (browser_window_handler_) { + return browser_window_handler_->GetSettingsBrowserForTesting(); // IN-TEST + } + return nullptr; +} + } // namespace chromeos
diff --git a/chrome/browser/chromeos/app_mode/app_session.h b/chrome/browser/chromeos/app_mode/app_session.h index 155e571..aae8c50 100644 --- a/chrome/browser/chromeos/app_mode/app_session.h +++ b/chrome/browser/chromeos/app_mode/app_session.h
@@ -10,6 +10,7 @@ #include "base/callback.h" #include "base/time/time.h" +#include "chrome/browser/chromeos/app_mode/app_session_browser_window_handler.h" #include "chrome/browser/chromeos/app_mode/kiosk_session_plugin_handler_delegate.h" class PrefRegistrySimple; @@ -84,7 +85,7 @@ // Replaces chrome::AttemptUserExit() by |closure|. void SetAttemptUserExitForTesting(base::OnceClosure closure); - Browser* GetSettingsBrowserForTesting() { return settings_browser_; } + Browser* GetSettingsBrowserForTesting(); void SetOnHandleBrowserCallbackForTesting(base::RepeatingClosure closure); protected: @@ -100,11 +101,7 @@ // App Kiosk. class AppWindowHandler; - // BrowserWindowHandler monitors Browser object being created during - // a kiosk session, log info such as URL so that the code path could be - // fixed and closes the just opened browser window. - class BrowserWindowHandler; - + void OnHandledNewBrowserWindow(); void OnAppWindowAdded(extensions::AppWindow* app_window); void OnLastAppWindowClosed(); @@ -116,13 +113,9 @@ bool is_shutting_down_ = false; std::unique_ptr<AppWindowHandler> app_window_handler_; - std::unique_ptr<BrowserWindowHandler> browser_window_handler_; + std::unique_ptr<AppSessionBrowserWindowHandler> browser_window_handler_; std::unique_ptr<KioskSessionPluginHandler> plugin_handler_; - // Browser in which settings are shown, restricted by - // KioskSettingsNavigationThrottle. - Browser* settings_browser_ = nullptr; - Profile* profile_ = nullptr; base::OnceClosure attempt_user_exit_; @@ -131,6 +124,8 @@ // Is called whenever a new browser creation was handled by the // BrowserWindowHandler. base::RepeatingClosure on_handle_browser_callback_; + + base::WeakPtrFactory<AppSession> weak_ptr_factory_{this}; }; } // namespace chromeos
diff --git a/chrome/browser/chromeos/app_mode/app_session_browser_window_handler.cc b/chrome/browser/chromeos/app_mode/app_session_browser_window_handler.cc new file mode 100644 index 0000000..54435f6 --- /dev/null +++ b/chrome/browser/chromeos/app_mode/app_session_browser_window_handler.cc
@@ -0,0 +1,105 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/app_mode/app_session_browser_window_handler.h" + +#include "chrome/browser/chromeos/app_mode/app_session.h" +#include "chrome/browser/chromeos/app_mode/kiosk_settings_navigation_throttle.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_navigator.h" +#include "chrome/browser/ui/browser_window.h" + +namespace chromeos { + +AppSessionBrowserWindowHandler::AppSessionBrowserWindowHandler( + Profile* profile, + Browser* browser, + base::RepeatingClosure on_browser_window_added_callback, + base::RepeatingClosure on_last_browser_window_closed_callback) + : profile_(profile), + browser_(browser), + on_browser_window_added_callback_(on_browser_window_added_callback), + on_last_browser_window_closed_callback_( + on_last_browser_window_closed_callback) { + BrowserList::AddObserver(this); +} + +AppSessionBrowserWindowHandler::~AppSessionBrowserWindowHandler() { + BrowserList::RemoveObserver(this); +} + +void AppSessionBrowserWindowHandler::HandleNewBrowserWindow(Browser* browser) { + content::WebContents* active_tab = + browser->tab_strip_model()->GetActiveWebContents(); + std::string url_string = + active_tab ? active_tab->GetURL().spec() : std::string(); + + if (KioskSettingsNavigationThrottle::IsSettingsPage(url_string)) { + HandleNewSettingsWindow(browser, url_string); + } else { + LOG(WARNING) << "Browser opened in kiosk session" + << ", url=" << url_string; + browser->window()->Close(); + } + + on_browser_window_added_callback_.Run(); +} // namespace chromeos + +void AppSessionBrowserWindowHandler::HandleNewSettingsWindow( + Browser* browser, + const std::string& url_string) { + if (settings_browser_) { + // If another settings browser exist, navigate to |url_string| in the + // existing browser. + browser->window()->Close(); + // Navigate in the existing browser. + NavigateParams nav_params( + settings_browser_, GURL(url_string), + ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL); + Navigate(&nav_params); + return; + } + + bool app_browser = browser->is_type_app() || browser->is_type_app_popup() || + browser->is_type_popup(); + if (!app_browser) { + // If this browser is not an app browser, create a new app browser if none + // yet exists. + browser->window()->Close(); + // Create a new app browser. + NavigateParams nav_params( + profile_, GURL(url_string), + ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL); + nav_params.disposition = WindowOpenDisposition::NEW_POPUP; + Navigate(&nav_params); + return; + } + + settings_browser_ = browser; + // We have to first call Restore() because the window was created as a + // fullscreen window, having no prior bounds. + // TODO(crbug.com/1015383): Figure out how to do it more cleanly. + browser->window()->Restore(); + browser->window()->Maximize(); +} + +void AppSessionBrowserWindowHandler::OnBrowserAdded(Browser* browser) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&AppSessionBrowserWindowHandler::HandleNewBrowserWindow, + weak_ptr_factory_.GetWeakPtr(), browser)); +} + +void AppSessionBrowserWindowHandler::OnBrowserRemoved(Browser* browser) { + // The app browser was removed. + if (browser == browser_) { + on_last_browser_window_closed_callback_.Run(); + } + + if (browser == settings_browser_) { + settings_browser_ = nullptr; + } +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/app_mode/app_session_browser_window_handler.h b/chrome/browser/chromeos/app_mode/app_session_browser_window_handler.h new file mode 100644 index 0000000..b5ef003 --- /dev/null +++ b/chrome/browser/chromeos/app_mode/app_session_browser_window_handler.h
@@ -0,0 +1,64 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_APP_MODE_APP_SESSION_BROWSER_WINDOW_HANDLER_H_ +#define CHROME_BROWSER_CHROMEOS_APP_MODE_APP_SESSION_BROWSER_WINDOW_HANDLER_H_ + +#include "base/callback_forward.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_list.h" +#include "chrome/browser/ui/browser_list_observer.h" + +namespace chromeos { + +// This class monitors for the addition and removal of new browser windows +// during the kiosk session. On construction it gets a main browser handle +// stored as |browser_|. +// +// If a new browser window is opened, this gets closed immediately, unless it's +// an allowed Settings window. +// +// If the main browser window |browser_| of the session gets closed, the session +// gets ended. +// +// It also manages showing required settings pages in a consistent browser. +class AppSessionBrowserWindowHandler : public BrowserListObserver { + public: + AppSessionBrowserWindowHandler( + Profile* profile, + Browser* browser, + base::RepeatingClosure on_browser_window_added_callback, + base::RepeatingClosure on_last_browser_window_closed_callback); + AppSessionBrowserWindowHandler(const AppSessionBrowserWindowHandler&) = + delete; + AppSessionBrowserWindowHandler& operator=( + const AppSessionBrowserWindowHandler&) = delete; + ~AppSessionBrowserWindowHandler() override; + + Browser* GetSettingsBrowserForTesting() { return settings_browser_; } + + private: + void HandleNewBrowserWindow(Browser* browser); + void HandleNewSettingsWindow(Browser* browser, const std::string& url_string); + + // BrowserListObserver + void OnBrowserAdded(Browser* browser) override; + void OnBrowserRemoved(Browser* browser) override; + + Profile* const profile_; + Browser* const browser_; + base::RepeatingClosure on_browser_window_added_callback_; + base::RepeatingClosure on_last_browser_window_closed_callback_; + + // Browser in which settings are shown, restricted by + // KioskSettingsNavigationThrottle. + Browser* settings_browser_ = nullptr; + + base::WeakPtrFactory<AppSessionBrowserWindowHandler> weak_ptr_factory_{this}; +}; + +} // namespace chromeos +#endif // CHROME_BROWSER_CHROMEOS_APP_MODE_APP_SESSION_BROWSER_WINDOW_HANDLER_H_
diff --git a/chrome/browser/chromeos/extensions/info_private_apitest.cc b/chrome/browser/chromeos/extensions/info_private_apitest.cc index cb7fb38..dac3f7d 100644 --- a/chrome/browser/chromeos/extensions/info_private_apitest.cc +++ b/chrome/browser/chromeos/extensions/info_private_apitest.cc
@@ -11,12 +11,12 @@ #include "base/command_line.h" #include "base/test/scoped_chromeos_version_info.h" #include "base/values.h" +#include "build/config/chromebox_for_meetings/buildflags.h" #include "chrome/browser/ash/arc/arc_util.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" -#include "chromeos/components/chromebox_for_meetings/buildflags/buildflags.h" #include "components/prefs/pref_service.h" #include "content/public/test/browser_test.h" #include "ui/aura/window.h"
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl_browsertest.cc b/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl_browsertest.cc index 19ed835..4e6c5e4 100644 --- a/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl_browsertest.cc +++ b/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl_browsertest.cc
@@ -2,61 +2,80 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/json/json_writer.h" #include "base/values.h" -#include "chrome/browser/ash/policy/core/user_policy_test_helper.h" -#include "chrome/browser/ash/policy/login/login_policy_test_base.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/policy/dlp/dlp_policy_constants.h" #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager.h" #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.h" +#include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl.h" #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.h" -#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/test/base/in_process_browser_test.h" #include "components/policy/core/common/policy_map.h" +#include "components/policy/core/common/policy_pref_names.h" #include "components/policy/policy_constants.h" +#include "components/prefs/scoped_user_pref_update.h" #include "content/public/test/browser_test.h" -// TODO(crbug.com/1262948): Enable and modify for lacros. namespace policy { namespace { constexpr char kUrlStr1[] = "https://wwww.example.com"; -} -class DlpRulesPolicyTest : public LoginPolicyTestBase { +class FakeDlpRulesManager : public DlpRulesManagerImpl { + public: + explicit FakeDlpRulesManager(PrefService* local_state) + : DlpRulesManagerImpl(local_state) {} + ~FakeDlpRulesManager() override = default; +}; +} // namespace + +class DlpRulesPolicyTest : public InProcessBrowserTest { public: DlpRulesPolicyTest() = default; - void SetDlpRulesPolicy(const base::Value& rules) { - std::string json; - base::JSONWriter::Write(rules, &json); - - enterprise_management::CloudPolicySettings policy; - policy.mutable_dataleakpreventionruleslist()->set_value(json); - user_policy_helper()->SetPolicyAndWait( - policy, ProfileManager::GetActiveUserProfile()); + void InitializeRulesManager() { + policy::DlpRulesManagerFactory::GetInstance()->SetTestingFactory( + browser()->profile(), + base::BindRepeating(&DlpRulesPolicyTest::SetDlpRulesManager, + base::Unretained(this))); + ASSERT_TRUE(DlpRulesManagerFactory::GetForPrimaryProfile()); } + + std::unique_ptr<KeyedService> SetDlpRulesManager( + content::BrowserContext* context) { + auto new_rules_manager = + std::make_unique<FakeDlpRulesManager>(g_browser_process->local_state()); + rules_manager_ = new_rules_manager.get(); + return new_rules_manager; + } + + DlpRulesManager* rules_manager_; }; IN_PROC_BROWSER_TEST_F(DlpRulesPolicyTest, ParsePolicyPref) { - SkipToLoginScreen(); - LogIn(); + InitializeRulesManager(); - base::Value rules(base::Value::Type::LIST); + { + ListPrefUpdate update(g_browser_process->local_state(), + policy_prefs::kDlpRulesList); - base::Value src_urls(base::Value::Type::LIST); - src_urls.Append(kUrlStr1); + base::Value rules(base::Value::Type::LIST); - base::Value restrictions(base::Value::Type::LIST); - restrictions.Append(dlp_test_util::CreateRestrictionWithLevel( - dlp::kScreenshotRestriction, dlp::kBlockLevel)); + base::Value src_urls(base::Value::Type::LIST); + src_urls.Append(kUrlStr1); - rules.Append(dlp_test_util::CreateRule( - "rule #1", "Block", std::move(src_urls), - /*dst_urls=*/base::Value(base::Value::Type::LIST), - /*dst_components=*/base::Value(base::Value::Type::LIST), - std::move(restrictions))); + base::Value restrictions(base::Value::Type::LIST); + restrictions.Append(dlp_test_util::CreateRestrictionWithLevel( + dlp::kScreenshotRestriction, dlp::kBlockLevel)); - SetDlpRulesPolicy(rules); + update->Append(dlp_test_util::CreateRule( + "rule #1", "Block", std::move(src_urls), + /*dst_urls=*/base::Value(base::Value::Type::LIST), + /*dst_components=*/base::Value(base::Value::Type::LIST), + std::move(restrictions))); + } EXPECT_EQ(DlpRulesManager::Level::kBlock, DlpRulesManagerFactory::GetForPrimaryProfile()->IsRestricted( @@ -64,12 +83,9 @@ } IN_PROC_BROWSER_TEST_F(DlpRulesPolicyTest, ReportingEnabled) { - enterprise_management::CloudPolicySettings policy; - policy.mutable_dataleakpreventionreportingenabled()->set_value(true); - user_policy_helper()->SetPolicy(policy); - - SkipToLoginScreen(); - LogIn(); + g_browser_process->local_state()->SetBoolean( + policy_prefs::kDlpReportingEnabled, true); + InitializeRulesManager(); DlpRulesManager* rules_manager = DlpRulesManagerFactory::GetForPrimaryProfile(); @@ -78,12 +94,9 @@ } IN_PROC_BROWSER_TEST_F(DlpRulesPolicyTest, ReportingDisabled) { - enterprise_management::CloudPolicySettings policy; - policy.mutable_dataleakpreventionreportingenabled()->set_value(false); - user_policy_helper()->SetPolicy(policy); - - SkipToLoginScreen(); - LogIn(); + g_browser_process->local_state()->SetBoolean( + policy_prefs::kDlpReportingEnabled, false); + InitializeRulesManager(); DlpRulesManager* rules_manager = DlpRulesManagerFactory::GetForPrimaryProfile();
diff --git a/chrome/browser/enterprise/connectors/file_system/service_settings.cc b/chrome/browser/enterprise/connectors/file_system/service_settings.cc index e5b15594..fac3f9d4 100644 --- a/chrome/browser/enterprise/connectors/file_system/service_settings.cc +++ b/chrome/browser/enterprise/connectors/file_system/service_settings.cc
@@ -24,7 +24,8 @@ // an existing provider. const std::string* service_provider_name = settings_value.FindStringKey(kKeyServiceProvider); - if (service_provider_name) { + if (service_provider_name && + service_provider_config.count(*service_provider_name)) { file_system_config_ = service_provider_config.at(*service_provider_name).file_system; }
diff --git a/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.cc b/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.cc index 4b16162..4b21258 100644 --- a/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.cc +++ b/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.cc
@@ -76,9 +76,8 @@ // when new events may be added in the future. And this is also to support // existing customer policies that were created before we introduced the // concept of enabling/disabling events. - for (auto* event_name : - extensions::SafeBrowsingPrivateEventRouter::kAllEvents) { - enabled_event_names_.insert(event_name); + for (const auto& event : kAllReportingEvents) { + enabled_event_names_.insert(event.name); } }
diff --git a/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.h b/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.h index 41cc3e82..c5071af 100644 --- a/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.h +++ b/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.h
@@ -12,10 +12,25 @@ #include "base/values.h" #include "chrome/browser/enterprise/connectors/common.h" #include "chrome/browser/enterprise/connectors/service_provider_config.h" +#include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace enterprise_connectors { +// The source of events that can be reported through the reporting connector. +// This enum is used in ReportingConnectorEventDescription below to specify +// where any particular reporting connector signal comes from. Used in order to +// filter all supported events from a particular source in kAllReportingEvents. +enum class ReportingConnectorEventSource { + SAFE_BROWSING, // Events that are part of the safe browsing suite. +}; + +// A struct describing a type of event including its name and source. +struct ReportingConnectorEventDescription { + const char* name; + ReportingConnectorEventSource source; +}; + // The settings for a report service obtained from a connector policy. class ReportingServiceSettings { public: @@ -31,6 +46,26 @@ std::string service_provider_name() const { return service_provider_name_; } + // All events that the reporting connector supports. + static constexpr ReportingConnectorEventDescription kAllReportingEvents[8] = { + {extensions::SafeBrowsingPrivateEventRouter::kKeyPasswordReuseEvent, + ReportingConnectorEventSource::SAFE_BROWSING}, + {extensions::SafeBrowsingPrivateEventRouter::kKeyPasswordChangedEvent, + ReportingConnectorEventSource::SAFE_BROWSING}, + {extensions::SafeBrowsingPrivateEventRouter::kKeyDangerousDownloadEvent, + ReportingConnectorEventSource::SAFE_BROWSING}, + {extensions::SafeBrowsingPrivateEventRouter::kKeyInterstitialEvent, + ReportingConnectorEventSource::SAFE_BROWSING}, + {extensions::SafeBrowsingPrivateEventRouter::kKeySensitiveDataEvent, + ReportingConnectorEventSource::SAFE_BROWSING}, + {extensions::SafeBrowsingPrivateEventRouter::kKeyUnscannedFileEvent, + ReportingConnectorEventSource::SAFE_BROWSING}, + {extensions::SafeBrowsingPrivateEventRouter::kKeyLoginEvent, + ReportingConnectorEventSource::SAFE_BROWSING}, + {extensions::SafeBrowsingPrivateEventRouter::kKeyPasswordBreachEvent, + ReportingConnectorEventSource::SAFE_BROWSING}, + }; + private: // Returns true if the settings were initialized correctly. If this returns // false, then GetAnalysisSettings will always return absl::nullopt.
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index 4fec678..c4e0841f 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/features.gni") import("//build/config/ozone.gni") @@ -762,6 +763,7 @@ "//base", "//build:branding_buildflags", "//build:chromeos_buildflags", + "//build/config/chromebox_for_meetings:buildflags", "//chrome:extra_resources", "//chrome:resources", "//chrome:strings", @@ -1144,7 +1146,6 @@ "//chrome/browser/devtools", "//chrome/browser/nearby_sharing/common", "//chrome/browser/ui/webui/settings/chromeos/constants:mojom", - "//chromeos/components/chromebox_for_meetings/buildflags", "//chromeos/components/remote_apps/mojom", "//chromeos/dbus", "//chromeos/dbus/cros_disks", @@ -1184,6 +1185,10 @@ "//ui/views", ] allow_circular_includes_from += [ "//chrome/browser/ash/crosapi" ] + + if (is_cfm) { + deps += [ "//chromeos/components/chromebox_for_meetings/features" ] + } } if (is_chromeos_lacros) {
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc index 8ac904a0..d106c61 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
@@ -217,7 +217,7 @@ if (error.empty()) Respond(NoArguments()); else - Error(error); + Respond(Error(error)); } // PasswordsPrivateCancelExportPasswordsFunction
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc index 8ee1990..f1ed301 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
@@ -21,6 +21,7 @@ #include "chrome/browser/chrome_content_browser_client.h" #include "chrome/browser/enterprise/connectors/common.h" #include "chrome/browser/enterprise/connectors/connectors_service.h" +#include "chrome/browser/enterprise/connectors/reporting/reporting_service_settings.h" #include "chrome/browser/policy/chrome_browser_policy_connector.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_attributes_entry.h" @@ -224,7 +225,9 @@ const char SafeBrowsingPrivateEventRouter::kKeyUserJustification[] = "userJustification"; -// All new event names should be added to the kAllEvents array below! +// All new event names should be added to the array +// `enterprise_connectors::ReportingServiceSettings::kAllReportingEvents` in +// `chrome/browser/enterprise/connectors/reporting/reporting_service_settings.h` const char SafeBrowsingPrivateEventRouter::kKeyPasswordReuseEvent[] = "passwordReuseEvent"; const char SafeBrowsingPrivateEventRouter::kKeyPasswordChangedEvent[] = @@ -240,17 +243,6 @@ const char SafeBrowsingPrivateEventRouter::kKeyLoginEvent[] = "loginEvent"; const char SafeBrowsingPrivateEventRouter::kKeyPasswordBreachEvent[] = "passwordBreachEvent"; -// All new event names should be added to this array! -const char* SafeBrowsingPrivateEventRouter::kAllEvents[8] = { - SafeBrowsingPrivateEventRouter::kKeyPasswordReuseEvent, - SafeBrowsingPrivateEventRouter::kKeyPasswordChangedEvent, - SafeBrowsingPrivateEventRouter::kKeyDangerousDownloadEvent, - SafeBrowsingPrivateEventRouter::kKeyInterstitialEvent, - SafeBrowsingPrivateEventRouter::kKeySensitiveDataEvent, - SafeBrowsingPrivateEventRouter::kKeyUnscannedFileEvent, - SafeBrowsingPrivateEventRouter::kKeyLoginEvent, - SafeBrowsingPrivateEventRouter::kKeyPasswordBreachEvent, -}; const char SafeBrowsingPrivateEventRouter::kKeyUnscannedReason[] = "unscannedReason"; @@ -1124,11 +1116,13 @@ } #ifndef NDEBUG - // Make sure that the event is included in the kAllEvents array. + // Make sure the event is a SAFE_BROWSING event in kAllReportingEvents array. bool found = false; - for (const char* known_event_name : - extensions::SafeBrowsingPrivateEventRouter::kAllEvents) { - if (name == known_event_name) { + for (const auto& event : + enterprise_connectors::ReportingServiceSettings::kAllReportingEvents) { + if (event.source == enterprise_connectors::ReportingConnectorEventSource:: + SAFE_BROWSING && + event.name == name) { found = true; break; }
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h index 129bf10..121e320b 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h
@@ -102,7 +102,6 @@ static const char kKeyUnscannedFileEvent[]; static const char kKeyLoginEvent[]; static const char kKeyPasswordBreachEvent[]; - static const char* kAllEvents[8]; static const char kKeyUnscannedReason[];
diff --git a/chrome/browser/extensions/chrome_content_verifier_delegate.cc b/chrome/browser/extensions/chrome_content_verifier_delegate.cc index 371b1dd..7f89a18f 100644 --- a/chrome/browser/extensions/chrome_content_verifier_delegate.cc +++ b/chrome/browser/extensions/chrome_content_verifier_delegate.cc
@@ -23,12 +23,12 @@ #include "build/branding_buildflags.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "build/config/chromebox_for_meetings/buildflags.h" #include "chrome/browser/extensions/corrupted_extension_reinstaller.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/install_verifier.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/extension_constants.h" -#include "chromeos/components/chromebox_for_meetings/buildflags/buildflags.h" #include "extensions/browser/disable_reason.h" #include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h"
diff --git a/chrome/browser/extensions/chrome_content_verifier_unittest.cc b/chrome/browser/extensions/chrome_content_verifier_unittest.cc index 34bb1908..e7d40350 100644 --- a/chrome/browser/extensions/chrome_content_verifier_unittest.cc +++ b/chrome/browser/extensions/chrome_content_verifier_unittest.cc
@@ -3,16 +3,17 @@ // found in the LICENSE file. #include <algorithm> + #include "base/command_line.h" #include "base/files/file_util.h" #include "base/memory/raw_ptr.h" #include "base/path_service.h" +#include "build/config/chromebox_for_meetings/buildflags.h" #include "chrome/browser/extensions/chrome_content_verifier_delegate.h" #include "chrome/browser/extensions/extension_service_test_with_install.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/test/base/testing_profile.h" -#include "chromeos/components/chromebox_for_meetings/buildflags/buildflags.h" #include "extensions/browser/content_verifier/test_utils.h" #include "extensions/browser/extension_system.h" #include "extensions/browser/info_map.h"
diff --git a/chrome/browser/extensions/chrome_extensions_browser_interface_binders.cc b/chrome/browser/extensions/chrome_extensions_browser_interface_binders.cc index 22dbd86..cf50d51 100644 --- a/chrome/browser/extensions/chrome_extensions_browser_interface_binders.cc +++ b/chrome/browser/extensions/chrome_extensions_browser_interface_binders.cc
@@ -24,13 +24,13 @@ #include "ash/services/chromebox_for_meetings/public/cpp/appid_util.h" #include "ash/services/chromebox_for_meetings/public/mojom/cfm_service_manager.mojom.h" #include "ash/webui/camera_app_ui/camera_app_ui.h" +#include "build/config/chromebox_for_meetings/buildflags.h" #include "chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_impl.h" #include "chrome/browser/ash/remote_apps/remote_apps_manager.h" #include "chrome/browser/ash/remote_apps/remote_apps_manager_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/speech/extension_api/tts_engine_extension_observer_chromeos.h" #include "chrome/common/extensions/extension_constants.h" -#include "chromeos/components/chromebox_for_meetings/buildflags/buildflags.h" #include "chromeos/components/remote_apps/mojom/remote_apps.mojom.h" #include "chromeos/language/language_packs/language_packs_impl.h" #include "chromeos/language/public/mojom/language_packs.mojom.h"
diff --git a/chrome/browser/feedback/feedback_uploader_chrome.cc b/chrome/browser/feedback/feedback_uploader_chrome.cc index 5716236..f451cae2 100644 --- a/chrome/browser/feedback/feedback_uploader_chrome.cc +++ b/chrome/browser/feedback/feedback_uploader_chrome.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/strings/stringprintf.h" #include "build/chromeos_buildflags.h" +#include "build/config/chromebox_for_meetings/buildflags.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "components/feedback/feedback_report.h" @@ -21,14 +22,11 @@ #include "google_apis/gaia/gaia_constants.h" #include "services/network/public/cpp/resource_request.h" -#if BUILDFLAG(IS_CHROMEOS_ASH) -#include "chromeos/components/chromebox_for_meetings/buildflags/buildflags.h" #if BUILDFLAG(PLATFORM_CFM) #include "chrome/browser/ash/policy/enrollment/enrollment_requisition_manager.h" #include "chrome/browser/device_identity/device_identity_provider.h" #include "chrome/browser/device_identity/device_oauth2_token_service_factory.h" #endif // BUILDFLAG(PLATFORM_CFM) -#endif // BUILDFLAG(IS_CHROMEOS_ASH) namespace feedback { @@ -86,7 +84,6 @@ AccessTokenAvailable(error, access_token_info.token); } -#if BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(PLATFORM_CFM) void FeedbackUploaderChrome::ActiveAccountAccessTokenAvailable( GoogleServiceAuthError error, @@ -96,7 +93,6 @@ AccessTokenAvailable(error, token); } #endif // BUILDFLAG(PLATFORM_CFM) -#endif // BUILDFLAG(IS_CHROMEOS_ASH) void FeedbackUploaderChrome::AccessTokenAvailable(GoogleServiceAuthError error, std::string token) { @@ -142,7 +138,6 @@ return; } -#if BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(PLATFORM_CFM) // CFM Devices may need to acquire the auth token for their robot account // before they submit feedback. @@ -166,7 +161,6 @@ return; } #endif // BUILDFLAG(PLATFORM_CFM) -#endif // BUILDFLAG(IS_CHROMEOS_ASH) LOG(ERROR) << "Failed to request oauth access token. " << kAuthenticationErrorLogMessage;
diff --git a/chrome/browser/feedback/feedback_uploader_chrome.h b/chrome/browser/feedback/feedback_uploader_chrome.h index 62854e1..efa2fa4 100644 --- a/chrome/browser/feedback/feedback_uploader_chrome.h +++ b/chrome/browser/feedback/feedback_uploader_chrome.h
@@ -10,15 +10,13 @@ #include "base/memory/raw_ptr.h" #include "base/task/single_thread_task_runner.h" #include "build/chromeos_buildflags.h" +#include "build/config/chromebox_for_meetings/buildflags.h" #include "components/feedback/feedback_uploader.h" #include "components/signin/public/identity_manager/access_token_info.h" -#if BUILDFLAG(IS_CHROMEOS_ASH) -#include "chromeos/components/chromebox_for_meetings/buildflags/buildflags.h" #if BUILDFLAG(PLATFORM_CFM) #include "components/invalidation/public/identity_provider.h" -#endif // BUILDFLAG(PLATFORM_CFM) -#endif // BUILDFLAG(IS_CHROMEOS_ASH) +#endif namespace content { class BrowserContext; @@ -66,7 +64,6 @@ void AccessTokenAvailable(GoogleServiceAuthError error, std::string token); -#if BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(PLATFORM_CFM) void ActiveAccountAccessTokenAvailable(GoogleServiceAuthError error, std::string token); @@ -74,7 +71,6 @@ std::unique_ptr<invalidation::ActiveAccountAccessTokenFetcher> active_account_token_fetcher_; #endif // BUILDFLAG(PLATFORM_CFM) -#endif // BUILDFLAG(IS_CHROMEOS_ASH) std::unique_ptr<signin::PrimaryAccountAccessTokenFetcher> primary_account_token_fetcher_;
diff --git a/chrome/browser/metrics/variations/chrome_variations_service_client.cc b/chrome/browser/metrics/variations/chrome_variations_service_client.cc index 1717526b5..36ad69a9 100644 --- a/chrome/browser/metrics/variations/chrome_variations_service_client.cc +++ b/chrome/browser/metrics/variations/chrome_variations_service_client.cc
@@ -6,11 +6,11 @@ #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "build/config/chromebox_for_meetings/buildflags.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/google/google_brand.h" #include "chrome/browser/net/system_network_context_manager.h" #include "chrome/common/channel_info.h" -#include "chromeos/components/chromebox_for_meetings/buildflags/buildflags.h" #include "components/variations/service/variations_service_client.h" #include "components/version_info/version_info.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -68,7 +68,7 @@ variations::Study::FormFactor ChromeVariationsServiceClient::GetCurrentFormFactor() { -#if BUILDFLAG(IS_CHROMEOS_ASH) && BUILDFLAG(PLATFORM_CFM) +#if BUILDFLAG(PLATFORM_CFM) return variations::Study::MEET_DEVICE; #else return variations::VariationsServiceClient::GetCurrentFormFactor();
diff --git a/chrome/browser/predictors/proxy_lookup_client_impl.cc b/chrome/browser/predictors/proxy_lookup_client_impl.cc index 73314309..9d0f7e33 100644 --- a/chrome/browser/predictors/proxy_lookup_client_impl.cc +++ b/chrome/browser/predictors/proxy_lookup_client_impl.cc
@@ -25,10 +25,8 @@ : callback_(std::move(callback)) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); proxy_lookup_start_time_ = base::TimeTicks::Now(); - network_context->LookUpProxyForURL( - url, network_isolation_key, - receiver_.BindNewPipeAndPassRemote(content::GetUIThreadTaskRunner( - {content::BrowserTaskType::kPreconnect}))); + network_context->LookUpProxyForURL(url, network_isolation_key, + receiver_.BindNewPipeAndPassRemote()); receiver_.set_disconnect_handler( base::BindOnce(&ProxyLookupClientImpl::OnProxyLookupComplete, base::Unretained(this), net::ERR_ABORTED, absl::nullopt));
diff --git a/chrome/browser/predictors/resolve_host_client_impl.cc b/chrome/browser/predictors/resolve_host_client_impl.cc index 3679c86..f53cbb2 100644 --- a/chrome/browser/predictors/resolve_host_client_impl.cc +++ b/chrome/browser/predictors/resolve_host_client_impl.cc
@@ -36,11 +36,9 @@ parameters->purpose = network::mojom::ResolveHostParameters::Purpose::kPreconnect; resolve_host_start_time_ = base::TimeTicks::Now(); - network_context->ResolveHost( - net::HostPortPair::FromURL(url), network_isolation_key, - std::move(parameters), - receiver_.BindNewPipeAndPassRemote(content::GetUIThreadTaskRunner( - {content::BrowserTaskType::kPreconnect}))); + network_context->ResolveHost(net::HostPortPair::FromURL(url), + network_isolation_key, std::move(parameters), + receiver_.BindNewPipeAndPassRemote()); receiver_.set_disconnect_handler(base::BindOnce( &ResolveHostClientImpl::OnConnectionError, base::Unretained(this))); }
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn index 8e5d959..68e0be9 100644 --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn
@@ -2,12 +2,12 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//build/config/chromeos/ui_mode.gni") import("//chrome/browser/buildflags.gni") import("//chrome/common/features.gni") import("//chrome/test/base/js2gtest.gni") import("//chrome/test/include_js_tests.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//pdf/features.gni") import("//printing/buildflags/buildflags.gni") import("//third_party/closure_compiler/compile_js.gni")
diff --git a/chrome/browser/resources/chromeos/BUILD.gn b/chrome/browser/resources/chromeos/BUILD.gn index 8abb1cf..57b0d9c 100644 --- a/chrome/browser/resources/chromeos/BUILD.gn +++ b/chrome/browser/resources/chromeos/BUILD.gn
@@ -2,8 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//chrome/common/features.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//third_party/closure_compiler/compile_js.gni") import("//tools/grit/grit_rule.gni")
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fa.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fa.xtb index abb2cec..0002697 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fa.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_fa.xtb
@@ -10,7 +10,7 @@ <translation id="1025074108959230262">حالت چسبان غیرفعال شد</translation> <translation id="1031961866430398710">سپس</translation> <translation id="1038643060055067718">خطوط:</translation> -<translation id="1038795173450935438">برای جلو رفتن بین موارد موجود در صفحه، «جستجو» + پیکان راست یا برای پرش به عقب «جستجو» + پیکان چپ را فشار دهید. برای رفتن به خط بعدی، «جستجو» + پیکان پایین را فشار دهید. برای رفتن به خط قبلی، از «جستجو» + پیکان بالا استفاده کنید. اگر به موردی رسیدید که میخواهید روی آن کلیک کنید، روی «جستجو» + فاصله فشار دهید.</translation> +<translation id="1038795173450935438">برای جلو رفتن بین موارد موجود در صفحه، «جستجو» + کلید «راستبر» یا برای پرش به عقب «جستجو» + کلید «چپبر» را فشار دهید. برای رفتن به خط بعدی، «جستجو» + کلید «پایینبر» را فشار دهید. برای رفتن به خط قبلی، از «جستجو» + کلید «بالابر» استفاده کنید. اگر به موردی رسیدید که میخواهید روی آن کلیک کنید، روی «جستجو» + کلید «فاصله» فشار دهید.</translation> <translation id="106222400312645156">rwhdr</translation> <translation id="1065552602950927991">ورودی نامعتبر</translation> <translation id="1066085461259044485">سبز جنگلی</translation>
diff --git a/chrome/browser/resources/chromeos/chromebox_for_meetings/BUILD.gn b/chrome/browser/resources/chromeos/chromebox_for_meetings/BUILD.gn index 1bab7a0a..fd83247 100644 --- a/chrome/browser/resources/chromeos/chromebox_for_meetings/BUILD.gn +++ b/chrome/browser/resources/chromeos/chromebox_for_meetings/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//third_party/closure_compiler/compile_js.gni") import("//tools/grit/grit_rule.gni") import("//tools/grit/preprocess_if_expr.gni")
diff --git a/chrome/browser/resources/chromeos/login/screens/common/error_message.js b/chrome/browser/resources/chromeos/login/screens/common/error_message.js index d0518968..81de920 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/error_message.js +++ b/chrome/browser/resources/chromeos/login/screens/common/error_message.js
@@ -12,6 +12,7 @@ const USER_ACTION_LOCAL_STATE_POWERWASH = 'local-state-error-powerwash'; const USER_ACTION_SHOW_CAPTIVE_PORTAL = 'show-captive-portal'; const USER_ACTION_OPEN_INTERNET_DIALOG = 'open-internet-dialog'; +const USER_ACTION_OFFLINE_LOGIN = 'offline-login'; /** * Possible UI states of the error screen. @@ -387,7 +388,7 @@ this.updateElementWithStringAndAnchorTag_( 'error-offline-login', 'offlineLogin', {}, 'error-offline-login-link'); this.shadowRoot.querySelector('#error-offline-login-link').onclick = () => { - chrome.send('offlineLogin'); + this.userActed(USER_ACTION_OFFLINE_LOGIN); }; }
diff --git a/chrome/browser/resources/chromeos/login/screens/login/offline_login.js b/chrome/browser/resources/chromeos/login/screens/login/offline_login.js index 9b1397e..d80099927 100644 --- a/chrome/browser/resources/chromeos/login/screens/login/offline_login.js +++ b/chrome/browser/resources/chromeos/login/screens/login/offline_login.js
@@ -117,8 +117,7 @@ /** Overridden from LoginScreenBehavior. */ // clang-format off get EXTERNAL_API() { - return ['loadParams', - 'reset', + return ['reset', 'proceedToPasswordPage', 'showOnlineRequiredDialog', 'showPasswordMismatchMessage', @@ -151,8 +150,22 @@ this.switchToEmailCard(true /* animated */); } - onBeforeShow() { - this.$.dialog.onBeforeShow(); + cancel() { + this.onBackButtonClicked_(); + } + + /** + * + * @param {Object} params + */ + onBeforeShow(params) { + this.reset(); + if ('enterpriseDomainManager' in params) { + this.manager = params['enterpriseDomainManager']; + } + if ('emailDomain' in params) { + this.emailDomain = '@' + params['emailDomain']; + } this.$.emailInput.pattern = INPUT_EMAIL_PATTERN; if (!this.email_) { this.switchToEmailCard(false /* animated */); @@ -160,6 +173,7 @@ } reset() { + this.animationInProgress = false; this.disabled = false; this.emailDomain = ''; this.manager = ''; @@ -170,19 +184,6 @@ this.activeSection = LOGIN_SECTION.EMAIL; } - /** - * @param {!Object} params parameters bag. - */ - loadParams(params) { - this.reset(); - if ('enterpriseDomainManager' in params) { - this.manager = params['enterpriseDomainManager']; - } - if ('emailDomain' in params) { - this.emailDomain = '@' + params['emailDomain']; - } - } - proceedToPasswordPage() { this.switchToPasswordCard(true /* animated */); }
diff --git a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.html b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.html index 2ee053c8..15b5939 100644 --- a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.html +++ b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.html
@@ -122,6 +122,7 @@ .wrapper.fit-into-size .buttons-container { bottom: 0; + box-sizing: border-box; position: fixed; right: 0; }
diff --git a/chrome/browser/resources/settings/autofill_page/password_manager_proxy.ts b/chrome/browser/resources/settings/autofill_page/password_manager_proxy.ts index b5474ed..bc600c2 100644 --- a/chrome/browser/resources/settings/autofill_page/password_manager_proxy.ts +++ b/chrome/browser/resources/settings/autofill_page/password_manager_proxy.ts
@@ -159,19 +159,14 @@ /** * Triggers the dialogue for exporting passwords. - * TODO(https://crbug.com/919483): Return a promise instead of taking a - * callback argument. */ - exportPasswords(callback: () => void): void; + exportPasswords(): Promise<void>; /** * Queries the status of any ongoing export. - * TODO(https://crbug.com/919483): Return a promise instead of taking a - * callback argument. */ - requestExportProgressStatus( - callback: (status: chrome.passwordsPrivate.ExportProgressStatus) => void): - void; + requestExportProgressStatus(): + Promise<chrome.passwordsPrivate.ExportProgressStatus>; /** * Add an observer to the export progress. @@ -478,14 +473,23 @@ chrome.passwordsPrivate.importPasswords(); } - exportPasswords(callback: () => void) { - chrome.passwordsPrivate.exportPasswords(callback); + exportPasswords() { + return new Promise<void>((resolve, reject) => { + chrome.passwordsPrivate.exportPasswords(() => { + if (chrome.runtime.lastError) { + reject(chrome.runtime.lastError.message); + return; + } + resolve(); + }); + }); } - requestExportProgressStatus( - callback: - (status: chrome.passwordsPrivate.ExportProgressStatus) => void) { - chrome.passwordsPrivate.requestExportProgressStatus(callback); + requestExportProgressStatus() { + return new Promise<chrome.passwordsPrivate.ExportProgressStatus>( + resolve => { + chrome.passwordsPrivate.requestExportProgressStatus(resolve); + }); } addPasswordsFileExportProgressListener(
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.ts b/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.ts index 98a680b..b109f8a 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.ts
@@ -132,7 +132,7 @@ // If export started on a different tab and is still in progress, display a // busy UI. - this.passwordManager_.requestExportProgressStatus(status => { + this.passwordManager_.requestExportProgressStatus().then(status => { if (status === ProgressStatus.IN_PROGRESS) { this.switchToDialog_(States.IN_PROGRESS); } @@ -219,9 +219,8 @@ * security checks. */ private exportPasswords_() { - this.passwordManager_.exportPasswords(() => { - if (chrome.runtime.lastError && - chrome.runtime.lastError.message === 'in-progress') { + this.passwordManager_.exportPasswords().catch((error) => { + if (error === 'in-progress') { // Exporting was started by a different call to exportPasswords() and is // is still in progress. This UI needs to be updated to the current // status.
diff --git a/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html b/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html index 06e098e..4d889e06 100644 --- a/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html +++ b/chrome/browser/resources/signin/enterprise_profile_welcome/enterprise_profile_welcome_app.html
@@ -8,7 +8,7 @@ --content-container-margin-top: 104px; --info-box-margin-inline: auto; --info-box-margin-top: 32px; - --info-box-width: 514px; + --info-box-width: 530px; --text-font-size: 1.16em; color: var(--cr-primary-text-color); display: block; @@ -48,6 +48,7 @@ --content-container-title-font-weight: 500; --content-container-title-line-height: 32px; --info-box-bottom: 0; + --info-box-padding: 24px 8px; --info-box-position: absolute; --info-box-border: none; --info-box-border-radius: 0px; @@ -70,6 +71,7 @@ --info-box-border-radius: 8px; --info-box-font-size: auto; --info-box-line-height: auto; + --info-box-padding: 12px 0; } </if> @@ -179,7 +181,7 @@ line-height: var(--info-box-line-height); margin-inline: var(--info-box-margin-inline); margin-top: var(--info-box-margin-top); - padding-block: 12px; + padding: var(--info-box-padding); padding-inline-end: 18px; position: var(--info-box-position); width: var(--info-box-width);
diff --git a/chrome/browser/sync/test/integration/device_info_helper.cc b/chrome/browser/sync/test/integration/device_info_helper.cc index 8691ce5..b5cfda6 100644 --- a/chrome/browser/sync/test/integration/device_info_helper.cc +++ b/chrome/browser/sync/test/integration/device_info_helper.cc
@@ -30,3 +30,14 @@ *os << result_listener.str(); return matches; } + +namespace device_info_helper { + +bool WaitForFullDeviceInfoCommitted(const std::string& cache_guid) { + return ServerDeviceInfoMatchChecker( + testing::Contains( + testing::AllOf(HasCacheGuid(cache_guid), HasSharingFields()))) + .Wait(); +} + +} // namespace device_info_helper
diff --git a/chrome/browser/sync/test/integration/device_info_helper.h b/chrome/browser/sync/test/integration/device_info_helper.h index 29aa0b7..2b3f164 100644 --- a/chrome/browser/sync/test/integration/device_info_helper.h +++ b/chrome/browser/sync/test/integration/device_info_helper.h
@@ -10,6 +10,7 @@ #include "base/memory/raw_ptr.h" #include "chrome/browser/sync/test/integration/fake_server_match_status_checker.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace sync_pb { @@ -40,4 +41,21 @@ const Matcher matcher_; }; +namespace device_info_helper { + +MATCHER(HasSharingFields, "") { + return arg.specifics() + .device_info() + .sharing_fields() + .has_sender_id_fcm_token_v2(); +} + +MATCHER_P(HasCacheGuid, expected_cache_guid, "") { + return arg.specifics().device_info().cache_guid() == expected_cache_guid; +} + +bool WaitForFullDeviceInfoCommitted(const std::string& cache_guid); + +} // namespace device_info_helper + #endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_DEVICE_INFO_HELPER_H_
diff --git a/chrome/browser/sync/test/integration/fake_sync_gcm_driver_for_instance_id.cc b/chrome/browser/sync/test/integration/fake_sync_gcm_driver_for_instance_id.cc new file mode 100644 index 0000000..6cf5846 --- /dev/null +++ b/chrome/browser/sync/test/integration/fake_sync_gcm_driver_for_instance_id.cc
@@ -0,0 +1,60 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/sync/test/integration/fake_sync_gcm_driver_for_instance_id.h" + +#include "base/task/single_thread_task_runner.h" +#include "base/task/task_traits.h" +#include "base/task/thread_pool.h" +#include "chrome/browser/profiles/profile.h" +#include "components/gcm_driver/crypto/gcm_encryption_result.h" +#include "components/gcm_driver/fake_gcm_profile_service.h" +#include "components/gcm_driver/gcm_profile_service.h" +#include "components/keyed_service/core/keyed_service.h" + +// static +std::unique_ptr<KeyedService> FakeSyncGCMDriver::Build( + content::BrowserContext* context) { + auto service = std::make_unique<gcm::FakeGCMProfileService>(); + Profile* profile = Profile::FromBrowserContext(context); + + // Allow blocking to initialize GCM client from the disk. + scoped_refptr<base::SequencedTaskRunner> blocking_task_runner( + base::ThreadPool::CreateSequencedTaskRunner( + {base::MayBlock(), base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})); + service->SetDriverForTesting( + std::make_unique<FakeSyncGCMDriver>(profile, blocking_task_runner)); + return service; +} + +FakeSyncGCMDriver::FakeSyncGCMDriver( + Profile* profile, + const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner) + : instance_id::FakeGCMDriverForInstanceID( + profile->GetPath().Append(FILE_PATH_LITERAL("gcm_test_store")), + blocking_task_runner), + profile_(profile) {} + +std::string FakeSyncGCMDriver::GenerateTokenImpl( + const std::string& app_id, + const std::string& authorized_entity, + const std::string& scope) { + // TODO(crbug.com/1331206): Implement deleting token and generating a new one + // for the same profile. + return app_id + "_" + authorized_entity + "_" + scope + "_" + + profile_->GetDebugName(); +} + +void FakeSyncGCMDriver::EncryptMessage(const std::string& app_id, + const std::string& authorized_entity, + const std::string& p256dh, + const std::string& auth_secret, + const std::string& message, + EncryptMessageCallback callback) { + // Pretend that message has been encrypted. Some tests rely on unencrypted + // content to check results. + std::move(callback).Run(gcm::GCMEncryptionResult::ENCRYPTED_DRAFT_08, + message); +}
diff --git a/chrome/browser/sync/test/integration/fake_sync_gcm_driver_for_instance_id.h b/chrome/browser/sync/test/integration/fake_sync_gcm_driver_for_instance_id.h new file mode 100644 index 0000000..11f2f15 --- /dev/null +++ b/chrome/browser/sync/test/integration/fake_sync_gcm_driver_for_instance_id.h
@@ -0,0 +1,50 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_FAKE_SYNC_GCM_DRIVER_FOR_INSTANCE_ID_H_ +#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_FAKE_SYNC_GCM_DRIVER_FOR_INSTANCE_ID_H_ + +#include <memory> +#include <string> + +#include "base/memory/scoped_refptr.h" +#include "components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h" + +namespace base { +class SequencedTaskRunner; +} // namespace base + +namespace content { +class BrowserContext; +} // namespace content + +class KeyedService; +class Profile; + +class FakeSyncGCMDriver : public instance_id::FakeGCMDriverForInstanceID { + public: + FakeSyncGCMDriver( + Profile* profile, + const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner); + + static std::unique_ptr<KeyedService> Build(content::BrowserContext* context); + + protected: + // FakeGCMDriverForInstanceID overrides: + std::string GenerateTokenImpl(const std::string& app_id, + const std::string& authorized_entity, + const std::string& scope) override; + + void EncryptMessage(const std::string& app_id, + const std::string& authorized_entity, + const std::string& p256dh, + const std::string& auth_secret, + const std::string& message, + EncryptMessageCallback callback) override; + + private: + Profile* profile_; +}; + +#endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_FAKE_SYNC_GCM_DRIVER_FOR_INSTANCE_ID_H_
diff --git a/chrome/browser/sync/test/integration/single_client_device_info_sync_test.cc b/chrome/browser/sync/test/integration/single_client_device_info_sync_test.cc index 501a9c7..edb271d2 100644 --- a/chrome/browser/sync/test/integration/single_client_device_info_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_device_info_sync_test.cc
@@ -39,17 +39,16 @@ namespace { +using device_info_helper::HasCacheGuid; +using device_info_helper::HasSharingFields; using syncer::ModelType; using syncer::ModelTypeSet; +using testing::AllOf; using testing::Contains; using testing::ElementsAre; using testing::IsSupersetOf; using testing::UnorderedElementsAre; -MATCHER_P(HasCacheGuid, expected_cache_guid, "") { - return arg.specifics().device_info().cache_guid() == expected_cache_guid; -} - MATCHER(HasFullHardwareClass, "") { return !arg.specifics().device_info().full_hardware_class().empty(); } @@ -126,9 +125,8 @@ ~SingleClientDeviceInfoSyncTest() override = default; - std::string GetLocalCacheGuid() { - syncer::SyncTransportDataPrefs prefs(GetProfile(0)->GetPrefs()); - return prefs.GetCacheGuid(); + std::string GetLocalCacheGuid() const { + return GetCacheGuid(/*profile_index=*/0); } syncer::DeviceInfoTracker* GetDeviceInfoTracker() { @@ -321,10 +319,33 @@ IN_PROC_BROWSER_TEST_F(SingleClientDeviceInfoSyncTest, ShouldSetTheOnlyClientFlag) { ASSERT_TRUE(SetupSync()); - ASSERT_TRUE(ServerDeviceInfoMatchChecker( - ElementsAre(HasCacheGuid(GetLocalCacheGuid()))) + + const std::vector<sync_pb::SyncEntity> entities_before = + fake_server_->GetSyncEntitiesByModelType(syncer::DEVICE_INFO); + + // Single client flag could be dropped due to a DeviceInfo update in the last + // GetUpdates request. The next sync cycle may download the latest committed + // DeviceInfo reflection and drop optimization flags. Hence, make it sure that + // there are at least 2 sync cycles and check the second one only. + bookmarks_helper::AddURL(/*profile=*/0, "Title", GURL("http://foo.com")); + ASSERT_TRUE(bookmarks_helper::BookmarkModelMatchesFakeServerChecker( + /*profile=*/0, GetSyncService(0), GetFakeServer()) .Wait()); + // Perform the second sync cycle. + bookmarks_helper::AddURL(/*profile=*/0, "Title", GURL("http://foo.com")); + ASSERT_TRUE(bookmarks_helper::BookmarkModelMatchesFakeServerChecker( + /*profile=*/0, GetSyncService(0), GetFakeServer()) + .Wait()); + + // Double check that DeviceInfo hasn't been committed during the test. It may + // happen if there are any DeviceInfo fields are initialized asynchronously. + const std::vector<sync_pb::SyncEntity> entities_after = + fake_server_->GetSyncEntitiesByModelType(syncer::DEVICE_INFO); + ASSERT_EQ(1U, entities_before.size()); + ASSERT_EQ(1U, entities_after.size()); + ASSERT_EQ(entities_before.front().mtime(), entities_after.front().mtime()); + sync_pb::ClientToServerMessage message; GetFakeServer()->GetLastCommitMessage(&message); @@ -341,6 +362,16 @@ ASSERT_TRUE(SetupSync()); + // Single client flag could be dropped due to a DeviceInfo update in the last + // GetUpdates request. The next sync cycle may download the latest committed + // DeviceInfo reflection and drop optimization flags. Hence, make it sure that + // there are at least 2 sync cycles and check the second one only. + bookmarks_helper::AddURL(/*profile=*/0, "Title", GURL("http://foo.com")); + ASSERT_TRUE(bookmarks_helper::BookmarkModelMatchesFakeServerChecker( + /*profile=*/0, GetSyncService(0), GetFakeServer()) + .Wait()); + + // Perform the second sync cycle. bookmarks_helper::AddURL(/*profile=*/0, "Title", GURL("http://foo.com")); ASSERT_TRUE(bookmarks_helper::BookmarkModelMatchesFakeServerChecker( /*profile=*/0, GetSyncService(0), GetFakeServer()) @@ -360,9 +391,22 @@ InjectDeviceInfoEntityToServer(/*suffix=*/1); ASSERT_TRUE(SetupSync()); - ASSERT_TRUE(ServerDeviceInfoMatchChecker( - UnorderedElementsAre(HasCacheGuid(GetLocalCacheGuid()), - HasCacheGuid(CacheGuidForSuffix(1)))) + + // Verify that both DeviceInfos are present on the server. + ASSERT_THAT(GetFakeServer()->GetSyncEntitiesByModelType(syncer::DEVICE_INFO), + UnorderedElementsAre(HasCacheGuid(GetLocalCacheGuid()), + HasCacheGuid(CacheGuidForSuffix(1)))); + + // Download all the updates from the server to prevent DeviceInfo update while + // committing. + GetSyncService(0)->TriggerRefresh({syncer::DEVICE_INFO}); + + // Everything's ready to verify that the next commit request contains + // single_client which is false. Commit a bookmark to trigger a commit + // request. + bookmarks_helper::AddURL(/*profile=*/0, "Title", GURL("http://foo.com")); + ASSERT_TRUE(bookmarks_helper::BookmarkModelMatchesFakeServerChecker( + /*profile=*/0, GetSyncService(0), GetFakeServer()) .Wait()); sync_pb::ClientToServerMessage message; @@ -426,9 +470,6 @@ IN_PROC_BROWSER_TEST_F(SingleClientDeviceInfoSyncTest, PRE_ShouldNotSendDeviceInfoAfterBrowserRestart) { ASSERT_TRUE(SetupSync()); - EXPECT_TRUE(ServerDeviceInfoMatchChecker( - ElementsAre(HasCacheGuid(GetLocalCacheGuid()))) - .Wait()); } IN_PROC_BROWSER_TEST_F(SingleClientDeviceInfoSyncTest,
diff --git a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc index 54be99d..af4cf4ca2 100644 --- a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
@@ -8,6 +8,7 @@ #include "base/strings/stringprintf.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/test_timeouts.h" +#include "base/threading/thread_restrictions.h" #include "build/build_config.h" #include "chrome/browser/browser_features.h" #include "chrome/browser/favicon/favicon_service_factory.h" @@ -1007,17 +1008,23 @@ CloseTab(/*browser_index=*/0, /*tab_index=*/0); WaitForHierarchyOnServer(SessionsHierarchy({{kURL2}})); - CloseTab(/*browser_index=*/0, /*tab_index=*/0); - - // TODO(crbug.com/1039234): When DestroyProfileOnBrowserClose is enabled, the - // last CloseTab() triggers Profile deletion (and SyncService deletion). - // This means the last tab close never gets synced. We should fix this - // regression eventually. Once that's done, merge this test with the - // WithoutDestroyProfile version. - base::RunLoop run_loop; - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, run_loop.QuitClosure(), TestTimeouts::action_timeout()); - run_loop.Run(); + { + // Closing the last tab results in profile destruction and hence may require + // running blocking tasks which are normally disallowed during tests. + // TODO(crbug.com/1334091): remove once it's clear why it results in + // blocking tasks. + base::ScopedAllowUnresponsiveTasksForTesting scoped_allow_sync_primitives; + CloseTab(/*browser_index=*/0, /*tab_index=*/0); + // TODO(crbug.com/1039234): When DestroyProfileOnBrowserClose is enabled, + // the last CloseTab() triggers Profile deletion (and SyncService deletion). + // This means the last tab close never gets synced. We should fix this + // regression eventually. Once that's done, merge this test with the + // WithoutDestroyProfile version. + base::RunLoop run_loop; + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), TestTimeouts::action_timeout()); + run_loop.Run(); + } // Even after several seconds, state didn't change on the server. fake_server::FakeServerVerifier verifier(GetFakeServer());
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc index 9063d8a8..c56cf7b 100644 --- a/chrome/browser/sync/test/integration/sync_test.cc +++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -15,6 +15,7 @@ #include "base/memory/ref_counted.h" #include "base/path_service.h" #include "base/rand_util.h" +#include "base/ranges/algorithm.h" #include "base/run_loop.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" @@ -36,6 +37,8 @@ #include "chrome/browser/sync/sync_invalidations_service_factory.h" #include "chrome/browser/sync/sync_service_factory.h" #include "chrome/browser/sync/test/integration/committed_all_nudged_changes_checker.h" +#include "chrome/browser/sync/test/integration/device_info_helper.h" +#include "chrome/browser/sync/test/integration/fake_sync_gcm_driver_for_instance_id.h" #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h" #include "chrome/browser/sync/test/integration/sync_datatype_helper.h" #include "chrome/browser/sync/test/integration/sync_disabled_checker.h" @@ -46,6 +49,7 @@ #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "components/bookmarks/test/bookmark_test_helpers.h" +#include "components/gcm_driver/fake_gcm_profile_service.h" #include "components/gcm_driver/gcm_profile_service.h" #include "components/invalidation/impl/fake_invalidation_service.h" #include "components/invalidation/impl/fcm_invalidation_service.h" @@ -63,6 +67,7 @@ #include "components/sync/base/command_line_switches.h" #include "components/sync/base/features.h" #include "components/sync/base/invalidation_helper.h" +#include "components/sync/driver/glue/sync_transport_data_prefs.h" #include "components/sync/driver/sync_service_impl.h" #include "components/sync/driver/sync_user_settings.h" #include "components/sync/engine/sync_scheduler_impl.h" @@ -500,7 +505,7 @@ return profile_manager->GetProfileByPath(profile_path); } -Profile* SyncTest::GetProfile(int index) { +Profile* SyncTest::GetProfile(int index) const { DCHECK(!profiles_.empty()) << "SetupClients() has not yet been called."; DCHECK(index >= 0 && index < static_cast<int>(profiles_.size())) << "GetProfile(): Index is out of bounds: " << index; @@ -905,9 +910,16 @@ // TODO(crbug.com/1188034): remove the DCHECK. DCHECK(TestUsesSelfNotifications()) << "We need that for the UpdatedProgressMarkerChecker"; - client->AwaitSyncSetupCompletion(); - CommittedAllNudgedChangesChecker checker(GetSyncService(client_index)); - checker.Wait(); + ASSERT_TRUE(client->AwaitSyncSetupCompletion()); + ASSERT_TRUE( + CommittedAllNudgedChangesChecker(GetSyncService(client_index)) + .Wait()); + + // Wait for committing DeviceInfo with all the necessary fields. This is + // used to prevent starting another sync cycle after SetupSync() call + // which might be unexpected in several tests. + ASSERT_TRUE(device_info_helper::WaitForFullDeviceInfoCommitted( + GetCacheGuid(client_index))); break; } } @@ -1038,6 +1050,8 @@ context, base::BindRepeating(&SyncTest::CreateSyncInvalidationsService, &profile_to_instance_id_driver_map_, &sync_invalidations_fcm_handlers_)); + gcm::GCMProfileServiceFactory::GetInstance()->SetTestingFactory( + context, base::BindRepeating(&FakeSyncGCMDriver::Build)); } // static @@ -1314,3 +1328,8 @@ return nullptr; #endif } + +std::string SyncTest::GetCacheGuid(size_t profile_index) const { + syncer::SyncTransportDataPrefs prefs(GetProfile(profile_index)->GetPrefs()); + return prefs.GetCacheGuid(); +}
diff --git a/chrome/browser/sync/test/integration/sync_test.h b/chrome/browser/sync/test/integration/sync_test.h index 167596a..240d5cdfd 100644 --- a/chrome/browser/sync/test/integration/sync_test.h +++ b/chrome/browser/sync/test/integration/sync_test.h
@@ -208,7 +208,7 @@ // Returns a pointer to a particular sync profile. Callee owns the object // and manages its lifetime. - Profile* GetProfile(int index); + Profile* GetProfile(int index) const; // Returns a list of all profiles including the verifier if available. Callee // owns the objects and manages its lifetime. @@ -261,6 +261,8 @@ [[nodiscard]] virtual bool SetupClients(); // Initializes sync clients and profiles if required and syncs each of them. + // Makes it sure that all the local changes are committed and waits for + // populating all fields in DeviceInfo. [[nodiscard]] virtual bool SetupSync(); // This is similar to click the reset button on chrome.google.com/sync. @@ -319,6 +321,8 @@ arc::SyncArcPackageHelper* sync_arc_helper(); + std::string GetCacheGuid(size_t profile_index) const; + protected: // Add custom switches needed for running the test. void AddTestSwitches(base::CommandLine* cl);
diff --git a/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc b/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc index bf00f24..1e1d6f2 100644 --- a/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc
@@ -8,6 +8,7 @@ #include "base/strings/stringprintf.h" #include "base/test/scoped_feature_list.h" #include "base/test/test_timeouts.h" +#include "base/threading/thread_restrictions.h" #include "build/build_config.h" #include "chrome/browser/browser_features.h" #include "chrome/browser/sessions/session_service.h" @@ -293,17 +294,24 @@ ScopedWindowMap local_map_before_closing; ASSERT_TRUE(GetLocalWindows(/*browser_index=*/0, &local_map_before_closing)); - CloseTab(/*browser_index=*/0, /*tab_index=*/0); + { + // Closing the last tab results in profile destruction and hence may require + // running blocking tasks which are normally disallowed during tests. + // TODO(crbug.com/1334091): remove once it's clear why it results in + // blocking tasks. + base::ScopedAllowUnresponsiveTasksForTesting scoped_allow_sync_primitives; + CloseTab(/*browser_index=*/0, /*tab_index=*/0); - // TODO(crbug.com/1039234): When DestroyProfileOnBrowserClose is enabled, the - // last CloseTab() triggers Profile deletion (and SyncService deletion). - // This means the last tab close never gets synced. We should fix this - // regression eventually. Once that's done, merge this test with the - // WithoutDestroyProfile version. - base::RunLoop run_loop; - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, run_loop.QuitClosure(), TestTimeouts::action_timeout()); - run_loop.Run(); + // TODO(crbug.com/1039234): When DestroyProfileOnBrowserClose is enabled, + // the last CloseTab() triggers Profile deletion (and SyncService deletion). + // This means the last tab close never gets synced. We should fix this + // regression eventually. Once that's done, merge this test with the + // WithoutDestroyProfile version. + base::RunLoop run_loop; + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), TestTimeouts::action_timeout()); + run_loop.Run(); + } SyncedSessionVector sessions; ASSERT_TRUE(GetSessionData(/*browser_index=*/1, &sessions));
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 7bb12359a..d850fb0e 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/config/buildflags_paint_preview.gni") +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//build/config/chromecast_build.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/compiler/compiler.gni") @@ -12,7 +13,6 @@ import("//chrome/browser/buildflags.gni") import("//chrome/common/features.gni") import("//chromeos/ash/components/assistant/assistant.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//chromeos/dbus/config/use_real_dbus_clients.gni") import("//components/feed/features.gni") import("//components/nacl/features.gni") @@ -394,6 +394,7 @@ "//base/allocator:buildflags", "//build:branding_buildflags", "//build:chromeos_buildflags", + "//build/config/chromebox_for_meetings:buildflags", "//cc/paint", "//chrome:extra_resources", "//chrome:resources",
diff --git a/chrome/browser/ui/android/signin/BUILD.gn b/chrome/browser/ui/android/signin/BUILD.gn index f898529..da1b3c0 100644 --- a/chrome/browser/ui/android/signin/BUILD.gn +++ b/chrome/browser/ui/android/signin/BUILD.gn
@@ -83,17 +83,13 @@ android_resources("java_resources") { sources = [ - "java/res/drawable-hdpi/chrome_sync_logo.png", "java/res/drawable-hdpi/ic_account_child_20dp.png", - "java/res/drawable-mdpi/chrome_sync_logo.png", "java/res/drawable-mdpi/ic_account_child_20dp.png", "java/res/drawable-night/sync_promo_illustration.xml", - "java/res/drawable-xhdpi/chrome_sync_logo.png", "java/res/drawable-xhdpi/ic_account_child_20dp.png", - "java/res/drawable-xxhdpi/chrome_sync_logo.png", "java/res/drawable-xxhdpi/ic_account_child_20dp.png", - "java/res/drawable-xxxhdpi/chrome_sync_logo.png", "java/res/drawable-xxxhdpi/ic_account_child_20dp.png", + "java/res/drawable/chrome_sync_logo.xml", "java/res/drawable/ic_expand_more_in_circle_24dp.xml", "java/res/drawable/sync_promo_illustration.xml", "java/res/layout/account_picker_bottom_sheet_continue_button.xml",
diff --git a/chrome/browser/ui/android/signin/java/res/drawable-hdpi/chrome_sync_logo.png b/chrome/browser/ui/android/signin/java/res/drawable-hdpi/chrome_sync_logo.png deleted file mode 100644 index 22af647..0000000 --- a/chrome/browser/ui/android/signin/java/res/drawable-hdpi/chrome_sync_logo.png +++ /dev/null Binary files differ
diff --git a/chrome/browser/ui/android/signin/java/res/drawable-mdpi/chrome_sync_logo.png b/chrome/browser/ui/android/signin/java/res/drawable-mdpi/chrome_sync_logo.png deleted file mode 100644 index 0504718..0000000 --- a/chrome/browser/ui/android/signin/java/res/drawable-mdpi/chrome_sync_logo.png +++ /dev/null Binary files differ
diff --git a/chrome/browser/ui/android/signin/java/res/drawable-xhdpi/chrome_sync_logo.png b/chrome/browser/ui/android/signin/java/res/drawable-xhdpi/chrome_sync_logo.png deleted file mode 100644 index ce3a32b..0000000 --- a/chrome/browser/ui/android/signin/java/res/drawable-xhdpi/chrome_sync_logo.png +++ /dev/null Binary files differ
diff --git a/chrome/browser/ui/android/signin/java/res/drawable-xxhdpi/chrome_sync_logo.png b/chrome/browser/ui/android/signin/java/res/drawable-xxhdpi/chrome_sync_logo.png deleted file mode 100644 index b7e7cbf7..0000000 --- a/chrome/browser/ui/android/signin/java/res/drawable-xxhdpi/chrome_sync_logo.png +++ /dev/null Binary files differ
diff --git a/chrome/browser/ui/android/signin/java/res/drawable-xxxhdpi/chrome_sync_logo.png b/chrome/browser/ui/android/signin/java/res/drawable-xxxhdpi/chrome_sync_logo.png deleted file mode 100644 index bcc72c1..0000000 --- a/chrome/browser/ui/android/signin/java/res/drawable-xxxhdpi/chrome_sync_logo.png +++ /dev/null Binary files differ
diff --git a/chrome/browser/ui/android/signin/java/res/drawable/chrome_sync_logo.xml b/chrome/browser/ui/android/signin/java/res/drawable/chrome_sync_logo.xml new file mode 100644 index 0000000..2c9461c --- /dev/null +++ b/chrome/browser/ui/android/signin/java/res/drawable/chrome_sync_logo.xml
@@ -0,0 +1,59 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:aapt="http://schemas.android.com/aapt" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <group> + <clip-path + android:pathData="M0,0h24v24h-24z"/> + <path + android:pathData="M12,17.995C15.314,17.995 18,15.308 18,11.995C18,8.681 15.314,5.995 12,5.995C8.686,5.995 6,8.681 6,11.995C6,15.308 8.686,17.995 12,17.995Z" + android:fillColor="#ffffff"/> + <path + android:pathData="M17.196,15L12.005,23.99C14.111,23.992 16.181,23.439 18.004,22.387C19.829,21.334 21.343,19.819 22.395,17.995C23.447,16.171 24,14.102 23.997,11.996C23.995,9.89 23.438,7.822 22.382,6H12L11.991,6.005C13.045,6.002 14.082,6.276 14.996,6.802C15.91,7.327 16.669,8.084 17.197,8.996C17.725,9.908 18.003,10.944 18.003,11.998C18.003,13.052 17.724,14.088 17.196,15Z"> + <aapt:attr name="android:fillColor"> + <gradient + android:startX="10.738" + android:startY="23.18" + android:endX="21.02" + android:endY="5.372" + android:type="linear"> + <item android:offset="0" android:color="#FFFCC934"/> + <item android:offset="1" android:color="#FFFBBC04"/> + </gradient> + </aapt:attr> + </path> + <path + android:pathData="M6.804,15L1.613,6.01C0.559,7.833 0.003,9.901 0.003,12.007C0.003,14.113 0.557,16.182 1.611,18.005C2.665,19.828 4.18,21.341 6.005,22.392C7.83,23.443 9.9,23.995 12.005,23.991L17.196,15V14.99C16.672,15.905 15.916,16.665 15.004,17.194C14.092,17.723 13.057,18.002 12.003,18.003C10.949,18.004 9.913,17.727 9,17.2C8.087,16.672 7.33,15.914 6.804,15Z"> + <aapt:attr name="android:fillColor"> + <gradient + android:startX="14.119" + android:startY="20.145" + android:endX="-1.063" + android:endY="11.38" + android:type="linear"> + <item android:offset="0" android:color="#FF1E8E3E"/> + <item android:offset="1" android:color="#FF34A853"/> + </gradient> + </aapt:attr> + </path> + <path + android:pathData="M12,16.75C14.623,16.75 16.75,14.623 16.75,12C16.75,9.377 14.623,7.25 12,7.25C9.377,7.25 7.25,9.377 7.25,12C7.25,14.623 9.377,16.75 12,16.75Z" + android:fillColor="#1A73E8"/> + <path + android:pathData="M12,6H22.381C21.33,4.175 19.816,2.66 17.993,1.607C16.169,0.553 14.1,-0.001 11.994,0C9.888,0.001 7.82,0.557 5.997,1.612C4.175,2.667 2.662,4.184 1.613,6.009L6.804,15L6.812,15.005C6.282,14.094 6.002,13.059 6,12.005C5.998,10.95 6.274,9.914 6.8,9.001C7.326,8.088 8.084,7.329 8.997,6.802C9.91,6.275 10.946,5.999 12,6Z"> + <aapt:attr name="android:fillColor"> + <gradient + android:startX="1.858" + android:startY="7.502" + android:endX="22.153" + android:endY="7.502" + android:type="linear"> + <item android:offset="0" android:color="#FFD93025"/> + <item android:offset="1" android:color="#FFEA4335"/> + </gradient> + </aapt:attr> + </path> + </group> +</vector>
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerRenderTest.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerRenderTest.java index 0105c8e8..be359df 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerRenderTest.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SigninPromoControllerRenderTest.java
@@ -69,7 +69,7 @@ @Rule public final RenderTestRule mRenderTestRule = RenderTestRule.Builder.withPublicCorpus() - .setRevision(6) + .setRevision(7) .setBugComponent(RenderTestRule.Component.SERVICES_SIGN_IN) .build(); @@ -137,7 +137,7 @@ View view = setUpSyncPromoView(SigninAccessPoint.BOOKMARK_MANAGER, profileDataCache, R.layout.personalized_signin_promo_view_bookmarks); mRenderTestRule.render( - view, "bookmark_sync_promo_view_signed_out_and_no_account_available"); + view, "bookmark_sync_promo_illustration_signed_out_and_no_account_available"); } @Test @@ -342,7 +342,7 @@ View view = setUpSyncPromoView(SigninAccessPoint.SETTINGS, profileDataCache, R.layout.personalized_signin_promo_view_settings); mRenderTestRule.render( - view, "settings_sync_promo_view_signed_out_and_no_account_available"); + view, "settings_sync_promo_illustration_signed_out_and_no_account_available"); } @Test @@ -583,7 +583,7 @@ View view = setUpSyncPromoView(SigninAccessPoint.RECENT_TABS, profileDataCache, R.layout.personalized_signin_promo_view_recent_tabs); mRenderTestRule.render( - view, "recent_tabs_sync_promo_view_signed_out_and_no_account_available"); + view, "recent_tabs_sync_promo_illustration_signed_out_and_no_account_available"); } @Test @@ -827,7 +827,7 @@ View view = setUpSyncPromoView(SigninAccessPoint.NTP_CONTENT_SUGGESTIONS, profileDataCache, R.layout.personalized_signin_promo_view_modern_content_suggestions); mRenderTestRule.render(view, - "ntp_content_suggestions_sync_promo_view_signed_out_and_no_account_available"); + "ntp_content_suggestions_sync_promo_illustration_signed_out_and_no_account_available"); } @Test
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/account_picker/AccountPickerBottomSheetRenderTest.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/account_picker/AccountPickerBottomSheetRenderTest.java index e570d09..c1ca7e0c 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/account_picker/AccountPickerBottomSheetRenderTest.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/account_picker/AccountPickerBottomSheetRenderTest.java
@@ -103,7 +103,7 @@ @Rule public final RenderTestRule mRenderTestRule = RenderTestRule.Builder.withPublicCorpus() - .setRevision(3) + .setRevision(4) .setBugComponent(RenderTestRule.Component.SERVICES_SIGN_IN) .build();
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index 2ae6c8cd..e6c6f0f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -1224,7 +1224,7 @@ <translation id="7630202231528827509">Leverandørens nettadresse</translation> <translation id="7634280112532283638">Reduksjon i nettsøppel og svindel</translation> <translation id="7638584964844754484">Feil passordfrase</translation> -<translation id="7641339528570811325">Slett nettleserdata</translation> +<translation id="7641339528570811325">Slett nettlesingsdata</translation> <translation id="7646772052135772216">Passordsynkronisering fungerer ikke</translation> <translation id="7655900163790317559">Slår på Bluetooth …</translation> <translation id="7658239707568436148">Avbryt</translation> @@ -1297,7 +1297,7 @@ <translation id="8006818846907410687">Blokkér mens du er inkognito</translation> <translation id="8013372441983637696">Fjern også Chrome-dataene dine fra denne enheten</translation> <translation id="8015452622527143194">Tilbakestill alt på siden til standardstørrelsen</translation> -<translation id="8026334261755873520">Slett nettleserdata</translation> +<translation id="8026334261755873520">Slett nettlesingsdata</translation> <translation id="8027863900915310177">Velg hvor du vil laste ned til</translation> <translation id="8032569120109842252">Følger</translation> <translation id="8035133914807600019">Ny mappe</translation>
diff --git a/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.cc b/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.cc index ab76270..15bf0c97 100644 --- a/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.cc +++ b/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.cc
@@ -22,6 +22,7 @@ #include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" #include "ui/views/view_class_properties.h" +#include "ui/views/view_utils.h" namespace { @@ -93,10 +94,16 @@ service->OnNoteUpdated(id, note_content); } -void UserNoteUICoordinator::FocusNote(const std::string& guid) { - // TODO(cheickcisse): Implement FocusNote, which will be called by - // UserNoteService to inform, inform the user note side panel to scroll the - // corresponding note into view in the side panel. +void UserNoteUICoordinator::FocusNote(const base::UnguessableToken& guid) { + auto* scroll_contents_view = scroll_view_->contents(); + for (views::View* child_view : scroll_contents_view->children()) { + UserNoteView* user_note_view = views::AsViewClass<UserNoteView>(child_view); + if (user_note_view->user_note_id() == guid) { + scroll_to_note_id_ = user_note_view->user_note_id(); + ScrollToNote(); + return; + } + } } void UserNoteUICoordinator::StartNoteCreation( @@ -108,7 +115,7 @@ int index = 0; for (views::View* child_view : scroll_contents_view->children()) { - UserNoteView* user_note_view = static_cast<UserNoteView*>(child_view); + UserNoteView* user_note_view = views::AsViewClass<UserNoteView>(child_view); if (user_note_view->user_note_rect() < instance->rect()) { index++; continue; @@ -136,8 +143,8 @@ for (views::View* child_content_view : scroll_view_->contents()->children()) { UserNoteView* user_note_view = - static_cast<UserNoteView*>(child_content_view); - if (user_note_view->UserNoteId() == scroll_to_note_id_) { + views::AsViewClass<UserNoteView>(child_content_view); + if (user_note_view->user_note_id() == scroll_to_note_id_) { child_content_view->ScrollViewToVisible(); break; } @@ -201,17 +208,17 @@ continue; } - UserNoteView* user_note_view = static_cast<UserNoteView*>( + UserNoteView* user_note_view = views::AsViewClass<UserNoteView>( scroll_contents_view->children().at(views_index)); - if (user_note_view->UserNoteId() == base::UnguessableToken::Null()) { + if (user_note_view->user_note_id() == base::UnguessableToken::Null()) { // Remove the current UserNoteView from scroll_contents_view if its Id is // null. scroll_contents_view->RemoveChildView(user_note_view); continue; } - if (user_note_view->UserNoteId() == user_note_instance->model().id()) { + if (user_note_view->user_note_id() == user_note_instance->model().id()) { instances_index++; views_index++; } else if (user_note_view->user_note_rect() < user_note_instance->rect()) { @@ -241,8 +248,10 @@ TabStripModel* tab_strip_model, const TabStripModelChange& change, const TabStripSelectionChange& selection) { - // TODO(cheickcisse): Call invalidate on active tab changed. It seems to - // fail when the tab is deleted. + if (!selection.active_tab_changed() || tab_strip_model->closing_all()) + return; + + Invalidate(); } std::unique_ptr<views::View> UserNoteUICoordinator::CreateUserNotesView() {
diff --git a/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.h b/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.h index ca1b065..394f79b 100644 --- a/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.h +++ b/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.h
@@ -60,7 +60,7 @@ const std::string& note_content); // UserNoteUI overrides - void FocusNote(const std::string& guid) override; + void FocusNote(const base::UnguessableToken& guid) override; void StartNoteCreation(user_notes::UserNoteInstance* instance) override; void Invalidate() override; void Show() override;
diff --git a/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator_unittest.cc b/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator_unittest.cc index 44d91d6..5728c6d6 100644 --- a/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator_unittest.cc +++ b/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator_unittest.cc
@@ -134,7 +134,7 @@ UserNoteView* user_note_view = views::AsViewClass<UserNoteView>(child_view); // Verify that the notes added to the service are displayed in the user note // side panel. - EXPECT_EQ(user_note_view->UserNoteId(), note_ids_[index]); + EXPECT_EQ(user_note_view->user_note_id(), note_ids_[index]); index++; } } @@ -175,7 +175,7 @@ UserNoteView* middle_user_note_view = views::AsViewClass<UserNoteView>( scroll_view->contents()->children().at(1)); // Verify that note3 is the middle note in the side panel. - EXPECT_EQ(middle_user_note_view->UserNoteId(), note_ids_[index]); + EXPECT_EQ(middle_user_note_view->user_note_id(), note_ids_[index]); } TEST_F(UserNoteUICoordinatorTest, AddNoteEndUserSidePanel) { @@ -215,7 +215,7 @@ UserNoteView* last_user_note_view = views::AsViewClass<UserNoteView>( scroll_view->contents()->children().at(index)); // Verify that note3 is the last note in the side panel. - EXPECT_EQ(last_user_note_view->UserNoteId(), note_ids_[index]); + EXPECT_EQ(last_user_note_view->user_note_id(), note_ids_[index]); } // TODO(crbug.com/1328966): Re-enable this test @@ -257,7 +257,7 @@ for (auto* child_view : scroll_view->contents()->children()) { UserNoteView* user_note_view = views::AsViewClass<UserNoteView>(child_view); // Verify that note2 has been removed from the side panel. - EXPECT_NE(user_note_view->UserNoteId(), note_ids_[1]); + EXPECT_NE(user_note_view->user_note_id(), note_ids_[1]); } } @@ -300,7 +300,7 @@ for (auto* child_view : scroll_view->contents()->children()) { UserNoteView* user_note_view = views::AsViewClass<UserNoteView>(child_view); // Verify that note3 has been removed from the side panel. - EXPECT_NE(user_note_view->UserNoteId(), note_ids_[index]); + EXPECT_NE(user_note_view->user_note_id(), note_ids_[index]); } }
diff --git a/chrome/browser/ui/views/side_panel/user_note/user_note_view.cc b/chrome/browser/ui/views/side_panel/user_note/user_note_view.cc index c807dc5..a6f9a29 100644 --- a/chrome/browser/ui/views/side_panel/user_note/user_note_view.cc +++ b/chrome/browser/ui/views/side_panel/user_note/user_note_view.cc
@@ -378,7 +378,7 @@ void UserNoteView::OnCancelUserNote(UserNoteView::State state) { if (state == UserNoteView::State::kCreating) { - coordinator_->OnNoteCreationCancelled(UserNoteId(), this); + coordinator_->OnNoteCreationCancelled(user_note_id(), this); return; } @@ -408,7 +408,7 @@ base::UTF16ToUTF8(note_content), /*quote =*/std::string()); - coordinator_->OnNoteCreationDone(UserNoteId(), + coordinator_->OnNoteCreationDone(user_note_id(), base::UTF16ToUTF8(note_content)); } @@ -430,7 +430,7 @@ } void UserNoteView::OnDeleteUserNote(int event_flags) { - coordinator_->OnNoteDeleted(UserNoteId(), this); + coordinator_->OnNoteDeleted(user_note_id(), this); } void UserNoteView::OnLearnUserNote(int event_flags) { @@ -459,5 +459,5 @@ date, base::UTF16ToUTF8(note_content), !note_quote.empty() ? base::UTF16ToUTF8(note_quote) : std::string()); - coordinator_->OnNoteUpdated(UserNoteId(), base::UTF16ToUTF8(note_content)); + coordinator_->OnNoteUpdated(user_note_id(), base::UTF16ToUTF8(note_content)); }
diff --git a/chrome/browser/ui/views/side_panel/user_note/user_note_view.h b/chrome/browser/ui/views/side_panel/user_note/user_note_view.h index aa8f2d9b..340e7f3b 100644 --- a/chrome/browser/ui/views/side_panel/user_note/user_note_view.h +++ b/chrome/browser/ui/views/side_panel/user_note/user_note_view.h
@@ -55,7 +55,7 @@ UserNoteView& operator=(const UserNoteView&) = delete; ~UserNoteView() override; - const base::UnguessableToken& UserNoteId() { return id_; } + const base::UnguessableToken& user_note_id() { return id_; } const gfx::Rect& user_note_rect() const { return rect_; }
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index c28d4c8..bad1855f 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -213,6 +213,7 @@ #include "ash/webui/system_extensions_internals_ui/system_extensions_internals_ui.h" #include "ash/webui/system_extensions_internals_ui/url_constants.h" #include "base/system/sys_info.h" +#include "build/config/chromebox_for_meetings/buildflags.h" #include "chrome/browser/app_mode/app_mode_utils.h" #include "chrome/browser/ash/arc/arc_util.h" #include "chrome/browser/ash/device_sync/device_sync_client_factory.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h index 2c2e19f..b5bb05bb 100644 --- a/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/error_screen_handler.h
@@ -18,7 +18,8 @@ // representation. Owned by ErrorScreen. class ErrorScreenView { public: - constexpr static StaticOobeScreenId kScreenId{"error-message"}; + constexpr static StaticOobeScreenId kScreenId{"error-message", + "ErrorMessageScreen"}; virtual ~ErrorScreenView() {}
diff --git a/chrome/browser/ui/webui/chromeos/login/offline_login_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/offline_login_screen_handler.cc index 2e58f517..24058c7 100644 --- a/chrome/browser/ui/webui/chromeos/login/offline_login_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/offline_login_screen_handler.cc
@@ -51,19 +51,8 @@ builder->Add("offlineLoginOkBtn", IDS_OFFLINE_LOGIN_OK_BUTTON_TEXT); } -void OfflineLoginScreenHandler::InitializeDeprecated() { - if (show_on_init_) { - show_on_init_ = false; - Show(); - } -} - -void OfflineLoginScreenHandler::Show() { - if (!IsJavascriptAllowed()) { - show_on_init_ = true; - return; - } - ShowInWebUI(); +void OfflineLoginScreenHandler::Show(base::Value::Dict params) { + ShowInWebUI(std::move(params)); } void OfflineLoginScreenHandler::Hide() { @@ -95,10 +84,6 @@ screen_->HandleEmailSubmitted(username); } -void OfflineLoginScreenHandler::LoadParams(base::DictionaryValue params) { - CallJS("login.OfflineLoginScreen.loadParams", std::move(params)); -} - void OfflineLoginScreenHandler::ShowPasswordPage() { CallJS("login.OfflineLoginScreen.proceedToPasswordPage"); }
diff --git a/chrome/browser/ui/webui/chromeos/login/offline_login_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/offline_login_screen_handler.h index f055e347..7805b63 100644 --- a/chrome/browser/ui/webui/chromeos/login/offline_login_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/offline_login_screen_handler.h
@@ -21,7 +21,7 @@ virtual ~OfflineLoginView() = default; // Shows the contents of the screen. - virtual void Show() = 0; + virtual void Show(base::Value::Dict params) = 0; // Hide the contents of the screen. virtual void Hide() = 0; @@ -35,11 +35,6 @@ // Clear the input fields on the screen. virtual void Reset() = 0; - // Preload e-mail, enterprise domain and e-mail domain. - // TODO(dkuzmin): merge this function with Show() in future and use - // ShowScreenWithData in handler. - virtual void LoadParams(base::DictionaryValue params) = 0; - // Proceeds to the password input dialog. virtual void ShowPasswordPage() = 0; @@ -67,12 +62,11 @@ void HandleEmailSubmitted(const std::string& username); // OfflineLoginView: - void Show() override; + void Show(base::Value::Dict params) override; void Hide() override; void Bind(ash::OfflineLoginScreen* screen) override; void Unbind() override; void Reset() override; - void LoadParams(base::DictionaryValue params) override; void ShowPasswordPage() override; void ShowOnlineRequiredDialog() override; void ShowPasswordMismatchMessage() override; @@ -81,12 +75,8 @@ void RegisterMessages() override; void DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) override; - void InitializeDeprecated() override; ash::OfflineLoginScreen* screen_ = nullptr; - - // Whether the screen should be shown right after initialization. - bool show_on_init_ = false; }; } // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc index bcb65a2..7358373 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -61,7 +61,6 @@ #include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/l10n_util.h" #include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" -#include "chrome/browser/ui/webui/chromeos/login/offline_login_screen_handler.h" #include "chrome/browser/ui/webui/webui_util.h" #include "chrome/common/channel_info.h" #include "chrome/common/pref_names.h" @@ -207,8 +206,6 @@ ::login::LocalizedValuesBuilder* builder) {} void SigninScreenHandler::RegisterMessages() { - AddCallback("offlineLogin", &SigninScreenHandler::HandleOfflineLogin); - AddCallback("showLoadingTimeoutError", &SigninScreenHandler::HandleShowLoadingTimeoutError); } @@ -362,6 +359,8 @@ if (!is_online || is_gaia_loading_timeout || is_gaia_error) { if (GetCurrentScreen() != ErrorScreenView::kScreenId) { error_screen_->SetParentScreen(GaiaView::kScreenId); + error_screen_->SetHideCallback(base::BindOnce( + &SigninScreenHandler::OnErrorScreenHide, weak_factory_.GetWeakPtr())); error_screen_->ShowNetworkErrorMessage(state, reason); histogram_helper_->OnErrorShow(error_screen_->GetErrorState()); } @@ -381,7 +380,6 @@ gaia_reload_reason_ = NetworkError::ERROR_REASON_NONE; error_screen_->Hide(); - histogram_helper_->OnErrorHide(); // Forces a reload for Gaia screen on hiding error message. if (IsGaiaVisible() || IsGaiaHiddenByError()) @@ -440,18 +438,9 @@ network_state_ignored_until_proxy_auth_ = false; } -void SigninScreenHandler::HandleOfflineLogin() { - if (!delegate_) { - NOTREACHED(); - return; - } - - auto* offline_login_screen = - WizardController::default_controller()->GetScreen<OfflineLoginScreen>(); - offline_login_screen->LoadOffline(); - HideOfflineMessage(NetworkStateInformer::OFFLINE, - NetworkError::ERROR_REASON_NONE); - LoginDisplayHost::default_host()->StartWizard(OfflineLoginView::kScreenId); +void SigninScreenHandler::OnErrorScreenHide() { + histogram_helper_->OnErrorHide(); + ShowScreenDeprecated(GaiaView::kScreenId); } void SigninScreenHandler::HandleShowLoadingTimeoutError() {
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h index 93e65e9..f82446761 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
@@ -122,8 +122,6 @@ const content::NotificationDetails& details) override; // WebUI message handlers. - void HandleOfflineLogin(); - void HandleShowLoadingTimeoutError(); // Returns true if current visible screen is the Gaia sign-in page. @@ -144,6 +142,10 @@ // responding to network state notifications. void ReenableNetworkStateUpdatesAfterProxyAuth(); + // Error screen hide callback which records error screen metrics and shows + // GAIA. + void OnErrorScreenHide(); + // A delegate that glues this handler with backend LoginDisplay. SigninScreenHandlerDelegate* delegate_ = nullptr;
diff --git a/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc b/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc index acad67f7..d1736cc 100644 --- a/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/testapi/oobe_test_api_handler.cc
@@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/check.h" #include "base/logging.h" +#include "base/notreached.h" #include "base/values.h" #include "build/branding_buildflags.h" #include "chrome/browser/ash/login/existing_user_controller.h" @@ -112,8 +113,13 @@ } void OobeTestAPIHandler::SkipToLoginForTesting() { - ash::WizardController::default_controller() - ->SkipToLoginForTesting(); // IN-TEST + ash::WizardController* controller = + ash::WizardController::default_controller(); + if (!controller || !controller->is_initialized()) { + NOTREACHED() << "Please fix the test"; + return; + } + controller->SkipToLoginForTesting(); // IN-TEST } void OobeTestAPIHandler::SkipPostLoginScreens() {
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 90828df..ec9273e 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1655704353-a53b3cc95b0b6983a2365b1919f917a338142185.profdata +chrome-linux-main-1655726346-5d707fc3ab2240c4e8e426e781ea0a87f0e0169d.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 480f81f..1880fef 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1655704353-19b9e2c25552e57419ea9727d3e47b532404f9e7.profdata +chrome-mac-main-1655726346-a95a98e7cbb3ce8890100108f0f51050a2cf9236.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index c3923a4..5e8f2c76 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1655704353-c91cd5ebdaa64ed318abafcb92d42c27671d8253.profdata +chrome-win32-main-1655726346-9c4bc155751ee92090a8aa5402b9f1f879ea7e23.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index ddaefa3..5ac127e 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1655704353-33ac364df421e0c9c111251b5892ef5f617e970a.profdata +chrome-win64-main-1655736275-94e01fa9d65a1be3e14b10f36924656da2099998.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni index 2a4ce28..6b47275 100644 --- a/chrome/chrome_paks.gni +++ b/chrome/chrome_paks.gni
@@ -3,11 +3,11 @@ # found in the LICENSE file. import("//ash/ambient/resources/resources.gni") +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/locales.gni") import("//chrome/browser/buildflags.gni") import("//chrome/common/features.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//extensions/buildflags/buildflags.gni") import("//pdf/features.gni") import("//ui/base/ui_features.gni")
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn index de183da..cf45f93 100644 --- a/chrome/common/BUILD.gn +++ b/chrome/common/BUILD.gn
@@ -172,6 +172,7 @@ "//base:base_static", "//base:i18n", "//build:branding_buildflags", + "//build/config/chromebox_for_meetings:buildflags", "//chrome:resources", "//chrome:strings", "//chrome/app/theme:theme_resources", @@ -181,7 +182,6 @@ "//chrome/common/profiler", "//chrome/common/search:mojo_bindings", "//chrome/installer/util:with_no_strings", - "//chromeos/components/chromebox_for_meetings/buildflags", "//components/cast_certificate", "//components/cdm/common", "//components/client_hints/common",
diff --git a/chrome/common/DEPS b/chrome/common/DEPS index 392de93..f94a2fc 100644 --- a/chrome/common/DEPS +++ b/chrome/common/DEPS
@@ -3,7 +3,6 @@ "+chrome/grit", "+chrome/install_static", "+chrome/services/file_util/public", - "+chromeos/components/chromebox_for_meetings/buildflags", "+chromeos/crosapi", "+chromeos/lacros/lacros_paths.h", "+components/autofill/content/common",
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc index 0c2164ba..06e7985 100644 --- a/chrome/common/webui_url_constants.cc +++ b/chrome/common/webui_url_constants.cc
@@ -7,6 +7,7 @@ #include "base/strings/string_piece.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "build/config/chromebox_for_meetings/buildflags.h" #include "components/history_clusters/history_clusters_internals/webui/url_constants.h" #include "components/nacl/common/buildflags.h" #include "components/optimization_guide/optimization_guide_internals/webui/url_constants.h"
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h index ae88c06..958d7d5 100644 --- a/chrome/common/webui_url_constants.h +++ b/chrome/common/webui_url_constants.h
@@ -14,8 +14,8 @@ #include "build/branding_buildflags.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "build/config/chromebox_for_meetings/buildflags.h" #include "chrome/common/buildflags.h" -#include "chromeos/components/chromebox_for_meetings/buildflags/buildflags.h" #include "content/public/common/url_constants.h" #include "media/media_buildflags.h" #include "printing/buildflags/buildflags.h"
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index f6cda281..885ecfa 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -1344,6 +1344,10 @@ FROM_HERE, base::BindOnce(&ThreadProfiler::StartOnChildThread, metrics::CallStackProfileParams::Thread::kCompositor)); + // Enable stack sampling for tracing. + compositor_thread_task_runner->PostTask( + FROM_HERE, + base::BindOnce(&tracing::TracingSamplerProfiler::CreateOnChildThread)); } bool ChromeContentRendererClient::RunIdleHandlerWhenWidgetsHidden() {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index d051bde8..552fc88 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -5,6 +5,7 @@ import("//build/cipd/cipd.gni") import("//build/config/buildflags_paint_preview.gni") import("//build/config/chrome_build.gni") +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/compiler/compiler.gni") import("//build/config/features.gni") @@ -21,7 +22,6 @@ import("//chrome/test/base/js2gtest.gni") import("//chrome/test/include_js_tests.gni") import("//chromeos/ash/components/assistant/assistant.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//components/captive_portal/core/features.gni") import("//components/exo/buildflags.gni") import("//components/feed/features.gni") @@ -2624,6 +2624,7 @@ "../browser/chromeos/policy/dlp/dlp_content_tab_helper_browsertest.cc", "../browser/chromeos/policy/dlp/dlp_reporting_manager_test_helper.cc", "../browser/chromeos/policy/dlp/dlp_reporting_manager_test_helper.h", + "../browser/chromeos/policy/dlp/dlp_rules_manager_impl_browsertest.cc", "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.cc", "../browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.h", "../browser/chromeos/policy/dlp/mock_dlp_content_observer.cc", @@ -3130,10 +3131,10 @@ ] deps += [ - "../browser/chromeos/extensions/telemetry/api:browser_tests", + "//build/config/chromebox_for_meetings:buildflags", + "//chrome/browser/chromeos/extensions/telemetry/api:browser_tests", "//chrome/browser/chromeos/extensions/vpn_provider", "//chrome/browser/error_reporting:test_support", - "//chromeos/components/chromebox_for_meetings/buildflags", "//chromeos/dbus/dlp:dlp", ] @@ -9648,6 +9649,8 @@ "../browser/sync/test/integration/fake_server_match_status_checker.h", "../browser/sync/test/integration/fake_server_sync_invalidation_sender.cc", "../browser/sync/test/integration/fake_server_sync_invalidation_sender.h", + "../browser/sync/test/integration/fake_sync_gcm_driver_for_instance_id.cc", + "../browser/sync/test/integration/fake_sync_gcm_driver_for_instance_id.h", "../browser/sync/test/integration/multi_client_status_change_checker.cc", "../browser/sync/test/integration/multi_client_status_change_checker.h", "../browser/sync/test/integration/offer_helper.cc",
diff --git a/chrome/test/data/extensions/api_test/declarative_net_request/test_match_outcome/background.js b/chrome/test/data/extensions/api_test/declarative_net_request/test_match_outcome/background.js index ab0cfba..fc3a62b0 100644 --- a/chrome/test/data/extensions/api_test/declarative_net_request/test_match_outcome/background.js +++ b/chrome/test/data/extensions/api_test/declarative_net_request/test_match_outcome/background.js
@@ -15,6 +15,15 @@ } chrome.test.runTests([ + + function setup() { + // Enable the extension's rulesets here, instead of by default in the + // manifest, to ensure that the ruelsets are ready before running the tests + // and avoid race condition. This works since the tests run sequentially. + chrome.declarativeNetRequest.updateEnabledRulesets( + {enableRulesetIds: ['rules1', 'rules2']}, chrome.test.succeed) + }, + function testInvalidUrl() { chrome.declarativeNetRequest.testMatchOutcome( {url: 'http:://example.example', type: 'sub_frame'},
diff --git a/chrome/test/data/extensions/api_test/declarative_net_request/test_match_outcome/manifest.json b/chrome/test/data/extensions/api_test/declarative_net_request/test_match_outcome/manifest.json index bc3d5cdd..bbb90a78 100644 --- a/chrome/test/data/extensions/api_test/declarative_net_request/test_match_outcome/manifest.json +++ b/chrome/test/data/extensions/api_test/declarative_net_request/test_match_outcome/manifest.json
@@ -4,11 +4,11 @@ "rule_resources": [{ "id": "rules1", "path": "rules1.json", - "enabled": true + "enabled": false }, { "id": "rules2", "path": "rules2.json", - "enabled": true + "enabled": false }] }, "manifest_version": 2,
diff --git a/chrome/test/data/extensions/platform_apps/web_view/simple/main.js b/chrome/test/data/extensions/platform_apps/web_view/simple/main.js index dee6c63..0e92d66 100644 --- a/chrome/test/data/extensions/platform_apps/web_view/simple/main.js +++ b/chrome/test/data/extensions/platform_apps/web_view/simple/main.js
@@ -12,13 +12,13 @@ webview.removeEventListener('loadabort', onLoadAbort); callback(); }; - webview.addEventListener('loadstop', onLoadStop); - var onLoadAbort = function(e) { chrome.test.sendMessage('WebViewTest.FAILURE'); webview.removeEventListener('loadstop', onLoadStop); webview.removeEventListener('loadabort', onLoadAbort); }; + webview.addEventListener('loadstop', onLoadStop); + webview.addEventListener('loadabort', onLoadAbort); webview.src = 'data:text/html,<html><body>simple test</body></html>'; return webview; }
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json index 76a1f5f..5bc80510 100644 --- a/chrome/test/data/policy/policy_test_cases.json +++ b/chrome/test/data/policy/policy_test_cases.json
@@ -15200,7 +15200,7 @@ "policies": { "SendDownloadToCloudEnterpriseConnector": [ { - "service_provider": "Google", + "service_provider": "box", "enterprise_id": "1234567890", "domain": "example.com", "enable": [ @@ -15239,7 +15239,7 @@ "enterprise_connectors.send_download_to_cloud": { "value": [ { - "service_provider": "Google", + "service_provider": "box", "enterprise_id": "1234567890", "domain": "example.com", "enable": [ @@ -15300,7 +15300,7 @@ "policies": { "OnFileAttachedEnterpriseConnector": [ { - "service_provider": "Google", + "service_provider": "google", "enable": [ { "url_list": [ @@ -15355,7 +15355,7 @@ "policies": { "OnFileDownloadedEnterpriseConnector": [ { - "service_provider": "Google", + "service_provider": "google", "enable": [ { "url_list": [ @@ -15410,7 +15410,7 @@ "policies": { "OnBulkDataEntryEnterpriseConnector": [ { - "service_provider": "Google", + "service_provider": "google", "enable": [ { "url_list": [ @@ -15463,7 +15463,7 @@ "policies": { "OnPrintEnterpriseConnector": [ { - "service_provider": "Google", + "service_provider": "google", "enable": [ { "url_list": ["*"], "tags": ["malware"] }, { "url_list": ["*.them.com", "*.others.com"], "tags": ["dlp"] } @@ -15495,7 +15495,7 @@ "policies": { "OnSecurityEventEnterpriseConnector": [ { - "service_provider": "Google" + "service_provider": "google" } ] },
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn index 4327fdd..2399004d 100644 --- a/chrome/test/data/webui/BUILD.gn +++ b/chrome/test/data/webui/BUILD.gn
@@ -2,12 +2,12 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//build/config/chromeos/ui_mode.gni") import("//build/config/ui.gni") import("//chrome/common/features.gni") import("//chrome/test/base/js2gtest.gni") import("//chrome/test/include_js_tests.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//components/signin/features.gni") import("//crypto/features.gni") import("//extensions/buildflags/buildflags.gni")
diff --git a/chrome/test/data/webui/settings/BUILD.gn b/chrome/test/data/webui/settings/BUILD.gn index 3abed204..1afbc2d 100644 --- a/chrome/test/data/webui/settings/BUILD.gn +++ b/chrome/test/data/webui/settings/BUILD.gn
@@ -74,7 +74,7 @@ "on_startup_page_tests.ts", "passwords_and_autofill_fake_data.ts", "passwords_device_section_test.ts", - "passwords_export_test.ts", + "passwords_export_dialog_test.ts", "passwords_import_dialog_test.ts", "passwords_section_test.ts", "payments_section_interactive_test.ts",
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js index 0cfa3c6..06b0f5d 100644 --- a/chrome/test/data/webui/settings/cr_settings_browsertest.js +++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -745,6 +745,7 @@ ['HelpPage', 'help_page_test.js'], ['Menu', 'settings_menu_test.js'], ['PasswordView', 'password_view_test.js'], + ['PasswordsExportDialog', 'passwords_export_dialog_test.js'], ['PasswordsImportDialog', 'passwords_import_dialog_test.js'], ['PaymentsSection', 'payments_section_test.js'], ['PeoplePage', 'people_page_test.js'],
diff --git a/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts b/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts index 8413e681..18e14e7 100644 --- a/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts +++ b/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts
@@ -6,7 +6,7 @@ import {assertNotReached} from 'chrome://resources/js/assert.m.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AutofillManagerProxy, PasswordEditDialogElement, PasswordListItemElement, PasswordMoveMultiplePasswordsToAccountDialogElement, PasswordsExportDialogElement, PasswordsImportDialogElement, PasswordsSectionElement, PaymentsManagerProxy, PersonalDataChangedListener} from 'chrome://settings/lazy_load.js'; -import {MultiStoreExceptionEntry, MultiStorePasswordUiEntry, PasswordManagerProxy} from 'chrome://settings/settings.js'; +import {MultiStoreExceptionEntry, MultiStorePasswordUiEntry} from 'chrome://settings/settings.js'; import {assertEquals} from 'chrome://webui-test/chai_assert.js'; import {TestPasswordManagerProxy} from './test_password_manager_proxy.js'; @@ -411,19 +411,10 @@ /** * Helper method used to create an export passwords dialog. */ - createExportPasswordsDialog(passwordManager: PasswordManagerProxy): - PasswordsExportDialogElement { - passwordManager.requestExportProgressStatus = callback => { - callback(chrome.passwordsPrivate.ExportProgressStatus.NOT_STARTED); - }; - passwordManager.exportPasswords = (callback) => { - callback(); - }; - + createExportPasswordsDialog(): PasswordsExportDialogElement { const dialog = this.document.createElement('passwords-export-dialog'); this.document.body.appendChild(dialog); flush(); - return dialog; }
diff --git a/chrome/test/data/webui/settings/passwords_export_test.ts b/chrome/test/data/webui/settings/passwords_export_dialog_test.ts similarity index 63% rename from chrome/test/data/webui/settings/passwords_export_test.ts rename to chrome/test/data/webui/settings/passwords_export_dialog_test.ts index f3bac00..c37de26 100644 --- a/chrome/test/data/webui/settings/passwords_export_test.ts +++ b/chrome/test/data/webui/settings/passwords_export_dialog_test.ts
@@ -1,35 +1,39 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. +// Copyright 2022 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +/** @fileoverview Runs the Polymer Passwords Export Dialog tests. */ + // clang-format off +import 'chrome://settings/lazy_load.js'; + +import {isChromeOS, isLacros} from 'chrome://resources/js/cr.m.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {CrDialogElement, PasswordsExportDialogElement} from 'chrome://settings/lazy_load.js'; +import {PasswordManagerImpl} from 'chrome://settings/settings.js'; import {assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {MockTimer} from 'chrome://webui-test/mock_timer.js'; import {eventToPromise} from 'chrome://webui-test/test_util.js'; +import {PasswordSectionElementFactory} from './passwords_and_autofill_fake_data.js'; import {TestPasswordManagerProxy} from './test_password_manager_proxy.js'; + // clang-format on // Test that tapping "Export passwords..." notifies the browser. -export function runStartExportTest( +export async function runStartExportTest( exportDialog: PasswordsExportDialogElement, - passwordManager: TestPasswordManagerProxy, done: Function) { - passwordManager.exportPasswords = (callback) => { - callback(); - done(); - }; - + passwordManager: TestPasswordManagerProxy) { exportDialog.shadowRoot!.querySelector<HTMLElement>( '#exportPasswordsButton')!.click(); + await passwordManager.whenCalled('exportPasswords'); } // Test the export flow. If exporting is fast, we should skip the // in-progress view altogether. export function runExportFlowFastTest( exportDialog: PasswordsExportDialogElement, - passwordManager: TestPasswordManagerProxy, done: Function) { + passwordManager: TestPasswordManagerProxy) { const progressCallback = passwordManager.lastCallback.addPasswordsFileExportProgressListener!; @@ -59,7 +63,6 @@ '#dialog_error')); assertFalse(!!exportDialog.shadowRoot!.querySelector<CrDialogElement>( '#dialog_progress')); - done(); mockTimer.uninstall(); } @@ -67,7 +70,7 @@ // The error view is shown when an error occurs. export function runExportFlowErrorTest( exportDialog: PasswordsExportDialogElement, - passwordManager: TestPasswordManagerProxy, done: Function) { + passwordManager: TestPasswordManagerProxy) { const progressCallback = passwordManager.lastCallback.addPasswordsFileExportProgressListener!; @@ -101,7 +104,6 @@ flush(); assertFalse(!!exportDialog.shadowRoot!.querySelector<CrDialogElement>( '#dialog_error')); - done(); mockTimer.uninstall(); } @@ -109,49 +111,42 @@ // The error view allows to retry. export function runExportFlowErrorRetryTest( exportDialog: PasswordsExportDialogElement, - passwordManager: TestPasswordManagerProxy, done: Function) { + passwordManager: TestPasswordManagerProxy) { const progressCallback = passwordManager.lastCallback.addPasswordsFileExportProgressListener!; // Use this to freeze the delayed progress bar and avoid flakiness. const mockTimer = new MockTimer(); - new Promise(resolve => { - mockTimer.install(); + mockTimer.install(); - passwordManager.exportPasswords = resolve; - exportDialog.shadowRoot! - .querySelector<HTMLElement>('#exportPasswordsButton')!.click(); - }).then(() => { - // This wait allows the BlockingRequestManager to process the click if - // the test is running in ChromeOS. - progressCallback( - {status: chrome.passwordsPrivate.ExportProgressStatus.IN_PROGRESS}); - progressCallback({ - status: chrome.passwordsPrivate.ExportProgressStatus.FAILED_WRITE_FAILED, - folderName: 'tmp', - }); + exportDialog.shadowRoot!.querySelector<HTMLElement>( + '#exportPasswordsButton')!.click(); - flush(); - // Test that the error dialog is shown. - assertTrue(exportDialog.shadowRoot! - .querySelector<CrDialogElement>('#dialog_error')!.open); - // Test that clicking retry will start a new export. - passwordManager.exportPasswords = (callback) => { - callback(); - done(); - }; - exportDialog.shadowRoot!.querySelector<HTMLElement>( - '#tryAgainButton')!.click(); - - mockTimer.uninstall(); + progressCallback( + {status: chrome.passwordsPrivate.ExportProgressStatus.IN_PROGRESS}); + progressCallback({ + status: chrome.passwordsPrivate.ExportProgressStatus.FAILED_WRITE_FAILED, + folderName: 'tmp', }); + + flush(); + // Test that the error dialog is shown. + assertTrue( + exportDialog.shadowRoot!.querySelector<CrDialogElement>( + '#dialog_error')!.open); + // Test that clicking retry will start a new export. + + exportDialog.shadowRoot!.querySelector<HTMLElement>( + '#tryAgainButton')!.click(); + + mockTimer.uninstall(); } // Test the export flow. If exporting is slow, Chrome should show the // in-progress dialog for at least 1000ms. export function runExportFlowSlowTest( exportDialog: PasswordsExportDialogElement, - passwordManager: TestPasswordManagerProxy, done: Function) { + passwordManager: TestPasswordManagerProxy) { const progressCallback = passwordManager.lastCallback.addPasswordsFileExportProgressListener!; @@ -208,23 +203,18 @@ '#dialog_start')); assertFalse(!!exportDialog.shadowRoot!.querySelector<CrDialogElement>( '#dialog_error')); - done(); mockTimer.uninstall(); } // Test that canceling the dialog while exporting will also cancel the // export on the browser. -export function runCancelExportTest( +export async function runCancelExportTest( exportDialog: PasswordsExportDialogElement, - passwordManager: TestPasswordManagerProxy, done: Function) { + passwordManager: TestPasswordManagerProxy) { const progressCallback = passwordManager.lastCallback.addPasswordsFileExportProgressListener!; - passwordManager.cancelExportPasswords = () => { - done(); - }; - const mockTimer = new MockTimer(); mockTimer.install(); @@ -241,6 +231,7 @@ .querySelector<CrDialogElement>('#dialog_progress')!.open); exportDialog.shadowRoot! .querySelector<HTMLElement>('#cancel_progress_button')!.click(); + await passwordManager.whenCalled('cancelExportPasswords'); flush(); // The dialog should be dismissed entirely. @@ -254,15 +245,95 @@ mockTimer.uninstall(); } -export function runFireCloseEventAfterExportCompleteTest( +export async function runFireCloseEventAfterExportCompleteTest( exportDialog: PasswordsExportDialogElement, passwordManager: TestPasswordManagerProxy) { - const wait = eventToPromise('passwords-export-dialog-close', exportDialog); exportDialog.shadowRoot!.querySelector<HTMLElement>( '#exportPasswordsButton')!.click(); passwordManager.lastCallback.addPasswordsFileExportProgressListener! ({status: chrome.passwordsPrivate.ExportProgressStatus.IN_PROGRESS}); passwordManager.lastCallback.addPasswordsFileExportProgressListener! ({status: chrome.passwordsPrivate.ExportProgressStatus.SUCCEEDED}); - return wait; + await eventToPromise('passwords-export-dialog-close', exportDialog); } + +suite('PasswordsExportDialog', function() { + let passwordManager: TestPasswordManagerProxy; + let elementFactory: PasswordSectionElementFactory; + + + setup(function() { + document.body.innerHTML = ''; + // Override the PasswordManagerImpl for testing. + passwordManager = new TestPasswordManagerProxy(); + PasswordManagerImpl.setInstance(passwordManager); + elementFactory = new PasswordSectionElementFactory(document); + }); + + + if (!(isChromeOS || isLacros)) { + // Test that tapping "Export passwords..." notifies the browser. + test('startExport', async function() { + const exportDialog = elementFactory.createExportPasswordsDialog(); + await runStartExportTest(exportDialog, passwordManager); + }); + + // Test the export flow. If exporting is fast, we should skip the + // in-progress view altogether. + test('exportFlowFast', function() { + const exportDialog = elementFactory.createExportPasswordsDialog(); + runExportFlowFastTest(exportDialog, passwordManager); + }); + + // The error view is shown when an error occurs. + test('exportFlowError', function() { + const exportDialog = elementFactory.createExportPasswordsDialog(); + runExportFlowErrorTest(exportDialog, passwordManager); + }); + + // The error view allows to retry. + test('exportFlowErrorRetry', function() { + const exportDialog = elementFactory.createExportPasswordsDialog(); + runExportFlowErrorRetryTest(exportDialog, passwordManager); + }); + + // Test the export flow. If exporting is slow, Chrome should show the + // in-progress dialog for at least 1000ms. + test('exportFlowSlow', function() { + const exportDialog = elementFactory.createExportPasswordsDialog(); + runExportFlowSlowTest(exportDialog, passwordManager); + }); + + // Test that canceling the dialog while exporting will also cancel the + // export on the browser. + test('cancelExport', async function() { + const exportDialog = elementFactory.createExportPasswordsDialog(); + await runCancelExportTest(exportDialog, passwordManager); + }); + + test('fires close event after export complete', async function() { + const exportDialog = elementFactory.createExportPasswordsDialog(); + await runFireCloseEventAfterExportCompleteTest( + exportDialog, passwordManager); + }); + } + + // The export dialog is dismissable. + test('exportDismissable', function() { + const exportDialog = elementFactory.createExportPasswordsDialog(); + + assertTrue(exportDialog.shadowRoot! + .querySelector<CrDialogElement>('#dialog_start')!.open); + exportDialog.shadowRoot!.querySelector<HTMLElement>( + '#cancelButton')!.click(); + flush(); + assertFalse(!!exportDialog.shadowRoot!.querySelector('#dialog_start')); + }); + + test('fires close event when canceled', async function() { + const exportDialog = elementFactory.createExportPasswordsDialog(); + exportDialog.shadowRoot!.querySelector<HTMLElement>( + '#cancelButton')!.click(); + await eventToPromise('passwords-export-dialog-close', exportDialog); + }); +}); \ No newline at end of file
diff --git a/chrome/test/data/webui/settings/passwords_import_dialog_test.ts b/chrome/test/data/webui/settings/passwords_import_dialog_test.ts index 56d724b..df2f5275 100644 --- a/chrome/test/data/webui/settings/passwords_import_dialog_test.ts +++ b/chrome/test/data/webui/settings/passwords_import_dialog_test.ts
@@ -17,7 +17,7 @@ // clang-format on -suite('PasswordEditDialog', function() { +suite('PasswordsImportDialog', function() { let passwordManager: TestPasswordManagerProxy; let elementFactory: PasswordSectionElementFactory;
diff --git a/chrome/test/data/webui/settings/passwords_section_test.ts b/chrome/test/data/webui/settings/passwords_section_test.ts index 3a419eb..98cbd7c 100644 --- a/chrome/test/data/webui/settings/passwords_section_test.ts +++ b/chrome/test/data/webui/settings/passwords_section_test.ts
@@ -10,7 +10,7 @@ import {isChromeOS, isLacros, webUIListenerCallback} from 'chrome://resources/js/cr.m.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {CrDialogElement, PasswordsSectionElement} from 'chrome://settings/lazy_load.js'; +import {PasswordsSectionElement} from 'chrome://settings/lazy_load.js'; import {buildRouter, HatsBrowserProxyImpl, MultiStoreExceptionEntry, MultiStorePasswordUiEntry, PasswordCheckReferrer, PasswordManagerImpl, Router, routes, SettingsPluralStringProxyImpl,StatusAction, TrustedVaultBannerState, TrustSafetyInteraction} from 'chrome://settings/settings.js'; import {SettingsRoutes} from 'chrome://settings/settings_routes.js'; import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; @@ -18,7 +18,6 @@ import {eventToPromise, flushTasks, isVisible} from 'chrome://webui-test/test_util.js'; import {createExceptionEntry, createMultiStoreExceptionEntry, createMultiStorePasswordEntry, createPasswordEntry, makeCompromisedCredential, makePasswordCheckStatus, PasswordSectionElementFactory} from './passwords_and_autofill_fake_data.js'; -import {runCancelExportTest, runExportFlowErrorRetryTest, runExportFlowErrorTest, runExportFlowFastTest, runExportFlowSlowTest, runFireCloseEventAfterExportCompleteTest,runStartExportTest} from './passwords_export_test.js'; import {getSyncAllPrefs, simulateStoredAccounts, simulateSyncStatus} from './sync_test_util.js'; import {TestHatsBrowserProxy} from './test_hats_browser_proxy.js'; import {TestPasswordManagerProxy} from './test_password_manager_proxy.js'; @@ -1257,75 +1256,19 @@ // Test that clicking the Export Passwords menu item opens the export // dialog. - test('exportOpen', function(done) { + test('exportOpen', async function() { const passwordList = [ createPasswordEntry({url: 'googoo.com', username: 'Larry'}), ]; const passwordsSection = elementFactory.createPasswordsSection( passwordManager, passwordList, []); - // The export dialog calls requestExportProgressStatus() when opening. - passwordManager.requestExportProgressStatus = (callback) => { - callback(chrome.passwordsPrivate.ExportProgressStatus.NOT_STARTED); - done(); - }; - passwordManager.addPasswordsFileExportProgressListener = () => {}; passwordsSection.$.menuExportPassword.click(); + // The export dialog calls requestExportProgressStatus() when opening. + await passwordManager.whenCalled('requestExportProgressStatus'); }); if (!(isChromeOS || isLacros)) { - // Test that tapping "Export passwords..." notifies the browser. - test('startExport', function(done) { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager); - runStartExportTest(exportDialog, passwordManager, done); - }); - - // Test the export flow. If exporting is fast, we should skip the - // in-progress view altogether. - test('exportFlowFast', function(done) { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager); - runExportFlowFastTest(exportDialog, passwordManager, done); - }); - - // The error view is shown when an error occurs. - test('exportFlowError', function(done) { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager); - runExportFlowErrorTest(exportDialog, passwordManager, done); - }); - - // The error view allows to retry. - test('exportFlowErrorRetry', function(done) { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager); - runExportFlowErrorRetryTest(exportDialog, passwordManager, done); - }); - - // Test the export flow. If exporting is slow, Chrome should show the - // in-progress dialog for at least 1000ms. - test('exportFlowSlow', function(done) { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager); - runExportFlowSlowTest(exportDialog, passwordManager, done); - }); - - // Test that canceling the dialog while exporting will also cancel the - // export on the browser. - test('cancelExport', function(done) { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager); - runCancelExportTest(exportDialog, passwordManager, done); - }); - - test('fires close event after export complete', () => { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager); - return runFireCloseEventAfterExportCompleteTest( - exportDialog, passwordManager); - }); - // Test verifies that the overflow menu does not offer an option to move a // password to the account. test('noMoveToAccountOption', function() { @@ -1566,28 +1509,6 @@ }); } - // The export dialog is dismissable. - test('exportDismissable', function() { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager); - - assertTrue(exportDialog.shadowRoot! - .querySelector<CrDialogElement>('#dialog_start')!.open); - exportDialog.shadowRoot!.querySelector<HTMLElement>( - '#cancelButton')!.click(); - flush(); - assertFalse(!!exportDialog.shadowRoot!.querySelector('#dialog_start')); - }); - - test('fires close event when canceled', () => { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager); - const wait = eventToPromise('passwords-export-dialog-close', exportDialog); - exportDialog.shadowRoot!.querySelector<HTMLElement>( - '#cancelButton')!.click(); - return wait; - }); - test('hideLinkToPasswordManagerWhenEncrypted', function() { const passwordsSection = elementFactory.createPasswordsSection(passwordManager, [], []);
diff --git a/chrome/test/data/webui/settings/passwords_section_test_cros.ts b/chrome/test/data/webui/settings/passwords_section_test_cros.ts index 14b2ebb..83a6e6276 100644 --- a/chrome/test/data/webui/settings/passwords_section_test_cros.ts +++ b/chrome/test/data/webui/settings/passwords_section_test_cros.ts
@@ -17,7 +17,7 @@ import {assertTrue} from 'chrome://webui-test/chai_assert.js'; import {createPasswordEntry, PasswordSectionElementFactory} from './passwords_and_autofill_fake_data.js'; -import {runCancelExportTest, runExportFlowErrorRetryTest, runExportFlowErrorTest, runExportFlowFastTest, runExportFlowSlowTest, runFireCloseEventAfterExportCompleteTest,runStartExportTest} from './passwords_export_test.js'; +import {runCancelExportTest, runExportFlowErrorRetryTest, runExportFlowErrorTest, runExportFlowFastTest, runExportFlowSlowTest, runFireCloseEventAfterExportCompleteTest,runStartExportTest} from './passwords_export_dialog_test.js'; import {TestPasswordManagerProxy} from './test_password_manager_proxy.js'; // clang-format on @@ -89,10 +89,8 @@ return super.createPasswordsSection(passwordManager, [], []); } - override createExportPasswordsDialog( - passwordManager: TestPasswordManagerProxy, - overrideRequestManager?: boolean) { - const dialog = super.createExportPasswordsDialog(passwordManager); + override createExportPasswordsDialog(overrideRequestManager?: boolean) { + const dialog = super.createExportPasswordsDialog(); dialog.tokenRequestManager = new BlockingRequestManager(); return overrideRequestManager ? Object.assign( @@ -141,8 +139,7 @@ // https://www.crbug.com/1021474) test.skip('export passwords button requests auth token', function() { passwordPromise.then(fail); - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager, true); + const exportDialog = elementFactory.createExportPasswordsDialog(true); exportDialog.shadowRoot! .querySelector<HTMLElement>('#exportPasswordsButton')!.click(); return requestPromise; @@ -184,53 +181,46 @@ }); // Test that tapping "Export passwords..." notifies the browser. - test('startExport', function(done) { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager, false); - runStartExportTest(exportDialog, passwordManager, done); + test('startExport', function() { + const exportDialog = elementFactory.createExportPasswordsDialog(false); + runStartExportTest(exportDialog, passwordManager); }); // Test the export flow. If exporting is fast, we should skip the // in-progress view altogether. - test('exportFlowFast', function(done) { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager, false); - runExportFlowFastTest(exportDialog, passwordManager, done); + test('exportFlowFast', function() { + const exportDialog = elementFactory.createExportPasswordsDialog(false); + runExportFlowFastTest(exportDialog, passwordManager); }); // The error view is shown when an error occurs. - test('exportFlowError', function(done) { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager, false); - runExportFlowErrorTest(exportDialog, passwordManager, done); + test('exportFlowError', function() { + const exportDialog = elementFactory.createExportPasswordsDialog(false); + runExportFlowErrorTest(exportDialog, passwordManager); }); // The error view allows to retry. - test('exportFlowErrorRetry', function(done) { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager, false); - runExportFlowErrorRetryTest(exportDialog, passwordManager, done); + test('exportFlowErrorRetry', function() { + const exportDialog = elementFactory.createExportPasswordsDialog(false); + runExportFlowErrorRetryTest(exportDialog, passwordManager); }); // Test the export flow. If exporting is slow, Chrome should show the // in-progress dialog for at least 1000ms. - test('exportFlowSlow', function(done) { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager, false); - runExportFlowSlowTest(exportDialog, passwordManager, done); + test('exportFlowSlow', function() { + const exportDialog = elementFactory.createExportPasswordsDialog(false); + runExportFlowSlowTest(exportDialog, passwordManager); }); // Test that canceling the dialog while exporting will also cancel the // export on the browser. - test('cancelExport', function(done) { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager, false); - runCancelExportTest(exportDialog, passwordManager, done); + test('cancelExport', function() { + const exportDialog = elementFactory.createExportPasswordsDialog(false); + runCancelExportTest(exportDialog, passwordManager); }); test('fires close event after export complete', () => { - const exportDialog = - elementFactory.createExportPasswordsDialog(passwordManager, false); + const exportDialog = elementFactory.createExportPasswordsDialog(false); return runFireCloseEventAfterExportCompleteTest( exportDialog, passwordManager); });
diff --git a/chrome/test/data/webui/settings/test_password_manager_proxy.ts b/chrome/test/data/webui/settings/test_password_manager_proxy.ts index 5bde31d..9c8810f0 100644 --- a/chrome/test/data/webui/settings/test_password_manager_proxy.ts +++ b/chrome/test/data/webui/settings/test_password_manager_proxy.ts
@@ -89,8 +89,10 @@ constructor() { super([ 'addPassword', + 'cancelExportPasswords', 'changeInsecureCredential', 'changeSavedPassword', + 'exportPasswords', 'getCompromisedCredentials', 'getPasswordCheckStatus', 'getPlaintextInsecurePassword', @@ -109,6 +111,7 @@ 'removeInsecureCredential', 'removeSavedPassword', 'removeSavedPasswords', + 'requestExportProgressStatus', 'requestPlaintextPassword', 'startBulkPasswordCheck', 'stopBulkPasswordCheck', @@ -363,6 +366,8 @@ return Promise.resolve(this.isAccountStoreDefault_); } + optInForAccountStorage(_optIn: boolean) {} + /** * Sets the value to be returned by getUrlCollection. */ @@ -403,22 +408,27 @@ 'recordChangePasswordFlowStarted', insecureCredential, isManualFlow); } - cancelExportPasswords() {} - - exportPasswords(_callback: () => void) {} - importPasswords() { this.methodCalled('importPasswords'); } - optInForAccountStorage(_optIn: boolean) {} + exportPasswords() { + this.methodCalled('exportPasswords'); + return Promise.resolve(); + } + + cancelExportPasswords() { + this.methodCalled('cancelExportPasswords'); + } removePasswordsFileExportProgressListener( _listener: PasswordsFileExportProgressListener) {} - requestExportProgressStatus( - _callback: - (status: chrome.passwordsPrivate.ExportProgressStatus) => void) {} + requestExportProgressStatus() { + this.methodCalled('requestExportProgressStatus'); + return Promise.resolve( + chrome.passwordsPrivate.ExportProgressStatus.NOT_STARTED); + } undoRemoveSavedPasswordOrException() {} }
diff --git a/chromeos/ash/components/dbus/BUILD.gn b/chromeos/ash/components/dbus/BUILD.gn index aa3156f..54ae8239 100644 --- a/chromeos/ash/components/dbus/BUILD.gn +++ b/chromeos/ash/components/dbus/BUILD.gn
@@ -2,8 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//build/config/ui.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") assert(is_chromeos_ash, "Non ChromeOS builds must not depend on //chromeos/ash")
diff --git a/chromeos/ash/components/dbus/chromebox_for_meetings/BUILD.gn b/chromeos/ash/components/dbus/chromebox_for_meetings/BUILD.gn index c5186a0..e8550e4 100644 --- a/chromeos/ash/components/dbus/chromebox_for_meetings/BUILD.gn +++ b/chromeos/ash/components/dbus/chromebox_for_meetings/BUILD.gn
@@ -2,8 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/chromebox_for_meetings/buildflags.gni") import("//build/config/ui.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//third_party/protobuf/proto_library.gni") assert(is_chromeos_ash, "Non-ChromeOS builds cannot depend on //chromeos/ash") @@ -12,7 +12,6 @@ component("chromebox_for_meetings") { defines = [ "IS_CFM_HOTLINE_CLIENT_IMPL" ] public_deps = [ - "//chromeos/components/chromebox_for_meetings/buildflags", "//chromeos/components/chromebox_for_meetings/features", "//chromeos/dbus:dbus", "//chromeos/dbus/common",
diff --git a/chromeos/ash/components/dbus/chromebox_for_meetings/DEPS b/chromeos/ash/components/dbus/chromebox_for_meetings/DEPS index 0c0c9fe..8766f1b 100644 --- a/chromeos/ash/components/dbus/chromebox_for_meetings/DEPS +++ b/chromeos/ash/components/dbus/chromebox_for_meetings/DEPS
@@ -1,5 +1,4 @@ include_rules = [ # Do not add chrome here (use a delegate instead). - "+chromeos/components/chromebox_for_meetings/buildflags", "+chromeos/components/chromebox_for_meetings/features", ]
diff --git a/chromeos/components/chromebox_for_meetings/buildflags/BUILD.gn b/chromeos/components/chromebox_for_meetings/buildflags/BUILD.gn deleted file mode 100644 index 3c0b596a..0000000 --- a/chromeos/components/chromebox_for_meetings/buildflags/BUILD.gn +++ /dev/null
@@ -1,15 +0,0 @@ -# Copyright 2020 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//build/buildflag_header.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") - -# This file is in a separate directory so all targets in the build can refer to -# the buildflag header to get the necessary preprocessor defines without -# bringing in unneeded resources. - -buildflag_header("buildflags") { - header = "buildflags.h" - flags = [ "PLATFORM_CFM=$is_cfm" ] -}
diff --git a/chromeos/dbus/userdataauth/fake_userdataauth_client.cc b/chromeos/dbus/userdataauth/fake_userdataauth_client.cc index c63474b..ed3282f4 100644 --- a/chromeos/dbus/userdataauth/fake_userdataauth_client.cc +++ b/chromeos/dbus/userdataauth/fake_userdataauth_client.cc
@@ -20,11 +20,46 @@ #include "base/threading/thread_task_runner_handle.h" #include "chromeos/dbus/cryptohome/UserDataAuth.pb.h" #include "chromeos/dbus/cryptohome/rpc.pb.h" +#include "third_party/abseil-cpp/absl/types/variant.h" namespace chromeos { namespace { +// Specialized structs for each auth factor with factor-specific metadata. +// Secrets are stored the same way they are sent to cryptohome (i.e. salted and +// hashed), but only if secret checking has been enabled via +// `TestApi::set_enabled_auth_check`. +// `FakeAuthFactor` is the union/absl::variant of the factor-specific auth +// factor structs. + +struct PasswordFactor { + // This will be `absl::nullopt` if auth checking hasn't been activated. + absl::optional<std::string> password; +}; + +struct PinFactor { + // This will be `absl::nullopt` if auth checking hasn't been activated. + absl::optional<std::string> pin = absl::nullopt; + bool locked = false; +}; + +struct RecoveryFactor {}; + +struct KioskFactor {}; + +using FakeAuthFactor = + absl::variant<PasswordFactor, PinFactor, RecoveryFactor, KioskFactor>; + +} // namespace + +struct FakeUserDataAuthClient::UserCryptohomeState { + // Maps labels to auth factors. + std::map<std::string, FakeAuthFactor> auth_factors; +}; + +namespace { + // Interval to update the progress of MigrateToDircrypto in milliseconds. constexpr int kDircryptoMigrationUpdateIntervalMs = 200; // The number of updates the MigrateToDircrypto will send before it completes. @@ -39,6 +74,40 @@ // Used to track the fake instance, mirrors the instance in the base class. FakeUserDataAuthClient* g_instance = nullptr; +// Used to construct a functor/visitor with overloaded `operator()` from a list +// of lambdas. Useful for visiting absl::variant. +template <class... Ts> +struct OverloadedFunctor : Ts... { + using Ts::operator()...; +}; +template <class... Ts> +OverloadedFunctor<Ts...> Overload(Ts&&... ts) { + return OverloadedFunctor<Ts...>{std::forward<Ts>(ts)...}; +} + +// Helper that automatically sends a reply struct to a supplied callback when +// it goes out of scope. Basically a specialized `absl::Cleanup` or +// `std::scope_exit`. +template <typename ReplyType> +class ReplyOnReturn { + public: + explicit ReplyOnReturn(ReplyType* reply, + DBusMethodCallback<ReplyType> callback) + : reply_(reply), callback_(std::move(callback)) {} + ReplyOnReturn(const ReplyOnReturn<ReplyType>&) = delete; + + ~ReplyOnReturn() { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback_), *reply_)); + } + + ReplyOnReturn<ReplyType>& operator=(const ReplyOnReturn<ReplyType>&) = delete; + + private: + raw_ptr<ReplyType> reply_; + DBusMethodCallback<ReplyType> callback_; +}; + } // namespace // Allocate space for test api instance @@ -78,6 +147,26 @@ client_->SetEcryptfsUserHome(cryptohome_id, use_ecryptfs); } +void FakeUserDataAuthClient::TestApi::SetPinLocked( + const cryptohome::AccountIdentifier& account_id, + const std::string& label, + bool locked) { + auto user_it = client_->users_.find(account_id); + CHECK(user_it != client_->users_.end()) + << "User does not exist: " << account_id.account_id(); + UserCryptohomeState& user_state = user_it->second; + + auto factor_it = user_state.auth_factors.find(label); + CHECK(factor_it != user_state.auth_factors.end()) + << "Factor does not exist: " << label; + FakeAuthFactor& factor = factor_it->second; + + PinFactor* pin_factor = absl::get_if<PinFactor>(&factor); + CHECK(pin_factor) << "Factor is not PIN: " << label; + + pin_factor->locked = locked; +} + FakeUserDataAuthClient::FakeUserDataAuthClient() { DCHECK(!g_instance); g_instance = this; @@ -161,75 +250,211 @@ const ::user_data_auth::GetKeyDataRequest& request, GetKeyDataCallback callback) { ::user_data_auth::GetKeyDataReply reply; - const auto it = key_data_map_.find(request.account_id()); - if (it == key_data_map_.end()) { + ReplyOnReturn auto_reply(&reply, std::move(callback)); + + // Check if user exists. + const auto user_it = users_.find(request.account_id()); + if (user_it == std::end(users_)) { + LOG(ERROR) << "User does not exist: " << request.account_id().account_id(); reply.set_error(::user_data_auth::CryptohomeErrorCode:: CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND); - } else if (it->second.empty()) { - reply.set_error( - ::user_data_auth::CryptohomeErrorCode::CRYPTOHOME_ERROR_KEY_NOT_FOUND); - } else { - auto key = FindKey(it->second, - request.authorization_request().key().data().label()); - if (key != it->second.end()) { - *reply.add_key_data() = key->second.data(); - } else { - reply.set_error(::user_data_auth::CryptohomeErrorCode:: - CRYPTOHOME_ERROR_KEY_NOT_FOUND); + return; + } + const UserCryptohomeState& user_state = user_it->second; + + const std::string& requested_label = + request.authorization_request().key().data().label(); + + // Create range [factors_begin, factors_end) of factors matching + // `requested_label`: If the `requested_label` is empty, then every factor + // matches. Otherwise the factor with that precise label matches. If no such + // factor exists, the range is empty. + auto factors_begin = std::begin(user_state.auth_factors); + auto factors_end = std::end(user_state.auth_factors); + if (!requested_label.empty()) { + factors_begin = user_state.auth_factors.find(requested_label); + if (factors_begin != factors_end) { + factors_end = std::next(factors_begin); } } - ReturnProtobufMethodCallback(reply, std::move(callback)); + + // Fill `reply.key_data()` with the factors we found. + for (auto factors_it = factors_begin; factors_it != factors_end; + ++factors_it) { + const std::string& label = factors_it->first; + const FakeAuthFactor& factor = factors_it->second; + + absl::visit(Overload( + [&](const PasswordFactor& password) { + cryptohome::KeyData* data = reply.add_key_data(); + data->set_type(cryptohome::KeyData::KEY_TYPE_PASSWORD); + data->set_label(label); + }, + [&](const PinFactor& pin) { + cryptohome::KeyData* data = reply.add_key_data(); + data->set_type(cryptohome::KeyData::KEY_TYPE_PASSWORD); + data->set_label(label); + data->mutable_policy()->set_low_entropy_credential(true); + data->mutable_policy()->set_auth_locked(pin.locked); + }, + [&](const RecoveryFactor& recovery) { + // Retrieving key data for recovery code via the legacy + // API is not allowed. + LOG(WARNING) << "Not reporting recovery key: " << label; + }, + [&](const KioskFactor& kiosk) { + cryptohome::KeyData* data = reply.add_key_data(); + data->set_type(cryptohome::KeyData::KEY_TYPE_KIOSK); + data->set_label(label); + }), + factor); + } + + if (reply.key_data().empty()) { + // This happens if no or only unsupported factors matched the request. + LOG(ERROR) << "No legacy key exists for label " << requested_label; + reply.set_error( + ::user_data_auth::CryptohomeErrorCode::CRYPTOHOME_ERROR_KEY_NOT_FOUND); + } } void FakeUserDataAuthClient::CheckKey( const ::user_data_auth::CheckKeyRequest& request, CheckKeyCallback callback) { ::user_data_auth::CheckKeyReply reply; + ReplyOnReturn auto_reply(&reply, std::move(callback)); - if (TestApi::Get()->enable_auth_check_) { - last_unlock_webauthn_secret_ = request.unlock_webauthn_secret(); - - const auto it = key_data_map_.find(request.account_id()); - if (it == key_data_map_.end()) { - reply.set_error(::user_data_auth::CryptohomeErrorCode:: - CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND); - } else if (it->second.empty()) { - reply.set_error(::user_data_auth::CryptohomeErrorCode:: - CRYPTOHOME_ERROR_KEY_NOT_FOUND); - } else { - auto key = FindKey(it->second, - request.authorization_request().key().data().label()); - if (key == it->second.end()) { - reply.set_error(::user_data_auth::CryptohomeErrorCode:: - CRYPTOHOME_ERROR_KEY_NOT_FOUND); - } else if (key->second.secret() != - request.authorization_request().key().secret()) { - reply.set_error(::user_data_auth::CryptohomeErrorCode:: - CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED); - } - } + if (!TestApi::Get()->enable_auth_check_) { + return; } - ReturnProtobufMethodCallback(reply, std::move(callback)); + last_unlock_webauthn_secret_ = request.unlock_webauthn_secret(); + + const auto user_it = users_.find(request.account_id()); + if (user_it == std::end(users_)) { + reply.set_error(::user_data_auth::CryptohomeErrorCode:: + CRYPTOHOME_ERROR_ACCOUNT_NOT_FOUND); + return; + } + const UserCryptohomeState& user_state = user_it->second; + + const cryptohome::Key& key = request.authorization_request().key(); + const std::string& label = key.data().label(); + + const auto factor_it = user_state.auth_factors.find(label); + if (factor_it == std::end(user_state.auth_factors)) { + // Factor does not exist. + reply.set_error( + ::user_data_auth::CryptohomeErrorCode::CRYPTOHOME_ERROR_KEY_NOT_FOUND); + return; + } + const FakeAuthFactor& factor = factor_it->second; + + absl::visit( + Overload( + [&](const PasswordFactor& password) { + const std::string& secret = key.secret(); + if (password.password != secret) { + reply.set_error(::user_data_auth::CryptohomeErrorCode:: + CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED); + } + }, + [&](const PinFactor& pin) { + const std::string& secret = key.secret(); + if (pin.pin != secret) { + reply.set_error(::user_data_auth::CryptohomeErrorCode:: + CRYPTOHOME_ERROR_AUTHORIZATION_KEY_FAILED); + } + }, + [&](const RecoveryFactor& recovery) { + LOG(FATAL) << "Checking recovery key is not allowed"; + }, + [&](const KioskFactor& kiosk) { + // Kiosk key secrets are derived from app ids and don't leave + // cryptohome, so there's nothing to check. + }), + factor); } void FakeUserDataAuthClient::AddKey( const ::user_data_auth::AddKeyRequest& request, AddKeyCallback callback) { - key_data_map_[request.account_id()][request.key().data().label()] = - request.key(); - ReturnProtobufMethodCallback(::user_data_auth::AddKeyReply(), - std::move(callback)); + ::user_data_auth::AddKeyReply reply; + ReplyOnReturn auto_reply(&reply, std::move(callback)); + + const cryptohome::AccountIdentifier& account_id = request.account_id(); + const bool clobber_if_exists = request.clobber_if_exists(); + const cryptohome::Key new_key = request.key(); + const cryptohome::KeyData new_key_data = new_key.data(); + const std::string& new_label = new_key_data.label(); + CHECK_NE(new_label, "") << "Label must not be empty string"; + + auto user_it = users_.find(account_id); + if (user_it == std::end(users_)) { + // TODO(crbug.com/1334538): Cryptohome would not create a new user here, + // but many tests rely on it. New tests shouldn't rely on this behavior. + LOG(ERROR) << "Need to create new user: " << account_id.account_id(); + user_it = users_.insert(user_it, {account_id, UserCryptohomeState()}); + } + DCHECK(user_it != std::end(users_)); + std::map<std::string, FakeAuthFactor>& auth_factors = + user_it->second.auth_factors; + + if (!clobber_if_exists) { + CHECK(auth_factors.find(new_label) == std::end(auth_factors)) + << "Key exists, will not clobber: " << new_label; + } + + // We only save the secret if auth checking is enabled. + absl::optional<std::string> secret = + TestApi::Get()->enable_auth_check_ + ? absl::optional<std::string>(new_key.secret()) + : absl::nullopt; + + const cryptohome::KeyData::KeyType new_key_type = new_key_data.type(); + + if (new_key_type == cryptohome::KeyData::KEY_TYPE_KIOSK) { + auth_factors[new_label] = KioskFactor{}; + return; + } + + LOG_IF(WARNING, new_key_type != cryptohome::KeyData::KEY_TYPE_PASSWORD) + << "Unsupported key type, assuming KEY_TYPE_PASSWORD: " << new_key_type; + + const bool is_low_entropy = + new_key_data.has_policy() && + new_key_data.policy().has_low_entropy_credential() && + new_key_data.policy().low_entropy_credential(); + + if (is_low_entropy) { + auth_factors[new_label] = PinFactor{std::move(secret)}; + return; + } + + auth_factors[new_label] = PasswordFactor{std::move(secret)}; } void FakeUserDataAuthClient::RemoveKey( const ::user_data_auth::RemoveKeyRequest& request, RemoveKeyCallback callback) { - const auto it = key_data_map_.find(request.account_id()); - if (it != key_data_map_.end()) { - auto key = FindKey(it->second, request.key().data().label()); - if (key != it->second.end()) - it->second.erase(key); + ::user_data_auth::RemoveKeyReply reply; + ReplyOnReturn auto_reply(&reply, std::move(callback)); + + const auto user_it = users_.find(request.account_id()); + if (user_it == std::end(users_)) { + // TODO(crbug.com/1334538): Cryptohome would report an error here, but many + // tests do not set up users before calling RemoveKey. That's why we don't + // report an error here. New tests shouldn't rely on this behavior. + LOG(ERROR) << "User does not exist: " << request.account_id().account_id(); + return; } - ReturnProtobufMethodCallback(::user_data_auth::RemoveKeyReply(), - std::move(callback)); + UserCryptohomeState& user_state = user_it->second; + + const std::string& label = request.key().data().label(); + if (label.empty()) { + // An empty request label matches all keys, so remove all. + LOG(WARNING) << "RemoveKey for empty label removes all keys"; + user_state.auth_factors.clear(); + } else { + user_state.auth_factors.erase(label); + } } void FakeUserDataAuthClient::MassRemoveKeys( const ::user_data_auth::MassRemoveKeysRequest& request, @@ -665,18 +890,6 @@ return base::Contains(ecryptfs_user_homes_, cryptohome_id); } -std::map<std::string, cryptohome::Key>::const_iterator -FakeUserDataAuthClient::FindKey( - const std::map<std::string, cryptohome::Key>& keys, - const std::string& label) { - // Wildcard label. - if (label.empty()) - return keys.begin(); - - // Specific label - return keys.find(label); -} - void FakeUserDataAuthClient::CreateUserProfileDir( const cryptohome::AccountIdentifier& account_id) { base::CreateDirectory(GetUserProfileDir(account_id)); @@ -695,7 +908,7 @@ bool FakeUserDataAuthClient::UserExists( const cryptohome::AccountIdentifier& account_id) const { - if (key_data_map_.find(account_id) != std::end(key_data_map_)) { + if (users_.find(account_id) != std::end(users_)) { return true; } @@ -732,7 +945,8 @@ void FakeUserDataAuthClient::AddExistingUser( const cryptohome::AccountIdentifier& account_id) { // Insert user without any associated keys. - const auto [_, was_inserted] = key_data_map_.insert({account_id, {}}); + const auto [_, was_inserted] = + users_.insert({account_id, UserCryptohomeState()}); DCHECK(was_inserted) << "User already exists: " << account_id.account_id(); }
diff --git a/chromeos/dbus/userdataauth/fake_userdataauth_client.h b/chromeos/dbus/userdataauth/fake_userdataauth_client.h index 67bdad1..b2226bb 100644 --- a/chromeos/dbus/userdataauth/fake_userdataauth_client.h +++ b/chromeos/dbus/userdataauth/fake_userdataauth_client.h
@@ -78,6 +78,13 @@ void SetEcryptfsUserHome(const cryptohome::AccountIdentifier& cryptohome_id, bool use_ecryptfs); + // Marks a PIN key as locked or unlocked. The key is identified by the + // |account_id| of the user it belongs to and its |label|. The key must + // exist prior to this call, and it must be a PIN key. + void SetPinLocked(const cryptohome::AccountIdentifier& account_id, + const std::string& label, + bool locked); + private: friend class FakeUserDataAuthClient; @@ -296,6 +303,8 @@ void CreateUserProfileDir(const cryptohome::AccountIdentifier& account_id); private: + struct UserCryptohomeState; + // Helper that returns the protobuf reply. template <typename ReplyType> void ReturnProtobufMethodCallback(const ReplyType& reply, @@ -308,11 +317,6 @@ // progress updates. void OnDircryptoMigrationProgressUpdated(); - // Finds a key matching the given label. Wildcard labels are supported. - std::map<std::string, cryptohome::Key>::const_iterator FindKey( - const std::map<std::string, cryptohome::Key>& keys, - const std::string& label); - // Returns a path to home directory for account. base::FilePath GetUserProfileDir( const cryptohome::AccountIdentifier& account_id) const; @@ -344,10 +348,8 @@ // The `unlock_webauthn_secret` parameter passed in the last CheckKeyEx call. bool last_unlock_webauthn_secret_; - // The key data for various accounts. - std::map<cryptohome::AccountIdentifier, - std::map<std::string, cryptohome::Key>> - key_data_map_; + // The collection of users we know about. + std::map<cryptohome::AccountIdentifier, UserCryptohomeState> users_; // Set of account identifiers whose user homes use ecryptfs. User homes not // mentioned here use dircrypto.
diff --git a/chromeos/services/BUILD.gn b/chromeos/services/BUILD.gn index 1b28393..6826d08 100644 --- a/chromeos/services/BUILD.gn +++ b/chromeos/services/BUILD.gn
@@ -4,7 +4,6 @@ import("//build/config/ui.gni") import("//chromeos/ash/components/assistant/assistant.gni") -import("//chromeos/components/chromebox_for_meetings/buildflags/buildflags.gni") import("//testing/test.gni") assert(is_chromeos, "Non-ChromeOS builds cannot depend on //chromeos")
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb index 104559f4..44a6383 100644 --- a/chromeos/strings/chromeos_strings_ar.xtb +++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">تعذَّر تحميل الصور. يُرجى التحقُّق من الاتصال بالشبكة أو إعادة محاولة تحميل الصور.</translation> <translation id="1751249301761991853">إعدادات التخصيص</translation> <translation id="1753496554272155572">إغلاق معاينة الخلفية</translation> +<translation id="1755556344721611131">تطبيق "بيانات التشخيص"</translation> <translation id="175763766237925754">إشارة جيدة (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_as.xtb b/chromeos/strings/chromeos_strings_as.xtb index 6e1fcc3..256eaaee 100644 --- a/chromeos/strings/chromeos_strings_as.xtb +++ b/chromeos/strings/chromeos_strings_as.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">প্ৰতিচ্ছবি ল’ড কৰিব পৰা নগ’ল। আপোনাৰ নেটৱৰ্ক সংযোগ পৰীক্ষা কৰক অথবা প্ৰতিচ্ছবিসমূহ পুনৰ ল’ড কৰিবলৈ চেষ্টা কৰক।</translation> <translation id="1751249301761991853">ব্যক্তিগত</translation> <translation id="1753496554272155572">ৱালপেপাৰৰ পূৰ্বদৰ্শনৰ পৰা বাহিৰ হওক</translation> +<translation id="1755556344721611131">ডায়েগন’ষ্টিক্স এপ্</translation> <translation id="175763766237925754">ভাল (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb index dad70eb..3df6fbf 100644 --- a/chromeos/strings/chromeos_strings_az.xtb +++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">Şəkilləri yükləmək mümkün olmadı. Şəbəkə bağlantınızı yoxlayın və ya şəkilləri yenidən yükləməyə cəhd edin.</translation> <translation id="1751249301761991853">Şəxsi</translation> <translation id="1753496554272155572">Divar kağızı önizləməsindən çıxın</translation> +<translation id="1755556344721611131">Diaqnostika tətbiqi</translation> <translation id="175763766237925754">Yaxşı (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb index f6ae706..cca3c50 100644 --- a/chromeos/strings/chromeos_strings_bg.xtb +++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">Изображенията не се заредиха. Проверете връзката си с мрежата или ги заредете отново.</translation> <translation id="1751249301761991853">Лични</translation> <translation id="1753496554272155572">Изход от визуализацията на тапета</translation> +<translation id="1755556344721611131">Приложение за диагностика</translation> <translation id="175763766237925754">Добра (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb index a09850b..4ca5b4c 100644 --- a/chromeos/strings/chromeos_strings_ca.xtb +++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">No s'han pogut carregar les imatges. Comprova la teva connexió de xarxa o prova de carregar les imatges de nou.</translation> <translation id="1751249301761991853">Personal</translation> <translation id="1753496554272155572">Surt de la previsualització del fons de pantalla</translation> +<translation id="1755556344721611131">Aplicació de diagnòstic</translation> <translation id="175763766237925754">Bo (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_cy.xtb b/chromeos/strings/chromeos_strings_cy.xtb index d7b37c5..972302f 100644 --- a/chromeos/strings/chromeos_strings_cy.xtb +++ b/chromeos/strings/chromeos_strings_cy.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">Methu â llwytho lluniau. Gwiriwch eich cysylltiad rhwydwaith neu rhowch gynnig arall ar lwytho'r lluniau.</translation> <translation id="1751249301761991853">Personal</translation> <translation id="1753496554272155572">Gadael rhagolwg papur wal</translation> +<translation id="1755556344721611131">Ap diagnosteg</translation> <translation id="175763766237925754">Da (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb index 786c83b4..240f5a5 100644 --- a/chromeos/strings/chromeos_strings_es.xtb +++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -16,6 +16,7 @@ <translation id="1124772482545689468">Usuario</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1145018782460575098">La ventana de actualización de firmware de dispositivos externos está abierta. Actualizaciones disponibles: <ph name="NUM_UPDATES" />.</translation> +<translation id="1145516343487477149">Encuentra artículos de ayuda y respuestas a preguntas frecuentes sobre Chromebook</translation> <translation id="1165039591588034296">Error</translation> <translation id="1175697296044146566"><ph name="MANAGER" /> gestiona el dispositivo <ph name="DEVICE_TYPE" />.</translation> <translation id="1175951029573070619">Ni buena ni mala (<ph name="SIGNAL_STRENGTH" />)</translation> @@ -120,6 +121,7 @@ <translation id="1871569928317311284">Desactivar tema oscuro</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">Desactivar modo Oscuro</translation> +<translation id="1881188606372070653">Ve a la <ph name="BEGIN_LINK1" />página de ayuda jurídica<ph name="END_LINK1" /> para solicitar cambios en el contenido por motivos legales. Algunos datos de tu cuenta y tu sistema podrían enviarse a Google. Utilizaremos la información que nos facilites para solucionar problemas técnicos y mejorar nuestros servicios de acuerdo con lo especificado en nuestra <ph name="BEGIN_LINK2" />Política de Privacidad<ph name="END_LINK2" /> y en los <ph name="BEGIN_LINK3" />Términos del Servicio<ph name="END_LINK3" />.</translation> <translation id="1887850431809612466">Revisión de hardware</translation> <translation id="1905710495812624430">Se ha superado el máximo de intentos permitidos.</translation> <translation id="1908234395526491708">Errores de solicitud UDP</translation> @@ -622,6 +624,7 @@ <translation id="6379086450106841622">Pantalla táctil</translation> <translation id="6381741036071372448">Prueba tu teclado</translation> <translation id="6388847657025262518">El alimentador de documentos del escáner está atascado. Revisa el alimentador y vuelve a intentarlo.</translation> +<translation id="6394634179843537518">Añadir archivo</translation> <translation id="6410257289063177456">Archivos de imagen</translation> <translation id="641081527798843608">Coincidencia de asunto</translation> <translation id="6423239382391657905">OpenVPN</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb index df2135f7..fbfa5ae 100644 --- a/chromeos/strings/chromeos_strings_et.xtb +++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">Pilte ei õnnestunud laadida. Kontrollige võrguühendust või proovige pilte uuesti laadida.</translation> <translation id="1751249301761991853">Isiklik</translation> <translation id="1753496554272155572">Taustapildi eelvaatest väljumine</translation> +<translation id="1755556344721611131">Rakendus Diagnostika</translation> <translation id="175763766237925754">Hea (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb index f08c899..209afa68 100644 --- a/chromeos/strings/chromeos_strings_fil.xtb +++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -16,6 +16,7 @@ <translation id="1124772482545689468">User</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1145018782460575098">Nakabukas ang window para i-update ang firmware para sa mga external device. <ph name="NUM_UPDATES" /> (na) update ang available.</translation> +<translation id="1145516343487477149">Maghanap ng mga artikulo ng tulong at sagot sa mga karaniwang tanong sa Chromebook</translation> <translation id="1165039591588034296">Error</translation> <translation id="1175697296044146566">Pinapamahalaan ng <ph name="MANAGER" /> ang <ph name="DEVICE_TYPE" /> na ito.</translation> <translation id="1175951029573070619">Katamtaman (<ph name="SIGNAL_STRENGTH" />)</translation> @@ -120,6 +121,7 @@ <translation id="1871569928317311284">I-off ang madilim na tema</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">I-off ang dark mode</translation> +<translation id="1881188606372070653">Pumunta sa <ph name="BEGIN_LINK1" />page na Legal na Tulong<ph name="END_LINK1" /> para humiling ng mga pagbabago sa content para sa mga legal na dahilan. Puwedeng ipadala sa Google ang ilang impormasyon ng account at system. Gagamitin namin ang impormasyong ibibigay mo sa amin para makatulong sa pagtugon sa mga teknikal na isyu at mapahusay ang aming mga serbisyo, na napapailalim sa aming <ph name="BEGIN_LINK2" />Patakaran sa Privacy<ph name="END_LINK2" /> at <ph name="BEGIN_LINK3" />Mga Tuntunin ng Serbisyo<ph name="END_LINK3" />.</translation> <translation id="1887850431809612466">Rebisyon ng hardware</translation> <translation id="1905710495812624430">Nalampasan na ang maximum na pinapahintulutang bilang ng pagsubok</translation> <translation id="1908234395526491708">Mga hindi naisagawang kahilingan sa UDP</translation> @@ -623,6 +625,7 @@ <translation id="6379086450106841622">Touchscreen</translation> <translation id="6381741036071372448">Subukan ang iyong keyboard</translation> <translation id="6388847657025262518">Nag-jam ang document feeder ng scanner. Tingnan ang feeder at subukan ulit.</translation> +<translation id="6394634179843537518">Magdagdag ng file</translation> <translation id="6410257289063177456">Mga File ng Larawan</translation> <translation id="641081527798843608">Pagtugma ng paksa</translation> <translation id="6423239382391657905">OpenVPN</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb index 699ddac..f69c623 100644 --- a/chromeos/strings/chromeos_strings_fr.xtb +++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">Impossible de charger les images. Vérifiez votre connexion réseau ou réessayez de charger les images.</translation> <translation id="1751249301761991853">Personnalisés</translation> <translation id="1753496554272155572">Quitter l'aperçu du fond d'écran</translation> +<translation id="1755556344721611131">Appli de diagnostic</translation> <translation id="175763766237925754">Bonne (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb index 42783fe..b98fa0e 100644 --- a/chromeos/strings/chromeos_strings_gl.xtb +++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">Non se puideron cargar as imaxes. Comproba a túa conexión de rede ou tenta cargalas de novo.</translation> <translation id="1751249301761991853">Personalizar</translation> <translation id="1753496554272155572">Saír da vista previa do fondo de pantalla</translation> +<translation id="1755556344721611131">Aplicación Diagnósticos</translation> <translation id="175763766237925754">Boa (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb index fc65e95..4d2967b 100644 --- a/chromeos/strings/chromeos_strings_id.xtb +++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">Tidak dapat memuat foto. Periksa koneksi jaringan Anda atau coba muat foto lagi.</translation> <translation id="1751249301761991853">Pribadi</translation> <translation id="1753496554272155572">Keluar dari pratinjau wallpaper</translation> +<translation id="1755556344721611131">Aplikasi Diagnostik</translation> <translation id="175763766237925754">Baik (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_is.xtb b/chromeos/strings/chromeos_strings_is.xtb index 7bfd014e..6d7a4910 100644 --- a/chromeos/strings/chromeos_strings_is.xtb +++ b/chromeos/strings/chromeos_strings_is.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">Ekki tókst að hlaða myndum. Athugaðu nettenginguna og reyndu að hlaða myndunum aftur.</translation> <translation id="1751249301761991853">Persónulegt</translation> <translation id="1753496554272155572">Loka forskoðun veggfóðurs</translation> +<translation id="1755556344721611131">Greiningarforrit</translation> <translation id="175763766237925754">Góður (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb index 95fa7a9..cc126754 100644 --- a/chromeos/strings/chromeos_strings_it.xtb +++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -16,6 +16,7 @@ <translation id="1124772482545689468">Utente</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1145018782460575098">È aperta la finestra per aggiornare il firmware dei dispositivi esterni. <ph name="NUM_UPDATES" /> aggiornamenti disponibili.</translation> +<translation id="1145516343487477149">Trova articoli del Centro assistenza e risposte a domande comuni sui Chromebook</translation> <translation id="1165039591588034296">Errore</translation> <translation id="1175697296044146566">Questo dispositivo <ph name="DEVICE_TYPE" /> è gestito da <ph name="MANAGER" />.</translation> <translation id="1175951029573070619">Nella media (<ph name="SIGNAL_STRENGTH" />)</translation> @@ -120,6 +121,7 @@ <translation id="1871569928317311284">Disattiva il tema scuro</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">Disattiva la modalità Buio</translation> +<translation id="1881188606372070653">Vai alla <ph name="BEGIN_LINK1" />Guida di approfondimento legale<ph name="END_LINK1" /> per richiedere modifiche ai contenuti per motivi legali. Alcune informazioni sull'account e sul sistema potrebbero essere inviate a Google. Utilizzeremo le informazioni fornite per risolvere problemi tecnici e migliorare i nostri servizi, in conformità con le nostre <ph name="BEGIN_LINK2" />Norme sulla privacy<ph name="END_LINK2" /> e i nostri <ph name="BEGIN_LINK3" />Termini di servizio<ph name="END_LINK3" />.</translation> <translation id="1887850431809612466">Revisione hardware</translation> <translation id="1905710495812624430">Numero massimo di tentativi consentiti superato.</translation> <translation id="1908234395526491708">Errori delle richieste UDP</translation> @@ -623,6 +625,7 @@ <translation id="6379086450106841622">Touchscreen</translation> <translation id="6381741036071372448">Testare la tastiera</translation> <translation id="6388847657025262518">L'alimentatore di documenti dello scanner è inceppato. Controlla l'alimentatore e riprova.</translation> +<translation id="6394634179843537518">Aggiungi file</translation> <translation id="6410257289063177456">File di immagine</translation> <translation id="641081527798843608">Corrispondenza oggetto</translation> <translation id="6423239382391657905">OpenVPN</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index 26a0a084..534a2a4 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">לא ניתן היה לטעון את התמונות. כדאי לבדוק את החיבור לרשת או לנסות לטעון את התמונות שוב.</translation> <translation id="1751249301761991853">התאמה אישית</translation> <translation id="1753496554272155572">יציאה מהתצוגה המקדימה של הטפט</translation> +<translation id="1755556344721611131">אפליקציית אבחון</translation> <translation id="175763766237925754">טוב (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb index 16f218d..2aeb145 100644 --- a/chromeos/strings/chromeos_strings_ja.xtb +++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">画像を読み込めませんでした。ネットワーク接続を確認するか、画像をもう一度読み込んでみてください。</translation> <translation id="1751249301761991853">パーソナライズ</translation> <translation id="1753496554272155572">壁紙のプレビューを終了</translation> +<translation id="1755556344721611131">診断アプリ</translation> <translation id="175763766237925754">良好(<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb index a4795d4..25e6ce8 100644 --- a/chromeos/strings/chromeos_strings_ka.xtb +++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -16,6 +16,7 @@ <translation id="1124772482545689468">მომხმარებელი</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1145018782460575098">გახსნილია გარე მოწყობილობების ჩაშენებული პროგრამული უზრუნველყოფის განახლების ფანჯარა. ხელმისაწვდომია <ph name="NUM_UPDATES" /> განახლება.</translation> +<translation id="1145516343487477149">იპოვეთ დამხმარე სტატიები და პასუხები გავრცელებულ შეკითხვებზე Chromebook-თან დაკავშირებით</translation> <translation id="1165039591588034296">შეცდომა</translation> <translation id="1175697296044146566">ეს <ph name="DEVICE_TYPE" /> იმართება <ph name="MANAGER" />-ის მიერ.</translation> <translation id="1175951029573070619">საშუალო (<ph name="SIGNAL_STRENGTH" />)</translation> @@ -120,6 +121,7 @@ <translation id="1871569928317311284">მუქი თემის გამორთვა</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">მუქი რეჟიმის გამორთვა</translation> +<translation id="1881188606372070653">გადადით <ph name="BEGIN_LINK1" />სამართლებრივი დახმარების გვერდზე<ph name="END_LINK1" />, რათა მოითხოვოთ კონტენტის ცვლილება სამართლებრივი მიზეზებით. ანგარიშისა და სისტემის შესახებ გარკვეული ინფორმაცია შეიძლება გაეგზავნოს Google-ს. თქვენ მიერ მოწოდებულ ინფორმაციას ტექნიკური პრობლემების მოსაგვარებლად და ჩვენი სერვისების გასაუმჯობესებლად გამოვიყენებთ, ჩვენი <ph name="BEGIN_LINK2" />კონფიდენციალურობის დებულებისა<ph name="END_LINK2" /> და <ph name="BEGIN_LINK3" />მომსახურების პირობების<ph name="END_LINK3" /> შესაბამისად.</translation> <translation id="1887850431809612466">აპარატურის ვერსია</translation> <translation id="1905710495812624430">გადაჭარბებულია მცდელობათა მაქსიმალური რაოდენობა.</translation> <translation id="1908234395526491708">წარუმატებელი UDP მოთხოვნები</translation> @@ -623,6 +625,7 @@ <translation id="6379086450106841622">სენსორული ეკრანი</translation> <translation id="6381741036071372448">შეამოწმეთ თქვენი კლავიატურა</translation> <translation id="6388847657025262518">სკანერის დოკუმენტების მიმწოდი გაიჭედა. შეამოწმეთ მიმწოდი და ცადეთ ხელახლა.</translation> +<translation id="6394634179843537518">ფაილის დამატება</translation> <translation id="6410257289063177456">გამოსახულების ფაილები</translation> <translation id="641081527798843608">თემის თანხვედრა</translation> <translation id="6423239382391657905">OpenVPN</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb index 30dc2bd5..97e6815 100644 --- a/chromeos/strings/chromeos_strings_kn.xtb +++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -16,6 +16,7 @@ <translation id="1124772482545689468">ಬಳಕೆದಾರ</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1145018782460575098">ಬಾಹ್ಯ ಸಾಧನಗಳಿಗಾಗಿ ಫರ್ಮ್ವೇರ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ ವಿಂಡೋ ತೆರೆದಿದೆ. <ph name="NUM_UPDATES" /> ಅಪ್ಡೇಟ್ಗಳು ಲಭ್ಯವಿದೆ.</translation> +<translation id="1145516343487477149">ಸಾಮಾನ್ಯ Chromebook ಪ್ರಶ್ನೆಗಳಿಗೆ ಸಂಬಂಧಿಸಿದ ಸಹಾಯ ಒದಗಿಸುವ ಲೇಖನಗಳು ಹಾಗೂ ಉತ್ತರಗಳನ್ನು ಕಂಡುಕೊಳ್ಳಿ</translation> <translation id="1165039591588034296">ದೋಷ</translation> <translation id="1175697296044146566">ಈ <ph name="DEVICE_TYPE" />, <ph name="MANAGER" /> ಇಂದ ನಿರ್ವಹಿಸಲ್ಪಡುತ್ತದೆ.</translation> <translation id="1175951029573070619">ಸರಾಸರಿ (<ph name="SIGNAL_STRENGTH" />)</translation> @@ -120,6 +121,7 @@ <translation id="1871569928317311284">ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಆಫ್ ಮಾಡಿ</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">ಕತ್ತಲೆ ಮೋಡ್ ಆಫ್ ಮಾಡಿ</translation> +<translation id="1881188606372070653">ಕಾನೂನು ಕಾರಣಗಳಿಗಾಗಿ ವಿಷಯದ ಬದಲಾವಣೆಗಳಿಗೆ ವಿನಂತಿಸುವುದಕ್ಕಾಗಿ <ph name="BEGIN_LINK1" />ಕಾನೂನು ಸಹಾಯ ಪುಟಕ್ಕೆ<ph name="END_LINK1" /> ಹೋಗಿ. ಕೆಲವು ಖಾತೆ ಮತ್ತು ಸಿಸ್ಟಂ ಮಾಹಿತಿಯನ್ನು Google ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ. ತಾಂತ್ರಿಕ ಸಮಸ್ಯೆಗಳನ್ನು ಪರಿಹರಿಸಲು ಮತ್ತು ನಮ್ಮ ಸೇವೆಗಳನ್ನು ಸುಧಾರಿಸಲು ಸಹಾಯ ಮಾಡುವುದಕ್ಕಾಗಿ, ನೀವು ನಮಗೆ ನೀಡಿರುವ ಮಾಹಿತಿಯನ್ನು ನಾವು ಬಳಸುತ್ತೇವೆ, ಇದು ನಮ್ಮ <ph name="BEGIN_LINK2" />ಗೌಪ್ಯತೆ ನೀತಿ<ph name="END_LINK2" /> ಮತ್ತು <ph name="BEGIN_LINK3" />ಸೇವಾ ನಿಯಮಗಳಿಗೆ<ph name="END_LINK3" /> ಒಳಪಟ್ಟಿರುತ್ತದೆ.</translation> <translation id="1887850431809612466">ಹಾರ್ಡ್ವೇರ್ ಪರಿಷ್ಕರಣೆ</translation> <translation id="1905710495812624430">ಅನುಮತಿಸಲಾದ ಗರಿಷ್ಟ ಪ್ರಯತ್ನಗಳು ಮೀರಿವೆ.</translation> <translation id="1908234395526491708">UDP ವಿನಂತಿ ವೈಫಲ್ಯಗಳು</translation> @@ -622,6 +624,7 @@ <translation id="6379086450106841622">ಟಚ್ಸ್ಕ್ರೀನ್</translation> <translation id="6381741036071372448">ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ</translation> <translation id="6388847657025262518">ಸ್ಕ್ಯಾನರ್ನ ಡಾಕ್ಯುಮೆಂಟ್ ಫೀಡರ್ ಜಾಮ್ ಆಗಿದೆ. ಫೀಡರ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> +<translation id="6394634179843537518">ಫೈಲ್ ಅನ್ನು ಸೇರಿಸಿ</translation> <translation id="6410257289063177456">ಇಮೇಜ್ ಫೈಲ್ಗಳು</translation> <translation id="641081527798843608">ವಿಷಯದ ಹೊಂದಾಣಿಕೆ</translation> <translation id="6423239382391657905">VPN ತೆರೆಯಿರಿ</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb index 2df2274..1c67ab2 100644 --- a/chromeos/strings/chromeos_strings_ko.xtb +++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">이미지를 로드할 수 없습니다. 네트워크 연결을 확인하거나 이미지를 다시 로드해 보세요.</translation> <translation id="1751249301761991853">개인</translation> <translation id="1753496554272155572">배경화면 미리보기 종료</translation> +<translation id="1755556344721611131">진단 앱</translation> <translation id="175763766237925754">양호(<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb index 035a87f..6e7823e8 100644 --- a/chromeos/strings/chromeos_strings_mn.xtb +++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -16,6 +16,7 @@ <translation id="1124772482545689468">Хэрэглэгч</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1145018782460575098">Гадаад төхөөрөмжүүдийн жижиг программыг шинэчлэх цонх нээлттэй байна. <ph name="NUM_UPDATES" /> шинэчлэлт боломжтой байна.</translation> +<translation id="1145516343487477149">Тусламжийн нийтлэл болон Chromebook-н нийтлэг асуултуудын хариултыг олно уу</translation> <translation id="1165039591588034296">Алдаа</translation> <translation id="1175697296044146566">Энэ <ph name="DEVICE_TYPE" />-г <ph name="MANAGER" /> удирддаг.</translation> <translation id="1175951029573070619">Дундаж (<ph name="SIGNAL_STRENGTH" />)</translation> @@ -120,6 +121,7 @@ <translation id="1871569928317311284">Бараан загварыг унтраах</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">Бараан горимыг унтраах</translation> +<translation id="1881188606372070653">Хууль эрх зүйн шалтгаанаар контентод өөрчлөлт хийхийг хүсвэл <ph name="BEGIN_LINK1" />Хуулийн тусламжийн хуудас<ph name="END_LINK1" /> руу очно уу. Зарим бүртгэл болон системийн мэдээллийг Google рүү илгээж болзошгүй. Бид таны өгсөн мэдээллийг өөрсдийн <ph name="BEGIN_LINK2" />Нууцлалын бодлого<ph name="END_LINK2" />, <ph name="BEGIN_LINK3" />Үйлчилгээний нөхцөлийн<ph name="END_LINK3" /> дагуу техникийн асуудлыг шийдвэрлэхэд туслах болон үйлчилгээнүүдээ сайжруулахад ашиглана.</translation> <translation id="1887850431809612466">Техник хангамжийн шалгалт</translation> <translation id="1905710495812624430">Оролдлогын тоо дээд хэмжээнээс хэтэрсэн.</translation> <translation id="1908234395526491708">UDP хүсэлтийн алдаа</translation> @@ -623,6 +625,7 @@ <translation id="6379086450106841622">Мэдрэмтгий дэлгэц</translation> <translation id="6381741036071372448">Гараа шалгана уу</translation> <translation id="6388847657025262518">Сканнерын документ дамжуулах тавиур гацсан байна. Дамжуулах тавиурыг шалгаад, дахин оролдоно уу.</translation> +<translation id="6394634179843537518">Файл нэмэх</translation> <translation id="6410257289063177456">Зургийн файлууд</translation> <translation id="641081527798843608">Субъект тохируулах</translation> <translation id="6423239382391657905">VPN-г нээх</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb index dfa707df..56e065b 100644 --- a/chromeos/strings/chromeos_strings_my.xtb +++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -16,6 +16,7 @@ <translation id="1124772482545689468">အသုံးပြုသူ</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1145018782460575098">ပြင်ပစက်ပစ္စည်းများအတွက် ဖာမ်းဝဲအပ်ဒိတ်ဝင်းဒိုး ဖွင့်ထားသည်။ <ph name="NUM_UPDATES" /> အပ်ဒိတ်များ ရနိုင်ပါပြီ။</translation> +<translation id="1145516343487477149">မေးလေ့ရှိသော Chromebook မေးခွန်းများအတွက် အကူအညီပေးဆောင်းပါးနှင့် အဖြေများ ရှာဖွေနိုင်သည်</translation> <translation id="1165039591588034296">အမှား</translation> <translation id="1175697296044146566">ဤ <ph name="DEVICE_TYPE" /> ကို <ph name="MANAGER" /> က စီမံသည်။</translation> <translation id="1175951029573070619">သာမန် (<ph name="SIGNAL_STRENGTH" />)</translation> @@ -120,6 +121,7 @@ <translation id="1871569928317311284">မှောင်သည့် အပြင်အဆင် ပိတ်ရန်</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">အမှောင်မုဒ် ပိတ်ရန်</translation> +<translation id="1881188606372070653">ဥပဒေဆိုင်ရာ အကြောင်းများကြောင့် အချက်အလက်များ ပြောင်းလိုပါက <ph name="BEGIN_LINK1" />'ဥပဒေဆိုင်ရာ အကူအညီ' စာမျက်နှာ<ph name="END_LINK1" /> သို့ သွားပါ။ အကောင့်နှင့် စနစ်အချက်အလက် အချို့ကို Google သို့ ပေးပို့နိုင်သည်။ ကျွန်ုပ်တို့၏ <ph name="BEGIN_LINK2" />ကိုယ်ရေးအချက်အလက်လုံခြုံမှုဆိုင်ရာ မူဝါဒ<ph name="END_LINK2" /> နှင့် <ph name="BEGIN_LINK3" />ဝန်ဆောင်မှု စည်းမျဉ်းများ<ph name="END_LINK3" /> အရ ကျွန်ုပ်တို့၏ ဝန်ဆောင်မှုများ တိုးတက်ကောင်းမွန်လာစေရန်နှင့် နည်းပညာဆိုင်ရာ ပြဿနာများ ကူညီဖြေရှင်းပေးနိုင်ရန် သင်ပေးသည့် အချက်အလက်များကို ကျွန်ုပ်တို့ အသုံးပြုသွားပါမည်။</translation> <translation id="1887850431809612466">စက်ပစ္စည်း စိစစ်သုံးသပ်ခြင်း</translation> <translation id="1905710495812624430">အများဆုံးခွင့်ပြုပေးထားသည့် အခေါက်အရေအတွက်ထက် ကျော်လွန်သွားပါပြီ။</translation> <translation id="1908234395526491708">UDP တောင်းဆိုချက် ချွတ်ယွင်းမှုများ</translation> @@ -622,6 +624,7 @@ <translation id="6379086450106841622">တို့ထိမျက်နှာပြင်</translation> <translation id="6381741036071372448">ကီးဘုတ်စမ်းသပ်ရန်</translation> <translation id="6388847657025262518">စကင်ဖတ်စက်၏ စာရွက်ထည့်ရန်ဗန်း ညပ်နေသည်။ ဗန်းကို စစ်ဆေးပြီး ထပ်စမ်းကြည့်ပါ။</translation> +<translation id="6394634179843537518">ဖိုင်ထည့်ရန်</translation> <translation id="6410257289063177456">ပုံ ဖိုင်များ</translation> <translation id="641081527798843608">တိုက်ဆိုင်သည့် အကြောင်းအရာ</translation> <translation id="6423239382391657905">OpenVPN</translation>
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb index 20c81a3a..8f7ba727 100644 --- a/chromeos/strings/chromeos_strings_nl.xtb +++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -16,6 +16,7 @@ <translation id="1124772482545689468">Gebruiker</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1145018782460575098">Het venster voor het updaten van firmware voor externe apparaten is geopend. <ph name="NUM_UPDATES" /> updates beschikbaar.</translation> +<translation id="1145516343487477149">Help-artikelen en antwoorden op veelgestelde vragen over Chromebooks bekijken</translation> <translation id="1165039591588034296">Fout</translation> <translation id="1175697296044146566">Deze <ph name="DEVICE_TYPE" /> wordt beheerd door <ph name="MANAGER" />.</translation> <translation id="1175951029573070619">Gemiddeld (<ph name="SIGNAL_STRENGTH" />)</translation> @@ -120,6 +121,7 @@ <translation id="1871569928317311284">Donker thema uitzetten</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">Donkere modus uitzetten</translation> +<translation id="1881188606372070653">Ga naar de <ph name="BEGIN_LINK1" />juridische Help-pagina<ph name="END_LINK1" /> om contentwijzigingen om juridische redenen aan te vragen. Bepaalde account- en systeemgegevens worden mogelijk naar Google gestuurd. We gebruiken deze gegevens om technische problemen op te lossen en onze services te verbeteren, in overeenstemming met ons <ph name="BEGIN_LINK2" />Privacybeleid<ph name="END_LINK2" /> en onze <ph name="BEGIN_LINK3" />Servicevoorwaarden<ph name="END_LINK3" />.</translation> <translation id="1887850431809612466">Hardwarerevisie</translation> <translation id="1905710495812624430">Maximumaantal toegestane pogingen overschreden.</translation> <translation id="1908234395526491708">Mislukte UDP-verzoeken</translation> @@ -623,6 +625,7 @@ <translation id="6379086450106841622">Touchscreen</translation> <translation id="6381741036071372448">Je toetsenbord testen</translation> <translation id="6388847657025262518">De documentinvoer van de scanner is vastgelopen. Check de invoer en probeer het opnieuw.</translation> +<translation id="6394634179843537518">Bestand toevoegen</translation> <translation id="6410257289063177456">Afbeeldingsbestanden</translation> <translation id="641081527798843608">Overeenkomst van onderwerp</translation> <translation id="6423239382391657905">OpenVPN</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb index be61e2e..75b4c2f 100644 --- a/chromeos/strings/chromeos_strings_no.xtb +++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -16,6 +16,7 @@ <translation id="1124772482545689468">Bruker</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1145018782460575098">Vinduet for oppdatering av fastvare på eksterne enheter er åpent. <ph name="NUM_UPDATES" /> oppdateringer er tilgjengelige.</translation> +<translation id="1145516343487477149">Finn hjelpeartikler og svar på vanlige Chromebook-spørsmål</translation> <translation id="1165039591588034296">Feil</translation> <translation id="1175697296044146566">Denne <ph name="DEVICE_TYPE" />-enheten administreres av <ph name="MANAGER" />.</translation> <translation id="1175951029573070619">Gjennomsnittlig (<ph name="SIGNAL_STRENGTH" />)</translation> @@ -120,6 +121,7 @@ <translation id="1871569928317311284">Slå av mørkt tema</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">Slå av mørk modus</translation> +<translation id="1881188606372070653">Gå til <ph name="BEGIN_LINK1" />siden for juridisk hjelp<ph name="END_LINK1" /> for å be om innholdsendringer på juridisk grunnlag. Noe konto- og systeminformasjon kan bli sendt til Google. Vi bruker informasjonen du gir oss, til å løse tekniske problemer og forbedre tjenestene våre i henhold til <ph name="BEGIN_LINK2" />personvernreglene<ph name="END_LINK2" /> and <ph name="BEGIN_LINK3" />vilkårene for bruk<ph name="END_LINK3" />.</translation> <translation id="1887850431809612466">Maskinvareversjon</translation> <translation id="1905710495812624430">Du har overskredet maksimumsgrensen for antall forsøk.</translation> <translation id="1908234395526491708">Mislykkede UDP-forespørsler</translation> @@ -623,6 +625,7 @@ <translation id="6379086450106841622">Berøringsskjerm</translation> <translation id="6381741036071372448">Test tastaturet</translation> <translation id="6388847657025262518">Skannerens dokumentmater er tilstoppet. Sjekk materen, og prøv på nytt.</translation> +<translation id="6394634179843537518">Legg til fil</translation> <translation id="6410257289063177456">Bildefiler</translation> <translation id="641081527798843608">Emnetreff</translation> <translation id="6423239382391657905">OpenVPN</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb index e6c9a07a..fa4ce79 100644 --- a/chromeos/strings/chromeos_strings_pl.xtb +++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">Nie udało się załadować obrazów. Sprawdź połączenie sieciowe lub spróbuj załadować obrazy później.</translation> <translation id="1751249301761991853">Osobiste</translation> <translation id="1753496554272155572">Ikona zamknięcia podglądu tapety</translation> +<translation id="1755556344721611131">Aplikacja diagnostyczna</translation> <translation id="175763766237925754">Dobra (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb index ab5495f..86271937 100644 --- a/chromeos/strings/chromeos_strings_sl.xtb +++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">Slik ni bilo mogoče naložiti. Preverite omrežno povezavo ali znova poskusite naložiti slike.</translation> <translation id="1751249301761991853">Osebno</translation> <translation id="1753496554272155572">Zapiranje predogleda zaslonskega ozadja</translation> +<translation id="1755556344721611131">Aplikacija za diagnostiko</translation> <translation id="175763766237925754">Dobra (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb index 3b85df5..4943e4a2 100644 --- a/chromeos/strings/chromeos_strings_te.xtb +++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">ఇమేజ్లను లోడ్ చేయడం సాధ్యపడలేదు. మీ నెట్వర్క్ కనెక్షన్ను చెక్ చేయండి లేదా ఇమేజ్లను మళ్లీ లోడ్ చేయడానికి ట్రై చేయండి.</translation> <translation id="1751249301761991853">వ్యక్తిగతం</translation> <translation id="1753496554272155572">వాల్పేపర్ ప్రివ్యూ నుండి నిష్క్రమించండి</translation> +<translation id="1755556344721611131">సమస్య విశ్లేషణలకు సంబంధించిన యాప్</translation> <translation id="175763766237925754">బాగుంది (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb index b6634f9..e871d07b 100644 --- a/chromeos/strings/chromeos_strings_tr.xtb +++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">Resimler yüklenemedi. Ağ bağlantınızı kontrol edin veya resimleri tekrar yüklemeyi deneyin.</translation> <translation id="1751249301761991853">Kişisel</translation> <translation id="1753496554272155572">Duvar kağıdı önizlemesinden çık</translation> +<translation id="1755556344721611131">Teşhis Aracı uygulaması</translation> <translation id="175763766237925754">İyi (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">EAP-TLS</translation> <translation id="1759842336958782510">Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb index f2bfd12..897e5d1c 100644 --- a/chromeos/strings/chromeos_strings_ur.xtb +++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -16,6 +16,7 @@ <translation id="1124772482545689468">صارف</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1145018782460575098">خارجی آلات کے لیے فرم ویئر کو اپ ڈیٹ کریں کا ونڈو کھلا ہے۔ <ph name="NUM_UPDATES" /> اپ ڈیٹس دستیاب ہیں۔</translation> +<translation id="1145516343487477149">امدادی مضامین اور Chromebook سے متعلق عام سوالات کے جوابات تلاش کریں</translation> <translation id="1165039591588034296">خرابی</translation> <translation id="1175697296044146566"><ph name="MANAGER" /> اس <ph name="DEVICE_TYPE" /> کا نظم کرتا ہے۔</translation> <translation id="1175951029573070619">اوسط (<ph name="SIGNAL_STRENGTH" />)</translation> @@ -120,6 +121,7 @@ <translation id="1871569928317311284">گہری تھیم آف کریں</translation> <translation id="1874612839560830905">MTU</translation> <translation id="188114911237521550">تاریک وضع آف کریں</translation> +<translation id="1881188606372070653">قانونی وجوہات کی بنا پر مواد میں تبدیلی کی درخواست کرنے کے لیے <ph name="BEGIN_LINK1" />قانونی مدد کے صفحہ<ph name="END_LINK1" /> پر جائیں۔ اکاؤنٹ اور سسٹم کی کچھ معلومات Google کو بھیجی جا سکتی ہے۔ ہم اپنی <ph name="BEGIN_LINK2" />رازداری کی پالیسی<ph name="END_LINK2" /> اور <ph name="BEGIN_LINK3" />سروس کی شرائط<ph name="END_LINK3" /> کے ساتھ مشروط، تکنیکی مسائل حل کرنے اور اپنی سروسز کو بہتر بنانے کیلئے آپ کی فراہم کردہ معلومات کا استعمال کریں گے۔</translation> <translation id="1887850431809612466">ہارڈ ویئر سے متعلق نظر ثانی</translation> <translation id="1905710495812624430">زیادہ سے زیادہ مجاز کوششوں سے تجاوز کرگیا۔</translation> <translation id="1908234395526491708">UDP درخواست کی ناکامیاں</translation> @@ -622,6 +624,7 @@ <translation id="6379086450106841622">ٹچ اسکرین</translation> <translation id="6381741036071372448">اپنے کی بورڈ کو ٹیسٹ کریں</translation> <translation id="6388847657025262518">اسکینر کا دستاویز فیڈر جام ہے۔ فیڈر چیک کریں اور دوبارہ کوشش کریں۔</translation> +<translation id="6394634179843537518">فائل شامل کریں</translation> <translation id="6410257289063177456">تصویری فائلیں</translation> <translation id="641081527798843608">موضوع کی مماثلت</translation> <translation id="6423239382391657905">OpenVPN</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb index d7f3bb4..27f4edba 100644 --- a/chromeos/strings/chromeos_strings_zu.xtb +++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -103,6 +103,7 @@ <translation id="1745577949879301685">Ayikwazanga ukulayisha imifanekiso. Hlola uxhumo lwakho lwenethiwekhi noma uzame ukulayisha futhi imifanekiso.</translation> <translation id="1751249301761991853">Okomuntu siqu</translation> <translation id="1753496554272155572">Phuma ekubukeni kuqala kwesithombe sangemuva</translation> +<translation id="1755556344721611131">I-app yokuxilonga</translation> <translation id="175763766237925754">Kuhle (<ph name="SIGNAL_STRENGTH" />)</translation> <translation id="1758018619400202187">I-EAP-TLS</translation> <translation id="1759842336958782510">I-Chrome</translation>
diff --git a/components/autofill/core/browser/autofill_address_util.cc b/components/autofill/core/browser/autofill_address_util.cc index 3000d73..72c04fe0 100644 --- a/components/autofill/core/browser/autofill_address_util.cc +++ b/components/autofill/core/browser/autofill_address_util.cc
@@ -23,7 +23,6 @@ #include "components/strings/grit/components_strings.h" #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_ui.h" #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_ui_component.h" -#include "third_party/libaddressinput/src/cpp/include/libaddressinput/localization.h" #include "third_party/re2/src/re2/re2.h" #include "ui/base/l10n/l10n_util.h" @@ -35,39 +34,6 @@ namespace { -// Extend `components` using Autofill's address format extensions. These are -// used to add support for fields that are not strictly required for a valid -// address, and thus not provided by libaddressinput, but still commonly appear -// in forms. -void ExtendAddressComponents(std::vector<AddressUiComponent>& components, - const std::string& country_code, - const Localization& localization) { - AutofillCountry country(country_code); - for (const AutofillCountry::AddressFormatExtension& rule : - country.address_format_extensions()) { - // Find the location of `rule.placed_after` in `components`. - // `components.field` is only valid if `components.literal.empty()`. - auto prev_component = base::ranges::find_if( - components, [&rule](const AddressUiComponent& component) { - return component.literal.empty() && - component.field == rule.placed_after; - }); - DCHECK(prev_component != components.end()); - - // Insert the separator and `rule.type` afterwards. - components.insert( - ++prev_component, - {AddressUiComponent{.literal = - std::string(rule.separator_before_label)}, - AddressUiComponent{ - .field = rule.type, - .name = localization.GetString(rule.label_id), - .length_hint = rule.large_sized - ? AddressUiComponent::HINT_LONG - : AddressUiComponent::HINT_SHORT}}); - } -} - // Returns a vector of AddressUiComponent for `country_code` when using // `ui_language_code`. If no components are available for `country_code`, it // defaults back to the US. If `ui_language_code` is not valid, the default @@ -86,7 +52,8 @@ ::i18n::addressinput::BuildComponentsWithLiterals( country, localization, ui_language_code, components_language_code); if (!components.empty()) { - ExtendAddressComponents(components, country, localization); + ExtendAddressComponents(components, country, localization, + /*include_literals=*/true); return components; } } @@ -96,6 +63,39 @@ } // namespace +void ExtendAddressComponents(std::vector<AddressUiComponent>& components, + const std::string& country_code, + const Localization& localization, + bool include_literals) { + AutofillCountry country(country_code); + for (const AutofillCountry::AddressFormatExtension& rule : + country.address_format_extensions()) { + // Find the location of `rule.placed_after` in `components`. + // `components.field` is only valid if `components.literal.empty()`. + auto prev_component = base::ranges::find_if( + components, [&rule](const AddressUiComponent& component) { + return component.literal.empty() && + component.field == rule.placed_after; + }); + DCHECK(prev_component != components.end()); + + // Insert the separator and `rule.type` after `prev_component`. + if (include_literals) { + prev_component = components.insert( + ++prev_component, + AddressUiComponent{.literal = + std::string(rule.separator_before_label)}); + } + components.insert( + ++prev_component, + AddressUiComponent{ + .field = rule.type, + .name = localization.GetString(rule.label_id), + .length_hint = rule.large_sized ? AddressUiComponent::HINT_LONG + : AddressUiComponent::HINT_SHORT}); + } +} + void GetAddressComponents( const std::string& country_code, const std::string& ui_language_code,
diff --git a/components/autofill/core/browser/autofill_address_util.h b/components/autofill/core/browser/autofill_address_util.h index 31cdd6f..f04b8a5 100644 --- a/components/autofill/core/browser/autofill_address_util.h +++ b/components/autofill/core/browser/autofill_address_util.h
@@ -10,12 +10,22 @@ #include "components/autofill/core/browser/data_model/autofill_profile_comparator.h" #include "components/autofill/core/browser/field_types.h" #include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_ui_component.h" +#include "third_party/libaddressinput/src/cpp/include/libaddressinput/localization.h" namespace autofill { class AutofillProfile; class PersonalDataManager; +// Extend `components` using Autofill's address format extensions. These are +// used make fields beyond libaddressinput's format available in Autofill's +// settings UI and import dialogs. +void ExtendAddressComponents( + std::vector<::i18n::addressinput::AddressUiComponent>& components, + const std::string& country_code, + const ::i18n::addressinput::Localization& localization, + bool include_literals); + // |address_components| is a 2D array for the address components in each line. // Fills |address_components| with the address UI components that should be used // to input an address for |country_code| when UI BCP 47 language code is
diff --git a/components/autofill_assistant/browser/BUILD.gn b/components/autofill_assistant/browser/BUILD.gn index 283cf0b..dd97d10 100644 --- a/components/autofill_assistant/browser/BUILD.gn +++ b/components/autofill_assistant/browser/BUILD.gn
@@ -198,8 +198,8 @@ "generic_ui_replace_placeholders.h", "headless/client_headless.cc", "headless/client_headless.h", - "headless/external_script_controller_impl.cc", - "headless/external_script_controller_impl.h", + "headless/headless_script_controller_impl.cc", + "headless/headless_script_controller_impl.h", "headless/headless_ui_controller.cc", "headless/headless_ui_controller.h", "info_box.cc", @@ -409,6 +409,8 @@ "actions/mock_action_delegate.h", "actions/wait_for_dom_test_base.cc", "actions/wait_for_dom_test_base.h", + "fake_common_dependencies.cc", + "fake_common_dependencies.h", "fake_script_executor_delegate.cc", "fake_script_executor_delegate.h", "fake_script_executor_ui_delegate.cc",
diff --git a/components/autofill_assistant/browser/actions/action_delegate.h b/components/autofill_assistant/browser/actions/action_delegate.h index a9119f1..de599fd 100644 --- a/components/autofill_assistant/browser/actions/action_delegate.h +++ b/components/autofill_assistant/browser/actions/action_delegate.h
@@ -13,7 +13,7 @@ #include "base/callback_helpers.h" #include "components/autofill_assistant/browser/js_flow_devtools_wrapper.h" #include "components/autofill_assistant/browser/public/external_action_delegate.h" -#include "components/autofill_assistant/browser/public/external_script_controller.h" +#include "components/autofill_assistant/browser/public/headless_script_controller.h" #include "components/autofill_assistant/browser/service.pb.h" #include "components/autofill_assistant/browser/tts_button_state.h" #include "components/autofill_assistant/browser/viewport_mode.h"
diff --git a/components/autofill_assistant/browser/actions/external_action.h b/components/autofill_assistant/browser/actions/external_action.h index aaacd8d..08ad8c8 100644 --- a/components/autofill_assistant/browser/actions/external_action.h +++ b/components/autofill_assistant/browser/actions/external_action.h
@@ -8,7 +8,7 @@ #include "components/autofill_assistant/browser/actions/action.h" #include "components/autofill_assistant/browser/batch_element_checker.h" #include "components/autofill_assistant/browser/public/external_action_delegate.h" -#include "components/autofill_assistant/browser/public/external_script_controller.h" +#include "components/autofill_assistant/browser/public/headless_script_controller.h" #include "components/autofill_assistant/browser/wait_for_dom_observer.h" namespace autofill_assistant {
diff --git a/components/autofill_assistant/browser/actions/external_action_unittest.cc b/components/autofill_assistant/browser/actions/external_action_unittest.cc index ac8be3fd..90dbea5 100644 --- a/components/autofill_assistant/browser/actions/external_action_unittest.cc +++ b/components/autofill_assistant/browser/actions/external_action_unittest.cc
@@ -55,8 +55,8 @@ testing::TestResultExtension test_extension_proto; test_extension_proto.set_text("test text"); - *result.mutable_result_info()->MutableExtension( - testing::test_result_extension) = std::move(test_extension_proto); + test_extension_proto.SerializeToString( + result.mutable_result_info()->mutable_result_payload()); return result; } @@ -75,12 +75,17 @@ }); Run(); EXPECT_THAT(returned_processed_action_proto->status(), Eq(ACTION_APPLIED)); - EXPECT_TRUE(returned_processed_action_proto->has_external_action_result()); - EXPECT_THAT(returned_processed_action_proto->external_action_result() + ASSERT_TRUE(returned_processed_action_proto->external_action_result() .result_info() - .GetExtension(testing::test_result_extension) - .text(), - Eq("test text")); + .has_result_payload()); + testing::TestResultExtension test_extension_proto; + bool parse_success = test_extension_proto.ParseFromString( + returned_processed_action_proto->external_action_result() + .result_info() + .result_payload()); + EXPECT_TRUE(parse_success); + + EXPECT_THAT(test_extension_proto.text(), Eq("test text")); } TEST_F(ExternalActionTest, ExternalFailure) { @@ -99,11 +104,17 @@ EXPECT_THAT(returned_processed_action_proto->status(), Eq(UNKNOWN_ACTION_STATUS)); EXPECT_TRUE(returned_processed_action_proto->has_external_action_result()); - EXPECT_THAT(returned_processed_action_proto->external_action_result() + ASSERT_TRUE(returned_processed_action_proto->external_action_result() .result_info() - .GetExtension(testing::test_result_extension) - .text(), - Eq("test text")); + .has_result_payload()); + testing::TestResultExtension test_extension_proto; + bool parse_success = test_extension_proto.ParseFromString( + returned_processed_action_proto->external_action_result() + .result_info() + .result_payload()); + EXPECT_TRUE(parse_success); + + EXPECT_THAT(test_extension_proto.text(), Eq("test text")); } TEST_F(ExternalActionTest, FailsIfProtoExtensionInfoNotSet) {
diff --git a/components/autofill_assistant/browser/autofill_assistant_impl.cc b/components/autofill_assistant/browser/autofill_assistant_impl.cc index f4cd369..b3760226 100644 --- a/components/autofill_assistant/browser/autofill_assistant_impl.cc +++ b/components/autofill_assistant/browser/autofill_assistant_impl.cc
@@ -9,7 +9,7 @@ #include "components/autofill_assistant/browser/common_dependencies.h" #include "components/autofill_assistant/browser/desktop/starter_delegate_desktop.h" -#include "components/autofill_assistant/browser/headless/external_script_controller_impl.h" +#include "components/autofill_assistant/browser/headless/headless_script_controller_impl.h" #include "components/autofill_assistant/browser/protocol_utils.h" #include "components/autofill_assistant/browser/service.pb.h" #include "components/autofill_assistant/browser/service/api_key_fetcher.h" @@ -134,11 +134,11 @@ RpcType::GET_CAPABILITIES_BY_HASH_PREFIX); } -std::unique_ptr<ExternalScriptController> -AutofillAssistantImpl::CreateExternalScriptController( +std::unique_ptr<HeadlessScriptController> +AutofillAssistantImpl::CreateHeadlessScriptController( content::WebContents* web_contents, ExternalActionDelegate* action_extension_delegate) { - return std::make_unique<ExternalScriptControllerImpl>( + return std::make_unique<HeadlessScriptControllerImpl>( web_contents, action_extension_delegate); }
diff --git a/components/autofill_assistant/browser/autofill_assistant_impl.h b/components/autofill_assistant/browser/autofill_assistant_impl.h index 1d12585b..e1fc0fb 100644 --- a/components/autofill_assistant/browser/autofill_assistant_impl.h +++ b/components/autofill_assistant/browser/autofill_assistant_impl.h
@@ -10,7 +10,7 @@ #include "base/memory/raw_ptr.h" #include "components/autofill_assistant/browser/public/autofill_assistant.h" -#include "components/autofill_assistant/browser/public/external_script_controller.h" +#include "components/autofill_assistant/browser/public/headless_script_controller.h" #include "components/autofill_assistant/browser/service/service_request_sender.h" namespace content { @@ -43,7 +43,7 @@ const std::string& intent, GetCapabilitiesResponseCallback callback) override; - std::unique_ptr<ExternalScriptController> CreateExternalScriptController( + std::unique_ptr<HeadlessScriptController> CreateHeadlessScriptController( content::WebContents* web_contents, ExternalActionDelegate* action_extension_delegate) override;
diff --git a/components/autofill_assistant/browser/fake_common_dependencies.cc b/components/autofill_assistant/browser/fake_common_dependencies.cc new file mode 100644 index 0000000..28cf7fd --- /dev/null +++ b/components/autofill_assistant/browser/fake_common_dependencies.cc
@@ -0,0 +1,65 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill_assistant/browser/fake_common_dependencies.h" + +namespace autofill_assistant { + +FakeCommonDependencies::FakeCommonDependencies() = default; +FakeCommonDependencies::~FakeCommonDependencies() = default; + +std::unique_ptr<AssistantFieldTrialUtil> +FakeCommonDependencies::CreateFieldTrialUtil() const { + return nullptr; +} + +std::string FakeCommonDependencies::GetLocale() const { + return locale_; +} + +std::string FakeCommonDependencies::GetCountryCode() const { + return country_code_; +} + +autofill::PersonalDataManager* FakeCommonDependencies::GetPersonalDataManager( + content::BrowserContext* browser_context) const { + return nullptr; +} + +password_manager::PasswordManagerClient* +FakeCommonDependencies::GetPasswordManagerClient( + content::WebContents* web_contents) const { + return nullptr; +} + +std::string FakeCommonDependencies::GetSignedInEmail( + content::BrowserContext* browser_context) const { + return signed_in_email_; +} + +bool FakeCommonDependencies::IsSupervisedUser( + content::BrowserContext* browser_context) const { + return is_supervised_user_; +} + +AnnotateDomModelService* +FakeCommonDependencies::GetOrCreateAnnotateDomModelService( + content::BrowserContext* browser_context) const { + return nullptr; +} + +bool FakeCommonDependencies::IsWebLayer() const { + return is_weblayer_; +} + +signin::IdentityManager* FakeCommonDependencies::GetIdentityManager( + content::BrowserContext* browser_context) const { + return nullptr; +} + +version_info::Channel FakeCommonDependencies::GetChannel() const { + return channel_; +} + +} // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/fake_common_dependencies.h b/components/autofill_assistant/browser/fake_common_dependencies.h new file mode 100644 index 0000000..5723145 --- /dev/null +++ b/components/autofill_assistant/browser/fake_common_dependencies.h
@@ -0,0 +1,49 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_FAKE_COMMON_DEPENDENCIES_H_ +#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_FAKE_COMMON_DEPENDENCIES_H_ + +#include "components/autofill_assistant/browser/common_dependencies.h" +#include "components/version_info/channel.h" + +namespace autofill_assistant { + +class FakeCommonDependencies : public CommonDependencies { + public: + FakeCommonDependencies(); + ~FakeCommonDependencies() override; + + // From CommonDependencies: + std::unique_ptr<AssistantFieldTrialUtil> CreateFieldTrialUtil() + const override; + std::string GetLocale() const override; + std::string GetCountryCode() const override; + autofill::PersonalDataManager* GetPersonalDataManager( + content::BrowserContext* browser_context) const override; + password_manager::PasswordManagerClient* GetPasswordManagerClient( + content::WebContents* web_contents) const override; + std::string GetSignedInEmail( + content::BrowserContext* browser_context) const override; + bool IsSupervisedUser( + content::BrowserContext* browser_context) const override; + AnnotateDomModelService* GetOrCreateAnnotateDomModelService( + content::BrowserContext* browser_context) const override; + bool IsWebLayer() const override; + signin::IdentityManager* GetIdentityManager( + content::BrowserContext* browser_context) const override; + version_info::Channel GetChannel() const override; + + // Intentionally public to allow tests direct access. + std::string locale_; + std::string country_code_; + std::string signed_in_email_; + bool is_supervised_user_ = false; + bool is_weblayer_ = false; + version_info::Channel channel_ = version_info::Channel::UNKNOWN; +}; + +} // namespace autofill_assistant + +#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_FAKE_COMMON_DEPENDENCIES_H_
diff --git a/components/autofill_assistant/browser/fake_starter_platform_delegate.cc b/components/autofill_assistant/browser/fake_starter_platform_delegate.cc index 28b9938..51952b0e 100644 --- a/components/autofill_assistant/browser/fake_starter_platform_delegate.cc +++ b/components/autofill_assistant/browser/fake_starter_platform_delegate.cc
@@ -135,9 +135,9 @@ return is_attached_; } -const CommonDependencies* FakeStarterPlatformDelegate::GetCommonDependencies() - const { - return nullptr; +const FakeCommonDependencies* +FakeStarterPlatformDelegate::GetCommonDependencies() const { + return &fake_common_dependencies_; } const PlatformDependencies*
diff --git a/components/autofill_assistant/browser/fake_starter_platform_delegate.h b/components/autofill_assistant/browser/fake_starter_platform_delegate.h index 70884dd..da7ea21 100644 --- a/components/autofill_assistant/browser/fake_starter_platform_delegate.h +++ b/components/autofill_assistant/browser/fake_starter_platform_delegate.h
@@ -8,6 +8,7 @@ #include <memory> #include "base/callback.h" #include "base/memory/raw_ptr.h" +#include "components/autofill_assistant/browser/fake_common_dependencies.h" #include "components/autofill_assistant/browser/starter_platform_delegate.h" #include "testing/gmock/include/gmock/gmock.h" @@ -56,11 +57,12 @@ bool GetIsTabCreatedByGSA() const override; std::unique_ptr<AssistantFieldTrialUtil> CreateFieldTrialUtil() override; bool IsAttached() override; - const CommonDependencies* GetCommonDependencies() const override; + const FakeCommonDependencies* GetCommonDependencies() const override; const PlatformDependencies* GetPlatformDependencies() const override; base::WeakPtr<StarterPlatformDelegate> GetWeakPtr() override; // Intentionally public to give tests direct access. + FakeCommonDependencies fake_common_dependencies_; std::unique_ptr<TriggerScriptCoordinator::UiDelegate> trigger_script_ui_delegate_; std::unique_ptr<ServiceRequestSender> trigger_script_request_sender_for_test_;
diff --git a/components/autofill_assistant/browser/headless/client_headless.cc b/components/autofill_assistant/browser/headless/client_headless.cc index 62e79f66..b4e8e59 100644 --- a/components/autofill_assistant/browser/headless/client_headless.cc +++ b/components/autofill_assistant/browser/headless/client_headless.cc
@@ -18,7 +18,7 @@ #include "components/autofill_assistant/browser/display_strings_util.h" #include "components/autofill_assistant/browser/empty_website_login_manager_impl.h" #include "components/autofill_assistant/browser/features.h" -#include "components/autofill_assistant/browser/headless/external_script_controller_impl.h" +#include "components/autofill_assistant/browser/headless/headless_script_controller_impl.h" #include "components/autofill_assistant/browser/public/ui_state.h" #include "components/autofill_assistant/browser/service/access_token_fetcher.h" #include "components/autofill_assistant/browser/switches.h" @@ -45,7 +45,7 @@ content::WebContents* web_contents, const CommonDependencies* common_dependencies, ExternalActionDelegate* action_extension_delegate, - ExternalScriptControllerImpl* external_script_controller) + HeadlessScriptControllerImpl* external_script_controller) : web_contents_(web_contents), common_dependencies_(common_dependencies), external_script_controller_(external_script_controller) {
diff --git a/components/autofill_assistant/browser/headless/client_headless.h b/components/autofill_assistant/browser/headless/client_headless.h index a29e0534..8f69434 100644 --- a/components/autofill_assistant/browser/headless/client_headless.h +++ b/components/autofill_assistant/browser/headless/client_headless.h
@@ -27,7 +27,7 @@ namespace autofill_assistant { -class ExternalScriptControllerImpl; +class HeadlessScriptControllerImpl; // An Autofill Assistant client for headless runs. class ClientHeadless : public Client, public AccessTokenFetcher { @@ -36,7 +36,7 @@ content::WebContents* web_contents, const CommonDependencies* common_dependencies, ExternalActionDelegate* action_extension_delegate, - ExternalScriptControllerImpl* external_script_controller); + HeadlessScriptControllerImpl* external_script_controller); ClientHeadless(const ClientHeadless&) = delete; ClientHeadless& operator=(const ClientHeadless&) = delete; @@ -98,7 +98,7 @@ std::unique_ptr<signin::AccessTokenFetcher> access_token_fetcher_; base::OnceCallback<void(bool, const std::string&)> fetch_access_token_callback_; - const raw_ptr<ExternalScriptControllerImpl> external_script_controller_; + const raw_ptr<HeadlessScriptControllerImpl> external_script_controller_; base::WeakPtrFactory<ClientHeadless> weak_ptr_factory_{this}; };
diff --git a/components/autofill_assistant/browser/headless/external_script_controller_impl.cc b/components/autofill_assistant/browser/headless/headless_script_controller_impl.cc similarity index 84% rename from components/autofill_assistant/browser/headless/external_script_controller_impl.cc rename to components/autofill_assistant/browser/headless/headless_script_controller_impl.cc index 41ee8924..c0704c9 100644 --- a/components/autofill_assistant/browser/headless/external_script_controller_impl.cc +++ b/components/autofill_assistant/browser/headless/headless_script_controller_impl.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/autofill_assistant/browser/headless/external_script_controller_impl.h" +#include "components/autofill_assistant/browser/headless/headless_script_controller_impl.h" #include "base/time/default_tick_clock.h" #include "components/autofill_assistant/browser/desktop/starter_delegate_desktop.h" @@ -10,7 +10,7 @@ namespace autofill_assistant { -ExternalScriptControllerImpl::ExternalScriptControllerImpl( +HeadlessScriptControllerImpl::HeadlessScriptControllerImpl( content::WebContents* web_contents, ExternalActionDelegate* action_extension_delegate) : web_contents_(web_contents) { @@ -24,12 +24,12 @@ } } -ExternalScriptControllerImpl::~ExternalScriptControllerImpl() = default; +HeadlessScriptControllerImpl::~HeadlessScriptControllerImpl() = default; -void ExternalScriptControllerImpl::StartScript( +void HeadlessScriptControllerImpl::StartScript( const base::flat_map<std::string, std::string>& script_parameters, base::OnceCallback<void(ScriptResult)> script_ended_callback) { - // This ExternalScriptController is currently executing a script, so we return + // This HeadlessScriptController is currently executing a script, so we return // an error. if (script_ended_callback_) { std::move(script_ended_callback).Run({false}); @@ -56,11 +56,11 @@ /* is_externally_triggered = */ true); starter->CanStart( std::move(trigger_context), - base::BindOnce(&ExternalScriptControllerImpl::OnReadyToStart, + base::BindOnce(&HeadlessScriptControllerImpl::OnReadyToStart, weak_ptr_factory_.GetWeakPtr())); } -void ExternalScriptControllerImpl::OnReadyToStart( +void HeadlessScriptControllerImpl::OnReadyToStart( bool can_start, absl::optional<GURL> url, std::unique_ptr<TriggerContext> trigger_context) { @@ -73,7 +73,7 @@ client_->Start(*url, std::move(trigger_context)); } -void ExternalScriptControllerImpl::NotifyScriptEnded( +void HeadlessScriptControllerImpl::NotifyScriptEnded( Metrics::DropOutReason reason) { std::move(script_ended_callback_) .Run({reason == Metrics::DropOutReason::SCRIPT_SHUTDOWN});
diff --git a/components/autofill_assistant/browser/headless/external_script_controller_impl.h b/components/autofill_assistant/browser/headless/headless_script_controller_impl.h similarity index 75% rename from components/autofill_assistant/browser/headless/external_script_controller_impl.h rename to components/autofill_assistant/browser/headless/headless_script_controller_impl.h index 88ae49bab9..962c894 100644 --- a/components/autofill_assistant/browser/headless/external_script_controller_impl.h +++ b/components/autofill_assistant/browser/headless/headless_script_controller_impl.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_HEADLESS_EXTERNAL_SCRIPT_CONTROLLER_IMPL_H_ -#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_HEADLESS_EXTERNAL_SCRIPT_CONTROLLER_IMPL_H_ +#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_HEADLESS_HEADLESS_SCRIPT_CONTROLLER_IMPL_H_ +#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_HEADLESS_HEADLESS_SCRIPT_CONTROLLER_IMPL_H_ #include <memory> #include <string> @@ -21,19 +21,19 @@ namespace autofill_assistant { -class ExternalScriptControllerImpl : public ExternalScriptController { +class HeadlessScriptControllerImpl : public HeadlessScriptController { public: - ExternalScriptControllerImpl( + HeadlessScriptControllerImpl( content::WebContents* web_contents, ExternalActionDelegate* action_extension_delegate); - ExternalScriptControllerImpl(const ExternalScriptControllerImpl&) = delete; - ExternalScriptControllerImpl& operator=(const ExternalScriptControllerImpl&) = + HeadlessScriptControllerImpl(const HeadlessScriptControllerImpl&) = delete; + HeadlessScriptControllerImpl& operator=(const HeadlessScriptControllerImpl&) = delete; - ~ExternalScriptControllerImpl() override; + ~HeadlessScriptControllerImpl() override; - // Overrides ExternalScriptController. + // Overrides HeadlessScriptController. void StartScript( const base::flat_map<std::string, std::string>& script_parameters, base::OnceCallback<void(ScriptResult)> script_ended_callback) override; @@ -52,9 +52,9 @@ base::OnceCallback<void(ScriptResult)> script_ended_callback_; - base::WeakPtrFactory<ExternalScriptControllerImpl> weak_ptr_factory_{this}; + base::WeakPtrFactory<HeadlessScriptControllerImpl> weak_ptr_factory_{this}; }; } // namespace autofill_assistant -#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_HEADLESS_EXTERNAL_SCRIPT_CONTROLLER_IMPL_H_ +#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_HEADLESS_HEADLESS_SCRIPT_CONTROLLER_IMPL_H_
diff --git a/components/autofill_assistant/browser/public/BUILD.gn b/components/autofill_assistant/browser/public/BUILD.gn index d19f754..5dd07d4b 100644 --- a/components/autofill_assistant/browser/public/BUILD.gn +++ b/components/autofill_assistant/browser/public/BUILD.gn
@@ -14,7 +14,7 @@ "autofill_assistant.h", "autofill_assistant_factory.h", "external_action_delegate.h", - "external_script_controller.h", + "headless_script_controller.h", "runtime_manager.cc", "runtime_manager.h", "runtime_manager_impl.cc", @@ -49,8 +49,8 @@ sources = [ "mock_autofill_assistant.cc", "mock_autofill_assistant.h", - "mock_external_script_controller.cc", - "mock_external_script_controller.h", + "mock_headless_script_controller.cc", + "mock_headless_script_controller.h", "mock_runtime_manager.cc", "mock_runtime_manager.h", ]
diff --git a/components/autofill_assistant/browser/public/autofill_assistant.h b/components/autofill_assistant/browser/public/autofill_assistant.h index 2fd5cb10..2f8a893 100644 --- a/components/autofill_assistant/browser/public/autofill_assistant.h +++ b/components/autofill_assistant/browser/public/autofill_assistant.h
@@ -11,7 +11,7 @@ #include "base/callback_forward.h" #include "base/containers/flat_map.h" #include "components/autofill_assistant/browser/public/external_action_delegate.h" -#include "components/autofill_assistant/browser/public/external_script_controller.h" +#include "components/autofill_assistant/browser/public/headless_script_controller.h" namespace content { class WebContents; @@ -53,17 +53,17 @@ const std::string& intent, GetCapabilitiesResponseCallback callback) = 0; - // Returns an |ExternalScriptController| which can be used to execute scripts + // Returns an |HeadlessScriptController| which can be used to execute scripts // on the tab specified by |web_contents|, by calling - // |ExternalScriptController::StartScript|. - // The returned |ExternalScriptController| instance has to survive for the + // |HeadlessScriptController::StartScript|. + // The returned |HeadlessScriptController| instance has to survive for the // duration of the execution of the script. // |action_extension_delegate| can be nullptr, but in that case the script // execution will fail if it reaches an external action. If present, // |action_extension_delegate| instance must outlive the - // |ExternalScriptController|. - virtual std::unique_ptr<ExternalScriptController> - CreateExternalScriptController( + // |HeadlessScriptController|. + virtual std::unique_ptr<HeadlessScriptController> + CreateHeadlessScriptController( content::WebContents* web_contents, ExternalActionDelegate* action_extension_delegate) = 0;
diff --git a/components/autofill_assistant/browser/public/autofill_assistant_factory.h b/components/autofill_assistant/browser/public/autofill_assistant_factory.h index 1257facc..34a8afaf 100644 --- a/components/autofill_assistant/browser/public/autofill_assistant_factory.h +++ b/components/autofill_assistant/browser/public/autofill_assistant_factory.h
@@ -18,10 +18,10 @@ // Factory class for creating |AutofillAssistant|. class AutofillAssistantFactory { public: - // TODO(b/201964911) The |AutofillAssistant::CreateExternalScriptController| + // TODO(b/201964911) The |AutofillAssistant::CreateHeadlessScriptController| // method ignores the |channel|, |country_code| and |locale| passed here and // instead fetches them directly. Make the treatment between - // |ExternalScriptController| and |GetCapabilitiesByHashPrefix| consistent. + // |HeadlessScriptController| and |GetCapabilitiesByHashPrefix| consistent. static std::unique_ptr<AutofillAssistant> CreateForBrowserContext( content::BrowserContext* browser_context, std::unique_ptr<CommonDependencies> dependencies);
diff --git a/components/autofill_assistant/browser/public/external_action.proto b/components/autofill_assistant/browser/public/external_action.proto index 595f218..571261c 100644 --- a/components/autofill_assistant/browser/public/external_action.proto +++ b/components/autofill_assistant/browser/public/external_action.proto
@@ -18,6 +18,8 @@ // Extended by the integrator. message ActionInfo { + optional bytes action_payload = 1; + extensions 100 to max; } @@ -33,6 +35,8 @@ // Extended by the integrator. message ResultInfo { + optional bytes result_payload = 1; + extensions 100 to max; }
diff --git a/components/autofill_assistant/browser/public/external_script_controller.h b/components/autofill_assistant/browser/public/external_script_controller.h deleted file mode 100644 index 44dad58..0000000 --- a/components/autofill_assistant/browser/public/external_script_controller.h +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_EXTERNAL_SCRIPT_CONTROLLER_H_ -#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_EXTERNAL_SCRIPT_CONTROLLER_H_ - -#include <string> - -#include "base/callback_forward.h" -#include "base/containers/flat_map.h" - -namespace autofill_assistant { - -// Allows to execute AutofillAssistant scripts. -class ExternalScriptController { - public: - struct ScriptResult { - // TODO(b/209429727): use canonical status codes instead. - bool success = false; - }; - - // Fetches and executes the script specified by |script_parameters|. - // At most one script can be executed at the same time, if a script is already - // being executed at the time of this call it will return an error. - // If this instance of |ExternalScriptController| is destroyed the script - // execution will be interrupted. - virtual void StartScript( - const base::flat_map<std::string, std::string>& script_parameters, - base::OnceCallback<void(ScriptResult)> script_ended_callback) = 0; - - virtual ~ExternalScriptController() = default; -}; - -} // namespace autofill_assistant - -#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_EXTERNAL_SCRIPT_CONTROLLER_H_
diff --git a/components/autofill_assistant/browser/public/headless_script_controller.h b/components/autofill_assistant/browser/public/headless_script_controller.h new file mode 100644 index 0000000..1da6daa --- /dev/null +++ b/components/autofill_assistant/browser/public/headless_script_controller.h
@@ -0,0 +1,38 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_HEADLESS_SCRIPT_CONTROLLER_H_ +#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_HEADLESS_SCRIPT_CONTROLLER_H_ + +#include "base/memory/weak_ptr.h" +#include "components/autofill_assistant/browser/public/external_action.pb.h" +#include "components/autofill_assistant/browser/public/runtime_observer.h" +#include "components/autofill_assistant/browser/public/ui_state.h" +#include "content/public/browser/web_contents.h" + +namespace autofill_assistant { + +// Allows to execute AutofillAssistant scripts. +class HeadlessScriptController { + public: + struct ScriptResult { + // TODO(b/209429727): use canonical status codes instead. + bool success = false; + }; + + // Fetches and executes the script specified by |script_parameters|. + // At most one script can be executed at the same time, if a script is already + // being executed at the time of this call it will return an error. + // If this instance of |HeadlessScriptController| is destroyed the script + // execution will be interrupted. + virtual void StartScript( + const base::flat_map<std::string, std::string>& script_parameters, + base::OnceCallback<void(ScriptResult)> script_ended_callback) = 0; + + virtual ~HeadlessScriptController() = default; +}; + +} // namespace autofill_assistant + +#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_HEADLESS_SCRIPT_CONTROLLER_H_
diff --git a/components/autofill_assistant/browser/public/mock_autofill_assistant.h b/components/autofill_assistant/browser/public/mock_autofill_assistant.h index e24ad579..d03c64af 100644 --- a/components/autofill_assistant/browser/public/mock_autofill_assistant.h +++ b/components/autofill_assistant/browser/public/mock_autofill_assistant.h
@@ -23,8 +23,8 @@ const std::string& intent, GetCapabilitiesResponseCallback callback), (override)); - MOCK_METHOD(std::unique_ptr<ExternalScriptController>, - CreateExternalScriptController, + MOCK_METHOD(std::unique_ptr<HeadlessScriptController>, + CreateHeadlessScriptController, (content::WebContents * web_contents, ExternalActionDelegate* action_extension_delegate), (override));
diff --git a/components/autofill_assistant/browser/public/mock_external_script_controller.cc b/components/autofill_assistant/browser/public/mock_external_script_controller.cc deleted file mode 100644 index b4f88b3..0000000 --- a/components/autofill_assistant/browser/public/mock_external_script_controller.cc +++ /dev/null
@@ -1,13 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/autofill_assistant/browser/public/mock_external_script_controller.h" - -namespace autofill_assistant { - -MockExternalScriptController::MockExternalScriptController() = default; - -MockExternalScriptController::~MockExternalScriptController() = default; - -} // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/public/mock_external_script_controller.h b/components/autofill_assistant/browser/public/mock_external_script_controller.h deleted file mode 100644 index 00e1680..0000000 --- a/components/autofill_assistant/browser/public/mock_external_script_controller.h +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_MOCK_EXTERNAL_SCRIPT_CONTROLLER_H_ -#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_MOCK_EXTERNAL_SCRIPT_CONTROLLER_H_ - -#include "base/callback_helpers.h" -#include "components/autofill_assistant/browser/public/external_script_controller.h" -#include "testing/gmock/include/gmock/gmock.h" - -namespace autofill_assistant { - -class MockExternalScriptController : public ExternalScriptController { - public: - MockExternalScriptController(); - ~MockExternalScriptController() override; - - MOCK_METHOD(void, - StartScript, - ((const base::flat_map<std::string, std::string>&), - (base::OnceCallback<void(ScriptResult)>)), - (override)); -}; - -} // namespace autofill_assistant - -#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_MOCK_EXTERNAL_SCRIPT_CONTROLLER_H_
diff --git a/components/autofill_assistant/browser/public/mock_headless_script_controller.cc b/components/autofill_assistant/browser/public/mock_headless_script_controller.cc new file mode 100644 index 0000000..b91ddbc --- /dev/null +++ b/components/autofill_assistant/browser/public/mock_headless_script_controller.cc
@@ -0,0 +1,13 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill_assistant/browser/public/mock_headless_script_controller.h" + +namespace autofill_assistant { + +MockHeadlessScriptController::MockHeadlessScriptController() = default; + +MockHeadlessScriptController::~MockHeadlessScriptController() = default; + +} // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/public/mock_headless_script_controller.h b/components/autofill_assistant/browser/public/mock_headless_script_controller.h new file mode 100644 index 0000000..59355f3 --- /dev/null +++ b/components/autofill_assistant/browser/public/mock_headless_script_controller.h
@@ -0,0 +1,28 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_MOCK_HEADLESS_SCRIPT_CONTROLLER_H_ +#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_MOCK_HEADLESS_SCRIPT_CONTROLLER_H_ + +#include "base/callback_helpers.h" +#include "components/autofill_assistant/browser/public/headless_script_controller.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace autofill_assistant { + +class MockHeadlessScriptController : public HeadlessScriptController { + public: + MockHeadlessScriptController(); + ~MockHeadlessScriptController() override; + + MOCK_METHOD(void, + StartScript, + ((const base::flat_map<std::string, std::string>&), + (base::OnceCallback<void(ScriptResult)>)), + (override)); +}; + +} // namespace autofill_assistant + +#endif // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_MOCK_HEADLESS_SCRIPT_CONTROLLER_H_
diff --git a/components/autofill_assistant/browser/script_executor_ui_delegate.h b/components/autofill_assistant/browser/script_executor_ui_delegate.h index cd927d8..d9ff269 100644 --- a/components/autofill_assistant/browser/script_executor_ui_delegate.h +++ b/components/autofill_assistant/browser/script_executor_ui_delegate.h
@@ -14,7 +14,7 @@ #include "components/autofill_assistant/browser/details.h" #include "components/autofill_assistant/browser/info_box.h" #include "components/autofill_assistant/browser/public/external_action_delegate.h" -#include "components/autofill_assistant/browser/public/external_script_controller.h" +#include "components/autofill_assistant/browser/public/headless_script_controller.h" #include "components/autofill_assistant/browser/state.h" #include "components/autofill_assistant/browser/tts_button_state.h" #include "components/autofill_assistant/browser/user_action.h"
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto index e75470a..04d75929 100644 --- a/components/autofill_assistant/browser/service.proto +++ b/components/autofill_assistant/browser/service.proto
@@ -3467,11 +3467,11 @@ optional string js_flow = 1; } -// Action which forwards a proto to the owner of the |ExternalScriptController| +// Action which forwards a proto to the owner of the |HeadlessScriptController| // for the current flow. Not supported for internal flows. message ExternalActionProto { // The opaque proto to be forwarded to the owner of the - // |ExternalScriptController| for this flow. + // |HeadlessScriptController| for this flow. optional external.ActionInfo info = 1; // Whether to show the touchable area in the overlay.
diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc index 2cc6ee3..3da4ade 100644 --- a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc +++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator.cc
@@ -70,6 +70,10 @@ version_info::GetProductNameAndVersionForUserAgent()); client_context.set_is_in_chrome_triggered( trigger_context_->GetInChromeTriggered()); + client_context.set_locale( + starter_delegate_->GetCommonDependencies()->GetLocale()); + client_context.set_country( + starter_delegate_->GetCommonDependencies()->GetCountryCode()); request_sender_->SendRequest( get_trigger_scripts_server_,
diff --git a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc index dab8c6f..db071dc 100644 --- a/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc +++ b/components/autofill_assistant/browser/trigger_scripts/trigger_script_coordinator_unittest.cc
@@ -13,6 +13,7 @@ #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "build/build_config.h" +#include "components/autofill_assistant/browser/fake_common_dependencies.h" #include "components/autofill_assistant/browser/fake_starter_platform_delegate.h" #include "components/autofill_assistant/browser/features.h" #include "components/autofill_assistant/browser/mock_website_login_manager.h" @@ -196,9 +197,13 @@ expected_client_context.mutable_chrome()->set_chrome_version( version_info::GetProductNameAndVersionForUserAgent()); expected_client_context.set_is_in_chrome_triggered(true); + expected_client_context.set_locale("fr-CH"); + expected_client_context.set_country("CH"); EXPECT_THAT(request.client_context(), Eq(expected_client_context)); }); + fake_platform_delegate_.fake_common_dependencies_.locale_.assign("fr-CH"); + fake_platform_delegate_.fake_common_dependencies_.country_code_.assign("CH"); coordinator_->Start(GURL(kFakeDeepLink), std::make_unique<TriggerContext>( /* params = */ std::make_unique<ScriptParameters>(
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 e33606f8..e327643 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
@@ -49,6 +49,7 @@ <translation id="2182457891543959921">Preguntar antes de permitir que los sitios creen un mapa 3D de tu entorno o hagan un seguimiento de la posición de la cámara (recomendado)</translation> <translation id="2212565012507486665">Permitir cookies</translation> <translation id="2228071138934252756">Para que <ph name="APP_NAME" /> pueda acceder a tu cámara, activa la cámara también en los <ph name="BEGIN_LINK" />ajustes de Android<ph name="END_LINK" />.</translation> +<translation id="2238944249568001759">Búsquedas sugeridas basadas en la última pestaña</translation> <translation id="2241634353105152135">Solo una vez</translation> <translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> Eliminar</translation> <translation id="2289270750774289114">Preguntar cuando un sitio web quiera buscar dispositivos Bluetooth cercanos (recomendado)</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 e8443a2..49f9a27 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
@@ -49,6 +49,7 @@ <translation id="2182457891543959921">Magtanong bago payagan ang mga site na gumawa ng 3D na mapa ng iyong kapaligiran o subaybayan ang posisyon ng camera (inirerekomenda)</translation> <translation id="2212565012507486665">Payagan ang cookies</translation> <translation id="2228071138934252756">Para payagan ang <ph name="APP_NAME" /> na i-access ang iyong camera, i-on din ang camera sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation> +<translation id="2238944249568001759">Mga iminumungkahing paghahanap batay sa iyong huling tab</translation> <translation id="2241634353105152135">Isang beses lang</translation> <translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> Alisin</translation> <translation id="2289270750774289114">Magtanong kapag gusto ng isang site na tumuklas ng mga Bluetooth device na nasa malapit (inirerekomenda)</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 32240b5..280c6b8 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
@@ -49,6 +49,7 @@ <translation id="2182457891543959921">Chiedi conferma prima di consentire ai siti di creare una mappa 3D dell'ambiente circostante o di monitorare la posizione della fotocamera (opzione consigliata)</translation> <translation id="2212565012507486665">Consenti cookie</translation> <translation id="2228071138934252756">Per consentire all'app <ph name="APP_NAME" /> di accedere alla fotocamera, attiva la fotocamera anche nelle <ph name="BEGIN_LINK" />Impostazioni Android<ph name="END_LINK" />.</translation> +<translation id="2238944249568001759">Ricerche suggerite in base all'ultima scheda</translation> <translation id="2241634353105152135">Solo una volta</translation> <translation id="2253414712144136228">Rimuovi <ph name="NAME_OF_LIST_ITEM" /></translation> <translation id="2289270750774289114">Chiedi conferma quando un sito vuole rilevare i dispositivi Bluetooth nelle vicinanze (opzione consigliata)</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 3cb83c7..d536cbae6 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
@@ -49,6 +49,7 @@ <translation id="2182457891543959921">შეკითხვა საიტებისთვის თქვენი გარემოს 3-განზომილებიანი რუკის შექმნის ან კამერის პოზიციისთვის თვალის მიდევნების დაშვებამდე (რეკომენდებული)</translation> <translation id="2212565012507486665">ქუქი-ჩანაწერების დაშვება</translation> <translation id="2228071138934252756"><ph name="APP_NAME" />-მა კამერით რომ ისარგებლოს, გაააქტიურეთ კამერაზე წვდომის ნებართვაც <ph name="BEGIN_LINK" />Android-ის პარამეტრებიდან<ph name="END_LINK" />.</translation> +<translation id="2238944249568001759">თქვენი ბოლო ჩანართის მიხედვით შემოთავაზებული ძიებები</translation> <translation id="2241634353105152135">მხოლოდ ერთხელ</translation> <translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> — ამოშლა</translation> <translation id="2289270750774289114">საიტების მიერ ახლომდებარე Bluetooth მოწყობილობების აღმოჩენის მოთხოვნა (რეკომენდებული)</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 9986dd9..947ff65 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
@@ -49,6 +49,7 @@ <translation id="2182457891543959921">ನಿಮ್ಮ ಸುತ್ತಮುತ್ತಲಿನ 3D ನಕ್ಷೆಗಳನ್ನು ರಚಿಸಲು ಅಥವಾ ಕ್ಯಾಮರಾ ಸ್ಥಿತಿಯನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲು ಸೈಟ್ಗೆ ಅನುಮತಿಸುವ ಮೊದಲು ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿರುವುದು)</translation> <translation id="2212565012507486665">ಕುಕೀಗಳನ್ನು ಅನುಮತಿಸಿ</translation> <translation id="2228071138934252756"><ph name="APP_NAME" /> ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಪ್ರವೇಶಿಸುವುದಕ್ಕೆ ಅನುಮತಿಸಲು, <ph name="BEGIN_LINK" />Android ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ<ph name="END_LINK" /> ಕ್ಯಾಮರಾವನ್ನು ಸಹ ಆನ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.</translation> +<translation id="2238944249568001759">ನಿಮ್ಮ ಹಿಂದಿನ ಟ್ಯಾಬ್ ಅನ್ನು ಆಧರಿಸಿ ಸೂಚಿಸಲಾದ ಹುಡುಕಾಟಗಳು</translation> <translation id="2241634353105152135">ಕೇವಲ ಒಂದು ಬಾರಿ</translation> <translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> ಅನ್ನು ತೆಗೆದುಹಾಕಿ</translation> <translation id="2289270750774289114">ಸೈಟ್ ಯಾವಾಗ ಸಮೀಪದ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ಅನ್ವೇಷಿಸಲು ಬಯಸುತ್ತದೆಯೋ ಆಗ ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</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 a6338da..bc3faf8 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
@@ -49,6 +49,7 @@ <translation id="2182457891543959921">Сайтуудад таны эргэн тойрны 3D газрын зургийг үүсгэх эсвэл камерын хөдөлгөөнийг хянахыг зөвшөөрөхийн өмнө асуух (санал болгосон)</translation> <translation id="2212565012507486665">Күүкиг зөвшөөрөх</translation> <translation id="2228071138934252756"><ph name="APP_NAME" />-д камертаа хандахыг зөвшөөрөхийн тулд камерыг мөн <ph name="BEGIN_LINK" />Андройдын тохиргоо<ph name="END_LINK" />-нд асаана уу.</translation> +<translation id="2238944249568001759">Таны сүүлийн табд тулгуурласан санал болгосон хайлтууд</translation> <translation id="2241634353105152135">Ганц удаа</translation> <translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" />-г хасах</translation> <translation id="2289270750774289114">Сайт ойролцоох Bluetooth төхөөрөмжийг илрүүлэх хүсэлтэй үед асуух (санал болгосон)</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 fdf4c286..60b11fd9 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
@@ -49,6 +49,7 @@ <translation id="2182457891543959921">သင့်ပတ်ဝန်းကျင်၏ 3D မြေပုံဆွဲခြင်း သို့မဟုတ် ကင်မရာအနေအထား ခြေရာခံခြင်းတို့အတွက် ဝဘ်ဆိုက်များကို ခွင့်မပြုမီ မေးမြန်းရန် (အကြံပြုထားသည်)</translation> <translation id="2212565012507486665">ကွတ်ကီးများ ခွင့်ပြုရန်</translation> <translation id="2228071138934252756"><ph name="APP_NAME" /> က သင့်ကင်မရာကို သုံးနိုင်ရန် <ph name="BEGIN_LINK" />Android ဆက်တင်များ<ph name="END_LINK" /> တွင်လည်း ကင်မရာကို ဖွင့်ပါ။</translation> +<translation id="2238944249568001759">သင့်နောက်ဆုံးတဘ်ကို အခြေခံ၍ အကြံပြုထားသောရှာဖွေမှုများ</translation> <translation id="2241634353105152135">တစ်ကြိမ်သာ</translation> <translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> ဖယ်ရှားရန်</translation> <translation id="2289270750774289114">ဝဘ်ဆိုက်က အနီးအနားရှိ ဘလူးတုသ်ကိရိယာများ ရှာဖွေလိုသည့်အခါ ခွင့်တောင်းရန် (အကြံပြုထားသည်)</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 a5d98b0..36fea434 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
@@ -49,6 +49,7 @@ <translation id="2182457891543959921">Vragen voordat sites een 3D-kaart van je omgeving mogen maken of de camerapositie mogen volgen (aanbevolen)</translation> <translation id="2212565012507486665">Cookies toestaan</translation> <translation id="2228071138934252756">Als je <ph name="APP_NAME" /> toegang wilt geven tot je camera, moet je de camera ook aanzetten via de <ph name="BEGIN_LINK" />Android-instellingen<ph name="END_LINK" />.</translation> +<translation id="2238944249568001759">Voorgestelde zoekopdrachten op basis van je laatste tabblad</translation> <translation id="2241634353105152135">Slechts één keer</translation> <translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> verwijderen</translation> <translation id="2289270750774289114">Vragen wanneer een site Bluetooth-apparaten in de buurt wilt detecteren (aanbevolen)</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 5b3060d..59fbbbd 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
@@ -49,6 +49,7 @@ <translation id="2182457891543959921">Spør før nettsteder får lage 3D-kart av omgivelsene dine eller spore kameraposisjonen (anbefales)</translation> <translation id="2212565012507486665">Tillat informasjonskapsler</translation> <translation id="2228071138934252756">For å gi <ph name="APP_NAME" /> tilgang til kameraet må du også slå på kameraet i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation> +<translation id="2238944249568001759">Foreslåtte søk basert på den siste fanen din</translation> <translation id="2241634353105152135">Bare én gang</translation> <translation id="2253414712144136228">Fjern <ph name="NAME_OF_LIST_ITEM" /></translation> <translation id="2289270750774289114">Spør når nettsteder vil oppdage Bluetooth-enheter i nærheten (anbefales)</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 85229a9..b7220fe 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
@@ -49,6 +49,7 @@ <translation id="2182457891543959921">سائٹس کو اپنے اطراف کا 3D نقشہ تخلیق یا کیمرے کی پوزیشن ٹریک کرنے کی اجازت دینے سے پہلے پوچھیں (تجویز کردہ)</translation> <translation id="2212565012507486665">کوکیز کی اجازت دیں</translation> <translation id="2228071138934252756"><ph name="APP_NAME" /> کو اپنے کیمرے تک رسائی دینے کے لیے، <ph name="BEGIN_LINK" />Android کی ترتیبات<ph name="END_LINK" /> میں بھی کیمرا آن کریں۔</translation> +<translation id="2238944249568001759">آپ کے آخری ٹیب کی بنیاد پر تجویز کردہ تلاشیں</translation> <translation id="2241634353105152135">بس ایک بار</translation> <translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> ہٹائیں</translation> <translation id="2289270750774289114">اس وقت پوچھیں جب کسی سائٹ میں قریبی بلوٹوتھ آلات کو دریافت کرنا مقصود ہو (تجویز کردہ)</translation>
diff --git a/components/gcm_driver/fake_gcm_driver.cc b/components/gcm_driver/fake_gcm_driver.cc index 81f6318a..dd1bc6a2 100644 --- a/components/gcm_driver/fake_gcm_driver.cc +++ b/components/gcm_driver/fake_gcm_driver.cc
@@ -14,8 +14,9 @@ FakeGCMDriver::FakeGCMDriver() : GCMDriver(base::FilePath(), nullptr) {} FakeGCMDriver::FakeGCMDriver( + const base::FilePath& store_path, const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner) - : GCMDriver(base::FilePath(), blocking_task_runner) {} + : GCMDriver(store_path, blocking_task_runner) {} FakeGCMDriver::~FakeGCMDriver() = default;
diff --git a/components/gcm_driver/fake_gcm_driver.h b/components/gcm_driver/fake_gcm_driver.h index 91c1701b..9f29deb0 100644 --- a/components/gcm_driver/fake_gcm_driver.h +++ b/components/gcm_driver/fake_gcm_driver.h
@@ -10,6 +10,7 @@ #include "components/gcm_driver/gcm_driver.h" namespace base { +class FilePath; class SequencedTaskRunner; } @@ -18,7 +19,8 @@ class FakeGCMDriver : public GCMDriver { public: FakeGCMDriver(); - explicit FakeGCMDriver( + FakeGCMDriver( + const base::FilePath& store_path, const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner); FakeGCMDriver(const FakeGCMDriver&) = delete;
diff --git a/components/gcm_driver/fake_gcm_profile_service.cc b/components/gcm_driver/fake_gcm_profile_service.cc index 5d9c035..2ba55db 100644 --- a/components/gcm_driver/fake_gcm_profile_service.cc +++ b/components/gcm_driver/fake_gcm_profile_service.cc
@@ -93,9 +93,7 @@ FakeGCMProfileService::CustomFakeGCMDriver::CustomFakeGCMDriver( FakeGCMProfileService* service) - : instance_id::FakeGCMDriverForInstanceID( - base::ThreadTaskRunnerHandle::Get()), - service_(service) {} + : service_(service) {} FakeGCMProfileService::CustomFakeGCMDriver::~CustomFakeGCMDriver() {}
diff --git a/components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.cc b/components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.cc index a33c49a..740c22c 100644 --- a/components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.cc +++ b/components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.cc
@@ -5,6 +5,7 @@ #include "components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h" #include "base/bind.h" +#include "base/files/file_path.h" #include "base/location.h" #include "base/rand_util.h" #include "base/strings/string_number_conversions.h" @@ -16,14 +17,15 @@ namespace instance_id { FakeGCMDriverForInstanceID::FakeGCMDriverForInstanceID() - : gcm::FakeGCMDriver(base::ThreadTaskRunnerHandle::Get()) {} + : gcm::FakeGCMDriver(base::FilePath(), + base::ThreadTaskRunnerHandle::Get()) {} FakeGCMDriverForInstanceID::FakeGCMDriverForInstanceID( + const base::FilePath& store_path, const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner) - : FakeGCMDriver(blocking_task_runner) {} + : FakeGCMDriver(store_path, blocking_task_runner) {} -FakeGCMDriverForInstanceID::~FakeGCMDriverForInstanceID() { -} +FakeGCMDriverForInstanceID::~FakeGCMDriverForInstanceID() = default; gcm::InstanceIDHandler* FakeGCMDriverForInstanceID::GetInstanceIDHandlerInternal() { @@ -68,7 +70,7 @@ if (iter != tokens_.end()) { token = iter->second; } else { - token = base::NumberToString(base::RandUint64()); + token = GenerateTokenImpl(app_id, authorized_entity, scope); tokens_[key] = token; } @@ -118,4 +120,11 @@ FROM_HERE, base::BindOnce(std::move(callback), gcm::GCMClient::SUCCESS)); } +std::string FakeGCMDriverForInstanceID::GenerateTokenImpl( + const std::string& app_id, + const std::string& authorized_entity, + const std::string& scope) { + return base::NumberToString(base::RandUint64()); +} + } // namespace instance_id
diff --git a/components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h b/components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h index 2f133802..31110cc 100644 --- a/components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h +++ b/components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h
@@ -13,6 +13,7 @@ #include "components/gcm_driver/fake_gcm_driver.h" namespace base { +class FilePath; class SequencedTaskRunner; } @@ -23,6 +24,7 @@ public: FakeGCMDriverForInstanceID(); explicit FakeGCMDriverForInstanceID( + const base::FilePath& store_path, const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner); FakeGCMDriverForInstanceID(const FakeGCMDriverForInstanceID&) = delete; @@ -67,6 +69,10 @@ void GetInstanceIDData(const std::string& app_id, GetInstanceIDDataCallback callback) override; + virtual std::string GenerateTokenImpl(const std::string& app_id, + const std::string& authorized_entity, + const std::string& scope); + private: std::map<std::string, std::pair<std::string, std::string>> instance_id_data_; std::map<std::string, std::string> tokens_;
diff --git a/components/metrics/clean_exit_beacon.cc b/components/metrics/clean_exit_beacon.cc index 3f60cd7..6cdf9a133 100644 --- a/components/metrics/clean_exit_beacon.cc +++ b/components/metrics/clean_exit_beacon.cc
@@ -251,10 +251,7 @@ #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_IOS) absl::optional<bool> backup_beacon_value = ExitedCleanly(); - RecordBeaconConsistency("UMA.CleanExitBeaconConsistency2", - backup_beacon_value, local_state_beacon_value); -#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_IOS) - +#endif absl::optional<bool> beacon_file_beacon_value; bool use_beacon_file = base::FieldTrialList::FindFullName( kExtendedSafeModeTrial) == kEnabledGroup;
diff --git a/components/metrics/clean_exit_beacon_unittest.cc b/components/metrics/clean_exit_beacon_unittest.cc index 3e841676..2d8c089e 100644 --- a/components/metrics/clean_exit_beacon_unittest.cc +++ b/components/metrics/clean_exit_beacon_unittest.cc
@@ -108,12 +108,6 @@ }; #if BUILDFLAG(IS_IOS) -// Used for testing the logic that emits to the UMA.CleanExitBeaconConsistency2 -// histogram. -class PlatformBeaconAndLocalStateBeaconConsistencyTest - : public testing::WithParamInterface<BeaconConsistencyTestParams>, - public CleanExitBeaconTest {}; - // Used for testing the logic that emits to the UMA.CleanExitBeaconConsistency3 // histogram. class BeaconFileAndPlatformBeaconConsistencyTest @@ -455,76 +449,6 @@ } #if BUILDFLAG(IS_IOS) -// Verify that the logic for recording UMA.CleanExitBeaconConsistency2 is -// correct. -INSTANTIATE_TEST_SUITE_P( - All, - PlatformBeaconAndLocalStateBeaconConsistencyTest, - ::testing::Values( - BeaconConsistencyTestParams{ - .test_name = "MissingMissing", - .expected_consistency = - CleanExitBeaconConsistency::kMissingMissing}, - BeaconConsistencyTestParams{ - .test_name = "MissingClean", - .local_state_beacon_value = true, - .expected_consistency = CleanExitBeaconConsistency::kMissingClean}, - BeaconConsistencyTestParams{ - .test_name = "MissingDirty", - .local_state_beacon_value = false, - .expected_consistency = CleanExitBeaconConsistency::kMissingDirty}, - BeaconConsistencyTestParams{ - .test_name = "CleanMissing", - .platform_specific_beacon_value = true, - .expected_consistency = CleanExitBeaconConsistency::kCleanMissing}, - BeaconConsistencyTestParams{ - .test_name = "DirtyMissing", - .platform_specific_beacon_value = false, - .expected_consistency = CleanExitBeaconConsistency::kDirtyMissing}, - BeaconConsistencyTestParams{ - .test_name = "CleanClean", - .platform_specific_beacon_value = true, - .local_state_beacon_value = true, - .expected_consistency = CleanExitBeaconConsistency::kCleanClean}, - BeaconConsistencyTestParams{ - .test_name = "CleanDirty", - .platform_specific_beacon_value = true, - .local_state_beacon_value = false, - .expected_consistency = CleanExitBeaconConsistency::kCleanDirty}, - BeaconConsistencyTestParams{ - .test_name = "DirtyClean", - .platform_specific_beacon_value = false, - .local_state_beacon_value = true, - .expected_consistency = CleanExitBeaconConsistency::kDirtyClean}, - BeaconConsistencyTestParams{ - .test_name = "DirtyDirty", - .platform_specific_beacon_value = false, - .local_state_beacon_value = false, - .expected_consistency = CleanExitBeaconConsistency::kDirtyDirty}), - [](const ::testing::TestParamInfo<BeaconConsistencyTestParams>& params) { - return params.param.test_name; - }); - -TEST_P(PlatformBeaconAndLocalStateBeaconConsistencyTest, BeaconConsistency) { - // Clear the platform-specific and Local State beacons. Unless set below, the - // beacons are considered missing. - CleanExitBeacon::ResetStabilityExitedCleanlyForTesting(&prefs_); - - BeaconConsistencyTestParams params = GetParam(); - if (params.platform_specific_beacon_value) { - CleanExitBeacon::SetUserDefaultsBeacon( - /*exited_cleanly=*/params.platform_specific_beacon_value.value()); - } - if (params.local_state_beacon_value) { - prefs_.SetBoolean(prefs::kStabilityExitedCleanly, - params.local_state_beacon_value.value()); - } - - TestCleanExitBeacon clean_exit_beacon(&prefs_); - histogram_tester_.ExpectUniqueSample("UMA.CleanExitBeaconConsistency2", - params.expected_consistency, 1); -} - // Verify that the logic for recording UMA.CleanExitBeaconConsistency3 is // correct for clients in the Extended Variations Safe Mode experiment's enabled // group.
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index 147bde1..e6aba16 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -24991,7 +24991,13 @@ 'items': { 'type': 'object', 'properties': { - 'service_provider': { 'type': 'string' }, + 'service_provider': { + 'type': 'string', + 'enum': [ + 'google', + 'local_test' + ] + }, 'enable': { 'type': 'array', 'items': { @@ -25047,7 +25053,7 @@ }, }, 'example_value': [{ - 'service_provider': 'Google', + 'service_provider': 'google', 'enable': [ { 'url_list': ['*'], @@ -25125,7 +25131,13 @@ 'items': { 'type': 'object', 'properties': { - 'service_provider': { 'type': 'string' }, + 'service_provider': { + 'type': 'string', + 'enum': [ + 'google', + 'local_test' + ] + }, 'enable': { 'type': 'array', 'items': { @@ -25181,7 +25193,7 @@ }, }, 'example_value': [{ - 'service_provider': 'Google', + 'service_provider': 'google', 'enable': [ { 'url_list': ['*'], @@ -25259,7 +25271,13 @@ 'items': { 'type': 'object', 'properties': { - 'service_provider': { 'type': 'string' }, + 'service_provider': { + 'type': 'string', + 'enum': [ + 'google', + 'local_test' + ] + }, 'enable': { 'type': 'array', 'items': { @@ -25314,7 +25332,7 @@ }, }, 'example_value': [{ - 'service_provider': 'Google', + 'service_provider': 'google', 'enable': [ { 'url_list': ['*'], @@ -25389,7 +25407,13 @@ 'items': { 'type': 'object', 'properties': { - 'service_provider': { 'type': 'string' }, + 'service_provider': { + 'type': 'string', + 'enum': [ + 'google', + 'local_test' + ] + }, 'enable': { 'type': 'array', 'items': { @@ -25444,7 +25468,7 @@ }, }, 'example_value': [{ - 'service_provider': 'Google', + 'service_provider': 'google', 'enable': [ { 'url_list': ['*.them.com', '*.others.com'], @@ -25509,7 +25533,7 @@ 'items': { 'type': 'object', 'properties': { - 'service_provider': { 'type': 'string' }, + 'service_provider': { 'type': 'string', 'enum': [ 'google' ] }, 'enabled_event_names': { 'type': 'array', 'items': { 'type': 'string' }, @@ -25531,7 +25555,7 @@ }, }, 'example_value': [{ - 'service_provider': 'Google', + 'service_provider': 'google', 'enabled_event_names': ['passwordChangedEvent', 'sensitiveDataEvent'], 'enabled_opt_in_events': [ { 'name': 'loginEvent', 'url_patterns': ['*'] }, @@ -28624,7 +28648,7 @@ 'items': { 'type': 'object', 'properties': { - 'service_provider': { 'type': 'string' }, + 'service_provider': { 'type': 'string', 'enum': [ 'box' ] }, 'enterprise_id': { 'type': 'string' }, 'domain': { 'type': 'string' }, 'enable': { @@ -28663,7 +28687,7 @@ }, }, 'example_value': [{ - 'service_provider': 'Google', + 'service_provider': 'box', 'enterprise_id': '1234567890', 'domain': 'example.com', 'enable': [
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 60951b54..637dc22c 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -86,6 +86,7 @@ Si se le asigna el valor "true", se enviará la información sobre la retroiluminación del dispositivo.</translation> <translation id="1076751984131277498">Lista de dispositivos USB desvinculables permitidos</translation> <translation id="1077675271127011209">Inhabilitar informes de uso y de datos sobre fallos</translation> +<translation id="1079120839835170592">Volver a habilitar la API Event.path hasta la versión M115.</translation> <translation id="1079425471279127373">Si se establece la política, se permitirá que algunos orígenes de aplicaciones web de instalación forzada obtengan atributos de dispositivo (por ejemplo, el número de serie o el nombre de host) usando la API Device Attributes. La API Device Attributes es una lista de APIs web. Consulta https://wicg.github.io/WebApiDevice/device_attributes. Solo están disponibles para los orígenes que se correspondan con aplicaciones web de instalación forzada mediante <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> o la política que esté configurada en la sesión de kiosco.</translation> @@ -264,6 +265,7 @@ Si no se asigna ningún valor a esta política, es posible que <ph name="CHROME_CLEANUP_NAME" /> envíe los resultados de los análisis para detectar software no deseado a Google, según lo establecido en la política <ph name="SAFE_BROWSING_EXTENDED_REPORTING_ENABLED_POLICY_NAME" />. <ph name="CHROME_CLEANUP_NAME" /> preguntará a los usuarios si quieren eliminar el software no deseado y compartir los resultados con Google para ayudar a detectar software no deseado en el futuro. Estos resultados tienen metadatos de archivos, extensiones instaladas de forma automática y claves de registro, tal como se describe en la página de información sobre privacidad de Chrome. En <ph name="MS_WIN_NAME" />, esta función solo está disponible en instancias que estén vinculadas a un dominio de <ph name="MS_AD_NAME" /> que se ejecuten en Windows 10 Pro o que se hayan registrado en <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" />.</translation> +<translation id="1285819498003746288">La API Event.path no estará disponible.</translation> <translation id="1290634681382861275">Controla varios ajustes, como el USB, el Bluetooth, la actualización de políticas o el modo desarrollador.</translation> <translation id="1291880496936992484">Advertencia: RC4 se eliminará completamente de <ph name="PRODUCT_NAME" /> después de la versión 52 (en torno a septiembre de 2016) y dejará de funcionar. @@ -2542,6 +2544,7 @@ <translation id="3652670852519271837">Permitir que los sitios pidan al usuario que otorgue permiso de lectura a archivos y directorios a través de la API File System</translation> <translation id="3653237928288822292">Icono del proveedor de búsquedas predeterminadas</translation> <translation id="3654906736796256792">Permite ejecutar el entorno aislado de audio</translation> +<translation id="3655885297177292093">La API Event.path tendrá el estado predeterminado: disponible en versiones anteriores a la M109 y no disponible de la versión M109 a la 114.</translation> <translation id="3659542706175323490">Si se habilita esta política, el inicio con CA (corriente alterna) siempre estará activado si el dispositivo lo admite. El inicio con CA ofrece la opción de que el sistema se reinicie desde el estado de apagado o hibernación cuando se conecte a una toma de corriente. Si se inhabilita esta política, el inicio con CA siempre estará desactivado. @@ -4087,6 +4090,7 @@ Si no se le asigna ningún valor, el usuario podrá controlar la visibilidad de las tarjetas. Las tarjetas serán visibles de forma predeterminada. </translation> +<translation id="5449690328792750354">La API Event.path estará disponible.</translation> <translation id="5455609857202311243">Ignorar la aprobación de políticas de KDC durante la autenticación de HTTP</translation> <translation id="5455888515928026628">Durante el inicio de sesión en la pantalla de bloqueo, <ph name="PRODUCT_OS_NAME" /> puede realizar la autenticación a través de un servidor (con conexión) o una contraseña almacenada en caché (sin conexión). @@ -6858,6 +6862,15 @@ <translation id="8410477879938914253">La política solo se aplica a sesiones de invitado gestionadas. Si se le asigna el valor True a esta política o no se le asigna ningún valor, se mostrará un cuadro de diálogo donde se pedirá al usuario que confirme o deniegue el cierre de sesión cuando se cierre la última ventana. Si se le asigna el valor False, el cuadro de diálogo no se podrá mostrar y, por tanto, también se inhabilitará el cierre de sesión automático después de que se cierre la última ventana.</translation> +<translation id="8411050083243181286"> A partir de la versión M109, se eliminará la API Event.path no estándar para mejorar la compatibilidad web. Esta política vuelve a habilitar la API hasta la versión M115. + + Si se habilita esta política, la API Event.path estará disponible. + + Si se inhabilita esta política, la API Event.path no estará disponible. + + Si no se establece esta política, la API Event.path tendrá el estado predeterminado: disponible en versiones anteriores a la M109 y no disponible de la versión M109 a la 114. + + Esta política se eliminará después de la versión 115 de Chrome.</translation> <translation id="8415953438346821074">Si se habilita esta opción, la configuración almacenada en los perfiles de <ph name="PRODUCT_NAME" /> (como los marcadores, los datos de Autocompletar, las contraseñas, etc.) también se escribirá en un archivo almacenado en la carpeta Roaming del perfil de usuario o en una ubicación especificada por el administrador en la política <ph name="ROAMING_PROFILE_LOCATION_POLICY_NAME" />. Al habilitar esta política, se inhabilitará la sincronización en la nube. Si se inhabilita esta política o no se le asigna ningún valor, solo se usarán los perfiles locales habituales.</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index f16b67f..94bb00e 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -86,6 +86,7 @@ Se viene impostato su true, le informazioni sulla retroilluminazione del dispositivo vengono segnalate.</translation> <translation id="1076751984131277498">Elenco di dispositivi USB che è consentito scollegare</translation> <translation id="1077675271127011209">Disattiva i report sull'utilizzo e sui dati relativi agli arresti anomali</translation> +<translation id="1079120839835170592">Riattiva l'API Event.path fino alla versione M115.</translation> <translation id="1079425471279127373">La configurazione di questo criterio consente di stabilire se consentire o meno ad alcune origini delle applicazioni web con installazione forzata di ricevere gli attributi dei dispositivi (ad esempio, numero di serie, nome host) usando l'API Device Attributes. L'API Device Attributes è un elenco di API web; visita la pagina https://wicg.github.io/WebApiDevice/device_attributes. Sono disponibili soltanto per le origini che corrispondono ad applicazioni web con installazione forzata tramite <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> o per quella configurata nella sessione kiosk.</translation> @@ -265,6 +266,7 @@ Se il criterio non viene configurato, <ph name="CHROME_CLEANUP_NAME" /> potrebbe segnalare a Google le scansioni in cui è stato rilevato un software indesiderato, in linea con il profilo impostato da <ph name="SAFE_BROWSING_EXTENDED_REPORTING_ENABLED_POLICY_NAME" />. <ph name="CHROME_CLEANUP_NAME" /> chiede agli utenti se vogliono ripulire il software indesiderato e di condividere i risultati con Google per semplificarne l'identificazione in futuro. Questi risultati includono metadati di file, estensioni installate automaticamente e chiavi del Registro di sistema, come spiegato nel white paper sulla privacy di Chrome. Su <ph name="MS_WIN_NAME" />, questa funzionalità è disponibile soltanto per le istanze che fanno parte di un dominio <ph name="MS_AD_NAME" />, sono in esecuzione su Windows 10 Pro o sono registrate in <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" />.</translation> +<translation id="1285819498003746288">L'API Event.path non sarà disponibile.</translation> <translation id="1290634681382861275">Consente di gestire varie impostazioni, tra cui USB, Bluetooth, aggiornamento delle norme, modalità sviluppatore e altre ancora.</translation> <translation id="1291880496936992484">Avviso. RC4 sarà rimosso completamente da <ph name="PRODUCT_NAME" /> dopo la versione 52 (nel periodo di settembre 2016), dopodiché questa norma non sarà più attiva. @@ -2530,6 +2532,7 @@ <translation id="3652670852519271837">Consenti ai siti di richiedere all'utente l'accesso di lettura di file e directory tramite l'API file system</translation> <translation id="3653237928288822292">Icona del provider di ricerca predefinito</translation> <translation id="3654906736796256792">Consenti l'esecuzione della sandbox dell'audio</translation> +<translation id="3655885297177292093">L'API Event.path sarà nello stato predefinito: disponibile prima della versione M109 e non disponibile nelle versioni M109-114.</translation> <translation id="3659542706175323490">Se il criterio viene impostato su Attivato, l'avvio tramite CA rimane abilitato, se supportato dal dispositivo. L'avvio tramite CA consente al sistema di riavviarsi dallo stato Off o Ibernazione quando il dispositivo viene collegato alla corrente. Se il criterio viene impostato su Disattivato, l'avvio tramite CA viene disabilitato. @@ -4067,6 +4070,7 @@ Se il criterio non viene impostato, l'utente può controllare la visibilità delle schede. Nell'impostazione predefinita, le schede sono visibili. </translation> +<translation id="5449690328792750354">L'API Event.path sarà disponibile.</translation> <translation id="5455609857202311243">Ignora l'approvazione del criterio KDC durante l'autenticazione HTTP</translation> <translation id="5455888515928026628">Durante l'accesso tramite la schermata di blocco, <ph name="PRODUCT_OS_NAME" /> può eseguire l'autenticazione con un server (online) o utilizzando una password memorizzata nella cache (offline). @@ -6800,6 +6804,15 @@ <translation id="8410477879938914253">Il criterio viene applicato soltanto alle sessioni Ospite gestite. Se il criterio viene impostato su Vero o se non viene configurato, viene visualizzata una finestra di dialogo che chiede all'utente di confermare o annullare la disconnessione quando l'ultima finestra viene chiusa. Se viene impostato su Falso, la finestra di dialogo non viene visualizzata e la disconnessione automatica viene disattivata dopo la chiusura dell'ultima finestra.</translation> +<translation id="8411050083243181286"> A partire dalla versione M109, l'API non standard Event.path verrà rimossa per migliorare la compatibilità web. Questo criterio consente di riattivare l'API fino alla versione M115. + + Se questo criterio viene impostato su Enabled, l'API Event.path sarà disponibile. + + Se questo criterio viene impostato su Disabled, l'API Event.path non sarà disponibile. + + Se il criterio non viene configurato, l'API Event.path sarà nello stato predefinito: disponibile prima della versione M109 e non disponibile nelle versioni M109-114. + + Questo criterio verrà rimosso nelle versioni successive alla versione 115 di Chrome.</translation> <translation id="8415953438346821074">Se attivi questa impostazione, le impostazioni memorizzate nei profili <ph name="PRODUCT_NAME" />, come i preferiti, i dati della compilazione automatica, le password e così via, saranno scritte anche in un file memorizzato nella cartella del profilo utente Roaming o in una posizione specificata dall'amministratore tramite il criterio <ph name="ROAMING_PROFILE_LOCATION_POLICY_NAME" />. Se attivi il criterio, viene disattivata la sincronizzazione nel cloud. Se il criterio viene disattivato o non viene impostato, saranno utilizzati solo i normali profili locali.</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 8850375..55ae3d8e 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -86,6 +86,7 @@ Als het beleid is ingesteld op True, wordt informatie over de schermverlichting van het apparaat gerapporteerd.</translation> <translation id="1076751984131277498">Toelatingslijst met USB-apparaten die mogen worden ontkoppeld</translation> <translation id="1077675271127011209">Rapportage van gebruiks- en crashgegevens uitzetten</translation> +<translation id="1079120839835170592">Event.path API opnieuw aangezet tot M115.</translation> <translation id="1079425471279127373">Het beleid zo instellen dat sommige herkomsten van afgedwongen geïnstalleerde web-apps apparaatkenmerken (zoals serienummer, hostnaam) kunnen ophalen met behulp van de Device Attributes API. De Device Attributes API is een lijst met web-API's, (zie https://wicg.github.io/WebApiDevice/device_attributes). Deze zijn alleen beschikbaar voor herkomsten die overeenkomen met afgedwongen geïnstalleerde web-apps via <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> of met de web-app die is ingesteld in de Kiosk-sessie.</translation> @@ -147,6 +148,7 @@ <translation id="1160939557934457296">Doorgaan vanaf de Safe Browsing-waarschuwingspagina uitzetten</translation> <translation id="1163080558183062209">Printertypen op blokkeerlijst uitzetten</translation> <translation id="117059611145966538">Externe afdrukservers</translation> +<translation id="117080706484659953">Detectie van beleidsbereik toestaan op <ph name="MAC_OS_NAME" /></translation> <translation id="1171785618439752042">Als je het beleid instelt, geef je aan welke typen versleuteling zijn toegestaan wanneer Kerberos-tickets van een <ph name="MS_AD_NAME" />-server worden aangevraagd. Als je het beleid instelt op: @@ -259,6 +261,7 @@ Als je het beleid niet instelt, kan <ph name="CHROME_CLEANUP_NAME" /> (in overeenstemming met het beleid ingesteld door <ph name="SAFE_BROWSING_EXTENDED_REPORTING_ENABLED_POLICY_NAME" />) de resultaten van scans op ongewenste software sturen naar Google. <ph name="CHROME_CLEANUP_NAME" /> vraagt gebruikers of ze willen opschonen en de resultaten willen delen met Google om bij te dragen aan de toekomstige detectie van ongewenste software. Deze resultaten bevatten metadata van bestanden, automatisch geïnstalleerde extensies en registersleutels zoals beschreven in de whitepaper over het Privacybeleid van Chrome. In <ph name="MS_WIN_NAME" /> is deze functionaliteit alleen beschikbaar voor instanties die zijn gekoppeld aan een <ph name="MS_AD_NAME" />-domein, worden uitgevoerd in Windows 10 Pro of zijn ingeschreven voor <ph name="CHROME_BROWSER_CLOUD_MANAGEMENT_NAME" />.</translation> +<translation id="1285819498003746288">Event.path API is niet beschikbaar.</translation> <translation id="1290634681382861275">Beheert diverse instellingen, waaronder USB, Bluetooth, vernieuwingsinterval voor beleid, ontwikkelaarsmodus en meer.</translation> <translation id="1291880496936992484">Waarschuwing: RC4 wordt volledig verwijderd van <ph name="PRODUCT_NAME" /> na versie 52 (rond september 2016) en dit beleid werkt vanaf dan niet meer. @@ -918,6 +921,17 @@ <translation id="1962864958436828230">Minimale groottelimiet instellen voor klembordbeperking ter voorkoming van datalekken</translation> <translation id="1964634611280150550">Incognitomodus staat uit</translation> <translation id="1964802606569741174">Dit beleid is niet van invloed op de YouTube-app voor Android. Als de veiligheidsmodus voor YouTube moet worden afgedwongen, moet je installatie van de YouTube-app voor Android niet toestaan.</translation> +<translation id="1965363065727209968">setTimeout(…, 0) wordt vaak gebruikt om lange JavaScript-taken uit te splitsen. + Als je het beleid toepast, worden setTimeouts en setIntervals met een interval van minder dan 4 ms minder dwingend vastgezet. + Dit verbetert de prestaties op de korte termijn, maar voor websites die de API misbruiken, worden de setTimeouts uiteindelijk toch vastgezet. + + Hierdoor kan de taakvolgorde op een webpagina veranderen, wat kan leiden tot onverwacht gedrag op sites die afhankelijk zijn van een bepaalde volgorde. + De functie kan ook van invloed zijn op sites die veel instanties van setTimeout() met een time-out van 0 ms gebruiken. De CPU-belasting kan bijvoorbeeld toenemen. + + Voor gebruikers waarvoor dit beleid niet is ingesteld, rolt <ph name="PRODUCT_NAME" /> de wijziging geleidelijk uit op het stabiele kanaal. + + Dit is een tijdelijk beleid dat volgens planning wordt verwijderd in <ph name="PRODUCT_NAME" /> 107. Deze deadline kan worden verlengd als daar bij bedrijven behoefte aan is. + </translation> <translation id="1967334955994230472">Projector uitzetten</translation> <translation id="1969212217917526199">Hiermee worden beleidsregels overgeschreven op Debug-builds van de host voor externe toegang. @@ -1448,6 +1462,14 @@ <translation id="2496180316473517155">Browsegeschiedenis</translation> <translation id="2497751676088107779">Gebruikersscript</translation> <translation id="2497965601277442929">Gebruikers niet toestaan de modus 'Alleen HTTPS' aan te zetten</translation> +<translation id="249798396824949930"> Hiermee bepaal je of de browser het verplichte beleidsbereik op <ph name="MAC_OS_NAME" /> wel of niet kan waarnemen. + + Als je het beleid toepast of niet instelt, wordt het bereik van elk beleid bepaald door het bereik van het beheerde <ph name="MAC_OS_NAME" />-profiel. + Als je het beleid niet toepast, worden alle beleidsregels herkend als beleid voor machinebereik. + + Dit beleid is tijdelijk om de overgang naar beleid met een correct bereik op <ph name="MAC_OS_NAME" /> mogelijk te maken en wordt verwijderd in <ph name="PRODUCT_NAME" /> 107. + + </translation> <translation id="2498238926436517902">Archief altijd automatisch verbergen</translation> <translation id="250022556568924228">Als je het beleid instelt, downloadt <ph name="PRODUCT_OS_NAME" /> de servicevoorwaarden en geeft deze aan gebruikers weer als er een lokale accountsessie op het apparaat wordt gestart. Gebruikers kunnen alleen inloggen bij de sessie nadat ze de servicevoorwaarden hebben geaccepteerd. @@ -2489,6 +2511,7 @@ <translation id="3652670852519271837">Sites toestaan om gebruikers schrijftoegang te vragen tot bestanden en directory's via de File System API</translation> <translation id="3653237928288822292">Icoon voor standaardzoekprovider</translation> <translation id="3654906736796256792">Toestaan dat de audiosandbox wordt uitgevoerd</translation> +<translation id="3655885297177292093">Event.path API heeft de standaardstatus: beschikbaar vóór M109 en niet beschikbaar in M109 t/m 114.</translation> <translation id="3659542706175323490">Als je het beleid toepast, blijft opstarten bij netstroom aan als het apparaat dit ondersteunt. Dankzij opstarten bij netstroom kan het systeem automatisch opstarten als het is uitgezet of in de slaapstand staat en het systeem is aangesloten op netstroom. Als je het beleid niet toepast, blijft opstarten bij netstroom uit. @@ -2661,6 +2684,7 @@ <translation id="3838094946886335701">Als je het beleid instelt (alleen zoals aanbevolen), kun je een lijst met protocolhandlers registreren. Deze worden samengevoegd met de protocolhandlers die de gebruiker registreert, waarna beide sets gebruikt worden. Stel de eigenschap 'protocol' in op het schema, zoals 'mailto', en stel de eigenschap 'URL' in op het URL-patroon van de app die het schema verwerkt dat in het veld 'protocol' wordt gespecificeerd. Het patroon mag de tijdelijke aanduiding '%s' bevatten die wordt vervangen door de verwerkte URL. Gebruikers kunnen een protocolhandler niet verwijderen als deze is geregistreerd door een beleid. Als ze een nieuwe standaard handler installeren, kunnen ze de protocolhandlers wijzigen die door het beleid zijn geïnstalleerd.</translation> +<translation id="3851443303439635700">De nestdrempel bepalen waarvoor de JavaScript-functie setTimeout() wordt vastgezet</translation> <translation id="3857816702027059082">Stel <ph name="CHROME_ENTERPRISE_PLATFORM_IDENTITY_CONNECTOR" /> in voor een lijst met URL's. Als je dit beleid instelt, geef je op welke URL's moeten worden toegestaan als onderdeel van het attestproces om de reeks signalen van de machine te ontvangen. @@ -3178,6 +3202,7 @@ <translation id="4472740647327683596">Breedte van de pagina in micrometers</translation> <translation id="4474167089968829729">Opslag van wachtwoorden in Wachtwoordmanager aanzetten</translation> <translation id="4476769083125004742">Als dit beleid wordt ingesteld op <ph name="BLOCK_GEOLOCATION_SETTING" />, hebben de Android-apps geen toegang tot locatiegegevens. Als je een andere waarde voor dit beleid instelt of het beleid niet instelt, wordt de gebruiker om toestemming gevraagd wanneer een Android-app toegang tot locatiegegevens probeert te krijgen.</translation> +<translation id="4478248026668918517">Detectie van beleidsbereik blokkeren.</translation> <translation id="4479671363221255277">Als je het beleid instelt, kun je een lijst met URL-patronen maken om op te geven welke sites gebruikers mogen vragen om hun leestoegang te geven tot bestanden en directory's in het bestandssysteem van het besturingssysteem van de host via de File System API. Als je het beleid niet instelt, is <ph name="DEFAULT_FILE_SYSTEM_READ_GUARD_SETTING_POLICY_NAME" /> (indien ingesteld) van toepassing op alle sites. Zo niet, dan gelden de persoonlijke instellingen van gebruikers. @@ -4018,6 +4043,7 @@ Als je het beleid niet instelt, kan de gebruiker zelf bepalen of de kaarten wel of niet zichtbaar zijn. De standaardwaarde is 'zichtbaar'. </translation> +<translation id="5449690328792750354">Event.path API komt beschikbaar.</translation> <translation id="5455609857202311243">KDC-beleidsgoedkeuring negeren tijdens HTTP-verificatie</translation> <translation id="5455888515928026628">Als je inlogt via het vergrendelscherm, kan <ph name="PRODUCT_OS_NAME" /> de verificatie uitvoeren via een server (online) of door gebruik te maken van een wachtwoord in het cachegeheugen (offline). @@ -4755,6 +4781,7 @@ <translation id="6282799760374509080">Het opnemen van audio toestaan of weigeren</translation> <translation id="6284362063448764300">TLS 1.1</translation> <translation id="6287310684159482272">Instellingen voor cookies</translation> +<translation id="6299147100249359151">Detectie van beleidsbereik toestaan.</translation> <translation id="6300871921951390976">Gebruikers mogen het releasekanaal van het apparaat alleen wijzigen als je dit beleid hebt ingesteld op True. Als je dit beleid hebt ingesteld op False of niet hebt ingesteld, mogen gebruikers het kanaal niet wijzigen. Het instellen van <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> heeft alleen effect als je <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> hebt ingesteld op False.</translation> @@ -6732,6 +6759,15 @@ <translation id="8410477879938914253">Het beleid is alleen van toepassing op beheerde gastsessies. Als je het beleid instelt op True of niet instelt, wordt er een dialoogvenster getoond waarin de gebruiker wordt gevraagd het uitloggen te bevestigen of te weigeren als het laatste venster wordt gesloten. Als je het beleid instelt op False, wordt het dialoogvenster niet getoond en wordt automatisch uitloggen nadat het laatste venster is gesloten ook uitgezet.</translation> +<translation id="8411050083243181286"> Vanaf M109 wordt de niet-standaard API Event.path verwijderd om de webcompatibiliteit te verbeteren. Met dit beleid wordt de API opnieuw aangezet tot M115. + + Als je dit beleid toepast, is de Event.path API beschikbaar. + + Als je dit beleid niet toepast, is de Event.path API niet beschikbaar. + + Als dit beleid niet is ingesteld, heeft de Event.path API de standaardstatus: beschikbaar vóór M109 en niet beschikbaar in M109 t/m 114. + + Dit beleid wordt na Chrome 115 verwijderd.</translation> <translation id="8415953438346821074">Als je deze instelling aanzet, worden de instellingen die zijn opgeslagen in <ph name="PRODUCT_NAME" />-profielen, zoals bookmarks, gegevens voor automatisch invullen en wachtwoorden, ook geschreven naar een bestand dat is opgeslagen in de map voor roaming-gebruikersprofielen of op een locatie die de beheerder heeft opgegeven via het beleid <ph name="ROAMING_PROFILE_LOCATION_POLICY_NAME" />. Als je dit beleid toepast, wordt cloudsynchronisatie uitgezet. Als je dit beleid niet toepast of niet instelt, worden alleen de gewone lokale profielen gebruikt.</translation>
diff --git a/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java b/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java index 2a40551..18ee9f1 100644 --- a/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java +++ b/components/safe_browsing/android/java/src/org/chromium/components/safe_browsing/SafeBrowsingApiBridge.java
@@ -4,14 +4,14 @@ package org.chromium.components.safe_browsing; +import androidx.annotation.GuardedBy; + import org.chromium.base.Log; import org.chromium.base.TraceEvent; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; -import java.lang.reflect.InvocationTargetException; - /** * Helper for calling GMSCore Safe Browsing API from native code. * @@ -28,38 +28,31 @@ private static final String TAG = "SBApiBridge"; private static final boolean DEBUG = false; - // Volatile to allow it being set from any thread. - private static volatile SafeBrowsingApiHandler sHandler; - private static UrlCheckTimeObserver sUrlCheckTimeObserver; + private static final Object sLock = new Object(); - // Deprecated. See setHandler(). - private static Class<? extends SafeBrowsingApiHandler> sHandlerClass; + @GuardedBy("sLock") + private static boolean sHandlerInitCalled; + + @GuardedBy("sLock") + private static SafeBrowsingApiHandler sHandler; + + @GuardedBy("sLock") + private static UrlCheckTimeObserver sUrlCheckTimeObserver; private SafeBrowsingApiBridge() { // Util class, do not instantiate. } /** - * Set the class-file for the implementation of SafeBrowsingApiHandler to use when the safe - * browsing api is invoked. - * - * TODO(crbug.com/1296097): Remove this method when all clients are switched to - * {@link #setHandler(SafeBrowsingApiHandler)}. - */ - @Deprecated - public static void setSafeBrowsingHandlerType( - Class<? extends SafeBrowsingApiHandler> handlerClass) { - sHandlerClass = handlerClass; - } - - /** * Sets the {@link SafeBrowsingApiHandler} object once and for the lifetime of this process. * * @param handler An instance that has not been initialized. */ public static void setHandler(SafeBrowsingApiHandler handler) { - assert sHandler == null; - sHandler = handler; + synchronized (sLock) { + assert sHandler == null; + sHandler = handler; + } } /** @@ -72,11 +65,9 @@ */ @CalledByNative public static boolean ensureInitialized() { - return getHandler() != null; - } - - private static SafeBrowsingApiHandler getHandler() { - return LazyHolder.INSTANCE; + synchronized (sLock) { + return getHandler() != null; + } } /** @@ -94,17 +85,21 @@ * Set the observer to notify about the time it took to respond for SafeBrowsing. Notified for * the first URL check, and only once. * - * The notification happens on another thread. The caller *must* guarantee that setting the - * observer happens-before (in JMM sense) the first SafeBrowsing request is made. - * * @param observer the observer to notify. */ public static void setOneTimeUrlCheckObserver(UrlCheckTimeObserver observer) { - sUrlCheckTimeObserver = observer; + synchronized (sLock) { + sUrlCheckTimeObserver = observer; + } } - private static class LazyHolder { - static final SafeBrowsingApiHandler INSTANCE = initHandler(); + @GuardedBy("sLock") + private static SafeBrowsingApiHandler getHandler() { + if (!sHandlerInitCalled) { + sHandler = initHandler(); + sHandlerInitCalled = true; + } + return sHandler; } /** @@ -114,68 +109,72 @@ * * @return the handler if it is usable, or null if the API is not supported. */ + @GuardedBy("sLock") private static SafeBrowsingApiHandler initHandler() { try (TraceEvent t = TraceEvent.scoped("SafeBrowsingApiBridge.initHandler")) { - return initHandlerInTraceEvent(); + if (DEBUG) { + Log.i(TAG, "initHandler"); + } + if (sHandler == null) return null; + return sHandler.init(new LookupDoneObserver()) ? sHandler : null; } } - private static SafeBrowsingApiHandler initHandlerInTraceEvent() { - if (DEBUG) { - Log.i(TAG, "initHandler"); - } - SafeBrowsingApiHandler handler; - if (sHandler != null) { - handler = sHandler; - } else { - try { - handler = sHandlerClass.getDeclaredConstructor().newInstance(); - } catch (NullPointerException | InstantiationException | IllegalAccessException - | NoSuchMethodException | InvocationTargetException e) { - Log.e(TAG, "Failed to init handler: " + e.getMessage()); - return null; + private static class LookupDoneObserver implements SafeBrowsingApiHandler.Observer { + @Override + public void onUrlCheckDone( + long callbackId, int resultStatus, String metadata, long checkDelta) { + synchronized (sLock) { + if (sUrlCheckTimeObserver != null) { + sUrlCheckTimeObserver.onUrlCheckTime(checkDelta); + TraceEvent.instant("FirstSafeBrowsingResponse", String.valueOf(checkDelta)); + sUrlCheckTimeObserver = null; + } + SafeBrowsingApiBridgeJni.get().onUrlCheckDone( + callbackId, resultStatus, metadata, checkDelta); } } - boolean initSuccessful = handler.init((callbackId, resultStatus, metadata, checkDelta) -> { - if (sUrlCheckTimeObserver != null) { - sUrlCheckTimeObserver.onUrlCheckTime(checkDelta); - TraceEvent.instant("FirstSafeBrowsingResponse", String.valueOf(checkDelta)); - sUrlCheckTimeObserver = null; - } - SafeBrowsingApiBridgeJni.get().onUrlCheckDone( - callbackId, resultStatus, metadata, checkDelta); - }); - return initSuccessful ? handler : null; } /** * Starts a Safe Browsing check. + * + * Must only be called if {@link #ensureInitialized()} returns true. */ @CalledByNative private static void startUriLookup(long callbackId, String uri, int[] threatsOfInterest) { - try (TraceEvent t = TraceEvent.scoped("SafeBrowsingApiBridge.startUriLookup")) { - assert getHandler() != null; - if (DEBUG) { - Log.i(TAG, "Starting request: %s", uri); - } - getHandler().startUriLookup(callbackId, uri, threatsOfInterest); - if (DEBUG) { - Log.i(TAG, "Done starting request: %s", uri); + synchronized (sLock) { + assert sHandlerInitCalled; + assert sHandler != null; + try (TraceEvent t = TraceEvent.scoped("SafeBrowsingApiBridge.startUriLookup")) { + if (DEBUG) { + Log.i(TAG, "Starting request: %s", uri); + } + getHandler().startUriLookup(callbackId, uri, threatsOfInterest); + if (DEBUG) { + Log.i(TAG, "Done starting request: %s", uri); + } } } } /** - * TODO(crbug.com/995926): Make this call async * Starts a Safe Browsing Allowlist check. * + * Must only be called if {@link #ensureInitialized()} returns true. + * * @return true iff the uri is in the allowlist. + * + * TODO(crbug.com/995926): Make this call async. */ @CalledByNative private static boolean startAllowlistLookup(String uri, int threatType) { - try (TraceEvent t = TraceEvent.scoped("SafeBrowsingApiBridge.startAllowlistLookup")) { - assert getHandler() != null; - return getHandler().startAllowlistLookup(uri, threatType); + synchronized (sLock) { + assert sHandlerInitCalled; + assert sHandler != null; + try (TraceEvent t = TraceEvent.scoped("SafeBrowsingApiBridge.startAllowlistLookup")) { + return getHandler().startAllowlistLookup(uri, threatType); + } } }
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index ef0c04d..dda714d8 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -352,7 +352,7 @@ <translation id="1807246157184219062">Lys</translation> <translation id="1807528111851433570">Startark</translation> <translation id="1812527064848182527">liggende</translation> -<translation id="1813414402673211292">Slett nettleserdata</translation> +<translation id="1813414402673211292">Slett nettlesingsdata</translation> <translation id="182139138257690338">automatiske nedlastinger</translation> <translation id="1821930232296380041">Ugyldig forespørsel eller forespørselsparametere</translation> <translation id="1822540298136254167">Nettsteder du besøker, og hvor mye tid du bruker på dem</translation> @@ -976,7 +976,7 @@ <translation id="361438452008624280">Listeoppføringen «<ph name="LANGUAGE_ID" />»: Språket er ukjent eller støttes ikke.</translation> <translation id="3614934205542186002"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" /> – trykk på Tab og deretter på Enter for å kjøre en sikkerhetssjekk i Chrome-innstillingene</translation> <translation id="3615877443314183785">Angi en gyldig utløpsdato</translation> -<translation id="36224234498066874">Slett nettleserdata</translation> +<translation id="36224234498066874">Slett alle nettlesingsdata</translation> <translation id="362276910939193118">Vis fullstendig logg</translation> <translation id="3630155396527302611">Hvis programmet allerede har fått tillatelse til å bruke nettverket, kan du prøve å fjerne det fra listen og så legge det til på nytt.</translation> @@ -1647,7 +1647,7 @@ <translation id="540969355065856584">Denne tjeneren kunne ikke bevise at den er <ph name="DOMAIN" />. Sikkerhetssertifikatet til tjeneren er ikke gyldig for øyeblikket. Dette kan være forårsaket av en feilkonfigurasjon eller en angriper som lytter på tilkoblingen din.</translation> <translation id="5412236728747081950">Dette nettstedet mottar interessene dine fra Chrome for å kunne vise deg mer relevante annonser</translation> <translation id="541416427766103491">Hylle 4</translation> -<translation id="5421136146218899937">Slett nettleserdata</translation> +<translation id="5421136146218899937">Slett nettlesingsdata</translation> <translation id="5426179911063097041"><ph name="SITE" /> vil sende deg varsler</translation> <translation id="5428105026674456456">Spansk</translation> <translation id="5430298929874300616">Fjern bokmerke</translation> @@ -1684,7 +1684,7 @@ <translation id="5528532273234423708">Smarthus</translation> <translation id="55293785478302737">Kantstifting</translation> <translation id="553484882784876924">Prc6 (konvolutt)</translation> -<translation id="5535133333442455806">Knappen «Slett nettleserdata» – trykk på Enter for å tømme nettleserloggen, slette informasjonskapsler, tømme bufferen med mer i Chrome-innstillingene</translation> +<translation id="5535133333442455806">Knappen «Slett nettlesingsdata» – trykk på Enter for å tømme nettleserloggen, slette informasjonskapsler, tømme bufferen med mer i Chrome-innstillingene</translation> <translation id="5536214594743852365">Vis «<ph name="SECTION" />»-delen</translation> <translation id="5539243836947087108">Flåte</translation> <translation id="5540224163453853">Den forespurte artikkelen ble ikke funnet.</translation> @@ -2557,7 +2557,7 @@ <translation id="8009225694047762179">Administrer passord</translation> <translation id="8012116502927253373">{NUM_CARDS,plural, =1{Dette kortet og den tilknyttede faktureringsadressen lagres. Du kan bruke det når du er logget på <ph name="USER_EMAIL" />.}other{Disse kortene og de tilknyttede faktureringsadressene lagres. Du kan bruke dem når du er logget på <ph name="USER_EMAIL" />.}}</translation> <translation id="8025119109950072390">Angripere på dette nettstedet prøver kanskje å lure deg til å gjøre farlige ting som å installere programvare eller avsløre personopplysningene dine (for eksempel passord, telefonnumre eller kredittkortinformasjon).</translation> -<translation id="8026334261755873520">Slett nettleserdata</translation> +<translation id="8026334261755873520">Slett nettlesingsdata</translation> <translation id="8027077570865220386">Skuff 15</translation> <translation id="8028698320761417183"><ph name="CREATE_GOOGLE_FORM_FOCUSED_FRIENDLY_MATCH_TEXT" /> – trykk på Tab og deretter på Enter for å opprette et nytt skjema i Google Skjemaer raskt</translation> <translation id="8028960012888758725">Beskjær etter jobben</translation>
diff --git a/components/sync/engine/model_type_worker_unittest.cc b/components/sync/engine/model_type_worker_unittest.cc index 2caded980..8f22a081 100644 --- a/components/sync/engine/model_type_worker_unittest.cc +++ b/components/sync/engine/model_type_worker_unittest.cc
@@ -1428,8 +1428,8 @@ SetUpdateEncryptionFilter(1); TriggerUpdateFromServer(10, kTag1, kValue1); - // The undecryptable update has been around for only 1 GetUpdatesResponse, so - // the worker is still blocked. + // The undecryptable update has been around for only 1 GetUpdates, so the + // worker is still blocked. EXPECT_TRUE(worker()->BlockForEncryption()); // Send empty GetUpdates, reaching the threshold of 2.
diff --git a/components/user_notes/interfaces/user_notes_ui.h b/components/user_notes/interfaces/user_notes_ui.h index 4d4d7fdc..b3e4b612 100644 --- a/components/user_notes/interfaces/user_notes_ui.h +++ b/components/user_notes/interfaces/user_notes_ui.h
@@ -7,6 +7,7 @@ #include <string> +#include "base/unguessable_token.h" #include "ui/gfx/geometry/rect.h" namespace user_notes { @@ -24,7 +25,7 @@ // Called when a note in the UI should be scrolled to / brought to the // foreground, and focused. - virtual void FocusNote(const std::string& guid) = 0; + virtual void FocusNote(const base::UnguessableToken& guid) = 0; // Called when the note creation UX should be shown in the UI layer. |bounds| // corresponds to the location in the webpage where the associated highlight
diff --git a/components/user_notes/storage/user_note_database.cc b/components/user_notes/storage/user_note_database.cc index 6fc1e43e..18a43d9 100644 --- a/components/user_notes/storage/user_note_database.cc +++ b/components/user_notes/storage/user_note_database.cc
@@ -272,6 +272,38 @@ transaction.Commit(); } +void UserNoteDatabase::DeleteNoteWithStringId(std::string id) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + sql::Statement delete_notes_body(db_.GetCachedStatement( + SQL_FROM_HERE, "DELETE FROM notes_body WHERE note_id = ?")); + + if (!delete_notes_body.is_valid()) + return; + + delete_notes_body.BindString(0, id); + if (!delete_notes_body.Run()) + return; + + sql::Statement delete_notes_text_target(db_.GetCachedStatement( + SQL_FROM_HERE, "DELETE FROM notes_text_target WHERE note_id = ?")); + if (!delete_notes_text_target.is_valid()) + return; + + delete_notes_text_target.BindString(0, id); + if (!delete_notes_text_target.Run()) + return; + + sql::Statement delete_notes( + db_.GetCachedStatement(SQL_FROM_HERE, "DELETE FROM notes WHERE id = ?")); + if (!delete_notes.is_valid()) + return; + + delete_notes.BindString(0, id); + if (!delete_notes.Run()) + return; +} + void UserNoteDatabase::DeleteNote(const base::UnguessableToken& id) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -282,33 +314,7 @@ if (!transaction.Begin()) return; - sql::Statement delete_notes_body(db_.GetCachedStatement( - SQL_FROM_HERE, "DELETE FROM notes_body WHERE note_id = ?")); - - if (!delete_notes_body.is_valid()) - return; - - delete_notes_body.BindString(0, id.ToString()); - if (!delete_notes_body.Run()) - return; - - sql::Statement delete_notes_text_target(db_.GetCachedStatement( - SQL_FROM_HERE, "DELETE FROM notes_text_target WHERE note_id = ?")); - if (!delete_notes_text_target.is_valid()) - return; - - delete_notes_text_target.BindString(0, id.ToString()); - if (!delete_notes_text_target.Run()) - return; - - sql::Statement delete_notes( - db_.GetCachedStatement(SQL_FROM_HERE, "DELETE FROM notes WHERE id = ?")); - if (!delete_notes.is_valid()) - return; - - delete_notes.BindString(0, id.ToString()); - if (!delete_notes.Run()) - return; + DeleteNoteWithStringId(id.ToString()); transaction.Commit(); } @@ -316,19 +322,104 @@ void UserNoteDatabase::DeleteAllForUrl(const GURL& url) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // TODO(gayane): Implement. + if (!EnsureDBInit()) + return; + + sql::Transaction transaction(&db_); + if (!transaction.Begin()) + return; + + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, "SELECT id FROM notes WHERE url = ?")); + + if (!statement.is_valid()) + return; + + statement.BindString(0, url.spec()); + + std::vector<std::string> ids; + while (statement.Step()) + ids.emplace_back(statement.ColumnString(0)); + + if (!statement.Succeeded()) + return; + + for (const std::string& id : ids) { + DeleteNoteWithStringId(id); + } + + transaction.Commit(); } void UserNoteDatabase::DeleteAllForOrigin(const url::Origin& page) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // TODO(gayane): Implement. + if (!EnsureDBInit()) + return; + + sql::Transaction transaction(&db_); + if (!transaction.Begin()) + return; + + sql::Statement statement(db_.GetCachedStatement( + SQL_FROM_HERE, "SELECT id FROM notes WHERE origin = ?")); + + if (!statement.is_valid()) + return; + + statement.BindString(0, page.Serialize()); + + std::vector<std::string> ids; + while (statement.Step()) { + ids.emplace_back(statement.ColumnString(0)); + } + + if (!statement.Succeeded()) + return; + + for (const std::string& id : ids) { + DeleteNoteWithStringId(id); + } + + transaction.Commit(); } void UserNoteDatabase::DeleteAllNotes() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // TODO(gayane): Implement. + if (!EnsureDBInit()) + return; + + sql::Transaction transaction(&db_); + if (!transaction.Begin()) + return; + + sql::Statement delete_notes_body( + db_.GetCachedStatement(SQL_FROM_HERE, "DELETE FROM notes_body")); + + if (!delete_notes_body.is_valid()) + return; + + if (!delete_notes_body.Run()) + return; + + sql::Statement delete_notes_text_target( + db_.GetCachedStatement(SQL_FROM_HERE, "DELETE FROM notes_text_target")); + if (!delete_notes_text_target.is_valid()) + return; + + if (!delete_notes_text_target.Run()) + return; + + sql::Statement delete_notes( + db_.GetCachedStatement(SQL_FROM_HERE, "DELETE FROM notes")); + if (!delete_notes.is_valid()) + return; + + if (!delete_notes.Run()) + return; + + transaction.Commit(); } bool UserNoteDatabase::EnsureDBInit() {
diff --git a/components/user_notes/storage/user_note_database.h b/components/user_notes/storage/user_note_database.h index 72b8725..805e45f 100644 --- a/components/user_notes/storage/user_note_database.h +++ b/components/user_notes/storage/user_note_database.h
@@ -50,10 +50,8 @@ void DeleteAllNotes(); private: - FRIEND_TEST_ALL_PREFIXES(UserNoteDatabaseTest, UpdateNote); - FRIEND_TEST_ALL_PREFIXES(UserNoteDatabaseTest, CreateNote); - FRIEND_TEST_ALL_PREFIXES(UserNoteDatabaseTest, DeleteNote); FRIEND_TEST_ALL_PREFIXES(UserNoteDatabaseTest, GetNotesById); + friend class UserNoteDatabaseTest; // Initialises internal database if needed. bool EnsureDBInit(); @@ -69,6 +67,8 @@ bool CreateSchema(); + void DeleteNoteWithStringId(std::string id); + std::unique_ptr<UserNote> GetNoteById(const base::UnguessableToken& id); sql::Database db_ GUARDED_BY_CONTEXT(sequence_checker_);
diff --git a/components/user_notes/storage/user_note_database_unittest.cc b/components/user_notes/storage/user_note_database_unittest.cc index 35674b7f..7f32733 100644 --- a/components/user_notes/storage/user_note_database_unittest.cc +++ b/components/user_notes/storage/user_note_database_unittest.cc
@@ -29,6 +29,47 @@ return temp_directory_.GetPath().Append(kDatabaseName); } + void check_is_removed_from_db(UserNoteDatabase* user_note_db, + const base::UnguessableToken& id) { + DCHECK_CALLED_ON_VALID_SEQUENCE(user_note_db->sequence_checker_); + + sql::Statement statement_notes_body(user_note_db->db_.GetCachedStatement( + SQL_FROM_HERE, "SELECT note_id FROM notes_body WHERE note_id = ?")); + EXPECT_TRUE(statement_notes_body.is_valid()); + statement_notes_body.BindString(0, id.ToString()); + EXPECT_FALSE(statement_notes_body.Step()); + + sql::Statement statement_notes(user_note_db->db_.GetCachedStatement( + SQL_FROM_HERE, "SELECT id FROM notes WHERE id = ?")); + EXPECT_TRUE(statement_notes.is_valid()); + statement_notes.BindString(0, id.ToString()); + EXPECT_FALSE(statement_notes.Step()); + + sql::Statement statement_notes_text_target( + user_note_db->db_.GetCachedStatement( + SQL_FROM_HERE, + "SELECT note_id FROM notes_text_target WHERE note_id = ?")); + EXPECT_TRUE(statement_notes_text_target.is_valid()); + statement_notes_text_target.BindString(0, id.ToString()); + EXPECT_FALSE(statement_notes_text_target.Step()); + } + + void check_notes_body_from_db(UserNoteDatabase* user_note_db, + const base::UnguessableToken& id, + const std::string& text) { + DCHECK_CALLED_ON_VALID_SEQUENCE(user_note_db->sequence_checker_); + + sql::Statement statement(user_note_db->db_.GetCachedStatement( + SQL_FROM_HERE, "SELECT plain_text FROM notes_body WHERE note_id = ?")); + + EXPECT_TRUE(statement.is_valid()); + statement.BindString(0, id.ToString()); + EXPECT_TRUE(statement.Step()); + + EXPECT_EQ(1, statement.ColumnCount()); + EXPECT_EQ(text, statement.ColumnString(0)); + } + private: base::ScopedTempDir temp_directory_; }; @@ -113,7 +154,6 @@ TEST_F(UserNoteDatabaseTest, CreateNote) { UserNoteDatabase user_note_db(db_dir()); EXPECT_TRUE(user_note_db.Init()); - DCHECK_CALLED_ON_VALID_SEQUENCE(user_note_db.sequence_checker_); base::UnguessableToken note_id = base::UnguessableToken::Create(); UserNote* user_note = @@ -122,22 +162,13 @@ user_note_db.UpdateNote(user_note, "new test note", /*is_creation=*/true); - sql::Statement statement(user_note_db.db_.GetCachedStatement( - SQL_FROM_HERE, "SELECT plain_text FROM notes_body WHERE note_id = ?")); - - EXPECT_TRUE(statement.is_valid()); - statement.BindString(0, note_id.ToString()); - EXPECT_TRUE(statement.Step()); - - EXPECT_EQ(1, statement.ColumnCount()); - EXPECT_EQ("new test note", statement.ColumnString(0)); + check_notes_body_from_db(&user_note_db, note_id, "new test note"); delete user_note; } TEST_F(UserNoteDatabaseTest, UpdateNote) { UserNoteDatabase user_note_db(db_dir()); EXPECT_TRUE(user_note_db.Init()); - DCHECK_CALLED_ON_VALID_SEQUENCE(user_note_db.sequence_checker_); base::UnguessableToken note_id = base::UnguessableToken::Create(); UserNote* user_note = @@ -147,22 +178,13 @@ user_note_db.UpdateNote(user_note, "new test note", /*is_creation=*/true); user_note_db.UpdateNote(user_note, "edit test note", false); - sql::Statement statement(user_note_db.db_.GetCachedStatement( - SQL_FROM_HERE, "SELECT plain_text FROM notes_body WHERE note_id = ?")); - - EXPECT_TRUE(statement.is_valid()); - statement.BindString(0, note_id.ToString()); - EXPECT_TRUE(statement.Step()); - - EXPECT_EQ(1, statement.ColumnCount()); - EXPECT_EQ("edit test note", statement.ColumnString(0)); + check_notes_body_from_db(&user_note_db, note_id, "edit test note"); delete user_note; } TEST_F(UserNoteDatabaseTest, DeleteNote) { UserNoteDatabase user_note_db(db_dir()); EXPECT_TRUE(user_note_db.Init()); - DCHECK_CALLED_ON_VALID_SEQUENCE(user_note_db.sequence_checker_); base::UnguessableToken note_id = base::UnguessableToken::Create(); UserNote* user_note = @@ -172,25 +194,7 @@ user_note_db.UpdateNote(user_note, "new test note", /*is_creation=*/true); user_note_db.DeleteNote(note_id); - sql::Statement statement_notes_body(user_note_db.db_.GetCachedStatement( - SQL_FROM_HERE, "SELECT note_id FROM notes_body WHERE note_id = ?")); - EXPECT_TRUE(statement_notes_body.is_valid()); - statement_notes_body.BindString(0, note_id.ToString()); - EXPECT_FALSE(statement_notes_body.Step()); - - sql::Statement statement_notes(user_note_db.db_.GetCachedStatement( - SQL_FROM_HERE, "SELECT id FROM notes WHERE id = ?")); - EXPECT_TRUE(statement_notes.is_valid()); - statement_notes.BindString(0, note_id.ToString()); - EXPECT_FALSE(statement_notes.Step()); - - sql::Statement statement_notes_text_target( - user_note_db.db_.GetCachedStatement( - SQL_FROM_HERE, - "SELECT note_id FROM notes_text_target WHERE note_id = ?")); - EXPECT_TRUE(statement_notes_text_target.is_valid()); - statement_notes_text_target.BindString(0, note_id.ToString()); - EXPECT_FALSE(statement_notes_text_target.Step()); + check_is_removed_from_db(&user_note_db, note_id); delete user_note; } @@ -232,4 +236,69 @@ } } +TEST_F(UserNoteDatabaseTest, DeleteAllNotes) { + UserNoteDatabase user_note_db(db_dir()); + EXPECT_TRUE(user_note_db.Init()); + + std::vector<base::UnguessableToken> ids; + for (int i = 0; i < 3; i++) { + base::UnguessableToken note_id = base::UnguessableToken::Create(); + ids.emplace_back(note_id); + UserNote* user_note = + new UserNote(note_id, GetTestUserNoteMetadata(), GetTestUserNoteBody(), + GetTestUserNotePageTarget()); + user_note_db.UpdateNote(user_note, "new test note", /*is_creation=*/true); + delete user_note; + } + user_note_db.DeleteAllNotes(); + + for (const base::UnguessableToken& id : ids) { + check_is_removed_from_db(&user_note_db, id); + } +} + +TEST_F(UserNoteDatabaseTest, DeleteAllForOrigin) { + UserNoteDatabase user_note_db(db_dir()); + EXPECT_TRUE(user_note_db.Init()); + + std::vector<base::UnguessableToken> ids; + for (int i = 0; i < 3; i++) { + base::UnguessableToken note_id = base::UnguessableToken::Create(); + ids.emplace_back(note_id); + UserNote* user_note = + new UserNote(note_id, GetTestUserNoteMetadata(), GetTestUserNoteBody(), + GetTestUserNotePageTarget("https://www.test.com")); + user_note_db.UpdateNote(user_note, "new test note", /*is_creation=*/true); + delete user_note; + } + + user_note_db.DeleteAllForOrigin( + url::Origin::Create(GURL("https://www.test.com"))); + + for (const base::UnguessableToken& id : ids) { + check_is_removed_from_db(&user_note_db, id); + } +} + +TEST_F(UserNoteDatabaseTest, DeleteAllForUrl) { + UserNoteDatabase user_note_db(db_dir()); + EXPECT_TRUE(user_note_db.Init()); + + std::vector<base::UnguessableToken> ids; + for (int i = 0; i < 3; i++) { + base::UnguessableToken note_id = base::UnguessableToken::Create(); + ids.emplace_back(note_id); + UserNote* user_note = + new UserNote(note_id, GetTestUserNoteMetadata(), GetTestUserNoteBody(), + GetTestUserNotePageTarget("https://www.test.com")); + user_note_db.UpdateNote(user_note, "new test note", /*is_creation=*/true); + delete user_note; + } + user_note_db.DeleteAllForUrl(GURL("https://www.test.com")); + + for (const base::UnguessableToken& id : ids) { + check_is_removed_from_db(&user_note_db, id); + } +} + } // namespace user_notes
diff --git a/content/browser/accessibility/accessibility_action_browsertest.cc b/content/browser/accessibility/accessibility_action_browsertest.cc index fa9c916a..4027c5c 100644 --- a/content/browser/accessibility/accessibility_action_browsertest.cc +++ b/content/browser/accessibility/accessibility_action_browsertest.cc
@@ -375,7 +375,14 @@ EXPECT_EQ(x_step_4, x_before); } -IN_PROC_BROWSER_TEST_F(AccessibilityCanvasActionBrowserTest, CanvasGetImage) { +// Flaky on Mac https://crbug.com/1337760. +#if BUILDFLAG(IS_MAC) +#define MAYBE_CanvasGetImage DISABLED_CanvasGetImage +#else +#define MAYBE_CanvasGetImage CanvasGetImage +#endif +IN_PROC_BROWSER_TEST_F(AccessibilityCanvasActionBrowserTest, + MAYBE_CanvasGetImage) { LoadInitialAccessibilityTreeFromHtml(R"HTML( <body> <canvas aria-label="canvas" id="c" width="4" height="2">
diff --git a/content/browser/browser_task_traits_unittest.nc b/content/browser/browser_task_traits_unittest.nc index eb5137a..7b915dc 100644 --- a/content/browser/browser_task_traits_unittest.nc +++ b/content/browser/browser_task_traits_unittest.nc
@@ -15,7 +15,7 @@ constexpr base::TaskTraits traits = {BrowserThread::UI, BrowserThread::IO}; #elif defined(NCTEST_BROWSER_TASK_TRAITS_MULTIPLE_TASK_TYPES) // [r"The traits bag contains multiple traits of the same type."] -constexpr base::TaskTraits traits = {BrowserTaskType::kBootstrap, BrowserTaskType::kPreconnect}; +constexpr base::TaskTraits traits = {BrowserTaskType::kBootstrap, BrowserTaskType::kUserInput}; #endif
diff --git a/content/browser/media/capture/web_contents_video_capture_device_browsertest.cc b/content/browser/media/capture/web_contents_video_capture_device_browsertest.cc index c20c14b5..61f7349 100644 --- a/content/browser/media/capture/web_contents_video_capture_device_browsertest.cc +++ b/content/browser/media/capture/web_contents_video_capture_device_browsertest.cc
@@ -552,8 +552,14 @@ // whether the browser is running with software compositing or GPU-accelerated // compositing, whether the WebContents is visible/hidden or occluded/unoccluded // and whether the main document contains a cross-site iframe. +// Flaky on Mac https://crbug.com/1337765. +#if BUILDFLAG(IS_MAC) +#define MAYBE_CapturesContentChanges DISABLED_CapturesContentChanges +#else +#define MAYBE_CapturesContentChanges CapturesContentChanges +#endif IN_PROC_BROWSER_TEST_P(WebContentsVideoCaptureDeviceBrowserTestP, - CapturesContentChanges) { + MAYBE_CapturesContentChanges) { media::VideoPixelFormat specified_format = GetVideoPixelFormat(); media::VideoPixelFormat expected_format = specified_format; if (specified_format == media::VideoPixelFormat::PIXEL_FORMAT_UNKNOWN) {
diff --git a/content/browser/renderer_host/media/media_devices_dispatcher_host.cc b/content/browser/renderer_host/media/media_devices_dispatcher_host.cc index f6a1228d..e2c503ac 100644 --- a/content/browser/renderer_host/media/media_devices_dispatcher_host.cc +++ b/content/browser/renderer_host/media/media_devices_dispatcher_host.cc
@@ -170,25 +170,37 @@ } void MediaDevicesDispatcherHost::GetAllVideoInputDeviceFormats( - const std::string& device_id, + const std::string& hashed_device_id, GetAllVideoInputDeviceFormatsCallback client_callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); auto scoped_trace = ScopedMediaStreamTrace::CreateIfEnabled(__func__); - GetVideoInputDeviceFormats(device_id, false /* try_in_use_first */, - std::move(client_callback), - std::move(scoped_trace)); + base::PostTaskAndReplyWithResult( + GetUIThreadTaskRunner({}).get(), FROM_HERE, + base::BindOnce(media_stream_manager_->media_devices_manager() + ->salt_and_origin_callback(), + render_process_id_, render_frame_id_), + base::BindOnce(&MediaDevicesDispatcherHost::GetVideoInputDeviceFormats, + weak_factory_.GetWeakPtr(), hashed_device_id, + false /* try_in_use_first */, std::move(client_callback), + std::move(scoped_trace))); } void MediaDevicesDispatcherHost::GetAvailableVideoInputDeviceFormats( - const std::string& device_id, + const std::string& hashed_device_id, GetAvailableVideoInputDeviceFormatsCallback client_callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); auto scoped_trace = ScopedMediaStreamTrace::CreateIfEnabled(__func__); - GetVideoInputDeviceFormats(device_id, true /* try_in_use_first */, - std::move(client_callback), - std::move(scoped_trace)); + base::PostTaskAndReplyWithResult( + GetUIThreadTaskRunner({}).get(), FROM_HERE, + base::BindOnce(media_stream_manager_->media_devices_manager() + ->salt_and_origin_callback(), + render_process_id_, render_frame_id_), + base::BindOnce(&MediaDevicesDispatcherHost::GetVideoInputDeviceFormats, + weak_factory_.GetWeakPtr(), hashed_device_id, + true /* try_in_use_first */, std::move(client_callback), + std::move(scoped_trace))); } void MediaDevicesDispatcherHost::GetAudioInputCapabilities( @@ -393,63 +405,49 @@ } void MediaDevicesDispatcherHost::GetVideoInputDeviceFormats( - const std::string& device_id, + const std::string& hashed_device_id, bool try_in_use_first, GetVideoInputDeviceFormatsCallback client_callback, - std::unique_ptr<ScopedMediaStreamTrace> scoped_trace) { - if (scoped_trace) - scoped_trace->AddStep("GetSaltAndOrigin"); - DCHECK_CURRENTLY_ON(BrowserThread::IO); - base::PostTaskAndReplyWithResult( - GetUIThreadTaskRunner({}).get(), FROM_HERE, - base::BindOnce(media_stream_manager_->media_devices_manager() - ->salt_and_origin_callback(), - render_process_id_, render_frame_id_), - base::BindOnce( - &MediaDevicesDispatcherHost::EnumerateVideoDevicesForFormats, - weak_factory_.GetWeakPtr(), std::move(client_callback), device_id, - try_in_use_first, std::move(scoped_trace))); -} - -void MediaDevicesDispatcherHost::EnumerateVideoDevicesForFormats( - GetVideoInputDeviceFormatsCallback client_callback, - const std::string& device_id, - bool try_in_use_first, std::unique_ptr<ScopedMediaStreamTrace> scoped_trace, const MediaDeviceSaltAndOrigin& salt_and_origin) { DCHECK_CURRENTLY_ON(BrowserThread::IO); if (scoped_trace) scoped_trace->AddStep(__func__); - media_stream_manager_->video_capture_manager()->EnumerateDevices( + MediaStreamManager::SendMessageToNativeLog(base::StringPrintf( + "MDDH::GetVideoInputDeviceFormats({hashed_device_id=%s}, " + "{try_in_use_first=%s})", + hashed_device_id.c_str(), try_in_use_first ? "true" : "false")); + MediaStreamManager::GetMediaDeviceIDForHMAC( + blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE, + salt_and_origin.device_id_salt, salt_and_origin.origin, hashed_device_id, + base::SequencedTaskRunnerHandle::Get(), base::BindOnce( - &MediaDevicesDispatcherHost::FinalizeGetVideoInputDeviceFormats, - weak_factory_.GetWeakPtr(), std::move(client_callback), device_id, - try_in_use_first, salt_and_origin.device_id_salt, - salt_and_origin.origin, std::move(scoped_trace))); + &MediaDevicesDispatcherHost::GetVideoInputDeviceFormatsWithRawId, + weak_factory_.GetWeakPtr(), hashed_device_id, try_in_use_first, + std::move(client_callback), std::move(scoped_trace))); } -void MediaDevicesDispatcherHost::FinalizeGetVideoInputDeviceFormats( - GetVideoInputDeviceFormatsCallback client_callback, - const std::string& device_id, +void MediaDevicesDispatcherHost::GetVideoInputDeviceFormatsWithRawId( + const std::string& hashed_device_id, bool try_in_use_first, - const std::string& device_id_salt, - const url::Origin& security_origin, + GetVideoInputDeviceFormatsCallback client_callback, std::unique_ptr<ScopedMediaStreamTrace> scoped_trace, - const media::VideoCaptureDeviceDescriptors& device_descriptors) { + const absl::optional<std::string>& raw_id) { DCHECK_CURRENTLY_ON(BrowserThread::IO); if (scoped_trace) scoped_trace->AddStep(__func__); - for (const auto& descriptor : device_descriptors) { - if (DoesMediaDeviceIDMatchHMAC(device_id_salt, security_origin, device_id, - descriptor.device_id)) { - std::move(client_callback) - .Run(media_stream_manager_->media_devices_manager() - ->GetVideoInputFormats(descriptor.device_id, - try_in_use_first)); - return; - } + if (!raw_id) { + // TODO(https://crbug.com/1337706): return an error. + MediaStreamManager::SendMessageToNativeLog( + base::StringPrintf("MDDH::GetVideoInputDeviceFormats: Failed to find " + "raw device id for '%s'", + hashed_device_id.c_str())); + std::move(client_callback).Run(media::VideoCaptureFormats()); + return; } - std::move(client_callback).Run(media::VideoCaptureFormats()); + std::move(client_callback) + .Run(media_stream_manager_->media_devices_manager()->GetVideoInputFormats( + *raw_id, try_in_use_first)); } struct MediaDevicesDispatcherHost::AudioInputCapabilitiesRequest {
diff --git a/content/browser/renderer_host/media/media_devices_dispatcher_host.h b/content/browser/renderer_host/media/media_devices_dispatcher_host.h index 1f8d909..cab3cbef 100644 --- a/content/browser/renderer_host/media/media_devices_dispatcher_host.h +++ b/content/browser/renderer_host/media/media_devices_dispatcher_host.h
@@ -116,24 +116,18 @@ media::TypedScopedAsyncTrace<media::TraceCategory::kMediaStream>; void GetVideoInputDeviceFormats( - const std::string& device_id, + const std::string& hashed_device_id, bool try_in_use_first, GetVideoInputDeviceFormatsCallback client_callback, - std::unique_ptr<ScopedMediaStreamTrace> scoped_trace); - void EnumerateVideoDevicesForFormats( - GetVideoInputDeviceFormatsCallback client_callback, - const std::string& device_id, - bool try_in_use_first, std::unique_ptr<ScopedMediaStreamTrace> scoped_trace, const MediaDeviceSaltAndOrigin& salt_and_origin); - void FinalizeGetVideoInputDeviceFormats( - GetVideoInputDeviceFormatsCallback client_callback, - const std::string& device_id, + + void GetVideoInputDeviceFormatsWithRawId( + const std::string& hashed_device_id, bool try_in_use_first, - const std::string& device_id_salt, - const url::Origin& security_origin, + GetVideoInputDeviceFormatsCallback client_callback, std::unique_ptr<ScopedMediaStreamTrace> scoped_trace, - const media::VideoCaptureDeviceDescriptors& device_descriptors); + const absl::optional<std::string>& raw_id); void ReceivedBadMessage(int render_process_id, bad_message::BadMessageReason reason);
diff --git a/content/browser/renderer_host/media/media_devices_dispatcher_host_unittest.cc b/content/browser/renderer_host/media/media_devices_dispatcher_host_unittest.cc index 6347a635..882cf584 100644 --- a/content/browser/renderer_host/media/media_devices_dispatcher_host_unittest.cc +++ b/content/browser/renderer_host/media/media_devices_dispatcher_host_unittest.cc
@@ -158,6 +158,15 @@ {gfx::Size(1020, 780), 30.0, media::PIXEL_FORMAT_I420}, {gfx::Size(1920, 1080), 20.0, media::PIXEL_FORMAT_I420}, }; + expected_video_capture_formats_ = { + media::VideoCaptureFormat(gfx::Size(640, 480), 30.0, + media::PIXEL_FORMAT_I420), + media::VideoCaptureFormat(gfx::Size(800, 600), 30.0, + media::PIXEL_FORMAT_I420), + media::VideoCaptureFormat(gfx::Size(1020, 780), 30.0, + media::PIXEL_FORMAT_I420), + media::VideoCaptureFormat(gfx::Size(1920, 1080), 20.0, + media::PIXEL_FORMAT_I420)}; // A video device that does not report any formats fake_video_devices[1].device_id = kNoFormatsVideoDeviceID; ASSERT_TRUE(fake_video_devices[1].supported_formats.empty()); @@ -234,6 +243,11 @@ expected_set_capture_handle_config_->config = std::move(config); } + void ExpectVideoCaptureFormats( + const std::vector<media::VideoCaptureFormat>& formats) { + expected_video_capture_formats_ = formats; + } + void VideoInputCapabilitiesCallback( std::vector<blink::mojom::VideoInputDeviceCapabilitiesPtr> capabilities) { MockVideoInputCapabilitiesCallback(); @@ -290,15 +304,7 @@ void AvailableVideoInputDeviceFormatsCallback( const std::vector<media::VideoCaptureFormat>& formats) { MockAvailableVideoInputDeviceFormatsCallback(); - EXPECT_EQ(formats.size(), 4U); - EXPECT_EQ(formats[0], media::VideoCaptureFormat(gfx::Size(640, 480), 30.0, - media::PIXEL_FORMAT_I420)); - EXPECT_EQ(formats[1], media::VideoCaptureFormat(gfx::Size(800, 600), 30.0, - media::PIXEL_FORMAT_I420)); - EXPECT_EQ(formats[2], media::VideoCaptureFormat(gfx::Size(1020, 780), 30.0, - media::PIXEL_FORMAT_I420)); - EXPECT_EQ(formats[3], media::VideoCaptureFormat(gfx::Size(1920, 1080), 20.0, - media::PIXEL_FORMAT_I420)); + EXPECT_EQ(formats, expected_video_capture_formats_); } protected: @@ -497,6 +503,7 @@ }; absl::optional<ExpectedCaptureHandleConfig> expected_set_capture_handle_config_; + std::vector<media::VideoCaptureFormat> expected_video_capture_formats_; }; TEST_P(MediaDevicesDispatcherHostTest, EnumerateAudioInputDevices) { @@ -672,6 +679,40 @@ host_->SetCaptureHandleConfig(std::move(config)); } +TEST_P(MediaDevicesDispatcherHostTest, + GetAvailableVideoInputDeviceFormatsUnfoundDevice) { + base::RunLoop run_loop; + // Expect an empty list of supported formats for an unfound device. + ExpectVideoCaptureFormats({}); + EXPECT_CALL(*this, MockAvailableVideoInputDeviceFormatsCallback()) + .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); + MediaDeviceSaltAndOrigin salt_and_origin = + GetMediaDeviceSaltAndOrigin(-1, -1); + host_->GetAvailableVideoInputDeviceFormats( + "UnknownHashedDeviceId", + base::BindOnce(&MediaDevicesDispatcherHostTest:: + AvailableVideoInputDeviceFormatsCallback, + base::Unretained(this))); + run_loop.Run(); +} + +TEST_P(MediaDevicesDispatcherHostTest, + GetAllVideoInputDeviceFormatsUnfoundDevice) { + base::RunLoop run_loop; + // Expect an empty list of supported formats for an unfound device. + ExpectVideoCaptureFormats({}); + EXPECT_CALL(*this, MockAvailableVideoInputDeviceFormatsCallback()) + .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); + MediaDeviceSaltAndOrigin salt_and_origin = + GetMediaDeviceSaltAndOrigin(-1, -1); + host_->GetAllVideoInputDeviceFormats( + "UnknownHashedDeviceId", + base::BindOnce(&MediaDevicesDispatcherHostTest:: + AvailableVideoInputDeviceFormatsCallback, + base::Unretained(this))); + run_loop.Run(); +} + INSTANTIATE_TEST_SUITE_P(All, MediaDevicesDispatcherHostTest, testing::Values(std::string(), "https://test.com"));
diff --git a/content/browser/scheduler/browser_task_executor.cc b/content/browser/scheduler/browser_task_executor.cc index 38d037f3..79c7da3 100644 --- a/content/browser/scheduler/browser_task_executor.cc +++ b/content/browser/scheduler/browser_task_executor.cc
@@ -40,14 +40,6 @@ constexpr base::Feature kBrowserPrioritizeInputQueue{ "BrowserPrioritizeInputQueue", base::FEATURE_ENABLED_BY_DEFAULT}; -// When TreatPreconnectAsDefault is enabled, the browser will execute tasks with -// the kPreconnect task type on the default task queues (based on priority of -// the task) rather than a dedicated high-priority task queue. Intended to -// evaluate the impact of the already-launched prioritization of preconnect -// tasks (crbug.com/1257582). -const base::Feature kTreatPreconnectTaskTypeAsDefault{ - "TreatPreconnectAsDefault", base::FEATURE_DISABLED_BY_DEFAULT}; - } // namespace features namespace { @@ -154,17 +146,6 @@ // Note we currently ignore the priority for bootstrap tasks. return QueueType::kBootstrap; - case BrowserTaskType::kPreconnect: - if (base::FeatureList::IsEnabled( - features::kTreatPreconnectTaskTypeAsDefault)) { - // Defer to traits.priority() below rather than executing this task on - // the dedicated preconnect queue. - break; - } - - // Note we currently ignore the priority for preconnection tasks. - return QueueType::kPreconnection; - case BrowserTaskType::kUserInput: if (base::FeatureList::IsEnabled( features::kBrowserPrioritizeInputQueue)) {
diff --git a/content/browser/scheduler/browser_task_executor_unittest.cc b/content/browser/scheduler/browser_task_executor_unittest.cc index 1ce9b6d..2786a15 100644 --- a/content/browser/scheduler/browser_task_executor_unittest.cc +++ b/content/browser/scheduler/browser_task_executor_unittest.cc
@@ -123,7 +123,7 @@ TEST_F(BrowserTaskExecutorTest, GetTaskRunnerWithBrowserTaskTraits) { StrictMockTask task_1; - GetUIThreadTaskRunner({BrowserTaskType::kPreconnect}) + GetUIThreadTaskRunner({BrowserTaskType::kUserInput}) ->PostTask(FROM_HERE, task_1.Get()); EXPECT_CALL(task_1, Run); @@ -154,8 +154,6 @@ QueueType::kUserBlocking); EXPECT_EQ(BrowserTaskExecutor::GetQueueType({BrowserTaskType::kDefault}), QueueType::kUserBlocking); - EXPECT_EQ(BrowserTaskExecutor::GetQueueType({BrowserTaskType::kPreconnect}), - QueueType::kPreconnection); EXPECT_EQ(BrowserTaskExecutor::GetQueueType( {BrowserTaskType::kServiceWorkerStorageControlResponse}), QueueType::kServiceWorkerStorageControlResponse);
diff --git a/content/browser/scheduler/browser_task_queues.cc b/content/browser/scheduler/browser_task_queues.cc index d421ee8..782983a0 100644 --- a/content/browser/scheduler/browser_task_queues.cc +++ b/content/browser/scheduler/browser_task_queues.cc
@@ -56,8 +56,6 @@ return "ui_best_effort_tq"; case BrowserTaskQueues::QueueType::kBootstrap: return "ui_bootstrap_tq"; - case BrowserTaskQueues::QueueType::kPreconnection: - return "ui_preconnection_tq"; case BrowserTaskQueues::QueueType::kDefault: return "ui_default_tq"; case BrowserTaskQueues::QueueType::kUserBlocking: @@ -79,8 +77,6 @@ return "io_best_effort_tq"; case BrowserTaskQueues::QueueType::kBootstrap: return "io_bootstrap_tq"; - case BrowserTaskQueues::QueueType::kPreconnection: - return "io_preconnection_tq"; case BrowserTaskQueues::QueueType::kDefault: return "io_default_tq"; case BrowserTaskQueues::QueueType::kUserBlocking: @@ -123,12 +119,6 @@ return ""; } -// When GivePreconnectTasksHighestPriority is enabled, the browser will give the -// dedicated preconnect task queue highest priority rather than its default high -// priority. -const base::Feature kGivePreconnectTasksHighestPriority{ - "GivePreconnectTasksHighestPriority", base::FEATURE_DISABLED_BY_DEFAULT}; - } // namespace BrowserTaskQueues::Handle::~Handle() = default; @@ -245,17 +235,6 @@ // feature is enabled (see browser_task_executor.cc). GetBrowserTaskQueue(QueueType::kBootstrap) ->SetQueuePriority(QueuePriority::kHighestPriority); - - // Preconnection tasks are also important during startup so prioritize this - // queue too. NOTE: This queue will not be used if the - // |kTreatPreconnectAsDefault| feature is enabled (see - // browser_task_executor.cc). - QueuePriority preconnect_queue_priority = - (base::FeatureList::IsEnabled(kGivePreconnectTasksHighestPriority)) - ? QueuePriority::kHighestPriority - : QueuePriority::kHighPriority; - GetBrowserTaskQueue(QueueType::kPreconnection) - ->SetQueuePriority(preconnect_queue_priority); } void BrowserTaskQueues::OnStartupComplete() {
diff --git a/content/browser/scheduler/browser_task_queues.h b/content/browser/scheduler/browser_task_queues.h index b9a2e40..2b89aa6c 100644 --- a/content/browser/scheduler/browser_task_queues.h +++ b/content/browser/scheduler/browser_task_queues.h
@@ -51,9 +51,6 @@ // For tasks on the critical path up to issuing the initial navigation. kBootstrap, - // For preconnection-related tasks. - kPreconnection, - // base::TaskPriority::kUserBlocking maps to this task queue. It's for tasks // that affect the UI immediately after a user interaction. Has the same // priority as kDefault.
diff --git a/content/public/browser/browser_task_traits.h b/content/public/browser/browser_task_traits.h index 08973d3..eedd5e3 100644 --- a/content/public/browser/browser_task_traits.h +++ b/content/public/browser/browser_task_traits.h
@@ -36,9 +36,6 @@ // Critical startup tasks. kBootstrap, - // A subset of network tasks related to preconnection. - kPreconnect, - // A subset of tasks related to user input. kUserInput,
diff --git a/content/test/data/accessibility/aria/aria-errormessage-expected-uia-win.txt b/content/test/data/accessibility/aria/aria-errormessage-expected-uia-win.txt new file mode 100644 index 0000000..9ea44b767 --- /dev/null +++ b/content/test/data/accessibility/aria/aria-errormessage-expected-uia-win.txt
@@ -0,0 +1,11 @@ +Document +++Group IsControlElement=false +++++Edit Name='Invalid is true' ControllerFor='{region}' +++++Edit Name='Invalid is false' +++++Edit Name='Invalid is not set' +++Group IsControlElement=false +++++Text Name='Error for invalid input' +++Group IsControlElement=false +++++Text Name='Error for input which is not invalid' +++Group IsControlElement=false +++++Text Name='Error for input with invalid not set' \ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-errormessage.html b/content/test/data/accessibility/aria/aria-errormessage.html index bfa2ba1..a4169210 100644 --- a/content/test/data/accessibility/aria/aria-errormessage.html +++ b/content/test/data/accessibility/aria/aria-errormessage.html
@@ -2,6 +2,7 @@ @AURALINUX-DENY:selectable-text* @BLINK-ALLOW:error* @WIN-ALLOW:n_relations* +@UIA-WIN-ALLOW:ControllerFor* --> <!DOCTYPE html> <html>
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt index a774660..9a17d9a3 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -859,6 +859,8 @@ crbug.com/1328444 [ chromeos chromeos-board-kevin ] conformance2/rendering/blitframebuffer-resolve-to-back-buffer.html [ Failure ] crbug.com/1328444 [ chromeos chromeos-board-kevin ] conformance2/textures/misc/tex-input-validation.html [ Failure ] +crbug.com/1337803 [ chromeos chromeos-board-kevin ] conformance2/misc/expando-loss-2.html [ Failure ] + ############################## # Lacros-like Linux Failures # ##############################
diff --git a/gpu/command_buffer/service/shared_image_backing_ozone.cc b/gpu/command_buffer/service/shared_image_backing_ozone.cc index 71b97996..c634715 100644 --- a/gpu/command_buffer/service/shared_image_backing_ozone.cc +++ b/gpu/command_buffer/service/shared_image_backing_ozone.cc
@@ -448,8 +448,20 @@ << "Unexpected write stream: " << static_cast<int>(access_stream) << ", " << static_cast<int>(last_write_stream_) << ", " << write_streams_count_; - // Always need end fence for writes. - need_end_fence = true; + // Always need end fence for multiple write streams. For single write stream + // need an end fence for all usages except for raster using delegated + // compositing. If the image will be used for delegated compositing, no need + // to put fences at this moment as there are many raster tasks in the CPU gl + // context that end up creating a big number of fences, which may have some + // performance overhead depending on the gpu. Instead, when these images + // will be scheduled as overlays, a single fence will be created. + // TODO(crbug.com/1254033): this block of code shall be removed after cc is + // able to set a single (duplicated) fence for bunch of tiles instead of + // having the SI framework creating fences for each single message when + // write access ends. + need_end_fence = + (write_streams_count_ > 1) || + !(usage() & SHARED_IMAGE_USAGE_RASTER_DELEGATED_COMPOSITING); } return true;
diff --git a/gpu/command_buffer/service/shared_image_factory.cc b/gpu/command_buffer/service/shared_image_factory.cc index 4603af0a..d89fc826 100644 --- a/gpu/command_buffer/service/shared_image_factory.cc +++ b/gpu/command_buffer/service/shared_image_factory.cc
@@ -59,7 +59,7 @@ #include "gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.h" #elif BUILDFLAG(IS_MAC) #include "gpu/command_buffer/service/shared_image_backing_factory_iosurface.h" -#elif BUILDFLAG(IS_CHROMEOS_ASH) +#elif BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) #include "gpu/command_buffer/service/shared_image_backing_factory_ozone.h" #endif @@ -404,7 +404,7 @@ factories_.push_back(std::move(external_vk_image_factory)); } vulkan_context_provider_ = context_state->vk_context_provider(); -#elif BUILDFLAG(IS_CHROMEOS_ASH) +#elif BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) auto ozone_factory = std::make_unique<SharedImageBackingFactoryOzone>( context_state, workarounds); factories_.push_back(std::move(ozone_factory));
diff --git a/infra/config/subprojects/chromium/ci/chromium.angle.star b/infra/config/subprojects/chromium/ci/chromium.angle.star index 4d50a29..7ab4376 100644 --- a/infra/config/subprojects/chromium/ci/chromium.angle.star +++ b/infra/config/subprojects/chromium/ci/chromium.angle.star
@@ -11,7 +11,8 @@ builder_group = "chromium.angle", executable = "recipe:angle_chromium", execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - goma_backend = goma.backend.RBE_PROD, + reclient_instance = rbe_instance.DEFAULT, + reclient_jobs = rbe_jobs.DEFAULT, pool = ci.gpu.POOL, properties = { "perf_dashboard_machine_group": "ChromiumANGLE", @@ -41,9 +42,6 @@ category = "Android|Builder|ANGLE", short_name = "arm64", ), - goma_backend = None, - reclient_instance = rbe_instance.DEFAULT, - reclient_jobs = rbe_jobs.DEFAULT, ) ci.thin_tester( @@ -61,9 +59,6 @@ category = "Android|Builder|Chromium", short_name = "arm64", ), - goma_backend = None, - reclient_instance = rbe_instance.DEFAULT, - reclient_jobs = rbe_jobs.DEFAULT, ) ci.thin_tester( @@ -81,6 +76,8 @@ category = "Fuchsia|Builder|ANGLE", short_name = "x64", ), + goma_backend = goma.backend.RBE_PROD, + reclient_instance = None, ) ci.gpu.linux_builder( @@ -89,9 +86,6 @@ category = "Linux|Builder|ANGLE", short_name = "x64", ), - goma_backend = None, - reclient_instance = rbe_instance.DEFAULT, - reclient_jobs = rbe_jobs.DEFAULT, ) ci.thin_tester( @@ -118,9 +112,6 @@ category = "Linux|Builder|Chromium", short_name = "x64", ), - goma_backend = None, - reclient_instance = rbe_instance.DEFAULT, - reclient_jobs = rbe_jobs.DEFAULT, ) ci.thin_tester( @@ -147,6 +138,8 @@ category = "Mac|Builder|Chromium", short_name = "x64", ), + goma_backend = goma.backend.RBE_PROD, + reclient_instance = None, ) ci.thin_tester( @@ -174,6 +167,8 @@ category = "iOS|Builder|ANGLE", short_name = "x64", ), + goma_backend = goma.backend.RBE_PROD, + reclient_instance = None, ) ci.thin_tester( @@ -191,9 +186,7 @@ category = "Windows|Builder|Chromium", short_name = "x64", ), - goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) ci.thin_tester( @@ -220,9 +213,7 @@ category = "Windows|Builder|Chromium", short_name = "x86", ), - goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) ci.gpu.windows_builder( @@ -231,9 +222,7 @@ category = "Windows|Builder|ANGLE", short_name = "x64", ), - goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) ci.thin_tester(
diff --git a/infra/config/subprojects/chromium/ci/chromium.dawn.star b/infra/config/subprojects/chromium/ci/chromium.dawn.star index 711789c..05c9511 100644 --- a/infra/config/subprojects/chromium/ci/chromium.dawn.star +++ b/infra/config/subprojects/chromium/ci/chromium.dawn.star
@@ -13,7 +13,8 @@ builder_group = "chromium.dawn", executable = ci.DEFAULT_EXECUTABLE, execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - goma_backend = goma.backend.RBE_PROD, + reclient_jobs = rbe_jobs.DEFAULT, + reclient_instance = rbe_instance.DEFAULT, pool = ci.gpu.POOL, service_account = ci.gpu.SERVICE_ACCOUNT, thin_tester_cores = 2, @@ -43,9 +44,6 @@ category = "ToT|Linux|Builder", short_name = "x64", ), - goma_backend = None, - reclient_jobs = rbe_jobs.DEFAULT, - reclient_instance = rbe_instance.DEFAULT, ) ci.gpu.linux_builder( @@ -75,9 +73,6 @@ short_name = "x64", ), cq_mirrors_console_view = "mirrors", - goma_backend = None, - reclient_jobs = rbe_jobs.DEFAULT, - reclient_instance = rbe_instance.DEFAULT, ) ci.thin_tester( @@ -160,6 +155,8 @@ category = "ToT|Mac|Builder", short_name = "x64", ), + goma_backend = goma.backend.RBE_PROD, + reclient_instance = None, ) ci.gpu.mac_builder( @@ -186,6 +183,8 @@ short_name = "x64", ), cq_mirrors_console_view = "mirrors", + goma_backend = goma.backend.RBE_PROD, + reclient_instance = None, ) # Note that the Mac testers are all thin Linux VMs, triggering jobs on the @@ -290,9 +289,7 @@ category = "ToT|Windows|ASAN", short_name = "x64", ), - goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) ci.gpu.windows_builder( @@ -301,9 +298,7 @@ category = "ToT|Windows|Builder", short_name = "x64", ), - goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) ci.gpu.windows_builder( @@ -330,9 +325,7 @@ short_name = "x64", ), cq_mirrors_console_view = "mirrors", - goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) # Note that the Win testers are all thin Linux VMs, triggering jobs on the @@ -417,9 +410,7 @@ category = "ToT|Windows|Builder", short_name = "x86", ), - goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) ci.gpu.windows_builder( @@ -446,9 +437,7 @@ short_name = "x86", ), cq_mirrors_console_view = "mirrors", - goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) # Note that the Win testers are all thin Linux VMs, triggering jobs on the
diff --git a/infra/config/subprojects/chromium/ci/chromium.swangle.star b/infra/config/subprojects/chromium/ci/chromium.swangle.star index 58e3432..871b030 100644 --- a/infra/config/subprojects/chromium/ci/chromium.swangle.star +++ b/infra/config/subprojects/chromium/ci/chromium.swangle.star
@@ -11,6 +11,8 @@ builder_group = "chromium.swangle", executable = "recipe:angle_chromium", execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, + reclient_instance = rbe_instance.DEFAULT, + reclient_jobs = rbe_jobs.DEFAULT, pool = ci.gpu.POOL, service_account = ci.gpu.SERVICE_ACCOUNT, sheriff_rotations = sheriff_rotations.CHROMIUM_GPU, @@ -39,9 +41,7 @@ short_name = "x64", ), executable = ci.DEFAULT_EXECUTABLE, - goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) ci.gpu.linux_builder( @@ -50,9 +50,7 @@ category = "ToT SwiftShader|Linux", short_name = "x64", ), - goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) ci.gpu.linux_builder( @@ -62,9 +60,7 @@ short_name = "x64", ), executable = ci.DEFAULT_EXECUTABLE, - goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) ci.gpu.mac_builder( @@ -75,6 +71,7 @@ ), executable = ci.DEFAULT_EXECUTABLE, goma_backend = goma.backend.RBE_PROD, + reclient_instance = None, ) ci.gpu.windows_builder( @@ -84,9 +81,7 @@ short_name = "x86", ), executable = ci.DEFAULT_EXECUTABLE, - goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) ci.gpu.windows_builder( @@ -95,9 +90,7 @@ category = "ToT SwiftShader|Windows", short_name = "x64", ), - goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) ci.gpu.windows_builder( @@ -106,9 +99,7 @@ category = "ToT SwiftShader|Windows", short_name = "x86", ), - goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) ci.gpu.windows_builder( @@ -118,9 +109,7 @@ short_name = "x64", ), executable = ci.DEFAULT_EXECUTABLE, - goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, ) ci.gpu.windows_builder( @@ -130,7 +119,5 @@ short_name = "x86", ), executable = ci.DEFAULT_EXECUTABLE, - goma_backend = None, reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI, - reclient_instance = rbe_instance.DEFAULT, )
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index d1dc984..6cfa873 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -107,7 +107,7 @@ <translation id="1753905327828125965">Mest besøkt</translation> <translation id="1803264062614276815">Kortinnehaverens navn</translation> <translation id="1809939268435598390">Slett mappen</translation> -<translation id="1813414402673211292">Slett nettleserdata</translation> +<translation id="1813414402673211292">Slett nettlesingsdata</translation> <translation id="1815941218935345331">Sikkerhetskode</translation> <translation id="1820259098641718022">Lagt til i leselisten</translation> <translation id="1832848789136765277">For å sikre at du alltid har tilgang til de synkroniserte dataene dine, må du bekrefte at det er deg</translation> @@ -588,7 +588,7 @@ <translation id="6012140227487808125">Krypterer …</translation> <translation id="6021332621416007159">Åpne i…</translation> <translation id="6027945736510816438">Mente du <ph name="WEBSITE" />?</translation> -<translation id="6036215966221662377">Slett nettleserdata</translation> +<translation id="6036215966221662377">Slett nettlesingsdata</translation> <translation id="6036514205982097558">Alle fanene dine i én nettleser</translation> <translation id="6039429417015973673"><ph name="TITLE" />, <ph name="PUBLISHER_INFORMATION" />, <ph name="PUBLICATION_DATE" /></translation> <translation id="6040143037577758943">Lukk</translation>
diff --git a/ios/chrome/browser/autofill/automation/automation_action.mm b/ios/chrome/browser/autofill/automation/automation_action.mm index 260c1e0..c30351e3 100644 --- a/ios/chrome/browser/autofill/automation/automation_action.mm +++ b/ios/chrome/browser/autofill/automation/automation_action.mm
@@ -202,7 +202,7 @@ // Calling WebViewTapElement right after WebViewScrollElement caused flaky // issues with the wrong location being provided for the tap target, // seemingly caused by the screen not redrawing in-between these two actions. - // We force a brief wait here to avoid this issue. |waitWithTimeout| requires + // We force a brief wait here to avoid this issue. `waitWithTimeout` requires // its result to be used. Void the result as it's always false. (void)[[GREYCondition conditionWithName:@"forced wait to allow for redraw" block:^BOOL {
diff --git a/ios/chrome/browser/browser_state_metrics/browser_state_metrics.h b/ios/chrome/browser/browser_state_metrics/browser_state_metrics.h index d54fb225..a734ed9 100644 --- a/ios/chrome/browser/browser_state_metrics/browser_state_metrics.h +++ b/ios/chrome/browser/browser_state_metrics/browser_state_metrics.h
@@ -14,8 +14,8 @@ } // namespace profile_metrics // Counts and returns summary information about the browser states currently in -// the |manager|. This information is returned in the output variable -// |counts|. Assumes that all field of |counts| are set to zero before the call. +// the `manager`. This information is returned in the output variable +// `counts`. Assumes that all field of `counts` are set to zero before the call. bool CountBrowserStateInformation(ios::ChromeBrowserStateManager* manager, profile_metrics::Counts* counts);
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index c5a5af4..74d422548 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -919,10 +919,6 @@ flag_descriptions::kEnableSuggestionsScrollingOnIPadName, flag_descriptions::kEnableSuggestionsScrollingOnIPadDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kEnableSuggestionsScrollingOnIPad)}, - {"enable-expkit-apple-calendar", - flag_descriptions::kEnableExpKitAppleCalendarName, - flag_descriptions::kEnableExpKitAppleCalendarDescription, flags_ui::kOsIos, - FEATURE_VALUE_TYPE(kEnableExpKitAppleCalendar)}, {"experience-kit-calendar", flag_descriptions::kCalendarExperienceKitName, flag_descriptions::kCalendarExperienceKitDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kCalendarExperienceKit)},
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index bf6cce7..89035f9 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -128,12 +128,6 @@ "This flag is used to change the string of the action allowing the user to " "bookmark a page from the overflow menu."; -const char kEnableExpKitAppleCalendarName[] = - "Enable Add Apple Calendar Events from long pressing dates"; -const char kEnableExpKitAppleCalendarDescription[] = - "When enabled, Experience Kit Calendar suggest the use of the Apple " - "Calendar via the context menu"; - extern const char kCalendarExperienceKitName[] = "Experience Kit Calendar"; extern const char kCalendarExperienceKitDescription[] = "When enabled, long pressing on dates will trigger Experience Kit Calendar "
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index df0e205..7a1b1366 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -109,11 +109,6 @@ extern const char kBookmarkStringName[]; extern const char kBookmarkStringDescription[]; -// Title and description for the flag to enable the use of apple calendar in -// experience kit calendar. -extern const char kEnableExpKitAppleCalendarName[]; -extern const char kEnableExpKitAppleCalendarDescription[]; - // Title and description for the flag to enable experience kit calendar events. extern const char kCalendarExperienceKitName[]; extern const char kCalendarExperienceKitDescription[];
diff --git a/ios/chrome/browser/ui/elements/activity_overlay_coordinator.mm b/ios/chrome/browser/ui/elements/activity_overlay_coordinator.mm index 018d55d0..a4761fb 100644 --- a/ios/chrome/browser/ui/elements/activity_overlay_coordinator.mm +++ b/ios/chrome/browser/ui/elements/activity_overlay_coordinator.mm
@@ -31,6 +31,8 @@ addSubview:self.activityOverlayViewController.view]; [self.activityOverlayViewController didMoveToParentViewController:self.baseViewController]; + self.activityOverlayViewController.view + .translatesAutoresizingMaskIntoConstraints = NO; AddSameConstraints(self.baseViewController.view, self.activityOverlayViewController.view); }
diff --git a/services/tracing/public/cpp/perfetto/perfetto_config.cc b/services/tracing/public/cpp/perfetto/perfetto_config.cc index ed84fbec..cb9bbf9 100644 --- a/services/tracing/public/cpp/perfetto/perfetto_config.cc +++ b/services/tracing/public/cpp/perfetto/perfetto_config.cc
@@ -72,6 +72,7 @@ te_cfg.add_enabled_categories(disabled); } te_cfg.set_enable_thread_time_sampling(true); + te_cfg.set_timestamp_unit_multiplier(1000); source_config->set_track_event_config_raw(te_cfg.SerializeAsString()); } #endif // BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc b/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc index 51e4c55..76b4920 100644 --- a/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc +++ b/services/tracing/public/cpp/perfetto/trace_event_data_source_unittest.cc
@@ -267,7 +267,7 @@ const perfetto::protos::TracePacket* GetFinalizedPacket(size_t packet_index) { auto& packets = GetFinalizedPackets(); - EXPECT_GT(packets.size(), packet_index); + CHECK(packet_index < packets.size()); return packets.at(packet_index).get(); } @@ -345,15 +345,12 @@ packet->trace_packet_defaults().track_event_defaults().track_uuid(), 0u); - // TODO(skyostil): Add support for thread ticks. -#if !BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY) if (base::ThreadTicks::IsSupported()) { EXPECT_GT(packet->trace_packet_defaults() .track_event_defaults() .extra_counter_track_uuids_size(), 0); } -#endif // !BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY) default_track_uuid_ = packet->trace_packet_defaults().track_event_defaults().track_uuid(); @@ -457,10 +454,7 @@ EXPECT_EQ(packet->track_descriptor().counter().type(), perfetto::protos::CounterDescriptor::COUNTER_THREAD_TIME_NS); - // TODO(mohitms): Support/enable microsecond thread time counters. -#if !BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY) EXPECT_EQ(packet->track_descriptor().counter().unit_multiplier(), 1000u); -#endif } void ExpectProcessTrack(const perfetto::protos::TracePacket* packet, @@ -1610,8 +1604,8 @@ /*absolute_timestamp=*/10, /*tid_override=*/0); } +// TODO(b/236578755) #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY) -// TODO(skyostil): Add support for thread time. #define MAYBE_ExplicitThreadTimeForDifferentThread \ DISABLED_ExplicitThreadTimeForDifferentThread #else
diff --git a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc index a846e65..db24363 100644 --- a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc +++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc
@@ -88,6 +88,10 @@ // Pointer to the main thread instance, if any. TracingSamplerProfiler* g_main_thread_instance = nullptr; +class TracingSamplerProfilerDataSource; + +TracingSamplerProfilerDataSource* g_sampler_profiler_ds_for_test = nullptr; + class TracingSamplerProfilerDataSource : public PerfettoTracedProcess::DataSourceBase { public: @@ -96,18 +100,6 @@ return instance.get(); } - TracingSamplerProfilerDataSource() - : DataSourceBase(mojom::kSamplerProfilerSourceName) { - PerfettoTracedProcess::Get()->AddDataSource(this); -#if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY) - perfetto::DataSourceDescriptor dsd; - dsd.set_name(mojom::kSamplerProfilerSourceName); - DataSourceProxy::Register(dsd, this); -#endif - } - - ~TracingSamplerProfilerDataSource() override { NOTREACHED(); } - void RegisterProfiler(TracingSamplerProfiler* profiler) { base::AutoLock lock(lock_); if (!profilers_.insert(profiler).second) { @@ -232,7 +224,33 @@ PerfettoTracedProcess::DataSourceProxy<TracingSamplerProfilerDataSource>; #endif + static void ResetForTesting() { + if (!g_sampler_profiler_ds_for_test) + return; + g_sampler_profiler_ds_for_test->~TracingSamplerProfilerDataSource(); + new (g_sampler_profiler_ds_for_test) TracingSamplerProfilerDataSource; + } + private: + friend class base::NoDestructor<TracingSamplerProfilerDataSource>; + + TracingSamplerProfilerDataSource() + : DataSourceBase(mojom::kSamplerProfilerSourceName) { + PerfettoTracedProcess::Get()->AddDataSource(this); +#if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY) + perfetto::DataSourceDescriptor dsd; + dsd.set_name(mojom::kSamplerProfilerSourceName); + DataSourceProxy::Register(dsd, this); +#endif + g_sampler_profiler_ds_for_test = this; + } + + ~TracingSamplerProfilerDataSource() override { + // Unreachable because of static instance of type `base::NoDestructor<>` + // and private ctr. + // Reachable only in case of test mode. See `ResetForTesting()`. + } + // TODO(eseckler): Use GUARDED_BY annotations for all members below. base::Lock lock_; // Protects subsequent members. raw_ptr<tracing::PerfettoProducer> producer_ GUARDED_BY(lock_) = nullptr; @@ -718,6 +736,11 @@ } // static +void TracingSamplerProfiler::ResetDataSourceForTesting() { + TracingSamplerProfilerDataSource::Get()->ResetForTesting(); +} + +// static void TracingSamplerProfiler::RegisterDataSource() { PerfettoTracedProcess::Get()->AddDataSource( TracingSamplerProfilerDataSource::Get());
diff --git a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h index 6e9d52e..517b9de3 100644 --- a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h +++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h
@@ -186,6 +186,7 @@ static void StartTracingForTesting(tracing::PerfettoProducer* producer); static void StopTracingForTesting(); static void MangleModuleIDIfNeeded(std::string* module_id); + static void ResetDataSourceForTesting(); // Returns whether of not the sampler profiling is able to unwind the stack // on this platform.
diff --git a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc index d6054546..ef8fb5c1 100644 --- a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc +++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler_unittest.cc
@@ -113,7 +113,7 @@ #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY) PerfettoTracedProcess::GetTaskRunner()->ResetTaskRunnerForTesting( base::ThreadTaskRunnerHandle::Get()); - TraceEventDataSource::GetInstance()->ResetForTesting(); + TracingSamplerProfiler::ResetDataSourceForTesting(); #else auto perfetto_wrapper = std::make_unique<base::tracing::PerfettoTaskRunner>( base::ThreadTaskRunnerHandle::Get());
diff --git a/styleguide/c++/c++-features.md b/styleguide/c++/c++-features.md index d546b42..eb739f4 100644 --- a/styleguide/c++/c++-features.md +++ b/styleguide/c++/c++-features.md
@@ -38,6 +38,7 @@ features below * absl::StatusOr: Initially supported September 3, 2020 * absl::Cleanup: Initially supported February 4, 2021 + * absl::AnyInvocable: Initially supported June 20, 2022 [TOC] @@ -1796,6 +1797,23 @@ See the top of this page on how to propose moving a feature from this list into the allowed or banned sections. +### AnyInvocable <sup>[tbd]</sup> + +```c++ +absl::AnyInvocable +``` + +**Description:** An equivalent of the C++23 std::move_only_function. + +**Documentation:** +* [any_invocable.h](https://source.chromium.org/chromium/chromium/src/+/main:third_party/abseil-cpp/absl/functional/any_invocable.h) +* [std::move_only_function](https://en.cppreference.com/w/cpp/utility/functional/move_only_function/move_only_function) + +**Notes:** +*** promo +Overlaps with `base::RepeatingCallback`, `base::OnceCallback`. +*** + ### bind_front <sup>[tbd]</sup> ```c++
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 14e80c8..7cdef271c 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -4449,6 +4449,21 @@ ] } ], + "IOSExpKitCalendar": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "CalendarExperienceKit" + ] + } + ] + } + ], "IOSFastApplicationWillTerminate": [ { "platforms": [ @@ -6629,29 +6644,6 @@ ] } ], - "PreconnectPriorities": [ - { - "platforms": [ - "android", - "chromeos", - "chromeos_lacros", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "StandaloneHighestPriorityQ", - "enable_features": [ - "GivePreconnectTasksHighestPriority" - ], - "disable_features": [ - "TreatPreconnectAsDefault" - ] - } - ] - } - ], "PreconnectToSearchDesktop": [ { "platforms": [ @@ -7813,7 +7805,7 @@ { "name": "ShrinkLogo", "params": { - "ReturnToStartSurfaceInactiveDurationInSeconds": "43200", + "ReturnToStartSurfaceInactiveDurationInSeconds": "21600", "show_return_to_recent_tab": "true", "shrink_logo": "true" },
diff --git a/third_party/abseil-cpp/BUILD.gn b/third_party/abseil-cpp/BUILD.gn index 9b9220a2..d8b65013 100644 --- a/third_party/abseil-cpp/BUILD.gn +++ b/third_party/abseil-cpp/BUILD.gn
@@ -72,6 +72,7 @@ "//third_party/abseil-cpp/absl/debugging:failure_signal_handler", "//third_party/abseil-cpp/absl/debugging:stacktrace", "//third_party/abseil-cpp/absl/debugging:symbolize", + "//third_party/abseil-cpp/absl/functional:any_invocable", "//third_party/abseil-cpp/absl/functional:bind_front", "//third_party/abseil-cpp/absl/functional:function_ref", "//third_party/abseil-cpp/absl/hash", @@ -191,6 +192,7 @@ "absl/container:inlined_vector_test", "absl/container:node_slot_policy_test", "absl/container:sample_element_size_test", + "absl/functional:any_invocable_test", "absl/hash:hash_test", "absl/hash:low_level_hash_test", "absl/memory:memory_test", @@ -199,6 +201,7 @@ "absl/profiling:periodic_sampler_test", "absl/status:statusor_test", "absl/strings:ascii_test", + "absl/strings:cord_buffer_test", "absl/strings:cord_data_edge_test", "absl/strings:cord_rep_btree_navigator_test", "absl/strings:cord_rep_btree_reader_test", @@ -207,7 +210,6 @@ "absl/strings:cordz_functions_test", "absl/strings:cordz_info_statistics_test", "absl/strings:cordz_info_test", - "absl/strings:cord_buffer_test", "absl/strings:cordz_test", "absl/strings:cordz_update_scope_test", "absl/strings:cordz_update_tracker_test",
diff --git a/third_party/abseil-cpp/CMake/AbseilDll.cmake b/third_party/abseil-cpp/CMake/AbseilDll.cmake index f81cb0a..00cddb8 100644 --- a/third_party/abseil-cpp/CMake/AbseilDll.cmake +++ b/third_party/abseil-cpp/CMake/AbseilDll.cmake
@@ -109,9 +109,11 @@ "debugging/internal/symbolize.h" "debugging/internal/vdso_support.cc" "debugging/internal/vdso_support.h" + "functional/any_invocable.h" "functional/internal/front_binder.h" "functional/bind_front.h" "functional/function_ref.h" + "functional/internal/any_invocable.h" "functional/internal/function_ref.h" "hash/hash.h" "hash/internal/city.h" @@ -388,6 +390,7 @@ "kernel_timeout_internal" "synchronization" "thread_pool" + "any_invocable" "bind_front" "function_ref" "atomic_hook"
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium index 4680f42..898355f1 100644 --- a/third_party/abseil-cpp/README.chromium +++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@ License: Apache 2.0 License File: LICENSE Version: 0 -Revision: 2e36d96669b0f56eaf865245c7bcf8060963a088 +Revision: d2c5297a3c3948de765100cb7e5cccca1210d23c Security Critical: yes Description:
diff --git a/third_party/abseil-cpp/WORKSPACE b/third_party/abseil-cpp/WORKSPACE index 1a1753a..4469644 100644 --- a/third_party/abseil-cpp/WORKSPACE +++ b/third_party/abseil-cpp/WORKSPACE
@@ -20,11 +20,21 @@ # GoogleTest/GoogleMock framework. Used by most unit-tests. http_archive( - name = "com_google_googletest", # 2022-01-28T15:27:11Z - sha256 = "eb70a6d4520f940956a6b3e37d205d92736bb104c6a1b2b9f82bfc41bd7a2b34", - strip_prefix = "googletest-28e1da21d8d677bc98f12ccc7fc159ff19e8e817", + name = "com_google_googletest", # 2022-06-16T20:18:32Z + sha256 = "a1d3123179024258f9c399d45da3e0b09c4aaf8d2c041466ce5b4793a8929f23", + strip_prefix = "googletest-86add13493e5c881d7e4ba77fb91c1f57752b3a4", # Keep this URL in sync with ABSL_GOOGLETEST_COMMIT in ci/cmake_common.sh. - urls = ["https://github.com/google/googletest/archive/28e1da21d8d677bc98f12ccc7fc159ff19e8e817.zip"], + urls = ["https://github.com/google/googletest/archive/86add13493e5c881d7e4ba77fb91c1f57752b3a4.zip"], +) + +# RE2 (the regular expression library used by GoogleTest) +# Note this must use a commit from the `abseil` branch of the RE2 project. +# https://github.com/google/re2/tree/abseil +http_archive( + name = "com_googlesource_code_re2", # 2022-04-08 + sha256 = "906d0df8ff48f8d3a00a808827f009a840190f404559f649cb8e4d7143255ef9", + strip_prefix = "re2-a276a8c738735a0fe45a6ee590fe2df69bcf4502", + urls = ["https://github.com/google/re2/archive/a276a8c738735a0fe45a6ee590fe2df69bcf4502.zip"], ) # Google benchmark.
diff --git a/third_party/abseil-cpp/absl/base/internal/direct_mmap.h b/third_party/abseil-cpp/absl/base/internal/direct_mmap.h index a01d6122..e492bb0 100644 --- a/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +++ b/third_party/abseil-cpp/absl/base/internal/direct_mmap.h
@@ -41,13 +41,13 @@ #ifdef __mips__ // Include definitions of the ABI currently in use. -#ifdef __BIONIC__ +#if defined(__BIONIC__) || !defined(__GLIBC__) // Android doesn't have sgidefs.h, but does have asm/sgidefs.h, which has the // definitions we need. #include <asm/sgidefs.h> #else #include <sgidefs.h> -#endif // __BIONIC__ +#endif // __BIONIC__ || !__GLIBC__ #endif // __mips__ // SYS_mmap and SYS_munmap are not defined in Android.
diff --git a/third_party/abseil-cpp/absl/base/internal/invoke.h b/third_party/abseil-cpp/absl/base/internal/invoke.h index 018b1af..643c2a4 100644 --- a/third_party/abseil-cpp/absl/base/internal/invoke.h +++ b/third_party/abseil-cpp/absl/base/internal/invoke.h
@@ -102,8 +102,18 @@ static decltype((std::declval<Obj>().* std::declval<MemFun>())(std::declval<Args>()...)) Invoke(MemFun&& mem_fun, Obj&& obj, Args&&... args) { +// Ignore bogus GCC warnings on this line. +// See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101436 for similar example. +#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(11, 0) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Warray-bounds" +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif return (std::forward<Obj>(obj).* std::forward<MemFun>(mem_fun))(std::forward<Args>(args)...); +#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(11, 0) +#pragma GCC diagnostic pop +#endif } };
diff --git a/third_party/abseil-cpp/absl/flags/CMakeLists.txt b/third_party/abseil-cpp/absl/flags/CMakeLists.txt index 79e51a1..3e9d5adf 100644 --- a/third_party/abseil-cpp/absl/flags/CMakeLists.txt +++ b/third_party/abseil-cpp/absl/flags/CMakeLists.txt
@@ -466,5 +466,5 @@ absl::flags_reflection absl::flags_usage absl::strings - GTest::gtest + GTest::gmock )
diff --git a/third_party/abseil-cpp/absl/flags/internal/usage_test.cc b/third_party/abseil-cpp/absl/flags/internal/usage_test.cc index 6a65a1a3..209a7be9 100644 --- a/third_party/abseil-cpp/absl/flags/internal/usage_test.cc +++ b/third_party/abseil-cpp/absl/flags/internal/usage_test.cc
@@ -20,6 +20,7 @@ #include <sstream> #include <string> +#include "gmock/gmock.h" #include "gtest/gtest.h" #include "absl/flags/flag.h" #include "absl/flags/internal/parse.h" @@ -105,14 +106,19 @@ using UsageReportingDeathTest = UsageReportingTest; TEST_F(UsageReportingDeathTest, TestSetProgramUsageMessage) { +#if !defined(GTEST_HAS_ABSL) || !GTEST_HAS_ABSL + // Check for kTestUsageMessage set in main() below. EXPECT_EQ(absl::ProgramUsageMessage(), kTestUsageMessage); +#else + // Check for part of the usage message set by GoogleTest. + EXPECT_THAT(absl::ProgramUsageMessage(), + ::testing::HasSubstr( + "This program contains tests written using Google Test")); +#endif -#ifndef _WIN32 - // TODO(rogeeff): figure out why this does not work on Windows. EXPECT_DEATH_IF_SUPPORTED( absl::SetProgramUsageMessage("custom usage message"), - ".*SetProgramUsageMessage\\(\\) called twice.*"); -#endif + ::testing::HasSubstr("SetProgramUsageMessage() called twice")); } // -------------------------------------------------------------------- @@ -489,8 +495,10 @@ int main(int argc, char* argv[]) { (void)absl::GetFlag(FLAGS_undefok); // Force linking of parse.cc flags::SetProgramInvocationName("usage_test"); +#if !defined(GTEST_HAS_ABSL) || !GTEST_HAS_ABSL + // GoogleTest calls absl::SetProgramUsageMessage() already. absl::SetProgramUsageMessage(kTestUsageMessage); +#endif ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); }
diff --git a/third_party/abseil-cpp/absl/functional/BUILD.bazel b/third_party/abseil-cpp/absl/functional/BUILD.bazel index dbfa81f3..c4fbce9 100644 --- a/third_party/abseil-cpp/absl/functional/BUILD.bazel +++ b/third_party/abseil-cpp/absl/functional/BUILD.bazel
@@ -26,6 +26,40 @@ licenses(["notice"]) cc_library( + name = "any_invocable", + srcs = ["internal/any_invocable.h"], + hdrs = ["any_invocable.h"], + copts = ABSL_DEFAULT_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + "//absl/base:base_internal", + "//absl/base:config", + "//absl/base:core_headers", + "//absl/meta:type_traits", + "//absl/utility", + ], +) + +cc_test( + name = "any_invocable_test", + srcs = [ + "any_invocable_test.cc", + "internal/any_invocable.h", + ], + copts = ABSL_TEST_COPTS, + linkopts = ABSL_DEFAULT_LINKOPTS, + deps = [ + ":any_invocable", + "//absl/base:base_internal", + "//absl/base:config", + "//absl/base:core_headers", + "//absl/meta:type_traits", + "//absl/utility", + "@com_google_googletest//:gtest_main", + ], +) + +cc_library( name = "bind_front", srcs = ["internal/front_binder.h"], hdrs = ["bind_front.h"], @@ -86,6 +120,7 @@ tags = ["benchmark"], visibility = ["//visibility:private"], deps = [ + ":any_invocable", ":function_ref", "//absl/base:core_headers", "@com_github_google_benchmark//:benchmark_main",
diff --git a/third_party/abseil-cpp/absl/functional/BUILD.gn b/third_party/abseil-cpp/absl/functional/BUILD.gn index 64dadde..21cd6ae 100644 --- a/third_party/abseil-cpp/absl/functional/BUILD.gn +++ b/third_party/abseil-cpp/absl/functional/BUILD.gn
@@ -4,6 +4,36 @@ import("//third_party/abseil-cpp/absl.gni") +absl_source_set("any_invocable") { + sources = [ "internal/any_invocable.h" ] + public = [ "any_invocable.h" ] + deps = [ + "//third_party/abseil-cpp/absl/base:base_internal", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/meta:type_traits", + "//third_party/abseil-cpp/absl/utility", + ] +} + +absl_source_set("any_invocable_test") { + testonly = true + sources = [ + "any_invocable_test.cc", + "internal/any_invocable.h", + ] + deps = [ + ":any_invocable", + "//third_party/abseil-cpp/absl/base:base_internal", + "//third_party/abseil-cpp/absl/base:config", + "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/meta:type_traits", + "//third_party/abseil-cpp/absl/utility", + "//third_party/googletest:gmock", + "//third_party/googletest:gtest", + ] +} + absl_source_set("bind_front") { sources = [ "internal/front_binder.h" ] public = [ "bind_front.h" ]
diff --git a/third_party/abseil-cpp/absl/functional/CMakeLists.txt b/third_party/abseil-cpp/absl/functional/CMakeLists.txt index 338ddc6..c0f6eaaa2 100644 --- a/third_party/abseil-cpp/absl/functional/CMakeLists.txt +++ b/third_party/abseil-cpp/absl/functional/CMakeLists.txt
@@ -16,6 +16,42 @@ absl_cc_library( NAME + any_invocable + SRCS + "internal/any_invocable.h" + HDRS + "any_invocable.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::base_internal + absl::config + absl::core_headers + absl::type_traits + absl::utility + PUBLIC +) + +absl_cc_test( + NAME + any_invocable_test + SRCS + "any_invocable_test.cc" + "internal/any_invocable.h" + COPTS + ${ABSL_DEFAULT_COPTS} + DEPS + absl::any_invocable + absl::base_internal + absl::config + absl::core_headers + absl::type_traits + absl::utility + GTest::gmock_main +) + +absl_cc_library( + NAME bind_front SRCS "internal/front_binder.h"
diff --git a/third_party/abseil-cpp/absl/functional/any_invocable.h b/third_party/abseil-cpp/absl/functional/any_invocable.h new file mode 100644 index 0000000..0c5faca --- /dev/null +++ b/third_party/abseil-cpp/absl/functional/any_invocable.h
@@ -0,0 +1,313 @@ +// Copyright 2022 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ----------------------------------------------------------------------------- +// File: any_invocable.h +// ----------------------------------------------------------------------------- +// +// This header file defines an `absl::AnyInvocable` type that assumes ownership +// and wraps an object of an invocable type. (Invocable types adhere to the +// concept specified in https://en.cppreference.com/w/cpp/concepts/invocable.) +// +// In general, prefer `absl::AnyInvocable` when you need a type-erased +// function parameter that needs to take ownership of the type. +// +// NOTE: `absl::AnyInvocable` is similar to the C++23 `std::move_only_function` +// abstraction, but has a slightly different API and is not designed to be a +// drop-in replacement or C++11-compatible backfill of that type. + +#ifndef ABSL_FUNCTIONAL_ANY_INVOCABLE_H_ +#define ABSL_FUNCTIONAL_ANY_INVOCABLE_H_ + +#include <cstddef> +#include <initializer_list> +#include <type_traits> +#include <utility> + +#include "absl/base/config.h" +#include "absl/functional/internal/any_invocable.h" +#include "absl/meta/type_traits.h" +#include "absl/utility/utility.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN + +// absl::AnyInvocable +// +// `absl::AnyInvocable` is a functional wrapper type, like `std::function`, that +// assumes ownership of an invocable object. Unlike `std::function`, an +// `absl::AnyInvocable` is more type-safe and provides the following additional +// benefits: +// +// * Properly adheres to const correctness of the underlying type +// * Is move-only so avoids concurrency problems with copied invocables and +// unnecessary copies in general. +// * Supports reference qualifiers allowing it to perform unique actions (noted +// below). +// +// `absl::AnyInvocable` is a template, and an `absl::AnyInvocable` instantiation +// may wrap any invocable object with a compatible function signature, e.g. +// having arguments and return types convertible to types matching the +// `absl::AnyInvocable` signature, and also matching any stated reference +// qualifiers, as long as that type is moveable. It therefore provides broad +// type erasure for functional objects. +// +// An `absl::AnyInvocable` is typically used as a type-erased function parameter +// for accepting various functional objects: +// +// // Define a function taking an AnyInvocable parameter. +// void my_func(absl::AnyInvocable<int()> f) { +// ... +// }; +// +// // That function can accept any invocable type: +// +// // Accept a function reference. We don't need to move a reference. +// int func1() { return 0; }; +// my_func(func1); +// +// // Accept a lambda. We use std::move here because otherwise my_func would +// // copy the lambda. +// auto lambda = []() { return 0; }; +// my_func(std::move(lambda)); +// +// // Accept a function pointer. We don't need to move a function pointer. +// func2 = &func1; +// my_func(func2); +// +// // Accept an std::function by moving it. Note that the lambda is copyable +// // (satisfying std::function requirements) and moveable (satisfying +// // absl::AnyInvocable requirements). +// std::function<int()> func6 = []() { return 0; }; +// my_func(std::move(func6)); +// +// `AnyInvocable` also properly respects `const` qualifiers, reference +// qualifiers, and the `noexcept` specification (only in C++ 17 and beyond) as +// part of the user-specified function type (e.g. +// `AnyInvocable<void()&& const noexcept>`). These qualifiers will be applied to +// the `AnyInvocable` object's `operator()`, and the underlying invocable must +// be compatible with those qualifiers. +// +// Comparison of const and non-const function types: +// +// // Store a closure inside of `func` with the function type `int()`. +// // Note that we have made `func` itself `const`. +// const AnyInvocable<int()> func = [](){ return 0; }; +// +// func(); // Compile-error: the passed type `int()` isn't `const`. +// +// // Store a closure inside of `const_func` with the function type +// // `int() const`. +// // Note that we have also made `const_func` itself `const`. +// const AnyInvocable<int() const> const_func = [](){ return 0; }; +// +// const_func(); // Fine: `int() const` is `const`. +// +// In the above example, the call `func()` would have compiled if +// `std::function` were used even though the types are not const compatible. +// This is a bug, and using `absl::AnyInvocable` properly detects that bug. +// +// In addition to affecting the signature of `operator()`, the `const` and +// reference qualifiers of the function type also appropriately constrain which +// kinds of invocable objects you are allowed to place into the `AnyInvocable` +// instance. If you specify a function type that is const-qualified, then +// anything that you attempt to put into the `AnyInvocable` must be callable on +// a `const` instance of that type. +// +// Constraint example: +// +// // Fine because the lambda is callable when `const`. +// AnyInvocable<int() const> func = [=](){ return 0; }; +// +// // This is a compile-error because the lambda isn't callable when `const`. +// AnyInvocable<int() const> error = [=]() mutable { return 0; }; +// +// An `&&` qualifier can be used to express that an `absl::AnyInvocable` +// instance should be invoked at most once: +// +// // Invokes `continuation` with the logical result of an operation when +// // that operation completes (common in asynchronous code). +// void CallOnCompletion(AnyInvocable<void(int)&&> continuation) { +// int result_of_foo = foo(); +// +// // `std::move` is required because the `operator()` of `continuation` is +// // rvalue-reference qualified. +// std::move(continuation)(result_of_foo); +// } +// +// Credits to Matt Calabrese (https://github.com/mattcalabrese) for the original +// implementation. +template <class Sig> +class AnyInvocable : private internal_any_invocable::Impl<Sig> { + private: + static_assert( + std::is_function<Sig>::value, + "The template argument of AnyInvocable must be a function type."); + + using Impl = internal_any_invocable::Impl<Sig>; + + public: + // The return type of Sig + using result_type = typename Impl::result_type; + + // Constructors + + // Constructs the `AnyInvocable` in an empty state. + AnyInvocable() noexcept = default; + AnyInvocable(std::nullptr_t) noexcept {} // NOLINT + + // Constructs the `AnyInvocable` from an existing `AnyInvocable` by a move. + // Note that `f` is not guaranteed to be empty after move-construction, + // although it may be. + AnyInvocable(AnyInvocable&& /*f*/) noexcept = default; + + // Constructs an `AnyInvocable` from an invocable object. + // + // Upon construction, `*this` is only empty if `f` is a function pointer or + // member pointer type and is null, or if `f` is an `AnyInvocable` that is + // empty. + template <class F, typename = absl::enable_if_t< + internal_any_invocable::CanConvert<Sig, F>::value>> + AnyInvocable(F&& f) // NOLINT + : Impl(internal_any_invocable::ConversionConstruct(), + std::forward<F>(f)) {} + + // Constructs an `AnyInvocable` that holds an invocable object of type `T`, + // which is constructed in-place from the given arguments. + // + // Example: + // + // AnyInvocable<int(int)> func( + // absl::in_place_type<PossiblyImmovableType>, arg1, arg2); + // + template <class T, class... Args, + typename = absl::enable_if_t< + internal_any_invocable::CanEmplace<Sig, T, Args...>::value>> + explicit AnyInvocable(absl::in_place_type_t<T>, Args&&... args) + : Impl(absl::in_place_type<absl::decay_t<T>>, + std::forward<Args>(args)...) { + static_assert(std::is_same<T, absl::decay_t<T>>::value, + "The explicit template argument of in_place_type is required " + "to be an unqualified object type."); + } + + // Overload of the above constructor to support list-initialization. + template <class T, class U, class... Args, + typename = absl::enable_if_t<internal_any_invocable::CanEmplace< + Sig, T, std::initializer_list<U>&, Args...>::value>> + explicit AnyInvocable(absl::in_place_type_t<T>, + std::initializer_list<U> ilist, Args&&... args) + : Impl(absl::in_place_type<absl::decay_t<T>>, ilist, + std::forward<Args>(args)...) { + static_assert(std::is_same<T, absl::decay_t<T>>::value, + "The explicit template argument of in_place_type is required " + "to be an unqualified object type."); + } + + // Assignment Operators + + // Assigns an `AnyInvocable` through move-assignment. + // Note that `f` is not guaranteed to be empty after move-assignment + // although it may be. + AnyInvocable& operator=(AnyInvocable&& /*f*/) noexcept = default; + + // Assigns an `AnyInvocable` from a nullptr, clearing the `AnyInvocable`. If + // not empty, destroys the target, putting `*this` into an empty state. + AnyInvocable& operator=(std::nullptr_t) noexcept { + this->Clear(); + return *this; + } + + // Assigns an `AnyInvocable` from an existing `AnyInvocable` instance. + // + // Upon assignment, `*this` is only empty if `f` is a function pointer or + // member pointer type and is null, or if `f` is an `AnyInvocable` that is + // empty. + template <class F, typename = absl::enable_if_t< + internal_any_invocable::CanAssign<Sig, F>::value>> + AnyInvocable& operator=(F&& f) { + *this = AnyInvocable(std::forward<F>(f)); + return *this; + } + + // Assigns an `AnyInvocable` from a reference to an invocable object. + // Upon assignment, stores a reference to the invocable object in the + // `AnyInvocable` instance. + template < + class F, + typename = absl::enable_if_t< + internal_any_invocable::CanAssignReferenceWrapper<Sig, F>::value>> + AnyInvocable& operator=(std::reference_wrapper<F> f) noexcept { + *this = AnyInvocable(f); + return *this; + } + + // Destructor + + // If not empty, destroys the target. + ~AnyInvocable() = default; + + // absl::AnyInvocable::swap() + // + // Exchanges the targets of `*this` and `other`. + void swap(AnyInvocable& other) noexcept { std::swap(*this, other); } + + // abl::AnyInvocable::operator bool() + // + // Returns `true` if `*this` is not empty. + explicit operator bool() const noexcept { return this->HasValue(); } + + // Invokes the target object of `*this`. `*this` must not be empty. + // + // Note: The signature of this function call operator is the same as the + // template parameter `Sig`. + using Impl::operator(); + + // Equality operators + + // Returns `true` if `*this` is empty. + friend bool operator==(const AnyInvocable& f, std::nullptr_t) noexcept { + return !f.HasValue(); + } + + // Returns `true` if `*this` is empty. + friend bool operator==(std::nullptr_t, const AnyInvocable& f) noexcept { + return !f.HasValue(); + } + + // Returns `false` if `*this` is empty. + friend bool operator!=(const AnyInvocable& f, std::nullptr_t) noexcept { + return f.HasValue(); + } + + // Returns `false` if `*this` is empty. + friend bool operator!=(std::nullptr_t, const AnyInvocable& f) noexcept { + return f.HasValue(); + } + + // swap() + // + // Exchanges the targets of `f1` and `f2`. + friend void swap(AnyInvocable& f1, AnyInvocable& f2) noexcept { f1.swap(f2); } + + private: + // Friending other instantiations is necessary for conversions. + template <bool /*SigIsNoexcept*/, class /*ReturnType*/, class... /*P*/> + friend class internal_any_invocable::CoreImpl; +}; + +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_FUNCTIONAL_ANY_INVOCABLE_H_
diff --git a/third_party/abseil-cpp/absl/functional/any_invocable_test.cc b/third_party/abseil-cpp/absl/functional/any_invocable_test.cc new file mode 100644 index 0000000..fb5e7792 --- /dev/null +++ b/third_party/abseil-cpp/absl/functional/any_invocable_test.cc
@@ -0,0 +1,1696 @@ +// Copyright 2022 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "absl/functional/any_invocable.h" + +#include <cstddef> +#include <initializer_list> +#include <numeric> +#include <type_traits> + +#include "gtest/gtest.h" +#include "absl/base/config.h" +#include "absl/meta/type_traits.h" +#include "absl/utility/utility.h" + +static_assert(absl::internal_any_invocable::kStorageSize >= sizeof(void*), + "These tests assume that the small object storage is at least " + "the size of a pointer."); + +namespace { + +// Helper macro used to avoid spelling `noexcept` in language versions older +// than C++17, where it is not part of the type system, in order to avoid +// compilation failures and internal compiler errors. +#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L +#define ABSL_INTERNAL_NOEXCEPT_SPEC(noex) noexcept(noex) +#else +#define ABSL_INTERNAL_NOEXCEPT_SPEC(noex) +#endif + +// A dummy type we use when passing qualifiers to metafunctions +struct _ {}; + +template <class T> +struct Wrapper { + template <class U, + class = absl::enable_if_t<std::is_convertible<U, T>::value>> + Wrapper(U&&); // NOLINT +}; + +// This will cause a recursive trait instantiation if the SFINAE checks are +// not ordered correctly for constructibility. +static_assert(std::is_constructible<Wrapper<absl::AnyInvocable<void()>>, + Wrapper<absl::AnyInvocable<void()>>>::value, + ""); + +// A metafunction that takes the cv and l-value reference qualifiers that were +// associated with a function type (here passed via qualifiers of an object +// type), and . +template <class Qualifiers, class This> +struct QualifiersForThisImpl { + static_assert(std::is_object<This>::value, ""); + using type = + absl::conditional_t<std::is_const<Qualifiers>::value, const This, This>&; +}; + +template <class Qualifiers, class This> +struct QualifiersForThisImpl<Qualifiers&, This> + : QualifiersForThisImpl<Qualifiers, This> {}; + +template <class Qualifiers, class This> +struct QualifiersForThisImpl<Qualifiers&&, This> { + static_assert(std::is_object<This>::value, ""); + using type = + absl::conditional_t<std::is_const<Qualifiers>::value, const This, This>&&; +}; + +template <class Qualifiers, class This> +using QualifiersForThis = + typename QualifiersForThisImpl<Qualifiers, This>::type; + +// A metafunction that takes the cv and l-value reference qualifier of T and +// applies them to U's function type qualifiers. +template <class T, class Fun> +struct GiveQualifiersToFunImpl; + +template <class T, class R, class... P> +struct GiveQualifiersToFunImpl<T, R(P...)> { + using type = + absl::conditional_t<std::is_const<T>::value, R(P...) const, R(P...)>; +}; + +template <class T, class R, class... P> +struct GiveQualifiersToFunImpl<T&, R(P...)> { + using type = + absl::conditional_t<std::is_const<T>::value, R(P...) const&, R(P...)&>; +}; + +template <class T, class R, class... P> +struct GiveQualifiersToFunImpl<T&&, R(P...)> { + using type = + absl::conditional_t<std::is_const<T>::value, R(P...) const&&, R(P...) &&>; +}; + +// If noexcept is a part of the type system, then provide the noexcept forms. +#if defined(__cpp_noexcept_function_type) + +template <class T, class R, class... P> +struct GiveQualifiersToFunImpl<T, R(P...) noexcept> { + using type = absl::conditional_t<std::is_const<T>::value, + R(P...) const noexcept, R(P...) noexcept>; +}; + +template <class T, class R, class... P> +struct GiveQualifiersToFunImpl<T&, R(P...) noexcept> { + using type = + absl::conditional_t<std::is_const<T>::value, R(P...) const & noexcept, + R(P...) & noexcept>; +}; + +template <class T, class R, class... P> +struct GiveQualifiersToFunImpl<T&&, R(P...) noexcept> { + using type = + absl::conditional_t<std::is_const<T>::value, R(P...) const && noexcept, + R(P...) && noexcept>; +}; + +#endif // defined(__cpp_noexcept_function_type) + +template <class T, class Fun> +using GiveQualifiersToFun = typename GiveQualifiersToFunImpl<T, Fun>::type; + +// This is used in template parameters to decide whether or not to use a type +// that fits in the small object optimization storage. +enum class ObjSize { small, large }; + +// A base type that is used with classes as a means to insert an +// appropriately-sized dummy datamember when Size is ObjSize::large so that the +// user's class type is guaranteed to not fit in small object storage. +template <ObjSize Size> +struct TypeErasedPadding; + +template <> +struct TypeErasedPadding<ObjSize::small> {}; + +template <> +struct TypeErasedPadding<ObjSize::large> { + char dummy_data[absl::internal_any_invocable::kStorageSize + 1] = {}; +}; + +struct Int { + Int(int v) noexcept : value(v) {} // NOLINT +#ifndef _MSC_VER + Int(Int&&) noexcept { + // NOTE: Prior to C++17, this not being called requires optimizations to + // take place when performing the top-level invocation. In practice, + // most supported compilers perform this optimization prior to C++17. + std::abort(); + } +#else + Int(Int&& v) noexcept = default; +#endif + operator int() && noexcept { return value; } // NOLINT + + int MemberFunctionAdd(int const& b, int c) noexcept { // NOLINT + return value + b + c; + } + + int value; +}; + +enum class Movable { no, yes, nothrow, trivial }; + +enum class NothrowCall { no, yes }; + +enum class Destructible { nothrow, trivial }; + +enum class ObjAlign : std::size_t { + normal = absl::internal_any_invocable::kAlignment, + large = absl::internal_any_invocable::kAlignment * 2, +}; + +// A function-object template that has knobs for each property that can affect +// how the object is stored in AnyInvocable. +template <Movable Movability, Destructible Destructibility, class Qual, + NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment> +struct add; + +#define ABSL_INTERNALS_ADD(qual) \ + template <NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment> \ + struct alignas(static_cast<std::size_t>(Alignment)) \ + add<Movable::trivial, Destructible::trivial, _ qual, CallExceptionSpec, \ + Size, Alignment> : TypeErasedPadding<Size> { \ + explicit add(int state_init) : state(state_init) {} \ + explicit add(std::initializer_list<int> state_init, int tail) \ + : state(std::accumulate(std::begin(state_init), std::end(state_init), \ + 0) + \ + tail) {} \ + add(add&& other) = default; /*NOLINT*/ \ + Int operator()(int a, int b, int c) qual \ + ABSL_INTERNAL_NOEXCEPT_SPEC(CallExceptionSpec == NothrowCall::yes) { \ + return state + a + b + c; \ + } \ + int state; \ + }; \ + \ + template <NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment> \ + struct alignas(static_cast<std::size_t>(Alignment)) \ + add<Movable::trivial, Destructible::nothrow, _ qual, CallExceptionSpec, \ + Size, Alignment> : TypeErasedPadding<Size> { \ + explicit add(int state_init) : state(state_init) {} \ + explicit add(std::initializer_list<int> state_init, int tail) \ + : state(std::accumulate(std::begin(state_init), std::end(state_init), \ + 0) + \ + tail) {} \ + ~add() noexcept {} \ + add(add&& other) = default; /*NOLINT*/ \ + Int operator()(int a, int b, int c) qual \ + ABSL_INTERNAL_NOEXCEPT_SPEC(CallExceptionSpec == NothrowCall::yes) { \ + return state + a + b + c; \ + } \ + int state; \ + } + +// Explicitly specify an empty argument. +// MSVC (at least up to _MSC_VER 1931, if not beyond) warns that +// ABSL_INTERNALS_ADD() is an undefined zero-arg overload. +#define ABSL_INTERNALS_NOARG +ABSL_INTERNALS_ADD(ABSL_INTERNALS_NOARG); +#undef ABSL_INTERNALS_NOARG + +ABSL_INTERNALS_ADD(const); +ABSL_INTERNALS_ADD(&); +ABSL_INTERNALS_ADD(const&); +ABSL_INTERNALS_ADD(&&); // NOLINT +ABSL_INTERNALS_ADD(const&&); // NOLINT + +#undef ABSL_INTERNALS_ADD + +template <Destructible Destructibility, class Qual, + NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment> +struct add<Movable::no, Destructibility, Qual, CallExceptionSpec, Size, + Alignment> : private add<Movable::trivial, Destructibility, Qual, + CallExceptionSpec, Size, Alignment> { + using Base = add<Movable::trivial, Destructibility, Qual, CallExceptionSpec, + Size, Alignment>; + + explicit add(int state_init) : Base(state_init) {} + + explicit add(std::initializer_list<int> state_init, int tail) + : Base(state_init, tail) {} + + add(add&&) = delete; + + using Base::operator(); + using Base::state; +}; + +template <Destructible Destructibility, class Qual, + NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment> +struct add<Movable::yes, Destructibility, Qual, CallExceptionSpec, Size, + Alignment> : private add<Movable::trivial, Destructibility, Qual, + CallExceptionSpec, Size, Alignment> { + using Base = add<Movable::trivial, Destructibility, Qual, CallExceptionSpec, + Size, Alignment>; + + explicit add(int state_init) : Base(state_init) {} + + explicit add(std::initializer_list<int> state_init, int tail) + : Base(state_init, tail) {} + + add(add&& other) noexcept(false) : Base(other.state) {} // NOLINT + + using Base::operator(); + using Base::state; +}; + +template <Destructible Destructibility, class Qual, + NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment> +struct add<Movable::nothrow, Destructibility, Qual, CallExceptionSpec, Size, + Alignment> : private add<Movable::trivial, Destructibility, Qual, + CallExceptionSpec, Size, Alignment> { + using Base = add<Movable::trivial, Destructibility, Qual, CallExceptionSpec, + Size, Alignment>; + + explicit add(int state_init) : Base(state_init) {} + + explicit add(std::initializer_list<int> state_init, int tail) + : Base(state_init, tail) {} + + add(add&& other) noexcept : Base(other.state) {} + + using Base::operator(); + using Base::state; +}; + +// Actual non-member functions rather than function objects +Int add_function(Int&& a, int b, int c) noexcept { return a.value + b + c; } + +Int mult_function(Int&& a, int b, int c) noexcept { return a.value * b * c; } + +Int square_function(Int const&& a) noexcept { return a.value * a.value; } + +template <class Sig> +using AnyInvocable = absl::AnyInvocable<Sig>; + +// Instantiations of this template contains all of the compile-time parameters +// for a given instantiation of the AnyInvocable test suite. +template <Movable Movability, Destructible Destructibility, class Qual, + NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment> +struct TestParams { + static constexpr Movable kMovability = Movability; + static constexpr Destructible kDestructibility = Destructibility; + using Qualifiers = Qual; + static constexpr NothrowCall kCallExceptionSpec = CallExceptionSpec; + static constexpr bool kIsNoexcept = kCallExceptionSpec == NothrowCall::yes; + static constexpr bool kIsRvalueQualified = + std::is_rvalue_reference<Qual>::value; + static constexpr ObjSize kSize = Size; + static constexpr ObjAlign kAlignment = Alignment; + + // These types are used when testing with member object pointer Invocables + using UnqualifiedUnaryFunType = int(Int const&&) + ABSL_INTERNAL_NOEXCEPT_SPEC(CallExceptionSpec == NothrowCall::yes); + using UnaryFunType = GiveQualifiersToFun<Qualifiers, UnqualifiedUnaryFunType>; + using MemObjPtrType = int(Int::*); + using UnaryAnyInvType = AnyInvocable<UnaryFunType>; + using UnaryThisParamType = QualifiersForThis<Qualifiers, UnaryAnyInvType>; + + template <class T> + static UnaryThisParamType ToUnaryThisParam(T&& fun) { + return static_cast<UnaryThisParamType>(fun); + } + + // This function type intentionally uses 3 "kinds" of parameter types. + // - A user-defined type + // - A reference type + // - A scalar type + // + // These were chosen because internal forwarding takes place on parameters + // differently depending based on type properties (scalars are forwarded by + // value). + using ResultType = Int; + using AnyInvocableFunTypeNotNoexcept = Int(Int, const int&, int); + using UnqualifiedFunType = + typename std::conditional<kIsNoexcept, Int(Int, const int&, int) noexcept, + Int(Int, const int&, int)>::type; + using FunType = GiveQualifiersToFun<Qualifiers, UnqualifiedFunType>; + using MemFunPtrType = + typename std::conditional<kIsNoexcept, + Int (Int::*)(const int&, int) noexcept, + Int (Int::*)(const int&, int)>::type; + using AnyInvType = AnyInvocable<FunType>; + using AddType = add<kMovability, kDestructibility, Qualifiers, + kCallExceptionSpec, kSize, kAlignment>; + using ThisParamType = QualifiersForThis<Qualifiers, AnyInvType>; + + template <class T> + static ThisParamType ToThisParam(T&& fun) { + return static_cast<ThisParamType>(fun); + } + + // These typedefs are used when testing void return type covariance. + using UnqualifiedVoidFunType = + typename std::conditional<kIsNoexcept, + void(Int, const int&, int) noexcept, + void(Int, const int&, int)>::type; + using VoidFunType = GiveQualifiersToFun<Qualifiers, UnqualifiedVoidFunType>; + using VoidAnyInvType = AnyInvocable<VoidFunType>; + using VoidThisParamType = QualifiersForThis<Qualifiers, VoidAnyInvType>; + + template <class T> + static VoidThisParamType ToVoidThisParam(T&& fun) { + return static_cast<VoidThisParamType>(fun); + } + + using CompatibleAnyInvocableFunType = + absl::conditional_t<std::is_rvalue_reference<Qual>::value, + GiveQualifiersToFun<const _&&, UnqualifiedFunType>, + GiveQualifiersToFun<const _&, UnqualifiedFunType>>; + + using CompatibleAnyInvType = AnyInvocable<CompatibleAnyInvocableFunType>; + + using IncompatibleInvocable = + absl::conditional_t<std::is_rvalue_reference<Qual>::value, + GiveQualifiersToFun<_&, UnqualifiedFunType>(_::*), + GiveQualifiersToFun<_&&, UnqualifiedFunType>(_::*)>; +}; + +// Given a member-pointer type, this metafunction yields the target type of the +// pointer, not including the class-type. It is used to verify that the function +// call operator of AnyInvocable has the proper signature, corresponding to the +// function type that the user provided. +template <class MemberPtrType> +struct MemberTypeOfImpl; + +template <class Class, class T> +struct MemberTypeOfImpl<T(Class::*)> { + using type = T; +}; + +template <class MemberPtrType> +using MemberTypeOf = typename MemberTypeOfImpl<MemberPtrType>::type; + +template <class T, class = void> +struct IsMemberSwappableImpl : std::false_type { + static constexpr bool kIsNothrow = false; +}; + +template <class T> +struct IsMemberSwappableImpl< + T, absl::void_t<decltype(std::declval<T&>().swap(std::declval<T&>()))>> + : std::true_type { + static constexpr bool kIsNothrow = + noexcept(std::declval<T&>().swap(std::declval<T&>())); +}; + +template <class T> +using IsMemberSwappable = IsMemberSwappableImpl<T>; + +template <class T> +using IsNothrowMemberSwappable = + std::integral_constant<bool, IsMemberSwappableImpl<T>::kIsNothrow>; + +template <class T> +class AnyInvTestBasic : public ::testing::Test {}; + +TYPED_TEST_SUITE_P(AnyInvTestBasic); + +TYPED_TEST_P(AnyInvTestBasic, DefaultConstruction) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType fun; + + EXPECT_FALSE(static_cast<bool>(fun)); + + EXPECT_TRUE(std::is_nothrow_default_constructible<AnyInvType>::value); +} + +TYPED_TEST_P(AnyInvTestBasic, ConstructionNullptr) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType fun = nullptr; + + EXPECT_FALSE(static_cast<bool>(fun)); + + EXPECT_TRUE( + (std::is_nothrow_constructible<AnyInvType, std::nullptr_t>::value)); +} + +TYPED_TEST_P(AnyInvTestBasic, ConstructionNullFunctionPtr) { + using AnyInvType = typename TypeParam::AnyInvType; + using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType; + + UnqualifiedFunType* const null_fun_ptr = nullptr; + AnyInvType fun = null_fun_ptr; + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestBasic, ConstructionNullMemberFunctionPtr) { + using AnyInvType = typename TypeParam::AnyInvType; + using MemFunPtrType = typename TypeParam::MemFunPtrType; + + const MemFunPtrType null_mem_fun_ptr = nullptr; + AnyInvType fun = null_mem_fun_ptr; + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestBasic, ConstructionNullMemberObjectPtr) { + using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType; + using MemObjPtrType = typename TypeParam::MemObjPtrType; + + const MemObjPtrType null_mem_obj_ptr = nullptr; + UnaryAnyInvType fun = null_mem_obj_ptr; + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestBasic, ConstructionMemberFunctionPtr) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType fun = &Int::MemberFunctionAdd; + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestBasic, ConstructionMemberObjectPtr) { + using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType; + + UnaryAnyInvType fun = &Int::value; + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(13, TypeParam::ToUnaryThisParam(fun)(13)); +} + +TYPED_TEST_P(AnyInvTestBasic, ConstructionFunctionReferenceDecay) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType fun = add_function; + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestBasic, ConstructionCompatibleAnyInvocableEmpty) { + using AnyInvType = typename TypeParam::AnyInvType; + using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType; + + CompatibleAnyInvType other; + AnyInvType fun = std::move(other); + + EXPECT_FALSE(static_cast<bool>(other)); // NOLINT + EXPECT_EQ(other, nullptr); // NOLINT + EXPECT_EQ(nullptr, other); // NOLINT + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestBasic, ConstructionCompatibleAnyInvocableNonempty) { + using AnyInvType = typename TypeParam::AnyInvType; + using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType; + + CompatibleAnyInvType other = &add_function; + AnyInvType fun = std::move(other); + + EXPECT_FALSE(static_cast<bool>(other)); // NOLINT + EXPECT_EQ(other, nullptr); // NOLINT + EXPECT_EQ(nullptr, other); // NOLINT + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestBasic, ConversionToBool) { + using AnyInvType = typename TypeParam::AnyInvType; + + { + AnyInvType fun; + + // This tests contextually-convertible-to-bool. + EXPECT_FALSE(fun ? true : false); // NOLINT + + // Make sure that the conversion is not implicit. + EXPECT_TRUE( + (std::is_nothrow_constructible<bool, const AnyInvType&>::value)); + EXPECT_FALSE((std::is_convertible<const AnyInvType&, bool>::value)); + } + + { + AnyInvType fun = &add_function; + + // This tests contextually-convertible-to-bool. + EXPECT_TRUE(fun ? true : false); // NOLINT + } +} + +TYPED_TEST_P(AnyInvTestBasic, Invocation) { + using AnyInvType = typename TypeParam::AnyInvType; + + using FunType = typename TypeParam::FunType; + using AnyInvCallType = MemberTypeOf<decltype(&AnyInvType::operator())>; + + // Make sure the function call operator of AnyInvocable always has the + // type that was specified via the template argument. + EXPECT_TRUE((std::is_same<AnyInvCallType, FunType>::value)); + + AnyInvType fun = &add_function; + + EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestBasic, InPlaceConstruction) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AnyInvType fun(absl::in_place_type<AddType>, 5); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestBasic, InPlaceConstructionInitializerList) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AnyInvType fun(absl::in_place_type<AddType>, {1, 2, 3, 4}, 5); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(39, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestBasic, InPlaceNullFunPtrConstruction) { + using AnyInvType = typename TypeParam::AnyInvType; + using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType; + + AnyInvType fun(absl::in_place_type<UnqualifiedFunType*>, nullptr); + + // In-place construction does not lead to empty. + EXPECT_TRUE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestBasic, InPlaceNullFunPtrConstructionValueInit) { + using AnyInvType = typename TypeParam::AnyInvType; + using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType; + + AnyInvType fun(absl::in_place_type<UnqualifiedFunType*>); + + // In-place construction does not lead to empty. + EXPECT_TRUE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestBasic, InPlaceNullMemFunPtrConstruction) { + using AnyInvType = typename TypeParam::AnyInvType; + using MemFunPtrType = typename TypeParam::MemFunPtrType; + + AnyInvType fun(absl::in_place_type<MemFunPtrType>, nullptr); + + // In-place construction does not lead to empty. + EXPECT_TRUE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestBasic, InPlaceNullMemFunPtrConstructionValueInit) { + using AnyInvType = typename TypeParam::AnyInvType; + using MemFunPtrType = typename TypeParam::MemFunPtrType; + + AnyInvType fun(absl::in_place_type<MemFunPtrType>); + + // In-place construction does not lead to empty. + EXPECT_TRUE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestBasic, InPlaceNullMemObjPtrConstruction) { + using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType; + using MemObjPtrType = typename TypeParam::MemObjPtrType; + + UnaryAnyInvType fun(absl::in_place_type<MemObjPtrType>, nullptr); + + // In-place construction does not lead to empty. + EXPECT_TRUE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestBasic, InPlaceNullMemObjPtrConstructionValueInit) { + using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType; + using MemObjPtrType = typename TypeParam::MemObjPtrType; + + UnaryAnyInvType fun(absl::in_place_type<MemObjPtrType>); + + // In-place construction does not lead to empty. + EXPECT_TRUE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestBasic, InPlaceVoidCovarianceConstruction) { + using VoidAnyInvType = typename TypeParam::VoidAnyInvType; + using AddType = typename TypeParam::AddType; + + VoidAnyInvType fun(absl::in_place_type<AddType>, 5); + + EXPECT_TRUE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestBasic, MoveConstructionFromEmpty) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType source_fun; + AnyInvType fun(std::move(source_fun)); + + EXPECT_FALSE(static_cast<bool>(fun)); + + EXPECT_TRUE(std::is_nothrow_move_constructible<AnyInvType>::value); +} + +TYPED_TEST_P(AnyInvTestBasic, MoveConstructionFromNonEmpty) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AnyInvType source_fun(absl::in_place_type<AddType>, 5); + AnyInvType fun(std::move(source_fun)); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); + + EXPECT_TRUE(std::is_nothrow_move_constructible<AnyInvType>::value); +} + +TYPED_TEST_P(AnyInvTestBasic, ComparisonWithNullptrEmpty) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType fun; + + EXPECT_TRUE(fun == nullptr); + EXPECT_TRUE(nullptr == fun); + + EXPECT_FALSE(fun != nullptr); + EXPECT_FALSE(nullptr != fun); +} + +TYPED_TEST_P(AnyInvTestBasic, ComparisonWithNullptrNonempty) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AnyInvType fun(absl::in_place_type<AddType>, 5); + + EXPECT_FALSE(fun == nullptr); + EXPECT_FALSE(nullptr == fun); + + EXPECT_TRUE(fun != nullptr); + EXPECT_TRUE(nullptr != fun); +} + +TYPED_TEST_P(AnyInvTestBasic, ResultType) { + using AnyInvType = typename TypeParam::AnyInvType; + using ExpectedResultType = typename TypeParam::ResultType; + + EXPECT_TRUE((std::is_same<typename AnyInvType::result_type, + ExpectedResultType>::value)); +} + +template <class T> +class AnyInvTestCombinatoric : public ::testing::Test {}; + +TYPED_TEST_SUITE_P(AnyInvTestCombinatoric); + +TYPED_TEST_P(AnyInvTestCombinatoric, MoveAssignEmptyEmptyLhsRhs) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType source_fun; + AnyInvType fun; + + fun = std::move(source_fun); + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, MoveAssignEmptyLhsNonemptyRhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AnyInvType source_fun(absl::in_place_type<AddType>, 5); + AnyInvType fun; + + fun = std::move(source_fun); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, MoveAssignNonemptyEmptyLhsRhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AnyInvType source_fun; + AnyInvType fun(absl::in_place_type<AddType>, 5); + + fun = std::move(source_fun); + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, MoveAssignNonemptyLhsNonemptyRhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AnyInvType source_fun(absl::in_place_type<AddType>, 5); + AnyInvType fun(absl::in_place_type<AddType>, 20); + + fun = std::move(source_fun); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, SelfMoveAssignEmpty) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType source_fun; + source_fun = std::move(source_fun); + + // This space intentionally left blank. +} + +TYPED_TEST_P(AnyInvTestCombinatoric, SelfMoveAssignNonempty) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AnyInvType source_fun(absl::in_place_type<AddType>, 5); + source_fun = std::move(source_fun); + + // This space intentionally left blank. +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullptrEmptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType fun; + fun = nullptr; + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullFunctionPtrEmptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType; + + UnqualifiedFunType* const null_fun_ptr = nullptr; + AnyInvType fun; + fun = null_fun_ptr; + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullMemberFunctionPtrEmptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using MemFunPtrType = typename TypeParam::MemFunPtrType; + + const MemFunPtrType null_mem_fun_ptr = nullptr; + AnyInvType fun; + fun = null_mem_fun_ptr; + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullMemberObjectPtrEmptyLhs) { + using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType; + using MemObjPtrType = typename TypeParam::MemObjPtrType; + + const MemObjPtrType null_mem_obj_ptr = nullptr; + UnaryAnyInvType fun; + fun = null_mem_obj_ptr; + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignMemberFunctionPtrEmptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType fun; + fun = &Int::MemberFunctionAdd; + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignMemberObjectPtrEmptyLhs) { + using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType; + + UnaryAnyInvType fun; + fun = &Int::value; + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(13, TypeParam::ToUnaryThisParam(fun)(13)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignFunctionReferenceDecayEmptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType fun; + fun = add_function; + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, + AssignCompatibleAnyInvocableEmptyLhsEmptyRhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType; + + CompatibleAnyInvType other; + AnyInvType fun; + fun = std::move(other); + + EXPECT_FALSE(static_cast<bool>(other)); // NOLINT + EXPECT_EQ(other, nullptr); // NOLINT + EXPECT_EQ(nullptr, other); // NOLINT + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, + AssignCompatibleAnyInvocableEmptyLhsNonemptyRhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType; + + CompatibleAnyInvType other = &add_function; + AnyInvType fun; + fun = std::move(other); + + EXPECT_FALSE(static_cast<bool>(other)); // NOLINT + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullptrNonemptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType fun = &mult_function; + fun = nullptr; + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullFunctionPtrNonemptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType; + + UnqualifiedFunType* const null_fun_ptr = nullptr; + AnyInvType fun = &mult_function; + fun = null_fun_ptr; + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullMemberFunctionPtrNonemptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using MemFunPtrType = typename TypeParam::MemFunPtrType; + + const MemFunPtrType null_mem_fun_ptr = nullptr; + AnyInvType fun = &mult_function; + fun = null_mem_fun_ptr; + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullMemberObjectPtrNonemptyLhs) { + using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType; + using MemObjPtrType = typename TypeParam::MemObjPtrType; + + const MemObjPtrType null_mem_obj_ptr = nullptr; + UnaryAnyInvType fun = &square_function; + fun = null_mem_obj_ptr; + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignMemberFunctionPtrNonemptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType fun = &mult_function; + fun = &Int::MemberFunctionAdd; + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignMemberObjectPtrNonemptyLhs) { + using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType; + + UnaryAnyInvType fun = &square_function; + fun = &Int::value; + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(13, TypeParam::ToUnaryThisParam(fun)(13)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, AssignFunctionReferenceDecayNonemptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + + AnyInvType fun = &mult_function; + fun = add_function; + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, + AssignCompatibleAnyInvocableNonemptyLhsEmptyRhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType; + + CompatibleAnyInvType other; + AnyInvType fun = &mult_function; + fun = std::move(other); + + EXPECT_FALSE(static_cast<bool>(other)); // NOLINT + EXPECT_EQ(other, nullptr); // NOLINT + EXPECT_EQ(nullptr, other); // NOLINT + + EXPECT_FALSE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, + AssignCompatibleAnyInvocableNonemptyLhsNonemptyRhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType; + + CompatibleAnyInvType other = &add_function; + AnyInvType fun = &mult_function; + fun = std::move(other); + + EXPECT_FALSE(static_cast<bool>(other)); // NOLINT + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value); +} + +TYPED_TEST_P(AnyInvTestCombinatoric, SwapEmptyLhsEmptyRhs) { + using AnyInvType = typename TypeParam::AnyInvType; + + // Swap idiom + { + AnyInvType fun; + AnyInvType other; + + using std::swap; + swap(fun, other); + + EXPECT_FALSE(static_cast<bool>(fun)); + EXPECT_FALSE(static_cast<bool>(other)); + + EXPECT_TRUE( + absl::type_traits_internal::IsNothrowSwappable<AnyInvType>::value); + } + + // Member swap + { + AnyInvType fun; + AnyInvType other; + + fun.swap(other); + + EXPECT_FALSE(static_cast<bool>(fun)); + EXPECT_FALSE(static_cast<bool>(other)); + + EXPECT_TRUE(IsNothrowMemberSwappable<AnyInvType>::value); + } +} + +TYPED_TEST_P(AnyInvTestCombinatoric, SwapEmptyLhsNonemptyRhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + // Swap idiom + { + AnyInvType fun; + AnyInvType other(absl::in_place_type<AddType>, 5); + + using std::swap; + swap(fun, other); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_FALSE(static_cast<bool>(other)); + + EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); + + EXPECT_TRUE( + absl::type_traits_internal::IsNothrowSwappable<AnyInvType>::value); + } + + // Member swap + { + AnyInvType fun; + AnyInvType other(absl::in_place_type<AddType>, 5); + + fun.swap(other); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_FALSE(static_cast<bool>(other)); + + EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); + + EXPECT_TRUE(IsNothrowMemberSwappable<AnyInvType>::value); + } +} + +TYPED_TEST_P(AnyInvTestCombinatoric, SwapNonemptyLhsEmptyRhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + // Swap idiom + { + AnyInvType fun(absl::in_place_type<AddType>, 5); + AnyInvType other; + + using std::swap; + swap(fun, other); + + EXPECT_FALSE(static_cast<bool>(fun)); + EXPECT_TRUE(static_cast<bool>(other)); + + EXPECT_EQ(29, TypeParam::ToThisParam(other)(7, 8, 9).value); + + EXPECT_TRUE( + absl::type_traits_internal::IsNothrowSwappable<AnyInvType>::value); + } + + // Member swap + { + AnyInvType fun(absl::in_place_type<AddType>, 5); + AnyInvType other; + + fun.swap(other); + + EXPECT_FALSE(static_cast<bool>(fun)); + EXPECT_TRUE(static_cast<bool>(other)); + + EXPECT_EQ(29, TypeParam::ToThisParam(other)(7, 8, 9).value); + + EXPECT_TRUE(IsNothrowMemberSwappable<AnyInvType>::value); + } +} + +TYPED_TEST_P(AnyInvTestCombinatoric, SwapNonemptyLhsNonemptyRhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + // Swap idiom + { + AnyInvType fun(absl::in_place_type<AddType>, 5); + AnyInvType other(absl::in_place_type<AddType>, 6); + + using std::swap; + swap(fun, other); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_TRUE(static_cast<bool>(other)); + + EXPECT_EQ(30, TypeParam::ToThisParam(fun)(7, 8, 9).value); + EXPECT_EQ(29, TypeParam::ToThisParam(other)(7, 8, 9).value); + + EXPECT_TRUE( + absl::type_traits_internal::IsNothrowSwappable<AnyInvType>::value); + } + + // Member swap + { + AnyInvType fun(absl::in_place_type<AddType>, 5); + AnyInvType other(absl::in_place_type<AddType>, 6); + + fun.swap(other); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_TRUE(static_cast<bool>(other)); + + EXPECT_EQ(30, TypeParam::ToThisParam(fun)(7, 8, 9).value); + EXPECT_EQ(29, TypeParam::ToThisParam(other)(7, 8, 9).value); + + EXPECT_TRUE(IsNothrowMemberSwappable<AnyInvType>::value); + } +} + +template <class T> +class AnyInvTestMovable : public ::testing::Test {}; + +TYPED_TEST_SUITE_P(AnyInvTestMovable); + +TYPED_TEST_P(AnyInvTestMovable, ConversionConstructionUserDefinedType) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AnyInvType fun(AddType(5)); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value); +} + +TYPED_TEST_P(AnyInvTestMovable, ConversionConstructionVoidCovariance) { + using VoidAnyInvType = typename TypeParam::VoidAnyInvType; + using AddType = typename TypeParam::AddType; + + VoidAnyInvType fun(AddType(5)); + + EXPECT_TRUE(static_cast<bool>(fun)); +} + +TYPED_TEST_P(AnyInvTestMovable, ConversionAssignUserDefinedTypeEmptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AnyInvType fun; + fun = AddType(5); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value); +} + +TYPED_TEST_P(AnyInvTestMovable, ConversionAssignUserDefinedTypeNonemptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AnyInvType fun = &add_function; + fun = AddType(5); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value); +} + +TYPED_TEST_P(AnyInvTestMovable, ConversionAssignVoidCovariance) { + using VoidAnyInvType = typename TypeParam::VoidAnyInvType; + using AddType = typename TypeParam::AddType; + + VoidAnyInvType fun; + fun = AddType(5); + + EXPECT_TRUE(static_cast<bool>(fun)); +} + +template <class T> +class AnyInvTestNoexceptFalse : public ::testing::Test {}; + +TYPED_TEST_SUITE_P(AnyInvTestNoexceptFalse); + +TYPED_TEST_P(AnyInvTestNoexceptFalse, ConversionConstructionConstraints) { + using AnyInvType = typename TypeParam::AnyInvType; + + EXPECT_TRUE((std::is_constructible< + AnyInvType, + typename TypeParam::AnyInvocableFunTypeNotNoexcept*>::value)); + EXPECT_FALSE(( + std::is_constructible<AnyInvType, + typename TypeParam::IncompatibleInvocable>::value)); +} + +TYPED_TEST_P(AnyInvTestNoexceptFalse, ConversionAssignConstraints) { + using AnyInvType = typename TypeParam::AnyInvType; + + EXPECT_TRUE((std::is_assignable< + AnyInvType&, + typename TypeParam::AnyInvocableFunTypeNotNoexcept*>::value)); + EXPECT_FALSE( + (std::is_assignable<AnyInvType&, + typename TypeParam::IncompatibleInvocable>::value)); +} + +template <class T> +class AnyInvTestNoexceptTrue : public ::testing::Test {}; + +TYPED_TEST_SUITE_P(AnyInvTestNoexceptTrue); + +TYPED_TEST_P(AnyInvTestNoexceptTrue, ConversionConstructionConstraints) { +#if ABSL_INTERNAL_CPLUSPLUS_LANG < 201703L + GTEST_SKIP() << "Noexcept was not part of the type system before C++17."; +#else + using AnyInvType = typename TypeParam::AnyInvType; + +// TODO(b/217761454): Fix this and re-enable for MSVC. +#ifndef _MSC_VER + EXPECT_FALSE((std::is_constructible< + AnyInvType, + typename TypeParam::AnyInvocableFunTypeNotNoexcept*>::value)); +#endif + EXPECT_FALSE(( + std::is_constructible<AnyInvType, + typename TypeParam::IncompatibleInvocable>::value)); +#endif +} + +TYPED_TEST_P(AnyInvTestNoexceptTrue, ConversionAssignConstraints) { +#if ABSL_INTERNAL_CPLUSPLUS_LANG < 201703L + GTEST_SKIP() << "Noexcept was not part of the type system before C++17."; +#else + using AnyInvType = typename TypeParam::AnyInvType; + +// TODO(b/217761454): Fix this and re-enable for MSVC. +#ifndef _MSC_VER + EXPECT_FALSE((std::is_assignable< + AnyInvType&, + typename TypeParam::AnyInvocableFunTypeNotNoexcept*>::value)); +#endif + EXPECT_FALSE( + (std::is_assignable<AnyInvType&, + typename TypeParam::IncompatibleInvocable>::value)); +#endif +} + +template <class T> +class AnyInvTestNonRvalue : public ::testing::Test {}; + +TYPED_TEST_SUITE_P(AnyInvTestNonRvalue); + +TYPED_TEST_P(AnyInvTestNonRvalue, ConversionConstructionReferenceWrapper) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AddType add(4); + AnyInvType fun = std::ref(add); + add.state = 5; + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value); +} + +TYPED_TEST_P(AnyInvTestNonRvalue, NonMoveableResultType) { +#if ABSL_INTERNAL_CPLUSPLUS_LANG < 201703L + GTEST_SKIP() << "Copy/move elision was not standard before C++17"; +#else + // Define a result type that cannot be copy- or move-constructed. + struct Result { + int x; + + explicit Result(const int x_in) : x(x_in) {} + Result(Result&&) = delete; + }; + + static_assert(!std::is_move_constructible<Result>::value, ""); + static_assert(!std::is_copy_constructible<Result>::value, ""); + + // Assumption check: it should nevertheless be possible to use functors that + // return a Result struct according to the language rules. + const auto return_17 = []() noexcept { return Result(17); }; + EXPECT_EQ(17, return_17().x); + + // Just like plain functors, it should work fine to use an AnyInvocable that + // returns the non-moveable type. + using UnqualifiedFun = + absl::conditional_t<TypeParam::kIsNoexcept, Result() noexcept, Result()>; + + using Fun = + GiveQualifiersToFun<typename TypeParam::Qualifiers, UnqualifiedFun>; + + AnyInvocable<Fun> any_inv(return_17); + EXPECT_EQ(17, any_inv().x); +#endif +} + +TYPED_TEST_P(AnyInvTestNonRvalue, ConversionAssignReferenceWrapperEmptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AddType add(4); + AnyInvType fun; + fun = std::ref(add); + add.state = 5; + EXPECT_TRUE( + (std::is_nothrow_assignable<AnyInvType&, + std::reference_wrapper<AddType>>::value)); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value); +} + +TYPED_TEST_P(AnyInvTestNonRvalue, ConversionAssignReferenceWrapperNonemptyLhs) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + AddType add(4); + AnyInvType fun = &mult_function; + fun = std::ref(add); + add.state = 5; + EXPECT_TRUE( + (std::is_nothrow_assignable<AnyInvType&, + std::reference_wrapper<AddType>>::value)); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value); + + EXPECT_TRUE(static_cast<bool>(fun)); + EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value); +} + +template <class T> +class AnyInvTestRvalue : public ::testing::Test {}; + +TYPED_TEST_SUITE_P(AnyInvTestRvalue); + +TYPED_TEST_P(AnyInvTestRvalue, ConversionConstructionReferenceWrapper) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + EXPECT_FALSE(( + std::is_convertible<std::reference_wrapper<AddType>, AnyInvType>::value)); +} + +TYPED_TEST_P(AnyInvTestRvalue, NonMoveableResultType) { +#if ABSL_INTERNAL_CPLUSPLUS_LANG < 201703L + GTEST_SKIP() << "Copy/move elision was not standard before C++17"; +#else + // Define a result type that cannot be copy- or move-constructed. + struct Result { + int x; + + explicit Result(const int x_in) : x(x_in) {} + Result(Result&&) = delete; + }; + + static_assert(!std::is_move_constructible<Result>::value, ""); + static_assert(!std::is_copy_constructible<Result>::value, ""); + + // Assumption check: it should nevertheless be possible to use functors that + // return a Result struct according to the language rules. + const auto return_17 = []() noexcept { return Result(17); }; + EXPECT_EQ(17, return_17().x); + + // Just like plain functors, it should work fine to use an AnyInvocable that + // returns the non-moveable type. + using UnqualifiedFun = + absl::conditional_t<TypeParam::kIsNoexcept, Result() noexcept, Result()>; + + using Fun = + GiveQualifiersToFun<typename TypeParam::Qualifiers, UnqualifiedFun>; + + EXPECT_EQ(17, AnyInvocable<Fun>(return_17)().x); +#endif +} + +TYPED_TEST_P(AnyInvTestRvalue, ConversionAssignReferenceWrapper) { + using AnyInvType = typename TypeParam::AnyInvType; + using AddType = typename TypeParam::AddType; + + EXPECT_FALSE(( + std::is_assignable<AnyInvType&, std::reference_wrapper<AddType>>::value)); +} + +// NOTE: This test suite originally attempted to enumerate all possible +// combinations of type properties but the build-time started getting too large. +// Instead, it is now assumed that certain parameters are orthogonal and so +// some combinations are elided. + +// A metafunction to form a TypeList of all cv and non-rvalue ref combinations, +// coupled with all of the other explicitly specified parameters. +template <Movable Mov, Destructible Dest, NothrowCall CallExceptionSpec, + ObjSize Size, ObjAlign Align> +using NonRvalueQualifiedTestParams = ::testing::Types< // + TestParams<Mov, Dest, _, CallExceptionSpec, Size, Align>, // + TestParams<Mov, Dest, const _, CallExceptionSpec, Size, Align>, // + TestParams<Mov, Dest, _&, CallExceptionSpec, Size, Align>, // + TestParams<Mov, Dest, const _&, CallExceptionSpec, Size, Align>>; + +// A metafunction to form a TypeList of const and non-const rvalue ref +// qualifiers, coupled with all of the other explicitly specified parameters. +template <Movable Mov, Destructible Dest, NothrowCall CallExceptionSpec, + ObjSize Size, ObjAlign Align> +using RvalueQualifiedTestParams = ::testing::Types< + TestParams<Mov, Dest, _&&, CallExceptionSpec, Size, Align>, // + TestParams<Mov, Dest, const _&&, CallExceptionSpec, Size, Align> // + >; + +// All qualifier combinations and a noexcept function type +using TestParameterListNonRvalueQualifiersNothrowCall = + NonRvalueQualifiedTestParams<Movable::trivial, Destructible::trivial, + NothrowCall::yes, ObjSize::small, + ObjAlign::normal>; +using TestParameterListRvalueQualifiersNothrowCall = + RvalueQualifiedTestParams<Movable::trivial, Destructible::trivial, + NothrowCall::yes, ObjSize::small, + ObjAlign::normal>; + +// All qualifier combinations and a non-noexcept function type +using TestParameterListNonRvalueQualifiersCallMayThrow = + NonRvalueQualifiedTestParams<Movable::trivial, Destructible::trivial, + NothrowCall::no, ObjSize::small, + ObjAlign::normal>; +using TestParameterListRvalueQualifiersCallMayThrow = + RvalueQualifiedTestParams<Movable::trivial, Destructible::trivial, + NothrowCall::no, ObjSize::small, + ObjAlign::normal>; + +// Lists of various cases that should lead to remote storage +using TestParameterListRemoteMovable = ::testing::Types< + // "Normal" aligned types that are large and have trivial destructors + TestParams<Movable::trivial, Destructible::trivial, _, NothrowCall::no, + ObjSize::large, ObjAlign::normal>, // + TestParams<Movable::nothrow, Destructible::trivial, _, NothrowCall::no, + ObjSize::large, ObjAlign::normal>, // + TestParams<Movable::yes, Destructible::trivial, _, NothrowCall::no, + ObjSize::small, ObjAlign::normal>, // + TestParams<Movable::yes, Destructible::trivial, _, NothrowCall::no, + ObjSize::large, ObjAlign::normal>, // + + // Same as above but with non-trivial destructors + TestParams<Movable::trivial, Destructible::nothrow, _, NothrowCall::no, + ObjSize::large, ObjAlign::normal>, // + TestParams<Movable::nothrow, Destructible::nothrow, _, NothrowCall::no, + ObjSize::large, ObjAlign::normal>, // + TestParams<Movable::yes, Destructible::nothrow, _, NothrowCall::no, + ObjSize::small, ObjAlign::normal>, // + TestParams<Movable::yes, Destructible::nothrow, _, NothrowCall::no, + ObjSize::large, ObjAlign::normal> // + +// Dynamic memory allocation for over-aligned data was introduced in C++17. +// See https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0035r4.html +#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L + // Types that must use remote storage because of a large alignment. + , + TestParams<Movable::trivial, Destructible::trivial, _, NothrowCall::no, + ObjSize::small, ObjAlign::large>, // + TestParams<Movable::nothrow, Destructible::trivial, _, NothrowCall::no, + ObjSize::small, ObjAlign::large>, // + TestParams<Movable::trivial, Destructible::nothrow, _, NothrowCall::no, + ObjSize::small, ObjAlign::large>, // + TestParams<Movable::nothrow, Destructible::nothrow, _, NothrowCall::no, + ObjSize::small, ObjAlign::large> // +#endif + >; +using TestParameterListRemoteNonMovable = ::testing::Types< + // "Normal" aligned types that are large and have trivial destructors + TestParams<Movable::no, Destructible::trivial, _, NothrowCall::no, + ObjSize::small, ObjAlign::normal>, // + TestParams<Movable::no, Destructible::trivial, _, NothrowCall::no, + ObjSize::large, ObjAlign::normal>, // + // Same as above but with non-trivial destructors + TestParams<Movable::no, Destructible::nothrow, _, NothrowCall::no, + ObjSize::small, ObjAlign::normal>, // + TestParams<Movable::no, Destructible::nothrow, _, NothrowCall::no, + ObjSize::large, ObjAlign::normal> // + >; + +// Parameters that lead to local storage +using TestParameterListLocal = ::testing::Types< + // Types that meet the requirements and have trivial destructors + TestParams<Movable::trivial, Destructible::trivial, _, NothrowCall::no, + ObjSize::small, ObjAlign::normal>, // + TestParams<Movable::nothrow, Destructible::trivial, _, NothrowCall::no, + ObjSize::small, ObjAlign::normal>, // + + // Same as above but with non-trivial destructors + TestParams<Movable::trivial, Destructible::trivial, _, NothrowCall::no, + ObjSize::small, ObjAlign::normal>, // + TestParams<Movable::nothrow, Destructible::trivial, _, NothrowCall::no, + ObjSize::small, ObjAlign::normal> // + >; + +// All of the tests that are run for every possible combination of types. +REGISTER_TYPED_TEST_SUITE_P( + AnyInvTestBasic, DefaultConstruction, ConstructionNullptr, + ConstructionNullFunctionPtr, ConstructionNullMemberFunctionPtr, + ConstructionNullMemberObjectPtr, ConstructionMemberFunctionPtr, + ConstructionMemberObjectPtr, ConstructionFunctionReferenceDecay, + ConstructionCompatibleAnyInvocableEmpty, + ConstructionCompatibleAnyInvocableNonempty, InPlaceConstruction, + ConversionToBool, Invocation, InPlaceConstructionInitializerList, + InPlaceNullFunPtrConstruction, InPlaceNullFunPtrConstructionValueInit, + InPlaceNullMemFunPtrConstruction, InPlaceNullMemFunPtrConstructionValueInit, + InPlaceNullMemObjPtrConstruction, InPlaceNullMemObjPtrConstructionValueInit, + InPlaceVoidCovarianceConstruction, MoveConstructionFromEmpty, + MoveConstructionFromNonEmpty, ComparisonWithNullptrEmpty, + ComparisonWithNullptrNonempty, ResultType); + +INSTANTIATE_TYPED_TEST_SUITE_P( + NonRvalueCallMayThrow, AnyInvTestBasic, + TestParameterListNonRvalueQualifiersCallMayThrow); +INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestBasic, + TestParameterListRvalueQualifiersCallMayThrow); + +INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestBasic, + TestParameterListRemoteMovable); +INSTANTIATE_TYPED_TEST_SUITE_P(RemoteNonMovable, AnyInvTestBasic, + TestParameterListRemoteNonMovable); + +INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestBasic, TestParameterListLocal); + +INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestBasic, + TestParameterListNonRvalueQualifiersNothrowCall); +INSTANTIATE_TYPED_TEST_SUITE_P(CallNothrowRvalue, AnyInvTestBasic, + TestParameterListRvalueQualifiersNothrowCall); + +// Tests for functions that take two operands. +REGISTER_TYPED_TEST_SUITE_P( + AnyInvTestCombinatoric, MoveAssignEmptyEmptyLhsRhs, + MoveAssignEmptyLhsNonemptyRhs, MoveAssignNonemptyEmptyLhsRhs, + MoveAssignNonemptyLhsNonemptyRhs, SelfMoveAssignEmpty, + SelfMoveAssignNonempty, AssignNullptrEmptyLhs, + AssignNullFunctionPtrEmptyLhs, AssignNullMemberFunctionPtrEmptyLhs, + AssignNullMemberObjectPtrEmptyLhs, AssignMemberFunctionPtrEmptyLhs, + AssignMemberObjectPtrEmptyLhs, AssignFunctionReferenceDecayEmptyLhs, + AssignCompatibleAnyInvocableEmptyLhsEmptyRhs, + AssignCompatibleAnyInvocableEmptyLhsNonemptyRhs, AssignNullptrNonemptyLhs, + AssignNullFunctionPtrNonemptyLhs, AssignNullMemberFunctionPtrNonemptyLhs, + AssignNullMemberObjectPtrNonemptyLhs, AssignMemberFunctionPtrNonemptyLhs, + AssignMemberObjectPtrNonemptyLhs, AssignFunctionReferenceDecayNonemptyLhs, + AssignCompatibleAnyInvocableNonemptyLhsEmptyRhs, + AssignCompatibleAnyInvocableNonemptyLhsNonemptyRhs, SwapEmptyLhsEmptyRhs, + SwapEmptyLhsNonemptyRhs, SwapNonemptyLhsEmptyRhs, + SwapNonemptyLhsNonemptyRhs); + +INSTANTIATE_TYPED_TEST_SUITE_P( + NonRvalueCallMayThrow, AnyInvTestCombinatoric, + TestParameterListNonRvalueQualifiersCallMayThrow); +INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestCombinatoric, + TestParameterListRvalueQualifiersCallMayThrow); + +INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestCombinatoric, + TestParameterListRemoteMovable); +INSTANTIATE_TYPED_TEST_SUITE_P(RemoteNonMovable, AnyInvTestCombinatoric, + TestParameterListRemoteNonMovable); + +INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestCombinatoric, + TestParameterListLocal); + +INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestCombinatoric, + TestParameterListNonRvalueQualifiersNothrowCall); +INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallNothrow, AnyInvTestCombinatoric, + TestParameterListRvalueQualifiersNothrowCall); + +REGISTER_TYPED_TEST_SUITE_P(AnyInvTestMovable, + ConversionConstructionUserDefinedType, + ConversionConstructionVoidCovariance, + ConversionAssignUserDefinedTypeEmptyLhs, + ConversionAssignUserDefinedTypeNonemptyLhs, + ConversionAssignVoidCovariance); + +INSTANTIATE_TYPED_TEST_SUITE_P( + NonRvalueCallMayThrow, AnyInvTestMovable, + TestParameterListNonRvalueQualifiersCallMayThrow); +INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestMovable, + TestParameterListRvalueQualifiersCallMayThrow); + +INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestMovable, + TestParameterListRemoteMovable); + +INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestMovable, + TestParameterListLocal); + +INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestMovable, + TestParameterListNonRvalueQualifiersNothrowCall); +INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallNothrow, AnyInvTestMovable, + TestParameterListRvalueQualifiersNothrowCall); + +REGISTER_TYPED_TEST_SUITE_P(AnyInvTestNoexceptFalse, + ConversionConstructionConstraints, + ConversionAssignConstraints); + +INSTANTIATE_TYPED_TEST_SUITE_P( + NonRvalueCallMayThrow, AnyInvTestNoexceptFalse, + TestParameterListNonRvalueQualifiersCallMayThrow); +INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestNoexceptFalse, + TestParameterListRvalueQualifiersCallMayThrow); + +INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestNoexceptFalse, + TestParameterListRemoteMovable); +INSTANTIATE_TYPED_TEST_SUITE_P(RemoteNonMovable, AnyInvTestNoexceptFalse, + TestParameterListRemoteNonMovable); + +INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestNoexceptFalse, + TestParameterListLocal); + +REGISTER_TYPED_TEST_SUITE_P(AnyInvTestNoexceptTrue, + ConversionConstructionConstraints, + ConversionAssignConstraints); + +INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestNoexceptTrue, + TestParameterListNonRvalueQualifiersNothrowCall); +INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallNothrow, AnyInvTestNoexceptTrue, + TestParameterListRvalueQualifiersNothrowCall); + +REGISTER_TYPED_TEST_SUITE_P(AnyInvTestNonRvalue, + ConversionConstructionReferenceWrapper, + NonMoveableResultType, + ConversionAssignReferenceWrapperEmptyLhs, + ConversionAssignReferenceWrapperNonemptyLhs); + +INSTANTIATE_TYPED_TEST_SUITE_P( + NonRvalueCallMayThrow, AnyInvTestNonRvalue, + TestParameterListNonRvalueQualifiersCallMayThrow); + +INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestNonRvalue, + TestParameterListRemoteMovable); +INSTANTIATE_TYPED_TEST_SUITE_P(RemoteNonMovable, AnyInvTestNonRvalue, + TestParameterListRemoteNonMovable); + +INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestNonRvalue, + TestParameterListLocal); + +INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestNonRvalue, + TestParameterListNonRvalueQualifiersNothrowCall); + +REGISTER_TYPED_TEST_SUITE_P(AnyInvTestRvalue, + ConversionConstructionReferenceWrapper, + NonMoveableResultType, + ConversionAssignReferenceWrapper); + +INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestRvalue, + TestParameterListRvalueQualifiersCallMayThrow); + +INSTANTIATE_TYPED_TEST_SUITE_P(CallNothrowRvalue, AnyInvTestRvalue, + TestParameterListRvalueQualifiersNothrowCall); + +// Minimal SFINAE testing for platforms where we can't run the tests, but we can +// build binaries for. +static_assert( + std::is_convertible<void (*)(), absl::AnyInvocable<void() &&>>::value, ""); +static_assert(!std::is_convertible<void*, absl::AnyInvocable<void() &&>>::value, + ""); + +#undef ABSL_INTERNAL_NOEXCEPT_SPEC + +} // namespace
diff --git a/third_party/abseil-cpp/absl/functional/function_type_benchmark.cc b/third_party/abseil-cpp/absl/functional/function_type_benchmark.cc index 1b27eebf..03dc31d 100644 --- a/third_party/abseil-cpp/absl/functional/function_type_benchmark.cc +++ b/third_party/abseil-cpp/absl/functional/function_type_benchmark.cc
@@ -18,6 +18,7 @@ #include "benchmark/benchmark.h" #include "absl/base/attributes.h" +#include "absl/functional/any_invocable.h" #include "absl/functional/function_ref.h" namespace absl { @@ -62,6 +63,12 @@ } BENCHMARK(BM_TrivialFunctionRef); +void BM_TrivialAnyInvocable(benchmark::State& state) { + ConstructAndCallFunctionBenchmark<AnyInvocable<void()>>(state, + TrivialFunctor{}); +} +BENCHMARK(BM_TrivialAnyInvocable); + void BM_LargeStdFunction(benchmark::State& state) { ConstructAndCallFunctionBenchmark<std::function<void()>>(state, LargeFunctor{}); @@ -73,6 +80,13 @@ } BENCHMARK(BM_LargeFunctionRef); + +void BM_LargeAnyInvocable(benchmark::State& state) { + ConstructAndCallFunctionBenchmark<AnyInvocable<void()>>(state, + LargeFunctor{}); +} +BENCHMARK(BM_LargeAnyInvocable); + void BM_FunPtrStdFunction(benchmark::State& state) { ConstructAndCallFunctionBenchmark<std::function<void()>>(state, FreeFunction); } @@ -83,6 +97,11 @@ } BENCHMARK(BM_FunPtrFunctionRef); +void BM_FunPtrAnyInvocable(benchmark::State& state) { + ConstructAndCallFunctionBenchmark<AnyInvocable<void()>>(state, FreeFunction); +} +BENCHMARK(BM_FunPtrAnyInvocable); + // Doesn't include construction or copy overhead in the loop. template <typename Function, typename Callable, typename... Args> void CallFunctionBenchmark(benchmark::State& state, const Callable& c, @@ -114,6 +133,12 @@ } BENCHMARK(BM_TrivialArgsFunctionRef); +void BM_TrivialArgsAnyInvocable(benchmark::State& state) { + CallFunctionBenchmark<AnyInvocable<void(int, int, int)>>( + state, FunctorWithTrivialArgs{}, 1, 2, 3); +} +BENCHMARK(BM_TrivialArgsAnyInvocable); + struct FunctorWithNonTrivialArgs { void operator()(std::string a, std::string b, std::string c) const { benchmark::DoNotOptimize(&a); @@ -138,6 +163,14 @@ } BENCHMARK(BM_NonTrivialArgsFunctionRef); +void BM_NonTrivialArgsAnyInvocable(benchmark::State& state) { + std::string a, b, c; + CallFunctionBenchmark< + AnyInvocable<void(std::string, std::string, std::string)>>( + state, FunctorWithNonTrivialArgs{}, a, b, c); +} +BENCHMARK(BM_NonTrivialArgsAnyInvocable); + } // namespace ABSL_NAMESPACE_END } // namespace absl
diff --git a/third_party/abseil-cpp/absl/functional/internal/any_invocable.h b/third_party/abseil-cpp/absl/functional/internal/any_invocable.h new file mode 100644 index 0000000..f353139 --- /dev/null +++ b/third_party/abseil-cpp/absl/functional/internal/any_invocable.h
@@ -0,0 +1,857 @@ +// Copyright 2022 The Abseil Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Implementation details for `absl::AnyInvocable` + +#ifndef ABSL_FUNCTIONAL_INTERNAL_ANY_INVOCABLE_H_ +#define ABSL_FUNCTIONAL_INTERNAL_ANY_INVOCABLE_H_ + +//////////////////////////////////////////////////////////////////////////////// +// // +// This implementation of the proposed `any_invocable` uses an approach that // +// chooses between local storage and remote storage for the contained target // +// object based on the target object's size, alignment requirements, and // +// whether or not it has a nothrow move constructor. Additional optimizations // +// are performed when the object is a trivially copyable type [basic.types]. // +// // +// There are three datamembers per `AnyInvocable` instance // +// // +// 1) A union containing either // +// - A pointer to the target object referred to via a void*, or // +// - the target object, emplaced into a raw char buffer // +// // +// 2) A function pointer to a "manager" function operation that takes a // +// discriminator and logically branches to either perform a move operation // +// or destroy operation based on that discriminator. // +// // +// 3) A function pointer to an "invoker" function operation that invokes the // +// target object, directly returning the result. // +// // +// When in the logically empty state, the manager function is an empty // +// function and the invoker function is one that would be undefined-behavior // +// to call. // +// // +// An additional optimization is performed when converting from one // +// AnyInvocable to another where only the noexcept specification and/or the // +// cv/ref qualifiers of the function type differ. In these cases, the // +// conversion works by "moving the guts", similar to if they were the same // +// exact type, as opposed to having to perform an additional layer of // +// wrapping through remote storage. // +// // +//////////////////////////////////////////////////////////////////////////////// + +// IWYU pragma: private, include "absl/functional/any_invocable.h" + +#include <cassert> +#include <cstddef> +#include <cstring> +#include <functional> +#include <initializer_list> +#include <memory> +#include <new> +#include <type_traits> +#include <utility> + +#include "absl/base/config.h" +#include "absl/base/internal/invoke.h" +#include "absl/base/macros.h" +#include "absl/meta/type_traits.h" +#include "absl/utility/utility.h" + +namespace absl { +ABSL_NAMESPACE_BEGIN + +// Helper macro used to prevent spelling `noexcept` in language versions older +// than C++17, where it is not part of the type system, in order to avoid +// compilation failures and internal compiler errors. +#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L +#define ABSL_INTERNAL_NOEXCEPT_SPEC(noex) noexcept(noex) +#else +#define ABSL_INTERNAL_NOEXCEPT_SPEC(noex) +#endif + +// Defined in functional/any_invocable.h +template <class Sig> +class AnyInvocable; + +namespace internal_any_invocable { + +// Constants relating to the small-object-storage for AnyInvocable +enum StorageProperty : std::size_t { + kAlignment = alignof(std::max_align_t), // The alignment of the storage + kStorageSize = sizeof(void*) * 2 // The size of the storage +}; + +//////////////////////////////////////////////////////////////////////////////// +// +// A metafunction for checking if a type is an AnyInvocable instantiation. +// This is used during conversion operations. +template <class T> +struct IsAnyInvocable : std::false_type {}; + +template <class Sig> +struct IsAnyInvocable<AnyInvocable<Sig>> : std::true_type {}; +// +//////////////////////////////////////////////////////////////////////////////// + +// A type trait that tells us whether or not a target function type should be +// stored locally in the small object optimization storage +template <class T> +using IsStoredLocally = std::integral_constant< + bool, sizeof(T) <= kStorageSize && alignof(T) <= kAlignment && + kAlignment % alignof(T) == 0 && + std::is_nothrow_move_constructible<T>::value>; + +// An implementation of std::remove_cvref_t of C++20. +template <class T> +using RemoveCVRef = + typename std::remove_cv<typename std::remove_reference<T>::type>::type; + +//////////////////////////////////////////////////////////////////////////////// +// +// An implementation of the C++ standard INVOKE<R> pseudo-macro, operation is +// equivalent to std::invoke except that it forces an implicit conversion to the +// specified return type. If "R" is void, the function is executed and the +// return value is simply ignored. +template <class ReturnType, class F, class... P, + typename = absl::enable_if_t<std::is_void<ReturnType>::value>> +void InvokeR(F&& f, P&&... args) { + absl::base_internal::invoke(std::forward<F>(f), std::forward<P>(args)...); +} + +template <class ReturnType, class F, class... P, + absl::enable_if_t<!std::is_void<ReturnType>::value, int> = 0> +ReturnType InvokeR(F&& f, P&&... args) { + return absl::base_internal::invoke(std::forward<F>(f), + std::forward<P>(args)...); +} + +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +/// +// A metafunction that takes a "T" corresponding to a parameter type of the +// user's specified function type, and yields the parameter type to use for the +// type-erased invoker. In order to prevent observable moves, this must be +// either a reference or, if the type is trivial, the original parameter type +// itself. Since the parameter type may be incomplete at the point that this +// metafunction is used, we can only do this optimization for scalar types +// rather than for any trivial type. +template <typename T> +T ForwardImpl(std::true_type); + +template <typename T> +T&& ForwardImpl(std::false_type); + +// NOTE: We deliberately use an intermediate struct instead of a direct alias, +// as a workaround for b/206991861 on MSVC versions < 1924. +template <class T> +struct ForwardedParameter { + using type = decltype(( + ForwardImpl<T>)(std::integral_constant<bool, + std::is_scalar<T>::value>())); +}; + +template <class T> +using ForwardedParameterType = typename ForwardedParameter<T>::type; +// +//////////////////////////////////////////////////////////////////////////////// + +// A discriminator when calling the "manager" function that describes operation +// type-erased operation should be invoked. +// +// "relocate_from_to" specifies that the manager should perform a move. +// +// "dispose" specifies that the manager should perform a destroy. +enum class FunctionToCall : bool { relocate_from_to, dispose }; + +// The portion of `AnyInvocable` state that contains either a pointer to the +// target object or the object itself in local storage +union TypeErasedState { + struct { + // A pointer to the type-erased object when remotely stored + void* target; + // The size of the object for `RemoteManagerTrivial` + std::size_t size; + } remote; + + // Local-storage for the type-erased object when small and trivial enough + alignas(kAlignment) char storage[kStorageSize]; +}; + +// A typed accessor for the object in `TypeErasedState` storage +template <class T> +T& ObjectInLocalStorage(TypeErasedState* const state) { + // We launder here because the storage may be reused with the same type. +#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L + return *std::launder(reinterpret_cast<T*>(&state->storage)); +#elif ABSL_HAVE_BUILTIN(__builtin_launder) + return *__builtin_launder(reinterpret_cast<T*>(&state->storage)); +#else + + // When `std::launder` or equivalent are not available, we rely on undefined + // behavior, which works as intended on Abseil's officially supported + // platforms as of Q2 2022. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +#pragma GCC diagnostic push +#endif + return *reinterpret_cast<T*>(&state->storage); +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +#endif +} + +// The type for functions issuing lifetime-related operations: move and dispose +// A pointer to such a function is contained in each `AnyInvocable` instance. +// NOTE: When specifying `FunctionToCall::`dispose, the same state must be +// passed as both "from" and "to". +using ManagerType = void(FunctionToCall /*operation*/, + TypeErasedState* /*from*/, TypeErasedState* /*to*/) + ABSL_INTERNAL_NOEXCEPT_SPEC(true); + +// The type for functions issuing the actual invocation of the object +// A pointer to such a function is contained in each AnyInvocable instance. +template <bool SigIsNoexcept, class ReturnType, class... P> +using InvokerType = ReturnType(TypeErasedState*, ForwardedParameterType<P>...) + ABSL_INTERNAL_NOEXCEPT_SPEC(SigIsNoexcept); + +// The manager that is used when AnyInvocable is empty +inline void EmptyManager(FunctionToCall /*operation*/, + TypeErasedState* /*from*/, + TypeErasedState* /*to*/) noexcept {} + +// The manager that is used when a target function is in local storage and is +// a trivially copyable type. +inline void LocalManagerTrivial(FunctionToCall /*operation*/, + TypeErasedState* const from, + TypeErasedState* const to) noexcept { + // This single statement without branching handles both possible operations. + // + // For FunctionToCall::dispose, "from" and "to" point to the same state, and + // so this assignment logically would do nothing. + // + // Note: Correctness here relies on http://wg21.link/p0593, which has only + // become standard in C++20, though implementations do not break it in + // practice for earlier versions of C++. + // + // The correct way to do this without that paper is to first placement-new a + // default-constructed T in "to->storage" prior to the memmove, but doing so + // requires a different function to be created for each T that is stored + // locally, which can cause unnecessary bloat and be less cache friendly. + *to = *from; + + // Note: Because the type is trivially copyable, the destructor does not need + // to be called ("trivially copyable" requires a trivial destructor). +} + +// The manager that is used when a target function is in local storage and is +// not a trivially copyable type. +template <class T> +void LocalManagerNontrivial(FunctionToCall operation, + TypeErasedState* const from, + TypeErasedState* const to) noexcept { + static_assert(IsStoredLocally<T>::value, + "Local storage must only be used for supported types."); + static_assert(!std::is_trivially_copyable<T>::value, + "Locally stored types must be trivially copyable."); + + T& from_object = (ObjectInLocalStorage<T>)(from); + + switch (operation) { + case FunctionToCall::relocate_from_to: + // NOTE: Requires that the left-hand operand is already empty. + ::new (static_cast<void*>(&to->storage)) T(std::move(from_object)); + ABSL_FALLTHROUGH_INTENDED; + case FunctionToCall::dispose: + from_object.~T(); // Must not throw. // NOLINT + return; + } + ABSL_INTERNAL_UNREACHABLE; +} + +// The invoker that is used when a target function is in local storage +// Note: QualTRef here is the target function type along with cv and reference +// qualifiers that must be used when calling the function. +template <bool SigIsNoexcept, class ReturnType, class QualTRef, class... P> +ReturnType LocalInvoker( + TypeErasedState* const state, + ForwardedParameterType<P>... args) noexcept(SigIsNoexcept) { + using RawT = RemoveCVRef<QualTRef>; + static_assert( + IsStoredLocally<RawT>::value, + "Target object must be in local storage in order to be invoked from it."); + + auto& f = (ObjectInLocalStorage<RawT>)(state); + return (InvokeR<ReturnType>)(static_cast<QualTRef>(f), + static_cast<ForwardedParameterType<P>>(args)...); +} + +// The manager that is used when a target function is in remote storage and it +// has a trivial destructor +inline void RemoteManagerTrivial(FunctionToCall operation, + TypeErasedState* const from, + TypeErasedState* const to) noexcept { + switch (operation) { + case FunctionToCall::relocate_from_to: + // NOTE: Requires that the left-hand operand is already empty. + to->remote = from->remote; + return; + case FunctionToCall::dispose: +#if defined(__cpp_sized_deallocation) + ::operator delete(from->remote.target, from->remote.size); +#else // __cpp_sized_deallocation + ::operator delete(from->remote.target); +#endif // __cpp_sized_deallocation + return; + } + ABSL_INTERNAL_UNREACHABLE; +} + +// The manager that is used when a target function is in remote storage and the +// destructor of the type is not trivial +template <class T> +void RemoteManagerNontrivial(FunctionToCall operation, + TypeErasedState* const from, + TypeErasedState* const to) noexcept { + static_assert(!IsStoredLocally<T>::value, + "Remote storage must only be used for types that do not " + "qualify for local storage."); + + switch (operation) { + case FunctionToCall::relocate_from_to: + // NOTE: Requires that the left-hand operand is already empty. + to->remote.target = from->remote.target; + return; + case FunctionToCall::dispose: + ::delete static_cast<T*>(from->remote.target); // Must not throw. + return; + } + ABSL_INTERNAL_UNREACHABLE; +} + +// The invoker that is used when a target function is in remote storage +template <bool SigIsNoexcept, class ReturnType, class QualTRef, class... P> +ReturnType RemoteInvoker( + TypeErasedState* const state, + ForwardedParameterType<P>... args) noexcept(SigIsNoexcept) { + using RawT = RemoveCVRef<QualTRef>; + static_assert(!IsStoredLocally<RawT>::value, + "Target object must be in remote storage in order to be " + "invoked from it."); + + auto& f = *static_cast<RawT*>(state->remote.target); + return (InvokeR<ReturnType>)(static_cast<QualTRef>(f), + static_cast<ForwardedParameterType<P>>(args)...); +} + +//////////////////////////////////////////////////////////////////////////////// +// +// A metafunction that checks if a type T is an instantiation of +// absl::in_place_type_t (needed for constructor constraints of AnyInvocable). +template <class T> +struct IsInPlaceType : std::false_type {}; + +template <class T> +struct IsInPlaceType<absl::in_place_type_t<T>> : std::true_type {}; +// +//////////////////////////////////////////////////////////////////////////////// + +// A constructor name-tag used with CoreImpl (below) to request the +// conversion-constructor. QualDecayedTRef is the decayed-type of the object to +// wrap, along with the cv and reference qualifiers that must be applied when +// performing an invocation of the wrapped object. +template <class QualDecayedTRef> +struct TypedConversionConstruct {}; + +// A helper base class for all core operations of AnyInvocable. Most notably, +// this class creates the function call operator and constraint-checkers so that +// the top-level class does not have to be a series of partial specializations. +// +// Note: This definition exists (as opposed to being a declaration) so that if +// the user of the top-level template accidentally passes a template argument +// that is not a function type, they will get a static_assert in AnyInvocable's +// class body rather than an error stating that Impl is not defined. +template <class Sig> +class Impl {}; // Note: This is partially-specialized later. + +// A std::unique_ptr deleter that deletes memory allocated via ::operator new. +#if defined(__cpp_sized_deallocation) +class TrivialDeleter { + public: + explicit TrivialDeleter(std::size_t size) : size_(size) {} + + void operator()(void* target) const { + ::operator delete(target, size_); + } + + private: + std::size_t size_; +}; +#else // __cpp_sized_deallocation +class TrivialDeleter { + public: + explicit TrivialDeleter(std::size_t) {} + + void operator()(void* target) const { ::operator delete(target); } +}; +#endif // __cpp_sized_deallocation + +template <bool SigIsNoexcept, class ReturnType, class... P> +class CoreImpl; + +constexpr bool IsCompatibleConversion(void*, void*) { return false; } +template <bool NoExceptSrc, bool NoExceptDest, class... T> +constexpr bool IsCompatibleConversion(CoreImpl<NoExceptSrc, T...>*, + CoreImpl<NoExceptDest, T...>*) { + return !NoExceptDest || NoExceptSrc; +} + +// A helper base class for all core operations of AnyInvocable that do not +// depend on the cv/ref qualifiers of the function type. +template <bool SigIsNoexcept, class ReturnType, class... P> +class CoreImpl { + public: + using result_type = ReturnType; + + CoreImpl() noexcept : manager_(EmptyManager), invoker_(nullptr) {} + + enum class TargetType : int { + kPointer = 0, + kCompatibleAnyInvocable = 1, + kIncompatibleAnyInvocable = 2, + kOther = 3, + }; + + // Note: QualDecayedTRef here includes the cv-ref qualifiers associated with + // the invocation of the Invocable. The unqualified type is the target object + // type to be stored. + template <class QualDecayedTRef, class F> + explicit CoreImpl(TypedConversionConstruct<QualDecayedTRef>, F&& f) { + using DecayedT = RemoveCVRef<QualDecayedTRef>; + + constexpr TargetType kTargetType = + (std::is_pointer<DecayedT>::value || + std::is_member_pointer<DecayedT>::value) + ? TargetType::kPointer + : IsCompatibleAnyInvocable<DecayedT>::value + ? TargetType::kCompatibleAnyInvocable + : IsAnyInvocable<DecayedT>::value + ? TargetType::kIncompatibleAnyInvocable + : TargetType::kOther; + // NOTE: We only use integers instead of enums as template parameters in + // order to work around a bug on C++14 under MSVC 2017. + // See b/236131881. + Initialize<static_cast<int>(kTargetType), QualDecayedTRef>( + std::forward<F>(f)); + } + + // Note: QualTRef here includes the cv-ref qualifiers associated with the + // invocation of the Invocable. The unqualified type is the target object + // type to be stored. + template <class QualTRef, class... Args> + explicit CoreImpl(absl::in_place_type_t<QualTRef>, Args&&... args) { + InitializeStorage<QualTRef>(std::forward<Args>(args)...); + } + + CoreImpl(CoreImpl&& other) noexcept { + other.manager_(FunctionToCall::relocate_from_to, &other.state_, &state_); + manager_ = other.manager_; + invoker_ = other.invoker_; + other.manager_ = EmptyManager; + other.invoker_ = nullptr; + } + + CoreImpl& operator=(CoreImpl&& other) noexcept { + // Put the left-hand operand in an empty state. + // + // Note: A full reset that leaves us with an object that has its invariants + // intact is necessary in order to handle self-move. This is required by + // types that are used with certain operations of the standard library, such + // as the default definition of std::swap when both operands target the same + // object. + Clear(); + + // Perform the actual move/destory operation on the target function. + other.manager_(FunctionToCall::relocate_from_to, &other.state_, &state_); + manager_ = other.manager_; + invoker_ = other.invoker_; + other.manager_ = EmptyManager; + other.invoker_ = nullptr; + + return *this; + } + + ~CoreImpl() { manager_(FunctionToCall::dispose, &state_, &state_); } + + // Check whether or not the AnyInvocable is in the empty state. + bool HasValue() const { return invoker_ != nullptr; } + + // Effects: Puts the object into its empty state. + void Clear() { + manager_(FunctionToCall::dispose, &state_, &state_); + manager_ = EmptyManager; + invoker_ = nullptr; + } + + template <int target_type, class QualDecayedTRef, class F, + absl::enable_if_t<target_type == 0, int> = 0> + void Initialize(F&& f) { +// This condition handles types that decay into pointers, which includes +// function references. Since function references cannot be null, GCC warns +// against comparing their decayed form with nullptr. +// Since this is template-heavy code, we prefer to disable these warnings +// locally instead of adding yet another overload of this function. +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wpragmas" +#pragma GCC diagnostic ignored "-Waddress" +#pragma GCC diagnostic ignored "-Wnonnull-compare" +#pragma GCC diagnostic push +#endif + if (static_cast<RemoveCVRef<QualDecayedTRef>>(f) == nullptr) { +#if !defined(__clang__) && defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + manager_ = EmptyManager; + invoker_ = nullptr; + return; + } + InitializeStorage<QualDecayedTRef>(std::forward<F>(f)); + } + + template <int target_type, class QualDecayedTRef, class F, + absl::enable_if_t<target_type == 1, int> = 0> + void Initialize(F&& f) { + // In this case we can "steal the guts" of the other AnyInvocable. + f.manager_(FunctionToCall::relocate_from_to, &f.state_, &state_); + manager_ = f.manager_; + invoker_ = f.invoker_; + + f.manager_ = EmptyManager; + f.invoker_ = nullptr; + } + + template <int target_type, class QualDecayedTRef, class F, + absl::enable_if_t<target_type == 2, int> = 0> + void Initialize(F&& f) { + if (f.HasValue()) { + InitializeStorage<QualDecayedTRef>(std::forward<F>(f)); + } else { + manager_ = EmptyManager; + invoker_ = nullptr; + } + } + + template <int target_type, class QualDecayedTRef, class F, + typename = absl::enable_if_t<target_type == 3>> + void Initialize(F&& f) { + InitializeStorage<QualDecayedTRef>(std::forward<F>(f)); + } + + // Use local (inline) storage for applicable target object types. + template <class QualTRef, class... Args, + typename = absl::enable_if_t< + IsStoredLocally<RemoveCVRef<QualTRef>>::value>> + void InitializeStorage(Args&&... args) { + using RawT = RemoveCVRef<QualTRef>; + ::new (static_cast<void*>(&state_.storage)) + RawT(std::forward<Args>(args)...); + + invoker_ = LocalInvoker<SigIsNoexcept, ReturnType, QualTRef, P...>; + // We can simplify our manager if we know the type is trivially copyable. + InitializeLocalManager<RawT>(); + } + + // Use remote storage for target objects that cannot be stored locally. + template <class QualTRef, class... Args, + absl::enable_if_t<!IsStoredLocally<RemoveCVRef<QualTRef>>::value, + int> = 0> + void InitializeStorage(Args&&... args) { + InitializeRemoteManager<RemoveCVRef<QualTRef>>(std::forward<Args>(args)...); + // This is set after everything else in case an exception is thrown in an + // earlier step of the initialization. + invoker_ = RemoteInvoker<SigIsNoexcept, ReturnType, QualTRef, P...>; + } + + template <class T, + typename = absl::enable_if_t<std::is_trivially_copyable<T>::value>> + void InitializeLocalManager() { + manager_ = LocalManagerTrivial; + } + + template <class T, + absl::enable_if_t<!std::is_trivially_copyable<T>::value, int> = 0> + void InitializeLocalManager() { + manager_ = LocalManagerNontrivial<T>; + } + + template <class T> + using HasTrivialRemoteStorage = + std::integral_constant<bool, std::is_trivially_destructible<T>::value && + alignof(T) <= + ABSL_INTERNAL_DEFAULT_NEW_ALIGNMENT>; + + template <class T, class... Args, + typename = absl::enable_if_t<HasTrivialRemoteStorage<T>::value>> + void InitializeRemoteManager(Args&&... args) { + // unique_ptr is used for exception-safety in case construction throws. + std::unique_ptr<void, TrivialDeleter> uninitialized_target( + ::operator new(sizeof(T)), TrivialDeleter(sizeof(T))); + ::new (uninitialized_target.get()) T(std::forward<Args>(args)...); + state_.remote.target = uninitialized_target.release(); + state_.remote.size = sizeof(T); + manager_ = RemoteManagerTrivial; + } + + template <class T, class... Args, + absl::enable_if_t<!HasTrivialRemoteStorage<T>::value, int> = 0> + void InitializeRemoteManager(Args&&... args) { + state_.remote.target = ::new T(std::forward<Args>(args)...); + manager_ = RemoteManagerNontrivial<T>; + } + + ////////////////////////////////////////////////////////////////////////////// + // + // Type trait to determine if the template argument is an AnyInvocable whose + // function type is compatible enough with ours such that we can + // "move the guts" out of it when moving, rather than having to place a new + // object into remote storage. + + template <typename Other> + struct IsCompatibleAnyInvocable { + static constexpr bool value = false; + }; + + template <typename Sig> + struct IsCompatibleAnyInvocable<AnyInvocable<Sig>> { + static constexpr bool value = + (IsCompatibleConversion)(static_cast< + typename AnyInvocable<Sig>::CoreImpl*>( + nullptr), + static_cast<CoreImpl*>(nullptr)); + }; + + // + ////////////////////////////////////////////////////////////////////////////// + + TypeErasedState state_; + ManagerType* manager_; + InvokerType<SigIsNoexcept, ReturnType, P...>* invoker_; +}; + +// A constructor name-tag used with Impl to request the +// conversion-constructor +struct ConversionConstruct {}; + +//////////////////////////////////////////////////////////////////////////////// +// +// A metafunction that is normally an identity metafunction except that when +// given a std::reference_wrapper<T>, it yields T&. This is necessary because +// currently std::reference_wrapper's operator() is not conditionally noexcept, +// so when checking if such an Invocable is nothrow-invocable, we must pull out +// the underlying type. +template <class T> +struct UnwrapStdReferenceWrapperImpl { + using type = T; +}; + +template <class T> +struct UnwrapStdReferenceWrapperImpl<std::reference_wrapper<T>> { + using type = T&; +}; + +template <class T> +using UnwrapStdReferenceWrapper = + typename UnwrapStdReferenceWrapperImpl<T>::type; +// +//////////////////////////////////////////////////////////////////////////////// + +// An alias that always yields std::true_type (used with constraints) where +// substitution failures happen when forming the template arguments. +template <class... T> +using True = + std::integral_constant<bool, sizeof(absl::void_t<T...>*) != 0>; + +/*SFINAE constraints for the conversion-constructor.*/ +template <class Sig, class F, + class = absl::enable_if_t< + !std::is_same<RemoveCVRef<F>, AnyInvocable<Sig>>::value>> +using CanConvert = + True<absl::enable_if_t<!IsInPlaceType<RemoveCVRef<F>>::value>, + absl::enable_if_t<Impl<Sig>::template CallIsValid<F>::value>, + absl::enable_if_t< + Impl<Sig>::template CallIsNoexceptIfSigIsNoexcept<F>::value>, + absl::enable_if_t<std::is_constructible<absl::decay_t<F>, F>::value>>; + +/*SFINAE constraints for the std::in_place constructors.*/ +template <class Sig, class F, class... Args> +using CanEmplace = True< + absl::enable_if_t<Impl<Sig>::template CallIsValid<F>::value>, + absl::enable_if_t< + Impl<Sig>::template CallIsNoexceptIfSigIsNoexcept<F>::value>, + absl::enable_if_t<std::is_constructible<absl::decay_t<F>, Args...>::value>>; + +/*SFINAE constraints for the conversion-assign operator.*/ +template <class Sig, class F, + class = absl::enable_if_t< + !std::is_same<RemoveCVRef<F>, AnyInvocable<Sig>>::value>> +using CanAssign = + True<absl::enable_if_t<Impl<Sig>::template CallIsValid<F>::value>, + absl::enable_if_t< + Impl<Sig>::template CallIsNoexceptIfSigIsNoexcept<F>::value>, + absl::enable_if_t<std::is_constructible<absl::decay_t<F>, F>::value>>; + +/*SFINAE constraints for the reference-wrapper conversion-assign operator.*/ +template <class Sig, class F> +using CanAssignReferenceWrapper = + True<absl::enable_if_t< + Impl<Sig>::template CallIsValid<std::reference_wrapper<F>>::value>, + absl::enable_if_t<Impl<Sig>::template CallIsNoexceptIfSigIsNoexcept< + std::reference_wrapper<F>>::value>>; + +//////////////////////////////////////////////////////////////////////////////// +// +// The constraint for checking whether or not a call meets the noexcept +// callability requirements. This is a preprocessor macro because specifying it +// this way as opposed to a disjunction/branch can improve the user-side error +// messages and avoids an instantiation of std::is_nothrow_invocable_r in the +// cases where the user did not specify a noexcept function type. +// +#define ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT(inv_quals, noex) \ + ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT_##noex(inv_quals) + +// The disjunction below is because we can't rely on std::is_nothrow_invocable_r +// to give the right result when ReturnType is non-moveable in toolchains that +// don't treat non-moveable result types correctly. For example this was the +// case in libc++ before commit c3a24882 (2022-05). +#define ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT_true(inv_quals) \ + absl::enable_if_t<absl::disjunction< \ + std::is_nothrow_invocable_r< \ + ReturnType, UnwrapStdReferenceWrapper<absl::decay_t<F>> inv_quals, \ + P...>, \ + std::conjunction< \ + std::is_nothrow_invocable< \ + UnwrapStdReferenceWrapper<absl::decay_t<F>> inv_quals, P...>, \ + std::is_same< \ + ReturnType, \ + absl::base_internal::invoke_result_t< \ + UnwrapStdReferenceWrapper<absl::decay_t<F>> inv_quals, \ + P...>>>>::value> + +#define ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT_false(inv_quals) +// +//////////////////////////////////////////////////////////////////////////////// + +// A macro to generate partial specializations of Impl with the different +// combinations of supported cv/reference qualifiers and noexcept specifier. +// +// Here, `cv` are the cv-qualifiers if any, `ref` is the ref-qualifier if any, +// inv_quals is the reference type to be used when invoking the target, and +// noex is "true" if the function type is noexcept, or false if it is not. +// +// The CallIsValid condition is more complicated than simply using +// absl::base_internal::is_invocable_r because we can't rely on it to give the +// right result when ReturnType is non-moveable in toolchains that don't treat +// non-moveable result types correctly. For example this was the case in libc++ +// before commit c3a24882 (2022-05). +#define ABSL_INTERNAL_ANY_INVOCABLE_IMPL_(cv, ref, inv_quals, noex) \ + template <class ReturnType, class... P> \ + class Impl<ReturnType(P...) cv ref ABSL_INTERNAL_NOEXCEPT_SPEC(noex)> \ + : public CoreImpl<noex, ReturnType, P...> { \ + public: \ + /*The base class, which contains the datamembers and core operations*/ \ + using Core = CoreImpl<noex, ReturnType, P...>; \ + \ + /*SFINAE constraint to check if F is invocable with the proper signature*/ \ + template <class F> \ + using CallIsValid = True<absl::enable_if_t<absl::disjunction< \ + absl::base_internal::is_invocable_r<ReturnType, \ + absl::decay_t<F> inv_quals, P...>, \ + std::is_same<ReturnType, \ + absl::base_internal::invoke_result_t< \ + absl::decay_t<F> inv_quals, P...>>>::value>>; \ + \ + /*SFINAE constraint to check if F is nothrow-invocable when necessary*/ \ + template <class F> \ + using CallIsNoexceptIfSigIsNoexcept = \ + True<ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT(inv_quals, \ + noex)>; \ + \ + /*Put the AnyInvocable into an empty state.*/ \ + Impl() = default; \ + \ + /*The implementation of a conversion-constructor from "f*/ \ + /*This forwards to Core, attaching inv_quals so that the base class*/ \ + /*knows how to properly type-erase the invocation.*/ \ + template <class F> \ + explicit Impl(ConversionConstruct, F&& f) \ + : Core(TypedConversionConstruct< \ + typename std::decay<F>::type inv_quals>(), \ + std::forward<F>(f)) {} \ + \ + /*Forward along the in-place construction parameters.*/ \ + template <class T, class... Args> \ + explicit Impl(absl::in_place_type_t<T>, Args&&... args) \ + : Core(absl::in_place_type<absl::decay_t<T> inv_quals>, \ + std::forward<Args>(args)...) {} \ + \ + /*The actual invocation operation with the proper signature*/ \ + ReturnType operator()(P... args) cv ref noexcept(noex) { \ + assert(this->invoker_ != nullptr); \ + return this->invoker_(const_cast<TypeErasedState*>(&this->state_), \ + static_cast<ForwardedParameterType<P>>(args)...); \ + } \ + } + +// Define the `noexcept(true)` specialization only for C++17 and beyond, when +// `noexcept` is part of the type system. +#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L +// A convenience macro that defines specializations for the noexcept(true) and +// noexcept(false) forms, given the other properties. +#define ABSL_INTERNAL_ANY_INVOCABLE_IMPL(cv, ref, inv_quals) \ + ABSL_INTERNAL_ANY_INVOCABLE_IMPL_(cv, ref, inv_quals, false); \ + ABSL_INTERNAL_ANY_INVOCABLE_IMPL_(cv, ref, inv_quals, true) +#else +#define ABSL_INTERNAL_ANY_INVOCABLE_IMPL(cv, ref, inv_quals) \ + ABSL_INTERNAL_ANY_INVOCABLE_IMPL_(cv, ref, inv_quals, false) +#endif + +// Non-ref-qualified partial specializations +ABSL_INTERNAL_ANY_INVOCABLE_IMPL(, , &); +ABSL_INTERNAL_ANY_INVOCABLE_IMPL(const, , const&); + +// Lvalue-ref-qualified partial specializations +ABSL_INTERNAL_ANY_INVOCABLE_IMPL(, &, &); +ABSL_INTERNAL_ANY_INVOCABLE_IMPL(const, &, const&); + +// Rvalue-ref-qualified partial specializations +ABSL_INTERNAL_ANY_INVOCABLE_IMPL(, &&, &&); +ABSL_INTERNAL_ANY_INVOCABLE_IMPL(const, &&, const&&); + +// Undef the detail-only macros. +#undef ABSL_INTERNAL_ANY_INVOCABLE_IMPL +#undef ABSL_INTERNAL_ANY_INVOCABLE_IMPL_ +#undef ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT_false +#undef ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT_true +#undef ABSL_INTERNAL_ANY_INVOCABLE_NOEXCEPT_CONSTRAINT +#undef ABSL_INTERNAL_NOEXCEPT_SPEC + +} // namespace internal_any_invocable +ABSL_NAMESPACE_END +} // namespace absl + +#endif // ABSL_FUNCTIONAL_INTERNAL_ANY_INVOCABLE_H_
diff --git a/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq_test.cc b/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq_test.cc index f867f610..e36d5fa0 100644 --- a/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq_test.cc +++ b/third_party/abseil-cpp/absl/random/internal/explicit_seed_seq_test.cc
@@ -140,10 +140,8 @@ ExplicitSeedSeq seq_copy(seq_from_entropy); EXPECT_EQ(seq_copy.size(), seq_from_entropy.size()); - std::vector<uint32_t> seeds_1; - seeds_1.resize(1000, 0); - std::vector<uint32_t> seeds_2; - seeds_2.resize(1000, 1); + std::vector<uint32_t> seeds_1(1000, 0); + std::vector<uint32_t> seeds_2(1000, 1); seq_from_entropy.generate(seeds_1.begin(), seeds_1.end()); seq_copy.generate(seeds_2.begin(), seeds_2.end()); @@ -157,10 +155,8 @@ } ExplicitSeedSeq another_seq(std::begin(entropy), std::end(entropy)); - std::vector<uint32_t> seeds_1; - seeds_1.resize(1000, 0); - std::vector<uint32_t> seeds_2; - seeds_2.resize(1000, 0); + std::vector<uint32_t> seeds_1(1000, 0); + std::vector<uint32_t> seeds_2(1000, 0); seq_from_entropy.generate(seeds_1.begin(), seeds_1.end()); another_seq.generate(seeds_2.begin(), seeds_2.end()); @@ -169,7 +165,15 @@ EXPECT_THAT(seeds_1, Not(Pointwise(Eq(), seeds_2))); // Apply the assignment-operator. + // GCC 12 has a false-positive -Wstringop-overflow warning here. +#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(12, 0) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow" +#endif another_seq = seq_from_entropy; +#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(12, 0) +#pragma GCC diagnostic pop +#endif // Re-generate seeds. seq_from_entropy.generate(seeds_1.begin(), seeds_1.end()); @@ -181,15 +185,13 @@ // Move constructor. { // Get seeds from seed-sequence constructed from entropy. - std::vector<uint32_t> seeds_1; - seeds_1.resize(1000, 0); + std::vector<uint32_t> seeds_1(1000, 0); seq_from_entropy.generate(seeds_1.begin(), seeds_1.end()); // Apply move-constructor move the sequence to another instance. absl::random_internal::ExplicitSeedSeq moved_seq( std::move(seq_from_entropy)); - std::vector<uint32_t> seeds_2; - seeds_2.resize(1000, 1); + std::vector<uint32_t> seeds_2(1000, 1); moved_seq.generate(seeds_2.begin(), seeds_2.end()); // Verify that seeds produced by moved-instance are the same as original. EXPECT_THAT(seeds_1, Pointwise(Eq(), seeds_2));
diff --git a/third_party/abseil-cpp/absl/types/any_test.cc b/third_party/abseil-cpp/absl/types/any_test.cc index 70e4ba2..d382b92 100644 --- a/third_party/abseil-cpp/absl/types/any_test.cc +++ b/third_party/abseil-cpp/absl/types/any_test.cc
@@ -754,26 +754,23 @@ // Test the guarantees regarding exceptions in emplace. TEST(AnyTest, FailedEmplace) { - { - BadCopyable bad; - absl::any target; - ABSL_ANY_TEST_EXPECT_BAD_COPY(target.emplace<BadCopyable>(bad)); - } + BadCopyable bad; + absl::any target; + ABSL_ANY_TEST_EXPECT_BAD_COPY(target.emplace<BadCopyable>(bad)); +} - { - BadCopyable bad; - absl::any target(absl::in_place_type<int>); - ABSL_ANY_TEST_EXPECT_BAD_COPY(target.emplace<BadCopyable>(bad)); -#if defined(ABSL_USES_STD_ANY) && defined(__GLIBCXX__) - // libstdc++ std::any::emplace() implementation (as of 7.2) has a bug: if an - // exception is thrown, *this contains a value. -#define ABSL_GLIBCXX_ANY_EMPLACE_EXCEPTION_BUG 1 +// GCC and Clang have a bug here. +// Ine some cases, the exception seems to be thrown at the wrong time, and +// target may contain a value. +#ifdef __GNUC__ +TEST(AnyTest, DISABLED_FailedEmplaceInPlace) { +#else +TEST(AnyTest, FailedEmplaceInPlace) { #endif -#if defined(ABSL_HAVE_EXCEPTIONS) && \ - !defined(ABSL_GLIBCXX_ANY_EMPLACE_EXCEPTION_BUG) - EXPECT_FALSE(target.has_value()); -#endif - } + BadCopyable bad; + absl::any target(absl::in_place_type<int>); + ABSL_ANY_TEST_EXPECT_BAD_COPY(target.emplace<BadCopyable>(bad)); + EXPECT_FALSE(target.has_value()); } } // namespace
diff --git a/third_party/abseil-cpp/ci/cmake_common.sh b/third_party/abseil-cpp/ci/cmake_common.sh index 8a93389b..372038a5 100644 --- a/third_party/abseil-cpp/ci/cmake_common.sh +++ b/third_party/abseil-cpp/ci/cmake_common.sh
@@ -14,7 +14,7 @@ # The commit of GoogleTest to be used in the CMake tests in this directory. # Keep this in sync with the commit in the WORKSPACE file. -readonly ABSL_GOOGLETEST_COMMIT="28e1da21d8d677bc98f12ccc7fc159ff19e8e817" +readonly ABSL_GOOGLETEST_COMMIT="86add13493e5c881d7e4ba77fb91c1f57752b3a4" # Avoid depending on GitHub by looking for a cached copy of the commit first. if [[ -r "${KOKORO_GFILE_DIR:-}/distdir/${ABSL_GOOGLETEST_COMMIT}.zip" ]]; then
diff --git a/third_party/blink/public/platform/web_string.h b/third_party/blink/public/platform/web_string.h index 4ab2e081..fe9faeb 100644 --- a/third_party/blink/public/platform/web_string.h +++ b/third_party/blink/public/platform/web_string.h
@@ -83,7 +83,6 @@ // * WebString FilePathToWebString(const base::FilePath&); // // It is inexpensive to copy a WebString object. -// WARNING: It is not safe to pass a WebString across threads!!! // class WebString { public: @@ -165,10 +164,6 @@ // Does same as FromLatin1 but asserts if the given string has non-ascii char. BLINK_PLATFORM_EXPORT static WebString FromASCII(const std::string&); - // Makes a deep copy. Use this when you need to pass a WebString to another - // thread. - BLINK_PLATFORM_EXPORT WebString IsolatedCopy() const; - template <int N> WebString(const char (&data)[N]) : WebString(FromUTF8(data, N - 1)) {}
diff --git a/third_party/blink/renderer/DEPS b/third_party/blink/renderer/DEPS index 849b6383..b26f035 100644 --- a/third_party/blink/renderer/DEPS +++ b/third_party/blink/renderer/DEPS
@@ -62,6 +62,7 @@ "+base/time/time_delta_from_string.h", "+base/timer/elapsed_timer.h", "+base/timer/timer.h", + "+base/containers/lru_cache.h", "+base/token.h", "+base/trace_event", "+base/types/pass_key.h",
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index 20b3af0..add5624 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1253,9 +1253,6 @@ testonly = true sources = [ "accessibility/ax_context_test.cc", - "annotation/annotation_agent_container_impl_test.cc", - "annotation/annotation_agent_impl_test.cc", - "annotation/annotation_test_utils.h", "clipboard/clipboard_utilities_test.cc", "content_capture/content_capture_test.cc", "css/css_revert_layer_value_test.cc", @@ -1266,10 +1263,6 @@ "css/css_value_test_helper.h", "css/font_display_auto_lcp_align_test.cc", "css/mock_css_paint_image_generator.h", - "display_lock/display_lock_context_test.cc", - "display_lock/display_lock_utilities_test.cc", - "document_transition/document_transition_origin_trial_test.cc", - "document_transition/document_transition_test.cc", "editing/caret_display_item_client_test.cc", "editing/finder/text_finder_test.cc", "editing/keyboard_test.cc", @@ -1296,8 +1289,6 @@ "geometry/dom_matrix_test.cc", "imagebitmap/image_bitmap_test.cc", "intersection_observer/intersection_observer_test.cc", - "messaging/blink_transferable_message_mojom_traits_test.cc", - "messaging/message_port_descriptor_mojom_traits_test.cc", "mobile_metrics/mobile_friendliness_checker_test.cc", "navigation_api/navigation_api_test.cc", "origin_trials/origin_trial_context_test.cc", @@ -1308,12 +1299,7 @@ "scheduler_integration_tests/throttling_test.cc", "scheduler_integration_tests/virtual_time_test.cc", "trustedtypes/trusted_types_util_test.cc", - "typed_arrays/array_buffer/array_buffer_contents_test.cc", - "typed_arrays/dom_array_buffer_test.cc", "url/url_search_params_test.cc", - "xml/parser/shared_buffer_reader_test.cc", - "xml/parser/xml_document_parser_test.cc", - "xml/xpath_functions_test.cc", ] # If you create a new subdirectory 'foo' that contains unit tests, list them in @@ -1321,8 +1307,13 @@ # the deps section below. sources += rebase_path(blink_core_tests_accessibility, "", "accessibility") sources += rebase_path(blink_core_tests_animation, "", "animation") + sources += rebase_path(blink_core_tests_annotation, "", "annotation") sources += rebase_path(blink_core_tests_clipboard, "", "clipboard") sources += rebase_path(blink_core_tests_css, "", "css") + sources += rebase_path(blink_core_tests_display_lock, "", "display_lock") + sources += rebase_path(blink_core_tests_document_transition, + "", + "document_transition") sources += rebase_path(blink_core_tests_dom, "", "dom") sources += rebase_path(blink_core_tests_editing, "", "editing") sources += rebase_path(blink_core_tests_events, "", "events") @@ -1336,6 +1327,7 @@ sources += rebase_path(blink_core_tests_inspector, "", "inspector") sources += rebase_path(blink_core_tests_layout, "", "layout") sources += rebase_path(blink_core_tests_loader, "", "loader") + sources += rebase_path(blink_core_tests_messaging, "", "messaging") sources += rebase_path(blink_core_tests_page, "", "page") sources += rebase_path(blink_core_tests_paint, "", "paint") sources += @@ -1348,7 +1340,9 @@ sources += rebase_path(blink_core_tests_style, "", "style") sources += rebase_path(blink_core_tests_svg, "", "svg") sources += rebase_path(blink_core_tests_timing, "", "timing") + sources += rebase_path(blink_core_tests_typed_arrays, "", "typed_arrays") sources += rebase_path(blink_core_tests_workers, "", "workers") + sources += rebase_path(blink_core_tests_xml, "", "xml") if (is_debug || dcheck_always_on) { sources += [ "exported/web_disallow_transition_scope_test.cc" ]
diff --git a/third_party/blink/renderer/core/annotation/build.gni b/third_party/blink/renderer/core/annotation/build.gni index c8e9df3..70f565b7 100644 --- a/third_party/blink/renderer/core/annotation/build.gni +++ b/third_party/blink/renderer/core/annotation/build.gni
@@ -12,3 +12,9 @@ "text_annotation_selector.cc", "text_annotation_selector.h", ] + +blink_core_tests_annotation = [ + "annotation_agent_container_impl_test.cc", + "annotation_agent_impl_test.cc", + "annotation_test_utils.h", +]
diff --git a/third_party/blink/renderer/core/css/css_segmented_font_face.cc b/third_party/blink/renderer/core/css/css_segmented_font_face.cc index eec016f9..65d8f9ca 100644 --- a/third_party/blink/renderer/core/css/css_segmented_font_face.cc +++ b/third_party/blink/renderer/core/css/css_segmented_font_face.cc
@@ -123,11 +123,12 @@ // usually only a small number of FontData/SegmentedFontData instances created // per CSSSegmentedFontFace. Whereas in variable font animations, this number // grows rapidly. - scoped_refptr<SegmentedFontData>* cached_font_data = - font_data_table_.Get(key); - if (cached_font_data && (*cached_font_data) && - (*cached_font_data)->NumFaces()) - return *cached_font_data; + auto it = font_data_table_.Get(key); + if (it != font_data_table_.end()) { + scoped_refptr<SegmentedFontData> cached_font_data = it->second; + if (cached_font_data && cached_font_data->NumFaces()) + return cached_font_data; + } scoped_refptr<SegmentedFontData> created_font_data = SegmentedFontData::Create();
diff --git a/third_party/blink/renderer/core/css/css_segmented_font_face.h b/third_party/blink/renderer/core/css/css_segmented_font_face.h index f74aad11..8157126 100644 --- a/third_party/blink/renderer/core/css/css_segmented_font_face.h +++ b/third_party/blink/renderer/core/css/css_segmented_font_face.h
@@ -27,6 +27,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_SEGMENTED_FONT_FACE_H_ #include "base/callback.h" +#include "base/containers/lru_cache.h" #include "third_party/blink/renderer/platform/fonts/font_cache_key.h" #include "third_party/blink/renderer/platform/fonts/font_selection_types.h" #include "third_party/blink/renderer/platform/fonts/segmented_font_data.h" @@ -34,7 +35,6 @@ #include "third_party/blink/renderer/platform/heap/collection_support/heap_vector.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/wtf/forward.h" -#include "third_party/blink/renderer/platform/wtf/lru_cache.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/blink/renderer/platform/wtf/vector.h" @@ -124,7 +124,7 @@ FontSelectionCapabilities font_selection_capabilities_; - WTF::LruCache<FontCacheKey, scoped_refptr<SegmentedFontData>> + base::HashingLRUCache<FontCacheKey, scoped_refptr<SegmentedFontData>> font_data_table_; // All non-CSS-connected FontFaces are stored after the CSS-connected ones.
diff --git a/third_party/blink/renderer/core/display_lock/build.gni b/third_party/blink/renderer/core/display_lock/build.gni index a1c3c5e..195bc60b 100644 --- a/third_party/blink/renderer/core/display_lock/build.gni +++ b/third_party/blink/renderer/core/display_lock/build.gni
@@ -10,3 +10,8 @@ "display_lock_utilities.cc", "display_lock_utilities.h", ] + +blink_core_tests_display_lock = [ + "display_lock_context_test.cc", + "display_lock_utilities_test.cc", +]
diff --git a/third_party/blink/renderer/core/document_transition/build.gni b/third_party/blink/renderer/core/document_transition/build.gni index e018be0..bab7379 100644 --- a/third_party/blink/renderer/core/document_transition/build.gni +++ b/third_party/blink/renderer/core/document_transition/build.gni
@@ -16,3 +16,8 @@ "document_transition_supplement.h", "document_transition_utils.h", ] + +blink_core_tests_document_transition = [ + "document_transition_origin_trial_test.cc", + "document_transition_test.cc", +]
diff --git a/third_party/blink/renderer/core/inspector/v8_inspector_string.h b/third_party/blink/renderer/core/inspector/v8_inspector_string.h index 3738e3e..06e18e7 100644 --- a/third_party/blink/renderer/core/inspector/v8_inspector_string.h +++ b/third_party/blink/renderer/core/inspector/v8_inspector_string.h
@@ -98,14 +98,6 @@ } // namespace blink // TODO(dgozman): migrate core/inspector/protocol to wtf::HashMap. -namespace std { -template <> -struct hash<WTF::String> { - std::size_t operator()(const WTF::String& string) const { - return StringHash::GetHash(string); - } -}; -} // namespace std // See third_party/inspector_protocol/crdtp/serializer_traits.h. namespace crdtp {
diff --git a/third_party/blink/renderer/core/messaging/build.gni b/third_party/blink/renderer/core/messaging/build.gni index 2a81399..752b57b 100644 --- a/third_party/blink/renderer/core/messaging/build.gni +++ b/third_party/blink/renderer/core/messaging/build.gni
@@ -16,3 +16,8 @@ "message_port.cc", "message_port.h", ] + +blink_core_tests_messaging = [ + "blink_transferable_message_mojom_traits_test.cc", + "message_port_descriptor_mojom_traits_test.cc", +]
diff --git a/third_party/blink/renderer/core/typed_arrays/build.gni b/third_party/blink/renderer/core/typed_arrays/build.gni index fd4cf44..700d1b35 100644 --- a/third_party/blink/renderer/core/typed_arrays/build.gni +++ b/third_party/blink/renderer/core/typed_arrays/build.gni
@@ -23,3 +23,8 @@ "nadc_typed_array_view.h", "typed_flexible_array_buffer_view.h", ] + +blink_core_tests_typed_arrays = [ + "array_buffer/array_buffer_contents_test.cc", + "dom_array_buffer_test.cc", +]
diff --git a/third_party/blink/renderer/core/xml/build.gni b/third_party/blink/renderer/core/xml/build.gni index 079c22de..1429dfa 100644 --- a/third_party/blink/renderer/core/xml/build.gni +++ b/third_party/blink/renderer/core/xml/build.gni
@@ -60,3 +60,9 @@ "xslt_unicode_sort.cc", "xslt_unicode_sort.h", ] + +blink_core_tests_xml = [ + "parser/shared_buffer_reader_test.cc", + "parser/xml_document_parser_test.cc", + "xpath_functions_test.cc", +]
diff --git a/third_party/blink/renderer/platform/exported/web_string.cc b/third_party/blink/renderer/platform/exported/web_string.cc index aff9e08..4595eb7f 100644 --- a/third_party/blink/renderer/platform/exported/web_string.cc +++ b/third_party/blink/renderer/platform/exported/web_string.cc
@@ -139,12 +139,6 @@ return FromLatin1(s); } -WebString WebString::IsolatedCopy() const { - if (!impl_) - return WebString(); - return String(impl_).IsolatedCopy(); -} - bool WebString::Equals(const WebString& s) const { return Equal(impl_.get(), s.impl_.get()); }
diff --git a/third_party/blink/renderer/platform/fonts/font_cache_key.h b/third_party/blink/renderer/platform/fonts/font_cache_key.h index 5e3f969..00548473 100644 --- a/third_party/blink/renderer/platform/fonts/font_cache_key.h +++ b/third_party/blink/renderer/platform/fonts/font_cache_key.h
@@ -184,4 +184,11 @@ } // namespace WTF +template <> +struct std::hash<blink::FontCacheKey> { + std::size_t operator()(blink::FontCacheKey const& s) const noexcept { + return static_cast<size_t>(s.GetHash()); + } +}; + #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_FONT_CACHE_KEY_H_
diff --git a/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.cc b/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.cc index 9544a0ed..82cd34f 100644 --- a/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.cc +++ b/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.cc
@@ -49,9 +49,9 @@ String cache_key = makeCacheKey(generic_family, bcp47_language_tag, fallback_priority); - TypefaceVector* existing_typefaces = recent_fallback_fonts_.Get(cache_key); - if (existing_typefaces) { - existing_typefaces->insert(0, sk_ref_sp(typeface)); + auto it = recent_fallback_fonts_.Get(cache_key); + if (it != recent_fallback_fonts_.end()) { + it->second.insert(0, sk_ref_sp(typeface)); } else { TypefaceVector typefaces; typefaces.push_back(sk_ref_sp(typeface)); @@ -66,13 +66,13 @@ UChar32 character, String* fallback_family, SkFontStyle* fallback_style) { - TypefaceVector* typefaces = recent_fallback_fonts_.Get( + auto it = recent_fallback_fonts_.Get( makeCacheKey(generic_family, bcp47_language_tag, fallback_priority)); - if (!typefaces) + if (it == recent_fallback_fonts_.end()) return; - - for (wtf_size_t i = 0; i < typefaces->size(); ++i) { - sk_sp<SkTypeface>& typeface = typefaces->at(i); + TypefaceVector& typefaces = it->second; + for (wtf_size_t i = 0; i < typefaces.size(); ++i) { + sk_sp<SkTypeface>& typeface = typefaces.at(i); if (typeface->unicharToGlyph(character)) { getFallbackFamilyAndStyle(typeface.get(), fallback_family, fallback_style); @@ -80,8 +80,8 @@ // For the vector of typefaces for this specific language tag, since this // SkTypeface had a glyph, move it to the beginning to accelerate // subsequent lookups. - typefaces->EraseAt(i); - typefaces->insert(0, std::move(tmp_typeface)); + typefaces.EraseAt(i); + typefaces.insert(0, std::move(tmp_typeface)); return; } }
diff --git a/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.h b/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.h index 8be0b94..0cf11acd 100644 --- a/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.h +++ b/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.h
@@ -5,16 +5,16 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_WIN_FALLBACK_FAMILY_STYLE_CACHE_WIN_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_WIN_FALLBACK_FAMILY_STYLE_CACHE_WIN_H_ +#include "base/containers/lru_cache.h" #include "third_party/blink/renderer/platform/fonts/font_description.h" #include "third_party/blink/renderer/platform/fonts/font_fallback_priority.h" -#include "third_party/blink/renderer/platform/wtf/lru_cache.h" #include "third_party/skia/include/core/SkRefCnt.h" #include "third_party/skia/include/core/SkTypeface.h" namespace blink { using TypefaceVector = Vector<sk_sp<SkTypeface>>; -using FallbackLruCache = WTF::LruCache<String, TypefaceVector>; +using FallbackLruCache = base::HashingLRUCache<String, TypefaceVector>; class FallbackFamilyStyleCache { USING_FAST_MALLOC(FallbackFamilyStyleCache);
diff --git a/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win_test.cc b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win_test.cc index 917f011..5596c84 100644 --- a/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win_test.cc +++ b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win_test.cc
@@ -59,24 +59,24 @@ EXPECT_EQ(lru_cache.size(), 1u); fillCacheWithDummies(lru_cache, "dummy_locale_%zu", kLruCacheTestSize - 1); - TypefaceVector* chinese_typefaces = lru_cache.Get(kHanSimplifiedLocale); - EXPECT_TRUE(chinese_typefaces); - EXPECT_TRUE(chinese_typefaces->at(0)->unicharToGlyph(0x4E01)); + auto it = lru_cache.Get(kHanSimplifiedLocale); + EXPECT_TRUE(it != lru_cache.end()); + TypefaceVector& chinese_typefaces = it->second; + EXPECT_TRUE(chinese_typefaces.at(0)->unicharToGlyph(0x4E01)); EXPECT_EQ(lru_cache.size(), kLruCacheTestSize); fillCacheWithDummies(lru_cache, "dummy_locale_2nd_%zu", kLruCacheTestSize - 1); - chinese_typefaces = nullptr; - chinese_typefaces = lru_cache.Get(kHanSimplifiedLocale); - EXPECT_TRUE(chinese_typefaces); - EXPECT_EQ(chinese_typefaces->size(), 1u); - EXPECT_TRUE(chinese_typefaces->at(0)->unicharToGlyph(kSecondCJKIdeograph)); + it = lru_cache.Get(kHanSimplifiedLocale); + EXPECT_TRUE(it != lru_cache.end()); + chinese_typefaces = it->second; + EXPECT_EQ(chinese_typefaces.size(), 1u); + EXPECT_TRUE(chinese_typefaces.at(0)->unicharToGlyph(kSecondCJKIdeograph)); EXPECT_EQ(lru_cache.size(), kLruCacheTestSize); fillCacheWithDummies(lru_cache, "dummy_locale_3rd_%zu", kLruCacheTestSize); - chinese_typefaces = nullptr; - chinese_typefaces = lru_cache.Get(kHanSimplifiedLocale); - EXPECT_FALSE(chinese_typefaces); + it = lru_cache.Get(kHanSimplifiedLocale); + EXPECT_TRUE(it == lru_cache.end()); EXPECT_EQ(lru_cache.size(), kLruCacheTestSize); }
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc index 91b29dff..d79015a 100644 --- a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc +++ b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
@@ -8,6 +8,7 @@ #include "base/check_op.h" #include "base/command_line.h" +#include "base/containers/lru_cache.h" #include "base/notreached.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/switches.h" @@ -18,7 +19,6 @@ #include "third_party/blink/renderer/platform/graphics/image.h" #include "third_party/blink/renderer/platform/instrumentation/histogram.h" #include "third_party/blink/renderer/platform/wtf/hash_functions.h" -#include "third_party/blink/renderer/platform/wtf/lru_cache.h" #include "third_party/skia/include/core/SkColorFilter.h" namespace blink { @@ -86,10 +86,10 @@ ~DarkModeInvertedColorCache() = default; SkColor GetInvertedColor(DarkModeColorFilter* filter, SkColor color) { - WTF::IntegralWithAllKeys<SkColor> key(color); - SkColor* cached_value = cache_.Get(key); - if (cached_value) - return *cached_value; + SkColor key(color); + auto it = cache_.Get(key); + if (it != cache_.end()) + return it->second; SkColor inverted_color = filter->InvertColor(color); cache_.Put(key, static_cast<SkColor>(inverted_color)); @@ -101,7 +101,7 @@ size_t size() { return cache_.size(); } private: - WTF::LruCache<WTF::IntegralWithAllKeys<SkColor>, SkColor> cache_; + base::HashingLRUCache<SkColor, SkColor> cache_; }; DarkModeFilter::DarkModeFilter(const DarkModeSettings& settings)
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc index 9909ba02..fe6d9ae 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/dedicated_or_shared_worker_fetch_context_impl.cc
@@ -192,9 +192,8 @@ cors_exempt_header_list_(cors_exempt_header_list.size()), pending_resource_load_info_notifier_( std::move(pending_resource_load_info_notifier)) { - // Make a deep copy because we will visit it on the worker thread. for (const WebString& cors_exempt_header : cors_exempt_header_list) - cors_exempt_header_list_.emplace_back(cors_exempt_header.IsolatedCopy()); + cors_exempt_header_list_.emplace_back(cors_exempt_header); } scoped_refptr<WebDedicatedOrSharedWorkerFetchContext> @@ -484,8 +483,7 @@ void DedicatedOrSharedWorkerFetchContextImpl::set_client_id( const WebString& client_id) { - // Make a deep copy because we will visit it on the worker thread. - client_id_ = client_id.IsolatedCopy(); + client_id_ = client_id; } WebString DedicatedOrSharedWorkerFetchContextImpl::GetAcceptLanguages() const { @@ -592,8 +590,8 @@ FROM_HERE, base::BindOnce( &CreateServiceWorkerSubresourceLoaderFactory, - std::move(cloned_service_worker_container_host), - client_id_.IsolatedCopy(), fallback_factory_->Clone(), + std::move(cloned_service_worker_container_host), client_id_, + fallback_factory_->Clone(), service_worker_url_loader_factory.InitWithNewPipeAndPassReceiver(), task_runner)); web_loader_factory_->SetServiceWorkerURLLoaderFactory(
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender.cc index 91822d4..82912dd 100644 --- a/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender.cc +++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender.cc
@@ -79,16 +79,9 @@ }; template <> -struct CrossThreadCopier<blink::WebVector<blink::WebString>> { +struct CrossThreadCopier<blink::WebVector<blink::WebString>> + : public CrossThreadCopierPassThrough<blink::WebVector<blink::WebString>> { STATIC_ONLY(CrossThreadCopier); - using Type = blink::WebVector<blink::WebString>; - static Type Copy(const Type& value) { - Type result; - result.reserve(value.size()); - for (const auto& element : value) - result.emplace_back(element.IsolatedCopy()); - return result; - } }; } // namespace WTF
diff --git a/third_party/blink/renderer/platform/webrtc/convert_to_webrtc_video_frame_buffer.cc b/third_party/blink/renderer/platform/webrtc/convert_to_webrtc_video_frame_buffer.cc index ca4773a..cd5d1b3 100644 --- a/third_party/blink/renderer/platform/webrtc/convert_to_webrtc_video_frame_buffer.cc +++ b/third_party/blink/renderer/platform/webrtc/convert_to_webrtc_video_frame_buffer.cc
@@ -383,6 +383,16 @@ const_cast<uint8_t*>(yuv_buffer->DataV()), timestamp); break; } + case webrtc::VideoFrameBuffer::Type::kI422: { + const webrtc::I422BufferInterface* yuv_buffer = buffer->GetI422(); + video_frame = media::VideoFrame::WrapExternalYuvData( + media::PIXEL_FORMAT_I422, size, gfx::Rect(size), size, + yuv_buffer->StrideY(), yuv_buffer->StrideU(), yuv_buffer->StrideV(), + const_cast<uint8_t*>(yuv_buffer->DataY()), + const_cast<uint8_t*>(yuv_buffer->DataU()), + const_cast<uint8_t*>(yuv_buffer->DataV()), timestamp); + break; + } case webrtc::VideoFrameBuffer::Type::kI010: { const webrtc::I010BufferInterface* yuv_buffer = buffer->GetI010(); // WebRTC defines I010 data as uint16 whereas Chromium uses uint8 for all @@ -400,6 +410,23 @@ timestamp); break; } + case webrtc::VideoFrameBuffer::Type::kI210: { + const webrtc::I210BufferInterface* yuv_buffer = buffer->GetI210(); + // WebRTC defines I210 data as uint16 whereas Chromium uses uint8 for all + // video formats, so conversion and cast is needed. + video_frame = media::VideoFrame::WrapExternalYuvData( + media::PIXEL_FORMAT_YUV422P10, size, gfx::Rect(size), size, + yuv_buffer->StrideY() * 2, yuv_buffer->StrideU() * 2, + yuv_buffer->StrideV() * 2, + const_cast<uint8_t*>( + reinterpret_cast<const uint8_t*>(yuv_buffer->DataY())), + const_cast<uint8_t*>( + reinterpret_cast<const uint8_t*>(yuv_buffer->DataU())), + const_cast<uint8_t*>( + reinterpret_cast<const uint8_t*>(yuv_buffer->DataV())), + timestamp); + break; + } case webrtc::VideoFrameBuffer::Type::kNV12: { const webrtc::NV12BufferInterface* nv12_buffer = buffer->GetNV12(); video_frame = media::VideoFrame::WrapExternalYuvData(
diff --git a/third_party/blink/renderer/platform/wtf/BUILD.gn b/third_party/blink/renderer/platform/wtf/BUILD.gn index 223ad3e..076cf7b8 100644 --- a/third_party/blink/renderer/platform/wtf/BUILD.gn +++ b/third_party/blink/renderer/platform/wtf/BUILD.gn
@@ -87,7 +87,6 @@ "hash_traits.h", "leak_annotations.h", "linked_hash_set.h", - "lru_cache.h", "math_extras.h", "pod_arena.h", "pod_free_list_arena.h", @@ -305,7 +304,6 @@ "hash_map_test.cc", "hash_set_test.cc", "linked_hash_set_test.cc", - "lru_cache_test.cc", "math_extras_test.cc", "pod_arena_test.cc", "pod_arena_test_helpers.h",
diff --git a/third_party/blink/renderer/platform/wtf/lru_cache.h b/third_party/blink/renderer/platform/wtf/lru_cache.h deleted file mode 100644 index c2d27f0..0000000 --- a/third_party/blink/renderer/platform/wtf/lru_cache.h +++ /dev/null
@@ -1,148 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_LRU_CACHE_H_ -#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_LRU_CACHE_H_ - -#include <memory> - -#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" -#include "third_party/blink/renderer/platform/wtf/construct_traits.h" -#include "third_party/blink/renderer/platform/wtf/doubly_linked_list.h" -#include "third_party/blink/renderer/platform/wtf/hash_map.h" -#include "third_party/blink/renderer/platform/wtf/hash_table_deleted_value_type.h" - -namespace WTF { - -// LruCache is a simple least-recently-used cache based on HashMap and -// DoublyLinkedList. Useful in situations where caching by using a HashMap is -// desirable but needs to be limited in size to not grow out of proportions. -// LruCache uses a HashMap to store cache entries, and uses a DoublyLinkedList -// in parallel to keep track of the age of entries. Accessing an entry using -// Get() refreshes its age, Put() places a new entry into the HashMap with -// youngest age as well. The least recently used entry of the list is pruned -// when a Put() call would otherwise exceed the max_size limit. -// -// Example: -// const size_t kMaxSize = 2; -// LruCache<uint16_t, String> my_cache(kMaxSize); -// my_cache.Put(13, "first string"); -// my_cache.Put(42, "second string"); -// my_cache.Put(256, "third string"); -// my_cache.Get(13) // -> nullptr, has been removed due to kMaxSize == 2. -// my_cache.Get(42) // -> String* "second string" -// my_cache.Get(256) // -> String* "third_string" -// -// See lru_cache_test.cc for more examples. -template <typename KeyArg, - typename MappedArg, - typename HashArg = typename DefaultHash<KeyArg>::Hash, - typename KeyTraitsArg = HashTraits<KeyArg>> -class LruCache { - USING_FAST_MALLOC(LruCache); - - private: - class MappedListNodeWithKey final - : public DoublyLinkedListNode<MappedListNodeWithKey> { - USING_FAST_MALLOC(MappedListNodeWithKey); - - public: - friend class DoublyLinkedListNode<MappedListNodeWithKey>; - - MappedListNodeWithKey(const KeyArg& key, MappedArg&& mapped_arg) - : key_(key), mapped_value_(std::move(mapped_arg)) {} - - MappedArg* Value() { return &mapped_value_; } - - void SetValue(MappedArg&& mapped_arg) { - mapped_value_ = std::move(mapped_arg); - } - - const KeyArg& Key() const { return key_; } - - private: - KeyArg key_; - MappedArg mapped_value_; - MappedListNodeWithKey* prev_{nullptr}; - MappedListNodeWithKey* next_{nullptr}; - }; - - using MappedListNode = std::unique_ptr<MappedListNodeWithKey>; - - using HashMapType = HashMap<KeyArg, MappedListNode, HashArg, KeyTraitsArg>; - - public: - LruCache(size_t max_size) : max_size_(max_size) { - static_assert(!IsGarbageCollectedType<KeyArg>::value || - !IsGarbageCollectedType<MappedArg>::value, - "Cannot use LruCache<> with garbage collected types."); - CHECK_GT(max_size_, 0u); - } - - // Retrieve cache entry under |key| if it exists and refresh its age. - // Returns: pointer to cache entry or nullptr if no entry is found for that - // key. - MappedArg* Get(const KeyArg& key) { - if (map_.IsEmpty()) - return nullptr; - - typename HashMapType::iterator find_result = map_.find(key); - if (find_result == map_.end()) - return nullptr; - - // Move result to beginning of list. - MappedListNodeWithKey* node = find_result->value.get(); - ordering_.Remove(node); - ordering_.Push(node); - return find_result->value->Value(); - } - - // Place entry in cache as new / youngest. Multiple calls to Put() with an - // identical key but differing MappedArg will override the stored value and - // refresh the age. - void Put(const KeyArg& key, MappedArg&& arg) { - { - typename HashMapType::iterator find_result = map_.find(key); - if (find_result != map_.end()) { - find_result->value->SetValue(std::move(arg)); - ordering_.Remove(find_result->value.get()); - ordering_.Push(find_result->value.get()); - } else { - auto list_node = - std::make_unique<MappedListNodeWithKey>(key, std::move(arg)); - typename HashMapType::AddResult add_result = - map_.insert(key, std::move(list_node)); - DCHECK(add_result.is_new_entry); - ordering_.Push(add_result.stored_value->value.get()); - } - } - - if (map_.size() > max_size_) { - RemoveLeastRecentlyUsed(); - } - } - - // Clear the cache, remove all elements. - void Clear() { - map_.clear(); - ordering_.Clear(); - } - - size_t size() { return map_.size(); } - - private: - void RemoveLeastRecentlyUsed() { - MappedListNodeWithKey* tail = ordering_.Tail(); - ordering_.Remove(tail); - map_.erase(tail->Key()); - } - - HashMapType map_; - DoublyLinkedList<MappedListNodeWithKey> ordering_; - size_t max_size_; -}; - -} // namespace WTF - -#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_LRU_CACHE_H_
diff --git a/third_party/blink/renderer/platform/wtf/lru_cache_test.cc b/third_party/blink/renderer/platform/wtf/lru_cache_test.cc deleted file mode 100644 index 914b15d..0000000 --- a/third_party/blink/renderer/platform/wtf/lru_cache_test.cc +++ /dev/null
@@ -1,110 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/platform/wtf/lru_cache.h" - -#include "third_party/blink/renderer/platform/wtf/text/string_builder.h" -#include "third_party/blink/renderer/platform/wtf/text/string_hash.h" -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" -#include "third_party/blink/renderer/platform/wtf/vector.h" - -#include "testing/gtest/include/gtest/gtest.h" - -namespace WTF { - -TEST(LruCacheTest, TestEmpty) { - LruCache<int, int> test_cache(1); - EXPECT_EQ(test_cache.Get(0), nullptr); -} - -TEST(LruCacheTest, TestInstantiation) { - const int kMaxSize = 10; - const int kOffset = 1000; - LruCache<int, int> test_cache(kMaxSize); - EXPECT_EQ(test_cache.size(), 0u); - for (size_t i = 1; i < kMaxSize * 10; ++i) { - test_cache.Put(i, kOffset + i); - } - EXPECT_EQ(test_cache.size(), kMaxSize * 1u); - EXPECT_EQ(*test_cache.Get(kMaxSize * 10 - 1), kOffset + (kMaxSize * 10 - 1)); - EXPECT_EQ(*test_cache.Get(kMaxSize * 10 - 2), kOffset + (kMaxSize * 10 - 2)); - EXPECT_EQ(test_cache.Get(89), nullptr); - EXPECT_EQ(test_cache.Get(1), nullptr); - test_cache.Clear(); - EXPECT_EQ(test_cache.size(), 0u); -} - -TEST(LruCacheTest, TestString) { - const size_t kMaxSize = 4; - const char* test_strings[] = {"1_testing", "2_LruCache", "3_using", - "4_several", "5_random", "6_strings"}; - LruCache<uint16_t, String> test_cache(kMaxSize); - uint16_t counter = 1; - EXPECT_EQ(test_cache.size(), 0u); - for (auto* test_string : test_strings) { - test_cache.Put(counter, test_string); - counter++; - } - EXPECT_EQ(test_cache.size(), kMaxSize); - EXPECT_EQ(test_cache.Get(1), nullptr); - EXPECT_EQ(test_cache.Get(2), nullptr); - EXPECT_EQ(*test_cache.Get(3), String(test_strings[2])); - EXPECT_EQ(*test_cache.Get(4), String(test_strings[3])); - EXPECT_EQ(*test_cache.Get(5), String(test_strings[4])); - EXPECT_EQ(*test_cache.Get(6), String(test_strings[5])); - test_cache.Put(1, test_strings[0]); - EXPECT_EQ(*test_cache.Get(1), String(test_strings[0])); - EXPECT_EQ(test_cache.Get(3), nullptr); - EXPECT_EQ(*test_cache.Get(4), String(test_strings[3])); - EXPECT_EQ(*test_cache.Get(5), String(test_strings[4])); - EXPECT_EQ(*test_cache.Get(6), String(test_strings[5])); - test_cache.Clear(); - EXPECT_EQ(test_cache.size(), 0u); -} - -TEST(LruCacheTest, TestOverrideKey) { - const size_t kMaxSize = 2; - const char* test_strings[] = {"original_value", "override"}; - LruCache<uint16_t, String> test_cache(kMaxSize); - EXPECT_EQ(test_cache.size(), 0u); - test_cache.Put(1, test_strings[0]); - test_cache.Put(1, test_strings[1]); - EXPECT_EQ(*test_cache.Get(1), String(test_strings[1])); -} - -TEST(LruCacheTest, StringToVector) { - const size_t kMaxSize = 4u; - LruCache<String, Vector<String>> typeface_cache(kMaxSize); - - struct FontFallbackExample { - String locale; - String typeface_name; - } example_typefaces[] = {{"en_us", "Arial"}, - {"ko", "Malgun Gothic"}, - {"ja", "Yu Gothic UI"}, - {"en_us", "Times New Roman"}, - {"en_us", "Calibri"}, - {"km", "Leelawadee UI"}, - {"zh-Hans", "Microsoft Yahei UI"}, - {"bn", "Nirmala UI"}}; - for (auto& example : example_typefaces) { - Vector<String>* cache_for_locale = typeface_cache.Get(example.locale); - if (cache_for_locale) { - cache_for_locale->push_back(example.typeface_name); - } else { - Vector<String> new_cache_for_locale; - new_cache_for_locale.push_back(example.typeface_name); - typeface_cache.Put(String(example.locale), - std::move(new_cache_for_locale)); - } - } - Vector<String>* vector_for_latin = typeface_cache.Get("en_us"); - EXPECT_TRUE(vector_for_latin); - EXPECT_EQ(vector_for_latin->size(), 3u); - EXPECT_EQ(typeface_cache.Get("zh-Hant"), nullptr); - EXPECT_EQ(typeface_cache.Get("ko"), nullptr); - EXPECT_EQ(typeface_cache.Get("ja"), nullptr); -} - -} // namespace WTF
diff --git a/third_party/blink/renderer/platform/wtf/text/string_hash.h b/third_party/blink/renderer/platform/wtf/text/string_hash.h index 35f0537..eeb0450 100644 --- a/third_party/blink/renderer/platform/wtf/text/string_hash.h +++ b/third_party/blink/renderer/platform/wtf/text/string_hash.h
@@ -92,6 +92,15 @@ } // namespace WTF +namespace std { +template <> +struct hash<WTF::String> { + size_t operator()(const WTF::String& string) const { + return WTF::StringHash::GetHash(string); + } +}; +} // namespace std + using WTF::AlreadyHashed; using WTF::StringHash;
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py index 2ce26e1..102b35d 100755 --- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py +++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -79,6 +79,7 @@ 'base::PlatformThreadId', 'base::RefCountedData', 'base::RunLoop', + 'base::HashingLRUCache', 'base::ReadOnlySharedMemoryMapping', 'base::ReadOnlySharedMemoryRegion', 'base::RemoveChars',
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests index 92681a6..e910d59 100644 --- a/third_party/blink/web_tests/SlowTests +++ b/third_party/blink/web_tests/SlowTests
@@ -84,12 +84,16 @@ crbug.com/1280873 http/tests/inspector-protocol/network/xhr-cors-preflight-redirect-failure.js [ Slow ] crbug.com/1280697 http/tests/inspector-protocol/network/block_cross_site_document_load.js [ Slow ] crbug.com/1280585 http/tests/inspector-protocol/network/xhr-post-replay-cors.js [ Slow ] -crbug.com/1280537 http/tests/inspector-protocol/network/blocked-cookie-same-site-lax.js [ Slow ] +crbug.com/1280537 http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-browser-navigate.js [ Slow ] +crbug.com/1280537 http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-navigate.js [ Slow ] +crbug.com/1280537 http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-subresource.js [ Slow ] crbug.com/1279832 http/tests/inspector-protocol/network/cross-origin-isolation/coop-coep-get-security-isolation-info.js [ Slow ] crbug.com/1277877 http/tests/inspector-protocol/network/blocked-cookie-same-site-strict-browser-navigate.js [ Slow ] crbug.com/1277877 http/tests/inspector-protocol/network/blocked-cookie-same-site-strict-js-navigate.js [ Slow ] crbug.com/1277877 http/tests/inspector-protocol/network/blocked-cookie-same-site-strict-js-subresource.js [ Slow ] -crbug.com/1280736 http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict.js [ Slow ] +crbug.com/1280736 http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-browser-navigate.js [ Slow ] +crbug.com/1280736 http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-navigate.js [ Slow ] +crbug.com/1280736 http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-subresource.js [ Slow ] crbug.com/1327867 http/tests/inspector-protocol/network/initiator-minified.js [ Slow ] crbug.com/1325514 http/tests/inspector-protocol/network/cookies-protocol-test.js [ Slow ] crbug.com/1280882 http/tests/inspector-protocol/network/cors-errors.js [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 0cd3dc2..023a44f 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -6581,7 +6581,6 @@ crbug.com/1276201 [ Mac11-arm64 ] external/wpt/html/browsers/the-window-object/open-close/open-features-tokenization-width-height.html [ Skip ] crbug.com/1275967 [ Linux ] external/wpt/permissions-policy/permissions-policy-frame-policy-timing.https.sub.html [ Failure Pass ] crbug.com/1275944 [ Mac ] http/tests/devtools/sources/debugger-ui/reveal-not-skipped.js [ Failure Pass ] -crbug.com/1276206 http/tests/inspector-protocol/network/blocked-cookie-same-party.js [ Failure Pass Timeout ] crbug.com/1276207 virtual/gpu-rasterization/images/color-profile-image-object-fit.html [ Failure Pass ] crbug.com/1276208 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-fillPath-alpha-shadow.html [ Pass Timeout ] crbug.com/1276290 [ Mac ] wpt_internal/mediastream/mediastreamtrackprocessor-transfer-to-worker.html [ Skip ] @@ -6635,8 +6634,12 @@ # Sheriff 2021-12-30 crbug.com/1229096 [ Win ] fast/scrolling/events/overscroll-event-fired-to-scrolled-element.html [ Failure Pass ] crbug.com/1279758 [ Win10.20h2 ] virtual/threaded-prefer-compositing/fast/scrolling/scroll-animation-on-by-default.html [ Failure Pass ] -crbug.com/1280736 [ Win10.20h2 ] http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict.js [ Pass Timeout ] -crbug.com/1280736 [ Win10.20h2 ] http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax.js [ Pass Timeout ] +crbug.com/1280736 [ Win10.20h2 ] http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-browser-navigate.js [ Pass Timeout ] +crbug.com/1280736 [ Win10.20h2 ] http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-navigate.js [ Pass Timeout ] +crbug.com/1280736 [ Win10.20h2 ] http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-subresource.js [ Pass Timeout ] +crbug.com/1280736 [ Win10.20h2 ] http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-browser-navigate.js [ Pass Timeout ] +crbug.com/1280736 [ Win10.20h2 ] http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-navigate.js [ Pass Timeout ] +crbug.com/1280736 [ Win10.20h2 ] http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-subresource.js [ Pass Timeout ] # Sheriff 2022-01-04 crbug.com/1283865 external/wpt/webmessaging/without-ports/020.html [ Failure Pass ] @@ -6651,7 +6654,9 @@ crbug.com/1285438 fast/layers/clip-rects-transformed.html [ Failure Pass ] crbug.com/1285431 [ Mac ] virtual/backface-visibility-interop/compositing/overflow/transform-should-update-absolute-clip-rects.html [ Crash Failure Pass ] crbug.com/1285437 virtual/scroll-unification-prefer_compositing_to_lcd_text/fast/scroll-behavior/smooth-scroll/ongoing-smooth-scroll-vertical-rl-anchors.html [ Pass Timeout ] -crbug.com/1285436 virtual/partitioned-cookies/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax.js [ Crash Failure Pass Timeout ] +crbug.com/1285436 virtual/partitioned-cookies/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-browser-navigate.js [ Crash Failure Pass Timeout ] +crbug.com/1285436 virtual/partitioned-cookies/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-navigate.js [ Crash Failure Pass Timeout ] +crbug.com/1285436 virtual/partitioned-cookies/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-subresource.js [ Crash Failure Pass Timeout ] # Sheriff 2022-01-12 crbug.com/1286619 [ Mac ] external/wpt/storage-access-api/storageAccess.testdriver.sub.html [ Failure Pass ] @@ -6834,7 +6839,6 @@ crbug.com/1269534 fast/spatial-navigation/snav-zero-margin-content.html [ Failure Pass ] crbug.com/1295980 virtual/fenced-frame-mparch/wpt_internal/fenced_frame/user-activation.https.html [ Failure Pass Timeout ] crbug.com/1295980 virtual/fenced-frame-shadow-dom/wpt_internal/fenced_frame/user-activation.https.html [ Failure Pass Timeout ] -crbug.com/1280537 virtual/first-party-sets/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax.js [ Failure Pass Timeout ] crbug.com/1298633 http/tests/inspector-protocol/network/cross-origin-isolation/coep-load-error-reporting-worker.js [ Pass Timeout ] # Sheriff 2022-03-16 @@ -7080,3 +7084,6 @@ # Manual test fails when run under automation due to lack of pop-up blocking. https://github.com/web-platform-tests/wpt/issues/3867 crbug.com/1337125 external/wpt/window-placement/fullscreen-companion-window-manual.tentative.https.html [ Failure ] + +# Temporarily disable test to merge DevTools top layer support +crbug.com/1313690 http/tests/devtools/elements/iframe-load-event.js [ Skip ]
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-party-browser-navigate.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-party-browser-navigate.js new file mode 100644 index 0000000..43e0da7 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-party-browser-navigate.js
@@ -0,0 +1,22 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making cross-party navigation requests from browser with SameParty cookies sends us Network.RequestWillBeSentExtraInfo events with corresponding associated cookies.\n`); + await dp.Network.enable(); + + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameParty; SameSite=None; Secure'); + const firstPartyUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/hello-world.html'; + const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // set the SameParty cookie + await helper.navigateWithExtraInfo(setCookieUrl); + + // navigate to a cross-party domain and back from the browser and see that the cookie is not blocked + await helper.navigateWithExtraInfo(thirdPartyUrl); + let {requestExtraInfo} = await helper.navigateWithExtraInfo(firstPartyUrl); + testRunner.log(requestExtraInfo.params.associatedCookies, 'Browser initiated navigation associated cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-navigate.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-navigate.js new file mode 100644 index 0000000..ce9f4006 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-navigate.js
@@ -0,0 +1,22 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making cross-party navigation requests from JS with SameParty cookies sends us Network.RequestWillBeSentExtraInfo events with corresponding associated cookies.\n`); + await dp.Network.enable(); + + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameParty; SameSite=None; Secure'); + const firstPartyUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/hello-world.html'; + const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // set the SameParty cookie + await helper.navigateWithExtraInfo(setCookieUrl); + + // navigate to a cross-party domain and back from javascript and see that the cookie is not blocked + await helper.navigateWithExtraInfo(thirdPartyUrl); + ({requestExtraInfo} = await helper.jsNavigateWithExtraInfo(firstPartyUrl)); + testRunner.log(requestExtraInfo.params.associatedCookies, 'Javascript initiated navigation associated cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-subresource.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-subresource.js new file mode 100644 index 0000000..667b20e --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-subresource.js
@@ -0,0 +1,22 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making cross-party subresource requests from JS with SameParty cookies sends us Network.RequestWillBeSentExtraInfo events with corresponding associated cookies.\n`); + await dp.Network.enable(); + + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameParty; SameSite=None; Secure'); + const firstPartyUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/hello-world.html'; + const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // set the SameParty cookie + await helper.navigateWithExtraInfo(setCookieUrl); + + // navigate away and make a subresource request from javascript, see that the cookie is not blocked + await helper.navigateWithExtraInfo(thirdPartyUrl); + ({requestExtraInfo} = await helper.fetchWithExtraInfo(firstPartyUrl)); + testRunner.log(requestExtraInfo.params.associatedCookies, 'Javascript initiated subresource associated cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-party.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-party.js deleted file mode 100644 index 607393c..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-party.js +++ /dev/null
@@ -1,32 +0,0 @@ -(async function(testRunner) { - const {page, session, dp} = await testRunner.startBlank( - `Verifies that making cross-party requests with SameParty cookies sends us Network.RequestWillBeSentExtraInfo events with corresponding associated cookies.\n`); - await dp.Network.enable(); - - const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' - + encodeURIComponent('name=value; SameParty; SameSite=None; Secure'); - const firstPartyUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/hello-world.html'; - const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; - - const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); - - // set the SameParty cookie - await helper.navigateWithExtraInfo(setCookieUrl); - - // navigate to a cross-party domain and back from the browser and see that the cookie is not blocked - await helper.navigateWithExtraInfo(thirdPartyUrl); - let {requestExtraInfo} = await helper.navigateWithExtraInfo(firstPartyUrl); - testRunner.log(requestExtraInfo.params.associatedCookies, 'Browser initiated navigation associated cookies:'); - - // navigate to a cross-party domain and back from javascript and see that the cookie is not blocked - await helper.navigateWithExtraInfo(thirdPartyUrl); - ({requestExtraInfo} = await helper.jsNavigateWithExtraInfo(firstPartyUrl)); - testRunner.log(requestExtraInfo.params.associatedCookies, 'Javascript initiated navigation associated cookies:'); - - // navigate away and make a subresource request from javascript, see that the cookie is not blocked - await helper.navigateWithExtraInfo(thirdPartyUrl); - ({requestExtraInfo} = await helper.fetchWithExtraInfo(firstPartyUrl)); - testRunner.log(requestExtraInfo.params.associatedCookies, 'Javascript initiated subresource associated cookies:'); - - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-browser-navigate.js similarity index 100% rename from third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax.js rename to third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-browser-navigate.js
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-navigate.js similarity index 100% copy from third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax.js copy to third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-navigate.js
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-subresource.js similarity index 100% copy from third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax.js copy to third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-subresource.js
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-browser-navigate.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-browser-navigate.js new file mode 100644 index 0000000..b7496d0 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-browser-navigate.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making cross-party navigation requests from browser which set SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=None; SameParty; Secure'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross-party navigation via browser to set the cookie, see that it is not blocked + await helper.navigateWithExtraInfo(thirdPartyUrl); + ({responseExtraInfo} = await helper.navigateWithExtraInfo(setCookieUrl)); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Browser initiated navigation blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-navigate.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-navigate.js new file mode 100644 index 0000000..c1fe76e --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-navigate.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making cross-party navigation requests from JS which set SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=None; SameParty; Secure'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross-party navigation via javascript to set the cookie, see that it is not blocked + await helper.navigateWithExtraInfo(thirdPartyUrl); + ({responseExtraInfo} = await helper.jsNavigateWithExtraInfo(setCookieUrl)); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated navigation blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-subresource.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-subresource.js new file mode 100644 index 0000000..2bafe93 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-subresource.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making cross-party subresource requests from JS which set SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=None; SameParty; Secure'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross-party request to set the cookie, see that it is not blocked + await helper.navigateWithExtraInfo(thirdPartyUrl); + let {responseExtraInfo} = await helper.fetchWithExtraInfo(setCookieUrl); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated subresource blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party.js deleted file mode 100644 index 6d53c05..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party.js +++ /dev/null
@@ -1,28 +0,0 @@ -(async function(testRunner) { - const {page, session, dp} = await testRunner.startBlank( - `Verifies that making cross-party requests which set SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); - await dp.Network.enable(); - - const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; - const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' - + encodeURIComponent('name=value; SameSite=None; SameParty; Secure'); - - const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); - - // make a cross-party request to set the cookie, see that it is not blocked - await helper.navigateWithExtraInfo(thirdPartyUrl); - let {responseExtraInfo} = await helper.fetchWithExtraInfo(setCookieUrl); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated subresource blocked set-cookies:'); - - // make a cross-party navigation via javascript to set the cookie, see that it is not blocked - await helper.navigateWithExtraInfo(thirdPartyUrl); - ({responseExtraInfo} = await helper.jsNavigateWithExtraInfo(setCookieUrl)); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated navigation blocked set-cookies:'); - - // make a cross-party navigation via browser to set the cookie, see that it is not blocked - await helper.navigateWithExtraInfo(thirdPartyUrl); - ({responseExtraInfo} = await helper.navigateWithExtraInfo(setCookieUrl)); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Browser initiated navigation blocked set-cookies:'); - - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-browser-navigate.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-browser-navigate.js new file mode 100644 index 0000000..d6eca36 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-browser-navigate.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making navigation requests from browser which set nonsecure SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const firstPartyUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=None; SameParty'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross-party navigation via browser to set the cookie, see that it is blocked + await helper.navigateWithExtraInfo(firstPartyUrl); + ({responseExtraInfo} = await helper.navigateWithExtraInfo(setCookieUrl)); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Browser initiated navigation blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-js-navigate.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-js-navigate.js new file mode 100644 index 0000000..b1daa94 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-js-navigate.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making navigation requests from JS which set nonsecure SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const firstPartyUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=None; SameParty'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross-party navigation via javascript to set the cookie, see that it is blocked + await helper.navigateWithExtraInfo(firstPartyUrl); + ({responseExtraInfo} = await helper.jsNavigateWithExtraInfo(setCookieUrl)); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated navigation blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-js-subresource.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-js-subresource.js new file mode 100644 index 0000000..005d941 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-js-subresource.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making subresource requests from JS which set nonsecure SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const firstPartyUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=None; SameParty'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross-party request to set the cookie, see that it is blocked + await helper.navigateWithExtraInfo(firstPartyUrl); + let {responseExtraInfo} = await helper.fetchWithExtraInfo(setCookieUrl); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated subresource blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure.js deleted file mode 100644 index 21e2695..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure.js +++ /dev/null
@@ -1,28 +0,0 @@ -(async function(testRunner) { - const {page, session, dp} = await testRunner.startBlank( - `Verifies that making requests which set nonsecure SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); - await dp.Network.enable(); - - const firstPartyUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/hello-world.html'; - const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' - + encodeURIComponent('name=value; SameSite=None; SameParty'); - - const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); - - // make a cross-party request to set the cookie, see that it is blocked - await helper.navigateWithExtraInfo(firstPartyUrl); - let {responseExtraInfo} = await helper.fetchWithExtraInfo(setCookieUrl); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated subresource blocked set-cookies:'); - - // make a cross-party navigation via javascript to set the cookie, see that it is blocked - await helper.navigateWithExtraInfo(firstPartyUrl); - ({responseExtraInfo} = await helper.jsNavigateWithExtraInfo(setCookieUrl)); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated navigation blocked set-cookies:'); - - // make a cross-party navigation via browser to set the cookie, see that it is blocked - await helper.navigateWithExtraInfo(firstPartyUrl); - ({responseExtraInfo} = await helper.navigateWithExtraInfo(setCookieUrl)); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Browser initiated navigation blocked set-cookies:'); - - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-browser-navigate.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-browser-navigate.js new file mode 100644 index 0000000..ae52c06 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-browser-navigate.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making subresource requests from JS which set "SameParty; SameSite=Strict" cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const firstPartyUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=Strict; SameParty; Secure'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross-party request to set the cookie, see that it gets blocked + await helper.navigateWithExtraInfo(firstPartyUrl); + let {responseExtraInfo} = await helper.fetchWithExtraInfo(setCookieUrl); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated subresource blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-js-navigate.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-js-navigate.js new file mode 100644 index 0000000..10cbd2f --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-js-navigate.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making navigation requests from JS which set "SameParty; SameSite=Strict" cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const firstPartyUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=Strict; SameParty; Secure'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross-party navigation via javascript to set the cookie, see that it is blocked + await helper.navigateWithExtraInfo(firstPartyUrl); + const {responseExtraInfo} = await helper.jsNavigateWithExtraInfo(setCookieUrl); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated navigation blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-js-subresource.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-js-subresource.js new file mode 100644 index 0000000..ae52c06 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-js-subresource.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making subresource requests from JS which set "SameParty; SameSite=Strict" cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const firstPartyUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=Strict; SameParty; Secure'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross-party request to set the cookie, see that it gets blocked + await helper.navigateWithExtraInfo(firstPartyUrl); + let {responseExtraInfo} = await helper.fetchWithExtraInfo(setCookieUrl); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated subresource blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict.js deleted file mode 100644 index 1347d0d..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict.js +++ /dev/null
@@ -1,28 +0,0 @@ -(async function(testRunner) { - const {page, session, dp} = await testRunner.startBlank( - `Verifies that making requests which set "SameParty; SameSite=Strict" cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); - await dp.Network.enable(); - - const firstPartyUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/hello-world.html'; - const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' - + encodeURIComponent('name=value; SameSite=Strict; SameParty; Secure'); - - const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); - - // make a cross-party request to set the cookie, see that it gets blocked - await helper.navigateWithExtraInfo(firstPartyUrl); - let {responseExtraInfo} = await helper.fetchWithExtraInfo(setCookieUrl); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated subresource blocked set-cookies:'); - - // make a cross-party navigation via javascript to set the cookie, see that it is blocked - await helper.navigateWithExtraInfo(firstPartyUrl); - ({responseExtraInfo} = await helper.jsNavigateWithExtraInfo(setCookieUrl)); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated navigation blocked set-cookies:'); - - // make a cross-party navigation via browser to set the cookie, see that it is blocked - await helper.navigateWithExtraInfo(firstPartyUrl); - ({responseExtraInfo} = await helper.navigateWithExtraInfo(setCookieUrl)); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Browser initiated navigation blocked set-cookies:'); - - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-browser-navigate.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-browser-navigate.js new file mode 100644 index 0000000..a9ef96b --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-browser-navigate.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making cross origin navigation requests from browser which set SameSite=Lax cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=Lax'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross origin navigation via browser to set the cookie, see that it is not blocked + await helper.navigateWithExtraInfo(thirdPartyUrl); + var {responseExtraInfo} = await helper.navigateWithExtraInfo(setCookieUrl); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Browser initiated navigation blocked set-cookies'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-navigate.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-navigate.js new file mode 100644 index 0000000..d3ebfca --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-navigate.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making cross origin navigation requests from JS which set SameSite=Lax cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=Lax'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross origin navigation via javascript to set the cookie, see that it is not blocked + await helper.navigateWithExtraInfo(thirdPartyUrl); + var {responseExtraInfo} = await helper.jsNavigateWithExtraInfo(setCookieUrl); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated navigation blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-subresource.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-subresource.js new file mode 100644 index 0000000..fc2288e9 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-subresource.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making cross origin subresource requests from JS which set SameSite=Lax cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=Lax'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross origin request to set the cookie, see that it gets blocked + await helper.navigateWithExtraInfo(thirdPartyUrl); + var {responseExtraInfo} = await helper.fetchWithExtraInfo(setCookieUrl); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated subresource blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax.js deleted file mode 100644 index 11e1a7d..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax.js +++ /dev/null
@@ -1,28 +0,0 @@ -(async function(testRunner) { - const {page, session, dp} = await testRunner.startBlank( - `Verifies that making cross origin requests which set SameSite=Lax cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); - await dp.Network.enable(); - - const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; - const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' - + encodeURIComponent('name=value; SameSite=Lax'); - - const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); - - // make a cross origin request to set the cookie, see that it gets blocked - await helper.navigateWithExtraInfo(thirdPartyUrl); - var {responseExtraInfo} = await helper.fetchWithExtraInfo(setCookieUrl); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated subresource blocked set-cookies:'); - - // make a cross origin navigation via javascript to set the cookie, see that it is not blocked - await helper.navigateWithExtraInfo(thirdPartyUrl); - var {responseExtraInfo} = await helper.jsNavigateWithExtraInfo(setCookieUrl); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated navigation blocked set-cookies:'); - - // make a cross origin navigation via browser to set the cookie, see that it is not blocked - await helper.navigateWithExtraInfo(thirdPartyUrl); - var {responseExtraInfo} = await helper.navigateWithExtraInfo(setCookieUrl); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Browser initiated navigation blocked set-cookies'); - - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-browser-navigate.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-browser-navigate.js new file mode 100644 index 0000000..d1ff62b --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-browser-navigate.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making cross origin navigation requests from browser which set SameSite=Strict cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=Strict'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross origin navigation via browser to set the cookie, see that it is not blocked + await helper.navigateWithExtraInfo(thirdPartyUrl); + var {responseExtraInfo} = await helper.navigateWithExtraInfo(setCookieUrl); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Browser initiated navigation blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-navigate.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-navigate.js new file mode 100644 index 0000000..1b767275 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-navigate.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making cross origin navigation requests from JS which set SameSite=Strict cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=Strict'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross origin navigation via javascript to set the cookie, see that it gets blocked + await helper.navigateWithExtraInfo(thirdPartyUrl); + var {responseExtraInfo} = await helper.jsNavigateWithExtraInfo(setCookieUrl); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated navigation blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-subresource.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-subresource.js new file mode 100644 index 0000000..9fb83d4 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-subresource.js
@@ -0,0 +1,18 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Verifies that making cross origin subresource requests from JS which set SameSite=Strict cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); + await dp.Network.enable(); + + const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; + const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' + + encodeURIComponent('name=value; SameSite=Strict'); + + const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); + + // make a cross origin request to set the cookie, see that it gets blocked + await helper.navigateWithExtraInfo(thirdPartyUrl); + var {responseExtraInfo} = await helper.fetchWithExtraInfo(setCookieUrl); + testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated subresource blocked set-cookies:'); + + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict.js deleted file mode 100644 index 48c255a..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict.js +++ /dev/null
@@ -1,28 +0,0 @@ -(async function(testRunner) { - const {page, session, dp} = await testRunner.startBlank( - `Verifies that making cross origin requests which set SameSite=Strict cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies.\n`); - await dp.Network.enable(); - - const thirdPartyUrl = 'https://thirdparty.test:8443/inspector-protocol/network/resources/hello-world.html'; - const setCookieUrl = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie.php?cookie=' - + encodeURIComponent('name=value; SameSite=Strict'); - - const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); - - // make a cross origin request to set the cookie, see that it gets blocked - await helper.navigateWithExtraInfo(thirdPartyUrl); - var {responseExtraInfo} = await helper.fetchWithExtraInfo(setCookieUrl); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated subresource blocked set-cookies:'); - - // make a cross origin navigation via javascript to set the cookie, see that it gets blocked - await helper.navigateWithExtraInfo(thirdPartyUrl); - var {responseExtraInfo} = await helper.jsNavigateWithExtraInfo(setCookieUrl); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Javascript initiated navigation blocked set-cookies:'); - - // make a cross origin navigation via browser to set the cookie, see that it is not blocked - await helper.navigateWithExtraInfo(thirdPartyUrl); - var {responseExtraInfo} = await helper.navigateWithExtraInfo(setCookieUrl); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Browser initiated navigation blocked set-cookies:'); - - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-browser-navigate-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-browser-navigate-expected.txt new file mode 100644 index 0000000..7be25cc8 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-browser-navigate-expected.txt
@@ -0,0 +1,25 @@ +Verifies that making cross-party navigation requests from browser with SameParty cookies sends us Network.RequestWillBeSentExtraInfo events with corresponding associated cookies. + +Browser initiated navigation associated cookies:[ + [0] : { + blockedReasons : [ + ] + cookie : { + domain : cookie.test + expires : -1 + httpOnly : false + name : name + path : /inspector-protocol/network/resources + priority : Medium + sameParty : true + sameSite : None + secure : true + session : true + size : 9 + sourcePort : 8443 + sourceScheme : Secure + value : value + } + } +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-expected.txt deleted file mode 100644 index e49d2d8..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-expected.txt +++ /dev/null
@@ -1,69 +0,0 @@ -Verifies that making cross-party requests with SameParty cookies sends us Network.RequestWillBeSentExtraInfo events with corresponding associated cookies. - -Browser initiated navigation associated cookies:[ - [0] : { - blockedReasons : [ - ] - cookie : { - domain : cookie.test - expires : -1 - httpOnly : false - name : name - path : /inspector-protocol/network/resources - priority : Medium - sameParty : true - sameSite : None - secure : true - session : true - size : 9 - sourcePort : 8443 - sourceScheme : Secure - value : value - } - } -] -Javascript initiated navigation associated cookies:[ - [0] : { - blockedReasons : [ - ] - cookie : { - domain : cookie.test - expires : -1 - httpOnly : false - name : name - path : /inspector-protocol/network/resources - priority : Medium - sameParty : true - sameSite : None - secure : true - session : true - size : 9 - sourcePort : 8443 - sourceScheme : Secure - value : value - } - } -] -Javascript initiated subresource associated cookies:[ - [0] : { - blockedReasons : [ - ] - cookie : { - domain : cookie.test - expires : -1 - httpOnly : false - name : name - path : /inspector-protocol/network/resources - priority : Medium - sameParty : true - sameSite : None - secure : true - session : true - size : 9 - sourcePort : 8443 - sourceScheme : Secure - value : value - } - } -] -
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-issue-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-issue-expected.txt new file mode 100644 index 0000000..681c4252 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-issue-expected.txt
@@ -0,0 +1,28 @@ +Verifies that making cross-party requests with SameParty cookies results in a blocked cookie issue + +Javascript initiated subresource associated cookies:[ + [0] : { + blockedReasons : [ + ] + cookie : { + domain : cookie.test + expires : -1 + httpOnly : false + name : name + path : /inspector-protocol/network/resources + priority : Medium + sameParty : true + sameSite : None + secure : true + session : true + size : 9 + sourcePort : 8443 + sourceScheme : Secure + value : value + } + } +] +Error while executing test script: TypeError: Cannot read properties of undefined (reading 'params') +TypeError: Cannot read properties of undefined (reading 'params') + at eval (http://127.0.0.1:8000/inspector-protocol/network/blocked-cookie-same-party-issue.js:26:34) +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-navigate-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-navigate-expected.txt new file mode 100644 index 0000000..04cf2184 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-navigate-expected.txt
@@ -0,0 +1,25 @@ +Verifies that making cross-party navigation requests from JS with SameParty cookies sends us Network.RequestWillBeSentExtraInfo events with corresponding associated cookies. + +Javascript initiated navigation associated cookies:[ + [0] : { + blockedReasons : [ + ] + cookie : { + domain : cookie.test + expires : -1 + httpOnly : false + name : name + path : /inspector-protocol/network/resources + priority : Medium + sameParty : true + sameSite : None + secure : true + session : true + size : 9 + sourcePort : 8443 + sourceScheme : Secure + value : value + } + } +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-subresource-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-subresource-expected.txt new file mode 100644 index 0000000..32bccaa --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-subresource-expected.txt
@@ -0,0 +1,25 @@ +Verifies that making cross-party subresource requests from JS with SameParty cookies sends us Network.RequestWillBeSentExtraInfo events with corresponding associated cookies. + +Javascript initiated subresource associated cookies:[ + [0] : { + blockedReasons : [ + ] + cookie : { + domain : cookie.test + expires : -1 + httpOnly : false + name : name + path : /inspector-protocol/network/resources + priority : Medium + sameParty : true + sameSite : None + secure : true + session : true + size : 9 + sourcePort : 8443 + sourceScheme : Secure + value : value + } + } +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-browser-navigate-expected.txt similarity index 100% copy from third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-expected.txt copy to third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-browser-navigate-expected.txt
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-navigate-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-expected.txt rename to third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-navigate-expected.txt
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-subresource-expected.txt similarity index 100% copy from third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-expected.txt copy to third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-subresource-expected.txt
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-browser-navigate-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-browser-navigate-expected.txt new file mode 100644 index 0000000..f5580a7 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-browser-navigate-expected.txt
@@ -0,0 +1,5 @@ +Verifies that making cross-party navigation requests from browser which set SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. + +Browser initiated navigation blocked set-cookies:[ +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-expected.txt deleted file mode 100644 index abb8a49..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-expected.txt +++ /dev/null
@@ -1,9 +0,0 @@ -Verifies that making cross-party requests which set SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. - -Javascript initiated subresource blocked set-cookies:[ -] -Javascript initiated navigation blocked set-cookies:[ -] -Browser initiated navigation blocked set-cookies:[ -] -
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-navigate-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-navigate-expected.txt new file mode 100644 index 0000000..bd3c48a --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-navigate-expected.txt
@@ -0,0 +1,5 @@ +Verifies that making cross-party navigation requests from JS which set SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. + +Javascript initiated navigation blocked set-cookies:[ +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-subresource-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-subresource-expected.txt new file mode 100644 index 0000000..2d1eb4f --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-subresource-expected.txt
@@ -0,0 +1,5 @@ +Verifies that making cross-party subresource requests from JS which set SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. + +Javascript initiated subresource blocked set-cookies:[ +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-browser-navigate-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-browser-navigate-expected.txt new file mode 100644 index 0000000..bbbe54b --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-browser-navigate-expected.txt
@@ -0,0 +1,11 @@ +Verifies that making navigation requests from browser which set nonsecure SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. + +Browser initiated navigation blocked set-cookies:[ + [0] : { + blockedReasons : [ + [0] : SamePartyConflictsWithOtherAttributes + ] + cookieLine : name=value; SameSite=None; SameParty + } +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-expected.txt deleted file mode 100644 index afc9220..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-expected.txt +++ /dev/null
@@ -1,27 +0,0 @@ -Verifies that making requests which set nonsecure SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. - -Javascript initiated subresource blocked set-cookies:[ - [0] : { - blockedReasons : [ - [0] : SamePartyConflictsWithOtherAttributes - ] - cookieLine : name=value; SameSite=None; SameParty - } -] -Javascript initiated navigation blocked set-cookies:[ - [0] : { - blockedReasons : [ - [0] : SamePartyConflictsWithOtherAttributes - ] - cookieLine : name=value; SameSite=None; SameParty - } -] -Browser initiated navigation blocked set-cookies:[ - [0] : { - blockedReasons : [ - [0] : SamePartyConflictsWithOtherAttributes - ] - cookieLine : name=value; SameSite=None; SameParty - } -] -
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-js-navigate-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-js-navigate-expected.txt new file mode 100644 index 0000000..72adbb2 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-js-navigate-expected.txt
@@ -0,0 +1,11 @@ +Verifies that making navigation requests from JS which set nonsecure SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. + +Javascript initiated navigation blocked set-cookies:[ + [0] : { + blockedReasons : [ + [0] : SamePartyConflictsWithOtherAttributes + ] + cookieLine : name=value; SameSite=None; SameParty + } +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-js-subresource-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-js-subresource-expected.txt new file mode 100644 index 0000000..94b59875 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-nonsecure-js-subresource-expected.txt
@@ -0,0 +1,11 @@ +Verifies that making subresource requests from JS which set nonsecure SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. + +Javascript initiated subresource blocked set-cookies:[ + [0] : { + blockedReasons : [ + [0] : SamePartyConflictsWithOtherAttributes + ] + cookieLine : name=value; SameSite=None; SameParty + } +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-browser-navigate-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-browser-navigate-expected.txt new file mode 100644 index 0000000..dc6968a --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-browser-navigate-expected.txt
@@ -0,0 +1,11 @@ +Verifies that making subresource requests from JS which set "SameParty; SameSite=Strict" cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. + +Javascript initiated subresource blocked set-cookies:[ + [0] : { + blockedReasons : [ + [0] : SamePartyConflictsWithOtherAttributes + ] + cookieLine : name=value; SameSite=Strict; SameParty; Secure + } +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-expected.txt deleted file mode 100644 index c3fc41dc..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-expected.txt +++ /dev/null
@@ -1,27 +0,0 @@ -Verifies that making requests which set "SameParty; SameSite=Strict" cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. - -Javascript initiated subresource blocked set-cookies:[ - [0] : { - blockedReasons : [ - [0] : SamePartyConflictsWithOtherAttributes - ] - cookieLine : name=value; SameSite=Strict; SameParty; Secure - } -] -Javascript initiated navigation blocked set-cookies:[ - [0] : { - blockedReasons : [ - [0] : SamePartyConflictsWithOtherAttributes - ] - cookieLine : name=value; SameSite=Strict; SameParty; Secure - } -] -Browser initiated navigation blocked set-cookies:[ - [0] : { - blockedReasons : [ - [0] : SamePartyConflictsWithOtherAttributes - ] - cookieLine : name=value; SameSite=Strict; SameParty; Secure - } -] -
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-js-navigate-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-js-navigate-expected.txt new file mode 100644 index 0000000..80d28aca --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-js-navigate-expected.txt
@@ -0,0 +1,11 @@ +Verifies that making navigation requests from JS which set "SameParty; SameSite=Strict" cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. + +Javascript initiated navigation blocked set-cookies:[ + [0] : { + blockedReasons : [ + [0] : SamePartyConflictsWithOtherAttributes + ] + cookieLine : name=value; SameSite=Strict; SameParty; Secure + } +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-js-subresource-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-js-subresource-expected.txt new file mode 100644 index 0000000..dc6968a --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-party-invalid-same-site-strict-js-subresource-expected.txt
@@ -0,0 +1,11 @@ +Verifies that making subresource requests from JS which set "SameParty; SameSite=Strict" cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. + +Javascript initiated subresource blocked set-cookies:[ + [0] : { + blockedReasons : [ + [0] : SamePartyConflictsWithOtherAttributes + ] + cookieLine : name=value; SameSite=Strict; SameParty; Secure + } +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-browser-navigate-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-browser-navigate-expected.txt new file mode 100644 index 0000000..f14acb2 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-browser-navigate-expected.txt
@@ -0,0 +1,5 @@ +Verifies that making cross origin navigation requests from browser which set SameSite=Lax cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. + +Browser initiated navigation blocked set-cookies[ +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-navigate-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-navigate-expected.txt new file mode 100644 index 0000000..400b1e3 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-navigate-expected.txt
@@ -0,0 +1,5 @@ +Verifies that making cross origin navigation requests from JS which set SameSite=Lax cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. + +Javascript initiated navigation blocked set-cookies:[ +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-subresource-expected.txt similarity index 70% rename from third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-expected.txt rename to third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-subresource-expected.txt index e59cd5a..e262dfab 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax-js-subresource-expected.txt
@@ -1,4 +1,4 @@ -Verifies that making cross origin requests which set SameSite=Lax cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. +Verifies that making cross origin subresource requests from JS which set SameSite=Lax cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. Javascript initiated subresource blocked set-cookies:[ [0] : { @@ -24,8 +24,4 @@ cookieLine : name=value; SameSite=Lax } ] -Javascript initiated navigation blocked set-cookies:[ -] -Browser initiated navigation blocked set-cookies[ -]
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-browser-navigate-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-browser-navigate-expected.txt new file mode 100644 index 0000000..c89c68b1 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-browser-navigate-expected.txt
@@ -0,0 +1,5 @@ +Verifies that making cross origin navigation requests from browser which set SameSite=Strict cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. + +Browser initiated navigation blocked set-cookies:[ +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-navigate-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-navigate-expected.txt new file mode 100644 index 0000000..a5fec910 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-navigate-expected.txt
@@ -0,0 +1,5 @@ +Verifies that making cross origin navigation requests from JS which set SameSite=Strict cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. + +Javascript initiated navigation blocked set-cookies:[ +] +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-subresource-expected.txt similarity index 70% rename from third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-expected.txt rename to third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-subresource-expected.txt index a69b64e..08dbd904 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/network/blocked-setcookie-same-site-strict-js-subresource-expected.txt
@@ -1,4 +1,4 @@ -Verifies that making cross origin requests which set SameSite=Strict cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. +Verifies that making cross origin subresource requests from JS which set SameSite=Strict cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. Javascript initiated subresource blocked set-cookies:[ [0] : { @@ -24,8 +24,4 @@ cookieLine : name=value; SameSite=Strict } ] -Javascript initiated navigation blocked set-cookies:[ -] -Browser initiated navigation blocked set-cookies:[ -]
diff --git a/third_party/blink/web_tests/platform/generic/virtual/first-party-sets/http/tests/inspector-protocol/network/blocked-cookie-same-party-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/first-party-sets/http/tests/inspector-protocol/network/blocked-cookie-same-party-expected.txt deleted file mode 100644 index b37fe9e0..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/first-party-sets/http/tests/inspector-protocol/network/blocked-cookie-same-party-expected.txt +++ /dev/null
@@ -1,70 +0,0 @@ -Verifies that making cross-party requests with SameParty cookies sends us Network.RequestWillBeSentExtraInfo events with corresponding associated cookies. - -Browser initiated navigation associated cookies:[ - [0] : { - blockedReasons : [ - ] - cookie : { - domain : cookie.test - expires : -1 - httpOnly : false - name : name - path : /inspector-protocol/network/resources - priority : Medium - sameParty : true - sameSite : None - secure : true - session : true - size : 9 - sourcePort : 8443 - sourceScheme : Secure - value : value - } - } -] -Javascript initiated navigation associated cookies:[ - [0] : { - blockedReasons : [ - ] - cookie : { - domain : cookie.test - expires : -1 - httpOnly : false - name : name - path : /inspector-protocol/network/resources - priority : Medium - sameParty : true - sameSite : None - secure : true - session : true - size : 9 - sourcePort : 8443 - sourceScheme : Secure - value : value - } - } -] -Javascript initiated subresource associated cookies:[ - [0] : { - blockedReasons : [ - [0] : SamePartyFromCrossPartyContext - ] - cookie : { - domain : cookie.test - expires : -1 - httpOnly : false - name : name - path : /inspector-protocol/network/resources - priority : Medium - sameParty : true - sameSite : None - secure : true - session : true - size : 9 - sourcePort : 8443 - sourceScheme : Secure - value : value - } - } -] -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/first-party-sets/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-subresource-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/first-party-sets/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-subresource-expected.txt new file mode 100644 index 0000000..e0a6a72 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/virtual/first-party-sets/http/tests/inspector-protocol/network/blocked-cookie-same-party-js-subresource-expected.txt
@@ -0,0 +1,26 @@ +Verifies that making cross-party subresource requests from JS with SameParty cookies sends us Network.RequestWillBeSentExtraInfo events with corresponding associated cookies. + +Javascript initiated subresource associated cookies:[ + [0] : { + blockedReasons : [ + [0] : SamePartyFromCrossPartyContext + ] + cookie : { + domain : cookie.test + expires : -1 + httpOnly : false + name : name + path : /inspector-protocol/network/resources + priority : Medium + sameParty : true + sameSite : None + secure : true + session : true + size : 9 + sourcePort : 8443 + sourceScheme : Secure + value : value + } + } +] +
diff --git a/third_party/blink/web_tests/platform/generic/virtual/first-party-sets/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/first-party-sets/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-subresource-expected.txt similarity index 71% rename from third_party/blink/web_tests/platform/generic/virtual/first-party-sets/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-expected.txt rename to third_party/blink/web_tests/platform/generic/virtual/first-party-sets/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-subresource-expected.txt index bff6a11..759399f 100644 --- a/third_party/blink/web_tests/platform/generic/virtual/first-party-sets/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-expected.txt +++ b/third_party/blink/web_tests/platform/generic/virtual/first-party-sets/http/tests/inspector-protocol/network/blocked-setcookie-same-party-cross-party-js-subresource-expected.txt
@@ -1,4 +1,4 @@ -Verifies that making cross-party requests which set SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. +Verifies that making cross-party subresource requests from JS which set SameParty cookies send us Network.ResponseReceivedExtraInfo events with corresponding blocked set-cookies. Javascript initiated subresource blocked set-cookies:[ [0] : { @@ -24,8 +24,4 @@ cookieLine : name=value; SameSite=None; SameParty; Secure } ] -Javascript initiated navigation blocked set-cookies:[ -] -Browser initiated navigation blocked set-cookies:[ -]
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 4519093..56e87e5e 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -2770,11 +2770,11 @@ ], 'ios_cronet_xctest': [ - 'cronet_ios', 'debug_static_bot', 'ios_deployment_target_10_0', 'ios', 'ios_simulator', 'ios_cpu_x64_x86', 'xctest', 'ios_disable_xcode_project_generation', + 'cronet_ios', 'debug_static_bot', 'ios_deployment_target_11_0', 'ios', 'ios_simulator', 'ios_cpu_x64', 'xctest', 'ios_disable_xcode_project_generation', ], 'ios_cronet_xctest_arm64': [ - 'cronet_ios', 'debug_static_bot', 'ios_deployment_target_10_0', 'ios', 'ios_simulator', 'ios_cpu_arm64', 'xctest', 'ios_disable_xcode_project_generation', + 'cronet_ios', 'debug_static_bot', 'ios_deployment_target_11_0', 'ios', 'ios_simulator', 'ios_cpu_arm64', 'xctest', 'ios_disable_xcode_project_generation', ], 'ios_device_release_compile_only': [ @@ -3997,12 +3997,8 @@ 'gn_args': 'target_cpu="x64"', }, - 'ios_cpu_x64_x86': { - 'gn_args': 'target_cpu="x64" additional_target_cpus=["x86"]', - }, - - 'ios_deployment_target_10_0': { - 'gn_args': 'ios_deployment_target=\"10.0\"', + 'ios_deployment_target_11_0': { + 'gn_args': 'ios_deployment_target=\"11.0\"', }, 'ios_device': {
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json index 1d355bd..80f02365 100644 --- a/tools/mb/mb_config_expectations/chromium.fyi.json +++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -713,7 +713,7 @@ "enable_run_ios_unittests_with_xctest": true, "enable_websockets": false, "include_transport_security_state_preload_list": false, - "ios_deployment_target": "10.0", + "ios_deployment_target": "11.0", "ios_set_attributes_for_xcode_project_generation": false, "ios_stack_profiler_enabled": false, "is_component_build": false, @@ -771,16 +771,13 @@ }, "ios-simulator-cronet": { "gn_args": { - "additional_target_cpus": [ - "x86" - ], "disable_brotli_filter": false, "disable_file_support": true, "enable_remoting": false, "enable_run_ios_unittests_with_xctest": true, "enable_websockets": false, "include_transport_security_state_preload_list": false, - "ios_deployment_target": "10.0", + "ios_deployment_target": "11.0", "ios_set_attributes_for_xcode_project_generation": false, "ios_stack_profiler_enabled": false, "is_component_build": false,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.mac.json b/tools/mb/mb_config_expectations/tryserver.chromium.mac.json index d30ac049..5b0928b 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.mac.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.mac.json
@@ -267,7 +267,7 @@ "enable_run_ios_unittests_with_xctest": true, "enable_websockets": false, "include_transport_security_state_preload_list": false, - "ios_deployment_target": "10.0", + "ios_deployment_target": "11.0", "ios_set_attributes_for_xcode_project_generation": false, "ios_stack_profiler_enabled": false, "is_component_build": false, @@ -314,16 +314,13 @@ }, "ios-simulator-cronet": { "gn_args": { - "additional_target_cpus": [ - "x86" - ], "disable_brotli_filter": false, "disable_file_support": true, "enable_remoting": false, "enable_run_ios_unittests_with_xctest": true, "enable_websockets": false, "include_transport_security_state_preload_list": false, - "ios_deployment_target": "10.0", + "ios_deployment_target": "11.0", "ios_set_attributes_for_xcode_project_generation": false, "ios_stack_profiler_enabled": false, "is_component_build": false,
diff --git a/tools/metrics/histograms/metadata/uma/histograms.xml b/tools/metrics/histograms/metadata/uma/histograms.xml index c852fb9..89a6772 100644 --- a/tools/metrics/histograms/metadata/uma/histograms.xml +++ b/tools/metrics/histograms/metadata/uma/histograms.xml
@@ -161,6 +161,9 @@ <histogram name="UMA.CleanExitBeaconConsistency2" enum="UmaCleanExitConsistency2" expires_after="2023-05-31"> + <obsolete> + Removed in M105. + </obsolete> <owner>asvitkine@chromium.org</owner> <owner>justincohen@chromium.org</owner> <owner>olivierrobin@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 7347644..0831f34 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@ "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "win": { - "hash": "7057b12bfb48ded7f4f64ac0010c4df624a8a5ed", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/faa478c7878b2b0dae9d2dad346cbaee6712a628/trace_processor_shell.exe" + "hash": "df92015f675a0916d55536844478a716f60b6aef", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/52ef6a535192642c9c37c21c2e8e2f45767ae4b3/trace_processor_shell.exe" }, "linux_arm": { "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893", @@ -14,7 +14,7 @@ }, "mac": { "hash": "81754e8eb6f10e3aa872e95f3e44f3f574c23b1b", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/faa478c7878b2b0dae9d2dad346cbaee6712a628/trace_processor_shell" + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/f4e82a1152cce563218ce1759bad5bf309471172/trace_processor_shell" }, "mac_arm64": { "hash": "e1ad4861384b06d911a65f035317914b8cc975c6", @@ -22,7 +22,7 @@ }, "linux": { "hash": "64aef20cc1e600f42ce493e1efab4d68d32c54c2", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/faa478c7878b2b0dae9d2dad346cbaee6712a628/trace_processor_shell" + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/52ef6a535192642c9c37c21c2e8e2f45767ae4b3/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc index e11e4bc..e155257 100644 --- a/ui/accessibility/platform/ax_platform_node_win.cc +++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -471,6 +471,18 @@ platform_node_list.push_back(view_popup_node_win); } + // The aria-errormessage attribute (mapped to the kErrormessageId) is expected + // to be exposed through the ControllerFor property on UIA: + // https://www.w3.org/TR/wai-aria-1.1/#aria-errormessage. + if (HasIntAttribute(ax::mojom::IntAttribute::kErrormessageId)) { + AXPlatformNodeWin* error_message_node_win = + static_cast<AXPlatformNodeWin*>(GetFromUniqueId( + GetIntAttribute(ax::mojom::IntAttribute::kErrormessageId))); + + if (IsValidUiaRelationTarget(error_message_node_win)) + platform_node_list.push_back(error_message_node_win); + } + return CreateUIAElementsSafeArray(platform_node_list); }
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_win_unittest.cc index 7e75543a..b4675e5 100644 --- a/ui/accessibility/platform/ax_platform_node_win_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -4387,7 +4387,7 @@ AXNodeData root; root.id = 1; root.role = ax::mojom::Role::kRootWebArea; - root.child_ids = {2, 3, 4}; + root.child_ids = {2, 3, 4, 5, 6}; AXNodeData tab; tab.id = 2; @@ -4407,7 +4407,17 @@ panel2.role = ax::mojom::Role::kTabPanel; panel2.SetName("panel2"); - Init(root, tab, panel1, panel2); + AXNodeData group1; + group1.id = 5; + group1.role = ax::mojom::Role::kGenericContainer; + group1.AddIntAttribute(ax::mojom::IntAttribute::kErrormessageId, 6); + + AXNodeData text1; + text1.id = 6; + text1.role = ax::mojom::Role::kStaticText; + text1.SetName("text1"); + + Init(root, tab, panel1, panel2, group1, text1); TestAXNodeWrapper* root_wrapper = TestAXNodeWrapper::GetOrCreate(GetTree(), GetRootAsAXNode()); root_wrapper->BuildAllWrappers(GetTree(), GetRootAsAXNode()); @@ -4429,6 +4439,17 @@ EXPECT_UIA_PROPERTY_ELEMENT_ARRAY_BSTR_EQ( tab_node, UIA_ControllerForPropertyId, UIA_NamePropertyId, expected_names_2); + + // The aria-errormessage attribute should be exposed through the ControllerFor + // UIA property. + ComPtr<IRawElementProviderSimple> group1_node = + QueryInterfaceFromNode<IRawElementProviderSimple>( + GetRootAsAXNode()->children()[3]); + + std::vector<std::wstring> expected_names_3 = {L"text1"}; + EXPECT_UIA_PROPERTY_ELEMENT_ARRAY_BSTR_EQ( + group1_node, UIA_ControllerForPropertyId, UIA_NamePropertyId, + expected_names_3); } TEST_F(AXPlatformNodeWinTest, UIAGetDescribedByPropertyId) {
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb index 2e8bbd1..eef08bf 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -619,6 +619,7 @@ <translation id="6296410173147755564">رمز PUK غير صالح.</translation> <translation id="6312403991423642364">خطأ غير معروف</translation> <translation id="6317608858038767920">خادم أسماء مخصّص <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423">أرشيف <ph name="ARCHIVE_TYPE" /></translation> <translation id="6321303798550928047">تلويح باليد</translation> <translation id="6327785803543103246">اكتشاف الخادم الوكيل للويب تلقائيًا</translation> <translation id="6339145975392024142">الأمريكية الدولية (الكمبيوتر الشخصي)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_as.xtb b/ui/chromeos/translations/ui_chromeos_strings_as.xtb index 631b107..81614bff 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_as.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_as.xtb
@@ -617,6 +617,7 @@ <translation id="6296410173147755564">অমান্য PUK</translation> <translation id="6312403991423642364">অজ্ঞাত নেটৱর্কৰ আসোঁৱাহ</translation> <translation id="6317608858038767920">কাষ্টম নে’মছার্ভাৰ <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423"><ph name="ARCHIVE_TYPE" /> আৰ্কাইভ</translation> <translation id="6321303798550928047">হাত জোকাৰি থকা</translation> <translation id="6327785803543103246">ৱেব প্ৰক্সিৰ স্বয়ংক্রিয় চিনাক্তকৰণ</translation> <translation id="6339145975392024142">ইউএছ ইণ্টাৰনেশ্বনেল (PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_az.xtb b/ui/chromeos/translations/ui_chromeos_strings_az.xtb index a6915643..57ac2fb 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_az.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_az.xtb
@@ -617,6 +617,7 @@ <translation id="6296410173147755564">Yanlış PUK</translation> <translation id="6312403991423642364">Naməlum şəbəkə xətası</translation> <translation id="6317608858038767920">Fərdi ad serveri <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423"><ph name="ARCHIVE_TYPE" /> arxiv faylı</translation> <translation id="6321303798550928047">Əl yelləyir</translation> <translation id="6327785803543103246">Veb proksi avtomatik aşkarlama</translation> <translation id="6339145975392024142">ABŞ beynəlxalq (PC) klaviaturası</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb index c54ded9..56667895 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
@@ -618,6 +618,7 @@ <translation id="6296410173147755564">Невалиден PUK код</translation> <translation id="6312403991423642364">Неизвестна мрежова грешка</translation> <translation id="6317608858038767920">Персонализиран сървър за имена <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423">Архив във формат <ph name="ARCHIVE_TYPE" /></translation> <translation id="6321303798550928047">Махане с ръка</translation> <translation id="6327785803543103246">Автоматично откриване на уеб прокси сървъра</translation> <translation id="6339145975392024142">Американска международна (PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb index aff0217..31c9b14 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb
@@ -159,6 +159,7 @@ <translation id="2377319039870049694">Prebaci na prikaz liste</translation> <translation id="2377590462528165447">Broj foldera koji se dijele s Linuxom <ph name="NUMBER_OF_ITEMS" /></translation> <translation id="2378075407703503998">Broj odabranih fajlova: <ph name="SELCTED_FILE_COUNT" /></translation> +<translation id="2387120140441437063">Datoteke u otpadu ne mogu se otvoriti. Vratite datoteke prije otvaranja.</translation> <translation id="2387458720915042159">Vrsta veze s proksi serverom</translation> <translation id="2389832672041313158">burmanski (Mijanmar)</translation> <translation id="2392369802118427583">Aktiviraj</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb index 63b05dc..7b1b00b4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
@@ -618,6 +618,7 @@ <translation id="6296410173147755564">El PUK no és vàlid</translation> <translation id="6312403991423642364">Error de la xarxa desconegut</translation> <translation id="6317608858038767920">Servidor de noms personalitzat <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423">Arxiu <ph name="ARCHIVE_TYPE" /></translation> <translation id="6321303798550928047">Salutació</translation> <translation id="6327785803543103246">Detecció automàtica de servidors intermediaris web</translation> <translation id="6339145975392024142">Teclat internacional dels EUA (PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cy.xtb b/ui/chromeos/translations/ui_chromeos_strings_cy.xtb index 7d4bbd16..141c09b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_cy.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_cy.xtb
@@ -617,6 +617,7 @@ <translation id="6296410173147755564">PUK annilys</translation> <translation id="6312403991423642364">Gwall rhwydwaith anhysbys</translation> <translation id="6317608858038767920">Gweinydd enw personol <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423">Archif <ph name="ARCHIVE_TYPE" /></translation> <translation id="6321303798550928047">Chwifio</translation> <translation id="6327785803543103246">Awtoddarganfod dirprwy weinydd y we</translation> <translation id="6339145975392024142">Rhyngwladol UDA (PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_et.xtb b/ui/chromeos/translations/ui_chromeos_strings_et.xtb index b4bc4f7..793a757 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_et.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_et.xtb
@@ -618,6 +618,7 @@ <translation id="6296410173147755564">Vale PUK</translation> <translation id="6312403991423642364">Tundmatu võrguviga</translation> <translation id="6317608858038767920">Kohandatud nimeserveri <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423"><ph name="ARCHIVE_TYPE" />-arhiivifail</translation> <translation id="6321303798550928047">Lehvitav</translation> <translation id="6327785803543103246">Veebipõhise puhverserveri automaattuvastamine</translation> <translation id="6339145975392024142">USA rahvusvaheline (PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb index 5c0e3c7..8a26ddf 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
@@ -618,6 +618,7 @@ <translation id="6296410173147755564">PUK incorrect</translation> <translation id="6312403991423642364">Erreur de réseau inconnue.</translation> <translation id="6317608858038767920">Serveur de noms personnalisé <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423">Archive <ph name="ARCHIVE_TYPE" /></translation> <translation id="6321303798550928047">Coucou</translation> <translation id="6327785803543103246">Recherche automatique du proxy Web</translation> <translation id="6339145975392024142">Clavier international américain (PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gl.xtb b/ui/chromeos/translations/ui_chromeos_strings_gl.xtb index 09b03e2..44805601 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_gl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_gl.xtb
@@ -617,6 +617,7 @@ <translation id="6296410173147755564">O PUK non é válido</translation> <translation id="6312403991423642364">Erro de rede descoñecido</translation> <translation id="6317608858038767920">Servidor de nomes personalizado <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423">Arquivo <ph name="ARCHIVE_TYPE" /></translation> <translation id="6321303798550928047">Saudando coa man</translation> <translation id="6327785803543103246">Detección automática do proxy web</translation> <translation id="6339145975392024142">Internacional dos EUA (PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb index 6a95b19..5a4c7d1 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
@@ -159,6 +159,7 @@ <translation id="2377319039870049694">Prebaci na prikaz popisa</translation> <translation id="2377590462528165447">S Linuxom se dijeli sljedeći broj mapa: <ph name="NUMBER_OF_ITEMS" /></translation> <translation id="2378075407703503998">Odabrane datoteke: <ph name="SELCTED_FILE_COUNT" /></translation> +<translation id="2387120140441437063">Datoteke u otpadu ne mogu se otvoriti. Vratite datoteke prije otvaranja.</translation> <translation id="2387458720915042159">Vrsta proxy veze</translation> <translation id="2389832672041313158">burmanski (Mjanmar)</translation> <translation id="2392369802118427583">Aktiviraj</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_id.xtb b/ui/chromeos/translations/ui_chromeos_strings_id.xtb index a4eb9b0d..38bf410a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_id.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
@@ -618,6 +618,7 @@ <translation id="6296410173147755564">PUK tidak valid</translation> <translation id="6312403991423642364">Kesalahan jaringan tidak dikenal</translation> <translation id="6317608858038767920">Server nama khusus <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423">Arsip <ph name="ARCHIVE_TYPE" /></translation> <translation id="6321303798550928047">Melambaikan tangan</translation> <translation id="6327785803543103246">Penemuan otomatis proksi web</translation> <translation id="6339145975392024142">Internasional AS (PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_is.xtb b/ui/chromeos/translations/ui_chromeos_strings_is.xtb index 3a15e56..8fa51e5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_is.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_is.xtb
@@ -617,6 +617,7 @@ <translation id="6296410173147755564">Ógilt PUK-númer</translation> <translation id="6312403991423642364">Óþekkt netvilla</translation> <translation id="6317608858038767920">Sérstilltur nafnaþjónn <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423"><ph name="ARCHIVE_TYPE" />-geymsla</translation> <translation id="6321303798550928047">Veifar</translation> <translation id="6327785803543103246">Sjálfvirk uppgötvun vefstaðgengilsþjóna</translation> <translation id="6339145975392024142">Bandarískt alþjóðlegt tölvulyklaborð</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb index 01e09bb..be307727 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
@@ -619,6 +619,7 @@ <translation id="6296410173147755564">ה-PUK לא תקין</translation> <translation id="6312403991423642364">שגיאת רשת לא ידועה</translation> <translation id="6317608858038767920">שרת שמות בהתאמה אישית <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423">קובץ ארכיון מסוג <ph name="ARCHIVE_TYPE" /></translation> <translation id="6321303798550928047">דמות שמנופפת</translation> <translation id="6327785803543103246">גילוי אוטומטי של שרת proxy באינטרנט</translation> <translation id="6339145975392024142">מקלדת ארה"ב בינלאומית (PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb index 01fed36..cac973c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
@@ -618,6 +618,7 @@ <translation id="6296410173147755564">無効な PUK です</translation> <translation id="6312403991423642364">ネットワークが不明なためエラーが発生しました</translation> <translation id="6317608858038767920">カスタム ネームサーバー <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423"><ph name="ARCHIVE_TYPE" /> アーカイブ</translation> <translation id="6321303798550928047">手を振る</translation> <translation id="6327785803543103246">ウェブプロキシ自動検出</translation> <translation id="6339145975392024142">US インターナショナル(PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb index 1e245f03..4275624 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
@@ -618,6 +618,7 @@ <translation id="6296410173147755564">무효한 PUK</translation> <translation id="6312403991423642364">알려지지 않은 네트워크 오류</translation> <translation id="6317608858038767920">맞춤 네임서버 <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423"><ph name="ARCHIVE_TYPE" /> 보관 파일</translation> <translation id="6321303798550928047">손 흔들기</translation> <translation id="6327785803543103246">웹 프록시 자동검색</translation> <translation id="6339145975392024142">미국 국제(PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb index 5bbac4e..e7d84ea 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
@@ -618,6 +618,7 @@ <translation id="6296410173147755564">Nieprawidłowy kod PUK</translation> <translation id="6312403991423642364">Nieznany błąd sieci</translation> <translation id="6317608858038767920">Niestandardowy serwer nazw <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423">Archiwum <ph name="ARCHIVE_TYPE" /></translation> <translation id="6321303798550928047">Machanie ręką</translation> <translation id="6327785803543103246">Automatyczne wykrywanie internetowego serwera proxy</translation> <translation id="6339145975392024142">Amerykańska międzynarodowa (PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb index 8452c6c..9ac24fd 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
@@ -618,6 +618,7 @@ <translation id="6296410173147755564">Neveljavna koda PUK</translation> <translation id="6312403991423642364">Neznana napaka v omrežju</translation> <translation id="6317608858038767920">Imenski strežnik po meri <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423">Arhivska datoteka <ph name="ARCHIVE_TYPE" /></translation> <translation id="6321303798550928047">Mahanje</translation> <translation id="6327785803543103246">Samodejno odkrivanje spletnega strežnika proxy</translation> <translation id="6339145975392024142">Mednarodna tipkovnica za angleščino (Združene države, PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_te.xtb b/ui/chromeos/translations/ui_chromeos_strings_te.xtb index 65c7f4d..cf44ebf 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_te.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
@@ -618,6 +618,7 @@ <translation id="6296410173147755564">చెల్లని PUK</translation> <translation id="6312403991423642364">తెలియని నెట్వర్క్ ఎర్రర్</translation> <translation id="6317608858038767920">అనుకూల నేమ్సర్వర్ <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423"><ph name="ARCHIVE_TYPE" /> ఆర్కైవ్</translation> <translation id="6321303798550928047">చేయి ఊపడం</translation> <translation id="6327785803543103246">వెబ్ ప్రాక్సీ స్వీయశోధన</translation> <translation id="6339145975392024142">US అంతర్జాతీయం (PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb index 65bfc8e..5a98bf4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
@@ -618,6 +618,7 @@ <translation id="6296410173147755564">Geçersiz PUK</translation> <translation id="6312403991423642364">Bilinmeyen ağ hatası</translation> <translation id="6317608858038767920">Özel alan adı sunucusu <ph name="INPUT_INDEX" /></translation> +<translation id="6320212353742551423"><ph name="ARCHIVE_TYPE" /> arşiv dosyası</translation> <translation id="6321303798550928047">El sallayan kız</translation> <translation id="6327785803543103246">Web proxy otomatik keşfi</translation> <translation id="6339145975392024142">ABD uluslararası (PC)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb index a4caefd..e12929c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb
@@ -617,6 +617,7 @@ <translation id="6296410173147755564">I-PUK engavumelekile</translation> <translation id="6312403991423642364">Iphutha elingaziwa lenethiwekhi</translation> <translation id="6317608858038767920">I-nameserver engu-<ph name="INPUT_INDEX" /> yangokwezifiso</translation> +<translation id="6320212353742551423"><ph name="ARCHIVE_TYPE" /> ingobo yomlando</translation> <translation id="6321303798550928047">Ukphakamisa isandla</translation> <translation id="6327785803543103246">Ukuthola ngokuzenzakalela ummeleli wewebhu</translation> <translation id="6339145975392024142">I-US international (PC)</translation>
diff --git a/ui/strings/translations/ui_strings_fa.xtb b/ui/strings/translations/ui_strings_fa.xtb index cd0ff06..e0075ad 100644 --- a/ui/strings/translations/ui_strings_fa.xtb +++ b/ui/strings/translations/ui_strings_fa.xtb
@@ -73,7 +73,7 @@ <translation id="3126026824346185272">Ctrl</translation> <translation id="3157931365184549694">بازیابی</translation> <translation id="3183922693828471536">پیمایش به اینجا</translation> -<translation id="3234408098842461169">پیکان پایین</translation> +<translation id="3234408098842461169">کلید پایینبر</translation> <translation id="3291688615589870984">{DAYS,plural, =1{۱ روز}one{# روز}other{# روز}}</translation> <translation id="3295886253693811851">برقراری تماس از</translation> <translation id="3306688585798492231">نمایشگر داخلی</translation>